DEV Community

Cover image for How to simplify your code and avoid repeating your markup with Astrojs and Tailwind CSS
Michael Andreuzza
Michael Andreuzza

Posted on

How to simplify your code and avoid repeating your markup with Astrojs and Tailwind CSS

In today's tutorial, we'll explore how to simplify your code and avoid repeating your markup with Astrojs and Tailwind CSS. This will help you write cleaner, more maintainable code and save time in the long run.

See it live and get the code

Creating the array

  • The id': This is a unique identifier for each section. It will be used to generate unique IDs for each element in our markup.
  • The tagline': This is a short description that will be displayed at the top of each section.
  • The title': This is the main heading for each section.
  • The description': This is a longer description that will be displayed below the title.
  • The features': This is an array of objects, each containing an icon and a description. These will be displayed as a list of features for each section.
  • The image': This is the URL of an image that will be displayed in each section.

Let's start creating the array and define our data. The array will look like this, because in this case we have two sections, but you can add as many as you want and they will be displayed in the same way and creating a zigzag effect on the page.

More on this later, it's a cool effect. Now, the array:

const sections = [
  {
    id: 1,
    tagline: "...",
    title: "...",
    description:
      "...",
    features: [
      { icon: "iconOne", description: "..." },
      { icon: "iconTwo", description: "..." },
      { icon: "iconThree", description: "..." },
      { icon: "iconFour", description: "..." },
    ],
    image:
      "...",
  },
  {
    id: 2,
    tagline: "...",
    title: "...",
    description:
      "...",
    features: [
      { icon: "iconFive", description: "..." },
      { icon: "iconSix", description: "..." },
      { icon: "iconSeven", description: "..." },
      { icon: "iconEight", description: "..." },
    ],
    image:
      "...",
  },
];
Enter fullscreen mode Exit fullscreen mode

As you can see in the code snippet above, we have an array of objects, each representing a section of our page. Each object contains a tagline, title, description, features, an icons used on our markup and an image. This data will be used to generate the markup for each section of our page.

Creating the markup

Lets create the markup for our sections. We'll use Astrojs to generate the markup for each section based on the data in our array. This will allow us to avoid repeating the same markup for each section and make our code more maintainable, as we can easily add or remove sections by updating the data in our array.

Here's the code:

{
  sections.map((section, index) => (
    <div
      class={`... other general classes ${index % 2 !== 0 ? "md:flex-row-reverse" : ""}`}>
      <div>
        <span class="...">
          {section.tagline}
        </span>
        <p class="...">
          {section.title}
        </p>
        <p class="...">
          {section.description}
        </p>
        <div class="...">
          {section.features.map((feature) => (
            <div class="...">
              {feature.icon === "iconOne" && (
                <svg>
                SVG code here
                </svg>
              )}
              {feature.icon === "iconTwo" && (
                <svg>
                  SVG code here
                </svg>
              )}
              {feature.icon === "iconThree" && (
                <svg>
                 SVG code here
                </svg>
              )}
              {feature.icon === "iconFour" && (
                <svg>
                  SVG code here
                </svg>
              )}
              {feature.icon === "iconFive" && (
                <svg>
                  SVG code here
                </svg>
              )}
              {feature.icon === "iconSix" && (
                <svg>
                  SVG code here
                </svg>
              )}
              {feature.icon === "iconSeven" && (
                <svg>
                    SVG code here
                </svg>
              )}
              {feature.icon === "iconEight" && (
                <svg>
                    SVG code here
                </svg>
              )}
              <span class="...">
                {feature.description}
              </span>
            </div>
          ))}
        </div>
      </div>
      <div class={`h-full ${index % 2 === 0 ? "md:order-first" : ""}`}>
        <img
          src={section.image}
          alt="#_"
          class=" ..."
        />
      </div>
    </div>
  ))
}
Enter fullscreen mode Exit fullscreen mode

Making it dynamic

We are creating a grid with two columns on desktop and reversing the order of the columns for every other section. This creates a zigzag effect on the page, which is a nice touch.

class={`... ${index % 2 !== 0 ? "md:flex-row-reverse" : ""}`}
Enter fullscreen mode Exit fullscreen mode

Adding the tagline

We are displaying the tagline at the top of each section. This provides a short description of the section's content.

<span class="...">
  {section.tagline}
</span>
Enter fullscreen mode Exit fullscreen mode

Adding the title

We are displaying the title of each section as a large heading.

<p
  class="...">
  {section.title}
</p>
Enter fullscreen mode Exit fullscreen mode

Adding the description and the icon

We are displaying the description of each section with and icon for each feature. We are using conditional rendering to display the correct icon based on the feature's icon property stated in the array we wrote earlier. Cool, right? It's a widespread technique used in various programming languages and frameworks to render UI components or elements based on certain conditions or states.

{
  feature.icon === "iconEight" && (
    <svg>
      SVG code here
    </svg>
  )
}
<p class="text-sm mt-4 text-gray-700 text-balance">
  {section.description}
</p>
Enter fullscreen mode Exit fullscreen mode

Adding the image

We are displaying the image for each section. We are using conditional rendering to reverse the order of the image and text for every other section. This creates a zigzag effect on the page, which is a nice touch. We are also using the md:order-first utility class to change the order of the image position on desktop screens.

<div class={`h-full ${index % 2 === 0 ? "md:order-first" : ""}`}>
  <img
  ...
  />
</div>
Enter fullscreen mode Exit fullscreen mode

Hope you like it and find it useful.

Top comments (2)

Collapse
 
mikee profile image
Miguel Palacios

I'll copy some of this, Thank you, Mike.

Collapse
 
mike_andreuzza profile image
Michael Andreuzza

Welcome Miguel!!