<?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>DEV Community: Awoyemi Abiola</title>
    <description>The latest articles on DEV Community by Awoyemi Abiola (@biola).</description>
    <link>https://dev.to/biola</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%2F1108208%2F5f83962d-fe5b-4f8a-bde1-e57530c9fa38.png</url>
      <title>DEV Community: Awoyemi Abiola</title>
      <link>https://dev.to/biola</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/biola"/>
    <language>en</language>
    <item>
      <title>Luminary - IWD Project</title>
      <dc:creator>Awoyemi Abiola</dc:creator>
      <pubDate>Sat, 07 Mar 2026 10:43:02 +0000</pubDate>
      <link>https://dev.to/biola/luminary-week-1-iwd-project-5h8p</link>
      <guid>https://dev.to/biola/luminary-week-1-iwd-project-5h8p</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;It's the month of March, and the month of International Women's day, and at the Rise Academy frontend track, we've been split across 3 teams to work on impactful projects solving real problems women in society - Nigeria and Africa more specifically - face today. &lt;/p&gt;

&lt;p&gt;One of these projects which I was assigned to and would be writing about is Luminary. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Luminary is a community-powered directory and news platform celebrating women who are driving change across all fields — business, science, arts, activism, sport, technology, agriculture, education, and more. It allows anyone to nominate or self-submit, is searchable by name and field, and surfaces daily and weekly news of women making impact globally.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My Team and I would be working over the next few weeks to bring Luminary to life, for this week, we created the Landing page. I would be writing about how it went, my role in the project, and the lessons I learned so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 1
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Project Setup Phase
&lt;/h2&gt;

&lt;p&gt;The setup phase for the project started out with each team member getting a role assigned, we are all primarily frontend developers on the project, but all have a supplementary role to manage one aspect of the project, &lt;br&gt;
available roles were;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Product Lead:&lt;/strong&gt; Owns the PRD, scope, and feature prioritisation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering Lead:&lt;/strong&gt; Oversees technical architecture and approves all PRs into the prod branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design Lead:&lt;/strong&gt; Owns the Design System, logo, and UI consistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead Maintainer:&lt;/strong&gt; Manages the repository and branching strategy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend Lead:&lt;/strong&gt; (Borrowed from other tracks) Manages API integration and database schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People Manager:&lt;/strong&gt; Manages workflows, team synergy, and escalates issues to the instructor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once we had our roles assigned,  the Lead maintainer, &lt;a href="https://github.com/vaden89" rel="noopener noreferrer"&gt;Isaac Shosanya&lt;/a&gt; created the repository to manage the project, I was assigned the role of Product Lead along with &lt;a href="https://github.com/Blisyphus" rel="noopener noreferrer"&gt;Ramnan Ramyil&lt;/a&gt; and we worked on the product documentation and feature prioritization. Other team members carried out their respective roles and documentation. A designer from the design track joined the team and helped create a Figma design file for the landing page. Once the foundation for the project was complete, we begun development.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Contributions as Product Lead and Frontend Engineer
&lt;/h2&gt;

&lt;p&gt;As a Frontend engineer on the project, I worked on the Hero section of the  landing page, it consisted of a header text, a cta, image and some metric information for Luminary, using placeholder numbers for now.&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%2F77kqjothb4v585vlk6ft.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%2F77kqjothb4v585vlk6ft.png" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;br&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%2F863eu8qblf9oktoo20su.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%2F863eu8qblf9oktoo20su.png" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a Product Lead, I also carried out the following;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Onboarded team members to our project channel on the project management tool being utilized - &lt;a href="https://clickup.com/" rel="noopener noreferrer"&gt;ClickUp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;I created custom task statuses that would align our project management process closer to our development processes&lt;/li&gt;
&lt;li&gt;I added tasks and assignees for each member to the ClickUp board &lt;/li&gt;
&lt;li&gt;I recorded a walkthrough video for the full task completion pipeline, from issue creation -&amp;gt; feature/task completion, and all that is required of team members in between.&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%2Fp2n4thehfnz3gkcmsdsq.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%2Fp2n4thehfnz3gkcmsdsq.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;So far, I have learnt and picked up improvements to writing commit messages from the standards in the documentation laid down by our Lead maintainer. &lt;/p&gt;

&lt;h2&gt;
  
  
  Week 2
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Specific Features Implemented
&lt;/h2&gt;

&lt;p&gt;This week I developed the UI and API integrations for Nominations of other women via a Nomination form on the application;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built the full nomination form UI.&lt;/li&gt;
&lt;li&gt;Integrated backend APIs for frontend consumption during nomination and self-submission form submissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Implementation Breakdown
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Form UX logic:&lt;/strong&gt; Implemented tab switching between nomination and self-submission panels, section collapse/expand accordion behavior to match designs precisely, and dynamic link inputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image preview:&lt;/strong&gt; Added file preview rendering in the thumbnail circle using the &lt;code&gt;FileReader&lt;/code&gt; API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload mapping:&lt;/strong&gt; Transformed UI inputs into the backend payload shape .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submission flow:&lt;/strong&gt; Added async JavaScript &lt;code&gt;fetch&lt;/code&gt; integration with status feedback and error handling.&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%2Fheogz0jrcpn05hs66rqa.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%2Fheogz0jrcpn05hs66rqa.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&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%2Fqxjisnxu5wqhzl230uun.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%2Fqxjisnxu5wqhzl230uun.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  BaaS Tool and Integration
&lt;/h3&gt;

&lt;p&gt;We chose &lt;strong&gt;Supabase&lt;/strong&gt; as our BaaS. I reviewed the nomination service and payload requirements, and matched the frontend submission shape to match the Supabase-backed tables as expected on the backend for &lt;code&gt;nominations&lt;/code&gt;, &lt;code&gt;nominee&lt;/code&gt; &amp;amp; &lt;code&gt;nominator&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges &amp;amp; Resolutions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Field mismatches between UI and API:&lt;/strong&gt; The backend expected &lt;code&gt;first_name/last_name&lt;/code&gt; fields, so I added name-splitting logic for to match the required payloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handling two form modes:&lt;/strong&gt; I scoped dynamic elements and payload building to the active panel so both nomination and self-submission submit correctly.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This week, from my work on the submissions flow for nominations, I learnt how to integrate API requests for complex form structures and improved my skills with UI DOM and Data manipulation in Frontend development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 3
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Specific Features Implemented
&lt;/h2&gt;

&lt;p&gt;This week I worked on the admin-side management interfaces and the user-facing news experience for the application;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built the admin nominations management UI with filtering, approval and rejection actions.&lt;/li&gt;
&lt;li&gt;Developed the admin news article interfaces, including the add article page and shared admin sidebar behavior.&lt;/li&gt;
&lt;li&gt;Built the user-facing news listing page and linked it into the existing user navigation.&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%2Fwunopa7f83nc98orayig.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%2Fwunopa7f83nc98orayig.png" alt=" " width="800" height="389"&gt;&lt;/a&gt;&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%2F0o9i731h22mbju8dhast.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%2F0o9i731h22mbju8dhast.png" alt=" " width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Implementation Breakdown
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admin nominations dashboard:&lt;/strong&gt; Implemented a responsive nominations table and card view, filter controls, action menus, and status badges to support moderation workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend integration for moderation:&lt;/strong&gt; Reviewed the nomination service and related admin routes, then connected the frontend list, search, approval and rejection actions to the authenticated backend endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable admin shell:&lt;/strong&gt; Refactored the sidebar styles and JavaScript into shared files so the same layout and active state behavior can be reused across admin pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News experience UI:&lt;/strong&gt; Built the add article page for admins and the public news page for users, using clean mock data and responsive image handling to match the provided designs closely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BaaS Tool and Integration
&lt;/h3&gt;

&lt;p&gt;We continued using &lt;strong&gt;Supabase&lt;/strong&gt; through the existing backend layer. For this week, I reviewed the nomination admin service, controller and routes, and mapped the frontend moderation UI to the backend responses so nomination records could be fetched, filtered, approved and rejected correctly from the admin interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges &amp;amp; Resolutions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Matching backend data to the UI structure:&lt;/strong&gt; The nomination data returned from the backend needed normalization before it could fit the table design, so I mapped nested nominee and nominator fields into a frontend-friendly shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable navigation across admin pages:&lt;/strong&gt; The sidebar active state did not initially work consistently across routed pages, so I updated the matching logic to normalize paths and moved the sidebar code into shared files for reuse.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This week, from building both the admin tools and the public news experience, I learnt more about integrating authenticated frontend flows with backend endpoints, structuring reusable UI logic across multiple pages, and translating design mockups into responsive interfaces that are easier to extend as Luminary grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 4 - Final Retrospective
&lt;/h2&gt;

&lt;p&gt;4 Weeks of back-to-back collaboration and development and we're finally at the finish line, for now at least. It has been a great sprint and I can say we've been able to achieve a great product at the end of it, let's dive in to the details for this week's coverage while looking back at the project as a whole in retrospect, after you...&lt;/p&gt;

&lt;h2&gt;
  
  
  Specific Features Implemented
&lt;/h2&gt;

&lt;p&gt;This week I focused on integrating a headless CMS into the application and shipping final polish across the frontend;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built a custom Sanity CMS client layer and article service module to power dynamic news content across the application.&lt;/li&gt;
&lt;li&gt;Refactored the entire frontend codebase folder structure for JavaScript, CSS, and HTML pages to improve maintainability.&lt;/li&gt;
&lt;li&gt;Fixed responsiveness issues on the article page, featured sections, and nomination forms.&lt;/li&gt;
&lt;li&gt;Added landing page animations and a loading state for the articles feed.&lt;/li&gt;
&lt;li&gt;Resolved lingering bugs including hero image rendering, nomination payload formatting, and broken navigation links.&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%2Fch0lgoz1wyw2fm7bsl3d.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%2Fch0lgoz1wyw2fm7bsl3d.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&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%2Fxx7nz3xvnf93jvwmdmr0.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%2Fxx7nz3xvnf93jvwmdmr0.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&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%2Ftvnhmn8g175rw2mu8wv3.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%2Ftvnhmn8g175rw2mu8wv3.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Implementation Breakdown
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sanity CMS client:&lt;/strong&gt; Built a lightweight, SDK-free integration layer (&lt;code&gt;sanity.js&lt;/code&gt;) that exposes GROQ querying, document mutations, and image uploads against Sanity's HTTP API, keeping the frontend dependency-free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Article service module:&lt;/strong&gt; Created &lt;code&gt;articles.js&lt;/code&gt; on top of the client layer with functions to fetch published articles, retrieve a single article by slug, and render article cards into the DOM dynamically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CMS integration across pages:&lt;/strong&gt; Connected the CMS service to the news listing page, individual article page, featured stories section on the landing page, and the admin add-article flow so content is now managed from Sanity rather than hardcoded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codebase restructuring:&lt;/strong&gt; Reorganized the JavaScript, CSS, and HTML files into cleaner folder hierarchies, updating all import paths and script references across the application to match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug fixes and polish:&lt;/strong&gt; Fixed the nomination form to correctly pass profile images in the payload, added remove buttons for dynamic link inputs, corrected hero image paths and optimized the hero asset to a lighter format.&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%2F0npcnotfhrqs0nueyfkm.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%2F0npcnotfhrqs0nueyfkm.png" alt=" " width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges &amp;amp; Resolutions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keeping the CMS integration lightweight:&lt;/strong&gt; Rather than pulling in the full Sanity SDK, I wrote a minimal client using native &lt;code&gt;fetch&lt;/code&gt; and URL construction, which kept the bundle lean and gave full control over how queries and mutations are handled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordinating the folder restructure with active development:&lt;/strong&gt; Restructuring the file hierarchy while other team members had open branches required careful communication and path updates to avoid merge conflicts across pages, styles, and scripts.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This week, from building the CMS integration and wrapping up the sprint, I learnt how to integrate a headless CMS into a vanilla JavaScript application without relying on framework-specific SDKs, and improved my understanding of GROQ as a query language for content APIs.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  A milestone worth celebrating
&lt;/h3&gt;

&lt;p&gt;Over four weeks, we took Luminary from a blank repository to a fully functional community platform, a searchable directory of women driving change, a moderated nomination pipeline, and a CMS-powered news experience — all built by a team of frontend developers learning to collaborate across product, engineering, and design roles.&lt;/p&gt;

&lt;h3&gt;
  
  
  What went well
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear role ownership from day one&lt;/strong&gt; meant each team member knew what they were responsible for, which kept decisions moving and reduced bottlenecks throughout the sprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental integration over big-bang merges&lt;/strong&gt; :shipping features in focused pull requests made code reviews manageable and kept the main branch stable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The move to Sanity as a CMS&lt;/strong&gt; gave us a clean content management layer without adding backend complexity, and the lightweight client approach kept the frontend simple.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I would do differently
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set up a shared environment configuration earlier.&lt;/strong&gt; Hardcoded API URLs and tokens caused unnecessary friction when switching between local and deployed environments; a centralized config from week one would have saved time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invest more in responsive testing early on.&lt;/strong&gt; Several responsiveness fixes landed in the final week that could have been caught sooner with a mobile-first review step during each PR.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What surprised me
&lt;/h3&gt;

&lt;p&gt;The amount of coordination required to restructure a codebase mid-sprint without disrupting teammates was more involved than I expected. It reinforced how important clear communication and small, well-scoped commits are when working on shared code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key technical lessons from the sprint
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrating backend APIs with complex frontend form structures requires careful attention to payload shape alignment between what the UI collects and what the API expects.&lt;/li&gt;
&lt;li&gt;A headless CMS can be integrated with just native browser APIs when the requirements are straightforward.&lt;/li&gt;
&lt;li&gt;Reusable UI patterns like the admin sidebar and shared navigation should be extracted into shared modules early to avoid duplicated effort across pages.&lt;/li&gt;
&lt;li&gt;Writing clean, conventional commit messages and maintaining a consistent branching strategy makes the codebase significantly easier to navigate as the project grows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shout-outs
&lt;/h2&gt;

&lt;p&gt;A big thank you to the entire Luminary team for a strong sprint. To &lt;a href="https://github.com/vaden89" rel="noopener noreferrer"&gt;Isaac&lt;/a&gt; for keeping the repository and backend running smoothly, &lt;a href="https://github.com/chisomdaniel" rel="noopener noreferrer"&gt;Daniel&lt;/a&gt; for thorough code reviews and architectural guidance, &lt;a href="https://github.com/Blisyphus" rel="noopener noreferrer"&gt;Ramnan&lt;/a&gt; for co-leading product decisions, &lt;a href="https://github.com/Rukkyoo" rel="noopener noreferrer"&gt;Michael&lt;/a&gt; for the design system and UI consistency, &lt;a href="https://github.com/MrNaturi" rel="noopener noreferrer"&gt;Emmanuel&lt;/a&gt; for keeping us coordinated, and Ariyo for volunteering design support, and finally special thanks to Sophia Ahuoyiza, The Tabi and Rise Academy Team for facilitating all of this, It was a great experience building this together.&lt;/p&gt;

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

&lt;p&gt;-Product Lead 1: &lt;a href="https://github.com/Blisyphus" rel="noopener noreferrer"&gt;Ramnan Ramyil&lt;/a&gt; &lt;br&gt;
-Product Lead 2: &lt;a href="https://github.com/Yourgotopyromaniac" rel="noopener noreferrer"&gt;Awoyemi Abiola&lt;/a&gt;&lt;br&gt;
-People Manager: &lt;a href="https://github.com/MrNaturi" rel="noopener noreferrer"&gt;Emmanuel Dania&lt;/a&gt;&lt;br&gt;
-Lead Maintainer: &lt;a href="https://github.com/vaden89" rel="noopener noreferrer"&gt;Isaac Shosanya&lt;/a&gt;&lt;br&gt;
-Design Lead: &lt;a href="https://github.com/Rukkyoo" rel="noopener noreferrer"&gt;Michael Omonedo&lt;/a&gt;&lt;br&gt;
-Engineering Lead: &lt;a href="https://github.com/chisomdaniel" rel="noopener noreferrer"&gt;Daniel Chisom&lt;/a&gt;&lt;br&gt;
-Backend Lead: &lt;a href="https://github.com/vaden89" rel="noopener noreferrer"&gt;Isaac Shosanya&lt;/a&gt;&lt;br&gt;
-Volunteer (UI/UX): Ariyo Taiwo&lt;/p&gt;

&lt;h2&gt;
  
  
  Github Repository
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Tabi-Project/Luminary" rel="noopener noreferrer"&gt;Luminary&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm not crying, you are&lt;br&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%2Fs31yw2e4fdg4sq65fy2l.jpg" 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%2Fs31yw2e4fdg4sq65fy2l.jpg" alt=" " width="608" height="608"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>iwd</category>
    </item>
    <item>
      <title>LovedIn: A Case Study</title>
      <dc:creator>Awoyemi Abiola</dc:creator>
      <pubDate>Sat, 21 Feb 2026 12:10:32 +0000</pubDate>
      <link>https://dev.to/biola/lovedin-a-case-study-4hc7</link>
      <guid>https://dev.to/biola/lovedin-a-case-study-4hc7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hi, I'm Awoyemi Abiola, and this is my case study for the week 5 task of the Rise Academy Frontend track project - &lt;a href="https://lovedin.vercel.app/" rel="noopener noreferrer"&gt;LovedIn&lt;/a&gt;, In this Case study, we'll cover what &lt;em&gt;love challenges&lt;/em&gt; this project solves, who it solves it for, solution and UI design, technical structure and architecture of the project with HTML and CSS, and finally an overall reflection on collaboration and areas to improve. Let's dive in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;In today's fast-paced digital world, expressing romantic interest has become increasingly complex and anxiety-inducing. Many individuals struggle with:   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Finding the right words:&lt;/strong&gt; The pressure of crafting the perfect romantic proposal or expression of interest often leads to missed opportunities or awkward encounters. People spend hours overthinking what to say, how to say it, and when to say it, which can result in never saying anything at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalization challenges:&lt;/strong&gt; Generic romantic gestures often fail to capture the unique connection between two people, making them feel impersonal or insincere. A simple "Will you be my girlfriend/boyfriend?" text message doesn't convey the depth of thought and care that went into the decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of memorable format:&lt;/strong&gt; Traditional text messages or social media DMs lack the special, memorable quality that important relationship milestones deserve. These moments should be cherished and remembered, not lost in a sea of chat history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LovedIn&lt;/strong&gt; addresses these challenges by providing a structured, thoughtful, and personalized platform that takes the stress out of romantic proposals while maintaining authenticity and sincerity. It gives users the tools to express their feelings in a beautiful, memorable way. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Primary target audience for &lt;strong&gt;LovedIn&lt;/strong&gt; is a demographic of tech-comfortable young adults (18-35 years old) familiar with online dating culture and value creative and thoughtful expressions of affection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution Design
&lt;/h2&gt;

&lt;p&gt;To solve this problem, we designed a multi-page proposal website with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive Landing Page Experience
&lt;/li&gt;
&lt;li&gt;Personalized Information Collection via a form&lt;/li&gt;
&lt;li&gt;An auto-generated and customized Proposal page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This flow was chosen to maintain a sense of emotional connection throughout the proposal creation process. Our users would not just be filling a form and getting a link but be crafting a thoughtful and romantic experience for their prospective partners.&lt;/p&gt;

&lt;h2&gt;
  
  
  UI Design System
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Colors
&lt;/h3&gt;

&lt;p&gt;The colour palette leans into romantic and affectionate tones. We aimed to create a visual mood that feels warm, gentle, and emotionally inviting. These colours were chosen to reflect love, softness, and intimacy without feeling loud or overwhelming.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primary: #E22B3B [Scarlet Blush]&lt;/li&gt;
&lt;li&gt;Secondary: #ED4779 [Wild Strawberry]&lt;/li&gt;
&lt;li&gt;Accent: #FA88BB [Petal Frost]&lt;/li&gt;
&lt;li&gt;Background: #F0D1D7 [Pink Carnation] &lt;/li&gt;
&lt;li&gt;Support: #D86A77 [Blush Rose]&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%2Fcongdkti6bo4c1n8cyou.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%2Fcongdkti6bo4c1n8cyou.png" alt=" " width="800" height="289"&gt;&lt;/a&gt;&lt;br&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%2Fx8ppq6f6g4l3g1dfaxxk.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%2Fx8ppq6f6g4l3g1dfaxxk.png" alt=" " width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Typography
&lt;/h3&gt;

&lt;p&gt;For fonts we sought after a font that was both expressive and somewhat simple, to balance romance with clarity and ensure emotional expression without sacrificing readability. After deliberation, we decided on &lt;a href="https://fonts.google.com/specimen/Playfair+Display" rel="noopener noreferrer"&gt;Playfair Display&lt;/a&gt; for headings and &lt;a href="https://fonts.google.com/specimen/Inter" rel="noopener noreferrer"&gt;Inter&lt;/a&gt; for body text.&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%2Fje00o6vwbwydtypn82xp.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%2Fje00o6vwbwydtypn82xp.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;br&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%2Fdoqezqtcdhp69sqj8vhp.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%2Fdoqezqtcdhp69sqj8vhp.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  HTML &amp;amp; Structural Approach
&lt;/h2&gt;

&lt;p&gt;The website was built using semantic HTML to improve accessibility and SEO.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Semantic Elements Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; for navigation and hero section&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; for primary content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; for logical grouping&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; for closing content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt; for separate content&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  CSS Architecture
&lt;/h2&gt;
&lt;h3&gt;
  
  
  CSS Variables
&lt;/h3&gt;

&lt;p&gt;To ensure consistency, I used CSS custom properties for colors, fonts, spacing values and transitions in a base css file shared across all pages in the application:&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;/* ========== COLORS ========== */&lt;/span&gt;

  &lt;span class="c"&gt;/* Primary Colors */&lt;/span&gt;
  &lt;span class="py"&gt;--color-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#e22b3b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-primary-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f0d1d7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Secondary Colors */&lt;/span&gt;
  &lt;span class="py"&gt;--color-secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ed4779&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-secondary-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff6f8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Accent Colors */&lt;/span&gt;
  &lt;span class="py"&gt;--color-accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fa88bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Support Colors */&lt;/span&gt;
  &lt;span class="py"&gt;--color-support&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#d86a77&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-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-gray-50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f9fafb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-gray-100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f3f4f6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-gray-200&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="py"&gt;--color-gray-300&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#d1d5db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-gray-400&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#9ca3af&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-gray-500&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#6b7280&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-gray-600&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-gray-700&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#374151&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-gray-800&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-gray-900&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111827&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-black&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* ========== TYPOGRAPHY ========== */&lt;/span&gt;

  &lt;span class="c"&gt;/* Font Families */&lt;/span&gt;
  &lt;span class="py"&gt;--font-display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Playfair Display"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Inter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Base Font Size */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Font Sizes - Type Scale */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-xs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 12px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.875rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 14px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 16px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.125rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 18px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 20px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-2xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 24px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-3xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.875rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 30px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-4xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 36px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-5xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 48px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-6xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.75rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 60px */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-7xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 72px */&lt;/span&gt;

  &lt;span class="c"&gt;/* Heading Scales */&lt;/span&gt;
  &lt;span class="py"&gt;--heading-h1&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;--font-size-5xl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--heading-h2&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;--font-size-4xl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--heading-h3&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;--font-size-3xl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--heading-h4&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;--font-size-2xl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--heading-h5&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;--font-size-xl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--heading-h6&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;--font-size-lg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c"&gt;/* Font Weights */&lt;/span&gt;
  &lt;span class="py"&gt;--font-weight-normal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-weight-medium&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-weight-semibold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-weight-bold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-weight-extrabold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Line Heights */&lt;/span&gt;
  &lt;span class="py"&gt;--line-height-tight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--line-height-normal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--line-height-relaxed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.75&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* ========== SPACING &amp;amp; SHAPES ========== */&lt;/span&gt;

  &lt;span class="c"&gt;/* Spacing Scale - Padding/Margin */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-xs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 4px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 8px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 16px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 24px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 32px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-2xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 40px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-3xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 48px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-4xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 64px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-5xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 80px */&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-6xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 96px */&lt;/span&gt;

  &lt;span class="c"&gt;/* Border Radius */&lt;/span&gt;
  &lt;span class="py"&gt;--radius-sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius-xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius-2xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius-full&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9999px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* Border Widths */&lt;/span&gt;
  &lt;span class="py"&gt;--border-width-thin&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="py"&gt;--border-width-medium&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--border-width-thick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* ========== SHADOWS ========== */&lt;/span&gt;

  &lt;span class="py"&gt;--shadow-sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;rgba&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.05&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt; &lt;span class="m"&gt;-1px&lt;/span&gt; &lt;span class="n"&gt;rgba&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.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt; &lt;span class="m"&gt;-3px&lt;/span&gt; &lt;span class="n"&gt;rgba&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.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="m"&gt;25px&lt;/span&gt; &lt;span class="m"&gt;-5px&lt;/span&gt; &lt;span class="n"&gt;rgba&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.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-2xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;25px&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt; &lt;span class="m"&gt;-12px&lt;/span&gt; &lt;span class="n"&gt;rgba&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.25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-colored&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;226&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-subtle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;226&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c"&gt;/* ========== TRANSITIONS ========== */&lt;/span&gt;
  &lt;span class="py"&gt;--transition-fast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150ms&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--transition-base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;250ms&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--transition-slow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;350ms&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* ========== LINEAR GRADIENTS ========== */&lt;/span&gt;
  &lt;span class="py"&gt;--gradient-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="m"&gt;135deg&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;--color-primary-bg&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;--color-secondary-bg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--gradient-secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="m"&gt;135deg&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;--color-secondary-bg&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;--color-primary-bg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--gradient-transparent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;203&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;182&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;193&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&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;This approach ensured consistency and cohesiveness for shared elements on the website, reducing repetition as much as possible.&lt;/p&gt;

&lt;p&gt;Flex display was used across the application for a consistent layout and seamless responsiveness&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="nt"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;flex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="nt"&gt;align-items&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;center&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="nt"&gt;justify-content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;space-between&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A particularly challenging component was the navigation bar. My initial implementation for the navbar was not in tune with semantic standards, or a non-repetitive HTML structure. This was fixed and improved to take all these into consideration, keeping all links as direct descendants of the nav element.&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navigation"&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;"index.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo"&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;"assets/images/logo.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"LovedIn logo"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"200"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"nav-links-container"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Main navigation"&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;"#features"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navlink"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Features&lt;span class="nt"&gt;&amp;lt;/a&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;"stories.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navlink"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Stories&lt;span class="nt"&gt;&amp;lt;/a&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;"login.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary auth-btn navlink"&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign In&lt;span class="nt"&gt;&amp;lt;/a&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;"index.html#get-started"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary navlink"&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Get Started&lt;span class="nt"&gt;&amp;lt;/a&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/nav&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.navigation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1144px&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;0&lt;/span&gt; &lt;span class="nb"&gt;auto&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;--spacing-3xl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;background&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;--color-secondary-bg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&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;--radius-full&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;--spacing-md&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;--spacing-lg&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;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="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;space-between&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&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;--shadow-md&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;#nav-links-container&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;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="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;--spacing-3xl&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%2F8klscqyyp2c0f4oj7krl.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%2F8klscqyyp2c0f4oj7krl.png" alt=" " width="800" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Visuals
&lt;/h3&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%2Fvbvb599usp5w8blqpvtg.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%2Fvbvb599usp5w8blqpvtg.png" alt=" " width="800" height="455"&gt;&lt;/a&gt;&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%2Fr9es2te036salzyqynxh.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%2Fr9es2te036salzyqynxh.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&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%2F1x08yrbs1woopfegivr9.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%2F1x08yrbs1woopfegivr9.png" alt=" " width="800" height="455"&gt;&lt;/a&gt;&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%2F4ad3gls64ly5dmu8d2do.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%2F4ad3gls64ly5dmu8d2do.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Responsiveness
&lt;/h3&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%2Flu93soub2elt68sqzu1o.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%2Flu93soub2elt68sqzu1o.png" alt=" " width="356" height="802"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript Implementation
&lt;/h2&gt;

&lt;p&gt;Our application's interactivity is powered by three vanilla ES6+ JavaScript files &lt;code&gt;app.js&lt;/code&gt;, &lt;code&gt;proposal.js&lt;/code&gt;, and &lt;code&gt;stories.js&lt;/code&gt; each scoped to a specific page with no external libraries or frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;app.js&lt;/code&gt; Home Page Logic
&lt;/h3&gt;

&lt;p&gt;Handles the landing page's proposal form and hamburger navigation menu.&lt;/p&gt;

&lt;h4&gt;
  
  
  Proposal Form Submission
&lt;/h4&gt;

&lt;p&gt;Captures the partner's name and relationship type, validates both fields, then redirects to &lt;code&gt;proposal.html&lt;/code&gt; with the values encoded as URL query parameters. Incomplete submissions trigger an alert.&lt;/p&gt;

&lt;h4&gt;
  
  
  Modal &amp;amp; Sharing
&lt;/h4&gt;

&lt;p&gt;After a valid URL is generated, a modal offers two options: share via the &lt;strong&gt;Web Share API&lt;/strong&gt; (with a clipboard fallback) or preview the proposal. The modal can be closed by clicking outside it, pressing &lt;code&gt;Escape&lt;/code&gt;, or using the close button.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hamburger Menu
&lt;/h4&gt;

&lt;p&gt;Toggles an &lt;code&gt;active&lt;/code&gt; class on the nav container to show/hide links on mobile. Updates &lt;code&gt;aria-expanded&lt;/code&gt; for accessibility. The menu closes automatically when a link is clicked or the user taps outside the nav.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;proposal.js&lt;/code&gt; Proposal Page Logic
&lt;/h3&gt;

&lt;p&gt;Powers the interactive experience recipients see when they open a shared proposal link.&lt;/p&gt;

&lt;h4&gt;
  
  
  URL Parameter Parsing
&lt;/h4&gt;

&lt;p&gt;Reads &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;type&lt;/code&gt; query parameters via &lt;code&gt;URLSearchParams&lt;/code&gt; and dynamically updates the proposal heading (e.g. &lt;em&gt;"Will you be my girlfriend, Sarah"&lt;/em&gt;) if both values are present.&lt;/p&gt;

&lt;h4&gt;
  
  
  Yes / No Interaction
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt; hides the proposal state and reveals a celebratory success message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; deliberately unclikable; moves to a random screen position on &lt;code&gt;mouseenter&lt;/code&gt; or &lt;code&gt;touchstart&lt;/code&gt;, making it playfully impossible to select.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Keyboard &amp;amp; Navigation
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;Escape&lt;/code&gt; navigates back to the previous page. A &lt;strong&gt;Back Home&lt;/strong&gt; button in the success state redirects to the landing page.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;stories.js&lt;/code&gt; Stories Page Logic
&lt;/h3&gt;

&lt;p&gt;Dynamically renders the stories page from a local data array, simulating a backend data layer.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mock Data
&lt;/h4&gt;

&lt;p&gt;Stories are stored as an array of objects, each containing couple names, location, image URL, alt text, a quote, and a date.&lt;/p&gt;

&lt;h4&gt;
  
  
  DOM Rendering
&lt;/h4&gt;

&lt;p&gt;On page load, the script iterates over the stories array and creates an &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt; element for each entry using template literals, then appends it to the stories grid. No story content is hardcoded in the HTML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logic Flow
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Journey&lt;/th&gt;
&lt;th&gt;Steps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proposal Creation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User fills form, &lt;code&gt;app.js&lt;/code&gt; validates builds URL with query params, modal opens, user shares or previews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proposal Experience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recipient opens link, &lt;code&gt;proposal.js&lt;/code&gt; parses params, heading personalised Yes reveals success state; No escapes cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stories Page&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Page loads,&lt;code&gt;stories.js&lt;/code&gt; reads local array iterates stories, injects article cards into DOM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Edge Case Handling
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Edge Case&lt;/th&gt;
&lt;th&gt;Handling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Empty form submission&lt;/td&gt;
&lt;td&gt;Alert shown; form not submitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing URL parameters&lt;/td&gt;
&lt;td&gt;Heading update skipped; default placeholder shown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Share API unavailable&lt;/td&gt;
&lt;td&gt;Falls back to clipboard copy; uses native prompt as last resort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modal elements not present&lt;/td&gt;
&lt;td&gt;All modal logic guarded with null checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stories grid not found&lt;/td&gt;
&lt;td&gt;Checks for grid container before populating&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No button on touch devices&lt;/td&gt;
&lt;td&gt;Evasion triggered on both &lt;code&gt;mouseenter&lt;/code&gt; and &lt;code&gt;touchstart&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;Overall, this was a very interesting project for me, I learnt a lot about collaboration with Git and Github, and even more about standards for writing semantic HTML, and structured design systems with CSS.&lt;/p&gt;

&lt;p&gt;That said, collaboration did not come without its challenges, particularly around maintaining a standardized approach to implementing features and pages on the application due to differing perspectives for each collaborator, we were able to overcome this via clear and concise discussions and meetings before and throughout the task delivery processes, where I properly communicated to my partner, and her to me, clear and concise requirements for each week's task.&lt;/p&gt;

&lt;p&gt;In a version 2.0, I would work towards improving semantics and optimizing SEO and accessibility for the project to near perfection, as these are the areas we received feedback for improvement.&lt;/p&gt;

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

&lt;p&gt;This project was developed collaboratively with;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oluchi Okwuosa&lt;/strong&gt; – &lt;a href="https://github.com/luchiiii" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can view their version of this case study &lt;a href="https://dev.to/oluchii/building-lovedin-a-case-study-25lk"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;strong&gt;Sophia Ahuoyiza&lt;/strong&gt; - &lt;a href="https://github.com/Ahuoyiza" rel="noopener noreferrer"&gt;Github&lt;/a&gt; for issue submissions and feedback which helped greatly improve this project.&lt;/p&gt;

</description>
      <category>design</category>
      <category>frontend</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
