<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tailwindcss on Haseeb Majid</title>
    <link>https://haseebmajid.dev/tags/tailwindcss/</link>
    <description>Recent content in Tailwindcss on Haseeb Majid</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 06 May 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://haseebmajid.dev/tags/tailwindcss/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How I Setup Tailwindcss LSP With Neovim &amp; Nix (With DaisyUI)</title>
      <link>https://haseebmajid.dev/posts/2025-05-06-how-i-setup-tailwindcss-lsp-with-neovim-nix-with-daisyui-/</link>
      <pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate>
      
      <guid>https://haseebmajid.dev/posts/2025-05-06-how-i-setup-tailwindcss-lsp-with-neovim-nix-with-daisyui-/</guid>
      <description>&lt;p&gt;Recently, I have been building an app (&lt;a href=&#34;https://voxicle.app&#34;&gt;https://voxicle.app&lt;/a&gt; #ShamelessPlug), with tailwind and DaisyUI. I have been
having issues getting the tailwind LSP to work nicely in Neovim, and only recently managed to make it work.
So in this article, I will go over how I set up, assuming you are using Nix as a package manager.&lt;/p&gt;
&lt;h2 id=&#34;why-nix&#34;&gt;Why Nix?&lt;/h2&gt;
&lt;p&gt;In my project, it is a go web app, so all the dependencies in the project are managed as go modules by my &lt;code&gt;go.mod&lt;/code&gt; file.
Then everything else the developer needs is set up as a dev shell. Things like the standalone tailwind CLI,
I am using a nix flake which already has DaisyUI built in so it can also generate those types i.e. &lt;code&gt;btn&lt;/code&gt; in the final
styles.css (or whatever you called it). The flake is here: &lt;a href=&#34;https://github.com/aabccd021/tailwindcss-daisyui-nix&#34;&gt;https://github.com/aabccd021/tailwindcss-daisyui-nix&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently, I have been building an app (<a href="https://voxicle.app">https://voxicle.app</a> #ShamelessPlug), with tailwind and DaisyUI. I have been
having issues getting the tailwind LSP to work nicely in Neovim, and only recently managed to make it work.
So in this article, I will go over how I set up, assuming you are using Nix as a package manager.</p>
<h2 id="why-nix">Why Nix?</h2>
<p>In my project, it is a go web app, so all the dependencies in the project are managed as go modules by my <code>go.mod</code> file.
Then everything else the developer needs is set up as a dev shell. Things like the standalone tailwind CLI,
I am using a nix flake which already has DaisyUI built in so it can also generate those types i.e. <code>btn</code> in the final
styles.css (or whatever you called it). The flake is here: <a href="https://github.com/aabccd021/tailwindcss-daisyui-nix">https://github.com/aabccd021/tailwindcss-daisyui-nix</a></p>
<p>I didn&rsquo;t want to have multiple package managers, using <code>npm</code> or something else.</p>
<p>You can learn more about this here: <a href="https://www.youtube.com/watch?v=bdGfn_ihHOk">https://www.youtube.com/watch?v=bdGfn_ihHOk</a></p>
<h2 id="setup">Setup</h2>
<p>Assuming we have enabled the tailwind LSP in our Neovim config, I am using NixCats, and it looks it like this (using nvim-lspconfig):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;tailwindcss&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">lsp</span> <span class="o">=</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><p>You can find my full config here:</p>
<ul>
<li><a href="https://gitlab.com/hmajid2301/nixicle/-/blob/8c959ca5bd6436595592d0cedf932787ba86e359/modules/home/cli/editors/neovim/lua/myLuaConf/LSPs/init.lua#L199">https://gitlab.com/hmajid2301/nixicle/-/blob/8c959ca5bd6436595592d0cedf932787ba86e359/modules/home/cli/editors/neovim/lua/myLuaConf/LSPs/init.lua#L199</a></li>
<li><a href="https://gitlab.com/hmajid2301/nixicle/-/blob/MAJ-311/modules/home/cli/editors/neovim/default.nix#L48">https://gitlab.com/hmajid2301/nixicle/-/blob/MAJ-311/modules/home/cli/editors/neovim/default.nix#L48</a></li>
</ul>
<p>So first I added this flake as an input</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="n">tailwindcss_daisy</span><span class="o">.</span><span class="n">url</span> <span class="err">=</span> <span class="s2">&#34;github:aabccd021/tailwindcss-daisyui-nix/lsp&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">tailwindcss_daisy</span><span class="o">.</span><span class="n">inputs</span><span class="o">.</span><span class="n">nixpkgs</span><span class="o">.</span><span class="n">follows</span> <span class="err">=</span> <span class="s2">&#34;nixpkgs&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>Then install the following packages:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="n">tailwindcss-language-server</span>
</span></span><span class="line"><span class="cl"><span class="n">tailwindcss_daisy</span><span class="o">.</span><span class="n">packages</span><span class="o">.</span><span class="si">${</span><span class="n">system</span><span class="si">}</span><span class="o">.</span><span class="n">default</span>
</span></span></code></pre></div><p>The <code>tailwindcss-language-server</code> being the LSP server for tailwind. Normally, this is installed in my dot files repo.
(I linked above). But this one is an overlay from the flake. So this one also has DaisyUI in its NODE_PATH.
Then it also auto-complete classes from DaisyUI.</p>
<p>Read this issue: <a href="https://github.com/aabccd021/tailwindcss-daisyui-nix/issues/1">https://github.com/aabccd021/tailwindcss-daisyui-nix/issues/1</a></p>
<p>Finally, to get the tailwind LSP to work, we need to create an empty <code>tailwind.config.js</code>. Else, the tailwind LSP does
not seem to start correctly. Even though the project is configured using the CSS file (probably will be fixed)</p>
<p>That&rsquo;s it! It took me a while to figure it out, but this seems to work pretty nicely.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>TailwindCSS with CSS variables</title>
      <link>https://haseebmajid.dev/posts/2020-08-05-tailwindcss-with-css-variables/</link>
      <pubDate>Wed, 05 Aug 2020 00:00:00 +0000</pubDate>
      
      <guid>https://haseebmajid.dev/posts/2020-08-05-tailwindcss-with-css-variables/</guid>
      <description>&lt;p&gt;TailwindCSS allows us to use pre-defined classes instead of defining our CSS styles. In this article, we will go over
how we can use Custom properties (sometimes referred to as CSS variables or cascading variables) with TailwindCSS.&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;p&gt;First, follow the installation guide found &lt;a href=&#34;https://tailwindcss.com/docs/installation/#2-add-tailwind-to-your-css&#34;&gt;here&lt;/a&gt;.
This will show you how you can add TailwindCSS to your current project. For part 2 I will assume you called your CSS
file &lt;code&gt;global.css&lt;/code&gt;. This is the file that contains &lt;code&gt;@tailwind base;&lt;/code&gt; etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>TailwindCSS allows us to use pre-defined classes instead of defining our CSS styles. In this article, we will go over
how we can use Custom properties (sometimes referred to as CSS variables or cascading variables) with TailwindCSS.</p>
<h2 id="setup">Setup</h2>
<p>First, follow the installation guide found <a href="https://tailwindcss.com/docs/installation/#2-add-tailwind-to-your-css">here</a>.
This will show you how you can add TailwindCSS to your current project. For part 2 I will assume you called your CSS
file <code>global.css</code>. This is the file that contains <code>@tailwind base;</code> etc.</p>
<h2 id="global-css">Global CSS</h2>
<p>First, we need to edit our TailwindCSS file so it looks something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">@</span><span class="k">tailwind</span> <span class="nt">base</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">tailwind</span> <span class="nt">components</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">tailwind</span> <span class="nt">utilities</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">root</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">root</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">docs-root</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--primary</span><span class="p">:</span> <span class="mh">#367ee9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--secondary</span><span class="p">:</span> <span class="mh">#a0aec0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--accent</span><span class="p">:</span> <span class="mh">#718096</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--background</span><span class="p">:</span> <span class="mh">#fff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--main</span><span class="p">:</span> <span class="mh">#0d0106</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--header</span><span class="p">:</span> <span class="mh">#2d3748</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>I wrap my entire body in an element with class <code>root</code> or id <code>root</code>, so that any of my elements can access it later.</p>
<h3 id="gatsby">Gatsby</h3>
<p>If you&rsquo;re using Gatsby, you can add the following to your <code>gatsby-browser.js</code> file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">const</span> <span class="nx">wrapRootElement</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">element</span> <span class="p">})</span> <span class="p">=&gt;</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;root overflow-hidden&#34;</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">element</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span></code></pre></div><p>This will wrap all of our pages in the class <code>root</code> and <code>overflow-hidden</code> CSS class from TailwindCSS.</p>
<h2 id="tailwindconfigjs">tailwind.config.js</h2>
<p>Now we&rsquo;ve defined some CSS variables how can we use them with Tailwindcss? Simple, we update our tailwind config file
with some of the new CSS variables. Here we simply want to extend the config to add new colour values.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">theme</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">extend</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">colors</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">primary</span><span class="o">:</span> <span class="s2">&#34;var(--primary)&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">secondary</span><span class="o">:</span> <span class="s2">&#34;var(--secondary)&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">main</span><span class="o">:</span> <span class="s2">&#34;var(--main)&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">background</span><span class="o">:</span> <span class="s2">&#34;var(--background)&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">header</span><span class="o">:</span> <span class="s2">&#34;var(--header)&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">accent</span><span class="o">:</span> <span class="s2">&#34;var(--accent)&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>The syntax is very similar to how we would use the variables normally with CSS where it would normally look like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">element</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">primary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="logo">Logo</h2>
<p>Now how do we use our variable? Again pretty straight forward just like our normal tailwind classes. Let&rsquo;s imagine
we have a React component called <code>Logo.tsx</code>, defined like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-tsx" data-lang="tsx"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">React</span> <span class="kr">from</span> <span class="s2">&#34;react&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">tw</span> <span class="kr">from</span> <span class="s2">&#34;twin.macro&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">interface</span> <span class="nx">Props</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="cm">/** The size of the main text  */</span>
</span></span><span class="line"><span class="cl">  <span class="nx">size?</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">Logo</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">size</span> <span class="o">=</span> <span class="s2">&#34;2xl&#34;</span> <span class="p">}</span><span class="o">:</span> <span class="nx">Props</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">LogoContainer</span> <span class="na">className</span><span class="o">=</span><span class="p">{</span><span class="sb">` md:text-</span><span class="si">${</span><span class="nx">size</span><span class="si">}</span><span class="sb">`</span><span class="p">}&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">Tag</span><span class="p">&gt;</span><span class="o">&amp;</span><span class="nx">lt</span><span class="p">;&lt;/</span><span class="nt">Tag</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Haseeb</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">Tag</span><span class="p">&gt;</span><span class="o">/&amp;</span><span class="nx">gt</span><span class="p">;&lt;/</span><span class="nt">Tag</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">LogoContainer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">LogoContainer</span> <span class="o">=</span> <span class="nx">tw</span><span class="p">.</span><span class="nx">div</span><span class="sb">`cursor-pointer font-header tracking-wide text-2xl font-bold hover:text-primary`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">Tag</span> <span class="o">=</span> <span class="nx">tw</span><span class="p">.</span><span class="nx">span</span><span class="sb">`text-accent`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Logo</span><span class="p">;</span>
</span></span></code></pre></div><blockquote>
<p>INFO: I&rsquo;m using the <code>twin.macro</code> the library so we can use it with CSS-in-JS.</p>
</blockquote>
<p>To use our variables we just use them like: <code>text-primary</code>. Which will use the value we defined above, <code>#367ee9</code>. Now
if we change the value in the <code>global.css</code> file, it will automatically change here as well.</p>
<h2 id="darklight-mode-optional">Dark/Light Mode (Optional)</h2>
<p>This can be easily extended to add a dark/light mode. Add the following to the <code>global.css</code> file like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">theme-light</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--background</span><span class="p">:</span> <span class="mh">#fff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--main</span><span class="p">:</span> <span class="mh">#0d0106</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--header</span><span class="p">:</span> <span class="mh">#2d3748</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">theme-dark</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--background</span><span class="p">:</span> <span class="mh">#0e141b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--main</span><span class="p">:</span> <span class="mh">#ffffff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--header</span><span class="p">:</span> <span class="mh">#eaeaea</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We can use a theme context to get the current theme I&rsquo;ve written about
<a href="https://dev.to/hmajid2301/react-hooks-context-local-storage-3job">here</a>. We get the current theme then use that to determine which class
to set. This will then change value of the variables. If the theme changes, the variable values will change dark -&gt; light or
light -&gt; dark etc.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">{</span> <span class="nx">theme</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">useContext</span><span class="p">(</span><span class="nx">ThemeContext</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span>
</span></span><span class="line"><span class="cl">    <span class="na">className</span><span class="o">=</span><span class="p">{</span><span class="sb">`</span><span class="si">${</span>
</span></span><span class="line"><span class="cl">      <span class="nx">theme</span> <span class="o">===</span> <span class="s2">&#34;light&#34;</span> <span class="o">?</span> <span class="s2">&#34;theme-light&#34;</span> <span class="o">:</span> <span class="s2">&#34;theme-dark&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="si">}</span><span class="sb"> bg-background`</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span></code></pre></div><p>That&rsquo;s it! We&rsquo;ve learnt how to use CSS variables with TailwindCSS.</p>
<h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://gitlab.com/hmajid2301/personal-site/-/tree/fa01433eecec728427763e1e2b2cdd9710a9c197">Example Project</a></li>
<li><a href="https://flaticon.com">Icons from FlatIcon</a></li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
