Compare commits

...
231 Commits
Author SHA1 Message Date
inherentlee 230e86bf7c Merge branch 'main' into stickers
continuous-integration/drone/push Build is passing
2026-10-21 15:23:12 -07:00
inherentlee 32b055f328 note re samples 2026-10-21 15:21:37 -07:00
inherentlee 438d1a67e2 stickerbros 2026-10-21 15:15:12 -07:00
inherentlee cd7f525bac plaid dishtowels
continuous-integration/drone/push Build is passing
2026-10-19 13:09:35 -07:00
inherentlee 6933f11630 stickerapp 2026-10-17 19:35:31 -07:00
inherentlee 62dab04ee9 more about sticky brand ew 2026-10-15 11:24:07 -07:00
inherentlee e60d191e09 sticker update 2026-10-14 13:45:54 -07:00
inherentlee efe79ff639 Merge branch 'main' into stickers 2026-10-14 10:39:12 -07:00
inherentlee 4be20cccb3 border radius for blockquotes
continuous-integration/drone/push Build is passing
2026-10-14 10:38:57 -07:00
inherentlee aba74f280e some tweaks to git post
continuous-integration/drone/push Build is passing
2026-10-14 08:48:25 -07:00
inherentlee 0125216d96 add more aout remote commands
continuous-integration/drone/push Build is passing
2026-10-14 08:43:19 -07:00
inherentlee 6ee81d8784 small updates to git post
continuous-integration/drone/push Build is passing
2026-10-14 08:28:24 -07:00
inherentlee 2bfe616195 update fedizinefest
continuous-integration/drone/push Build is failing
2026-10-13 08:31:32 -07:00
inherentlee f9d8123b9d add header ids
continuous-integration/drone/push Build is passing
2026-10-13 08:30:50 -07:00
inherentlee c7ef4c701a sticker updates 2026-10-13 07:45:30 -07:00
inherentlee d8f3ea3430 add stickerapp 2026-10-10 11:16:25 -07:00
inherentlee a9b96e567e add bend print co samples 2026-10-09 15:46:26 -07:00
inherentlee bc1a51a4d5 add district dharma testimonial
continuous-integration/drone/push Build is passing
2026-10-06 09:52:56 -07:00
inherentlee 16c3ef1e26 audit fix 2026-10-06 09:52:44 -07:00
inherentlee efe153191a another tiny mobile tweak
continuous-integration/drone/push Build is passing
2026-10-06 09:03:41 -07:00
inherentlee 8c2c2231ac some size tweaks for headers on mobile
continuous-integration/drone Build is passing
2026-10-05 13:38:48 -07:00
inherentlee 62b1e448ea Merge branch 'main' into stickers 2026-10-05 13:31:36 -07:00
inherentlee d53198e1aa add sticker junkie, sticker robot, and vinyl disorder
continuous-integration/drone/push Build is running
2026-10-05 13:29:44 -07:00
inherentlee c6ec6b8f48 make urls easier to read font
continuous-integration/drone/push Build is passing
2026-10-04 11:17:32 -07:00
inherentlee 75909355ba couple of notes about samples
continuous-integration/drone/push Build is passing
2026-10-02 17:28:05 -07:00
inherentlee d5660455bd add drone trigger that requires main branch
continuous-integration/drone/push Build is passing
2026-10-02 12:59:15 -07:00
inherentlee 7df4c1ff8e more about sticker bunnies
continuous-integration/drone/push Build is passing
2026-10-02 12:54:06 -07:00
inherentlee d6c2bb9aa9 wording
continuous-integration/drone/push Build is passing
2026-10-02 09:57:23 -07:00
inherentlee 604a6787f4 sticker bunnies
continuous-integration/drone/push Build is passing
2026-10-01 18:55:54 -07:00
inherentlee 980cd0b3a6 update with stickergiant info
continuous-integration/drone/push Build is passing
2026-10-01 13:05:34 -07:00
inherentlee 5be42a4ff3 vinyl disorder and a few details 2026-10-01 08:53:36 -07:00
inherentlee 25c8e56a76 more re sticker ninja
continuous-integration/drone/push Build is passing
2026-09-30 17:44:29 -07:00
inherentlee 8752eeb904 sticker ninja details
continuous-integration/drone/push Build is passing
2026-09-30 17:41:40 -07:00
inherentlee b1135beddb update squarespace more
continuous-integration/drone/push Build is passing
2026-09-30 16:52:53 -07:00
inherentlee 84160a0574 update squarespace
continuous-integration/drone/push Build is passing
2026-09-30 16:51:12 -07:00
inherentlee 557308f3f9 sticker post wip
continuous-integration/drone/push Build is failing
2026-09-29 14:20:22 -07:00
inherentlee 382419e6d6 add toc to fediverse post
continuous-integration/drone/push Build is passing
2026-09-29 14:19:35 -07:00
inherentlee 66df77c32c remove old shop links 2026-09-29 10:01:11 -07:00
inherentlee a3e0ba5037 fedi intro post
continuous-integration/drone/push Build is passing
2026-09-28 09:38:52 -07:00
inherentlee 51d836c71b add to wong foo
continuous-integration/drone/push Build is passing
2026-09-23 20:25:08 -07:00
inherentlee 67e70e68ab remove scroll-margin-top since navbar is no longer sticky
continuous-integration/drone/push Build is passing
2026-09-23 19:29:19 -07:00
inherentlee b31e683786 i honestly don't know why this was working without this but i'm adding it just in case
continuous-integration/drone/push Build is passing
2026-09-23 14:47:53 -07:00
inherentlee 1bb26176ba tweak some breakpoints
continuous-integration/drone/push Build is passing
2026-09-21 16:08:11 -07:00
inherentlee a000d1c1b9 i'm not happy with this but it's better for width
continuous-integration/drone/push Build is passing
2026-09-21 15:55:44 -07:00
inherentlee cf26b06e3d update tree styling to box method
continuous-integration/drone/push Build is passing
2026-09-21 15:40:27 -07:00
inherentlee 5acda53f58 publish leatherworking zine with link to fzf post
continuous-integration/drone/push Build is passing
2026-09-21 13:55:29 -07:00
inherentlee f2bc045735 fedizinefest post
continuous-integration/drone/push Build is passing
2026-09-21 13:49:51 -07:00
inherentlee 3b1c5ffa88 SR fix
continuous-integration/drone/push Build is passing
2026-09-21 12:48:45 -07:00
inherentlee 0882fcda41 better images
continuous-integration/drone/push Build is passing
2026-09-21 12:46:38 -07:00
inherentlee 7d042abe1d fuck spacing and tabs all my homies hate spacing and tabs
continuous-integration/drone/push Build is passing
2026-09-21 12:27:30 -07:00
inherentlee f5bbda1f14 small edits
continuous-integration/drone/push Build is passing
2026-09-21 12:23:53 -07:00
inherentlee 9999775e44 tree style post
continuous-integration/drone/push Build is passing
2026-09-21 12:19:01 -07:00
inherentlee 463cabe793 update framer post pic 2026-09-21 12:18:48 -07:00
inherentlee 4aa7516cb9 fix hanging indent 2026-09-21 12:18:13 -07:00
inherentlee f49a7faa4d more contrasting focus outlines for toc
continuous-integration/drone/push Build is passing
2026-09-21 08:38:59 -07:00
inherentlee 2e26cefab2 tiny tweak to prevent gap
continuous-integration/drone/push Build is passing
2026-09-20 19:04:19 -07:00
inherentlee 870a6e5e0f prevent blockquotes interferring with toc
continuous-integration/drone/push Build is passing
2026-09-20 19:01:54 -07:00
inherentlee be364d7644 it's important that the comment have a slant rhyme
continuous-integration/drone/push Build is passing
2026-09-20 18:50:52 -07:00
inherentlee 06bcfc1522 toc tree styling
continuous-integration/drone/push Build is passing
2026-09-20 18:46:09 -07:00
inherentlee dd1943bcdd li line height matches p line height
continuous-integration/drone/push Build is passing
2026-09-20 15:13:17 -07:00
inherentlee bfa91ea19f big ol toc update
continuous-integration/drone/push Build is passing
2026-09-20 15:07:49 -07:00
inherentlee b4fbeffc41 new font omg
continuous-integration/drone/push Build is passing
2026-09-19 17:40:10 -07:00
inherentlee 25cf8a38ec fix sitemap size 2026-09-18 12:30:23 -07:00
inherentlee 5724f509a0 update resume
continuous-integration/drone/push Build is passing
2026-09-18 08:48:30 -07:00
inherentlee fe6956aaa3 mark down framer for complex keyboard interactions
continuous-integration/drone/push Build is passing
2026-09-17 17:59:08 -07:00
inherentlee 846ef7538f note re dropdowns in framer
continuous-integration/drone/push Build is passing
2026-09-17 17:57:33 -07:00
inherentlee f8aacdc85d note about dropdowns
continuous-integration/drone/push Build is passing
2026-09-17 17:04:46 -07:00
inherentlee 776218805a more notes about framer
continuous-integration/drone/push Build is passing
2026-09-17 12:03:26 -07:00
inherentlee 91c7f14113 add instructions just for completeness
continuous-integration/drone/push Build is passing
2026-09-17 08:18:27 -07:00
inherentlee 8bcdaeff52 idk these notes were wrong i guess 2026-09-17 08:16:38 -07:00
inherentlee 3e766eb519 find a few more target=_blank bits
continuous-integration/drone/push Build is passing
2026-09-17 08:02:47 -07:00
inherentlee 2ad41daa2e make leatherworking zine a draft
continuous-integration/drone/push Build is passing
2026-09-17 07:56:09 -07:00
inherentlee 7b248c24b9 Merge branch 'leatherworking-zine' 2026-09-17 07:55:34 -07:00
inherentlee abec70c655 add missing page 2026-09-17 07:55:26 -07:00
inherentlee 2d35768db9 preliminary squarespace findings
continuous-integration/drone/push Build is passing
2026-09-16 11:06:40 -07:00
inherentlee 30498307c8 npm audit fix
continuous-integration/drone/push Build is passing
2026-09-15 18:05:04 -07:00
inherentlee 953f651c4f draft
continuous-integration/drone/push Build is passing
2026-09-15 14:47:53 -07:00
inherentlee ee0a39333d package-lock.json update
continuous-integration/drone/push Build is passing
2026-09-14 18:17:10 -07:00
inherentlee a2fd1cb797 package.lock updates? 2026-09-14 18:11:59 -07:00
inherentlee 9889cf4adb fix og metadata
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
2026-09-14 10:38:11 -07:00
inherentlee a3b9d20dfb small style and word fixes to framer accessibility 2026-09-12 10:53:25 -07:00
inherentlee 1a0898c214 update guestbook page to remove embed
continuous-integration/drone/push Build is passing
2026-09-12 10:50:34 -07:00
inherentlee 07bb31111f remove target=blank etc 2026-09-12 10:48:36 -07:00
inherentlee c517bb8d69 remove keyboard shortcut on smaller screens, this could be more complex 2026-09-12 10:43:57 -07:00
inherentlee 830c1a4666 clean up search output
continuous-integration/drone/push Build is passing
2026-09-12 10:13:43 -07:00
inherentlee 1a2850ca8c fix apostrophes in browser title bar
continuous-integration/drone/push Build is passing
2026-09-11 17:53:34 -07:00
inherentlee 96e70dbd2f bit of further cleanup of pf styles
continuous-integration/drone/push Build is passing
2026-09-11 11:55:51 -07:00
inherentlee 58da634ec7 search bar timeeee 2026-09-11 11:46:47 -07:00
inherentlee d8049a1f34 update fedilearns icon
continuous-integration/drone/push Build is passing
2026-09-10 14:22:46 -07:00
inherentlee 12ae5f9a4e houndstooth dishtowels
continuous-integration/drone/push Build is passing
2026-09-10 09:58:30 -07:00
inherentlee 672a03d4e9 some tweaks to color picker
continuous-integration/drone/push Build is passing
2026-09-09 14:02:59 -07:00
inherentlee 0e46e65034 color picker yay
continuous-integration/drone/push Build is passing
2026-09-09 13:37:35 -07:00
inherentlee 782912c8a6 tweak intro content for gallery, reference, home pages
continuous-integration/drone/push Build is passing
2026-09-08 16:18:11 -07:00
inherentlee 470a84429c add link to view all tags to tag pages
continuous-integration/drone/push Build is passing
2026-09-08 16:14:35 -07:00
inherentlee 05e40f0ea7 add patchwork wallet to highlights
continuous-integration/drone/push Build is passing
2026-09-08 16:12:24 -07:00
inherentlee 35841f26fd mouse purse
continuous-integration/drone/push Build is passing
2026-09-08 16:05:29 -07:00
inherentlee 3fc4468d09 add styling to sitemap
continuous-integration/drone/push Build is passing
2026-09-08 10:49:41 -07:00
inherentlee bbcdb5ee03 i only just realized my style page didn't have code highlighting woops
continuous-integration/drone/push Build is passing
2026-09-08 10:40:24 -07:00
inherentlee d663b851c9 small margin change to lists
continuous-integration/drone/push Build is passing
2026-09-08 10:34:16 -07:00
inherentlee 4ac0441c3d framer accessibliity post
continuous-integration/drone/push Build is passing
2026-09-08 10:26:01 -07:00
inherentlee f6620e19a4 remove dead link
continuous-integration/drone/push Build is passing
2026-09-08 10:25:24 -07:00
inherentlee df9b5e4c55 add framer, gen -> generative
continuous-integration/drone/push Build is passing
2026-09-08 09:14:49 -07:00
inherentlee f4a32e5292 remove extraneous css line and add framer to builders post
continuous-integration/drone/push Build is passing
2026-09-06 09:02:49 -07:00
inherentlee 01c0bf00a2 tag edits
continuous-integration/drone/push Build is passing
2026-08-30 09:25:45 -07:00
inherentlee ff03344b81 rainbow shawl from 2023
continuous-integration/drone/push Build is passing
2026-08-30 09:09:21 -07:00
inherentlee e437febdf8 change webring button spacing
continuous-integration/drone/push Build is passing
2026-08-28 11:59:53 -07:00
inherentlee 21858e5dd3 add birder subtract bread baker
continuous-integration/drone/push Build is passing
2026-08-28 11:56:28 -07:00
inherentlee a780e7cc9e black and red journal
continuous-integration/drone/push Build is passing
2026-08-26 17:04:09 -07:00
inherentlee d0cb1cf7f5 resume updates re fedizinefest 2026-08-26 17:03:47 -07:00
inherentlee cd30f192eb REMOVE Z
continuous-integration/drone/push Build is passing
2026-08-26 16:55:20 -07:00
inherentlee d246ba3437 add og url
continuous-integration/drone/push Build is passing
2026-08-25 18:37:19 -07:00
inherentlee 7abb27739e fix tag alignment on mobile post layout
continuous-integration/drone/push Build is passing
2026-08-25 13:13:12 -07:00
inherentlee 742d2b9666 fix errors in 11ty lessons post
continuous-integration/drone/push Build is passing
2026-08-20 17:21:42 -07:00
inherentlee 3ff187ae10 add woven shawl
continuous-integration/drone/push Build is passing
2026-08-20 17:11:59 -07:00
inherentlee 0ec803b447 change modal size 2026-08-20 17:11:48 -07:00
inherentlee 1863efa802 site builders v1
continuous-integration/drone/push Build is passing
2026-08-06 11:37:38 -07:00
inherentlee 153a90fb0a better table margins 2026-08-06 11:26:14 -07:00
inherentlee 0a5d393618 update alt for table runner
continuous-integration/drone/push Build is passing
2026-08-01 08:49:50 -07:00
inherentlee 532424c953 table runner
continuous-integration/drone/push Build is passing
2026-08-01 08:44:24 -07:00
inherentlee 9b5ee21bf7 update log cabin dishtowels 2026-08-01 08:44:07 -07:00
inherentlee 33ad5815a7 atom feed stylesheet
continuous-integration/drone/push Build is passing
2026-07-29 14:56:25 -07:00
inherentlee 7a30ee3216 more dishtowel deets
continuous-integration/drone/push Build is passing
2026-07-26 15:08:33 -07:00
inherentlee 88562bd766 log cabin dishtowels
continuous-integration/drone/push Build is passing
2026-07-26 14:50:07 -07:00
inherentlee 75d3a12bdc update signal
continuous-integration/drone/push Build is passing
2026-07-01 14:47:59 -07:00
inherentlee f488a6aa54 remove draft flag
continuous-integration/drone/push Build is passing
2026-06-30 16:28:29 -07:00
inherentlee 8c135a09c7 core css 2026-06-30 16:28:05 -07:00
inherentlee 7ede08fd43 fix categories on two posts
continuous-integration/drone/push Build is passing
2026-06-30 13:19:10 -07:00
inherentlee e80f340642 remove site folder
continuous-integration/drone/push Build is passing
2026-05-21 16:35:18 -07:00
inherentlee 4b43f76ac4 add ai declaration meta values 2026-05-21 16:33:50 -07:00
inherentlee 54b63df970 drone file
continuous-integration/drone/push Build is passing
2026-05-15 09:23:58 -07:00
inherentlee b40f41a5f7 add submodule 2026-05-15 09:23:40 -07:00
inherentlee 1cf7b8560e build 2026-05-14 09:32:29 -07:00
inherentlee ba5b01d084 improve copyright 2026-05-14 09:30:54 -07:00
inherentlee feaaeb30b7 build 2026-05-14 09:24:37 -07:00
inherentlee 4af8d68ac9 add all years in footer 2026-05-14 09:19:20 -07:00
inherentlee c51e5b502a gram reformat 2026-05-14 09:19:05 -07:00
inherentlee 6585b8e74d fix time zone issue 2026-05-14 09:18:15 -07:00
inherentlee 22d4c48b46 core css draft 2026-05-14 09:02:08 -07:00
inherentlee 18989f817f build 2026-05-14 08:57:06 -07:00
inherentlee 5dfaac6820 tweak sizing/margins of modal images 2026-05-14 08:56:32 -07:00
inherentlee 814d4efe8b build 2026-05-14 08:51:09 -07:00
inherentlee 0b0822d21b reorder contact page 2026-05-14 08:50:30 -07:00
inherentlee f1c073535d build 2026-05-14 08:46:01 -07:00
inherentlee 4f0a0f3969 move tabindex setting to modal controls 2026-05-14 08:45:31 -07:00
inherentlee c4b7faca88 build 2026-05-13 20:50:51 -07:00
inherentlee 68487ad342 tweak alpha value of close button 2026-05-13 20:50:25 -07:00
inherentlee 2b90da7572 build 2026-05-13 20:47:18 -07:00
inherentlee 58be723eef pointer for clickable images 2026-05-13 20:46:48 -07:00
inherentlee 72c5904c27 build 2026-05-13 20:44:22 -07:00
inherentlee e615e6a91f image modals for posts 2026-05-13 20:42:31 -07:00
inherentlee a56ca4c03e remove pdf link 2026-05-07 14:30:54 -07:00
inherentlee 9a483ad27c build 2026-05-06 11:04:35 -07:00
inherentlee 63e225aebc fedilearns 2026-05-06 11:04:05 -07:00
inherentlee 60c07e629b update fedilearns url 2026-05-05 17:27:08 -07:00
inherentlee ff1fa0a966 build 2026-05-05 13:32:00 -07:00
inherentlee 64007ea884 add fedilearns to resume 2026-05-05 13:00:41 -07:00
inherentlee 1108f38939 explicit favicon setting 2026-05-05 12:57:21 -07:00
inherentlee cddc20ad3d build 2026-05-04 15:39:47 -07:00
inherentlee 3a9095c4e8 couple small fixes: home title attr, add mising tag, move post topics up in postlist 2026-05-04 11:48:19 -07:00
inherentlee 914243feb9 move anchor links to aria-labelledby model 2026-05-04 08:35:44 -07:00
inherentlee 3f9e6727de fix page title in metadata 2026-05-04 08:21:35 -07:00
inherentlee f980c8c682 switch order of heading and image 2026-05-03 21:20:24 -07:00
inherentlee 8104cd4520 update signal link 2026-04-21 14:31:42 -07:00
inherentlee 4f38bbfc82 build last 4 commits 2026-04-09 07:41:16 -07:00
inherentlee 56736453fe resume wording 2026-04-09 07:40:47 -07:00
inherentlee c04993c983 mobile margins 2026-04-09 07:40:38 -07:00
inherentlee ed3a845a55 small colophon edits 2026-04-09 07:38:06 -07:00
inherentlee c8ce389065 spell things right omg 2026-04-09 07:34:56 -07:00
inherentlee c95b3c080a testimonial from mari 2026-04-07 15:37:23 -07:00
inherentlee c559aa9154 add testimonial 2026-04-07 10:00:40 -07:00
inherentlee a14753e656 build 2026-04-06 13:27:56 -07:00
inherentlee 82db8f8758 beall testimonial 2026-04-06 13:27:21 -07:00
inherentlee d434da450f wording 2026-04-06 13:24:22 -07:00
inherentlee 913f8469f3 build 2026-04-06 10:27:00 -07:00
inherentlee 4f12d9c5ac change how resume page is handled and add some testimonials 2026-04-06 10:26:22 -07:00
inherentlee e14261bf4d fix weird spaces 2026-03-27 12:35:25 -07:00
inherentlee 073ad660e4 ok finishing up the blur stuff and also building 2026-03-27 12:33:35 -07:00
inherentlee c6dcdacbec further reorder art shows page 2026-03-27 12:25:26 -07:00
inherentlee 8ab1cb687b blur adulty matieral 2026-03-27 12:23:26 -07:00
inherentlee ac1903c5a1 reorder art shows page 2026-03-27 12:23:04 -07:00
inherentlee bf677c3cdf add line to remove structural tags 2026-03-27 11:54:48 -07:00
inherentlee 8adb83d8a8 rel external for accessible image modals 2026-03-25 13:03:30 -07:00
inherentlee 0439f0478d build prev 2026-03-25 13:00:47 -07:00
inherentlee ebe2490fd3 accessible image modals crosses fingers 2026-03-25 13:00:13 -07:00
inherentlee 409ca37f74 wording tweak 2026-03-25 12:50:36 -07:00
inherentlee e129b26e63 build 2026-03-24 10:38:18 -07:00
inherentlee dc49b1cad5 update contact page 2026-03-24 10:37:53 -07:00
inherentlee 21e3dca187 build last two commits 2026-03-24 10:11:20 -07:00
inherentlee ff9eb09838 update headers to use code blocks again now that i fixed that 2026-03-24 10:10:57 -07:00
inherentlee ce6aa0fb00 tweak heading anchor styling 2026-03-24 10:10:16 -07:00
inherentlee f89f135f9b build prev and add draft handling 2026-03-24 09:58:14 -07:00
inherentlee 422a0e45e8 format on save plus: 1) update spoonfairies URL 2) remove 11ty Lessons link 2026-03-24 09:50:14 -07:00
inherentlee 191ee1a355 make code blocks responsive to containing block font size 2026-03-23 15:32:27 -07:00
inherentlee 43ccb40e0b update resume page with gryphon's roost 2026-03-19 15:03:42 -07:00
inherentlee b5aff7207e sitemap styling 2026-03-18 11:11:11 -07:00
inherentlee aa9951e68d build 2026-03-12 11:52:52 -07:00
inherentlee 35519d9d4b remove anchor from related posts section 2026-03-12 11:52:24 -07:00
inherentlee 43ae5c489e rename script 2026-03-07 10:31:53 -08:00
inherentlee b51e953a1b fix date zone 2026-03-02 07:49:22 -08:00
inherentlee 0e14d3ca72 build prev 2026-03-01 14:41:07 -08:00
inherentlee 50d4b61037 jesus h christ 2026-03-01 14:40:42 -08:00
inherentlee 73a0278392 update resume with freelance work 2026-02-25 18:10:11 -08:00
inherentlee b241cc14af move 11ty lessons on resume page 2026-02-25 14:37:31 -08:00
inherentlee 98c00bb1fd robots txt 2026-02-25 14:25:33 -08:00
inherentlee bfefa33f13 exclude tag redirect pages from sitemap 2026-02-21 13:11:30 -08:00
inherentlee 89ff36afc7 build prev 2026-02-21 13:09:59 -08:00
inherentlee afbf693d3b redirects for the old tag urls 2026-02-21 13:09:15 -08:00
inherentlee a3ba14abd2 build prev 2026-02-21 12:23:40 -08:00
inherentlee e45e9b0f7a remove anchors from related posts 2026-02-21 12:23:05 -08:00
inherentlee 3e61e004f4 add space above footer 2026-02-20 19:22:14 -08:00
inherentlee 58a412f002 build now 2026-02-20 14:35:54 -08:00
inherentlee 64db3a2446 FAVICON 2026-02-20 14:35:32 -08:00
inherentlee a03a1b6c52 update beall greenhouses url 2026-02-20 14:12:22 -08:00
inherentlee 7f5dc28cad remove excess note 2026-02-20 13:15:09 -08:00
inherentlee 7e95d9ff16 build prev 2026-02-20 12:24:10 -08:00
inherentlee 6e3bfd9a08 fix some accessibilty issues 2026-02-20 12:23:36 -08:00
inherentlee ae056c75bd built with last change 2026-02-20 12:01:30 -08:00
inherentlee 5c786b15d2 remove redundant text 2026-02-20 11:59:29 -08:00
inherentlee 2c3711fe1e woops 2026-02-20 11:57:19 -08:00
inherentlee f18e2f2078 woops i forgot the lang attribute lmao 2026-02-20 11:53:41 -08:00
inherentlee 9a566f99ab build 2026-02-20 08:46:50 -08:00
inherentlee 9db3d3b34c tweak navbar border width 2026-02-20 08:46:40 -08:00
inherentlee 9249a6e050 run build 2026-02-20 08:36:56 -08:00
inherentlee 7d1fe776c7 add related posts and update some styling 2026-02-20 08:36:46 -08:00
inherentlee c4b549bc75 update site 2026-02-20 08:02:52 -08:00
inherentlee 6203735ff8 note re if you're doing multiple widths 2026-02-20 08:01:41 -08:00
inherentlee 3848af101b don't let the live build overwrite the built files cause of the iamge handling 2026-02-19 22:20:03 -08:00
inherentlee 25f5d5897b new post on eleventy 2026-02-19 22:19:39 -08:00
inherentlee fc71c05327 let's keep good ol mogrify around 2026-02-19 21:13:56 -08:00
inherentlee d080981f2d remainder of site this should be fine right 2026-02-19 21:12:12 -08:00
inherentlee 778d323db9 img 2026-02-19 21:10:56 -08:00
273 changed files with 4750 additions and 126251 deletions

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
kind: pipeline
type: docker
name: default
trigger:
branch:
- main
steps:
- name: build
image: node:current
environment:
REPOSITORY: leecat.art-site
GIT_USER: inherentlee
GIT_TOKEN:
from_secret: GIT_TOKEN
commands:
- git config credential.helper '!f() { echo username=$GIT_USER; echo "password=$GIT_TOKEN"; };f'
- git submodule update --remote --init --merge
- npm install
- npm run build
- apt-get update && apt-get install -y rsync
- rsync -uavh _site/ $REPOSITORY --delete --exclude .git
- cd $REPOSITORY
- git checkout main
- git config --global --add safe.directory /drone/src/$REPOSITORY
- git add -A
- git commit -m "drone build $(TZ=':America/Los_Angeles' date)"
- git push
+3
View File
@@ -1,2 +1,5 @@
# npm
node_modules
# build
_site
+3
View File
@@ -0,0 +1,3 @@
[submodule "leecat.art-site"]
path = leecat.art-site
url = https://heckin.technology/inherentlee/leecat.art-site.git
+19 -1
View File
@@ -2,4 +2,22 @@
Lee Cattarin's personal website, v2. Built on Eleventy.
Not live yet.
## Install
```sh
npm i
# or
npm install
```
## Run locally
```sh
npm run dev
```
## Build website
```sh
npm run build
```
+69 -11
View File
@@ -2,33 +2,91 @@ import { DateTime } from "luxon";
export default function (eleventyConfig) {
// Return the keys used in an object
eleventyConfig.addFilter("getKeys", target => {
eleventyConfig.addFilter("getKeys", (target) => {
return Object.keys(target);
});
/* Exclude all posts with given URLs from a collection list */
eleventyConfig.addFilter(
"excludeFromCollection",
function (collection = [], urls = [this.ctx.page.url]) {
return collection.filter((post) => urls.indexOf(post.url) === -1);
},
);
/* Filter a collection by a set of tags, returning any that share one or more tags */
eleventyConfig.addFilter(
"filterByTags",
function (collection = [], ...requiredTags) {
return collection.filter((post) => {
return requiredTags.flat().some((tag) => post.data.tags.includes(tag));
});
},
);
/* Return n elements from a list */
eleventyConfig.addFilter("head", (collection = [], n) => {
if (!Array.isArray(collection) || collection.length === 0) {
return [];
}
if (n < 0) {
return collection.slice(n);
}
return collection.slice(0, n);
});
/* For <time> elements */
eleventyConfig.addFilter("htmlDateString", (dateObj) => {
return DateTime.fromJSDate(dateObj, { zone: "utc" }).toFormat('yyyy-LL-dd');
return DateTime.fromJSDate(dateObj, { zone: "utc" }).toFormat("yyyy-LL-dd");
});
/* What it says on the tin */
eleventyConfig.addFilter("randomize", function (array) {
// Create a copy of the array to avoid modifying the original
let shuffledArray = array.slice();
// Fisher-Yates shuffle algorithm
for (let i = shuffledArray.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[shuffledArray[i], shuffledArray[j]] = [
shuffledArray[j],
shuffledArray[i],
];
}
return shuffledArray;
});
/* Human-readable dates */
eleventyConfig.addFilter("readableDate", (dateObj, format, zone) => {
return DateTime.fromJSDate(dateObj, { zone: zone || "utc" })
.toLocaleString(DateTime.DATE_FULL);
eleventyConfig.addFilter("readableDate", (dateObj) => {
return DateTime.fromJSDate(dateObj, { zone: "utc" }).toLocaleString(
DateTime.DATE_FULL,
);
});
/* Filter out structural tags */
eleventyConfig.addFilter("removeBasicTags", (tags) => {
return tags.filter(tag => ["all", "posts", "gallery", "reference", "tagPagination"].indexOf(tag) === -1);
return tags.filter(
(tag) =>
[
"all",
"posts",
"gallery",
"reference",
"tagPagination",
"blur",
].indexOf(tag) === -1,
);
});
/* What it says */
eleventyConfig.addFilter("sortAlphabetically", strings =>
(strings || []).sort((b, a) => b.localeCompare(a))
/* What it says on the tin */
eleventyConfig.addFilter("sortAlphabetically", (strings) =>
(strings || []).sort((b, a) => b.localeCompare(a)),
);
/* Remove year from image filenames for OG metadata */
/* Remove year from image filenames for OG metadata file path */
eleventyConfig.addFilter("toOgFilename", (filename) => {
return filename.split("/")[1];
});
};
}
+24 -3
View File
@@ -1,7 +1,7 @@
<footer>
<ul>
<li>
<a href="/colophon" title="colophon" aria-label="colophon"
<a href="/colophon/"
{% if page.url == "/colophon/" %}aria-current="page"{% endif %}>
colophon
</a>
@@ -9,9 +9,9 @@
<li>
<a href="/" title="go home"
aria-label="go home | {{ metadata.title }} from {{ metadata.author }} in 2026"
aria-label="go home | {{ metadata.title }} from {{ metadata.author }}, copyright 2022-2026"
{% if page.url == "/" %}aria-current="page"{% endif %}>
{{ metadata.title }} from {{ metadata.author }} in 2026</a>
{{ metadata.title }} from {{ metadata.author }}, © 2022-2026</a>
</li>
<li>
@@ -21,4 +21,25 @@
</a>
</li>
</ul>
<fieldset id="theme">
<legend>color scheme</legend>
<input type="radio" id="theme-light" name="theme" value="light"/>
<label class="theme-light" for="theme-light">
<i class="fa-regular fa-sun" aria-hidden="true"></i>
light
</label>
<input type="radio" id="theme-auto" name="theme" value="auto" checked/>
<label class="theme-auto" for="theme-auto">
auto
</label>
<input type="radio" id="theme-dark" name="theme" value="dark"/>
<label class="theme-dark" for="theme-dark">
dark
<i class="fa-regular fa-moon" aria-hidden="true"></i>
</label>
</fieldset>
</footer>
+51
View File
@@ -0,0 +1,51 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
{% set pageTitle %}{{ title | safe }} | {{ metadata.title }}{% endset %}
<title>{{ pageTitle }}</title>
<meta name="description" content="{{ description or metadata.description }}">
<link rel="alternate" href="/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
<meta property="og:title" content="{{ pageTitle }}" />
<meta property="og:type" content="website" />
<meta property="og:description" content="{{ description or metadata.description }}" />
<meta property="og:site_name" content="{{ metadata.title }}" />
<meta property="og:url" content="{{ metadata.url }}{{ page.url }}" />
{% if image %}
<meta property="og:image" content="{{ metadata.url }}/img/{{ image.src | toOgFilename }}" />
<meta property="og:image:alt" content="{{ image.alt }}" />
{% else %}
<meta property="og:image" content="{{ metadata.url }}/favicon.ico" />
<meta property="og:image:alt" content="a teal bird icon" />
{% endif %}
<meta name="generator" content="{{ eleventy.generator }}">
<meta itemprop="ai-content-declaration:version" content="1.0.0">
<meta itemprop="ai-content-declaration:level" content="none">
{# Fonts #}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Mono:ital,wght@0,200..800;1,200..800&family=Atkinson+Hyperlegible+Next:ital,wght@0,200..800;1,200..800&display=swap" rel="stylesheet">
{# Icons #}
<script src="https://kit.fontawesome.com/884dded219.js" crossorigin="anonymous"></script>
{# Styles #}
<style>{% include "css/main.css" %}</style>
<style>{% include "css/nav.css" %}</style>
<style>{% include "css/pagefind.css" %}</style>
<style>{% include "css/highlighting.css" %}</style>
<style>{% include "css/print.css" %}</style>
<style>{% getBundle "css" %}</style>
{# Scripts #}
<script>{% include "js/theme.js" %}</script>
<script type="module">{% getBundle "js" %}</script>
{# Pagefind #}
<link href="/pagefind/pagefind-component-ui.css" rel="stylesheet">
<script src="/pagefind/pagefind-component-ui.js" type="module"></script>
+8 -4
View File
@@ -1,6 +1,5 @@
<header>
<a href="#main" id="skip" title="skip to main content" aria-label="skip to main content">
<a href="#main" id="skip" title="skip to main content">
<i class="fa-solid fa-forward" aria-hidden="true"></i> skip
</a>
@@ -9,8 +8,7 @@
{% for entry in collections.all | eleventyNavigation %}
<li>
<a href="{{ entry.url }}" title="{{ entry.data.label }}"
{% if entry.url == page.url %}aria-current="page"{% endif %}
aria-label="{{ entry.data.label }}">
{% if entry.url == page.url %}aria-current="page"{% endif %}>
<i class="{{ entry.data.icon }}" aria-hidden="true"></i>
<span class="menu-text">{{ entry.title }}</span>
</a>
@@ -19,4 +17,10 @@
</ul>
</nav>
<div class="dark searchbox" data-pf-theme="dark">
<pagefind-searchbox></pagefind-searchbox>
</div>
<div class="light searchbox">
<pagefind-searchbox></pagefind-searchbox>
</div>
</header>
+4 -38
View File
@@ -1,51 +1,17 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% set pageTitle %}{{ title }} | {{ metadata.title }}{% endset %}
<title>{{ pageTitle }}</title>
<meta name="description" content="{{ description or metadata.description }}">
<link rel="alternate" href="/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
<meta property="og:title" content="{{ title or metadata.title }}" />
<meta property="og:type" content="website" />
<meta property="og:description" content="{{ description or metadata.description }}" />
<meta property="og:site_name" content="{{ metadata.title }}" />
{% if image %}
<meta property="og:image" content="/img/{{ image.src | toOgFilename }}" />
<meta property="og:image:alt" content="{{ image.alt }}" />
{% endif %}
<meta name="generator" content="{{ eleventy.generator }}">
{# Fonts #}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Mono:ital,wght@0,200..800;1,200..800&family=Atkinson+Hyperlegible+Next:ital,wght@0,200..800;1,200..800&display=swap" rel="stylesheet">
{# Icons #}
<script src="https://kit.fontawesome.com/884dded219.js" crossorigin="anonymous"></script>
{# Styles #}
<style>{% include "css/main.css" %}</style>
<style>{% include "css/nav.css" %}</style>
<style>{% include "css/print.css" %}</style>
<style>{% getBundle "css" %}</style>
<script type="module">{% getBundle "js" %}</script>
{% include "head-content.njk" %}
</head>
<body>
{% include "header.njk" %}
<main id="main">
{{ content | safe }}
<hr>
</main>
{% include "footer.njk" %}
<!-- This page `{{ page.url }}` was built on {% currentBuildDate %} -->
<body>
</body>
</html>
+1 -1
View File
@@ -3,7 +3,7 @@ layout: base.njk
---
{% js %}{% include "node_modules/@zachleat/heading-anchors/heading-anchors.js" %}{% endjs %}
<heading-anchors content="<i class='fa-solid fa-anchor'></i>">
<heading-anchors content="<i class='fa-solid fa-anchor'></i>" data-pagefind-body>
<h1>{{ title }}</h1>
{{ content | safe }}
+13
View File
@@ -0,0 +1,13 @@
---
layout: post.njk
---
{% css %}{% include "css/post-toc.css" %}{% endcss %}
<aside id="toc">
<details>
<summary><h2>table of contents</h2></summary>
{{ content | toc | safe }}
</details>
</aside>
{{ content | safe }}
+21 -3
View File
@@ -2,11 +2,13 @@
layout: base.njk
---
{% css %}{% include "css/post.css" %}{% endcss %}
{% css %}{% include "css/highlighting.css" %}{% endcss %}
{% css %}{% include "css/lists.css" %}{% endcss %}
{% css %}{% include "css/modal.css" %}{% endcss %}
{% js %}{% include "node_modules/@zachleat/heading-anchors/heading-anchors.js" %}{% endjs %}
{% js %}{% include "js/modal.js" %}{% endjs %}
<heading-anchors content="<i class='fa-solid fa-anchor'></i>">
<article>
<article data-pagefind-body>
<h1>{{ title }}</h1>
<div class="post-metadata">
@@ -29,7 +31,11 @@ layout: base.njk
</div>
{% if image %}
<img src="/img/{{ image.src }}" alt="{{ image.alt }}">
<dialog closedby="any" aria-label="image modal" tabindex="-1">
<button class="close-dialog" autofocus aria-label="close the image modal">&times;</button>
<img class="modal-img" src="/img/{{ image.src }}" alt="{{ image.alt }}">
</dialog>
<img class="hero" src="/img/{{ image.src }}" alt="{{ image.alt }}">
{% endif %}
{{ content | safe }}
@@ -43,4 +49,16 @@ layout: base.njk
{% set newerTitle = newerPost.data.title %}
{% set inPost = true %}
{% include "pagination.njk" %}
<hr>
{% set relevantTags = tags | removeBasicTags %}
{% set postlist = collections.posts | filterByTags(relevantTags) | excludeFromCollection([page.url, olderHref, newerHref]) | randomize | head(3) %}
{% if postlist.length %}
<section class="related-posts">
<h2 data-ha-exclude>related posts</h2>
{% include "postlist.njk" %}
</section>
{% endif %}
</heading-anchors>
-6
View File
@@ -1,6 +0,0 @@
---
layout: base.njk
---
{% css %}{% include "css/resume.css" %}{% endcss %}
{{ content | safe }}
+21
View File
@@ -0,0 +1,21 @@
<!doctype html>
<html lang="en">
<head>
{% include "head-content.njk" %}
<meta http-equiv="refresh" content="0; url=/tags/{{ tag }}">
</head>
<body>
{% include "header.njk" %}
<main id="main">
<h1>{{ title }}</h1>
{{ content | safe }}
</main>
{% include "footer.njk" %}
<!-- This page `{{ page.url }}` was built on {% currentBuildDate %} -->
<body>
</html>
+4 -3
View File
@@ -2,15 +2,16 @@
{% for post in postlist %}
<li class="post">
<a class="postlink" href="{{ post.url }}">
<h2 data-ha-exclude>{{ post.data.title }} {% if "blur" in post.data.tags %}(mature){% endif %}</h2>
{% if post.data.image %}
<img src="/img/{{ post.data.image.src }}" alt="{{ post.data.image.alt }}">
{% endif %}
<h2>{{ post.data.title }}</h2>
<ul class="postlist-tags">
{% for tag in post.data.tags | removeBasicTags %}
<li>{{ tag }}</li>
{% endfor %}
</ul>
<img src="/img/{{ post.data.image.src }}" alt="{{ post.data.image.alt }}"
{% if "blur" in post.data.tags %}class="blur"{% endif %}>
{% endif %}
</a>
</li>
{% endfor %}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
-144
View File
@@ -1,144 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title>hello hello</title>
<subtitle>Lee Cattarin... on the internet!</subtitle>
<link href="https://leecat.art/feed.xml" rel="self" />
<link href="https://leecat.art/" />
<updated>2026-02-19T21:09:51Z</updated>
<id>https://leecat.art/</id>
<author>
<name>Lee Cattarin</name>
<email>lee.cattarin@gmail.com</email>
</author>
<entry>
<title>screen reader optimizations</title>
<link href="https://leecat.art/screen-reader-optimizations/" />
<updated>2026-02-19T21:09:51Z</updated>
<id>https://leecat.art/screen-reader-optimizations/</id>
<content type="html">&lt;h2 id=&quot;context&quot;&gt;context&lt;/h2&gt;
&lt;p&gt;recently, I&#39;ve been working on a &lt;a href=&quot;https://inherentlee.codeberg.page/spoonfairies/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;website for a project called spoonfairies&lt;/a&gt;. On the providers page, we list a series of names along with their pronouns, location, and services offered. Visually, it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://leecat.art/img/spoonfairies-provider.png&quot; alt=&quot;A provider listing from spoonfairies. On the top row of text, it shows the provider&#39;s name in large purple text, then their pronouns in slightly opaque white and slightly smaller font, then aligned on the right, a map pin emoji and their general location in standard size white text. On the second row of text, it lists a few services the provider offers, comma separated.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;147&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;pronouns&quot;&gt;pronouns&lt;/h2&gt;
&lt;p&gt;at first, all three pieces of information in the top row had no extra styling - it was just a line of text with the same color and size throughout. The location bit also didn&#39;t exist yet, so we&#39;re going to briefly ignore it. Screenreader testing (with NVDA, specifically) informed me that, when reading through a long list of providers, parentheses become &lt;em&gt;very&lt;/em&gt; irritating. Imagine hearing the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lorem Ipsum left parentheses she slash her right parentheses web accessiblity webdev. Dolor Sit left parentheses they slash them right parentheses housecleaning. Amet Consectetur left parentheses he slash him right parentheses webdev spreadsheets software.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...ad nauseam. Kinda irritating.&lt;/p&gt;
&lt;h3 id=&quot;the-fix&quot;&gt;the fix&lt;/h3&gt;
&lt;p&gt;put the pronouns in a span that provides special styling, and use &lt;code&gt;::before&lt;/code&gt; and &lt;code&gt;::after&lt;/code&gt; to apply parentheses.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/providers/lorem-ipsum&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
Lorem Ipsum
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pronouns&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;she/her&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.pronouns::before&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(&quot;&lt;/span&gt; / &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.pronouns::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;)&quot;&lt;/span&gt; / &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;the slash is the magic there.&lt;/strong&gt; The string before the slash indicates the visual content, and the string after the slash is the alternative text content. I went happily on my way.&lt;/p&gt;
&lt;p&gt;plus, this is neat - now I can style the pronouns separately. Let&#39;s make them the standard text color rather than the link color, and a bit smaller, and a smidge opaque... nice.&lt;/p&gt;
&lt;h2 id=&quot;location&quot;&gt;location&lt;/h2&gt;
&lt;p&gt;ooh, time to implement locations! I did my same ol&#39; trick.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/providers/lorem-ipsum&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
Lorem Ipsum
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pronouns&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;she/her&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Tacoma&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.location::before&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;📍&quot;&lt;/span&gt; / &lt;span class=&quot;token string&quot;&gt;&quot;is based out of&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I even added actual alternative text rather than an empty string to provide some context. Pronouns, I figured, could exist without much context, as it&#39;s pretty common for them to follow directly after names in introductions, but location isn&#39;t as much of a given.&lt;/p&gt;
&lt;p&gt;again, style em up nice, more of a standard text look, right-aligned. Cool.&lt;/p&gt;
&lt;h2 id=&quot;a-bigger-problem-than-parentheses&quot;&gt;a bigger problem than parentheses&lt;/h2&gt;
&lt;p&gt;...then I did some screen reader testing. Which I should have done directly after the pronouns bit. Turns out, I wasn&#39;t thrilled with what the &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;s did.&lt;/p&gt;
&lt;p&gt;at least with fairly default settings in NVDA, the &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;s broke up the way the link was read out. Suddenly, I was getting:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;visited link Lorem Ipsum visited link she slash her visited link Tacoma&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;this is all one link, mind you. The &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag isn&#39;t broken into three links. But the &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;s apparently break up the screen reader output anyway (in NVDA, that&#39;s a continual caveat).&lt;/p&gt;
&lt;p&gt;ooookay... what next?&lt;/p&gt;
&lt;h3 id=&quot;total-overhaul&quot;&gt;total overhaul&lt;/h3&gt;
&lt;p&gt;I moved away from my &lt;code&gt;content&lt;/code&gt; approach entirely (well, I kept it around as a failsafe, but it&#39;s not running the show now). Instead, I switched over to an &lt;code&gt;aria-label&lt;/code&gt; for the whole link.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/providers/lorem-ipsum&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Lorem Ipsum she/her is based out of Tacoma&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
Lorem Ipsum
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pronouns&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;she/her&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Tacoma&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(technically, all this is templated to hell and back. I would hope that&#39;s obvious given I&#39;m talking about &lt;em&gt;lists&lt;/em&gt; of these entries.)&lt;/p&gt;
&lt;p&gt;now, after more screen reader testing, it reads out smoothly. The &lt;code&gt;aria-label&lt;/code&gt; precludes the actual link text and cleanly says what needs to be said, with nothing breaking up the text and the whole thing easily recognized as one link. &lt;em&gt;And&lt;/em&gt; I&#39;ve got my fancy styling. Sweet.&lt;/p&gt;
</content>
</entry>
<entry>
<title>crow</title>
<link href="https://leecat.art/crow/" />
<updated>2026-02-09T00:00:00Z</updated>
<id>https://leecat.art/crow/</id>
<content type="html"></content>
</entry>
<entry>
<title>charlie the alpaca handspun</title>
<link href="https://leecat.art/charlie-the-alpaca-handspun/" />
<updated>2026-02-05T00:00:00Z</updated>
<id>https://leecat.art/charlie-the-alpaca-handspun/</id>
<content type="html">&lt;p&gt;Fiber from Circle R Ranch. 100% alpaca, from Charlie the alpaca.&lt;/p&gt;
</content>
</entry>
<entry>
<title>ruby the alpaca handspun</title>
<link href="https://leecat.art/ruby-the-alpaca-handspun/" />
<updated>2026-01-27T00:00:00Z</updated>
<id>https://leecat.art/ruby-the-alpaca-handspun/</id>
<content type="html">&lt;p&gt;Fiber from Circle R Ranch. 100% alpaca, from Ruby the alpaca.&lt;/p&gt;
</content>
</entry>
<entry>
<title>hand-dyed gold handspun</title>
<link href="https://leecat.art/hand-dyed-gold-handspun/" />
<updated>2026-01-24T00:00:00Z</updated>
<id>https://leecat.art/hand-dyed-gold-handspun/</id>
<content type="html">&lt;p&gt;Fiber from &lt;a href=&quot;https://paradisefibers.com&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;Paradise Fibers&lt;/a&gt;. 70% merino/30% nylon. Hand-dyed by me.&lt;/p&gt;
</content>
</entry>
<entry>
<title>spinner&#39;s dream handspun</title>
<link href="https://leecat.art/spinners-dream-handspun/" />
<updated>2026-01-18T00:00:00Z</updated>
<id>https://leecat.art/spinners-dream-handspun/</id>
<content type="html">&lt;p&gt;Fiber from &lt;a href=&quot;https://paradisefibers.com&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;Paradise Fibers&lt;/a&gt;. 40% merino/20% alpaca/20% camel/20% mulberry silk. Scrumptiously soft.&lt;/p&gt;
</content>
</entry>
<entry>
<title>rambouillet handspun</title>
<link href="https://leecat.art/rambouillet-handspun/" />
<updated>2026-01-18T00:00:00Z</updated>
<id>https://leecat.art/rambouillet-handspun/</id>
<content type="html">&lt;p&gt;Fiber from &lt;a href=&quot;https://woolgatherings.com&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;Woolgatherings&lt;/a&gt;. 100% rambouillet. Hand-dyed!&lt;/p&gt;
</content>
</entry>
<entry>
<title>fire &amp; ice handspun</title>
<link href="https://leecat.art/fire-and-ice-handspun/" />
<updated>2026-01-18T00:00:00Z</updated>
<id>https://leecat.art/fire-and-ice-handspun/</id>
<content type="html">&lt;p&gt;Fiber from &lt;a href=&quot;https://www.etsy.com/shop/JakiraFarms&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;Jakira Farms&lt;/a&gt; in Fire &amp;amp; Ice colorway. 100% merino.&lt;/p&gt;
</content>
</entry>
<entry>
<title>dyeing fiber</title>
<link href="https://leecat.art/dyeing-fiber/" />
<updated>2026-01-18T00:00:00Z</updated>
<id>https://leecat.art/dyeing-fiber/</id>
<content type="html">&lt;p&gt;hand-dyed with acid dyes&lt;/p&gt;
</content>
</entry>
<entry>
<title>coral reef handspun</title>
<link href="https://leecat.art/coral-reef-handspun/" />
<updated>2026-01-18T00:00:00Z</updated>
<id>https://leecat.art/coral-reef-handspun/</id>
<content type="html">&lt;p&gt;Fiber from &lt;a href=&quot;https://www.etsy.com/shop/JakiraFarms&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;Jakira Farms&lt;/a&gt; in Coral Reef colorway. 100% merino.&lt;/p&gt;
</content>
</entry>
</feed>
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
Loaded 100 of 273 files, more files were not shown because too many files have changed in this diff. Show more