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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aptinio" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aptinio/120/456_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aptinio
                    <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>A few releases have gone out since the initial announcement — v0.1.3 is the latest. Changelog: <a href="https://hexdocs.pm/canonical_tailwind/changelog.html" class="inline-onebox" rel="noopener nofollow ugc">Changelog — canonical_tailwind v0.3.0</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="385730" 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/canonical-tailwind-tailwind-class-canonicalization-via-mix-format/74726/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-385730" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="385730"
                     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 #11"></div>
  </section>
</div>
    <div class="postbit" id="388543" data-post-id="388543">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aptinio" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aptinio/120/456_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aptinio
                    <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>Just shipped 0.1.5. The headline: if format-on-save just wasn’t working for you under Expert or ElixirLS, 0.1.5 fixes it.</p>
<p>Also tightened pool reliability: workers that go missing now recover (long-running LSP sessions used to break after a crash), cold start is serialized to avoid mixed-config workers, and config drift after pool start raises a loud error instead of silently using stale config (a small breaking change for umbrella setups that depended on the old quiet behavior).</p>
<p>And if you haven’t tried canonical_tailwind yet, this is a good moment. The canonicalizer in tailwindcss has gotten noticeably smarter over the past few releases: combining <code>text-*</code> with <code>leading-*</code>, collapsing matching width/height into <code>size-*</code>, modernizing <code>calc(var(--spacing)*…)</code> into <code>--spacing(…)</code>, and now in <a href="https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0" rel="noopener nofollow ugc">v4.3.0</a>, migrating <code>[&amp;:has(…)]</code> to <code>has-[…]</code> and preserving significant whitespace and original units in arbitrary values. canonical_tailwind delegates to the user’s installed binary, so all of that lands for you the moment you bump <code>:tailwind</code>.</p>
<p>Changelog: <a href="https://hexdocs.pm/canonical_tailwind/changelog.html" class="inline-onebox" rel="noopener nofollow ugc">Changelog — canonical_tailwind v0.3.0</a></p>
<p>Hope you find it useful!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388543" 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/canonical-tailwind-tailwind-class-canonicalization-via-mix-format/74726/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-388543" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388543"
                     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 #12"></div>
  </section>
</div>
    <div class="postbit" id="388594" data-post-id="388594">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>This is amazing. I’ll install it first opportunity.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388594" 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/canonical-tailwind-tailwind-class-canonicalization-via-mix-format/74726/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-388594" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388594"
                     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 #13"></div>
  </section>
</div>
    <div class="postbit" id="390212" data-post-id="390212">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aptinio" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aptinio/120/456_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aptinio
                    <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>Just shipped 0.2.0. <strong>It’s faster.</strong></p>
<p>It used to run a pool of <code>tailwindcss</code> CLI processes to parallelize <code>mix format</code>. But that pool only ever helped a full-tree format. Since Elixir 1.17, <code>mix format</code> caches unchanged files, so even that only runs over the whole tree on the first format or a fresh CI checkout. Everything else (format-on-save, a single file, a repeat <code>mix format</code> after edits) touches a handful of files, which one warm CLI handles fine. 0.2.0 drops the pool for that single warm CLI, so those everyday cases start sooner. The one tradeoff is the first full-tree format, which gives up the old parallelism.</p>
<p>It’s also lighter: a long editor session now holds one CLI instead of up to six, so a few hundred MB instead of well over a gigabyte.</p>
<p>And the single CLI is now keyed per resolved configuration, so one <code>mix format</code> can span apps or directories that resolve to different configs: an umbrella with per-app tailwind profiles, or a project using <code>subdirectories</code> with per-directory <code>.formatter.exs</code> files. Each config gets its own warm CLI.</p>
<p>If you’re upgrading: <code>:pool_size</code> is deprecated and ignored, and the config-drift error from 0.1.5 is gone, so the per-app workaround for mismatched umbrella configs is no longer needed.</p>
<p>Changelog: <a href="https://github.com/aptinio/canonical_tailwind/releases/tag/v0.2.0" class="inline-onebox" rel="noopener nofollow ugc">Release v0.2.0 · aptinio/canonical_tailwind · GitHub</a><br>
Hope you find it useful!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390212" 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/canonical-tailwind-tailwind-class-canonicalization-via-mix-format/74726/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-390212" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390212"
                     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 #14"></div>
  </section>
</div>
    <div class="postbit" id="390749" data-post-id="390749">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aptinio" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aptinio/120/456_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aptinio
                    <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>Just shipped 0.3.0. There’s a new <code>~TW</code> sigil.</p>
<p><code>canonical_tailwind</code> already canonicalizes <code>class</code> attributes in HEEx. But Tailwind classes often live in plain <code>.ex</code> code too: helper functions, module attributes, class-builder lists. A formatter can’t safely touch those on its own, since it can’t tell a Tailwind class string from any other string.</p>
<p><code>~TW</code> lets you mark a string as a class list, so <code>mix format</code> canonicalizes it:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defp button_class, do: ~TW"px-4 py-2 inline-flex rounded-md bg-brand"
# becomes, on mix format:
defp button_class, do: ~TW"inline-flex rounded-md bg-brand px-4 py-2"
</code></pre>
<p>It works anywhere a string literal does. It’s opt-in per string, so you canonicalize the strings you want and leave the lists you’ve ordered by hand.</p>
<p>Add <code>CanonicalTailwind</code> to your formatter <code>:plugins</code> and <code>import CanonicalTailwind.Sigil</code> to use it.</p>
<p>Hope you find it useful!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390749" 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/canonical-tailwind-tailwind-class-canonicalization-via-mix-format/74726/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-390749" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390749"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>