<?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: Pedro Martins</title>
    <description>The latest articles on DEV Community by Pedro Martins (@pedrovrima).</description>
    <link>https://dev.to/pedrovrima</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%2F388643%2F7155824d-e673-441e-a899-e16089f96754.jpg</url>
      <title>DEV Community: Pedro Martins</title>
      <link>https://dev.to/pedrovrima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pedrovrima"/>
    <language>en</language>
    <item>
      <title>Cascade deleting in Prisma (v2)</title>
      <dc:creator>Pedro Martins</dc:creator>
      <pubDate>Mon, 07 Jun 2021 16:22:25 +0000</pubDate>
      <link>https://dev.to/pedrovrima/cascade-deleting-in-prisma-v2-apj</link>
      <guid>https://dev.to/pedrovrima/cascade-deleting-in-prisma-v2-apj</guid>
      <description>&lt;p&gt;&lt;a href="https://www.prisma.io/"&gt;Prisma&lt;/a&gt; (v2) is one of the hottest ORM's right now (you can see some of the reason I think so &lt;a href="https://twitter.com/pmartinsdev/status/1390028038046457862"&gt;here&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;It still has some important holes, though. Cascade delete is one of the most prominent ones, and even though the developers have been aware of this issue, there is no expectation of when it will be solved (see more &lt;a href="https://github.com/prisma/prisma/issues/2810"&gt;here&lt;/a&gt; and the discussion on the proposal &lt;a href="https://github.com/prisma/prisma/issues/6996"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What is cascade delete?
&lt;/h2&gt;

&lt;p&gt;Cascading delete allows you to automatically delete related records, which is important specially in one-to-many relations. &lt;/p&gt;

&lt;p&gt;For example, if you delete an Author, you would expect all its Posts to be deleted as well (and any other records related to this author).  &lt;/p&gt;

&lt;p&gt;The cascade delete is usually configured at the database level and one would expect that it would be available to be expressed in the prisma schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prisma behavior right now
&lt;/h2&gt;

&lt;p&gt;Right now, if you have a &lt;em&gt;required&lt;/em&gt; relation (such as Posts need to have an Author) and try to delete an Author with Posts, prisma will return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The change you are trying to make would violate the required relation 'PostToAuthor' between the `Post` and `Author` models.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Workarounds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Configure your database
&lt;/h3&gt;

&lt;p&gt;The most basic option would be to configure your database to perform the cascading delete. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prisma&lt;/em&gt; has a good documentation on how to do this on the most famous RDBMS &lt;a href="https://www.prisma.io/docs/guides/database/advanced-database-tasks/cascading-deletes"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  2. Add Cascade Delete to schema (using Pal.js)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://paljs.com/"&gt;Pal.js&lt;/a&gt; is a library with a series of helper packages to use with &lt;em&gt;Prisma&lt;/em&gt;. One of those, the &lt;em&gt;On Delete&lt;/em&gt; plugin allows you to use comments on your schema do define on delete behaviors. &lt;/p&gt;

&lt;p&gt;You can check more of it &lt;a href="https://paljs.com/plugins/delete#introduction"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use $transactions to run deletions on a given order
&lt;/h3&gt;

&lt;p&gt;This is what is recommended on &lt;em&gt;Prisma&lt;/em&gt; docs (right &lt;a href="https://www.prisma.io/docs/concepts/components/prisma-client/crud#delete"&gt;here&lt;/a&gt;). In this solution, you would need to hard code all the deletions, which might be impracticable in some cases.&lt;/p&gt;

&lt;p&gt;There is a package that can take care of that, creating all the deletions necessary to cascade delete and perform them on the right order. Check more &lt;a href="https://www.npmjs.com/package/prisma-cascade-delete"&gt;here&lt;/a&gt;;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;I hope &lt;em&gt;Prisma&lt;/em&gt; team will soon tackle this issue so we can create cascade deletes out of the box. On the meantime, I tend for the option 3 and the &lt;a href="https://www.npmjs.com/package/prisma-cascade-delete"&gt;prisma-cascade-delete&lt;/a&gt; package.&lt;/p&gt;

&lt;p&gt;Feel free to ask questions or reach me out on &lt;a href="https://twitter.com/pmartinsdev"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>orm</category>
      <category>prisma</category>
      <category>mysql</category>
    </item>
    <item>
      <title>Por que você deveria dar uma chance ao Tailwind CSS</title>
      <dc:creator>Pedro Martins</dc:creator>
      <pubDate>Sat, 29 Aug 2020 20:40:25 +0000</pubDate>
      <link>https://dev.to/pedrovrima/por-que-voce-deveria-dar-uma-chance-ao-tailwind-css-hjj</link>
      <guid>https://dev.to/pedrovrima/por-que-voce-deveria-dar-uma-chance-ao-tailwind-css-hjj</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UPIEfot6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ovqzl94szusdjkbddlhw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UPIEfot6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ovqzl94szusdjkbddlhw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Estilizando sua aplicação
&lt;/h2&gt;

&lt;p&gt;Se você é um desenvolvedor frontend, já deve ter se deparado com esse dilema:&lt;br&gt;
Como vou adicionar estilo à minha aplicação?&lt;/p&gt;

&lt;p&gt;O caminho mais comum é, obviamente, escrever seus em um arquivo &lt;strong&gt;.css&lt;/strong&gt;. Por este4 caminho é possível ter um alto grau de customização, mas a quantidade de trabalho é quase proporcional.&lt;/p&gt;

&lt;p&gt;A princiapl alternativa a esse caminho, para grande parte dos desenvolvedores, é utilizar framerworks como Bootstrap, Bulma e Materail UI. Ao escolher utilizar uma dessas frameworks para seu projeto, você aumenta (e muito) a velocidade com que consegue adicionar estilo e padronização para sua interface de usuário. Mas essa facilidade vem ao custo de da dificuldade em customizar seus componentes - gerando uma quase padronização das páginas que vemos por aí hoje em dia.&lt;/p&gt;

&lt;p&gt;É entre esses dois extremos que brilha o framework &lt;strong&gt;Tailwind CSS&lt;/strong&gt;. Criado em 2017, Tailwind tem a proposta de fornecer as ferramentas (que eles chamam de &lt;em&gt;utility classes&lt;/em&gt;) para você criar seus componentes (ao invés de fornecer os componentes já prontos). &lt;/p&gt;

&lt;p&gt;Neste artigo vou mostrar um pouco das principais vantagens de se utilizar Tailwind para prototipagem, MVP's e até para seu produto final.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como assim &lt;em&gt;utility first&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;Para explicar o conceito de &lt;em&gt;utility first&lt;/em&gt; proposto pelo Tailwind, vamos recriar o Botão padrão do Bootstrap com CSS puro, Bootstrap e Tailwind.&lt;/p&gt;
&lt;h4&gt;
  
  
  CSS puro
&lt;/h4&gt;

&lt;p&gt;Para css puro, precisamos primeiro definir a classe, que vou chamar de &lt;code&gt;.bootstrap-btn&lt;/code&gt;, e depois aplicá-la a um botão.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.bootstrap-btn&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;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&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="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#212529&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&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;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;.375rem&lt;/span&gt; &lt;span class="m"&gt;.75rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&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="nl"&gt;line-height&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="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#007bff&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bootstrap-btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Primary&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/pedrovrima/embed/xxVrKyP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;
&lt;h4&gt;
  
  
  Bootstrap
&lt;/h4&gt;

&lt;p&gt;No Bootstrap, como dissemos anteriormente, o componente já está pronto e só precisamos adicionar classes ao botão.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/pedrovrima/embed/vYGZdWR?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&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;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Primary&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui aplicamos duas classes ao componente, &lt;code&gt;btn&lt;/code&gt;, que define formato e interações/animações do botão, e &lt;code&gt;btn-primary&lt;/code&gt;, que define as cores.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tailwind CSS
&lt;/h4&gt;

&lt;p&gt;Para recriar este mesmo botão com Tailwind, vamos adiciona uma série de classes (os &lt;em&gt;utilities&lt;/em&gt;), como se fossem blocos de montar, para criar o estilo que queremos.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/pedrovrima/embed/LYNLQQz?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&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;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-blue-500 rounded px-4 py-2 
font-sans  text-white hover:bg-blue-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Primary&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os nomes são bem intuitivos, mas vamos ver classe por classe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bg-blue-500&lt;/code&gt;: Adiciona a cor #4299e1 como cor de fundo do botão (falaremos jájá sobre esse &lt;em&gt;500&lt;/em&gt;);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rounded&lt;/code&gt;: Define border-radius de 0.25 rem;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;px-4&lt;/code&gt;: Adiciona 1 rem de padding tanto em na parte esquerda quanto na parte direita do botão (eixo x);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;py-2&lt;/code&gt;: Adiciona 0.25 rem de padding tanto em na parte superior quanto na parte inferior do botão (eixo y);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;font-sans&lt;/code&gt;: Define a família da fonte para sans-serif;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;text-white&lt;/code&gt;: Define a cor do texto para branca;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hover:bg-blue-600&lt;/code&gt;: Define a cor de fundo #3182ce quando o mouse está sobre o elemento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse exemplo, podemos ver bem como Tailwind é um meio termo entre frameworks que te fornecem os componentes e o css puro: ele te fornece peças com estilos bem pensados para que você crie seus componentes.&lt;/p&gt;

&lt;p&gt;Porém, ainda parece mais interessante usarmos Bootstrap para criar este simples botão, certo? Em Boostrap precisamos adicionar 2 classes contra 5 em Tailwind. Mas e se quisermos que o botão tenha um tom de azul mais claro? Ou ainda mais - se quisermos que o botão tenha um comportamento diferente ao colocarmos o mouse sobre ele?&lt;/p&gt;

&lt;h2&gt;
  
  
  Customização
&lt;/h2&gt;

&lt;p&gt;Aqui é onde Tailwind realmente brilha. As novas versões do Bootstrap (atualmente versão 5) vêm permitindo cada vez mais customizações ao seus componentes padrões. Para isso, porém, é necessário alterar os padrões, conhecer um pouco de Sass ou reescrever as classes. Já o Tailwind proporciona uma grande variedade de &lt;em&gt;utilities&lt;/em&gt;, permitindo um alto grau de customização dos seus componentes sem escrever uma única linha de CSS. &lt;/p&gt;

&lt;p&gt;Vamos, por exemplo, trocar a cor do botão do Tailwind e deixar ele mais arredondado (formato de pílula):&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;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-orange-500 rounded-full px-4 py-2 
font-sans  text-white hover:bg-orange-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Primary&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/pedrovrima/embed/MWyoQxe?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Tudo que tivemos que fazer foi trocar as cores de &lt;code&gt;bg-blue-500&lt;/code&gt; e &lt;code&gt;bg-blue-600&lt;/code&gt; para &lt;code&gt;bg-orange-500&lt;/code&gt; e &lt;code&gt;bg-orange-600&lt;/code&gt;, além de utilizar &lt;code&gt;rounded-full&lt;/code&gt; no lugar de &lt;code&gt;rounded&lt;/code&gt;. Simples não?&lt;/p&gt;

&lt;p&gt;Mas vamos ter que digitar todas essas classes para todos os botões, criando um código gigante e difícil de achar eventuais bugs? A resposta é não!&lt;/p&gt;

&lt;h2&gt;
  
  
  Compoenente Tailwind CSS
&lt;/h2&gt;

&lt;p&gt;Um dos principais benrfícios de se utilizar Tailwind é a possibilidade de criar seus próprios componentes e utilizá-los em qualquer parte do seu app. Para criar uma classe de css para o botão alaranjado acima, precisamos adicionar o código ao arquivo &lt;code&gt;tailwind.css&lt;/code&gt;, criado na instalação do pacote.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.btn-orange{
@apply bg-orange-500 rounded-full px-4 py-2 
font-sans  text-white
}

.btn-orange:hover{
@apply bg-orange-60

}

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

&lt;/div&gt;



&lt;p&gt;A diretiva &lt;code&gt;@apply&lt;/code&gt; literalmente "aplica" os &lt;em&gt;utilities&lt;/em&gt; à classe &lt;code&gt;btn-orange&lt;/code&gt;. Agora podemos aplicar essa classe aos botões do nosso aplicativo digitando apenas esses 10 caracteres. Incrível não?&lt;/p&gt;

&lt;h2&gt;
  
  
  E por quê não usar CSS puro?
&lt;/h2&gt;

&lt;p&gt;A principal vantagem de usar o Tailwind ao invés de usar CSS é que uma série de decisões que o desenvolver tem que fazer (rem vs. px vs. %, 10% ou 12% de curvatura nas bordas, etc.) já foram feitas pelo time de desenvolvedores do Tailwind.&lt;/p&gt;

&lt;p&gt;Além disso, todos os padrões foram muito bem pensadas. Desde o tamanho das fontes, tamanho das sombras até a paleta de cores padrão (veja mais abaixo), todos os estilos ornam muito bem entre si. &lt;/p&gt;

&lt;h2&gt;
  
  
  ✔️ Mais alguns prós de usar Tailwind
&lt;/h2&gt;

&lt;p&gt;Para este artigo não ficar muito longo, vou listar aqui alguns pontos positivos de usar o Tailwind para estilizar suas aplicações.&lt;/p&gt;

&lt;h4&gt;
  
  
  Paleta de cores
&lt;/h4&gt;

&lt;p&gt;Uma das primeiras características que me chamou atenção quando vi apps criados utilizando tailwind pela primeira vez foram as cores. Tailwind vem com 10 diferente paletas de cores, cada uma com 9 tons diferentes da mesma cor (e é daí que o 500 e 600 que utilizamos nos botões acima vem). Essa é a paleta azul, por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--leDGihmn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lejf52qqrgn4q1xvf3e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--leDGihmn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lejf52qqrgn4q1xvf3e1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Altamente responsivo
&lt;/h4&gt;

&lt;p&gt;Tailwind css vêm com os utilities necessário para criar apps totalmente responsivos. Assim como fizemos com a propriedade &lt;code&gt;hover&lt;/code&gt; nos botões acima, podemos usar as propriedades &lt;code&gt;sm&lt;/code&gt;, &lt;code&gt;md&lt;/code&gt; e &lt;code&gt;lg&lt;/code&gt; para diferentes &lt;code&gt;@media&lt;/code&gt; break-points. E o que eu, particularmente, acho mais um ponto positivo do Tailwind: é mobile-first. Ou seja, você define os estilos para telas menores e os &lt;em&gt;utilities&lt;/em&gt; de tamanho de tela alteram o estilo a partir daquele tamanho.&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentação
&lt;/h4&gt;

&lt;p&gt;A documentação do Tailwind, assim como, de vários outras frameworks de css, é completíssima. Todas as dúvidas e exceções que eu precisei resolver até agora foram facilmente encontradas na documentação. &lt;/p&gt;

&lt;h4&gt;
  
  
  Constantemente atualizado
&lt;/h4&gt;

&lt;p&gt;A pequena equipe do Tailwind está constatemente atualizando o framework, e a cada versão eles consertam um ou outro bug encontrado por desenvolvedores. Além disso, a conta oficial do Twitter do Tailwind e do desenvolvedor principal (@tailwindcss e @adamwathan) estão constantemente em contato com os desenvolvedores que usam o framework para saber as opniões e requisições que podem fazer a experiência de programar mais fácil e intuitiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✖️ Os poucos contras que encontrei até agora
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Necessita Node.js para funcionar bem
&lt;/h4&gt;

&lt;p&gt;Devido à série de funcionalidades (que eu apenas toquei em alguma aqui), Tailwind precisa ser instalado utilizando npm/yarn. Ou seja, não dá para utilizar tudo o que Tailwind oferece em um aplicativo simples com html/css/js.&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentação apenas em inglês
&lt;/h4&gt;

&lt;p&gt;A falta de tradução em português ou até mesmo em espanhol pode ser um problema para desenvolvedores que não estão familiriazados com inglês.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Se você está iniciando um novo projeto e procurando a melhor forma de estilizar seus componentes, dê uma chance ao Tailwind. É realmente impressionante a flexibilidade que este framework possibilita, ao mesmo tempo que as escolhas que seus desenvolvedores fizeram praticamente "garantem" que seu aplicativo será visualmente apelativo.&lt;/p&gt;

&lt;p&gt;Para saber mais, entre no &lt;a href="https://tailwindcss.com/"&gt;docs do Tailwind&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso você tenha qualquer dúvida, sinta-se livre para me contatar por aqui ou pelo &lt;a href="https://twitter.com/pedrovrima"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portuguese</category>
      <category>tailwindcss</category>
      <category>ui</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
