My First Remix Project

10th Feb 2024 (Updated on 15th Feb 2024)

A construction zone

Lessons while Building with Remix, Tailwind and TypeScript

My First Project in my New Position

First of all, HOORAY! 🎉 I recently accepted a position as a web developer at a great company. As my first assignment, my boss gave me a high-quality mockup in Figma and asked me to build it in code. He said all decisions where mine to make, except he did ask that I use Tailwind.

I could have built the layout with HTML and CSS but, thinking about the possibility that this ad-hoc page could turn into more pages or possibly a full-on site, I thought a framework wouldn’t be a bad idea. Seizing the opportunity to experience a new framework while I built this page was an added bonus.

The Task: Build a Complex Layout Using Technology of my Choice

The page was static but the layout was rather intricate with many small details.

Remix, Tailwind, and TypeScript

I decided to use Remix to build the page. Another benefit of choosing a framework for this project is that it future- and feature-proofs our page should we need to add to it. Now that that decision has been made, I started to break down the page into digestible pieces.

I made components out of similar functioning and looking pieces and passed props containing the unique information for each.

The basic component usage:

// index.tsx
<SectionHeader
  headerText="Patient Satisfaction"
  imgSrc={blueEgg}
  bodyCopy="Our patients rate us the highest in the industry"
  tileClass="tile--light"
/>

The basic component structure:

// SectionHeader.tsx
export default function SectionHeader(props: {
  headerText: string,
  imgSrc: string,
  bodyCopy: string,
  tileClass: string,
}) {
  const theme = props.tileClass ? props.tileClass : ""
  return (
    <div className={theme}>
      <div className="py-[3.125rem] md:py-[5.125rem] flex flex-col items-center px-4">
        <h2 className="text-2xl/[130%]">{props.headerText}</h2>
        <img className="mt-3.5 h-[30px]" src={props.imgSrc} alt="" />
        <p className="mt-4 text-center">{props.bodyCopy}</p>
      </div>
    </div>
  )
}

This strategy worked on the mobile view, building the layout piece-by-piece but I got a sense of foreshadowing when I added and used the tileClass prop. When I focused more on the desktop view, which I felt would be best positioned using grid (more on that learning experience later) I noticed I needed to pass more props for those uniquely positioned items.

My component now looked like this:

// index.tsx
<SectionSubHeader
  headerText="Patient Satisfaction"
  imgSrc={blueEgg}
  bodyCopy="Our patients rate us the highest in the industry"
  tileClass="tile--light"
  gridLocation="patient-satisfaction"
/>

And my CSS for the grid container:

/* styles.css */
.grid-container {
  border: 2px solid red;
  grid-template-areas:
    "patient-satisfaction medical-care"
    "medical-devices pharmacy"
    "pickup delivery"
    "customer-service respect"
    "mutual-relationships long-term";
}

I really realized how different the spacing of some of the same-looking items were in the desktop view… I thought: “No problem, I can pass the component-specific unique additional classes to each individual component as props”

My component props really started to grow:

// index.tsx
<SectionSubHeader
  headerText="Patient Satisfaction"
  imgSrc={blueEgg}
  bodyCopy="Our patients rate us the highest in the industry"
  tileClass="tile--light"
  gridLocation="patient-satisfaction"
  tailwindClasses="border-b border-dashed pt-8 md:pt-11 pb-6"
/>

After spending hours building this way, I noticed a few things I didn’t like about the direction this project was going:

  • I didn’t like having some CSS applied using Tailwind classes as a prop AND on the component itself.
  • I also didn’t like using 2 (really 3) sources (Tailwind classes on elements, the stylesheet, and Tailwind props) to control the CSS on these elements.

At that point, I knew that I needed to reevaluate my strategy.

I Decided to Change my Approach

I liked using React components to build the page but as I started adding on more and more props, especially to style the elements, I started thinking this project was becoming overly complicated. I didn’t like having multiple “sources of truth” for the CSS and I felt that at least one of the initial reasons for creating components was being lost.

After making these changes, my markup looked more like this:

// index.tsx
<div className="py-[3.125rem] md:py-[5.125rem] flex flex-col items-center px-4 border-b border-dashed pt-8 md:pt-11 pb-6">
  <h2>Patient Satisfaction</h2>
  <img src={blueEgg} alt="">
  <p>Our patients rate us the highest in the industry</p>
</div>

My page became a lot easier to style after switching from components to an HTML-like layout. By doing this, I was able to have more insight into Tailwind classes, remove extra files, and simplify my code overall.

Tags:

Adam

Adam facts:

Adam's Favorite Emoji is 😬