Compare commits

...
Sign in to create a new pull request.

320 commits

Author SHA1 Message Date
26dc35e0d0 Mushrooms photo post 2025-08-31 07:45:30 -06:00
f95940c387 Lake Louise photo post 2025-08-31 07:44:49 -06:00
588d88a0b2 Student Again post 2025-08-31 07:39:02 -06:00
1d15db8aa5 I Am an AI Hater link post 2025-08-29 09:14:24 -06:00
2688e4e339 Add a deployment command group to the website script
This group has one command so far: next-tag. It looks at the git tag list and
figured out the next deployment tag. For the most part tags are named like so:

    deploy-%Y-%m-%d-NN

The middle segments are year-month-day, and the last segment is an incrementing
counter. For the most part this number will be 01. On days when I deploy more than
once, it will increment.
2025-08-29 08:59:03 -06:00
69760a802d Lait's Go photo post 2025-08-28 17:13:40 -06:00
294226cfcb Remove Travel category; move it to a tag 2025-08-28 11:25:53 -06:00
ea6eea2b03 Add link archetype 2025-08-28 11:24:51 -06:00
459c55d344 Remove Travel category from Pajaro Dunes post; make it a tag 2025-08-28 11:24:38 -06:00
c9d7c6409e Create a Links category for two recent links posts 2025-08-28 11:23:58 -06:00
33da073783 Update photostream submodule 2025-08-28 11:08:37 -06:00
ee9dc5c9ea Update termlite submodule commit 2025-08-28 08:17:00 -06:00
c2d860a64d Rings post 2025-08-28 07:51:28 -06:00
c878785635 Weeknotes from 2025W06
Why am I so late with this one?? It's not even marked draft anymore.
2025-08-28 07:40:51 -06:00
0e2b3eb249 2026 _index.md 2025-08-28 07:39:40 -06:00
9633b85411 Move photos content path in new-photo-post script to erynwells_me module 2025-08-28 07:37:05 -06:00
24871ecf49 {{ stock }} shortcode for linking to a finance page for a stock ticker symbol 2025-08-28 07:23:13 -06:00
eb9d763638 America Tips Into Fascism link 2025-08-28 07:21:24 -06:00
2016028811 Weeknotes for 2025 week 34 2025-08-25 22:24:12 -06:00
493947028c Mercury @ Valkyries game post 2025-08-21 23:12:24 -07:00
24c61c8cdf Remove title from Not Doing It figure 2025-08-19 10:10:41 -07:00
a8c30e1c90 Update termlite submodule 2025-08-19 10:08:33 -07:00
b57fd9c8d0 Commit the weeknotes for 2025W33 post 2025-08-19 10:05:48 -07:00
1f2de30c60 Pass the list of images generated by the figures/image template to the partials that actually render the figure
This template was doing a bunch of work to look up resources, but then
discarding it and passing just the "name" to the partial. Instead, pass the
$imgs list.

Add a "global-asset-src" parameter to the shortcode that takes an asset path.

Update the termlite submodule commit.
2025-08-19 10:03:50 -07:00
cc405e6ca9 Cat House photo;
Fix up the sort date for the 2025 collection of photo posts.
2025-08-17 16:07:38 -07:00
724f2a37d4 Fix a typo in the MatrixPortal post 2025-08-17 09:32:08 -07:00
86259d788c Update sunset timelapse in the Jackson Hole post 2025-08-17 09:27:05 -07:00
2bad4f9b08 MatrixPortal Metaballs post 2025-08-16 17:26:37 -07:00
85de90bcd3 Add .mov and .mp4 to the LFS attributes 2025-08-16 17:26:21 -07:00
5a0dcb8a7d Rename twitter config settings -> x (ugh) 2025-03-19 11:52:54 -07:00
bef5ab71ce blog: CRT Typography 2025-02-08 08:24:38 -08:00
1c78ce3627 blog: Weeknotes 2025W03: Fix a broken link; add space links 2025-01-20 10:30:26 -08:00
a777b1e726 Weeknotes for 2025W03 2025-01-20 10:24:16 -08:00
64e8aa20d5 Update the weeknotes archetype
Add "Notes on" to the title
Remove the time from the date
2025-01-14 19:31:35 -08:00
49d8e069db blog: 37 birthday post! 2025-01-14 19:31:12 -08:00
f2e835cea5 termlite: Update submodule commit 2025-01-14 19:30:20 -08:00
65410d9de5 photos: Moon and Venus 2025-01-11 10:34:32 -08:00
fd890b7486 blog: Fixing Up Japanese Language Tags
Finish it. Publish.
2025-01-08 20:39:46 -08:00
741163dac8 termlite: Update submodule commit 2025-01-07 15:37:38 -08:00
89abc0b8ee Convert tags added in 5989af5e64 to page bundles
If you added a tag to content/tags/$name as a flat .md file, it won't show the
list of posts under it. If you add them as a bundle, i.e. a directory with a
_index.md, it does.

This is weird to me but whatever.
2025-01-07 15:35:36 -08:00
b732238c20 blog: Fixing Up Japanese Language Tags (draft) 2025-01-07 15:34:16 -08:00
a761f45afd blog: Replace 日本語 tag with "japanese" tag in weeknotes-2024w24 2025-01-07 09:08:58 -08:00
9e2e49d944 blog: Add "recipes" tag to Cat in the Cream Cookies recipe post 2025-01-07 09:08:19 -08:00
5989af5e64 Move all the Japan related tags to ASCII characters
Replace tags like "京都" to "japan-kyoto". Prefix place tags with country names so they're easier to find.
2025-01-07 09:06:20 -08:00
264a828089 blog: Add a description to the termlite post 2025-01-07 08:36:23 -08:00
9d50a93313 blog: Use .ByPublishDate for the blog list 2025-01-07 08:35:04 -08:00
b463f8df64 blog: Notes on 2025w01 (remove draft tag) 2025-01-06 10:46:21 -08:00
471a63463b blog: Notes on 2025W1 2025-01-06 10:44:33 -08:00
e123b3c38e blog: Christmas in Massachusetts 2025-01-06 10:44:13 -08:00
c25987e3c5 tags: Hawai‘i page
To get the glottal stop right.
2025-01-05 09:32:09 -08:00
7fd193d723 photos: Kona, HI beach 2025-01-05 09:31:49 -08:00
78628c2243 blog: Fix the slug of the 2024 books post 2025-01-05 08:27:03 -08:00
dc09f14cc1 termlite: Update submodule commit 2025-01-04 10:13:09 -08:00
a3b33970ed blog: Japan trip placeholder 2025-01-04 09:41:29 -08:00
6f3a30cf4b Add Facebook and StoryGraph to Where Am I
Update the sorting and add a bit more explanatory text around these lists.
2025-01-04 09:41:07 -08:00
712d40177d Add the "Weeknotes" tag to the weeknotes archetype 2025-01-04 09:35:04 -08:00
fd51d2405c blog: Fix a typo in the Qud post 2025-01-04 09:34:19 -08:00
fa19112a4b blog: Add a couple books to the 2025 books list
- On A Sunbeam
- The Selected Poems of Nikki Giovanni
2025-01-04 09:34:06 -08:00
bf0c8a583a blog: Move the "Catching Up" post to 2025 2025-01-03 12:27:41 -08:00
7807e901f7 blog: Termlite (draft) 2025-01-03 11:53:06 -08:00
01d2e7f471 photos: No Matter 2025-01-03 11:52:45 -08:00
55b89dfc93 blog: Qud: add title and alt text to the loading screen image 2025-01-01 11:21:00 -08:00
534c5fa984 blog: Qud 2025-01-01 11:17:30 -08:00
b0f7385daf blog: 2025
New year, mutherfuckers
2025-01-01 10:51:38 -08:00
6db1174a21 scripts: Include os.path as osp in new-photo-post 2025-01-01 10:46:53 -08:00
22dbdceab3 scripts: Return the result of calling the args handler 2025-01-01 10:46:14 -08:00
9db2f3a49b blog: 2024w25 weeknotes 2025-01-01 10:45:52 -08:00
d37d924219 blog: Remove category from Chicago post 2025-01-01 10:45:39 -08:00
0877f504b3 about: Clean up the markup a little bit
I'm still not happy with the circular image. It's not aligned like I would like.
2025-01-01 10:44:57 -08:00
3f436085a3 blog: 2024 Books 2025-01-01 10:42:52 -08:00
eb0a6b0da9 blog: Eclipse, Chicago, and Catching Up posts 2025-01-01 10:42:36 -08:00
a1c22b3491 Clean up partial calls in figures/image
- Include the custom class passed to the template
- Factor out multiple computations of $shouldShowTitle into a variable and pass that
  to called partials
2024-12-31 09:39:46 -08:00
734fe626a3 blog: Books I Read
Added Full Moon Coffee Shop
2024-12-28 21:18:54 -05:00
6ae0590721 blog: Departure Mono 2024-12-28 08:34:33 -05:00
74d4c1a508 blog: Catching Up 2024-12-23 08:45:52 -08:00
4d066582b8 blog: Add a description to the Eclipse post 2024-12-23 08:42:50 -08:00
2061992be1 blog: Chicago 2024-12-23 08:42:38 -08:00
ec13456966 blog: Eclipse 2024-12-23 08:25:57 -08:00
807927a0de termlite: Update submodule commit 2024-12-23 08:13:46 -08:00
e7440684d7 blog: Moon 2024-12-22 15:28:45 -08:00
b9796ab096 When editing weeknotes with the website script, create the page from the Hugo archetype and process it
This implements what the Makefile did, but with a more intuitive interface.
Remove the weeknotes target from the Makefile.
2024-12-10 12:16:23 -08:00
8ec88e6c80 blog: Weeknotes for 2024W49 2024-12-10 11:05:47 -08:00
cc98666b2d blog: Make Pattern Rules 2024-12-05 17:26:55 -08:00
f6955df4f9 blog: Weeknotes for 2024W48 2024-12-01 15:18:32 -08:00
6b8cb0fb22 blog: Milk Bread Rolls 2024-12-01 14:29:07 -08:00
a90ebf15f6 termlite: Update submodule commit 2024-11-26 13:44:41 -07:00
b2eb00a0a8 photostream: Update submodule commit 2024-11-26 08:57:34 -07:00
11d8ac0b07 blog: Weeknotes for 2024W47 2024-11-26 08:45:07 -07:00
bb2e56cb47 blog: Remove draft flag from Orlando Pride post 2024-11-26 08:43:35 -07:00
80d1f8106a blog: Restore the two column layout on Netscape Meteors
At the bottom of this post is a two-column layout showing two versions of the
meteors spinner. I broke that in a previous commit and this commit brings it back.

Use the new content-grid shortcode (implemented in the submodule commit) to render
a two-column grid.
2024-11-26 08:39:50 -07:00
052152193d termlite: Update submodule commit 2024-11-25 15:57:01 -08:00
6edd649fb6 termlite: Update submodule commit 2024-11-25 15:48:15 -08:00
9e0df5797b blog: 2024 Books post
Add Fingersmith
2024-11-25 09:53:32 -08:00
622c09c472 blog: Orlando Pride post (draft) 2024-11-25 09:53:09 -08:00
7ab4ae1864 tags: an NWSL tag that expands to the name of the league 2024-11-25 09:52:43 -08:00
e3b93e5e0f Rewrite the figures/image template to use the new figures in the termlite theme 2024-11-25 09:52:22 -08:00
73aaf24f91 blog: TDoR 2024 2024-11-21 08:21:06 -08:00
3b4297c335 termlite: Update submodule commit 2024-11-19 20:53:38 -08:00
84fce9d862 blog: TDoR 2024 (draft) 2024-11-18 17:03:21 -08:00
ace538d953 blog: Weeknotes for 2024W47 (draft) 2024-11-18 17:03:13 -08:00
a9f52aad98 Rework a bunch of scripts into a single website script 2024-11-18 14:59:43 -08:00
f83c6ebbe5 blog: Cat in the Cream Cookies 2024-11-18 11:47:00 -08:00
b7fb364862 Meta: Avoid an IndexError with .get() instead of indexing in the weeknotes script
Replace indexing into the os.environ dictionary with a .get() call (and a default)
to avoid an IndexError
2024-11-18 08:05:22 -08:00
2d6912aed2 Add a --edit argument to the new-photo-post script 2024-11-17 14:51:39 -08:00
9ce6362402 Meta: Port several things common to various Python scripts to a new website module 2024-11-17 14:49:33 -08:00
a30903c8cf blog: 2024W25 Weeknotes 2024-11-17 14:47:58 -08:00
8afadd8379 blog: Remove draft flag from 2024W46 Weeknotes 2024-11-17 14:47:30 -08:00
dd2eec20bc blog: Books I Read in 2024 (draft) 2024-11-16 09:42:50 -08:00
f82a864f5e blog: Weeknotes for 2024W46 (draft) 2024-11-16 09:42:04 -08:00
a5093be13a termlite: Update submodule commit 2024-11-16 09:41:43 -08:00
96410c903c Add a custom .paragraph-spaced-list class
This class spaces its list elements with the standard paragraph spacing.
2024-11-15 20:58:37 -08:00
a968c9cb78 Add a <hr> to the test page 2024-11-15 07:34:01 -08:00
8105b0e16b Improve the handling of whitespace in template code
resource-builders: Update submodule commit
2024-11-14 08:49:52 -08:00
122e55b1fa blog: Rubiks' Cube Scrambler post
Implement the rubiks-cube-scrambler custom element, including JS and template
files. Put these things in the body-extras.html partial that the termlite theme
added.

resource-builders: Update submodule commit
termlite: Update submodule commit
2024-11-13 17:06:01 -08:00
cb16a35020 photos: Publish the Niagara posts (remove draft flag) 2024-11-11 08:33:27 -08:00
11d4dcd590 photos: Niagara Falls posts 2024-11-09 12:57:45 -08:00
1f53428932 termlite: Update submodule commit 2024-11-07 09:18:12 -08:00
d87438bf6a Add a few characters to the list of ones to strip out of strings when slugifying a title 2024-11-07 09:18:12 -08:00
f47c41a80d photostream: Update submodule commit 2024-11-07 09:18:12 -08:00
0cebee344a photos: Devil's Slide posts 2024-11-07 09:18:11 -08:00
d59f2e0a69 blog: Add citation and caption to Ay Carmela post
Update termlite submodule.
Enable block and title attributes in the Hugo renderer.
2024-11-06 09:32:12 -08:00
2104b5354b blog: Ay Carmela
Update termlite submodule with pre-formatted block styles.
2024-11-06 09:04:24 -08:00
0b67da2557 photos: Bay FC Home Opener post 2024-11-05 08:56:49 -08:00
8483704e73 Remove drafts from the production dev server 2024-11-04 16:53:03 -08:00
15bec870da Add the Coit Tower photo
Rename the first Fairmont photo to match the title and slug. I originally called
it the Freemont Hotel, which is wrong.
2024-11-04 16:52:02 -08:00
8cb1187aaa Do not build drafts
Too much trouble.
2024-11-04 16:38:29 -08:00
7d50f86bcf Remove the /now reference on the home page
/now is still a draft.
2024-11-04 16:37:40 -08:00
32c41daea1 Remove the explicit dependencies from go.mod 2024-11-04 16:36:40 -08:00
54782cc1f7 feeds: Update submodule commit 2024-11-04 15:47:19 -08:00
0a0f007a11 feeds: Update submodule commit 2024-11-04 08:45:11 -08:00
8010f10396 photos: Add North from the Fairmont Hotel post 2024-11-04 08:41:50 -08:00
126dc58e7c Add a 2024 section index to the photostream 2024-11-04 08:41:23 -08:00
0cef7a7903 Fix up the new-photo-post script
Make the script a little more resilient. Print out some EXIF data that the template
will use when generating the page.

Update the photostream submodule commit.

Remove the unused photo_exif_table.html partial.
2024-11-04 08:37:56 -08:00
602f5fa26c Update some content posts to work with the new shortcodes, etc 2024-11-01 21:42:36 -07:00
855c5b719e Create a deployall Makefile target
Move generating nethack data out of the deploy target so that deploy can just be
building what's there and pushing it.

Parameterize the destination build directory as BUILD_DIR. Default to the hugo
default, i.e. public.
2024-11-01 21:29:15 -07:00
aa14214f73 Update Nethack logfile for electra 2024-10-31 17:18:48 -07:00
d42176c918 Update tags and opening paragraph on the Jackson and Other Holes post 2024-10-31 16:29:19 -07:00
f15644810c Add a description to the Jackson and Other Holes post 2024-10-31 12:54:17 -07:00
d1c47448ab termlite: Update submodule commit 2024-10-31 10:55:12 -07:00
fd6fd1c3ca "Jackson and Other Holes"
Travel post about going to Jackson, WY, Yellowstone, and the Grand Tetons with the HS friends group.
2024-10-31 08:39:43 -07:00
cd789e9dfe Update Nethack logfile for electra 2024-10-31 08:11:53 -07:00
d1c2a3b4c8 Limit expanded year lists in the overall list template to 3 years for both blog and photostream 2024-10-31 08:07:05 -07:00
8bfa3fc8bf Add support for embedding videos in the figures/image shortcode 2024-10-31 08:06:05 -07:00
d679ae6c39 Quote the DEPLOY_LOCATION variable in the deploy Makefile target 2024-10-31 08:05:27 -07:00
9b682a5d96 Remove the .py extension from the new-photo-post script 2024-10-31 08:05:00 -07:00
3fba9450ee Update nethack logfile 2024-10-31 08:04:39 -07:00
0d4a5ea214 termlite: Update submodule commit 2024-10-31 08:03:51 -07:00
6343452a62 Exclude drafts from the latest widget 2024-10-27 10:05:35 -06:00
e72f8136ab Publish BSD Make post 2024-10-27 10:03:19 -06:00
d6e56e2ab7 Add a "production" argument to the dev_server script
When this argument is passed, set the environment to "production".
2024-10-27 09:58:42 -06:00
612a0425a2 termlite: Update submodule commit 2024-10-27 09:58:10 -06:00
5e58416bc6 Rewrite home page content
Add the latest widget that lays out two blog posts and four photos in a grid
2024-10-27 09:57:30 -06:00
d5296995de Get the nethack page looking good again
Update all the CSS classes and fix the layout so it looks good in the new theme.
Convert a bunch of CSS classes to BEM style.
2024-10-27 09:56:46 -06:00
2b613de769 termlite: Update submodule commit 2024-10-26 08:32:08 -06:00
b72441b9b1 Embed the image of a photo post link in a <figure> 2024-10-26 08:31:14 -06:00
e65a680b49 Get blog and photos posts recursively in the latest widget
Now that year sections are real sections, real pages (i.e. blog posts and photos)
need to be fetched recursively.
2024-10-26 08:30:44 -06:00
0e2c7c2dac termlite, photostream: Update submodule commits
Consolidate list templates
2024-10-24 10:08:53 -06:00
796371e10f termlite, photostream: Update submodule commits 2024-10-23 11:17:03 -07:00
b163b64e47 Add index pages to blog and photos subdirectories
These should be full Hugo sections so Hugo generates year section pages.
2024-10-23 10:28:54 -07:00
1d4969a06b Ignore /documentation/mirrors/ 2024-10-23 08:36:55 -07:00
300829b9eb Add short linkTitles to a bunch of photo posts 2024-10-23 08:34:55 -07:00
71cb4e9d2f Spell out the arguments to hugo in the Makefile for self-documentation 2024-10-20 09:19:56 -07:00
5c2942bc56 Add a home/latest widget
Add a shortcode and some styles for a two column, two row grid of latest posts.
2024-10-20 09:19:14 -07:00
f55b445c1f The abbr shortcode takes a single positional argument to use a the title attribute 2024-10-20 09:13:54 -07:00
7274f9ce74 Update feed publishing
Remove RSS. As Tess said, it's a pile of hacks and conflicting specs. Better to
use Atom. I was only ever linking to Atom feeds anyway.
2024-10-20 09:13:22 -07:00
f19de6f8fc Update Nethack logfile for electra 2024-10-19 08:30:56 -07:00
310d4177c1 Update build arguments for the development server 2024-10-17 11:37:11 -07:00
093571e1cd Add a link title to the Vibin' photostream post 2024-10-17 08:41:55 -07:00
9e3f7d1a69 Replace the JS railroad diagram with an SVG in the Audio Scope post 2024-10-17 08:41:04 -07:00
45449c3b20 Make the home page a single page 2024-10-17 08:40:32 -07:00
f5b2b1e67a termlite: Update submodule commit 2024-10-17 08:40:13 -07:00
750dd6179b photostream: Add go module, git submodule, and update commit 2024-10-17 08:39:25 -07:00
7b353e2fa8 Disable HTTP caching on the dev server 2024-10-13 23:15:02 -07:00
f95ac34c7c termlite: Update submodule commit 2024-10-13 23:14:45 -07:00
9f2eacfaeb Update the front matter for the cats page 2024-10-12 11:27:53 -07:00
4da0aeca1a Add .figure class to code and image figures 2024-10-12 11:27:38 -07:00
830f22d6ba termlite: Update submodule commit 2024-10-12 11:27:16 -07:00
3766168bea Remove assets/styles 2024-10-10 23:06:23 -07:00
187bc15a6f termlite: Update submodule commit 2024-10-10 23:04:53 -07:00
3bb8917116 termlite: Update submodule commit 2024-10-08 19:22:35 -07:00
3369b52735 Move the youtube shortcode to the termlite theme
Rename it figures/youtube → youtube and update the posts that use it.
2024-10-08 09:09:02 -07:00
d496238184 Update the site title and copyright 2024-10-08 09:06:08 -07:00
8e8881c52e image-utils: Update submodule commit 2024-10-08 08:46:38 -07:00
5510a738fa Remove the railroad shortcode
This partial moved to railroad-diagrams. Except it's pissing me off. 🙃
2024-10-08 08:46:28 -07:00
e0b2683ef9 Remove the images/orientation_angle partial
This partial moved to the image-utilities theme
2024-10-08 08:46:06 -07:00
3102dc1e56 Move a bunch of shortcodes and partials back from the platters theme 2024-10-08 08:45:44 -07:00
20d53e0df2 image-utils: Add image-utils submodule 2024-10-08 08:41:31 -07:00
0f200e3d09 Move circular_image back to the top level 2024-10-07 21:43:47 -07:00
47d1bf9ffe Move nobreak and tess shortcodes back to the top level layouts directory 2024-10-07 21:42:29 -07:00
66adceaf24 Move all layouts to platters theme 2024-10-07 21:39:17 -07:00
de8101efed Remove layouts from themes/platters 2024-10-07 21:38:50 -07:00
6398a4d0df Add an empty platters theme 2024-10-07 21:37:58 -07:00
ae9aa17e37 import map template 2024-10-07 21:36:03 -07:00
3e4e292a23 Update the content header partial 2024-10-07 21:35:48 -07:00
fa82e4f9a7 Make some tweaks to the layout stylesheet 2024-10-07 21:34:44 -07:00
f0d0d5a136 Add an error return from the figures/image shortcode if the images list contains a nil 2024-10-07 21:33:30 -07:00
8d7b2364db Remove the date from the about page 2024-10-07 21:32:31 -07:00
00d6181bd8 Make the whole site a module so it can accommodate the theme modules 2024-10-07 21:30:32 -07:00
bac1ff6ea9 resource-builders: Add submodule 2024-10-07 21:28:10 -07:00
fd75e27423 termlite: Add termlite submodule 2024-10-07 21:12:55 -07:00
afc5433304 Detect all .html files under layouts as HTML files 2024-10-05 18:57:11 -05:00
9628145f56 Remove quotes from B612 title field 2024-07-31 07:18:18 -07:00
c4f5170a09 Edits and updates to Weeknotes 2024w24 2024-06-20 17:21:48 -07:00
4c44baab1b Fix a type in Weeknotes 2024w23 2024-06-18 08:23:34 -07:00
2a780a08ae Weeknotes for 2240w24 2024-06-18 08:20:37 -07:00
bee8800070 Replace the next_sunday.py script with a more comprehensive weeknotes script 2024-06-10 13:18:21 -07:00
1c897e4518 Small edit to 2024w23 weeknotes 2024-06-09 23:18:56 -07:00
2f5b413d1e Enable emoji codes in Markdown like 🏳️‍🌈 2024-06-09 23:18:40 -07:00
b241986a5d Weeknotes for 2024w23 2024-06-09 23:16:19 -07:00
3174b44fbe Ignore .md-e files 2024-06-03 07:56:41 -07:00
7843ee9cdd Write a new script to calculate next Sunday's date 2024-06-03 07:55:36 -07:00
e2d64f82f8 Weeknotes 2024w22 2024-06-03 07:43:53 -07:00
4166a83fcb Remove broken Spanish language page 2024-05-26 09:33:31 -07:00
cfe80aaeef Remove the other archetype 2024-05-26 09:26:59 -07:00
851f676ca0 Weeknotes archetype and Makefile rule 2024-05-26 09:26:40 -07:00
7ff50445f5 Fix the header font size scale 2024-05-26 09:25:24 -07:00
452fec15ad Weeknotes, 2024W21 2024-05-26 09:25:10 -07:00
d7ec4ae8b6 Reindent root_css partial 2024-04-09 20:49:56 -05:00
84f8a6697f Update twitter shortcodes to take user and id argumentsg 2024-04-09 20:49:21 -05:00
6f42d2b7e8 Fix a photo embed in the Japan trip post 2024-03-28 16:49:50 -07:00
de3bf86764 Update Nethack logfile for electra 2024-03-27 07:59:00 -07:00
e18453dac0 Allow the caller of the figures/image shortcode to skip image processing via the shouldResize argument 2024-03-11 08:28:58 -07:00
85ed759a3a Add toki pona to the list of supported languages 2024-03-11 08:27:33 -07:00
dabda17c06 [post] I Use This 2024-03-09 09:35:29 -08:00
84382e4576 [post] B612 2024-03-09 09:08:16 -08:00
d1688c14b5 Style fixes for Definition Lists 2024-01-15 17:07:12 -08:00
5973cd882b [post] You Deserve A Tech Union [draft] 2024-01-15 17:06:29 -08:00
ac8f8781cf Uses page 2024-01-15 17:05:40 -08:00
2098413e87 [post] Thirty Six 2024-01-15 17:04:52 -08:00
ee9382b7a9 Clean up the terms template a bit 2024-01-08 13:16:53 -08:00
8b7e70dc81 Resume updates 2024-01-08 13:16:39 -08:00
48df8771ab [post] We Beat Tetris? 2024-01-08 13:16:19 -08:00
11bacea783 CSS and a shortcode for a 2-column grid within the content track 2024-01-08 08:32:13 -08:00
14f4246154 Fix the misasligned slogan in the site footer 2024-01-08 08:22:47 -08:00
7ebf3da3bd [post] Add a Chess Friend page 2023-12-31 12:17:44 -08:00
9584896363 Add a class argument to the figures/image shortcode 2023-12-31 12:17:27 -08:00
5f14f1cea2 [post] Add a description to "Less Instagram, More Blog" 2023-12-31 12:17:06 -08:00
34d4bee382 [post] Hello Chess Friend 2023-12-31 12:16:45 -08:00
74ed7ba8dc [post] Yerba Buena summary 2023-12-27 13:03:05 -07:00
ff72f94b8f Fix YouTube figures and add a .content-width CSS class 2023-12-27 12:51:07 -07:00
f7e35417a9 [post] Less Instagram More Blog 2023-12-27 12:50:31 -07:00
5444c10dba [photo] Cinnamon Buns 2023-12-26 21:55:49 -07:00
1660f63578 [photo] Tumbleweed Tree 2023-12-26 21:55:36 -07:00
087e3461d6 Apply js.Build to railroad_utils.js 2023-12-26 21:42:16 -07:00
778416a43a [post] What to Blog About 2023-12-23 09:33:43 -07:00
992e9119f3 Remove unneeded icon overrides in nethack.css 2023-12-18 11:22:30 -08:00
383234e983 Address all warnings during the Hugo build
- Add descriptions for pages that have too much content
- Add an image orientation override param so that I can specify orientation when it's missing from EXIF
- Move the author.name and author.email configurations to params; delete author.yaml
2023-12-18 11:22:14 -08:00
e4c62f02d3 Add a description to my "Once Upon A Time I Lived on Mars" book report 2023-12-16 09:26:02 -08:00
b876f5a0cd Move li_grid_with_date template to _default so terms and blog can use it 2023-12-16 09:25:35 -08:00
b9265b5793 Add a tsconfig based on @tsconfig/recommended 2023-12-16 09:25:00 -08:00
d540126bfa Merge branch 'posts/2023/chess' 2023-11-23 09:34:34 -07:00
63ddb21964 Final Chess post 2023-11-23 09:34:16 -07:00
a353c4a549 {{< img >}} shortcode 2023-11-20 11:55:58 -08:00
ee98566283 In the page_css partial, check array length and presence of $.File before concatenating stylesheets 2023-11-20 11:55:40 -08:00
a4a0561bc8 In new-photo-post.py, continue instead of pass when opening an image fails 2023-11-20 11:54:41 -08:00
bcae9f135c Tag a commit after deploying 2023-11-20 11:54:11 -08:00
ca8cbf8f78 Update Nethack logfile for electra 2023-11-20 10:33:57 -08:00
4a4a941e5d Merge branch 'massive-relayout' 2023-11-20 10:33:39 -08:00
5cccfb9887 Give code block line numbers a less prominent color 2023-11-19 07:28:23 -08:00
3783801365 Turn off code block line numbers by default 2023-11-19 07:27:46 -08:00
b3a38f4c7d Define start and end line names for each content column 2023-11-19 07:27:31 -08:00
14cf9750d4 Remove an unused layout CSS rule 2023-11-18 18:30:43 -08:00
cb3d538a54 Table of contents styling and spacing 2023-11-18 11:16:11 -08:00
73320e6fb3 Fix <code> block and inline styles 2023-11-18 11:15:42 -08:00
703d6933f3 Use {% %} instead of {< >} for headings with ruby to make it work correctly in the table of contents 2023-11-18 11:13:47 -08:00
f905b16940 Add a render template for headings
Create heading anchors and style them with colors and stuff
2023-11-18 11:13:16 -08:00
bfee27e7c5 Fix "me" image on the about page
Add a section shortcode to enable wrapping a chunk of a post in a <section>
Add a section.flow class that removes grid from the section
Fix up the about styles so that the paragraph that Hugo wraps the <img> in behaves sensibly when floated
Fix the alt text in the circular_image shortcode
2023-11-18 11:11:34 -08:00
2a83017324 Remove table of contents stylesheet 2023-11-16 13:21:44 -08:00
3d25927c65 Clean up monokai and nethack stylesheets a tiny bit
Remove some unused and redundant stuff
2023-10-14 15:06:16 -07:00
03fee87f16 Rename some root styles 2023-10-14 15:05:58 -07:00
d45ad449a5 Merge branch 'main' into massive-relayout
# Conflicts:
#	assets/styles/root/050_ruby_controls.css
#	layouts/partials/ruby_controls.html
2023-10-14 15:00:00 -07:00
bf37618430 Merge branch 'ruby-switch' 2023-10-14 14:56:57 -07:00
59f5b195a5 The nethack importer updated Electra's hostname 2023-10-14 14:56:38 -07:00
8022a8f84a Integrate <ruby-switch> into the templates 2023-10-14 14:55:54 -07:00
abb85f701d Ruby Switch script v1 2023-10-12 11:05:02 -07:00
c56f91da2c Write a warning if an image doesn't have an orientation
Default to 0º orientation.
2023-10-12 11:04:19 -07:00
ff2dbdb1fd [post] San Diego Zoo Safari Park photos
- Vibin'
- Lotus
2023-10-12 11:03:58 -07:00
a4648e7a39 Add alt text to the doormat test image in test/ 2023-10-12 10:13:52 -07:00
2bd5fd03bb Add .column5 utility class 2023-10-12 10:13:33 -07:00
48a28a7f7a Remove dead 050_ruby.css file 2023-10-12 10:12:28 -07:00
8cc207b84c Parameterize the photo grid 2023-10-03 08:55:13 -07:00
864c1b673a Fix the home layout 2023-09-30 13:03:10 -07:00
20e76897ff Move site header layout styles to columns; fix nav spacing
Do a bit of testing on Chrome too.
2023-09-30 11:56:45 -07:00
17f576406f Move all the figure styles to columns and typography 2023-09-30 11:22:08 -07:00
090eef5bee Fix the alignment of the post title <h1> 2023-09-30 11:06:30 -07:00
fe176e4dfd Two Space Indents in CSS 2023-09-30 11:05:57 -07:00
3a1597acec Move all the syntax highlighting styles to functional stylesheets 2023-09-28 18:16:38 -07:00
fb7fd04fe9 Fix the lists! 2023-09-28 16:29:02 -07:00
c642a23ec3 Move a bunch of color stuff from typography to colors 2023-09-28 14:41:32 -07:00
cf0fd27172 Partially reorganize styles into functional chunks, rather than by component
Move link, generic page layout, post list, and a bunch of leftover stuff in root.css to functional stylesheets in styles/root/.
2023-09-28 14:12:55 -07:00
a9cfddec80 Fix styling of blog, photos, term, ruby
So many fixes!
2023-09-26 09:37:04 -07:00
b7070ccfd5 Remove the <ul> and <li> from the blog list 2023-09-26 08:35:21 -07:00
6f132cc04e Development styles so far 2023-09-24 09:22:00 -07:00
1fac613c37 All the root styles so far 2023-09-24 09:21:49 -07:00
d18edef261 Add section.atom templates to blog and photos that are identical to the home feed 2023-09-24 08:59:40 -07:00
1ce9e2b417 Add empty section.html templates to nethack and nihongo 2023-09-24 08:59:19 -07:00
0262f79509 Add empty section.atom templates to about/ nethack/ and nihongo/ 2023-09-24 08:58:51 -07:00
42dc062147 Updates to the blog list so far (I've lost track) 2023-09-24 08:46:30 -07:00
d6e5c2a978 Only add a figcaption to the figures/image shortcode if the Title is non-empty 2023-09-24 08:45:47 -07:00
162e17339c Move photos styles to styles/photos/ files 2023-09-24 08:43:29 -07:00
2331e37e62 Move blog.css styles to styles/blog/ files 2023-09-24 08:43:10 -07:00
dbb202d7f9 Merge branch 'main' into massive-relayout 2023-09-23 13:34:09 -07:00
b95120c602 Post: Guide to Computing 2023-09-23 13:29:55 -07:00
01d27411d7 Establish a grid system
There are 5 content columns, two gutter tracks, two wide content columns, and two margin columns
2023-08-20 12:23:08 -07:00
f4ed16c706 Clean up content_header 2023-08-20 12:15:37 -07:00
4576de0c8d Wrap about's style in @layer page { } 2023-08-20 12:14:43 -07:00
c94c4a6c95 Teach resources/page_css how to load CSS stylesheets with .Kind 2023-08-20 12:14:08 -07:00
851c74b2c9 Define variables for <h*> sizes 2023-08-20 10:07:26 -07:00
f950cdbbd9 Remove border-radius from figures 2023-08-20 10:06:58 -07:00
1dc243c95f Remove leading empty space from <figcaption> if it's empty 2023-08-20 10:05:37 -07:00
8aed72a94d Wrap tags list in a .taxonomies <div>
Put two <ul.tags> elements inside so there's not an <li> with a triangle in it.
2023-08-20 09:59:16 -07:00
ea9fb02aaa Move home styles to home.css 2023-08-20 09:59:16 -07:00
3bcdd7edb7 Add .page or .list to <main> depending on the length of .Pages 2023-08-20 09:59:02 -07:00
013d707f50 Do the header gradient one letter at a time for browsers that don't support background-clip: text 2023-08-20 09:58:26 -07:00
61047d1c26 [post] Mastodon Icon, remove draft 2023-08-11 08:28:19 -07:00
43e3cc33b3 [post] Mastodon Icon 2023-08-11 08:23:43 -07:00
ead226cccc Fix all the dark icons 2023-08-11 08:21:50 -07:00
629bbe0c5c Copy over the viewBox, width, and height attributes of the light social icons to dark icons 2023-08-11 08:11:08 -07:00
041000ce37 Adjust Mastodon icon down 1 px 2023-08-11 08:07:02 -07:00
9372bf3093 Merge branch 'mastodon-icon' 2023-08-11 08:05:35 -07:00
404 changed files with 6249 additions and 2294 deletions

2
.gitattributes vendored
View file

@ -1,3 +1,5 @@
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.pxm filter=lfs diff=lfs merge=lfs -text
*.mov filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text

4
.gitignore vendored
View file

@ -1,7 +1,11 @@
node_modules/
public/
/documentation/mirrors/
/resources/
.hugo_build.lock
*.log
*.orig
*~
# Backup files for Markdown files processed in-place with sed
*.md-e

18
.gitmodules vendored Normal file
View file

@ -0,0 +1,18 @@
[submodule "themes/platters"]
path = themes/platters
url = nutmeg:git/hugo-theme-platters.git
[submodule "themes/termlite"]
path = themes/termlite
url = git@github.com:erynofwales/hugo-theme-termlite.git
[submodule "themes/resource-builders"]
path = themes/resource-builders
url = git@github.com:erynofwales/hugo-resource-builders.git
[submodule "themes/image-utils"]
path = themes/image-utils
url = git@github.com:erynofwales/hugo-image-utilities.git
[submodule "themes/photostream"]
path = themes/photostream
url = git@github.com:erynofwales/hugo-theme-photostream.git
[submodule "themes/feeds"]
path = themes/feeds
url = git@github.com:erynofwales/hugo-theme-feeds.git

View file

@ -1,4 +1,4 @@
-- Eryn Wells <eryn@erynwells.me>
vim.bo.shiftwidth = 4
vim.bo.softtabstop = 4
vim.bo.shiftwidth = 2
vim.bo.softtabstop = 2

View file

@ -2,7 +2,7 @@
local filetypedetectGroup = vim.api.nvim_create_augroup("HugoHTMLTemplates", {clear = true})
vim.api.nvim_create_autocmd({"BufRead", "BufNewFile"}, {
pattern = {"*/layouts/*.html"},
pattern = {"**/layouts/**/*.html"},
group = filetypedetectGroup,
command = "set ft=gohtmltmpl",
})

View file

@ -1,5 +1,9 @@
# Eryn Wells <eryn@erynwells.me>
BUILD_DIR=public
CONTENT_PATH=content
DEPLOY_USER=eryn
DEPLOY_HOSTNAME=nutmeg.erynwells.me
DEPLOY_PATH=/srv/www/erynwells.me/html
@ -12,13 +16,16 @@ NETHACK_LOGFILE_DATA_FILE=data/nethack/logfile/$(HOSTNAME).json
.PHONY: site deploy clean
site: nethack
site:
@echo "Building site"
hugo
hugo --buildFuture --enableGitInfo --destination "$(BUILD_DIR)"
deploy: site
@echo "Deploying to $(DEPLOY_LOCATION)"
rsync -avz --no-times --no-perms --delete public/ $(DEPLOY_LOCATION)
rsync -avz --no-times --no-perms --delete "$(BUILD_DIR)/" "$(DEPLOY_LOCATION)"
git tag -f deploy-$(shell date +%Y-%m-%d)
deployall: nethack deploy
nethack: nethack-logfile nethack-commit
@ -32,4 +39,4 @@ nethack-commit: $(NETHACK_LOGFILE_DATA_FILE)
if ! git diff --quiet $<; then git commit -m "Update Nethack logfile for $(HOSTNAME)" -- $<; fi
clean:
rm -rf public/
rm -rf "$(BUILD_DIR)/"

9
archetypes/link.md Normal file
View file

@ -0,0 +1,9 @@
---
title: "{{ replace .Name "-" " " | title }}"
slug: link-{{ .Name }}
date: {{ .Date }}
categories: links
draft: true
tags: []
---

10
archetypes/weeknotes.md Normal file
View file

@ -0,0 +1,10 @@
---
title: "Notes on {{ time.Now.Format "2006" }}W%%WEEK_NUMBER%%"
slug: weeknotes-{{ time.Now.Format "2006" }}w%%WEEK_NUMBER%%
date: {{ .Date | time.Format "2006-01-02" }}
categories: weeknotes
tags:
- Weeknotes
draft: true
---

View file

@ -0,0 +1,18 @@
/************************
* PARAGRAPH-SPACED LIST
************************/
p + .paragraph-spaced-list {
margin-block-start: var(--space-paragraph);
}
.paragraph-spaced-list {
li + li {
margin-block-start: var(--space-paragraph);
}
}

View file

@ -0,0 +1,42 @@
.home-latest {
display: grid;
grid-column: main-start / main-end;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: min-content min-content;
grid-template-areas:
"blog1 blog1 blog2 blog2"
"photo1 photo2 photo3 photo4";
.home-latest__blog {
margin-block-end: var(--space-m);
}
.home-latest__blog:nth-of-type(1) {
grid-area: blog1;
border-right: 2px dashed var(--gray6);
padding-inline-end: var(--space-s);
}
.home-latest__blog:nth-of-type(2) {
grid-area: blog2;
padding-inline-start: var(--space-s);
}
.home-latest__photo {
}
}
@media screen and (max-width: 480px) {
.home-latest {
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(min-content, 4);
grid-template-areas:
"blog1 blog2"
"photo1 photo2"
"photo3 photo4";
}
}
p + .home-latest {
margin-block-start: var(--space-paragraph);
}

100
assets/css/099_nethack.css Normal file
View file

@ -0,0 +1,100 @@
/******************
* NETHACK LOGFILE
******************/
#dungeon-background {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: -1;
filter: brightness(0.3);
}
.nethack-logfile {
margin-inline-start: 0;
padding-inline-start: 0;
.nethack-logentry {
align-items: first baseline;
display: grid;
grid-template-columns: min-content min-content auto min-content;
grid-template-areas:
"list-marker entry-marker entry-date entry-character-descriptor"
". . entry-description entry-description"
". . entry-stats entry-stats";
gap: var(--space-xs);
margin-inline-start: 0;
}
}
.nethack-logentry {
&:not(:last-child) {
margin-block-end: var(--space-l);
}
&::before {
grid-area: list-marker;
}
.nethack-logentry__marker {
grid-area: entry-marker;
}
.nethack-logentry__date {
grid-area: entry-date;
line-height: 1;
margin: 0;
padding: 0;
}
.nethack-logentry__character-descriptor {
font-family: var(--font-family-monospace);
font-size: var(--text-s);
grid-area: entry-character-descriptor;
line-height: 1;
white-space: nowrap;
}
.nethack-logentry__description {
grid-area: entry-description;
margin: 0;
}
.nethack-logentry__stats {
border: 0;
color: var(--text-color-secondary);
font-family: var(--font-family-monospace);
font-size: var(--text-s);
grid-area: entry-stats;
margin-block: 0;
width: 100%;
-webkit-border-horizontal-spacing: 0;
-webkit-border-vertical-spacing: 0;
}
.nethack-logentry__stats {
padding: 0;
text-transform: uppercase;
vertical-align: bottom;
white-space: nowrap;
thead {
font-weight: bolder;
}
.nethack-logentry__score,
.nethack-logentry__hp,
.nethack-logentry__level {
width: 16rem;
text-align: right;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

View file

@ -402,11 +402,11 @@ class TunnelGenerator {
}
/**
* Dig a corridor from fromPoint to toPoint, assuming that both points are adjacent to valid locations for doors on
* the map.
* Dig a corridor from fromPoint to toPoint, assuming that both points are
* adjacent to valid locations for doors on the map.
*
* This is as close a copy of dig_corridor in the Nethack source as I could muster. It's not exactly pretty. This
* method assumed
* This is as close a copy of dig_corridor in the Nethack source as I could
* muster. It's not exactly pretty. This method assumed
*/
#digCorridorFromPointToPoint(p, fromPoint, toPoint) {
const MAX_STEPS = 500;
@ -711,6 +711,8 @@ new p5(p => {
p.setup = () => {
const container = document.querySelector('#dungeon-background');
console.assert(container, "Missing #dungeon-background element");
canvasWidth = parseFloat(getComputedStyle(container).width);
canvasHeight = parseFloat(getComputedStyle(container).height);
@ -731,9 +733,11 @@ new p5(p => {
grid = new Grid(gridBounds.size.width, gridBounds.size.height);
grid.generate(p, NRandomRoomsGenerator, TunnelGenerator);
}
};
p.draw = () => {
console.log("Drawing");
p.textSize(CELL_HEIGHT);
for (let y = 0; y < grid.height; y++) {

View file

@ -1,8 +1,4 @@
{{ with resources.Get "scripts/lib/railroad.js" | fingerprint "sha512" }}
import rr from "{{ .RelPermalink }}";
{{ else }}
{{ errorf "Unable to get railroad.js resource" }}
{{ end }}
import rr from "scripts/lib/railroad.js";
class RailroadDiagramManager {
constructor() {

View file

@ -0,0 +1,123 @@
class RubiksCubeScrambler extends HTMLElement {
static #RandomMoveHysteresisMaxLength = 2;
#shadowRoot;
#movesListElement;
#numberOfMovesToGenerate = 25;
constructor() {
super();
this.#shadowRoot = this.attachShadow({ mode: "open" });
}
scramble() {
console.log("Randomizing Rubik's cube...");
const movesList = this.#movesListElement;
while (movesList.childElementCount > this.#numberOfMovesToGenerate) {
movesList.removeChild(movesList.lastChild);
}
let randomMoveHysteresis = [];
for (let i = 0; i < this.#numberOfMovesToGenerate; i++) {
const randomMove = this.#randomMove(randomMoveHysteresis);
let moveItem;
if (i < movesList.childElementCount) {
moveItem = movesList.children[i];
} else {
moveItem = document.createElement("li");
movesList.appendChild(moveItem);
}
moveItem.classList.add("scrambler__move");
moveItem.classList.remove("scrambler__move--start", "scrambler__move--end");
if (randomMove.includes("2")) {
moveItem.classList.add("scrambler__move--start");
} else if (randomMove.includes("'")) {
moveItem.classList.add("scrambler__move--end");
}
moveItem.innerText = randomMove;
}
}
#randomMove(hysteresis) {
const faces = "FBLRUD";
let move;
do {
move = faces.charAt(Math.floor(Math.random() * faces.length));
} while (hysteresis && hysteresis.includes(move));
if (hysteresis) {
hysteresis.unshift(move);
while (hysteresis.length > RubiksCubeScrambler.#RandomMoveHysteresisMaxLength) {
hysteresis.pop();
}
}
const modifierFactor = Math.random();
if (modifierFactor < 0.33333) {
move = "2" + move;
} else if (modifierFactor < 0.666666) {
move = move + "'";
}
return move;
}
#removeAllMoves() {
const element = this.#movesListElement;
while (element.hasChildNodes()) {
element.removeChild(element.lastChild);
}
}
// MARK: Custom Element
connectedCallback() {
let template = document.getElementById("rubiks-cube-scrambler-template");
console.assert(template, "Couldn't find RubiksCubeScrambler component template in the document");
const shadowRoot = this.#shadowRoot;
shadowRoot.appendChild(template.content.cloneNode(true));
this.#movesListElement = shadowRoot.querySelector(".scrambler__move-list");
shadowRoot
.querySelector("button[name='scramble']")
.addEventListener("click", () => this.scramble());
const patternLengthInputElement = shadowRoot.querySelector(".scrambler__pattern-length > input");
patternLengthInputElement.value = this.#numberOfMovesToGenerate;
patternLengthInputElement.addEventListener("input", event => {
try {
const integerValue = parseInt(event.target.value);
this.#numberOfMovesToGenerate = integerValue;
} catch (e) {
console.error("Non-integer value of pattern length field", e);
}
});
this.scramble();
}
attributeChangedCallback(name, oldValue, newValue) {
console.debug("RubiksCubeScrambler attribute changed", name, oldValue, newValue);
if (name === "count") {
try {
let newIntValue = parseInt(newValue);
this.#numberOfMovesToGenerate = newIntValue;
} catch (e) {
console.error("`count` attribute should have an integer value.", e);
}
}
}
}
window.customElements.define("rubiks-cube-scrambler", RubiksCubeScrambler);

View file

@ -0,0 +1,169 @@
// Eryn Wells <eryn@erynwells.me>
class RubySwitch extends HTMLElement {
static controlSizeInPixels = 32;
static thumbTransitionDuration = 0.1;
static settings = [
{
id: "ruby-switch-none",
value: "none",
label: "あ"
},
{
id: "ruby-switch-both",
value: "both",
label: "<ruby>あ<rt>a</rt></ruby>",
default: true
},
{
id: "ruby-switch-hidden",
value: "hidden",
label: "ab"
},
];
#root;
#thumb;
constructor() {
super();
this.#updateValue(RubySwitch.settings.find(obj => obj.default).value);
this.addEventListener("RubyStyleChanged", event => {
this.#updateValue(event.detail.style);
});
this.#root = this.attachShadow({ mode: "closed" });
this.#buildShadowDOM();
this.#updateThumbPosition(this.#root.querySelector(".control[data-default]"));
}
#updateValue(style) {
this.setAttribute("value", style);
}
get #stylesheet() {
const controlSize = RubySwitch.controlSizeInPixels;
const halfControlSize = controlSize / 2;
return `
#ruby-controls {
box-sizing: border-box;
display: inline-block;
position: relative;
}
#controls {
border: none;
box-sizing: border-box;
display: inline grid;
grid-template-columns: repeat(3, ${controlSize}px);
margin: 0;
overflow: none;
padding: 0;
}
#thumb {
box-sizing: border-box;
box-shadow: 2px 2px 6px #ccc;
border: 0.5px solid #aaa;
border-radius: ${halfControlSize}px;
position: absolute;
top: 0;
height: ${controlSize}px;
width: ${controlSize}px;
z-index: 50;
transition: left ${RubySwitch.thumbTransitionDuration}s;
}
.control {
aspect-ratio: 1;
display: flex;
justify-content: center;
align-items: center;
height: ${controlSize}px;
width: ${controlSize}px;
}
b {
font-weight: normal;
cursor: pointer;
}
label {
z-index: 2;
text-align: center;
}
#ruby-switch-both {
}
`;
}
#buildShadowDOM() {
const root = this.#root;
const style = document.createElement("style");
style.textContent = this.#stylesheet;
root.appendChild(style);
let container = document.createElement("div");
container.id = "ruby-controls";
root.appendChild(container);
let controls = document.createElement("div");
controls.id = "controls";
container.appendChild(controls);
for (const desc of RubySwitch.settings) {
let control = document.createElement("div");
control.classList.add("control")
control.id = desc.id;
control.dataset.value = desc.value;
if (desc.default) {
control.dataset.default = "";
}
controls.appendChild(control);
control.addEventListener("click", event => {
event.stopPropagation();
event.preventDefault();
this.#updateThumbPosition(event.currentTarget);
this.#root.dispatchEvent(new CustomEvent("RubyStyleChanged", {
bubbles: true,
composed: true,
detail: {
style: control.dataset.value,
},
}));
}, { capture: true });
const label = document.createElement("b");
label.innerHTML = desc.label;
control.appendChild(label);
}
const thumb = document.createElement("div");
this.#thumb = thumb;
thumb.id = "thumb";
container.appendChild(thumb);
}
#updateThumbPosition(selectedControl) {
const controls = this.#root.querySelector("#controls");
const trackBoundingRect = controls.getBoundingClientRect();
const controlBoundingRect = selectedControl.getBoundingClientRect();
const offset = controlBoundingRect.left - trackBoundingRect.left;
this.#thumb.style.left = `${offset}px`;
}
}
customElements.define("ruby-switch", RubySwitch);

View file

@ -1,79 +0,0 @@
:root {
--post-item-highlight-color: #efefef;
--blog-list-grid-template-columns: minmax(min-content, 10vh) minmax(min-content, 3vh) auto max-content max-content;
}
@media (prefers-color-scheme: dark) {
:root {
--post-item-highlight-color: #121212;
}
}
.blog > .highlight { margin-block-end: var(--body-item-spacing); }
.post-nav {
align-items: baseline;
display: flex;
margin-top: 3.5rem;
}
.post-nav .next {
margin-left: auto;
}
.post-single footer {
margin-block-start: var(--body-item-spacing);
}
.blog.list > ul {
list-style: none;
}
.blog.list > ul > li {
align-items: baseline;
border-radius: 6px;
display: grid;
gap: 1rem;
grid-template-columns: var(--blog-list-grid-template-columns);
margin-block-end: 0.25rem;
transition: background-color 0.25s;
}
.blog.list > ul > li:hover {
background-color: var(--post-item-highlight-color);
}
.blog.list > ul > li > a { color: inherit; }
.blog.list > ul > li > a:hover { text-decoration: none; }
.blog.list > ul > li > time:nth-child(2) { text-align: end; }
.blog.list > ul > li > .draft { align-self: center; }
@supports (grid-template-columns: subgrid) {
.blog.list {
display: grid;
gap: 1rem;
grid-template-columns: var(--blog-list-grid-template-columns);
}
.blog.list > ul {
display: grid;
row-gap: 0.25rem;
grid-column: 1 / -1;
grid-template-columns: subgrid;
list-style: none;
}
.blog.list > ul > li {
display: grid;
grid-column: 1 / -1;
grid-template-columns: subgrid;
margin-block-end: 0;
}
.blog.list > h5 {
grid-column: 1 / -1;
margin-block: 1rem 0;
}
.blog.list > h5:first-child {
margin-block-start: 0;
}
}
.blog.list > ul > li > :first-child {
text-align: end;
}

View file

@ -1,102 +0,0 @@
/* Eryn Wells <eryn@erynwells.me> */
details:has(.photo-params.debug) {
margin-inline: var(--body-item-spacing);
max-width: var(--content-width);
width: 100%;
}
.draft {
color: red;
display: inline-block;
font-family: 'SF Pro', sans-serif;
font-size: 1.5rem;
font-weight: bold;
letter-spacing: 3px;
text-transform: uppercase;
}
.draft:before {
content: "[";
}
.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);
box-sizing: border-box;
font-size: 12px;
padding: 0.5rem;
position: fixed;
left: 12px;
bottom: 12px;
width: max-content;
}
#debug-page-info > details {
margin: 0.5rem;
}
#debug-page-info > summary {
font-family: var(--font-family-heading);
}
#debug-page-info h4 {
margin-block: 1rem;
margin-inline-start: 2rem;
}
#debug-page-info table {
border: 0;
border-color: rgb(var(--dk-gray));
display: block;
margin-inline-start: 2rem;
width: 100%;
}
#debug-page-info table > tbody {
border: 1px solid;
}
#debug-page-info table > tbody + tbody {
border-top: 1px solid;
}
#debug-page-info td {
border: 1px dotted;
border-left: 1px solid;
padding: 0.3em;
}
#debug-page-info table > tbody > tr:nth-child(even) {
background-color: var(--separator-color);
}
.photos-params.debug {
width: calc(100% - var(--body-item-spacing));
}
.photo-params.debug > thead {
font-size: 2rem;
font-weight: bold;
border-bottom: 2px solid rgb(var(--dk-gray));
}
.photo-params.debug > tbody > tr > td {
border: 1px solid var(--photo-params-border-color);
vertical-align: top;
}
.photo-params.debug > tbody > tr > td:first-of-type {
width: max-content;
}
.photo-params.debug > tbody > tr > td:last-of-type {
word-wrap: anywhere;
overflow: scroll;
}

View file

@ -1,192 +0,0 @@
: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(--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);
}
/* Other */ .chroma .x { }
/* Error */ .chroma .err { color: #960050; background-color: #1e0010 }
/* CodeLine */ .chroma .cl { }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
/* LineHighlight */ .chroma .hl { background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* Keyword */ .chroma .k { color: #00a8c8 }
/* KeywordConstant */ .chroma .kc { color: #00a8c8 }
/* KeywordDeclaration */ .chroma .kd { color: #00a8c8 }
/* KeywordNamespace */ .chroma .kn { color: #f92672 }
/* KeywordPseudo */ .chroma .kp { color: #00a8c8 }
/* KeywordReserved */ .chroma .kr { color: #00a8c8 }
/* KeywordType */ .chroma .kt { color: #00a8c8 }
/* Name */ .chroma .n { color: #111111 }
/* NameAttribute */ .chroma .na { color: #75af00 }
/* NameBuiltin */ .chroma .nb { color: #111111 }
/* NameBuiltinPseudo */ .chroma .bp { color: #111111 }
/* NameClass */ .chroma .nc { color: #75af00 }
/* NameConstant */ .chroma .no { color: #00a8c8 }
/* NameDecorator */ .chroma .nd { color: #75af00 }
/* NameEntity */ .chroma .ni { color: #111111 }
/* NameException */ .chroma .ne { color: #75af00 }
/* NameFunction */ .chroma .nf { color: #75af00 }
/* NameFunctionMagic */ .chroma .fm { color: #111111 }
/* NameLabel */ .chroma .nl { color: #111111 }
/* NameNamespace */ .chroma .nn { color: #111111 }
/* NameOther */ .chroma .nx { color: #75af00 }
/* NameProperty */ .chroma .py { color: #111111 }
/* NameTag */ .chroma .nt { color: #f92672 }
/* NameVariable */ .chroma .nv { color: #111111 }
/* NameVariableClass */ .chroma .vc { color: #111111 }
/* NameVariableGlobal */ .chroma .vg { color: #111111 }
/* NameVariableInstance */ .chroma .vi { color: #111111 }
/* NameVariableMagic */ .chroma .vm { color: #111111 }
/* Literal */ .chroma .l { color: #ae81ff }
/* LiteralDate */ .chroma .ld { color: #d88200 }
/* LiteralString */ .chroma .s { color: #d88200 }
/* LiteralStringAffix */ .chroma .sa { color: #d88200 }
/* LiteralStringBacktick */ .chroma .sb { color: #d88200 }
/* LiteralStringChar */ .chroma .sc { color: #d88200 }
/* LiteralStringDelimiter */ .chroma .dl { color: #d88200 }
/* LiteralStringDoc */ .chroma .sd { color: #d88200 }
/* LiteralStringDouble */ .chroma .s2 { color: #d88200 }
/* LiteralStringEscape */ .chroma .se { color: #8045ff }
/* LiteralStringHeredoc */ .chroma .sh { color: #d88200 }
/* LiteralStringInterpol */ .chroma .si { color: #d88200 }
/* LiteralStringOther */ .chroma .sx { color: #d88200 }
/* LiteralStringRegex */ .chroma .sr { color: #d88200 }
/* LiteralStringSingle */ .chroma .s1 { color: #d88200 }
/* LiteralStringSymbol */ .chroma .ss { color: #d88200 }
/* LiteralNumber */ .chroma .m { color: #ae81ff }
/* LiteralNumberBin */ .chroma .mb { color: #ae81ff }
/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff }
/* LiteralNumberHex */ .chroma .mh { color: #ae81ff }
/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff }
/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff }
/* LiteralNumberOct */ .chroma .mo { color: #ae81ff }
/* Operator */ .chroma .o { color: #f92672 }
/* OperatorWord */ .chroma .ow { color: #f92672 }
/* Punctuation */ .chroma .p { color: #111111 }
/* Comment */ .chroma .c { color: #75715e }
/* CommentHashbang */ .chroma .ch { color: #75715e }
/* CommentMultiline */ .chroma .cm { color: #75715e }
/* CommentSingle */ .chroma .c1 { color: #75715e }
/* CommentSpecial */ .chroma .cs { color: #75715e }
/* CommentPreproc */ .chroma .cp { color: #75715e }
/* CommentPreprocFile */ .chroma .cpf { color: #75715e }
/* Generic */ .chroma .g { }
/* GenericDeleted */ .chroma .gd { }
/* GenericEmph */ .chroma .ge { font-style: italic }
/* GenericError */ .chroma .gr { }
/* GenericHeading */ .chroma .gh { }
/* GenericInserted */ .chroma .gi { }
/* GenericOutput */ .chroma .go { }
/* GenericPrompt */ .chroma .gp { }
/* GenericStrong */ .chroma .gs { font-weight: bold }
/* GenericSubheading */ .chroma .gu { }
/* GenericTraceback */ .chroma .gt { }
/* GenericUnderline */ .chroma .gl { }
/* TextWhitespace */ .chroma .w { }
@media (prefers-color-scheme: dark) {
/* Background */ .bg { color: #f8f8f2; background-color: #272822 }
/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #272822; }
/* Other */ .chroma .x { }
/* Error */ .chroma .err { color: #960050; background-color: #1e0010 }
/* CodeLine */ .chroma .cl { }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
/* LineHighlight */ .chroma .hl { background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* Keyword */ .chroma .k { color: #66d9ef }
/* KeywordConstant */ .chroma .kc { color: #66d9ef }
/* KeywordDeclaration */ .chroma .kd { color: #66d9ef }
/* KeywordNamespace */ .chroma .kn { color: #f92672 }
/* KeywordPseudo */ .chroma .kp { color: #66d9ef }
/* KeywordReserved */ .chroma .kr { color: #66d9ef }
/* KeywordType */ .chroma .kt { color: #66d9ef }
/* Name */ .chroma .n { }
/* NameAttribute */ .chroma .na { color: #a6e22e }
/* NameBuiltin */ .chroma .nb { color: inherit; }
/* NameBuiltinPseudo */ .chroma .bp { }
/* NameClass */ .chroma .nc { color: #a6e22e }
/* NameConstant */ .chroma .no { color: #66d9ef }
/* NameDecorator */ .chroma .nd { color: #a6e22e }
/* NameEntity */ .chroma .ni { }
/* NameException */ .chroma .ne { color: #a6e22e }
/* NameFunction */ .chroma .nf { color: #a6e22e }
/* NameFunctionMagic */ .chroma .fm { }
/* NameLabel */ .chroma .nl { }
/* NameNamespace */ .chroma .nn { }
/* NameOther */ .chroma .nx { color: #a6e22e }
/* NameProperty */ .chroma .py { }
/* NameTag */ .chroma .nt { color: #f92672 }
/* NameVariable */ .chroma .nv { color: inherit; }
/* NameVariableClass */ .chroma .vc { }
/* NameVariableGlobal */ .chroma .vg { }
/* NameVariableInstance */ .chroma .vi { }
/* NameVariableMagic */ .chroma .vm { }
/* Literal */ .chroma .l { color: #ae81ff }
/* LiteralDate */ .chroma .ld { color: #e6db74 }
/* LiteralString */ .chroma .s { color: #e6db74 }
/* LiteralStringAffix */ .chroma .sa { color: #e6db74 }
/* LiteralStringBacktick */ .chroma .sb { color: #e6db74 }
/* LiteralStringChar */ .chroma .sc { color: #e6db74 }
/* LiteralStringDelimiter */ .chroma .dl { color: #e6db74 }
/* LiteralStringDoc */ .chroma .sd { color: #e6db74 }
/* LiteralStringDouble */ .chroma .s2 { color: #e6db74 }
/* LiteralStringEscape */ .chroma .se { color: #ae81ff }
/* LiteralStringHeredoc */ .chroma .sh { color: #e6db74 }
/* LiteralStringInterpol */ .chroma .si { color: #e6db74 }
/* LiteralStringOther */ .chroma .sx { color: #e6db74 }
/* LiteralStringRegex */ .chroma .sr { color: #e6db74 }
/* LiteralStringSingle */ .chroma .s1 { color: #e6db74 }
/* LiteralStringSymbol */ .chroma .ss { color: #e6db74 }
/* LiteralNumber */ .chroma .m { color: #ae81ff }
/* LiteralNumberBin */ .chroma .mb { color: #ae81ff }
/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff }
/* LiteralNumberHex */ .chroma .mh { color: #ae81ff }
/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff }
/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff }
/* LiteralNumberOct */ .chroma .mo { color: #ae81ff }
/* Operator */ .chroma .o { color: #f92672 }
/* OperatorWord */ .chroma .ow { color: #f92672 }
/* Punctuation */ .chroma .p { color: inherit; }
/* Comment */ .chroma .c { color: #75715e }
/* CommentHashbang */ .chroma .ch { color: #75715e }
/* CommentMultiline */ .chroma .cm { color: #75715e }
/* CommentSingle */ .chroma .c1 { color: #75715e }
/* CommentSpecial */ .chroma .cs { color: #75715e }
/* CommentPreproc */ .chroma .cp { color: #75715e }
/* CommentPreprocFile */ .chroma .cpf { color: #75715e }
/* Generic */ .chroma .g { }
/* GenericDeleted */ .chroma .gd { color: #f92672 }
/* GenericEmph */ .chroma .ge { font-style: italic }
/* GenericError */ .chroma .gr { }
/* GenericHeading */ .chroma .gh { }
/* GenericInserted */ .chroma .gi { color: #a6e22e }
/* GenericOutput */ .chroma .go { }
/* GenericPrompt */ .chroma .gp { }
/* GenericStrong */ .chroma .gs { font-weight: bold }
/* GenericSubheading */ .chroma .gu { color: #75715e }
/* GenericTraceback */ .chroma .gt { }
/* GenericUnderline */ .chroma .gl { }
/* TextWhitespace */ .chroma .w { }
}

View file

@ -1,120 +0,0 @@
/* Eryn Wells <eryn@erynwells.me> */
:root {
--logentry-background-color: var(--tag-background-color);
--logentry-foreground-color: var(--tag-text-color);
}
:root {
--separator-color: rgb(var(--dk-gray));
--box-shadow-color: rgba(var(--dk-gray), 0.8);
--body-code-background-color: rgb(var(--dk-gray));
--heading-color: rgb(var(--white));
--header-series-arrow-foreground-color: rgb(var(--super-dk-gray));
--html-background-color: rgb(var(--black));
--color: rgba(var(--white), 0.8);
--platter-background-color: rgba(var(--black), var(--platter-background-opacity));
--platter-backdrop-filter: brightness(0.66) blur(10px);
--tag-foreground-color: rgb(var(--sub-lt-gray));
--tag-background-color: rgb(var(--dk-gray));
--tag-spacer-foreground-color: rgb(var(--super-dk-gray));
--tag-hover-background-color: rgb(var(--super-dk-gray));
--tag-hover-foreground-color: rgb(var(--mid-gray));
--twitter-icon: url(/icons/twitter-dark.svg);
--github-icon: url(/icons/github-dark.svg);
--instagram-icon: url(/icons/instagram-dark.svg);
--feed-icon: url(/icons/rss-dark.svg);
}
main {
background: rgba(var(--black), 0.6);
}
#dungeon-background {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: -1;
filter: brightness(0.3);
}
.logfile {
margin-block-start: 0;
margin-inline-start: 0;
padding-inline-start: 0;
}
.logfile > li {
align-items: first baseline;
color: var(--logentry-foreground-color);
background-color: var(--logentry-background-color);
border-radius: 6px;
display: grid;
grid-template-columns: 32px auto auto;
row-gap: 1rem;
margin-block-start: 2rem;
margin-inline-start: 0;
padding: 3rem;
}
.logfile > li > .date {
grid-column-start: 2;
grid-row-start: 1;
}
.logfile > li > h4.date {
margin: 0;
padding: 0;
}
.logfile > li > .character-descriptor {
color: #aaa;
font-size: 1.5rem;
font-weight: 700;
grid-column-start: 3;
grid-row-start: 1;
text-align: right;
text-transform: uppercase;
}
.logfile > li > p {
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 2;
margin: 0;
}
.logfile > li > table.stats {
border: 0;
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 3;
margin-block-end: 0;
width: 100%;
-webkit-border-horizontal-spacing: 0;
-webkit-border-vertical-spacing: 0;
}
.logfile > li > table.stats > tbody > tr > td {
border: 0;
color: #aaa;
font-size: 1.5rem;
font-weight: 700;
padding: 0;
text-transform: uppercase;
vertical-align: bottom;
}
.logfile > li > table.stats > tbody > tr > td.score,
.logfile > li > table.stats > tbody > tr > td.hp,
.logfile > li > table.stats > tbody > tr > td.level {
width: 16rem;
text-align: right;
}

View file

@ -1,161 +0,0 @@
:root {
--date-item-background-color: rgb(var(--lt-gray));
--photo-params-background-color: rgb(var(--lt-gray));
--photo-params-container-background-color: rgb(var(--super-lt-gray));
--photo-params-color: rgb(var(--sub-dk-gray));
--photo-params-border-color: rgb(var(--super-lt-gray));
}
@media (prefers-color-scheme: dark) {
:root {
--date-item-background-color: rgb(var(--dk-gray));
--photo-params-background-color: rgb(var(--dk-gray));
--photo-params-container-background-color: rgb(var(--sub-dk-gray));
--photo-params-color: rgb(var(--super-lt-gray));
--photo-params-border-color: rgb(var(--sub-dk-gray));
}
}
.photos.list {
box-sizing: border-box;
max-width: none;
padding: 0 var(--body-item-spacing);
width: 100%;
}
.photos.list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 4px;
}
.photos.list > * {
margin-block-end: 0;
}
.photos.page > nav {
margin-block-end: var(--body-item-spacing);
}
.photos.list > a {
display: block;
line-height: 0;
}
.photos.list > a > img {
border-radius: 3px;
image-orientation: from-image;
}
.photos.list > div {
background-color: var(--date-item-background-color);
border-radius: 3px;
width: 100%;
height: 100%;
display: flex;
align-items: center;
}
.photos.list > div > h6 {
display: block;
font-size: 5rem;
margin: 0 auto;
letter-spacing: 0;
}
.photos.list > div > h6 > span {
text-align: end;
width: min-content;
position: relative;
display: inline-block;
padding-inline-end: 20px;
}
.photos.list > div > h6 > span::after {
top: 6px;
right: 0px;
position: absolute;
display: block;
content: "⏵︎";
font-size: 80%;
}
@media (max-width: calc(24px + 400px + 4px)) {
.photos.list > div > h6 > span {
width: max-content;
padding-block: calc(0.25 * var(--body-item-spacing));
}
.photos.list > div > h6 > span::after {
content: "";
}
}
.photo-params {
padding-inline: calc(var(--body-item-spacing) / 2);
}
.photo-params > .container {
display: block;
background-color: var(--photo-params-container-background-color);
border-radius: 10px;
margin: var(--body-item-spacing) auto;
padding: calc(var(--body-item-spacing) / 2);
max-width: calc(0.66 * var(--content-width));
}
.photo-params > .container > table {
background-color: var(--photo-params-background-color);
color: var(--photo-params-color);
border-collapse: collapse;
border-radius: 6px;
table-layout: fixed;
text-align: center;
width: 100%;
}
.photo-params thead td {
border-bottom: 1px solid var(--photo-params-border-color);
font-size: 80%;
font-weight: bold;
}
.photo-params tbody tr > td {
border: none;
border-bottom: 1px solid var(--photo-params-border-color);
}
.photo-params tr.exposure-attributes > td {
border: none;
border-top: 1px solid var(--photo-params-border-color);
border-left: 1px solid var(--photo-params-border-color);
}
.photo-params tr.exposure-attributes > td:first-child {
border-left: none;
}
.photo-params td {
font-size: 75%;
padding: 1rem;
}
.photo-params td:last-child {
text-align: end;
}
.photo-params td:first-child {
text-align: start;
}
.photo-params .make-model {
font-weight: bold;
}
.photo-params .size {
border-left: 0;
}
.photo-params .location {
border-right: 0;
}

View file

@ -1,64 +0,0 @@
:root {
--rect-fill: rgba(var(--mid-blue), 0.1);
}
@media (prefers-color-scheme: dark) {
:root {
--rect-fill: rgb(var(--mid-blue), 0.9);
}
}
svg.railroad-diagram path {
stroke-width: 2;
stroke: var(--color);
fill: none;
}
svg.railroad-diagram text {
font-family: var(--font-family-monospace);
text-anchor: middle;
white-space: pre;
fill: var(--color);
}
svg.railroad-diagram text.diagram-text {
font-size: 11px;
}
svg.railroad-diagram text.diagram-arrow {
font-size: 16px;
}
svg.railroad-diagram text.label {
text-anchor: start;
}
svg.railroad-diagram text.comment {
font: italic 12px var(--font-family-monospace);
}
svg.railroad-diagram g.non-terminal text {
/*font-style: italic;*/
}
svg.railroad-diagram rect {
stroke-width: 2;
stroke: var(--color);
fill: var(--rect-fill);
}
svg.railroad-diagram rect.group-box {
stroke: gray;
stroke-dasharray: 10 5;
fill: none;
}
svg.railroad-diagram path.diagram-text {
stroke-width: 2;
stroke: var(--color);
fill: var(--html-background-color);
cursor: help;
}
svg.railroad-diagram g.diagram-text:hover path.diagram-text {
fill: var(--rect-fill);
}

View file

@ -1,247 +0,0 @@
@layer reset, typography, root, layout, template, page, utility;
:root {
--black: 0, 0, 0;
--sub-dk-gray: 16, 16, 16;
--dk-gray: 32, 32, 32;
--super-dk-gray: 80, 80, 80;
--mid-gray: 128, 128, 128;
--sub-lt-gray: 175, 175, 175;
--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: var(--white);
--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);
--body-item-spacing: 4rem;
--body-code-background-color: rgb(var(--super-lt-gray));
--header-series-arrow-foreground-color: rgb(var(--sub-dk-gray));
--html-background-color: rgb(var(--background));
--nav-bulleted-spacing: 0.75rem;
--platter-background-color: rgba(var(--white), var(--platter-background-opacity));
--platter-background-opacity: 0.6;
--platter-backdrop-filter: blur(10px);
--content-width: 80rem;
--tag-foreground-color: rgb(var(--super-dk-gray));
--tag-background-color: rgb(var(--super-lt-gray));
--tag-spacer-foreground-color: rgb(var(--super-dk-gray));
--tag-hover-background-color: rgb(var(--sub-lt-gray));
--transition-duration: 0.7s;
--menu-icon-size: 20px;
}
@media (prefers-color-scheme: dark) {
:root {
--background: var(--black);
--separator-color: rgb(var(--dk-gray));
--box-shadow-color: rgba(var(--dk-gray), 0.8);
--body-code-background-color: rgb(var(--dk-gray));
--header-series-arrow-foreground-color: rgb(var(--super-dk-gray));
--html-background-color: rgb(var(--background));
--platter-background-color: rgba(var(--black), var(--platter-background-opacity));
--platter-backdrop-filter: brightness(0.66) blur(10px);
--tag-foreground-color: rgb(var(--sub-lt-gray));
--tag-background-color: rgb(var(--dk-gray));
--tag-spacer-foreground-color: rgb(var(--super-dk-gray));
--tag-hover-background-color: rgb(var(--super-dk-gray));
--tag-hover-foreground-color: rgb(var(--mid-gray));
}
}
@layer root {
a { text-decoration: none; }
a:hover {
text-decoration: underline;
text-underline-offset: 0.12em;
}
a.hover-only {
color: var(--color);
transition: color 0.2s;
}
a.hover-only:hover {
text-decoration: underline;
transition: color 0.2s;
}
blockquote {
border-inline-start: 4px solid var(--separator-color);
padding-inline-start: 2rem;
margin-inline-start: 2rem;
}
code {
background-color: var(--body-code-background-color);
border-radius: 0.25rem;
display: inline-block;
padding-inline: 0.6rem;
}
code.nobg {
background: none;
border-radius: 0;
display: inline-block;
margin: 0;
padding: 0;
}
details { width: 100%; }
details:has(#TableOfContents) {
box-sizing: border-box;
border: 1px solid var(--separator-color);
padding: var(--body-item-spacing);
}
fieldset {
box-sizing: border-box;
border: 1px solid var(--separator-color);
padding: var(--body-item-spacing);
padding-top: calc(var(--body-item-spacing) / 10);
}
html { background-color: var(--html-background-color); }
img {
height: auto;
max-width: 100%;
}
img.circular {
shape-outside: circle(50%);
-webkit-clip-path: circle(50%);
clip-path: circle(50%);
}
main {
box-sizing: border-box;
max-width: calc(var(--content-width) + 2 * var(--body-item-spacing));
margin: var(--body-item-spacing) auto;
padding-inline: var(--body-item-spacing);
width: 100%;
}
nav.bulleted > li:first-child::before {
content: "";
margin-inline: 0;
}
nav.bulleted > li::before {
color: var(--heading-color);
content: "•";
font-size: 60%;
font-weight: normal;
opacity: 80%;
margin-inline: var(--nav-bulleted-spacing);
}
ul,
ol,
dl,
ul > li,
ol > li,
dl > dt,
ul > li > ul,
ul > li > ol,
ol > li > ul,
ol > li > ol {
margin-inline-start: calc(var(--body-item-spacing) + 2px);
}
header > span.series {
font-size: 1.75rem;
letter-spacing: 1px;
margin-inline-start: 0.5em;
}
header > span.series::before {
color: var(--header-series-arrow-foreground-color);
content: "↳";
margin-inline-end: 0.25em;
}
.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;
}
.post-title {
align-items: baseline;
display: flex;
flex-wrap: wrap;
gap: 0 4rem;
}
.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;
}
table {
border: 1px solid var(--separator-color);
border-collapse: collapse;
margin-inline: auto;
width: 50%;
}
td, th {
border: 1px solid var(--separator-color);
padding-inline: 1rem;
}
}

View file

@ -1,7 +0,0 @@
@layer reset {
body, button, h1, h2, h3, h4, h5, h6, input, ol, ul, p, pre, textarea {
padding: 0; margin: 0;
}
figure, figure .youtube { line-height: 1; }
}

View file

@ -1,62 +0,0 @@
@layer root {
figcaption {
margin-block-start: 0.2em;
text-align: center;
}
figure {
border-radius: 6px;
margin: 0;
margin-inline: 0;
overflow: hidden;
max-width: var(--content-width);
}
figure > .container {
align-items: center;
display: flex;
justify-content: center;
gap: var(--body-item-spacing);
}
figure.bordered {
padding: 0.5rem;
border: 2px solid #eee;
}
figure a,
figure a:hover {
border: 0;
}
figure img {
display: block;
border-radius: 6px;
height: auto;
max-width: var(--content-width);
}
figure svg {
width: 100%;
height: auto;
}
figure .youtube {
border-radius: 6px;
overflow: hidden;
max-width: var(--content-width);
width: 100%;
}
.p5-sketch {
display: block;
position: relative;
width: 100%;
}
.youtube iframe {
aspect-ratio: 16 / 9;
margin-bottom: -3px;
width: 100%;
}
}

View file

@ -1,8 +0,0 @@
@layer root {
main > :first-child,
main > article > :first-child { margin-block-start: 0; }
main > :not(:last-child),
main > article > :not(:last-child) { margin-block-end: var(--body-item-spacing); }
main > :last-child,
main > article > :last-child { margin-block-end: 0; }
}

View file

@ -1,29 +0,0 @@
@layer root {
body:has(fieldset#ruby-controls > input[value=NONE]:checked) rt { display: none; }
/* When ruby-controls is set to hidden, hide the ruby base and only show the <rt> */
body:has(fieldset#ruby-controls > input[value=HIDDEN]:checked) ruby > span { display: none; }
body:has(fieldset#ruby-controls > input[value=HIDDEN]:checked) rt {
color: inherit;
display: inline;
font-size: inherit;
white-space: inherit;
}
body:has(fieldset#ruby-controls > input[value=HIDDEN]:checked) :is(h1, h2, h3, h4, h5, h6) rt {
font-family: var(--font-family-heading);
font-weight: bold;
}
fieldset#ruby-controls input[type=radio] {
margin-inline-end: calc(var(--body-item-spacing) / 6);
}
fieldset#ruby-controls label {
margin-inline-end: calc(var(--body-item-spacing));
}
rt { transition: color 0.3s; }
ruby:hover rt { transition: color 0.3s; }
}

View file

@ -1,40 +0,0 @@
@layer root {
footer.site {
align-items: center;
display: flex;
flex-direction: column;
margin-block: var(--body-item-spacing);
text-align: center;
}
footer.site > ul {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
list-style: none;
}
footer.site > .slogans {
margin-block-end: 0;
}
footer.site > .slogans > li {
margin-block-end: 0;
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;
}
}
}

View file

@ -1,116 +0,0 @@
@layer root {
:root {
--mastodon-icon: url(/icons/mastodon.svg);
--github-icon: url(/icons/github.svg);
--instagram-icon: url(/icons/instagram.svg);
--feed-icon: url(/icons/feed.svg);
--social-menu-padding: 1rem;
}
@media (prefers-color-scheme: dark) {
:root {
--mastodon-icon: url(/icons/mastodon-dark.svg);
--github-icon: url(/icons/github-dark.svg);
--instagram-icon: url(/icons/instagram-dark.svg);
--feed-icon: url(/icons/feed-dark.svg);
}
}
header.site h1 > a:hover { text-decoration: none; }
header.site {
display: flex;
width: 100%;
z-index: 10000;
}
header.site h1 {
margin: 0;
order: 1;
}
header.site > .grid {
align-items: baseline;
display: flex;
flex-wrap: wrap;
gap: 0 0.5em;
margin: 0 auto;
max-width: var(--content-width);
padding: 1.5rem 3rem;
width: 100%;
}
header.site > .grid > nav {
align-items: center;
display: flex;
justify-content: start;
list-style: none;
}
header.site nav > li { display: block; }
header.site nav:first-of-type {
justify-content: start;
order: 2;
}
header.site nav:last-of-type {
justify-content: end;
order: 3;
}
@media (max-width: 516px) {
header.site > .platter {
border-left: none;
border-radius: 0;
border-right: none;
border-top: none;
}
header.site > .grid { max-width: none; }
}
@media (max-width: 435px) {
header.site nav:first-of-type { order: 5; }
}
nav.social > li { margin-inline-start: var(--nav-bulleted-spacing); }
nav.social > li:first-child { margin-inline-start: 0; }
.social {
display: block flex;
letter-spacing: 2px;
margin-left: auto;
order: 2;
}
.social > li > 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 > li > a > span {
display: none;
}
.social > li + li:before {
color: var(--dark);
padding: 0 0.5rem;
}
#social-menu-mastodon img {
content: var(--mastodon-icon);
position: relative;
top: 1px;
}
#social-menu-github img { content: var(--github-icon); }
#social-menu-instagram img { content: var(--instagram-icon); }
#social-menu-feed img { content: var(--feed-icon); }
}

View file

@ -1,20 +0,0 @@
.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;
}

View file

@ -1,57 +0,0 @@
ul.tags {
display: flex;
height: min-content;
margin-inline-start: 0;
padding-inline-start: 0;
}
ul.tags > li {
background-color: var(--tag-background-color);
color: var(--tag-foreground-color);
border-radius: 4px;
display: inline-block;
font-size: 75%;
letter-spacing: 1px;
}
ul.tags > li:first-child {
margin-inline-start: 0;
}
ul.tags > li:hover {
background-color: var(--tag-hover-background-color);
}
ul.tags > li > a {
color: inherit;
display: block;
height: 100%;
width: 100%;
padding: 0.6rem 1rem;
}
ul.tags > li > a:hover {
color: var(--tag-hover-foreground-color);
text-decoration: none;
}
ul.tags > li + li { margin-inline-start: 1rem; }
ul.tags > li.chevron + li { margin-inline-start: 0 }
ul.tags > .chevron {
align-items: center;
border: 0;
border-radius: 0;
color: var(--tag-spacer-foreground-color);
background-color: inherit;
display: flex;
justify-content: center;
margin-inline-start: 0;
padding-inline-start: 1px;
width: 2rem;
}
ul.tags > .chevron:hover {
color: var(--tag-spacer-foreground-color);
background-color: inherit;
}

View file

@ -1,172 +0,0 @@
@font-face {
font-family: "Museo_Slab";
src: url("{{ `/fonts/Museo_Slab_500.woff2` | relURL }}") format("woff2"),
url("{{ `/fonts/Museo_Slab_500.woff` | relURL }}") format("woff");
font-weight: normal;
font-style: normal;
}
@layer typography {
:root {
--font-family: Verdana, Helvetica, sans-serif;
--font-family-heading: Museo_Slab, Tahoma, "Hiragino Mincho ProN", serif;
--font-family-monospace: "Courier New", Courier, monospace;
--font-family-site-heading: Museo_Slab, Tahoma, sans-serif;
--font-size: 2rem;
--font-size-max: 8px;
--font-size-min: 6px;
--font-size-scale-factor: 1vmax;
--site-header-font-size: 200%;
--line-height: 1.5;
--heading-line-height: 1;
/* A little extra line height so the descenders don't get clipped */
--site-heading-line-height: 1.1;
--color: rgba(var(--black), 0.8);
--a-color: rgb(var(--mid-blue));
--a-ruby-color: var(--color);
--heading-color: rgb(var(--black));
--site-nav-link-color: var(--a-color);
}
@media (prefers-color-scheme: dark) {
:root {
--color: rgba(var(--white), 0.8);
--heading-color: rgb(var(--white));
}
}
a { color: var(--a-color); }
a:visited { color: var(--a-color); }
a.hover-only { color: var(--color); }
a.hover-only:hover { color: var(--a-color); }
a rt, a:hover rt { color: var(--a-ruby-color); }
body {
font-size: var(--font-size);
}
code { font-family: var(--font-family-monospace); }
figcaption {
font-size: 80%;
line-height: var(--line-height);
}
footer.site {
font-size: 80%;
line-height: 1;
}
h1 { font-size: 305%; }
h2 { font-size: 244%; }
h3 { font-size: 195%; }
h4 { font-size: 156%; }
h5 { font-size: 125%; }
h6 { font-size: 100%; }
h5, h6 { font-family: var(--font-family-body); }
header.site nav > .active { font-weight: bold; }
header.site nav > li { color: var(--site-nav-link-color); }
main:has(header > .post-title > h1) h1 { font-size: 244%; }
main:has(header > .post-title > h1) h2 { font-size: 195%; }
main:has(header > .post-title > h1) h3 { font-size: 156%; }
main:has(header > .post-title > h1) h4 { font-size: 125%; }
main:has(header > .post-title > h1) h5 { font-size: 100%; }
main:has(header > .post-title > h1) h6 { font-size: 100%; }
main:has(header > .post-title > h1) :is(h5, h6) { font-family: var(--font-family-body); }
h1, h2, h3, h4, h5, h6 {
color: var(--heading-color);
font-family: var(--font-family-heading);
font-weight: 600;
letter-spacing: 1pt;
line-height: var(--heading-line-height);
}
h1.site {
--site-title-color1: rgb(103, 128, 229);
--site-title-color2: rgb(130, 90, 227);
--site-title-color3: rgb(135, 101, 228);
--site-title-color4: rgb(125, 115, 229);
--site-title-color5: rgb(107, 130, 230);
--site-title-color6: rgb(77, 153, 232);
--site-title-color7: rgb(74, 136, 230);
--site-title-color8: rgb(71, 128, 228);
--site-title-color9: rgb(65, 80, 224);
--site-title-color10: rgb(61, 58, 223);
color: rgb(var(--mid-blue));
font-family: var(--font-family-site-heading);
}
h1.site > a { color: inherit; }
@supports not ((background-clip: text) or (-webkit-background-clip: text)) {
h1.site span:nth-child(10n + 1) { color: var(--site-title-color1); }
h1.site span:nth-child(10n + 2) { color: var(--site-title-color2); }
h1.site span:nth-child(10n + 3) { color: var(--site-title-color3); }
h1.site span:nth-child(10n + 4) { color: var(--site-title-color4); }
h1.site span:nth-child(10n + 5) { color: var(--site-title-color5); }
h1.site span:nth-child(10n + 6) { color: var(--site-title-color6); }
h1.site span:nth-child(10n + 7) { color: var(--site-title-color7); }
h1.site span:nth-child(10n + 8) { color: var(--site-title-color8); }
h1.site span:nth-child(10n + 9) { color: var(--site-title-color9); }
h1.site span:nth-child(10n) { color: var(--site-title-color10); }
}
@supports (background-clip: text) or (-webkit-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;
}
}
header.site h1.site {
font-size: var(--site-header-font-size);
line-height: var(--site-heading-line-height);
white-space: nowrap;
}
header.site nav {
font-size: max(1.5rem, 80%);
letter-spacing: 0.10em;
text-transform: lowercase;
}
header.site nav > li {
color: var(--site-nav-link-color);
}
:is(h1, h2, h3, h4, h5, h6) rt {
font-family: var(--font-family);
font-weight: normal;
letter-spacing: 0;
}
html {
color: var(--color);
font-family: var(--font-family);
font-size: clamp(var(--font-size-min), var(--font-size-scale-factor), var(--font-size-max));
}
nav.bulleted > li:first-child::before { color: var(--color); }
nav.bulleted > li::before { color: var(--heading-color); }
p { line-height: var(--line-height); }
ruby:hover rt { color: var(--color); }
@media (prefers-color-scheme: dark) {
rt { color: rgba(var(--white), 0.5); }
}
}

View file

@ -1,26 +0,0 @@
@layer utility {
.centered { text-align: center; }
.float-right { float: right; }
.nobreak { white-space: nowrap; }
.noselect {
cursor: default;
-webkit-user-select: none;
-moz-use-select: none;
-ms-user-select: none;
user-select: none;
}
.platter {
-webkit-backdrop-filter: var(--platter-backdrop-filter);
backdrop-filter: var(--platter-backdrop-filter);
background-color: var(--platter-background-color);
border: 1px solid var(--header-border-color);
border-radius: 12px;
box-shadow: 3px 4px 4px var(--header-box-shadow-color);
}
.visible { visibility: visible; }
article.two-column { columns: 2; }
}

View file

@ -1,2 +0,0 @@
name: Eryn Wells
email: eryn@erynwells.me

View file

@ -1,5 +1,6 @@
baseURL: https://erynwells.me/
languageCode: en-US
title: Eryn Rachel Wells
copyright: Copyright © 2020—2023 Eryn Wells
title: ~eryn
copyright: Copyright © 2020—2024 Eryn Wells
defaultContentLanguage: en
enableEmoji: true

View file

@ -7,3 +7,6 @@ es:
jp:
languageName: 日本語
weight: 3
tok:
languageName: toki pona
weight: 4

View file

@ -1,8 +1,12 @@
goldmark:
renderer:
unsafe: true
parser:
attribute:
block: true
title: true
highlight:
anchorLineNos: true
lineNos: true
lineNos: false
lineNumbersInTable: false
noClasses: false

View file

@ -11,6 +11,12 @@ main:
name: About
url: /about/
weight: 30
- identifier: feed
name: feed
url: /feed.atom
weight: 40
params:
style: file
social:
- identifier: mastodon
name: Mastodon
@ -31,7 +37,7 @@ social:
params:
shortName: ig
- identifier: feed
name: Feed
name: feed
url: /feed.atom
weight: 40
params:

View file

@ -0,0 +1,15 @@
hugoVersion:
extended: false
min: "0.116.0"
replacements: >-
github.com/erynofwales/hugo-theme-feeds/v2 -> feeds,
github.com/erynofwales/hugo-theme-termlite/v2 -> termlite,
github.com/erynofwales/hugo-theme-photostream/v2 -> photostream,
github.com/erynofwales/hugo-resource-builders/v2 -> resource-builders,
github.com/erynofwales/hugo-image-utilities/v2 -> image-utils
imports:
- path: github.com/erynofwales/hugo-theme-termlite/v2
- path: github.com/erynofwales/hugo-theme-feeds/v2
- path: github.com/erynofwales/hugo-theme-photostream/v2
- path: github.com/erynofwales/hugo-resource-builders/v2
- path: github.com/erynofwales/hugo-image-utilities/v2

View file

@ -1,3 +1,4 @@
home: [HTML, Atom, RSS]
page: [HTML, JSON]
section: [HTML, Atom, RSS]
home: [HTML, Atom]
section: [HTML, Atom]
taxonomy: [HTML]
term: [HTML]

View file

@ -1,6 +1,20 @@
author:
name: Eryn Wells
email: eryn@erynwells.me
shortTitle: Eryn Wells
twitter: erynofwales
github: erynofwales
instagram: erynofwales
description: Home page of Eryn Rachel Wells
blog:
yearLimit: 3
photostream:
yearLimit: 3
photos:
gridSize: 200
thumbnailSize: 600

View file

@ -1,2 +1,2 @@
twitter:
x:
enableDNT: true

View file

@ -1,2 +1,2 @@
twitter:
x:
disableInlineCSS: true

View file

@ -1,5 +1,6 @@
---
title: Eryn Rachel Wells
layout: single
---
{{< nobreak >}}Ingeniera de software,{{< /nobreak >}}

View file

@ -1,5 +1,58 @@
---
title: Eryn Rachel Wells
layout: single
params:
renderHeadingAnchors: false
---
Software engineer, potter, musician, and overall nerd.
Hi, I'm Eryn Wells. This is my website. Welcome!
## Latest
Here are some of my most recent posts.
{{< home/latest >}}
## Personal
I'm a queer trans woman, {{< tess >}}' partner, and mom of [two cats][cats]. I
was born in Seattle, {{< abbr Washington >}}WA{{< /abbr >}} and grew up in
Phoenix, {{< abbr Arizona >}}AZ{{< /abbr >}}. I attended [Oberlin College][ob]
where I got a degree in Computer Science. My pronouns are [she/her][pronouns].
You can read more about me on my [about][ab] page, or [get in touch][where-am-i].
## Professional
I've worked as a software engineer since 2011 for a variety of companies around
the San Francisco Bay Area. I joined [Apple][a] in 2016, where I currently work
on password management and authentication technologies.
My [résumé][r] has all the details.
## Hobbies
When I'm not working, you can reliably find me hacking on this website or [some
coding other project][gh]. I'm also a musician, and play piano, Irish tin
whistle, and modular synthesizer. Occasionally I [record][bc] [things][sc]. I
love outer space and astronomy; I will always get excited to look at the moon
with you, or check out anything through a telescope. I enjoy [photograhy][p],
mostly as a travel hobby. And I've been practicing iaido, a traditional Japanese
sword art, since early 2024. Other things I've been into include: bread baking,
bicycling, calligraphy, ceramics, and knitting.
[a]: https://apple.com
[ab]: {{< ref "/about" >}}
[b]: {{< ref "/blog" >}}
[bc]: https://erynwells.bandcamp.com/releases
[cats]: {{< ref "/cats" >}}
[eml]: mailto:Eryn%20Wells<eryn@erynwells.me>
[gh]: https://github.com/erynofwales
[ig]: https://www.instagram.com/erynofwales
[m]: https://mastodon.social/@erynofwales
[n]: {{< ref "/now" >}}
[ob]: https://www.oberlin.edu
[p]: {{< ref "/photos" >}}
[pronouns]: http://pronoun.is/she
[r]: {{< ref "/resume" >}}
[sc]: https://soundcloud.com/purlsnbeeps
[where-am-i]: {{< ref "/about/where-am-i" >}}

View file

@ -1,13 +1,16 @@
---
title: "Hi! 👋🏻"
date: 2022-09-03T12:14:32-07:00
layout: single
resources:
- name: me
src: me.jpeg
params:
alt: >
Me, wearing a hat and smiling slightly, standing in front of a stone
background.
---
{{< circular_image id=me name=me class="float-right" width=200
alt="A photo of me, wearing a hat, standing in front of a stone background">}}
{{% section class=content--small-right-column %}}
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,
@ -17,6 +20,10 @@ I attended [Oberlin College][ob] where I got a degree in Computer Science.
I speak English natively, and Spanish too, though I always need more practice.
{{< circular_image id=me name=me class="content--right-column" width=200 >}}
{{% /section %}}
## Hobbies
I've been a musician for most of my life. I started on the piano at age seven,

View file

@ -1,4 +1,17 @@
@layer page {
main > section > p:not(:last-child) {
margin-bottom: var(--body-item-spacing);
}
img#me {
p:has(img#me) {
display: inline;
grid-column: unset;
margin-bottom: 0;
}
img#me {
margin: 0;
shape-outside: circle(55%);
width: min(200px, 25%);
}
}

View file

@ -3,11 +3,16 @@ title: "Where to Find Me"
date: 2022-11-11T08:35:26-08:00
---
Here's a list of places you can find me online.
Here's a list of places you can find me online. You can often find me on
services not listed here with the `erynofwales` or `erynrwells` handles.
## Social Media
- Cohost: [@eryn](https://cohost.org/eryn)
I'm really only on Instagram and Mastodon these days. My Twitter account is
still live, as an archive, but I don't post on it or look at it. Ditto for
Facebook.
- Facebook: [erynofwales](https://www.facebook.com/erynofwales)
- Instagram: [@erynofwales](https://instagram.com/erynofwales)
- Mastodon: [@erynofwales](https://mastodon.social/@erynofwales)
- Twitter: [@erynofwales](https://twitter.com/erynofwales)
@ -15,9 +20,10 @@ Here's a list of places you can find me online.
## Content
- Bandcamp: [erynwells](https://erynwells.bandcamp.com/releases)
- Soundcloud: [purlsnbeeps](https://soundcloud.com/purlsnbeeps)
- YouTube: [Eryn Wells](https://www.youtube.com/channel/UCWb2pTDlC27R1PucyUPrypA)
- GitHub: [erynofwales](https://github.com/erynofwales)
- Soundcloud: [purlsnbeeps](https://soundcloud.com/purlsnbeeps)
- StoryGraph: [erynrwells](https://app.thestorygraph.com/profile/erynrwells)
- YouTube: [Eryn Wells](https://www.youtube.com/channel/UCWb2pTDlC27R1PucyUPrypA)
## The Old Fashioned Way

View file

@ -1,7 +1,7 @@
---
title: "Booting a Raspberry Pi Over TFTP"
date: 2020-10-13T08:31:52-07:00
draft: false
description: A writeup of how I set up a Raspberry Pi to boot over TFTP to facilitate an operating system development project.
series: ["Raspberry Pi OS Development"]
categories: ["Tech"]
tags: ["Raspberry Pi", "Networking"]

View file

@ -0,0 +1,4 @@
---
title: 2020
date: 2020-01-01
---

View file

@ -7,7 +7,7 @@ categories: ["Music"]
tags: ["Synthesizers", "Electronics", "DIY", "Compositions"]
---
{{< figures/youtube id="gCSwWsxzy_c" title="A timelapse video of me building an Oskitone Scout, set to music produced using the Scout itself">}}
{{< youtube id="gCSwWsxzy_c" title="A timelapse video of me building an Oskitone Scout, set to music produced using the Scout itself" >}}
[Oskitone][oskitone] recently released a new synthesizer: the [Scout][scout].
It's a small monophonic keyboard synth built around an Arduino. It was a quick

View file

@ -41,4 +41,4 @@ I'm so grateful for every one of these people. We've been friends for years and
even though our lives have taken us in so many different directions, we've found
each other again and that is so wonderful.
{{< twitter erynofwales 1447951049076056071 >}}
{{< twitter user=erynofwales id=1447951049076056071 >}}

View file

@ -0,0 +1,4 @@
---
title: 2021
date: 2021-01-01
---

View file

@ -7,7 +7,7 @@ categories: ["Music"]
tags: ["Eurorack", "Synthesizers", "Recordings", "Performances", "Compositions"]
---
{{< figures/youtube id="sqr7g4P85aM" title="A top-down video of me operating a small Eurorack system made of only three modules. Lights flash, an incorporeal hand turns knobs to sculpt the sound." >}}
{{< youtube id="sqr7g4P85aM" title="A top-down video of me operating a small Eurorack system made of only three modules. Lights flash, an incorporeal hand turns knobs to sculpt the sound." >}}
This is my submission to the [Three Module Challenge][3mc] show put on by
Colorado Modular Synth Society in late January 2022. This is my first time

View file

@ -18,7 +18,7 @@ estuve hecho.
Es posible que me entusiasme un poco.
{{< twitter erynofwales 1510763278691016705 >}}
{{< twitter user=erynofwales id=1510763278691016705 >}}
He mejorado mucho en las últimas semanas. Mis puntajes han crecidos desde 1,000
hasta el mejor juego hasta ahora en que [obtuve 9401 puntos][over9000]. Quién

View file

@ -23,7 +23,7 @@ packed with [NetHackWiki][nethackwiki] tabs too, including a pinned one for the
I may have gotten a little carried away a time or two.
{{< twitter erynofwales 1510763278691016705 >}}
{{< twitter user=erynofwales id=1510763278691016705 >}}
I've gotten much better in that time. My scores have increased from the
1000-2000 range to my best game so far in which [I scored 9401

View file

@ -1,6 +1,7 @@
---
title: "Roguelikes I Like"
date: 2022-05-09T08:37:23-07:00
description: Some roguelikes Ive enjoyed recently.
draft: false
resources:
- name: nethack

View file

@ -0,0 +1,36 @@
<svg class="railroad-diagram" width="408" height="62" viewBox="0 0 408 62">
<g transform="translate(.5 .5)">
<g>
<path d="M20 21v20m10 -20v20m-10 -10h20"></path>
</g>
<path d="M40 31h10"></path>
<g>
<path d="M50 31h0"></path>
<path d="M358 31h0"></path>
<g class="terminal ">
<path d="M50 31h0"></path>
<path d="M126 31h0"></path>
<rect x="50" y="20" width="76" height="22" rx="10" ry="10"></rect>
<text x="88" y="35">&#60;audio></text>
</g>
<path d="M126 31h10"></path>
<path d="M136 31h10"></path>
<g class="terminal ">
<path d="M146 31h0"></path>
<path d="M230 31h0"></path>
<rect x="146" y="20" width="84" height="22" rx="10" ry="10"></rect>
<text x="188" y="35">Analyzer</text>
</g>
<path d="M230 31h10"></path>
<path d="M240 31h10"></path>
<g class="terminal ">
<path d="M250 31h0"></path>
<path d="M358 31h0"></path>
<rect x="250" y="20" width="108" height="22" rx="10" ry="10"></rect>
<text x="304" y="35">destination</text>
</g>
</g>
<path d="M358 31h10"></path>
<path d="M 368 31 h 20 m -10 -10 v 20 m 10 -20 v 20"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -1,7 +1,7 @@
---
title: "Making an Audio Scope with P5.js"
date: 2022-08-18T20:48:37-07:00
draft: false
description: A writeup of a small JavaScript waveform visualizer I made with P5.js.
categories: ["Tech"]
tags: ["P5.js", "Programming", "Web", "Art"]
resources:
@ -88,22 +88,7 @@ node to the input of the analyzer node, and the output of the analyzer node to
the audio context's `destination` node that routes to the computer's speakers.
Our audio processing graph looks like this:
{{< figures/railroad id="audioContextDiagram" >}}
{{< scripts/railroad >}}
return rr.Diagram(
rr.Sequence(
rr.Terminal("<audio>"),
rr.Terminal("Analyzer"),
rr.Terminal("destination")));
{{< /scripts/railroad >}}
{{< scripts/railroad narrow=1 >}}
return rr.Diagram(
rr.Stack(
rr.Terminal("<audio>"),
rr.Terminal("Analyzer"),
rr.Terminal("destination")));
{{< /scripts/railroad >}}
{{< /figures/railroad >}}
![](diagram.svg)
By itself the AudioContext doesn't actually play any audio. I'll tackle that
next.

View file

@ -1,6 +1,7 @@
---
title: "Hugo's Dictionary API"
date: 2022-10-13T10:19:02-07:00
description: Ive found Hugos API for collections to be difficult to understand. Heres my attempt to summarize its quirks.
categories: ["Tech"]
tags: ["Hugo", "Web", "API Design"]
series: "Erynwells.me Development"

View file

@ -1,6 +1,7 @@
---
title: "Lunar Eclipse 🌝"
date: 2022-11-07T08:37:45-08:00
description: A quick note about the upcoming lunar eclipse in the morning of 2022-11-08.
categories: Space
tags: [Moon, Lunar Eclipse]
---

View file

@ -1,6 +1,7 @@
---
title: "My Best Nethack Game (So Far)"
date: 2022-11-24T09:13:15-05:00
description: A summary of my best-to-date game of Nethack.
categories: ["Games"]
tags: ["Nethack", "Roguelikes", "Video Games"]
resources:

View file

@ -0,0 +1,4 @@
---
title: 2022
date: 2022-01-01
---

View file

@ -0,0 +1,4 @@
---
title: 2023
date: 2023-01-01
---

View file

@ -0,0 +1,22 @@
---
title: "Chess"
date: 2023-11-20T14:58:56-08:00
categories: Chess
tags: ["Games", "Hobbies"]
---
I've been playing a lot of chess lately. {{< tess >}} and I have been watching
[Slow Horses][slow-horses] on Apple TV+, and there was a recent episode in which
a chess game between two characters is a key plot beat. That got me thinking
about playing again.
I learned chess as a kid. My dad taught me. I played in chess clubs in
elementary and middle school. I was really into it for a while!
I have a [Chess.com](chess.com) account now: [erynrwells][chess-com-profile].
I'm also on [lichess.org](lichess.org): I'm [erynrwells][lichess-profile] there too.
Send me a friend request or challenge? :)
[slow-horses]: https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o
[chess-com-profile]: https://www.chess.com/member/erynrwells
[lichess-profile]: https://lichess.org/@/erynrwells

View file

@ -0,0 +1,13 @@
---
title: "Guide to Computing"
date: 2023-09-23T10:24:35-07:00
categories: "Tech"
tags: ["Retro Computing", "Design"]
---
I really enjoyed looking through the images on [Docubyte's Guide to
Computing][link]. It depicts machines from the early days of modern computing --
think IBM mainframes, PDP-1's, and lots of midcentury modern design -- in a way
I found really intriguing.
[link]: https://www.docubyte.com/projects/guide-to-computing/

View file

@ -0,0 +1,38 @@
---
title: "Hello Chess Friend"
description: I started building a chess engine in Rust. Here it is.
date: 2023-12-29T08:29:00-08:00
series: chess-friend
categories: Tech
tags: [Programming, Chess]
---
I started [playing a lot of chess][chess-post] recently. As often happens with
me, it wasn't very long until I started wondering how I could Do Programming To
It.
I found the mostly excellent, occasionally vague and confusing [Chess
Programming Wiki][cpwiki] and have been using that as a guide. It helpfully says
this on it's [Getting Started][cpgs] page:
> The **very first step** to writing a chess engine is to write a complete, bug
> free board representation that knows every rule of chess.
As a software engineer, the "bug free" bit cracks me up.
My engine is called ChessFriend. It uses [bitboards][cpbb] for its board
representation. As of this post, I've managed to write a board representation
that allows me to place pieces of both colors on any square, and I'm hacking
away at the move generator. I've also written a small command line "board
explorer" utility that can interact with my board representation. Of course, it
has a pile of unit tests, helping me inch ever-so-slowly toward that blissful
bug-free state.
It's written in Rust. I've [_mostly_][rust-bc-toot] avoided fighting with the
borrow checker.
[chess-post]: {{< ref "chess" >}}
[cpwiki]: https://www.chessprogramming.org/Main_Page
[cpgs]: https://www.chessprogramming.org/Getting_Started
[cpbb]: https://www.chessprogramming.org/Bitboards
[rust-bc-toot]: https://mastodon.social/@erynofwales/111637122773195611

View file

@ -0,0 +1,36 @@
---
title: "Less Instagram, More Blog"
description: Resolving, yet again, to blog more and social media less.
date: 2023-12-27T08:56:44-07:00
categories: Meta
tags: [Writing, Resolutions, Habits]
---
I've been thinking the last few days about how to make use of my blog in 2024. I
made some vague noises in this general direction a few days ago in my [What
Should I Blog About?][what-to-blog-about] post too.
My vision since I started posting more here has been to use it as a place to
share all sorts of things: stuff I'm working on or thinking about; photos; and
stories from travel and life.
I often fall into a trap when I sit down to write something in which I feel like
I must first invent the Universe. The need to explain everything from first
principles seriously hampers my ability (and frankly, desire) to write anything.
I don't want to only post carefully thought out, highly edited and polished
pieces, though I certainly hope _some_ of my posts reach that bar. I hope to
also post quick notes and sketches of ideas. I've enjoyed reading some quicker
posts from {{< tess >}} and [Elaine][e] this past year, and I'd like to follow
their example.
{{< youtube zSgiXGELjbc >}}
I'm not setting myself a specific goal here. The idea is just "more" in a
certain general direction. I don't want to commit to a specific frequency or
quality. Instead, I'm hoping this post sets a foundation on which to build a
sustainable thinking-writing-sharing habit.
Thanks for coming along. :)
[what-to-blog-about]: {{< ref "what-to-blog-about" >}}
[e]: https://diplograph.net

View file

@ -1,8 +0,0 @@
---
resources:
- name: cover
src: cover.jpg
title:
---
{{< figures/image name=cover >}}

View file

@ -1,8 +1,9 @@
---
title: "Netscape Meteors: Retrospective"
date: 2023-08-05T17:14:40-07:00
description: Someone shared my Netscape Meteors post on the Orange Website, causing it to be moderately viral for a few days. Heres an update on the web traffic my server received.
categories: ["Tech"]
tags:
tags:
- History
- Meta
- Netscape

View file

@ -1,6 +1,7 @@
---
title: "Netscape Meteors"
date: 2023-08-01T18:23:33-07:00
description: I went on a hunt to find the "Meteors" loading animation from Netscape back in the 90s, and wrote up my adventure.
resources:
- name: netscape60
title: Netscape Meteor Loading Animation
@ -14,7 +15,7 @@ resources:
- name: rectangular-pixels
title: Rectangular Pixels
src: rectangular-pixels.png
alt: "A zoomed in screenshot of an animation frame with pixel grid enabled,
alt: "A zoomed in screenshot of an animation frame with pixel grid enabled,
showing rectangular pixels"
categories: Tech
tags: ["Netscape", "History", "Web Browsers", "Web"]
@ -25,13 +26,13 @@ Navigator "meteors" animation. This one has a special place in my head and
heart because it is so clearly connected to my memories of discovering the
web as a kid. Here it is in its original 60&times;60 px glory:
{{< figures/image name=netscape60 shouldShowTitle=false >}}
{{< figures/image name=netscape60 shouldShowTitle=false size=small >}}
I started out doing some web searches that turned up several versions. One was
promising but far too big: 400&times;400 px. Worse, after some shoddy resize
attempts, the "pixels" had become rectangular.
{{< figures/image name=rectangular-pixels shouldShowTitle=false >}}
{{< figures/image name=rectangular-pixels shouldShowTitle=false size=small >}}
This would not do.
@ -80,7 +81,10 @@ that replaces those pixels with ones that match the surrounding pixels. Here's
the modified 60&times;60 one and a bigger 240&times;240 px one, for good
measure:
{{< figures/image names="netscape-modified60,netscape-modified240" shouldShowTitle=false >}}
{{< content-grid columns=2 >}}
{{< figures/image name="netscape-modified60" shouldShowTitle=false shouldResize=false size=small >}}
{{< figures/image name="netscape-modified240" shouldShowTitle=false shouldResize=false size=small >}}
{{< /content-grid >}}
<script src="https://mastodon.social/embed.js" async="async"></script>

View file

@ -1,6 +1,7 @@
---
title: "Once Upon a Time I Lived on Mars by Kate Greene"
title: Once Upon a Time I Lived on Mars by Kate Greene
slug: once-upon-a-time-i-lived-on-mars-book
description: A brief book report.
date: 2023-02-20T09:16:48-08:00
date_finished: 2023-02-20T00:00:00-08:00
categories: Books

View file

@ -1,8 +1,7 @@
---
title: "Pajaro Dunes"
date: 2023-05-30T08:31:34-07:00
categories: Travel
tags: [Beaches, Tess, EJ, Vacations]
tags: [Travel, Beaches, Tess, EJ, Vacations]
---
{{< tess >}}, EJ, and I took a weekend trip down the coast over Memorial Day

View file

@ -1,8 +1,10 @@
---
title: "Trip to Japan"
title: Trip to Japan
date: 2023-04-14T21:40:21+09:00
categories: Travel
tags: ["日本"]
tags:
- Travel
- japan
---
At the beginning of April, {{< tess >}} and I took a trip to Japan for two

View file

@ -0,0 +1,13 @@
---
title: What Should I Blog About?
date: 2023-12-20T08:06:34-08:00
link: https://css-irl.info/what-to-blog-about-when-you-dont-know-what-to-blog-about/
categories: Tech
tags: [Writing]
---
I came across this handy list of [things to blog about when you don't know what
to blog about][link]. As someone who often doesn't know what to blog about, it's
nice to have a list of ideas for what to blog about.
[link]: https://css-irl.info/what-to-blog-about-when-you-dont-know-what-to-blog-about/

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7bc98cce772e0c075daed5a6dd9b1c18e6fd19e94ac68197893fd14cb58cf790
size 83946

View file

@ -0,0 +1,27 @@
---
title: "Yerba Buena by Nina LaCour"
date: 2023-11-23T09:50:06-07:00
series: 2023-books
categories: Books
tags: [Romance, Lesbians, Queerness]
resources:
- name: cover
src: cover.jpg
title:
params:
alt: An orange book cover with green leafy sprigs around the edges. Profiles of two women, overlapping and facing opposite directions. "Yerba Buena a novel" is written across the top half.
---
I thought this book was a lesbian romance -- and it is -- but it's so much more
too. It's the story of two women and the difficult pasts they emerge out of. I
really enjoyed how LaCour wove together their processing of that trauma with
growing into young women, making questionable choices, finding themselves, and
ultimately each other. It's heavy at times, but also beautiful. I really enjoyed
it. Thank you, {{< tess >}}, for the gift. ❤️
Get it at [Folio][folio] in San Francisco, or on [Bookshop.org][bookshop].
{{< figures/image name=cover class=content-width >}}
[folio]: https://www.foliosf.com/book/9781250810519
[bookshop]: https://bookshop.org/p/books/yerba-buena-nina-lacour/18721506?ean=9781250810519

View file

@ -0,0 +1,28 @@
---
title: "You Deserve a Tech Union by Ethan Marcotte"
date: 2023-12-16T08:19:41-08:00
draft: true
series: 2023-books
categories: Books
tags: [Unions, Tech]
---
Ethan's book came out in August 2023, and I've been eager to read it since he
announced it. Unionization has been a hot topic in the US over the last several
years. I've rooted for workers at Amazon, Google, Starbucks, and Apple to form
unions and advocate for their rights vis á vis their employers. I think that
work is so important.
This book provides an overview of the history of unions in the US, and in the US
tech industry, plus some helpful thoughts on how to form unions in your
workplace.
I found his arguments about why unions are important, even in an industrial
sector considered to be rather plush compared to many others. Many people think
of unions as organizations that advocate for _more_ privileges and protections
for workers. However, at least as important as that work, they also ensure that
workers retain the privileges they already have.
Get it from [A Book Apart][aba].
[aba]: https://abookapart.com/products/you-deserve-a-tech-union

View file

@ -0,0 +1,4 @@
---
title: 2024
date: 2024-01-01
---

View file

@ -0,0 +1,56 @@
---
title: ¡Ay Carmela!
description: |
Pero nada pueden bombas<br>
Donde sobra corazón
date: 2024-11-06T08:30:22-08:00
categories: Politics
tags:
- Music
- United States
- España
- Guerra Civil Española
---
> ```text
> El ejército del Ebro
> Rumbala rumbala rum-ba-la
> El ejército del Ebro
> Rumbala rumbala rum-ba-la
>
> Una noche el río pasó
> ¡Ay Carmela! ¡Ay Carmela!
> Una noche el río pasó
> ¡Ay Carmela! ¡Ay Carmela!
>
> Pero nada pueden bombas
> Rumbala rumbala rum-ba-la
> Pero nada pueden bombas
> Rumbala rumbala rum-ba-la
>
> Donde sobra corazón
> ¡Ay Carmela! ¡Ay Carmela!
> Donde sobra corazón
> ¡Ay Carmela! ¡Ay Carmela!
>
> Contraataques muy rabiosos
> Rumbala rumbala rum-ba-la
> Contraataques muy rabiosos
> Rumbala rumbala rum-ba-la
>
> <strong>Deberemos resistir</strong>
> ¡Ay Carmela! ¡Ay Carmela!
> Deberemos resistir
> ¡Ay Carmela! ¡Ay Carmela!
>
> Pero igual que combatimos
> Rumbala rumbala rum-ba-la
> Pero igual que combatimos
> Rumbala rumbala rum-ba-la
>
> <strong>Prometemos resistir</strong>
> ¡Ay Carmela! ¡Ay Carmela!
> Prometemos resistir
> ¡Ay Carmela! ¡Ay Carmela!
> ```
{cite="https://music.apple.com/us/album/ay-carmela/1119265269?i=1119265947" caption="Traditional; emphasis mine"}

View file

@ -0,0 +1,23 @@
---
title: B612
date: 2024-03-09T08:38:03-08:00
description: An open source font I rediscovered recently.
categories: Tech
tags: [Fonts]
resources:
- name: specimen
src: specimen.png
title: B612 y B612 Mono
params:
alt: "
Una muestra de B612 y B612 Mono. El mismo pangrama inglés, “quick brown fox,” es escrito en líneas separadas.
"
---
Recientemente, redescubrí la fuente [B612][b612]. Fue engargado por AirBus para
los tableros de instrumentos de sus aviones. Hace unos años que hizen de código
abierto.
{{% figures/image name=specimen class=content-width shouldResize=false %}}
[b612]: https://b612-font.com

View file

@ -0,0 +1,24 @@
---
title: B612
date: 2024-03-09T08:38:03-08:00
description: An open source font I rediscovered recently.
categories: Tech
tags: [Fonts]
resources:
- name: specimen
src: specimen.png
title: B612 and B612 Mono
params:
alt: "
A specimen of B612 and B612 Mono. The same “quick brown fox” pangram sentence is
set in each font on separate lines.
"
---
I recently rediscovered [B612][b612], a font comissioned by AirBus to serve as
the font for their airplanes' instrument panels. They made it open source
several years ago.
{{% figures/image name=specimen class=content-width shouldResize=false %}}
[b612]: https://b612-font.com

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

View file

@ -0,0 +1,64 @@
---
title: Books I Read in 2024
slug: books
date: 2024-12-31
tags:
- Books
- Reading
---
I enjoy reading quite a bit. Nevertheless, it's something I need to be
intentional about incorporating into my life. I usually to finish a modest
number of books in a year. This year I made it to a nice round ten.
A big theme of the year is the [Murderbot Diaries][murderbot]. My friend Jess
recommended them to me a while back, and I finally got around to [All Systems
Red][murderbot1] last year. I was hooked enough that {{< tess >}} bought me the
subsequent three for Christmas last year. So you're gonna see almost all the
Murderbot books on this list.
[Bindle Punk Bruja](https://marthawells.com/networkeffect.htm) by Desideria Mesa
: Mesa's debut novel is set in 1920s Kansas City and centers around Rose, the
daughter of Mexican immigrants who takes on the city's mob bosses with the help
of friends and some witchy magical powers. This was a gift from my sister
[Anna][anna] for Christmas last year.
[The Deep Sky](https://www.yumekitasei.com/projects-6) by Yume Kitasei
: A murder mystery that takes place in space on a one-way mission to colonize a
far-off planet. A gift from my sister.
[Wolfsong](https://www.tjklunebooks.com/wolfsong) by TJ Klune
: Warewolves, magic, queerness, and family. A gift from my sister.
[Fingersmith](https://www.penguinrandomhouse.com/books/348400/fingersmith-by-sarah-waters/) by Sarah Waters
: Mystery, intrigue, gay ladies, and some incredible plot twists. Tess gave me
this one.
[Artificial Condition](https://marthawells.com/murderbot2.htm) by Martha Wells
: Murderbot investigates its past.
[Rogue Protocol](https://marthawells.com/murderbot3.htm) by Martha Wells
: Murderbot goes digging for evidence against its former corporate master,
GrayCris.
[Exit Strategy](https://marthawells.com/murderbot4.htm) by Martha Wells
: Murderbot attempts to save its former owner from GrayCris.
[Network Effect](https://marthawells.com/networkeffect.htm) by Martha Wells
: Continuing the Murderbot obsession, I picked up this one from a [Books
Inc][booksinc] in San Francisco's Marina district.
[I'm Starting to Worry About This Black Box of Doom](https://us.macmillan.com/books/9781250285959/imstartingtoworryaboutthisblackboxofdoom/) by Jason Pargin
: Anna and I decided to read this together, book club style. It's a ridiculous
romp across the US with some deep commentary on the perils of social media: how
it promotes dogpiling in ways that can destroy lives, and the groupthink that
arises from being terminally online.
[The Full Moon Coffee Shop](https://www.penguinrandomhouse.com/books/746333/the-full-moon-coffee-shop-by-mai-mochizuki/) by Mai Mochizuki
: A cute, short read about a mysterious popup coffee shop that appears in Kyōto
during the full moon.
[murderbot]: https://marthawells.com/murderbot.htm
[murderbot1]: https://marthawells.com/murderbot1.htm
[anna]: https://www.instagram.com/anna.e.az/
[booksinc]: https://booksinc.net

View file

@ -0,0 +1,26 @@
---
title: BSD `make` != GNU `make`
date: 2024-07-31T07:27:50-07:00
description: Discussing some differences between the BSD and GNU variants of `make(1)`.
categories: Tech
tags: [BSD, GNU, Make, Software]
---
While working on a little home networking project, I found myself having to
write a Makefile in a FreeBSD environment.
Having written only GNU Makefiles over the course of my life, I was surprised to
find that my recipes just ... didn't work.
Some resources that helped me make the jump to writing BSD style Makefiles are:
* The [`make(1)`][man] man page that ships with FreeBSD. It's surprisingly
thorough, but difficult to search through if you don't know exactly what
you're looking for.
* This FreeBSD mailing list post quoting [GNU make's summary of
differences][diffs] from BSD `make`.
* And [PMake: A Tutorial][pmake], hosted on FreeBSD.org.
[man]: https://man.freebsd.org/cgi/man.cgi?make(1)
[diffs]: https://lists.freebsd.org/pipermail/freebsd-questions/2007-April/147533.html
[pmake]: https://docs-archive.freebsd.org/44doc/psd/12.make/paper.pdf

View file

@ -0,0 +1,69 @@
---
title: "Cat in the Cream Cookies"
date: 2024-11-18
tags:
- Cooking
- Cookies
- Oberlin
- Recipes
---
One of my favorite memories from my time as a student at [Oberlin][ob] was going
to the [Cat in the Cream][cat]. I saw a lot of great plays, improv shows, and
jazz ensembles by students, and several performances by visiting musical guests.
The other highlight of these memories was the oatmeal chocolate chip cookies you
could get for $1. They're somewhere between a small cake and a cookie, often
fresh-baked (they often had a hard time keeping up with demand on show nights).
Honestly they're everything I want in a cookie. I think the recipe was printed
in an edition of the [Alumni Magazine][mag] at some point in the last several
years, but this [video][video] I found online was the closest I had to hand, so
I'm copying it here.
## Recipe
**Yield:** 20 cookies
### Tools
* Measuring cups and spoons
* 2 large mixing bowls
* Spoon or electric mixer to mix wet ingredients
* Whisk to combine dry ingredients (optional)
* 1 or 2 half-size sheet pans for baking
### Ingredients
* 2 cups butter, softened
* 1 cup granulated sugar
* 2 cups brown sugar or 2 tablespoons of molasses
* 4 eggs, lightly beaten
* 2 teaspoons vanilla
* 4 cups flour
* 2 teaspoons baking soda
* 2 teaspoons salt
* Dash cinnamon
* 4 cups oats
* 3 cups chocolate chips
### Method
1. Preheat oven to 375°.
1. Combine butter, sugars, and/or molasses in a bowl.
1. Add eggs and vanilla. Stir to combine.
1. Mix flour, baking soda, salt, and cinnamon in a separate bowl.
1. Add dry ingredients above to the wet. Stir to combine.
1. Add in oats and chocolate chips. Stir to combine.
1. Drop in large hunks (about 1/4 cup) onto ungreased baking sheets. They don't
spread during baking, but you'll only get six cookies on a half sheet.
1. Bake until the edges are slightly brown. The original recipe says 20 minutes,
but 15 was enough in my oven.
[ob]: https://www.oberlin.edu
[cat]: https://www.thecatinthecream.com/our-menu.html
[video]: https://vimeo.com/827645032
[mag]: https://www.oberlin.edu/communications/editorial/alumni-magazine

View file

@ -0,0 +1,68 @@
---
title: Chicago
date: 2024-10-05T18:58:05-05:00
description: >
Tess and I traveled to Chicago to attend the wedding of one of my oldest
friends, visit some family, and do a little sightseeing.
resources:
- src: wedding.jpg
title: Bill and Ashley walked each other in. My dad officiated.
params:
alt: >
To the left, a man wearing a suit and white pastoral stole stands near a
mic. To the right, a woman in a white dress, and a man in a tuxedo walk
into the frame. Everyone is smiling.
- src: quincy.jpg
title: >
Wood plank platforms, Copperplate lettering, and wingding-style hands to
direct you where you need to go.
params:
alt: >
A large station sign, framed with a simple wood frame, hanging on the
railing around a station platform stairway. It declares the station's
name, Quincy, and points to exits to the left and right.
- src: tess-kerryman.jpg
title: >
The Kerryman is a great Irish bar in River North, owned and operated by
one of Tess' distant Irish cousins.
params:
alt: >
Tess, on the left, stands outside a large pub on a stree corner. The pub
has outdoor seating.
tags:
- Travel
- Friends
- Family
- "Chicago, IL"
- Illinois
---
This past week {{< tess >}} and I traveled to Chicago to attend the wedding of
Bill, one of my oldest friends, and his partner Ashley.
{{< figures/image name=wedding.jpg >}}
They've been a couple for a long time. I'm thrilled that they've decided to take
this step together, and grateful to have been invited to witness it. Bill also
asked my dad to perform the ceremony, and I think he did an excellent job.
{{< figures/image name=quincy.jpg >}}
After the wedding day, we spent several days in Chicago sightseeing and visiting
with friends and family. We went record shopping at [Reckless][reckless], walked
down Navy Pier and Michigan Avenue, rode the L (including a stop a the
delightfully old timey [Quincy Station][quincy]), took selfies at the
[Bean][bean], and caught Hokusai's [Great Wave Off Kanagawa][wave] at the [Art
Institute of Chicago][artic] on a limited exhibition. We had breakfast at
[Tary][tary], and stopped in for pints at [The Kerryman][kerryman], a pub owned
by one of Tess' distant Irish cousins.
{{< figures/image name=tess-kerryman.jpg >}}
[reckless]: https://www.reckless.com
[bean]: https://millenniumparkfoundation.org/art-architecture/cloud-gate/
[artic]: https://www.artic.edu
[tary]: https://tarycoffee.com/menu
[kerryman]: https://kerrymanchicago.com/drinks/
[wave]: https://en.wikipedia.org/wiki/The_Great_Wave_off_Kanagawa
[quincy]: https://www.transitchicago.com/station/quin/

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3b6c19b8a5f589b21a7ab8ee846e2c23c364335142c04457998cc89e948ac39e
size 1843640

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ad7dcfa33b5a9df82ae941f970324bcac5a25dbd36e900051032724a2af15bb2
size 2452294

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:08c30e5304a8341e6734eb5ce53c3249c935eb1eaa0401e90726ff660f8cf0e8
size 2870428

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1d3444135aab32635f480ee8ca4a6797821ff9b6f0f68e51aa4dd0f9b5d6383e
size 3407880

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5c17df7d3f75b0f3b18f9b5d73c1aa63b54ce5d856742f7121f4b9e9c8632e54
size 3836629

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:19005c6eb5ef6da85eafcfe5abc92cff98bd4a7b53156fee94204f0e100db359
size 1129641

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3e171f8b999e0af9bf949e391397a78ef6c7dd34bffa127c62f78ad57917f185
size 2557799

View file

@ -0,0 +1,117 @@
---
title: "Christmas in Massachusetts"
description: This year, I spent Christmas with Tess and Erin in Massachusetts.
date: 2024-12-25
resources:
- src: snow-friend.jpg
title: The tiniest snow friend
- src: erin-snowballs.jpg
title: Erin making snowballs
- src: minot.jpg
title: Minot Light sits on an undersea ledge far out from shore
- src: sand-hills.jpg
title: The sea wall along Sand Hills Beach, where Tess spent many summers
- src: bluey-erin-kathleen.jpg
title: Heading into the Heeler's living room with Auntie Kathleen
- src: bluey-green-door.jpg
title: Waiting to go through the secret door!
- src: bowling.jpg
title: Erin's first game of candlepin bowling
- src: old-brigade.jpg
title: Danny (on the center mic) and the Old Brigade at Fox & Hound in Quincy, MA
tags:
- Holidays
- Christmas
- Family
- Tess
- Erin
- Candlepin Bowling
- Massachusetts
---
This year, {{< tess >}}, Erin, and I traveled to Massachusetts to spend
Christmas with Tess' family. This was my first year spending Christmas away from
my family in Arizona, and my first with Tess and Erin.
One of my hopes for Christmas in a cold place was to see some snow. As luck
would have it, I woke up on Christmas Eve to find a light dusting! Erin and I
couldn't help ourselves: we rushed outside to make a few snowballs and the
tiniest snow man you've ever seen.
{{< 2col >}}
{{< figures/image name=erin-snowballs.jpg >}}
{{< figures/image name=snow-friend.jpg >}}
{{< /2col >}}
We opened presents and had a lazy Christmas morning. We had dinner at Tess'
parents' house, and then went over for Christmas dessert at her cousin's house
-- a truly massive family event with many extended family members attending.
The next day, Tess and I went "down harbor" for lunch and a little walk around.
We stopped at [Lucky Finn](https://www.luckyfinncafe.com) for a coffee, and Tess
took me around to see some of her old summer stomping grounds. I asked her to
help me get a good view of [Minot Light][minot], but it turns out it's really
damn far out so I only managed a little speck on the horizon.
{{< 2col >}}
{{< figures/image name=minot.jpg >}}
{{< figures/image name=sand-hills.jpg >}}
{{< /2col >}}
On Friday, Tess, Erin, and I went candlepin bowling at [Alley Kat
Lane][alleykat] in Kingston. Despite some initial hesitation, Erin had a lot of
fun. It was my first time at candlepin bowling too, and I found it really fun!
Harder than "big ball" bowling, but also more approachable because of the
lighter, smaller ball. The opportunities to strategize how to use the fallen
pins to your advantage add an interesting element too.
{{< 2col >}}
{{< figures/image name=bluey-erin-kathleen.jpg >}}
{{< figures/image name=bluey-green-door.jpg >}}
{{< /2col >}}
On Saturday, Tess, Kathleen, and I took Erin to an immersive [Bluey camp][bluey]
in Burlington. She had a great time building a fort out of the big cushy
oversized "blocks" in Bluey and Bingo's playroom.
{{< 2col >}}
{{< figures/image name=bowling.jpg >}}
{{< figures/image name=old-brigade.jpg >}}
{{< /2col >}}
Our last day in town, we went out to brunch at [The Tinker's Son][tinker], and
went up to [The Fox & Hound][fox] in Quincy to watch Tess' cousin
[Danny][brigade] play Irish music.
---
I had a lot of feelings going into this Christmas. Apart from one pandemic year,
I've spent every year with my family in Arizona. I was worried about being in a
new place with people I didn't know well, breaking long-standing traditions with
my own family, letting them down, and feeling homesick.
Everyone in Tess' family was welcoming and supportive. Tess' mom even got me a
stocking for their fireplce with my name on it, and her dad filled it with many
of the same things he gives to the rest of the family members. I also got to
watch Erin experience Christmas as a kid for the first time: opening presents,
playing in the snow, snuggling and reading books or watching TV together.
I was able to keep some of my family traditions too. Mom sent me a box of full
of cookies; I shopped for presents for my parents and sister. And when we
returned to California, I was able to have a video call with my family to open
presents together.
The older I get the more see the point of Christmas to be about the
relationships to family, and the sense of home and community you get from being
with people you love. Despite a whole new experience, I really felt that this
year. In fact, I think being in a new place, enacting different traditions, let
me hold the traditions and rituals of Christmas as I've experienced up to now a
little more loosely, and to focus on the people that bring meaning to the
holiday and make those rituals happen.
[minot]: https://en.wikipedia.org/wiki/Minot%27s_Ledge_Light
[bluey]: https://camp.com/bluey-x-camp-boston
[alleykat]: https://alleykatlane.com
[tinker]: https://www.thetinkersson.com
[fox]: https://www.foxandhoundquincy.com
[brigade]: https://www.instagram.com/theoldbrigade/

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:60395d73a2aa641b7d3f033474685bd2f9ef3128bb328f52456f432db579c1a3
size 1976740

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3b5bd5931bdec32c2b54f7a63c6761d6951ee7e75891af6863aa127b2ed20ae
size 3163986

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8c190c6ac37402e683c61715a71a1c4494c81a659a63403329a871017d9bf156
size 3017239

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:812fcea1bf412ac0fd89d790095ae641dcc0461c14caa11e5f7f53a3f479240a
size 2395627

View file

@ -0,0 +1,28 @@
---
title: "Departure Mono"
description: >
A fun fixed-width font evoking old school terminals and pixel fonts
from early computing.
date: 2024-12-28T08:19:53-05:00
resources:
- src: screenshot.png
title:
params:
alt: >
A screenshot of the Departure Mono website. On the left, a small caption
"Departure Mono is a monospaced pixel font with a lo-fi technical vibe".
On the right are two examples: a personal letter on continuous feed
paper, and a notice on small stationary.
tags:
- Fonts
- Design
- Web Design
---
Here's a fun fixed-width pixel font I came across the other day: [Departure
Mono][dep]. It's got a neat old school terminal vibe, think VT100 or Commodore
64.
{{< figures/image name=screenshot.png >}}
[dep]: https://departuremono.com

Some files were not shown because too many files have changed in this diff Show more