<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>Gabrielle Wee</title>
	<subtitle>Gabrielle Wee’s personal blog and photo journal.</subtitle>
	<link href="https://gabriellew.ee/posts/feed.xml" rel="self"/>
	<link href="https://gabriellew.ee"/>
	<updated>2023-08-22T00:00:00Z</updated>
	<id>https://gabriellew.ee</id>
	<author>
		<name>Gabrielle Wee</name>
		<email>mail@gabriellew.ee</email>
	</author>
	
	<entry>
		<title>Hello, world!</title>
		<link href="https://gabriellew.ee/posts/2021/07/21/hello-world/"/>
		<updated>2021-07-21T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2021/07/21/hello-world/</id>
		<content type="html">
			<![CDATA[
				<p>Finally got this thing up and running. It’s late and I’m exhausted from churning this out in a couple of days, so I’ll write a proper introduction tomorrow. ✌🏼</p>
			]]>
		</content>
	</entry>
	
	<entry>
		<title>Setting up shop.</title>
		<link href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/"/>
		<updated>2021-07-26T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2021/07/26/setting-up-shop/</id>
		<content type="html">
			<![CDATA[
				<p>It’s been a while since I’ve really done a proper update on this website. I’d like to talk through the last few years of this site, and what I did to make this current iteration happen.</p><h2>2017 version <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#2017-version" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Previously, I hosted this website on <a href="https://pages.github.com/">Github Pages</a> and used a static site generator called <a href="https://github.com/eudicots/Cactus">Cactus</a> to build my files.</p><figure><figcaption>Previous website home page</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2021-07-26-website-home.png" alt="Previous website home page" /></picture></figure><figure><figcaption>Previous website project page information</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2021-07-26-website-project-top.png" alt="Previous website project page information" /></picture></figure><figure><figcaption>Previous website project page styles</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2021-07-26-website-project-middle.png" alt="Previous website project page styles" /></picture></figure><p>I was (and still am) really proud of this portfolio. It was my first big project out of college, and it got featured a few times on various sites. I experimented with different layout techniques and for the first time, created an extensive set of my own icons and thumbnails.</p><figure><figcaption>Website thumbnail icons I created for my portfolio</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2021-07-26-portfolio-icons.png" alt="Website thumbnail icons I created for my portfolio" /></picture></figure><p>After this, I didn’t update my portfolio for almost four years. I started working at <a href="https://apple.com/">Apple</a> in 2017 as a vendor and transitioned to full-time in 2018, so there really wasn’t any need to change things up. I also really liked the design and couldn’t think of how to change it.</p><h2>2020 version <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#2020-version" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Finally, last year, during the height of the pandemic, I decided I needed to change things up. I still didn’t have a clue what it should look like, but my work was badly outdated, so I decided to just make it more of a landing page with links to websites that I <em>was</em> updating regularly.</p><figure><figcaption>Landing page version</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2021-07-26-website-v4.png" alt="Landing page version" /></picture></figure><h2>Current version <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#current-version" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>This year is the year I decided to build a full website again. I really wanted something that not only highlighted my work as a developer but also included my hobbies and other non-work activities. I’ve also been strongly nostalgic for the whacky, quirky Geocities-type websites that used to exist before everything became smooth and clean and minimal. Lastly, I wanted my website to be completely functional without Javascript.</p><p>I came up with a design that is busy but organized. Each section represents one of my interests and has its own styles and colors. There’s also light and dark versions of this site. I chose <a href="http://cnap.graphismeenfrance.fr/faune/en.html">Faune</a> as the main font because I really loved the unusual-looking italics.</p><figure><figcaption>Current website</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2021-07-26-current-website.png" alt="Current website" /></picture></figure><p>This site is built with <a href="http://11ty.dev/">Eleventy</a> and is hosted on Netlify. I chose Netlify because of the ease of use and plethora of configuration options and plugins. Eleventy is easy to learn and has the most flexibility out of the static site generators I was looking at.</p><h2>No-JS <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#no-js" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Something I’m really proud of is the no-JS functionality. On my visual pages (<a href="https://gabriellew.ee/photography/">Photography</a>, <a href="https://gabriellew.ee/graphic/">Graphic</a>, and <a href="https://gabriellew.ee/art/">Art</a>), I have a popup for each image that gives you more information when the image is clicked. The trigger is a checkbox with multiple labels.</p><figure><figcaption>CSS-only photo info popup; doesn’t include Javascript.</figcaption><iframe src="https://codepen.io/gabriellewee/embed/rNWZJgy"></iframe></figure><p>I used a bit of Javascript to enhance the trigger. It creates some additional functionality like being able to tab through the triggers and scroll to the correct image when the trigger is focused.</p><pre><code>buttons.forEach(button=>{let info = button.nextElementSibling.nextElementSibling.nextElementSibling;let name = button.getAttribute("id").slice(0, -5);let expand = info.querySelector(".grid-expand");info.setAttribute("aria-hidden", "false");button.addEventListener("focus", e => {document.getElementById(name).scrollIntoView({ behavior: "smooth" });});button.addEventListener("keypress", e => {if (e.key === "Enter") {if(button.checked){button.checked = false;expand.tabIndex = -1;info.setAttribute("aria-hidden", "true");} else {button.checked = true;expand.tabIndex = 0;info.setAttribute("aria-hidden", "false");}}});});</code></pre><p>Another no-JS component is the lightbox. I found this ingenious solution that uses <code>:target</code> to trigger the lightbox activation.</p><figure><figcaption>Pure CSS Lightbox by <a href="https://codepen.io/gschier">Gregory Schier</a></figcaption><iframe src="https://codepen.io/gabriellewee/embed/HCoqh"></iframe></figure><p>I styled it with some basic CSS transitions and a loading icon, then added enhanced Javascript functionality on top to cycle through images and use keyboard shortcuts. The background is separate from the image so that it doesn’t fade in and out when you use the arrow key to tab to another image.</p><figure><figcaption>Click on this sunset photo to try out the lightbox</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2021-07-26-home.jpg" alt="Click on this sunset photo to try out the lightbox" /></picture></figure><h2>Eleventy <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#eleventy" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>I really love how easy it is to organize your files and code any way you want with Eleventy. Each of the visual homepage sections and my blog are Eleventy collections. Here are a couple of Eleventy plugins/filters/shortcodes that I found useful:</p><p class="caption">Limit the number of items in an Eleventy collection</p><pre><code>eleventyConfig.addFilter("limit", (array, limit) => {return array.slice(0, limit);});</code></pre><p class="caption"><a href="https://github.com/11ty/eleventy/issues/410#issuecomment-462821193">Show post excerpt for blog collection</a></p><pre><code>eleventyConfig.addShortcode('excerpt', post => {if (!post.hasOwnProperty(’templateContent')) {console.warn('❌ Failed to extract excerpt: Document has no property `templateContent`.');return;}const excerptSeparator = '&lt;!--more-->';const content = post.templateContent;if (content.includes(excerptSeparator)) {return content.substring(0, content.indexOf(excerptSeparator)).trim();}const pCloseTag = '&lt;/p>';if (content.includes(pCloseTag)) {return content.substring(0, content.indexOf(pCloseTag) + pCloseTag.length);}return content;});</code></pre><h2>Previous versions <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#previous-versions" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>These days, I’m loath to lose any previous website content, even content that is no longer relevant or even embarrassing. I decided to upload an archive of as many versions of my website as possible. The only one I’m currently missing is the very first version that was built in Wordpress and hosted by Hostgator (I wasn’t using Github for versioning at that time), but the posts are preserved in the next version. I’m even working on getting old posts from previous blogs (Xanga, Tumblr, etc) onto this blog.</p><ol><li><a href="https://gabriellew.ee/v1/">Version 1</a></li><li><a href="https://gabriellew.ee/v2/">Version 2</a></li><li><a href="https://gabriellew.ee/v3/">Version 3</a></li><li><a href="https://gabriellew.ee/v4/">Version 4</a></li></ol><h2>Blog <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#blog" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Last but not least, I have this blog. The layout I’m using for the other pages wasn’t really conducive to a blog format, so I created an entirely separate set of styles. One of the things I really love about this site is the font, <a href="https://www.recursive.design/">Recursive</a>. It’s a variable font that I’m using for every single part of the blog site, including the code snippets. You can even animate between the proportional and monospace versions!</p><h2>That’s all, folks. <a class="direct-link" href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#that-s-all-folks" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>It’s a bit messy, and I have more direct commits than I should, but if you want to check out the code for this website, you can <a href="https://github.com/gabriellewee/portfolio">view the repo</a>.</p><p>I keep making small changes here and there, but the heavy lifting is done. I’m hoping to write here more regularly in the future!</p>
			]]>
		</content>
	</entry>
	
	<entry>
		<title>Mourning online.</title>
		<link href="https://gabriellew.ee/posts/2022/03/11/mourning-online/"/>
		<updated>2022-03-11T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2022/03/11/mourning-online/</id>
		<content type="html">
			<![CDATA[
				<p>Late last year, my paternal grandmother passed away. She was an incredible woman, flaws and all. I wrote a short eulogy for her funeral.</p><blockquote><p>One of my earliest memories of my grandmother was when I was about five years old. My parents had left me at her house for a few hours, and upon returning, found me hiding behind the sofa. They asked me what was wrong, and I told them I didn’t want to eat anymore. Ngin Ngin had fed me so much that I had finally had enough and had to remove myself from the situation.</p><p>That was how Ngin Ngin was. Whenever I called or visited, she always greeted me by asking me if I wanted food. “Hoo mm oo” was her favorite phrase with me. “Do you want this?” And she would wave some delicious home cooked food in front of my face. One time I told her how much I loved her fu jook soup, and that ended up being the only soup she’d make for me for the next fifteen years.</p><p>I don’t really speak Toisan, her dialect, and she didn’t really speak English, but we still managed to communicate. I would sit with her for hours while she painstakingly told her stories to me. About traveling to Hong Kong and the US, about her village in China and the famine she suffered though, about her struggles to raise her children by herself. She always emphasized that despite her struggles, God had blessed her with everything in her life.</p><p>She always reminded me how much she loved me and would giggle whenever I hugged her or kissed her cheek. Even at her last, she was smiling as I held her hand and told her I loved her.</p><p>I love you, Ngin Ngin, and I look forward to one day seeing you again in Heaven.</p></blockquote><!--more--><figure><figcaption>Me and Ngin Ngin</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-11-baby.jpg" alt="Me and Ngin Ngin" /></picture></figure><figure><figcaption>Me and Ngin Ngin visiting Ye Ye</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-11-toddler.jpg" alt="Me and Ngin Ngin visiting Ye Ye" /></picture></figure><figure><figcaption>Me and Ngin Ngin at one of her recent birthdays</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-11-adult.jpg" alt="Me and Ngin Ngin at one of her recent birthdays" /></picture></figure><p>I miss Ngin Ngin a lot. I didn’t realize what a enormous rift her passing would leave in my life. Even writing about her now is still painful. I’m learning, slowly, to let myself grieve.</p><hr /><p>One of the things I never really thought about before she passed away was <em>mourning online</em>. I haven’t really had very many people close to me pass away in the recent years, and the few I knew of had some sort of social media presence where people could gather and share memories. My grandmother could barely operate a DVD player — there was no way she could manage Facebook or anything of the kind.</p><p>My family ended up asking me to create a website memorializing her. I thought this would be a quick and easy task, but it’s actually really difficult to find what I was looking for:</p><ol><li>A minimal page that included a place for her obituary and memorial video</li><li>A self-moderated guestbook that anybody could sign without social media</li><li>Inexpensive or free to use</li></ol><p>Most of the memorial websites I came across were not suitable for what I wanted. Many were outdated and looked like they were built twenty years ago. Others were free but were overwhelming and had too much information. Some wanted around $100 USD up front to unlock features and others had a monthly subscription.</p><p>I knew that I could make something better for Ngin Ngin, something that wouldn’t burden my family with constant fees and bloated extras. So here is what I came up with.</p><h2>Setup <a class="direct-link" href="https://gabriellew.ee/posts/2022/03/11/mourning-online/#setup" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>I decided to use my current setup that I’m working with on my personal website. It’s simple and straightforward — I built the site in <a href="https://www.11ty.dev/">Eleventy</a>, stored it in <a href="https://github.com/">Github</a>, and deployed it to <a href="https://www.netlify.com/">Netlify</a>.</p><h2>Guestbooks and Netlify Forms <a class="direct-link" href="https://gabriellew.ee/posts/2022/03/11/mourning-online/#guestbooks-and-netlify-forms" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>I really wanted to avoid using third-party software for the guestbook, so I decided to try out <a href="https://www.netlify.com/products/forms/">Netlify Forms</a>. The setup was a little complicated, but I figured it out in the end.</p><p>First, I set up the forms HTML in my template with spam filters. The <a href="https://docs.netlify.com/forms/setup/">Netlify docs</a> have more detailed information on how to customize your form.</p><pre><code>&lt;form name="Guestbook" method="POST" data-netlify="true">&lt;ul>&lt;li class="guest-name">&lt;fieldset class="line">&lt;input required id="name" type="text" name="name" placeholder=" "/>&lt;label for="name">Name*&lt;/label>&lt;hr/>&lt;/fieldset>&lt;/li>&lt;li class="guest-email">&lt;fieldset class="line">&lt;input required id="email" type="email" name="email" placeholder=" "/>&lt;label for="email">Email*&lt;/label>&lt;hr/>&lt;/fieldset>&lt;/li>&lt;li class="guest-message">&lt;fieldset>&lt;textarea required id="message" name="message" rows="5" placeholder=" ">&lt;/textarea>&lt;label for="message">Message*&lt;/label>&lt;/fieldset>&lt;/li>&lt;li class="guest-photo">&lt;fieldset>&lt;label for="photo">Add photo (optional)&lt;/label>&lt;input id="photo" name="file" type="file" accept="image/*" placeholder=" "/>&lt;/fieldset>&lt;/li>&lt;li hidden>&lt;fieldset class="line">&lt;input id="bots" name="bot-field"/>&lt;label for="bots">Leave blank&lt;/label>&lt;hr/>&lt;/fieldset>&lt;/li>&lt;li class="guest-captcha">&lt;div data-netlify-recaptcha="true">&lt;/div>&lt;/li>&lt;li class="guest-submit">&lt;button type="submit">Send&lt;/button>&lt;/li>&lt;/ul>&lt;/form></code></pre><p>Next, I installed Eleventy Fetch with <code>npm install @11ty/eleventy-fetch</code>. Then, I created a JS file in <code>_data/</code> that grabs the form data.</p><ol><li>You can find your Netlify site ID by going to <code>Site Settings &gt; General &gt; Site Details &gt; Site Information &gt; API ID</code>.</li><li>You can find your Netlify form ID by going to <code>Forms &gt; Active forms &gt; (your form)</code> and copying the long string at the end of the URL.</li><li>You can create a personal access token in your <a href="https://app.netlify.com/user/applications?_ga=2.201187694.1144438264.1647038881-1877924727.1646553096#personal-access-tokens">Applications settings</a>.</li></ol><pre><code>const Cache = require('@11ty/eleventy-fetch');/** * Grabs the remote data and returns back an array of objects * * @returns {Array} Empty or array of objects */module.exports = async () => {try {let url = "https://api.netlify.com/api/v1/sites/{SITE_ID}/forms/{FORM_ID}/submissions";/* This returns a promise */return Cache(url, {duration: '1d', // 1 daytype: 'json',fetchOptions: {headers: {'Authorization': "Bearer {ACCESS_TOKEN}"}}});} catch(e) {return [];}};</code></pre><p>The last part was setting up the HTML for the form submissions, with a couple of small Eleventy filters for the date.</p><pre><code>{% for guest in guests %}&lt;section>&lt;time datetime="{{guest.created_at|htmlDateString}}">{{guest.created_at|readableDataDate}}&lt;/time>&lt;figure>&lt;figcaption>&lt;cite>&lt;h3>{{guest.data.name}}&lt;/h3>&lt;/cite>&lt;/figcaption>&lt;blockquote>{{guest.data.message}}&lt;/blockquote>&lt;/figure>&lt;picture>&lt;img src="{{guest.data.file.url}}" alt="">&lt;/picture>&lt;/section>{% endfor %}</code></pre><h2>Video <a class="direct-link" href="https://gabriellew.ee/posts/2022/03/11/mourning-online/#video" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>The last part of putting the site together was formatting and uploading my grandmother’s memorial video. This took the longest — I had to gather over 70 years worth of old photos, organize them, scan them, and put them into a video. I did this with <a href="https://support.apple.com/guide/mac-help/scan-images-documents-a-scanner-mac-mh28032/mac">Apple’s scan utility</a>, Photoshop (to clean them up a bit), and Final Cut Pro (for the video itself). You can substitute Final Cut Pro with iMovie or the video editing software of your choice.</p><p>I chose not to host the video on YouTube or other sites, so the difficult part was getting the video to work on the website. I had to reduce the size to something that could load on a mobile device. I managed to get it down to about 40mb — which is still really large — but I figured it’s the only large media on the site and it’s not necessary to load it to use the site. I installed <a href="https://ffmpeg.org/">FFmpeg</a> and used it to reduce and convert my video via command line.</p><pre><code>ffmpeg -y -i video.mov -c:v libx264 -crf 30 -profile:v high -movflags +faststart -s 1280:720 video.mp4</code></pre><p>In order to upload the video file, I had to enable <a href="https://git-lfs.github.com/">Git LFS</a>, <a href="https://docs.netlify.com/cli/get-started/">Netlify CLI</a>, and <a href="https://docs.netlify.com/large-media/setup/">Netlify Large Media</a>. I had a bit of trouble getting it to all work together, but definitely installing Netlify CLI globally helped.</p><p>Once I had the video uploaded, I could finally put it on the site. I know that <code>preload=&quot;metadata&quot;</code> is only really a <em>suggestion</em>, but it’s better than nothing <code>¯\_(ツ)_/¯</code></p><pre><code>&lt;video width="1280" height="720" controls preload="metadata" poster="poster.jpg">&lt;source src="video.mp4" type="video/mp4">&lt;/video></code></pre><h2>Conclusion <a class="direct-link" href="https://gabriellew.ee/posts/2022/03/11/mourning-online/#conclusion" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>I threw together this website the week before my grandmother’s funeral. It was a madwoman’s dash to the finish line, and yet I’m proud of the work I did. I’m also happy that I was able to put it together in a way that will be easy to maintain for my family — I moderate the guestbook submissions through Netlify and all they have to pay for is the domain name — $12 a year, much more inexpensive than the other monthly subscriptions that don’t include a domain name. I don’t know if anybody has needs as specific as mine, but hopefully this helps someone out there.</p>
			]]>
		</content>
	</entry>
	
	<entry>
		<title>Brain fog.</title>
		<link href="https://gabriellew.ee/posts/2022/03/18/brain-fog/"/>
		<updated>2022-03-18T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2022/03/18/brain-fog/</id>
		<content type="html">
			<![CDATA[
				<p>December and January were rough months for me. Work was stressful, my grandmother passed away, and then in January I suffered from debilitating migraines for three straight weeks. I think it was the culmination of all the anxiety and stress I was holding inside.</p><p>Those three weeks passed like a fever dream. I would get up from bed to go lay on the couch, and throw back Tylenol and Excedrin every few hours. My moans of pain became so constant that I almost didn’t notice them anymore. I went to the ER once and they pumped me full of Tylenol and Benadryl. My dreams were filled with monsters who lurked in the shadows and devoured people. I cried constantly. I threw up almost everything I ate. We kept a bucket next to me at all times along with a basket full of meds.</p><figure><figcaption>The photo I sent to my family when I went to the ER</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-18-er-iv.jpg" alt="The photo I sent to my family when I went to the ER" /></picture></figure><figure><figcaption>My cat cuddling me one morning while I was sick in bed</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-18-cat.jpg" alt="My cat cuddling me one morning while I was sick in bed" /></picture></figure><p>Sounds were especially painful. Everything was loud and echoed uncontrollably through my brain. I could literally hear music throughout the night even though there was almost complete silence. Actually listening to music was painful and I avoided it as much as I could.</p><p>Visuals weren’t any better — I felt like I was hallucinating. Dark corners seemed to hold the monsters I dreamed about. I kept getting aura-like symptoms — the precursor to migraines — but I couldn’t tell at the time because all the migraines and auras and symptoms blended together. I felt like I had a permanent large sunspot obscuring all of my vision. I’d regularly see cracks of light all over my otherwise blurry vision.</p><p>Finally, at the beginning of February, my migraines began to subside. I was fortunate enough to have a sympathetic manager and team lead who gave me all the time off I needed, and loved ones to take care of me while I was sick. Without them, I don’t know where I’d be.</p><p>Even the symptoms of recovery were awful. I felt like my brain was resetting itself. All my senses were numbed (perhaps because they were so intense while I was sick). I couldn’t taste, smell, or feel anything. My ears felt muffled. A hot shower felt lukewarm. Even holding my cat felt like nothing but weight.</p><p>I also went through a period of excruciating, extreme emotions. One day I would be wildly euphoric, giggling uncontrollably and dancing around the house. The next day, I would sob uncontrollably and feel like I was falling back into migraine territory. The swings were unpredictable and intense — I felt like my brain was testing out what range I had left after being sick.</p><p>The worst, though, was the brain fog. I prided myself on being a quick thinker, always ready with a riposte, and fast with my code. I couldn’t even look at a basic HTML page and understand what was going on. My favorite activity, reading, was impossible. People would ask me questions and it would take me several minutes to respond instead of seconds. I felt like a part of myself had been stolen by the migraines.</p><p>I truly believed I was going insane that entire month. I can look back now and understand that I was under extreme duress, but at the time, I felt like my body was betraying me. I kept trying to work, kept trying to live my normal life. It’s only now, a month and a half later, that the last of my recovery symptoms is starting to disappear. I still get the massive sun spot when I move too fast, and I have a sensitive spot on my head right where it hurt.</p><p>The entire experience has left me grateful for my current life. I’ve started to be able to enjoy my hobbies again. I’m putting up artwork on my walls, trying out new makeup, even coding. I’m finally myself again, and even though I know the migraines will probably be a reoccuring problem, hopefully this experience has left me prepared for what will come.</p><figure><figcaption>Trying out neon green and pink makeup and velcro roller hair</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-18-selfie.jpg" alt="Trying out neon green and pink makeup and velcro roller hair" /></picture></figure><figure><figcaption>Art poster by JAW Cooper from a Kickstarter I supported</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-18-jaw-cooper.jpg" alt="Art poster by JAW Cooper from a Kickstarter I supported" /></picture></figure><figure><figcaption>Original art by soeymilk that I purchased at Comic Con</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-03-18-soeymilk.jpg" alt="Original art by soeymilk that I purchased at Comic Con" /></picture></figure>
			]]>
		</content>
	</entry>
	
	<entry>
		<title>Things that make me happy.</title>
		<link href="https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/"/>
		<updated>2022-07-20T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/</id>
		<content type="html">
			<![CDATA[
				<p>Because I was sick <a href="https://gabriellew.ee/posts/2022/03/18/brain-fog/">earlier this year</a>, I feel like I finally really got into the swing of things when summer started. I unfortunately haven’t been able to travel, which I do miss, but there’s been so many things at home that have made me just as happy.</p><h2>Desk <a class="direct-link" href="https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/#desk" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>While I’ve been working from home for the entirety of the pandemic, I’ve never actually worked on my desk setup. I’ve never even owned a desk - when I was a child, I did my homework on the kitchen table. When I was in college, I worked at school since I needed the computers for my 3d work. When I moved out of my parents’ house to be closer to work, I didn’t buy a desk since all my work was done in the office and I gamed primarily on my Nintendo Switch.</p><figure><figcaption>My completed desk setup</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-desk-setup.jpg" alt="My completed desk setup" /></picture></figure><p>I wanted a setup that was both aesthetically pleasing and functional. I have both a personal laptop and a work laptop, so I have to be able to switch between the two easily. I ended up purchasing the <a href="https://www.samsung.com/us/computing/monitors/smart-monitors/32-m8-4k-smart-monitor-and-streaming-tv-pink-ls32bm80punxgo/">Samsung M8 Smart Monitor</a> in pink, and it’s worked out perfectly for me. I use a single USB-C cable to switch between my laptops, and use the mini-HDMI cable to connect to my Nintendo Switch for gaming.</p><p>I wasn’t originally intending to have such a pink setup, but I guess I couldn’t help but be drawn to my favorite color. I purchased the limited edition pink deskmat from Maisy Leigh x Grovemade, and I’ve been loving it. I also used one of my old Sailor Moon-inspired illustrations as my desktop wallpaper.</p><p>I also had to make room for the best part of my desk setup - my cat Alfie. His cat tree is to the right of my desk, so I also set up a heat mat on that side of my desk so we can hang out while I work. I rearranged my whole desk for him (my laptop was originally on the right side) so I hope he appreciates it!</p><h2>Peripherals <a class="direct-link" href="https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/#peripherals" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>I’ve been eyeing custom mechanical keyboards for what feels like years, but I finally bit the bullet and built my own. I definitely did the most research I’ve ever done for a purchase. Most of the parts were purchased from <a href="https://kbdfans.com/">KBDfans</a>.</p><figure><figcaption>My pastel-themed custom mechanical keyboard and Logitech Lift Mouse</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-keyboard.jpg" alt="My pastel-themed custom mechanical keyboard and Logitech Lift Mouse" /></picture></figure><ul><li><strong>Case:</strong> Frosted acrylic Tofu60 case <a href="https://kbdfans.com/collections/tofu60/products/tofu-acrylic-frosted-60-case">[link]</a></li><li><strong>PCB:</strong> DZ64 RGB Hot-Swap PCB <a href="https://kbdfans.com/products/dz64-rgb-hot-swap-pcb">[link]</a></li><li><strong>Plate:</strong> Polycarbonate plate <a href="https://kbdfans.com/collections/plate/products/60-pc-material-plate?variant=21206992584762">[link]</a></li><li><strong>Switches:</strong> Lubed Gateron Ink V2 Silent Black Linear switches <a href="https://kbdfans.com/products/gateron-ink-v2-silent-black-linear-switches">[link]</a></li><li><strong>Keycaps:</strong> POM Jelly keycaps <a href="https://flashquark.com/product/pom-jelly-rainbow-keycaps-108-keycap-set/">[link]</a></li><li><strong>Cable:</strong> KBDFans Colorful Handmade USB-C Cable <a href="https://kbdfans.com/products/kbdfans-handmade-custom-mechanical-keyboard-usb-c-cable-2">[link]</a></li></ul><p>Putting together the keyboard was challenging. Luckily, I didn’t have to solder, but still, I bent quite a few switch pins. I love the muted sound of the switches and I’m proud of how it turned out.</p><p>I also recently purchased a <a href="https://www.logitech.com/en-us/products/mice/lift-vertical-ergonomic-mouse.html">Logitech Lift Vertical Ergonomic Mouse</a> in pink and it’s been a game-changer. I’m used to using my Magic Trackpad but instantly fell in love with using an ergonomic mouse. It also matches my desk setup!</p><h2>Steam Deck <a class="direct-link" href="https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/#steam-deck" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>I was fortunate enough to get my hands on a Steam Deck last month. I’d been waiting for my order window for almost a year, and almost missed it because of a preorder error. Luckily we contacted customer service and they sent us one out almost immediately!</p><figure><figcaption>Playing my Steam Deck at the beach in Half Moon Bay</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-steam-deck-beach.png" alt="Playing my Steam Deck at the beach in Half Moon Bay" /></picture></figure><figure><figcaption>Playing my Steam Deck at Game Night with my cat</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-steam-deck-cat.jpg" alt="Playing my Steam Deck at Game Night with my cat" /></picture></figure><p>I’ve never owned a gaming PC (all my computers have been MacBooks) and most of my consoles have been from Nintendo, so being able to play PC and Steam games on a portable computer has been incredible. I also installed an emulator so that I’m able to play some of my favorite older games such as Fire Emblem: Path of Radiance.</p><h2>Loved ones <a class="direct-link" href="https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/#loved-ones" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Spending time with the people I love has been the highlight of this year. Even though I had more time in years past, I think that this year I’ve been really intentional with my time with my friends and family.</p><figure><figcaption>Boba with Hayden</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-hayden.jpg" alt="Boba with Hayden" /></picture></figure><figure><figcaption>Father’s Day with family</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-dad.jpg" alt="Father’s Day with family" /></picture></figure><figure><figcaption>Beach with Jeselle</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-jeselle.jpg" alt="Beach with Jeselle" /></picture></figure><figure><figcaption>Ice cream with Richard</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-richard.jpg" alt="Ice cream with Richard" /></picture></figure><figure><figcaption>Me at Float Pack Friday</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-float-pack.jpg" alt="Me at Float Pack Friday" /></picture></figure><figure><figcaption>Cooking wings with Phil</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-phil.jpg" alt="Cooking wings with Phil" /></picture></figure><h2>The cat <a class="direct-link" href="https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/#the-cat" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Last but certainly not least, I’ve been spending a <em>lot</em> of time with my cat, Alfie. He’s been in my life since last September, but I feel like he’s always been with me now. He just turned 1 years old in May, and he’s still quite a handful. Basically all of my photos are of him these days. He’s ridiculous and I love him so much. I’m working on him to make him an Adventure Cat, and so far it’s been working out pretty well.</p><figure><figcaption>Cat in the garden</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-cat-garden.jpg" alt="Cat in the garden" /></picture></figure><figure><figcaption>Cat in someone’s garage</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-cat-garage.jpg" alt="Cat in someone’s garage" /></picture></figure><figure><figcaption>Cat with me and Korilakkuma</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-cat-plush.jpg" alt="Cat with me and Korilakkuma" /></picture></figure><figure><figcaption>Cat at the park</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-cat-park.jpg" alt="Cat at the park" /></picture></figure><figure><figcaption>Cat on his cat tree</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-cat-perch.jpg" alt="Cat on his cat tree" /></picture></figure><figure><figcaption>Cat at the beach</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2022-07-20-cat-beach.jpg" alt="Cat at the beach" /></picture></figure><h2>Happy <a class="direct-link" href="https://gabriellew.ee/posts/2022/07/20/things-that-make-me-happy/#happy" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Don’t really have a conclusion other than this: I’m grateful for the good times I’ve had so far this year, and I’m looking forward to the rest of it. ✨</p>
			]]>
		</content>
	</entry>
	
	<entry>
		<title>New year, new design.</title>
		<link href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/"/>
		<updated>2023-01-30T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2023/01/30/new-year-new-design/</id>
		<content type="html">
			<![CDATA[
				<p>I think I force myself to keep up with all the new things happening in web development by making myself redesign my site every couple of years or so. I never really consciously sit down to make comps and figure out all the details. The process is really more of me noodling on an idea I’ve had for a while until it crystallizes into something I can use.</p><p>I realized towards the end of last year that I really missed Tumblr. I don’t really miss the artwork and photos (I get those from other social media platforms these days) or even the community aspect. What I really miss is the <strong>themes</strong>!</p><p>Back then, I was used to making MySpace layouts and having to manually overwrite their built-in HTML in order to put what I wanted on the page. Tumblr felt like a breath of fresh air — a free, built-in CMS and community with the ability to write custom HTML templates for different kinds of posts. Different kinds of posts! Every other platform I had used up until that point had one kind of post with the ability to add other forms of media, like tweets having media attachments. But Tumblr’s microblogging platform had 7 or 8 different kinds of posts and I could represent each of them differently than the rest.</p><p>So I set out to recreate the <em>feeling</em> of a Tumblr blog but ✨for me✨. This eventually boiled down to four different post types:</p><ol><li><strong>Text posts</strong> — including these blog posts as well as my old blog posts from before 2015 and external articles that featured me or my writing.</li><li><strong>Photo posts</strong> — including photography, graphics, and artwork. I pretty much brought these over from my last site iteration since I liked the implementation.</li><li><strong>Code posts</strong> — My CodePen code snippets that I wanted to feature.</li><li><strong>Social media posts</strong> — posts from other platforms that are directly related to either web dev or my other hobbies.</li></ol><h2>Text posts <a class="direct-link" href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/#text-posts" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Text posts were easy enough to build - I’m still using <a href="http://11ty.dev/">Eleventy</a> (updated to 2.0, which is exciting!) and could pull my <a href="https://github.com/gabriellewee/portfolio/tree/netlify/posts">markdown posts</a> from the previous site. I also imported my old blog posts from 2012-2014 but decided to let them live in their own category so that I could treat them separately if needed. I took a lot of inspiration from the previous site styles, including the cut-off corners and angled buttons.</p><p>There was no straightforward way for me to add external articles, so I created an <a href="https://www.11ty.dev/docs/data-global/">Eleventy global data file</a> with the same information as the rest of the text posts. I called these “feature posts”.</p><h2>Photo posts <a class="direct-link" href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/#photo-posts" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>I also imported photo posts from the previous site as well as the collection pages (<a href="https://gabriellew.ee/photography/">/photography</a>, <a href="https://gabriellew.ee/graphic/">/graphic</a>, <a href="https://gabriellew.ee/art/">/art</a>), but I wanted to tweak the <a href="https://gabriellew.ee/posts/2021/07/26/setting-up-shop/#no-js">information overlay</a> that I’d previously designed. They still use a checkbox input to activate! I also included links if they were posted on another site like Instagram or Dribbble.</p><p>This was the first opportunity that I had seen to try out container queries, which I’m really excited about. I attended An Event Apart 2022 in San Francisco last year and learned about container queries from <a href="https://chriscoyier.net/">Chris Coyier</a> and <a href="https://valhead.com/">Val Head</a>.</p><figure><figcaption>Different photo overlay layouts for different container widths</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-01-30-photo-overlays.png" alt="Different photo overlay layouts for different container widths" /></picture></figure><p>Portrait photos by default take up half the container width while landscape photos take up the entire container width, but with some photos I overrode the width to emphasize or deemphasize the post. If the post has enough width and height, a thumbnail of the photo shows up that when clicked, expands into a lightbox. If the container isn’t tall enough to show a thumbnail, the text “Expand” replaces the thumbnail. On browsers that don’t support container queries, the overlay is scrollable to view all content.</p><pre><code>.media-container {  // set up container query  @supports (container-type: size) {    container-type: size;    container-name: metadata;  }}.media-overlay {  overflow-y: auto;}.media-thumbnail {  .media-expand {    // hide the "Expand" text for large viewports when container queries aren’t supported    @supports not(container-type: size) {      @include viewport($iphone) {        .no-image {          display: none;        }      }    }    // hide the "Expand" text for large containers when container queries are supported    @container metadata (min-width: 320px) and (min-height: 400px) {      .no-image {        display: none;      }    }  }  .media-picture {    width: 150px;    // media queries to handle thumbnail display and sizing when container queries aren’t supported    @supports not(container-type: size) {      @include viewport($iphone) {        display: block;      }      @media only screen and (min-width: 450px) {        width: 200px;      }      @include viewport(mobile) {        width: 150px;      }      @include viewport($ipad-11) {        width: 200px;      }    }    // a more straightforward version when container queries are supported    @container metadata (min-width: 320px) and (min-height: 400px) {      display: block;    }    @container metadata (min-width: 400px) {      width: 200px;    }  }}</code></pre><p>In order for the container queries to work in both directions (inline and block), the container needed to have a defined width and height. In order to solve this, I created a <code>stats</code> shortcode using <a href="https://www.11ty.dev/docs/plugins/image/">eleventy-img</a> that gets the height and width of each image and outputs an aspect ratio. It can also output width, height, or orientation, which I found useful in other contexts.</p><p><strong>Shortcode:</strong></p><pre><code>const Image = require("@11ty/eleventy-img");const sharp = require("sharp");module.exports = eleventyConfig => {  eleventyConfig.addNunjucksAsyncShortcode("stats", async (src, type) => {    let stats = await Image(src, {      widths: [null],      statsOnly: true    });    let width = stats["webp"][0].width;    let height = stats["webp"][0].height;    let result;    let orientation;    if(type === "width") {      result = width;    } else if(type === "height") {      result = height    } else if(type === "orientation") {      width > height ? orientation = "landscape" : orientation = "portrait"      result = orientation    } else if(type === "ratio") {      result = `${width} / ${height}`    }    return result;  });};</code></pre><p><strong>Implementation:</strong></p><pre><code>&lt;figure style="aspect-ratio: {% stats './static/images/photography/2022-07-20-cat-garden.jpg', ’ratio' %};">  &lt;!-- image and information -->&lt;/figure></code></pre><p><strong>Output:</strong></p><pre><code>&lt;figure style="aspect-ratio: 3024 / 4032;">  &lt;!-- image and information -->&lt;/figure></code></pre><h2>Code posts <a class="direct-link" href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/#code-posts" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Each code post has an iframe, a link to the original CodePen pen, and a reload/replay button that refreshes the frame. I wanted to style my code posts independent of the CodePen UI, so the frame source code is hosted on my own site. Each frame source also has its own front matter, just like my text posts, so that it can be included on the front page.</p><figure><figcaption>My no-UI embed for <a href="https://codepen.io/gabriellewee/pen/zYGxNKa">Four-Quadrant CSS-Only Gradient</a></figcaption><iframe src="https://gabriellew.ee/code/quadrant/" width="600" height="400" title="Four-Quadrant CSS-Only Gradient" loading="lazy"></iframe></figure><figure><figcaption>CodePen embed for <a href="https://codepen.io/gabriellewee/pen/zYGxNKa">Four-Quadrant CSS-Only Gradient</a></figcaption><p class="codepen" style="--height: 400px;" data-height="400" data-theme-id="39292" data-default-tab="result" data-slug-hash="zYGxNKa" data-user="gabriellewee">  See the Pen <a href="https://codepen.io/gabriellewee/pen/zYGxNKa">  Four-Quadrant CSS-Only Gradient</a> by Gabrielle Wee (<a href="https://codepen.io/gabriellewee">@gabriellewee</a>)  on <a href="https://codepen.io/">CodePen</a>.</p></figure><h2>Social media posts <a class="direct-link" href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/#social-media-posts" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>As of right now, the only social media posts that I’m including on my site are Mastodon posts. I considered Twitter and Instagram, but Twitter’s API is notoriously <a href="https://tapbots.com/tweetbot/">out of commission</a> and I generally use Instagram for personal and not dev-related content. So Mastodon it is, for now!</p><p><a href="https://github.com/11ty/eleventy-fetch">Eleventy-fetch</a> has been super useful, as well as <a href="https://docs.netlify.com/configure-builds/environment-variables/">Netlify environment variables</a>. I set up a global data file called <code>mastodon.js</code> that caches my account’s posts as well as an <code>.env</code> file that contains all of the same build variables I specified on Netlify.</p><pre><code>const Cache = require('@11ty/eleventy-fetch');module.exports = async () => {  try {    let key = process.env.MASTODON_API_KEY;    let id = process.env.MASTODON_API_ID;    let url = `https://mas.to/api/v1/accounts/${id}/statuses?limit=40`;    return Cache(url, {      duration: '1d',      type: 'json',      fetchOptions: {        headers: {          'Authorization': `Bearer ${key}`        }      }    });  } catch(e) {    return [];  }};</code></pre><p><strong>In .eleventy.js:</strong></p><pre><code>require('dotenv').config();</code></pre><h2>Putting it all together <a class="direct-link" href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/#putting-it-all-together" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>In order to get everything on the front page, I needed to have one category that Eleventy could paginate through. I decided to call this collection “entries” and add it as a tag to all four kinds of posts.</p><p>For <a href="https://github.com/gabriellewee/portfolio/blob/netlify/_includes/layouts/post.njk">regular text posts</a>, I include it as a tag in the front matter on my post template.</p><pre><code>---layout: layouts/base.njktags: entries---</code></pre><p>Code posts were the same except that they didn’t use the post template so I put <code>tags: entries</code> into each individual file.</p><p>For <a href="https://github.com/gabriellewee/portfolio/blob/netlify/collections/features.njk">text feature posts</a>, <a href="https://github.com/gabriellewee/portfolio/blob/netlify/collections/photography.njk">photo posts</a>, and <a href="https://github.com/gabriellewee/portfolio/blob/netlify/collections/mastodon.njk">social media posts</a>, I created a collection page that mapped all the information from the global data files to the correct properties for posts using <a href="https://www.11ty.dev/docs/data-computed/">eleventyComputed</a>.</p><pre><code>---js{  layout: "layouts/base.njk",  key: "post",  tags: "entries",  category: "social",  pagination: {    data: "mastodon",    size: 1,    addAllPagesToCollections: true,    alias: "mastodon"  },  permalink: false,  eleventyComputed: {    mastodon(data) {      data.page.date = new Date(data.mastodon.created_at);      data.content = data.mastodon.content;      data.url = data.mastodon.url;      data.media = data.mastodon.media_attachments;      if (data.mastodon.reblog || data.mastodon.in_reply_to_account_id || data.mastodon.content.includes("https://gabriellew.ee")) data.tags = "";    }  }}---</code></pre><p>I set <code>permalink: false</code> on all of these — photo posts already had all the information included and the others had permalink pages outside of my website.</p><p>I decided to filter my Mastodon posts and remove posts mentioning my site URL (since they’d most likely just be a link to a blog post already on the front page) as well as replies/reposts. I’d seen some implementations removing them entirely from the data, but Javascript is not my strong suit and I couldn’t get it to work for me, so instead I changed the tag so that they were no longer included in the “entries” collection.</p><p><strong>Edit 01/31/2023:</strong> I’ve realized that if you add <code>&amp;exclude_replies=true&amp;exclude_reblogs=true</code> to your url in <code>mastadon.js</code>, you don’t need to change the tag collection and can remove <code>data.mastodon.reblog || data.mastodon.in_reply_to_account_id</code>.</p><p>Now, in my <code>index.njk</code> file, I could paginate through “entries” and have everything I needed! Here’s a much-abbreviated version of my post template (I have a lot more variables in the final version).</p><pre><code>---title: Homelayout: layouts/base.njkpagination:    data: collections.entries    size: 16    reverse: true---&lt;div class="posts">  {% for post in pagination.items %}    &lt;article class="post">      &lt;div class="post-inner">        &lt;header class="post-header">          &lt;div class="post-header-content">            &lt;h2>              &lt;a href="{{post.url|url}}">&lt;span>{{post.data.title|safe}}&lt;/span>&lt;/a>            &lt;/h2>            &lt;time datetime="{{post.page.date|htmlDateString}}">{{post.page.date|readableDate}}&lt;/time>          &lt;/div>        &lt;/header>        &lt;div class="post-content">          &lt;!-- {{post.content|safe}} or code post iframe or photo post information -->        &lt;/div>      &lt;/div>    &lt;/article>  {% endfor %}&lt;/div></code></pre><h2>Webmentions <a class="direct-link" href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/#webmentions" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Implementing webmentions was tricky. I ended up using eleventy-fetch again and set up <a href="https://webmention.io/">Webmention.io</a> and <a href="https://brid.gy/">Bridgy</a> to get my webmentions — here’s <a href="https://daily-dev-tips.com/posts/implementing-webmentions-on-a-11ty-blog/">an article</a> I read describing how to set that all up. I found out how to send outgoing webmentions from <a href="https://jamesmead.org/blog/2020-10-13-sending-webmentions-from-a-static-website">James Mead</a> and how to set up an h-card from <a href="https://ashleykolodziej.com/add-webmentions-to-static-site/">Ashley Kolodziej</a>.</p><pre><code>const Cache = require('@11ty/eleventy-fetch');module.exports = async () => {  try {    let key = process.env.WEBMENTION_IO_KEY;    let url = `https://webmention.io/api/mentions.json?token=${key}&amp;per-page=90001`;    return Cache(url, {      duration: '1d',      type: 'json'    });  } catch(e) {    return [];  }};</code></pre><p>I decided against a Javascript solution to sorting data (again, not my strong suit) and instead used a built-in Nunjucks filter called <a href="https://mozilla.github.io/nunjucks/templating.html#groupby">groupby</a>. This allowed me to group each mention by type (likes, reposts, links, and replies) and create different templates for each type. You can see the <a href="https://github.com/gabriellewee/portfolio/blob/netlify/_includes/pages/posts/mentions.html">full template here</a>.</p><pre><code>&lt;!-- set a pageLink variable so that only mentions for this page show up -->{% set pageLink = site.url + page.url %}&lt;aside class="mentions">  {% for target, webmentions in webmentions.links | groupby("target") %}    {% for type, webmentions in webmentions.links | groupby("activity.type") %}      {% if target == pageLink %}        &lt;div class="mentions-list">          &lt;ul>            {% for webmention in webmentions %}              &lt;li>                &lt;!-- webmention template -->              &lt;/li>            {% endfor %}          &lt;/ul>        &lt;/div>       {% endif %}    {% endfor %}  {% endfor %}&lt;/aside></code></pre><h2>Done (for now) <a class="direct-link" href="https://gabriellew.ee/posts/2023/01/30/new-year-new-design/#done-for-now" aria-hidden="true" data-anchor="" aria-label="Jump link to heading"></a></h2><p>Figuring out each step of building this new site took a lot of time, research, and trial/error. I feel a little weird posting about all the things I did, especially as cobbled together as this feels. But I would have loved if I had been able to find this kind of information/compilation when I was building this site. If you have any questions, please feel free to contact me!</p>
			]]>
		</content>
	</entry>
	
	<entry>
		<title>Why does the letter G look so weird?</title>
		<link href="https://gabriellew.ee/posts/2023/03/02/why-does-the-letter-g-look-so-weird/"/>
		<updated>2023-03-02T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2023/03/02/why-does-the-letter-g-look-so-weird/</id>
		<content type="html">
			<![CDATA[
				<p>I don’t know if it’s just me, but finding an aesthetically pleasing G is the bane of my existence. I’ve never liked the way G looks in any font — especially cursive G’s, those are the worst. Lowercase g’s don’t make much sense either, especially the <a href="https://psycnet.apa.org/doiLanding?doi=10.1037%2Fxhp0000532">looptail variety</a>. I used to spend hours as a child rewriting my name over and over because I couldn’t get it to look like how I wanted it to look (still haven’t quite gotten it right).</p><p>As time has passed, this search for the perfect G has spilled over into other parts of my life. I spent three hours browsing Etsy the other day because I wanted an initial necklace and all the G’s were too narrow, too angled, not special in any particular way.</p><p>I also have struggled with making favicons/OpenGraph images for my site. I’ve avoided proper identity design by simply using my initial, but then I spend even more time trying to perfect it.</p><figure><figcaption>Logo design from 2013</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-v1.svg" alt="White G logo design on a red background from 2013" /></picture></figure><figure><figcaption>Logo design from 2014</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-v2.svg" alt="White G logo design on a dark grey background from 2014" /></picture></figure><figure><figcaption>Logo design from 2016</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-v3.svg" alt="White G logo design on a light pink background from 2016" /></picture></figure><figure><figcaption>Logo design from 2021</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-v4.svg" alt="White G logo design on a pink background from 2021" /></picture></figure><p>With my first proper website design, I simply threw the initial in my website font onto a red background and called it a day. Later iterations were more or less the same thing, with varying colors and backgrounds. This proven technique has led me to my current icon design, though I think I like the G a little more this time around.</p><figure><figcaption>Current logo design used in OpenGraph image</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo.svg" alt="Current logo design used in OpenGraph image. A capital letter G sits in front of a diamond shape on a gradient background." /></picture></figure><figure><figcaption>Current logo design used in OpenGraph image for graphic page</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-graphic.svg" alt="Current logo design used in OpenGraph image for graphic page, with a background composed of randomly placed outlined stars and circles." /></picture></figure><figure><figcaption>Current logo design used in OpenGraph image for post pages</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-posts.svg" alt="Current logo design used in OpenGraph image for post pages, with a background resembling a piece of lined paper." /></picture></figure><p>Maybe it’s because wide sans-serif fonts are trendy right now, but something about the oval that is deeply satisfying, more so than the perfect circles I emulated in previous iterations. I also added the cut-off corner motif that is used all over my site.</p><figure><figcaption>Vector points used for logo design</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-vector.png" alt="Vector points used for logo design" /></picture></figure><p>I decided to rotate the background for favicons since the square would utilize more space than the diamond shape.</p><figure><figcaption>Logo version used for iOS and OpenGraph</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-ios.svg" alt="Logo version used for iOS and OpenGraph. A capital letter G sits in front of a diamond shape on a gradient background." /></picture></figure><figure><figcaption>Logo version used for favicons and Android</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-03-02-logo-favicon.svg" alt="Logo version used for favicons and Android. A capital letter G sits in front of an octagon with a gradient." /></picture></figure><p>I used to have to search for a favicon generator every time I updated mine, but I finally just installed <a href="https://imagemagick.org/">ImageMagick</a> and made the .ico file myself.</p><pre><code>convert ./favicon.png ./android-chrome-48x48.png ./favicon-32x32.png ./favicon-24x24.png ./favicon-16x16.png ./favicon.ico</code></pre><p>All that to say, I think this G is  <em>close enough</em> to perfection for me. Now I just have to figure out how to get this version onto a necklace.</p>
			]]>
		</content>
	</entry>
	
	<entry>
		<title>I made my handwriting into a font!</title>
		<link href="https://gabriellew.ee/posts/2023/08/22/i-made-my-handwriting-into-a-font/"/>
		<updated>2023-08-22T00:00:00Z</updated>
		<id>https://gabriellew.ee/posts/2023/08/22/i-made-my-handwriting-into-a-font/</id>
		<content type="html">
			<![CDATA[
				<p>I’ve been using my iPad a lot more lately. For a while, I was mostly using it as an e-reader and notebook, but lately I’ve been playing games from the <a href="https://www.ironhidegames.com/Games">Kingdom Rush series</a> and other Apple Arcade apps. I also recently discovered that there are a number of apps for creating your own fonts! Years ago, I read an article about a high school student who sent in his college application essay printed in his own handwriting, and making my own font has been on my bucket list ever since.</p><figure><figcaption>My handwriting as a font</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-08-22-gabrielle-font-sample-grey.png" alt="A sample of my handwriting as a font, including the pangram “The quick brown fox jumps over the lazy dog” in both uppercase and lowercase letters, as well as Latin characters and symbols." /></picture></figure><!--more--><p>After a bit of research, I decided to check out <a href="https://apps.apple.com/ca/app/fontself-make-your-own-fonts/id1512959192">Fontself</a>. It was really easy to set up and get started. The app comes with a number of templates, so I picked the handwriting one and began drawing. I tried really hard at first to get each stroke right, but later realized that I could edit the curves afterwards.</p><figure><figcaption>The handwriting template</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-08-22-font-template.png" alt="The handwriting template provided in the Fontself app, showing the alphabet in grayed out letters." /></picture></figure><figure><figcaption>Editing bézier curves</figcaption><picture><img src="https://gabriellew.ee/static/images/posts/2023-08-22-font-vector.png" alt="The letter ð in Fontself with bézier curves visible and editable, surrounded by other letters in a grid." /></picture></figure><p>Honestly, it’s a little bit weird to see my handwriting so neat and even. I feel like I could probably achieve this by hand if I wrote verrrrry slowly. Before editing the curves, the font looked a lot more like my everyday handwriting, but the repeated quirks in each letter looked strange to me. Making each letter more balanced and upright lent itself better to a legible font.</p><p>I’m still not sure what I’m going to do with my new font. I would love to add a bold variant but the app is a little bit limited and I can’t edit stroke width after drawing out the character, so I’d have to start from scratch. I ran into a problem I also have with my physical handwriting — at small sizes, it’s difficult to read. I think it’s because the letters are so narrow and tall. Maybe I’ll refine it more and put it on my website. All in all, it was a really fun afternoon project!</p><p>It’s far from complete, but if you wanted to check out the font, you can <a href="https://github.com/gabriellewee/portfolio/raw/main/static/fonts/gabrielle.otf">download it here</a>.</p>
			]]>
		</content>
	</entry>
</feed>