<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="376071" data-post-id="376071">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="BartOtten" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/BartOtten/120/25440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  BartOtten
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="greven" data-post="67" data-topic="72401">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/greven/48/25004_2.png" class="avatar"> greven:</div>
<blockquote>
<p>would choose co-located Scoped CSS, like VueJS does over Tailwind, but since that isn’t a choice in every framework, for example LiveView</p>
</blockquote>
</aside>
<p>We now have colocated JS so I see no issue with colocated CSS. Guess it’s upcoming with the new Macro components.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376071" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/72">Post #71</a>
	                </div>
	            </div>
              <div id="likers-container-376071" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376071"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #71"></div>
  </section>
</div>
    <div class="postbit" id="376086" data-post-id="376086">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="thomasbrus" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/thomasbrus/120/40196_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  thomasbrus
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I think it depends on what you’re actually trying to solve and for me it comes down to the following:</p>
<ul>
<li>a way to manage <strong>design tokens</strong>, with sensible defaults and naming conventions</li>
<li>utility classes for <strong>layouts/positioning</strong> and one-off visual changes</li>
<li>a maintainable &amp; readable way to manage CSS for <strong>reusable components</strong></li>
</ul>
<p>So then you naturally arrive at something like this: stylesheets just for components (using some naming convention such as BEM, CSS Modules, etc.) in combination with PostCSS/Tailwind.</p>
<p>Via <code>theme</code> or <code>@apply</code> you can reference design tokens from Tailwind.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">.heading { font-size: theme('fontSize.xl') }
.card { padding: theme('spacing.4') }
</code></pre>
<p>The beautify of this is that you can now combine these components with utility classes:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">&lt;h1 class="heading flex gap-2"&gt;Heading &lt;svg ... /&gt;&lt;/h1&gt;
&lt;div class="card mt-4"&gt;&lt;/h1&gt;
</code></pre>
<p>Since the composition of components differs page it makes a lot of sense to use utility classes instead of writing additional CSS for each situation.</p>
<p>On top of that you can even make one-off visual changes to components, until it makes sense to introduce a new component property:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">&lt;h1 class="heading border-b"&gt;Heading with border bottom&lt;/h1&gt;
</code></pre>
<p>There are a lot of things that Tailwind does that you would otherwise end up doing yourself, just with more code to maintain and probably less well thought out.</p>
<p>It’s a bit unfortunate that Tailwind has become a bit of a religion and there isn’t always a ton of discussion about what styling problems we’re actually trying to solve <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"> (not talking about this thread, just in general).</p>
<p>So I’m not married to a specific framework, it’s just that I found that this is sensible way to go about things.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376086" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/73">Post #72</a>
	                </div>
	            </div>
              <div id="likers-container-376086" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376086"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #72"></div>
  </section>
</div>
    <div class="postbit" id="376168" data-post-id="376168">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="AstonJ" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/AstonJ/120/15_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  AstonJ
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>For those suggesting using <code>@apply</code>, isn’t it against the Tailwind way?</p>
<aside class="quote no-group" data-username="Creator of Tailwind">
<div class="title">
<div class="quote-controls"></div>
 Creator of Tailwind:</div>
<blockquote>
<p>Confession: The <code>apply</code> feature in Tailwind basically only exists to trick people who are put off by long lists of classes into trying the framework.</p>
<p>You should almost never use it <img src="https://forum.elixirforum.com/images/emoji/apple/grimacing.png?v=15" title=":grimacing:" class="emoji" alt=":grimacing:" loading="lazy" width="20" height="20"></p>
<p>Reuse your utility-littered HTML instead.</p>
</blockquote>
</aside>
<div class="youtube-onebox lazy-video-container" data-video-id="ab8RePo5ZYU" data-video-title="Why you don't need BEM with utility-first CSS" data-video-start-time="" data-provider-name="youtube">
  <a href="https://www.youtube.com/watch?v=ab8RePo5ZYU" target="_blank" class="video-thumbnail" rel="noopener nofollow">
    <img class="youtube-thumbnail" src="https://img.youtube.com/vi/ab8RePo5ZYU/maxresdefault.jpg" title="Why you don't need BEM with utility-first CSS" width="690" height="388">
  </a>
</div>

<p>Source: <a href="https://x.com/adamwathan/status/1226511611592085504" class="inline-onebox" rel="nofollow">Adam Wathan on X: "Confession: The `apply` feature in Tailwind basically only exists to trick people who are put off by long lists of classes into trying the framework. You should almost never use it 😬 Reuse your utility-littered HTML instead. https://t.co/x6y4ksDwrt" / X</a></p>
<p><strong>Edit</strong>: From google’s AI mode:</p>
<blockquote>
<h2>Why Wathan regrets <span class="mention">@apply</span></h2>
<ul>
<li>
<p><strong>Encourages bad practices</strong>: Wathan says that <code>@apply</code> tempts developers away from Tailwind’s core utility-first philosophy. Instead of reusing utility classes directly in the HTML, developers are led to create their own custom classes that contain a bundle of utilities, which is exactly the practice Tailwind was designed to avoid.</p>
</li>
<li>
<p><strong>A “bait and switch”</strong> : In 2020, Wathan confessed on <a href="https://x.com/adamwathan/status/1226511611592085504" rel="nofollow">X (formerly Twitter)</a> that <code>@apply</code>was originally added to “trick people who are put off by long lists of classes into trying the framework”. However, he emphasized that developers “should almost never use it”.</p>
</li>
<li>
<p><strong>Outrageously complicated behavior</strong>: According to Wathan, the underlying behavior of <code>@apply</code> is very complex, which makes it difficult for developers to build a proper mental model of how it works. This complexity makes it easy to misuse and leads to confusing results.</p>
</li>
<li>
<p><strong>Poor CSS architecture</strong>: By hiding utility classes behind custom class names, <code>@apply</code>can lead to less readable and maintainable code over time. It can also cause unexpected side effects that go against the framework’s predictable nature.</p>
</li>
</ul>
<h2>The Tailwind philosophy</h2>
<p>The core principle of Tailwind CSS is to use single-purpose utility classes directly in your HTML. For example, instead of defining a custom <code>.btn-primary</code> class in your CSS file, you would apply the <code>bg-blue-500</code>, <code>text-white</code>, and <code>font-bold</code> utility classes directly to your button element.</p>
<p>This approach, known as “utility-first,” offers several benefits:</p>
<ul>
<li>You don’t need to leave your HTML file to style your components.</li>
<li>You avoid accumulating custom CSS that is rarely reused.</li>
<li>You can easily make design changes by adding or removing classes in the HTML.</li>
</ul>
<h2>The verdict on <span class="mention">@apply</span></h2>
<p>Wathan has stated that if he were to create Tailwind CSS from scratch, <code>@apply</code> would not be included. His stance is a clear signal that for most use cases, developers should stick to Tailwind’s core utility-first principle rather than relying on <code>@apply</code> to mimic traditional CSS preprocessors.</p>
</blockquote> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376168" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/74">Post #73</a>
	                </div>
	            </div>
              <div id="likers-container-376168" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376168"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #73"></div>
  </section>
</div>
    <div class="postbit" id="376183" data-post-id="376183">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="thomasbrus" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/thomasbrus/120/40196_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  thomasbrus
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Oh yes good point!</p>
<p>Perhaps I should have left that out, I tend to use <code>theme()</code> (in v4 that’s replaced with just CSS vars I believe). I agree that there isn’t really a use case for <code>@apply</code>, except laziness/convenience <img src="https://forum.elixirforum.com/images/emoji/apple/face_with_tongue.png?v=15" title=":face_with_tongue:" class="emoji" alt=":face_with_tongue:" loading="lazy" width="20" height="20">.</p>
<blockquote>
<p>The <code>apply</code> feature in Tailwind basically only exists to trick people who are put off by long lists of classes into trying the framework.</p>
</blockquote>
<p>The irony of this statement is that <code>@apply</code> puts your long list of utility classes in your CSS file <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20">.</p>
<aside class="quote no-group" data-username="Creator of Tailwind">
<div class="title">
<div class="quote-controls"></div>
 Creator of Tailwind:</div>
<blockquote>
<p>Reuse your utility-littered HTML instead.</p>
</blockquote>
</aside>
<p>I get the point about that you don’t technically “need” BEM, since you can reuse utility classes via partials or components as well.</p>
<p>But I find that it gets pretty unreadable pretty quickly. It is a bit unfortunate that this leads people to disregard Tailwind entirely.</p>
<p>Especially for components with many different states, it is (imho) just more readable to use a stylesheet and some naming convention such as BEM (or whatever you prefer).</p>
<p>It just helps a ton if your button has a <code>.button--primary</code> class on it instead of a long list of utility classes.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376183" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/75">Post #74</a>
	                </div>
	            </div>
              <div id="likers-container-376183" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376183"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #74"></div>
  </section>
</div>
    <div class="postbit" id="376237" data-post-id="376237">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="BartOtten" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/BartOtten/120/25440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  BartOtten
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Tailwind is crafted for use with components, so component name would replace CSS class name.</p>
<p><code>.button-primary</code>   →   <code>&lt;.button color=“primary”&gt;</code><br>
<code>.heading</code>  → <code>&lt;.heading&gt;</code></p>
<p>As a result your templates are not riddled with classes, as most “look how bad” examples show.</p>
<p>That being said: if you do “cleanup” the code by using components, you end up shimming all HTML elements. Hence native HTML elements such as <code>h1</code> etc don’t have styling in Tailwind (without plugin Typography)! You are supposed to (inside) ‘component’ them <img src="https://forum.elixirforum.com/images/emoji/apple/confused.png?v=15" title=":confused:" class="emoji" alt=":confused:" loading="lazy" width="20" height="20"></p>
<p>So no <code>&lt;div classes=“a thousand classes for this container containing the main content”&gt;</code> but <code>&lt;.main_content&gt;</code></p>
<p>Wait, did we just shift from “ow no a central CSS file and <em>having to come up with class name</em>s” to “a zillion components at no default places and <em>having to come up with components names</em>”?</p>
<p><strong>Update:</strong><br>
<a href="https://forum.elixirforum.com/t/modern-css-with-tailwind-book-club/53455/6" rel="nofollow">In this thread</a> my opinions (multiple!) while reading the book.</p>
<p>I see I agree with myself from the past:</p>
<blockquote>
<p>For React 3, components are created <strong>(in the book)</strong> : Header, SubHeader and <strong>SubSub</strong>Header. The next example uses a plain JS function named <code>title</code> to return a list of ultility classes. Let’s apply those to H6: SubSubSubSubSubHeader and subSubSubSubSubTitle()! Guess we are back at “naming things is hard”.</p>
</blockquote>
<p>and</p>
<blockquote>
<p>What I’ve learned so far:</p>
<ul>
<li>The solution to prevent duplication requires you to <strong>come up with names</strong>.</li>
<li>Creating components/partials can cause code with weird syntax AND you still need to <strong>come up with those names</strong>.</li>
<li>When all gets ugly, you can use <code>@apply</code>…just know you will have to…<strong>come up with some names</strong>.</li>
</ul>
<p><em>I feel like we are going in circles, just so Tailwind can get away with “duplication is not an issue” and “with Tailwind you don’t have to come up with names <em>for your shared CSS properties.</em></em></p>
<p>Glad those names are not CSS names cause those were really hard to come up with according to Tailwind <img src="https://forum.elixirforum.com/images/emoji/apple/wink.png?v=15" title=":wink:" class="emoji" alt=":wink:" loading="lazy" width="20" height="20"></p>
</blockquote>
<p>and</p>
<blockquote>
<p>But can anyone explain me why it is <code>font-bold</code> and <code>italic</code> instead of <code>font-italic</code>? I understand from a CSS mapping point of view but I rather would stay within the ‘namespace’ so the guessing would be easier. [..] So padding is done with <code>p{side}-{size}</code> and border with <code>border-{side}-{size}</code>. <strong>Mind the dash</strong>. Why Tailwind?</p>
</blockquote>
<p>Not using Tailwind daily, I still fail to pick the proper prefix <code>text-</code> or <code>font-</code> or none at all, and have to learn all the new ‘naming conventions’ (read: is there consistency at all?)</p>
<hr>
<p>That being said: I use it in all my <em><strong>lib demo</strong></em> apps.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376237" data-batch-url="/posts/batch_likers">
                        7
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/76">Post #75</a>
	                </div>
	            </div>
              <div id="likers-container-376237" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376237"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #75"></div>
  </section>
</div>
    <div class="postbit" id="376244" data-post-id="376244">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="BartOtten" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/BartOtten/120/25440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  BartOtten
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><strong>1. But CSS files tend to blow up with unused classes!</strong><br>
Well, build something to find used ones diffing it with the class names in the CSS file to drop unu…wait..there must have been a point in time the Tailwind compiler did just that!</p>
<p><strong>2. Who can remembers all existing class names?</strong><br>
The same people who remember all Tailwind oddities?</p>
<p><strong>3. But you can’t see how the component looks from source code</strong><br>
But you can see all other things; which get’s harder if you add 20 class names on each element.</p>
<p><strong>4. But you can hide those in editor</strong><br>
True, but now 3… and this is a solution for a problem we did not have.</p>
<p><strong>5. But you can’t do :hover in style attribute</strong><br>
Using style attribute is not mandatory.</p>
<p>To me it seems all issues Tailwind ‘solves’ could and should have been solved by a formatter to remove unused classnames (on request) and ‘LSP for CSS’: “Jump to class definition”, “Show class references”  in all editors. Proof me wrong <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376244" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/77">Post #76</a>
	                </div>
	            </div>
              <div id="likers-container-376244" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376244"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #76"></div>
  </section>
</div>
    <div class="postbit" id="376249" data-post-id="376249">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="derek-zhou" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/derek-zhou/120/19943_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  derek-zhou
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="BartOtten" data-post="76" data-topic="72401">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartotten/48/25440_2.png" class="avatar"> BartOtten:</div>
<blockquote>
<p>So no <code>&lt;div classes=“a thousand classes for this container containing the main content”&gt;</code> but <code>&lt;.main_content&gt;</code></p>
</blockquote>
</aside>
<p>I disagree, because I view components as encapsulation of functions, not encapsulation of styles. The same component can be instantiated several times, each with a very different style. In your example you only hide the dirty laundry at a lower level. My pet peeve with Tailwind is exactly that: it kinds of force you to deeply couple function concerns with style concerns.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376249" data-batch-url="/posts/batch_likers">
                        5
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/78">Post #77</a>
	                </div>
	            </div>
              <div id="likers-container-376249" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376249"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #77"></div>
  </section>
</div>
    <div class="postbit" id="376252" data-post-id="376252">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="BartOtten" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/BartOtten/120/25440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  BartOtten
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="derek-zhou" data-post="78" data-topic="72401">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/derek-zhou/48/19943_2.png" class="avatar"> derek-zhou:</div>
<blockquote>
<p>My pet peeve with Tailwind is exactly that: it kinds of force you to deeply couple function concerns with style concerns.</p>
</blockquote>
</aside>
<p>So we agree <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"> I demonstrated the ‘blessed’ Tailwind way and linked to all my objections against it.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376252" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/79">Post #78</a>
	                </div>
	            </div>
              <div id="likers-container-376252" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376252"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #78"></div>
  </section>
</div>
    <div class="postbit" id="376256" data-post-id="376256">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="thomasbrus" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/thomasbrus/120/40196_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  thomasbrus
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group quote-modified" data-username="BartOtten" data-post="76" data-topic="72401">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartotten/48/25440_2.png" class="avatar"> BartOtten:</div>
<blockquote>
<p>Tailwind is crafted for use with components, so component name would replace CSS class name.</p>
<p>As a result your templates are not riddled with classes, as most “look how bad” examples show.</p>
</blockquote>
</aside>
<p>I think the argument regarding the utility class soup is also about:</p>
<ul>
<li>what the markup looks like in the browser / inspect element</li>
<li>that when you open your component file, it is now littered with utility classes</li>
</ul>
<p>It was like this in an earlier version of petal components but they switched to proper class names (I think also to make theming easier): <a href="https://github.com/petalframework/petal_components/blob/v0.19.7/lib/petal_components/button.ex#L114-L160" class="inline-onebox" rel="noopener nofollow ugc">petal_components/lib/petal_components/button.ex at v0.19.7 · petalframework/petal_components · GitHub</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376256" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/80">Post #79</a>
	                </div>
	            </div>
              <div id="likers-container-376256" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376256"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #79"></div>
  </section>
</div>
    <div class="postbit" id="380278" data-post-id="380278">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="pepicrft" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/pepicrft/120/31270_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  pepicrft
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>If you need a component kit native to Phoenix LiveView you can check out our build system Noora: <a href="https://tuist.dev/blog/2025/06/10/open-sourcing-noora-for-the-web" class="inline-onebox" rel="noopener nofollow ugc">Open sourcing Noora for the web</a></p>
<p>You can also see it live in our project at <a href="https://tuist.dev/tuist/tuist" rel="noopener nofollow ugc">https://tuist.dev/tuist/tuist</a></p>
<p><a class="mention" href="/u/cschmatzler" rel="nofollow">@cschmatzler</a> did and amazing job putting it together, and we are actively maintaining it and bringing new components regularly.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380278" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/anyone-not-using-tailwind-in-a-phoenix-project/72401/81">Post #80</a>
	                </div>
	            </div>
              <div id="likers-container-380278" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380278"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #80"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/72401/load_more?page=9">Load more posts (8 remaining)</a>
</div></template></turbo-stream>