Elegant composition: Uncover the power of Tailwind CSS
Tags: nextjs, tailwindcss
Published: 2023-09-29 11:18:58


Welcome to this deep dive into the universe of Tailwind CSS! If you, just like me, are continually on the lookout for tools that enhance our workflow and elevate our web development projects to a new level, then you are in the right place. In this article, we will explore together the nooks and crannies of Tailwind, a CSS framework that has been winning hearts and minds in the development community.

![](https://savaslabs.com/sites/default/files/styles/open_graph/public/2020-02/tailwindcss-1000by665-2a13c5-3.jpg?itok=-J_OGUYg)

Before we move forward, have you ever stopped to think about the journey of a framework until it becomes an indispensable tool? Well, let's start from the beginning, unraveling the origin and unique proposition of Tailwind. We will understand why it has gained so much space in the market, facing giants and standing out as a reliable and flexible option to style our applications.

Throughout this article, we will dissect how Tailwind operates, addressing its strengths, its limitations, and, of course, how we can make the most of this tool in our projects. And for those who are always seeking a little more, I will guide you through setting up a Next.js project using Tailwind, detailing each step and demystifying the Tailwind config.

So, are you ready to embark on this journey of discovery and deepening into Tailwind CSS? Let's go together; I am sure it will be an enriching experience, and by the end, you will feel more equipped to make informed decisions about using this tool in your future projects. Let's get started!

## First steps

![Baby Yoda walking](https://media.tenor.com/ctiAFSdN_foAAAAC/the-mandalorian-the-child.gif)

Tailwind CSS operates on an intriguing concept that might seem a bit peculiar at first glance, but in practice, proves to be immensely powerful. This is the principle of class composition to craft visual components.

Let’s start with a basic example. Suppose you wish to create a button with a blue background and white text. With Tailwind, it would look like this:

```html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <button class="bg-blue-500 text-white px-4 py-2">
       Click me!
    </button>
</body>

</html>
```

Let’s break down what’s happening here. Each class you add to the element defines an aspect of the style:

- `bg-blue-500`: Sets the background color of the button to a specific shade of blue.
- `text-white`: Sets the text color to white.
- `px-4`: Adds a horizontal padding of 4 units.
- `py-2`: Adds a vertical padding of 2 units.

This is how Tailwind operates! It provides many utility classes that you compose directly in your HTML to style the elements. This approach allows for very rapid visual development since you can see the changes in real-time without switching between CSS and HTML files.

Now, for a more complex example, imagine a card:

```html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <div class="max-w-md mx-auto bg-white rounded-xl shadow-md overflow-hidden md:max-w-2xl">
        <div class="md:flex">
            <div class="md:flex-shrink-0">
                <img class="h-96 w-full object-cover md:w-96"
                    src="https://www.wargamer.com/wp-content/sites/wargamer/2022/09/baldurs-gate-3-shadowheart-cleric.jpg"
                    alt="">
            </div>
            <div class="p-4">
                <div class="uppercase tracking-wide text-sm text-indigo-500 font-semibold">Shadowheart</div>
                <a href="#" class="block mt-1 text-lg leading-tight font-medium text-black hover:underline">
                    A Baldur's Gate 3 character
                </a>
                <p class="mt-2 text-gray-500">
                    Like all the companions in the DnD Game, Baldur's Gate 3 Shadowheart is a complex hero with a story
                    waiting to be uncovered. The dark-haired Cleric is secretive and more than a little sarcastic, but
                    she can also be a cooperative and capable member of your adventuring party.
                </p>
            </div>
        </div>
    </div>
</body>

</html>
```

## Unleashing the Power: Tailwind with Next.js

![Goten + Trunks fusion](https://media.tenor.com/J6LI134YYZwAAAAd/dragon-ball-z-goten.gif)

Unleashing the Power: Tailwind with Next.js
One of the reasons Tailwind CSS has been widely embraced is its powerful synergy with React. Let’s illustrate this by creating a detailed React component. Imagine we want a sophisticated image component that zooms in when hovered over.

```jsx
import React from 'react';

const ImageZoom = ({ src, alt }) => {
  return (
    <div className="transform transition-transform duration-300 hover:scale-110">
      <img src={src} alt={alt} className="w-full h-auto object-cover"/>
    </div>
  );
};

export default ImageZoom;
```

In this piece of code, we’ve used Tailwind classes to manage the hover state and scaling of the image, making it increase to 110% of its original size with a smooth transition.

## Next.js +  Tailwind

![Fast and Furious - family](https://media.tenor.com/cq2hRBBPwaQAAAAC/theres-always-room-for-family-family-first.gif)

Now, moving forward, let’s discuss how Next.js and Tailwind combine forces for optimized web development. The Next.js community has welcomed Tailwind with open arms, and integrating it into your project can significantly enhance your application. This is where `tailwind.config.js` becomes a crucial player. It allows us to customize our build, catering to the specific needs of our project.

Here's an example of how you might configure `tailwind.config.js`:

```js
module.exports = {
  purge: ['./pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}'],
  darkMode: false, // or 'media' or 'class'
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
}
```

In this configuration, the **purge** option is set to remove unused styles in production, contributing to a smaller and more efficient final bundle. This is just a glimpse into how Tailwind and Next.js can be fine-tuned to work seamlessly together, offering a highly optimized, developer-friendly experience.

## Final Thoughts

![Fast and Furious - family](https://media.tenor.com/u73m7ptH6cgAAAAC/kowalski-analysis-thinking.gif)

Before we delve into the numerous benefits of Tailwind, it's prudent to also cast an eye on some of its downsides. A common critique is that, when using Tailwind, our HTML files can become quite verbose, leading to less clean and harder-to-read code. Moreover, there's a learning curve to get used to the utility classes, and initially, you might find yourself frequently consulting the documentation.

However, once these initial hurdles are overcome, the benefits of Tailwind start to shine brightly. The freedom of styling, the speed in development, and optimized performance are aspects that have developers around the globe opting for Tailwind. Its proposition of utility classes offers a level of customization and reusability that is hard to match.

The pairing with Next.js has proven to be a robust combination, enabling the creation of rich and performative interfaces. With Next.js, Tailwind gains even more ground, allowing for style optimization and more efficient build generation.

Nowadays, the presence of Tailwind in Next.js applications has become quite common, and undoubtedly, dedicating some time to delve deeper into this library can prove to be a wise choice. After all, being equipped with the right tools and the knowledge to use them is fundamental to navigate with confidence in the vast ocean of front-end development. 

![Fast and Furious - family](https://media.tenor.com/Y-_1mRH6s9AAAAAC/chiru-waltair.gif)

Oh, before wrapping up, let me share a little tidbit with you! This is my maiden voyage into posting on dev.to, and I'm buzzing to hear what you think. So, if you could, drop some sweet feedback in the comments, alright? And, of course, don’t forget to hit that follow button to stay tuned for fresh frontend content! 🚀

I’m all ears for topic suggestions and would love to hear your thoughts in the comments. Let’s build a cozy corner of learning and exchanging experiences together! Catch you **next** time, and let’s get coding! 💻🎉