<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Grace Olabode</title>
    <description>The latest articles on Forem by Grace Olabode (@grace_olabode_3be546efe9b).</description>
    <link>https://forem.com/grace_olabode_3be546efe9b</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3782587%2Fb6eaef7d-6cc2-4d79-90c5-0f11788cb8f4.png</url>
      <title>Forem: Grace Olabode</title>
      <link>https://forem.com/grace_olabode_3be546efe9b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/grace_olabode_3be546efe9b"/>
    <language>en</language>
    <item>
      <title>Wrapping Up Bloom After: Week 4 Polish &amp; Full Sprint Retro</title>
      <dc:creator>Grace Olabode</dc:creator>
      <pubDate>Fri, 27 Mar 2026 20:53:55 +0000</pubDate>
      <link>https://forem.com/grace_olabode_3be546efe9b/wrapping-up-bloom-after-week-4-polish-full-sprint-retro-p2m</link>
      <guid>https://forem.com/grace_olabode_3be546efe9b/wrapping-up-bloom-after-week-4-polish-full-sprint-retro-p2m</guid>
      <description>&lt;p&gt;We finally made it to Week 4! This last week of the sprint was all about crossing the t's, dotting the i's and making sure the app actually feels good to use.&lt;/p&gt;

&lt;p&gt;Before I get into the bugs I squashed this week, let's zoom out and talk about what my team and I spent the last month building.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Bloom After?
&lt;/h2&gt;

&lt;p&gt;Dealing with postpartum depression (PPD) can feel incredibly lonely. While there is plenty of medical advice online, finding a single and calming place with helpful resources, verified specialists and a community of moms who actually get it is really hard. That’s why we built Bloom After. It’s a safe digital space for mothers facing maternal mental health challenges, featuring an educational hub, a clinic finder, and a story library where moms can read and share their journeys. We designed the entire platform to be calming, supportive and super easy to use for someone who might already be feeling overwhelmed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Shipped This Week
&lt;/h2&gt;

&lt;p&gt;The heavy lifting for the Stories feature and the Admin dashboard was finished last week by my team. So, my main goal for Week 4 was to polish the app, test it, and make sure everything flowed perfectly. Here is what I did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Revamped the Lifestyle &amp;amp; Crisis Pages:&lt;/strong&gt; I completely refined the UI and functionality for the Lifestyle and Crisis landing pages. For the Crisis page, I made sure the 24/7 helplines were pinned to the very top and swapped out a clunky separate page for a fast and instant-loading modal so moms can get help immediately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;End-to-End Testing:&lt;/strong&gt; I put on my QA hat (which almost didn't fit) and clicked through the entire app from start to finish, acting like a real user to see what would break.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bug Squashing &amp;amp; UI Polish:&lt;/strong&gt; I spent hours fixing alignment issues, spacing and mobile glitches (like a stubborn bug on 360px mobile screens!). I went through several pages, including the Admin dashboard, to fix bugs and make sure the design looked premium and consistent everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Technical Lessons from the Sprint
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSS Mobile Quirks are Real:&lt;/strong&gt; I learned that mobile browsers handle screen heights weirdly. Using dvh (dynamic viewport height) instead of standard vh is a lifesaver so your modals don't get hidden behind the mobile address bar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Devil is in the Details:&lt;/strong&gt; Polishing UI takes just as much time as building the feature in the first place. A tiny 1px gap or a misaligned button can ruin the whole vibe of a page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;E2E Testing is Eye-Opening:&lt;/strong&gt; You think your code works perfectly until you actually try to use it. Testing the full flow caught so many tiny bugs and bad user experiences that I would have completely missed if I only looked at the code.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Full-Sprint Retrospective
&lt;/h2&gt;

&lt;p&gt;Looking back at the whole month of building Bloom After:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What went well:&lt;/strong&gt; We stuck to our vision. We wanted to build a platform that felt deeply empathetic and safe, and we never compromised on that UX, even when it meant doing tedious CSS work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What I would do differently:&lt;/strong&gt; I’d set up a better modular folder structure from Day 1. Moving from a messy flat folder system to a clean and organized one late in the project meant rewriting a ton of file paths.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What surprised me:&lt;/strong&gt; How much complex code goes into making things look "simple." Creating a clean and calming interface actually requires a lot of behind-the-scenes work.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s Next for Me?
&lt;/h2&gt;

&lt;p&gt;Now that this sprint is over, I’m shifting my focus to leveling up my core engineering skills. I really want to master the fundamentals, so I'm going to dive deep into advanced JavaScript and TypeScript. I also plan to tackle Data Structures and Algorithms (DSA) to sharpen my problem-solving abilities. Instead of just getting stuck in "tutorial hell," my main goal is to build out a few solid projects from scratch using JS and TS to put all of these concepts into actual practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Shoutouts
&lt;/h2&gt;

&lt;p&gt;Building this isn't a one-person job. A massive thank you to the amazing people building this with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Chijioke Uzodinma (Backend Lead):Read his Week 4 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nanji Lakan (Product Lead): Read her Week 4 article &lt;a href="https://medium.com/@Youtenstudio/bloom-after-week-4-the-last-sprint-the-first-goodbye-80def0e964d1" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agugua Genevieve (Design Lead): Read her Week 4 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prisca Onyemaechi (Lead Maintainer): Read her Week 4 article &lt;a href=""&gt;here.&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adejola Esther (Frontend Engineer): Read her Week 4 article &lt;a href="https://medium.com/@adejolanu/week-in-the-life-of-a-frontend-engineer-bloom-after-part-4-and-the-end-6a9a02f1ade8" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://the-bloom-after.netlify.app/" rel="noopener noreferrer"&gt;Visit our live site.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Tabi-Project/Bloom-After.git" rel="noopener noreferrer"&gt;Check out our Github Repo.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>mentalhealth</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Building with Care (Week 3): Hardware Hiccups, The NGO Directory, and Keeping Code DRY</title>
      <dc:creator>Grace Olabode</dc:creator>
      <pubDate>Fri, 20 Mar 2026 20:50:29 +0000</pubDate>
      <link>https://forem.com/grace_olabode_3be546efe9b/building-with-care-week-3-hardware-hiccups-the-ngo-directory-and-keeping-code-dry-fo8</link>
      <guid>https://forem.com/grace_olabode_3be546efe9b/building-with-care-week-3-hardware-hiccups-the-ngo-directory-and-keeping-code-dry-fo8</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Grace Olabode | Engineering Lead, Bloom After&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is hard to believe we are already in Week 3 of our sprint with the Tabi Project and TEE Foundation. We are building Bloom After to make sure Nigerian mothers have a safe and supportive app to face postpartum depression.&lt;/p&gt;

&lt;p&gt;Last week, I focused heavily on maps, math, and building the foundation of the Resource Hub. This week, the goal was to build the NGO Directory, refactor our code so it is clean and reusable, and handle some content updates. It was also a week of unexpected hardware issues and learning how to navigate team dynamics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built This Week
&lt;/h2&gt;

&lt;p&gt;I spent most of my time making the layouts actually work with real data and cleaning up the code so it runs smoothly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The NGO Directory:&lt;/strong&gt; I built the main page where users can scroll through a list of vetted non-profit organizations and support groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Resource Hub Updates:&lt;/strong&gt; Since the heavy lifting for the hub was done last week, my task this week was just updating the categories. I replaced the "audio summary" and "podcast" tags with a single, unified "media" tag to make sorting easier for the users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Minor UI Fixes and DRY Code:&lt;/strong&gt; I spent a lot of time cleaning up the app. I focused heavily on implementing DRY (Don't Repeat Yourself) principles so we are reusing code instead of writing the same things twice. I also fixed small spacing issues, corrected text sizes, and made sure the mobile menus stacked perfectly on smaller screens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Did What I Did
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Splitting Up the JavaScript:&lt;/strong&gt; Instead of writing one giant wall of code, I broke our JavaScript into smaller and separate files. This makes the code much easier to read and fix.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faking the Backend:&lt;/strong&gt; I worked closely with our Backend Lead, Chijioke Uzodinma, to agree on how our data should be structured. Because we were still finalizing things, I built a fake API using JavaScript Promises to keep the frontend moving. Switching to the live backend later will just take changing one line of code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSS Grid over Media Queries:&lt;/strong&gt; To make the NGO cards adjust to any screen size automatically, I used CSS Grid. This saved me from writing dozens of extra lines of code just for mobile screens.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bugs, Fixes and Fan Failures
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Silent Crash&lt;/strong&gt;&lt;br&gt;
While splitting up our JavaScript files, I ran into an annoying bug where the Resource Detail page would only show the "Back" button. The rest of the page was completely blank. After opening the console, I saw a null error. The JavaScript was looking for specific HTML tags that did not exist in the new layout. I quickly updated the HTML to match and the content instantly popped back onto the screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Messy Grid&lt;/strong&gt;&lt;br&gt;
When I first loaded the NGO data into the grid layout, the different text lengths caused the cards to stretch to completely different heights. I fixed this by using Flexbox to force the cards to match heights. I also added a CSS trick called line-clamp to automatically hide extra text and add three dots at the end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hardware Hurdle&lt;/strong&gt;&lt;br&gt;
My biggest challenge this week was not actually code. My laptop fan completely died. To make things worse, the Eid ul Fitr holiday meant all the repair shops were closed. It took days to get it fixed. Because of this, we are currently way behind our schedule, but we are absolutely determined to make things work and catch up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sprint Reflections
&lt;/h2&gt;

&lt;p&gt;Working in a team is incredibly fun but it can also be frustrating when schedules misalign or things break. Communication is everything. Working so closely with the backend lead this week really highlighted how much faster you can solve problems when you share the load.&lt;/p&gt;

&lt;p&gt;If I could do this sprint differently, I would try to tackle minor visual fixes as I build the features, rather than saving them all for a clean up phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Am Most Proud Of
&lt;/h2&gt;

&lt;p&gt;I am super proud of how cohesive the whole app looks right now. Seeing the Resource Hub and the new NGO Directory sitting side by side looking like a real and professional product is an amazing feeling. I am proud that despite laptop failures and being behind schedule, we are still building something that will genuinely help people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Shoutouts
&lt;/h2&gt;

&lt;p&gt;Building this isn't a one-person job. A huge thank you to the amazing people building this with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Chijioke Uzodinma (Backend Lead):Read his Week 2 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nanji Lakan (Product Lead): Read her Week 3 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agugua Genevieve (Design Lead): Read her Week 3 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prisca Onyemaechi (Lead Maintainer): Read her Week 3 article &lt;a href=""&gt;here.&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adejola Esther (Frontend Engineer): Read her Week 3 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Christine Myangi (People Manager): Read her Week 3 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://the-bloom-after.netlify.app/" rel="noopener noreferrer"&gt;Visit our live site.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Tabi-Project/Bloom-After.git" rel="noopener noreferrer"&gt;Check out our Github Repo.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>devjournal</category>
      <category>showdev</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Building the Search: My Week 2 Progress on Bloom After</title>
      <dc:creator>Grace Olabode</dc:creator>
      <pubDate>Fri, 13 Mar 2026 19:07:24 +0000</pubDate>
      <link>https://forem.com/grace_olabode_3be546efe9b/building-the-search-my-week-2-progress-on-bloom-after-4cja</link>
      <guid>https://forem.com/grace_olabode_3be546efe9b/building-the-search-my-week-2-progress-on-bloom-after-4cja</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Grace Olabode | Engineering Lead, Bloom After&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/grace_olabode_3be546efe9b/building-with-care-my-week-1-setup-for-bloom-after-3590"&gt;my first article&lt;/a&gt;, I talked about setting the foundation for our project. This week, we actually started building the tools for mothers to find support. It was a busy week of maps and filters and making the Resource Hub look exactly like the safe space the designers planned.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built This Week
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The Clinic &amp;amp; Hospital Finder&lt;/strong&gt;&lt;br&gt;
This was the most technical part of my week. I built the search directory so mothers can find a clinic easily without scrolling forever while strictly following our MVP requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Interactive Map &amp;amp; Directions&lt;/strong&gt; I used Leaflet.js to make a map with clinic pins. I also added a "Use My Location" button that uses browser geolocation and the Haversine formula to calculate exactly how many kilometers away each clinic is, automatically sorting the closest ones to the top. I also wired up a "Directions" button that routes users directly via Google Maps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Advanced Filters:&lt;/strong&gt; I made a filtering system so users can sort by cost like Free/Subsidised vs Private. They can also filter by the type of provider (clinic, therapist, psychiatrist) or if they want to see someone online or in person.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic Slide-out Details:&lt;/strong&gt; When you click a provider, a panel slides out. I programmed the logic to dynamically render different information depending on the provider type which includes displaying specialist credentials, languages spoken, areas of expertise, opening hours, fee ranges, and an "Accepting New Patients" status pill.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Private Feedback System:&lt;/strong&gt; To keep the directory a safe space, our MVP doesn't include public reviews. Instead, I built a secure "Private Feedback" form inside the details panel so mothers can confidentially share their experiences directly with our team for quality control.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Building the Resource Hub&lt;/strong&gt;&lt;br&gt;
A huge part of my week was spent getting the content library ready. I didn't just style things but I actually built the main pages from scratch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Main Library:&lt;/strong&gt; I built the Articles and Resources pages from the ground up. I had to make sure the logic was set up so that we can easily add more content later without the code breaking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technical Layouts:&lt;/strong&gt; I updated the code in renderers.js to handle the specific data structures for our resources. This included building the logic to display infographics properly and setting up the side-by-side comparison view for the "Myth vs. Fact" section.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Tools &amp;amp; Setup
&lt;/h2&gt;

&lt;p&gt;We needed a way to host images and keep the site live without managing our own servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudinary, MongoDB, and Render:&lt;/strong&gt;&lt;br&gt;
I worked with our Backend Lead, Chijioke Uzodinma, to set up Cloudinary for our images. This keeps the site fast because heavy images won't slow us down. We also integrated MongoDB to store the clinic and resources data and moved everything over to Render so our backend logic stays stable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;p&gt;The biggest headache was a map bug where it would just show a blank grey box. I figured out it was trying to load before the page was fully ready so I added a fix in the JS to force the map to check its size again right after the page loads.&lt;/p&gt;

&lt;p&gt;Another hurdle was getting the "Directions" button to actually route users properly. I initially thought I could just pass the raw latitude and longitude into a basic link, but it wasn't working. I had to dig in and figure out the exact URL format Google Maps requires so that when a mother clicks the button, it seamlessly opens up accurate driving or walking directions on her device.&lt;/p&gt;

&lt;p&gt;I also had a problem with the "Load More" button not hiding when the list was finished. I fixed this by adding a global rule in our CSS to make sure the "hidden" command always wins over other styles.&lt;/p&gt;

&lt;p&gt;Finally, we had a weird issue with Render. For some reason I don't really understand yet, it isn't deploying automatically when we push our code. Because of this, we have to go in and manually trigger the deployments every single time we make a change. It's a bit annoying, but we are working around it for now!&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maps and Math:&lt;/strong&gt; I learned how to use the Haversine formula to calculate the distance between two points on a map.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cleaner Code:&lt;/strong&gt; I reminded myself to keep styling out of the JavaScript. Moving those styles into a CSS file made everything way easier to read and fix.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Working Together:&lt;/strong&gt; Setting up the cloud tools and MongoDB with the backend lead showed me how much faster we move when the frontend and backend are in sync.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team Shoutouts
&lt;/h2&gt;

&lt;p&gt;Building this isn't a one-person job. A massive thank you to the amazing people building this with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Chijioke Uzodinma (Backend Lead):Read his Week 2 article &lt;a href="https://dev.to/chijioke_uzodinma_d6ae6ef/turning-plans-into-code-my-week-2-progress-on-bloom-after-7jk"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nanji Lakan (Product Lead): Read her Week 2 article &lt;a href="https://medium.com/@Youtenstudio/leading-the-build-of-bloom-after-week-1-of-a-4-week-journey-1cb1e77c0ca7" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agugua Genevieve (Design Lead): Read her Week 2 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prisca Onyemaechi (Lead Maintainer): Read her Week 2 article &lt;a href=""&gt;here.&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adejola Esther (Frontend Engineer): Read her Week 2 article &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Christine Myangi (People Manager): Read her Week 2 article &lt;a href="https://open.substack.com/pub/techbytesbykris/p/bloom-after-scaling-support-through?utm_campaign=post-expanded-share&amp;amp;utm_medium=web" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Week 2 is done! The map is working and the resources look good. We’re getting closer to helping moms bloom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://the-bloom-after.netlify.app/" rel="noopener noreferrer"&gt;Visit our live site.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Tabi-Project/Bloom-After.git" rel="noopener noreferrer"&gt;Check out our Github Repo.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building with Care: My Week 1 Setup for Bloom After</title>
      <dc:creator>Grace Olabode</dc:creator>
      <pubDate>Fri, 06 Mar 2026 14:43:18 +0000</pubDate>
      <link>https://forem.com/grace_olabode_3be546efe9b/building-with-care-my-week-1-setup-for-bloom-after-3590</link>
      <guid>https://forem.com/grace_olabode_3be546efe9b/building-with-care-my-week-1-setup-for-bloom-after-3590</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Grace Olabode | Engineering Lead, Bloom After&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing code is usually about solving business problems. But sometimes, you get to build something that feels like a warm hug for someone going through a tough time.&lt;/p&gt;

&lt;p&gt;For the International Women’s Day (IWD) Sprint with the Tabi Project and TEE Foundation, our team is building Bloom After. It’s a website designed to safely support Nigerian mothers dealing with Postpartum Depression (PPD).&lt;/p&gt;

&lt;p&gt;As the Engineering Lead for this project, my job for Week 1 (our setup week) was to build a strong foundation. I needed to make sure our coding workspace was set up so that the final website would be fast, safe, and incredibly easy to use. Here is a look at how we started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping it Fast and Simple
&lt;/h2&gt;

&lt;p&gt;When a mother is tired, stressed, or overwhelmed, the last thing she needs is a slow, frustrating website. We had a strict rule from the start: the site must load in under 3 seconds on a mobile phone.&lt;/p&gt;

&lt;p&gt;To make this happen, we kept our tools very simple. Instead of using heavy, complicated coding frameworks, we went back to the basics and built the site using plain HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;We also made strict rules for how our team writes and shares code on GitHub. We set up a system where nobody is allowed to push code directly to the live website. Everything must be checked and approved first, which stops the site from accidentally breaking.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Work This Week
&lt;/h2&gt;

&lt;p&gt;As the Engineering Lead, I had to make sure my team could code smoothly without stepping on each other's toes. Here is what I focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I wrote the Technical Requirements Document (TRD). This is basically our rulebook. It tells the team exactly how to organize our files and how to set up our database to safely hold things like clinic locations and community stories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I set up our JavaScript so we could build things like the top navigation bar just once, and reuse it on every page. This saves the team a massive amount of time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I carefully checked the code my teammates wrote for our Landing Page to make sure it looked great and worked perfectly on mobile phones.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned This Week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Having a great plan doesn't matter if the team isn't talking. Constantly chatting and answering questions in Slack saved us from a lot of mistakes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building the website with plain HTML, CSS, and JavaScript reminded me that you don't always need the newest and fanciest tools to make something beautiful and functional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sprints move very fast. Knowing when to step back, take a breath, and just be a "cute potato" for a little while is super important so the team doesn't burn out!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team Shoutouts
&lt;/h2&gt;

&lt;p&gt;A strong foundation is only as good as the team building on top of it. A massive thank you to the amazing people building this with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Chijioke Uzodinma (Backend Lead): For helping me plan the database perfectly. Read his Week 1 article &lt;a href="https://dev.to/chijioke_uzodinma_d6ae6ef/laying-the-data-foundation-my-week-1-as-backend-lead-for-bloom-after-50n"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nanji Lakan (Product Lead): For making sure we are building exactly what these mothers need. Read her Week 1 article &lt;a href="https://medium.com/@Youtenstudio/leading-the-build-of-bloom-after-week-1-of-a-4-week-journey-1cb1e77c0ca7" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agugua Genevieve (Design Lead): For designing a website that feels safe, warm, and welcoming. Read her Week 1 article &lt;a href="https://medium.com/@kelechigenevieveagugua/designing-bloom-after-part-1-building-the-visual-foundation-of-a-maternal-mental-health-platform-d7be67c6346d" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prisca Onyemaechi (Lead Maintainer): For keeping our GitHub files perfectly organized. Read her Week 1 article &lt;a href="https://medium.com/@priscaonyemaechi26/keeping-bloom-after-organized-my-week-1-experience-a693e3affc60" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Christine Mwangi (People Manager): For keeping everyone happy, focused, and moving forward. Read her Week 1 article &lt;a href="https://open.substack.com/pub/techbytesbykris/p/technical-documentation-building?r=u32rt&amp;amp;utm_campaign=post&amp;amp;utm_medium=web&amp;amp;showWelcomeOnShare=true" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adejola Esther: For working on the landing page (contributions and partners section). Read her Week 1 article &lt;a href="https://medium.com/@adejolanu/week-in-the-life-of-a-frontend-engineering-intern-bloom-after-655b42485bfe" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Week 1 is officially done and our first pages are live! Next week, we dive into building the actual resource library and the clinic finder map. Let’s build something that matters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://the-bloom-after.netlify.app/" rel="noopener noreferrer"&gt;Visit our live site.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Tabi-Project/Bloom-After.git" rel="noopener noreferrer"&gt;Check out our Github Repo.&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>leadership</category>
      <category>mentalhealth</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building DateSpark: A Date Planning App for Couples</title>
      <dc:creator>Grace Olabode</dc:creator>
      <pubDate>Fri, 20 Feb 2026 19:35:49 +0000</pubDate>
      <link>https://forem.com/grace_olabode_3be546efe9b/building-datespark-a-date-planning-app-for-couples-2d46</link>
      <guid>https://forem.com/grace_olabode_3be546efe9b/building-datespark-a-date-planning-app-for-couples-2d46</guid>
      <description>&lt;p&gt;Live Demo: &lt;a href="https://date-spark-lovat.vercel.app/" rel="noopener noreferrer"&gt;DateSpark&lt;/a&gt;&lt;br&gt;
GitHub Repository: &lt;a href="https://github.com/Chijex5/DateSpark.git" rel="noopener noreferrer"&gt;DateSpark Repo&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem Statement
&lt;/h2&gt;

&lt;p&gt;We’ve all experienced that moment: staring blankly at each other at 7 PM, trapped in the cycle of "I don't know, what do you want to do?" By the time you come up with something, everything is closed.&lt;/p&gt;

&lt;p&gt;This is the problem DateSpark addresses. DateSpark is a date planning web app designed to reduce the stress of decision-making. You answer three simple questions: your budget, your vibe (activity preference), and how much time you have. The app then gives you a curated date idea. No more endless scrolling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfwj7p5nz0lzxcegwwnk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfwj7p5nz0lzxcegwwnk.png" alt="DateSpark's Landing Page" width="800" height="1482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DateSpark targets couples looking for meaningful experiences without the hassle. It’s essentially a relationship saver in a simple interface.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Architecture: Keeping It Vanilla
&lt;/h2&gt;

&lt;p&gt;While it might be tempting to use a large framework for every project, we built DateSpark with vanilla JavaScript, semantic HTML, and a highly customized CSS setup.&lt;/p&gt;

&lt;p&gt;For our data, we avoided a heavy backend and used a local JSON file (dateIdeas.json) as a read-only database. We relied on the browser's localStorage to save user-specific data. Here’s how it works behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Generate Flow: The "No Dead Ends" Algorithm&lt;/strong&gt;&lt;br&gt;
The Generate page is the core of the app. When a user submits their three preferences, our JavaScript gets to work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Mapping:&lt;/strong&gt; It takes the form inputs and maps them to our JSON data aliases (for example, it maps a "low" budget to "Free" and "₦"). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Fallback Protocol:&lt;/strong&gt; What happens if someone requests a 5 hour, free, luxury spa experience? Instead of showing an annoying "No results found" message, we created a "relaxation" fallback. The logic ignores filters one by one (first duration, then activity, then budget) until it finds suitable ideas. You always receive a date suggestion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Saving State:&lt;/strong&gt; See an idea you like? Clicking "Save to My Plans" packages the current idea with a timestamp and sends it right to localStorage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. My Plans: A LocalStorage Dashboard&lt;/strong&gt;&lt;br&gt;
This page serves as the user’s personal dashboard for saved dates.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State Management:&lt;/strong&gt; On loading, the JavaScript reads from the datespark.savedPlans.v1 array in local storage and separates the UI into "Upcoming" and "Completed" views based on a simple true/false condition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instant UI Updates:&lt;/strong&gt; We added a dynamic search bar that filters the grid in real-time by checking the input against titles, tags, and descriptions. Clicking "Mark Completed" updates the object, overwrites local storage, and refreshes the display instantly. It’s quick and has no network delays.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Browse Flow: Deep Linking for Sharing&lt;/strong&gt; &lt;br&gt;
Sometimes you just want to casually look for date ideas. The Browse page displays our entire JSON library in a clean grid.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Filtering:&lt;/strong&gt; Category buttons filter the array immediately without needing to reload the page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep Linking:&lt;/strong&gt; We didn’t just create modals; we made shareable ones. When you click on an idea, the JavaScript updates the URL parameter (?idea=ID). This means if you discover the perfect "Starlit Rooftop Picnic," you can copy the link and text it to your partner, and it will open directly to that specific modal.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Home Page: Drag-to-Scroll and Simulated Delays&lt;/strong&gt; &lt;br&gt;
First impressions count, so the Home page needed to feel engaging.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Carousel:&lt;/strong&gt; Instead of a basic CSS slider, we built a custom JavaScript carousel for the "Curated Experiences" section that supports drag-to-scroll, button clicks, and arrow key navigation for better usability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Form Validation:&lt;/strong&gt; The newsletter form checks submissions, runs a strict Regex check on the email, and simulates a processing delay before switching the success/error DOM states.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9vrkpp57csy2adn2aux.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9vrkpp57csy2adn2aux.gif" alt="DateSpark's User Flow" width="400" height="215"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Design System: Using CSS Custom Properties
&lt;/h2&gt;

&lt;p&gt;To maintain consistent styling across five different pages, the entire design system relies on CSS variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Emotional Design&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* --- Brand Colors --- */&lt;/span&gt;
  &lt;span class="py"&gt;--color-brand-50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="m"&gt;#FFF1F2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-brand-100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFE4E6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-brand-500&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#F43F5E&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-brand-600&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#E11D48&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Primary Brand Color */&lt;/span&gt;
  &lt;span class="py"&gt;--color-brand-700&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#BE123C&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-brand-900&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#881337&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* --- Neutral Colors --- */&lt;/span&gt;
  &lt;span class="py"&gt;--color-bg-cream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="m"&gt;#FDF2F0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Global Background */&lt;/span&gt;
  &lt;span class="py"&gt;--color-bg-white&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="m"&gt;#FFFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-text-main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1F2937&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-text-muted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#4B5563&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="m"&gt;#E5E7EB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* --- Extended Colors --- */&lt;/span&gt;
  &lt;span class="py"&gt;--color-burgundy-900&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#7E0C2A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-rose-25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF7F7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-rose-30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF5F3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-rose-50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF5F5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41se0wtkxi7pvv2oj9kd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41se0wtkxi7pvv2oj9kd.png" alt="DateSpark's Color Palette" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We steered clear of cliché "Valentine's Day Hot Pink." Instead, we chose a mature color scheme that ranges from rose to deep burgundy, complemented by a warm cream background (#FDF2F0).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Spacing &amp;amp; Shadow System&lt;/strong&gt;
Nothing is hardcoded. Every gap and padding uses an 8-point scale (for example, --space-4 for 16px). Shadows are named according to their component instead of their technical values: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;--shadow-primary-btn for our call-to-action buttons. &lt;br&gt;
--shadow-feature-card for key elements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSS Grid to the Rescue&lt;/strong&gt;
We relied heavily on CSS Grid to handle common layout challenges. For example, centering a navbar with different widths for the logo and the auth buttons can be tricky with Flexbox. Using CSS Grid with 1fr auto 1fr solves this perfectly:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.navbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-areas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"logo  links  auth"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The two 1fr columns share the space equally, keeping the links centered relative to the viewport, no matter what happens on the sides.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* --- Typography --- */&lt;/span&gt;
&lt;span class="nt"&gt;--font-serif&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Playfair Display'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--font-sans&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s2"&gt;'Inter'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;sans-serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nt"&gt;--text-size-h1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;3&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;    &lt;span class="c"&gt;/* 48px */&lt;/span&gt;
&lt;span class="nt"&gt;--text-size-h2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;    &lt;span class="c"&gt;/* 32px */&lt;/span&gt;
&lt;span class="nt"&gt;--text-size-h3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;25&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 20px */&lt;/span&gt;
&lt;span class="nt"&gt;--text-size-p&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;    &lt;span class="c"&gt;/* 16px */&lt;/span&gt;

&lt;span class="c"&gt;/* Additional fluid sizes */&lt;/span&gt;
&lt;span class="nt"&gt;--text-size-xs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;75&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--text-size-sm&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;95&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--text-size-2xs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;7&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui5642hqo0whggehslh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui5642hqo0whggehslh6.png" alt="DateSpark's Typography" width="690" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Playfair Display handles all headings and the logo. It has an elegant and  editorial quality. Inter handles body text, navigation, and UI labels because it is clean and very readable at small sizes on screens.&lt;/p&gt;
&lt;h2&gt;
  
  
  Semantic HTML &amp;amp; Accessibility
&lt;/h2&gt;

&lt;p&gt;Semantic HTML was a priority. Every saved plan is wrapped in an  tag because it is a self-contained piece of content. We linked headings to their parent containers using aria-labelledby so screen readers properly announce card titles. Here is a plan card from the My Plans page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;article&lt;/span&gt; &lt;span class="na"&gt;aria-labelledby=&lt;/span&gt;&lt;span class="s"&gt;"plan-1-title"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"plan-card card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;figure&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"plan-media card-media"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
      &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://images.unsplash.com/photo-1604942030135-73e2f02503b3?q=80&amp;amp;w=751"&lt;/span&gt;
      &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Starlit rooftop picnic setting"&lt;/span&gt;
      &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"600"&lt;/span&gt;
      &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"360"&lt;/span&gt;
    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"plan-1-title"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"plan-title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Starlit Rooftop Picnic&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Plan tags"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"plan-tags tag-list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Romantic&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;NN&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;3 hrs&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    A curated evening with artisanal snacks, plush blankets, and a
    telescope for star-gazing.
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Plan actions"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"plan-actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/plans/starlit-rooftop-picnic"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"plan-link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;View Details&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"plan-done"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Completed&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each card is an  because it is a self contained piece of content. The heading is linked to the article using aria-labelledby so screen readers announce the card title when a user navigates to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeqo05z2z0nh3zt4cwz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeqo05z2z0nh3zt4cwz5.png" alt="DateSpark's My Plans Page" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other accessibility decisions across the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Skip Links:&lt;/strong&gt; A hidden &lt;code&gt;&amp;lt;a class="skip-link" href="#main-content"&amp;gt;&lt;/code&gt; lets keyboard users jump straight past the navigation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Semantic Outlines:&lt;/strong&gt; Strict heading hierarchy (one &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; per page, down to &lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt; for cards) for both SEO and screen readers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Screen-Reader Only Text:&lt;/strong&gt; We used a .sr-only utility class for labels that are meaningful to assistive tech but shouldn't clutter the visual UI.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.sr-only&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-1px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Most Challenging Component: CSS Only Hamburger Menu&lt;/strong&gt;&lt;br&gt;
The mobile navigation works with absolutely zero JavaScript. We used the "hidden checkbox hack." A hidden &lt;code&gt;&amp;lt;input type="checkbox"&amp;gt;&lt;/code&gt; acts as the state, and a styled  acts as the button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- input and label MUST come before the nav groups --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"nav-check"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-check"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"nav-check"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-toggle"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Toggle navigation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-links"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-auth-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the CSS sibling selector (~), checking the box reveals the menu and animates the three hamburger bars into an "X":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.nav-check&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="nc"&gt;.nav-links&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex-start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--space-4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--space-4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--space-2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--border-1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-border&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--space-3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.nav-check&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="nc"&gt;.nav-toggle&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;7px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;45deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.nav-check&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="nc"&gt;.nav-toggle&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.nav-check&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="nc"&gt;.nav-toggle&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-7px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-45deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reflection: Lessons and Version 2
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What was hardest&lt;/strong&gt;: Keeping CSS class names consistent across multiple HTML files before the styles began to break. We quickly learned to treat class names as unchangeable contracts before applying any styling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What surprised me technically&lt;/strong&gt;: position: sticky completely gives up if a parent container has position: relative. It creates a scroll boundary that breaks the sticky behavior. It isn't obvious until you spend an hour battling it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I would do differently in version two:&lt;/strong&gt; While localStorage and a static JSON file are very fast, they are tied to the user’s current device. The next step for DateSpark is to replace our local storage setup with a real database. This way, users can create accounts, log in from anywhere, and keep their date plans in sync permanently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributors
&lt;/h2&gt;

&lt;p&gt;This project was a wonderful team effort! A big thanks to my amazing coding partner, Chijioke.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check out their GitHub here: &lt;a href="https://github.com/Chijex5" rel="noopener noreferrer"&gt;Chijex5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Read about their side of the DateSpark journey &lt;a href="https://dev.to/chijioke_uzodinma_d6ae6ef/building-datespark-a-simple-date-planning-website-31lc"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webapp</category>
      <category>html</category>
      <category>css</category>
      <category>loveproject</category>
    </item>
  </channel>
</rss>
