<?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: Jan</title>
    <description>The latest articles on DEV Community by Jan (@uicoded).</description>
    <link>https://dev.to/uicoded</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%2F339065%2F03569ddc-7a0b-4989-9d24-df26bad66322.png</url>
      <title>DEV Community: Jan</title>
      <link>https://dev.to/uicoded</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uicoded"/>
    <language>en</language>
    <item>
      <title>VSCode CSS `unknownAtRule` warning fix</title>
      <dc:creator>Jan</dc:creator>
      <pubDate>Fri, 26 Sep 2025 15:07:12 +0000</pubDate>
      <link>https://dev.to/uicoded/vscode-css-unknownatrule-warning-fix-4ji8</link>
      <guid>https://dev.to/uicoded/vscode-css-unknownatrule-warning-fix-4ji8</guid>
      <description>&lt;p&gt;Have you experienced &lt;code&gt;unknownAtRule&lt;/code&gt; linter warning?&lt;/p&gt;

&lt;p&gt;For recap, here are common &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_syntax/At-rule" rel="noopener noreferrer"&gt;CSS at-rules&lt;/a&gt; that will not result in CSS lint warning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@import&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@media&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@supports&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@layer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@font-face&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@keyframes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@property&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@page&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@counter-style&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@container&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most likely, you’re working with Tailwind CSS, which uses &lt;a href="https://tailwindcss.com/docs/functions-and-directives#directives" rel="noopener noreferrer"&gt;directives&lt;/a&gt; for special functionality and can cause the linter to complain.&lt;/p&gt;

&lt;p&gt;A custom at-rules are allowed in &lt;a href="https://drafts.csswg.org/css-syntax/#at-rule" rel="noopener noreferrer"&gt;CSS Syntax Module Level 3&lt;/a&gt;, but the linter will not know about them without your help.&lt;/p&gt;

&lt;p&gt;That would be the case for Tailwind &lt;code&gt;@theme&lt;/code&gt;, &lt;code&gt;@apply&lt;/code&gt; directives, for example.&lt;/p&gt;

&lt;p&gt;Rather than ignoring the &lt;code&gt;unkonwnAtRules&lt;/code&gt; lint error by adding the following to the &lt;code&gt;.vscode/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;css.lint.unknownAtRules&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ignore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ignore | warning | error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here are two better alternatives:&lt;/p&gt;

&lt;p&gt;1) First, if you use Tailwind CSS 4.x, install &lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss" rel="noopener noreferrer"&gt;Tailwind CSS Intellisence&lt;/a&gt; and set the &lt;code&gt;files.associations&lt;/code&gt; (I omitted the second step, the main reason this post exists 😆)&lt;br&gt;
2) Second, have own whitelist of allowed at-rules.&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Tailwind CSS 4.x, TW Intellisense plugin
&lt;/h4&gt;

&lt;p&gt;Most likely you've encountered the &lt;code&gt;unknownAtRule&lt;/code&gt; when working with the latest Tailwind CSS 4.x directives. Despite having  &lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss" rel="noopener noreferrer"&gt;Tailwind CSS Intellisence&lt;/a&gt; activated, you still see squiggly lint warnings. Most likely because you have not read the full docs for &lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss#files.associations" rel="noopener noreferrer"&gt;Recommended Settings&lt;/a&gt;. Don't forget to set your &lt;code&gt;.vscode/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;files.associations&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tailwindcss&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. at-rules whitelist with own descriptions
&lt;/h4&gt;

&lt;p&gt;You can create own whitelist of custom at-rules by adding their definitions into &lt;a href="https://github.com/microsoft/vscode-custom-data" rel="noopener noreferrer"&gt;Custom Data&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(related: &lt;a href="https://raw.githubusercontent.com/microsoft/vscode-css-languageservice/main/docs/customData.schema.json" rel="noopener noreferrer"&gt;schema&lt;/a&gt;, &lt;a href="https://github.com/microsoft/vscode-extension-samples/tree/main/custom-data-sample" rel="noopener noreferrer"&gt;custom-data-sample&lt;/a&gt;, &lt;a href="https://code.visualstudio.com/api/extension-guides/custom-data-extension" rel="noopener noreferrer"&gt;custom-data-extension&lt;/a&gt; in &lt;code&gt;package.json&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Inside &lt;code&gt;.vscode/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;css.customData&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.vscode/css-custom-data.json&lt;/span&gt;&lt;span class="dl"&gt;"&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;p&gt;And add &lt;code&gt;css-custom-data.json&lt;/code&gt; file with specific Tailwind directives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$schema&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://raw.githubusercontent.com/microsoft/vscode-css-languageservice/main/docs/customData.schema.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;atDirectives&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@apply&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive for applying utility classes within custom CSS.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@apply&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/functions-and-directives#apply&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive to load a legacy JavaScript-based configuration file.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/functions-and-directives#config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@custom-variant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive for defining custom variants.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@custom-variant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/plugins#adding-variants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@layer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive for organizing custom styles into cascade layers.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@layer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/functions-and-directives#layer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@plugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive to load a legacy JavaScript-based plugin.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@plugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/plugins&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@source&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive to specify source files for content detection or to safelist utilities.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@source&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/content-configuration&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@theme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive for defining custom design tokens like fonts, colors, and breakpoints.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@theme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/theme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@utility&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive to add custom utilities to the framework.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@utility&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/plugins#adding-utilities&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@variant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tailwind CSS directive to apply a variant to styles in your CSS.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@variant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tailwindcss.com/docs/plugins#adding-variants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&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;p&gt;Reload the window with Command Palette (⌘ + ⇧ + P) "Deveper: Reload Window" to apply.&lt;/p&gt;

&lt;p&gt;And voila:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl76pt6whau31dpeh0nch.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl76pt6whau31dpeh0nch.jpg" alt="Tailwind CSS at-rule VSCode tooltip" width="463" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary:
&lt;/h2&gt;

&lt;p&gt;Custom at-rules lint errors can be fixed with right plugin that is correctly set or by creating custom user rules.&lt;/p&gt;

&lt;p&gt;Sometimes having a meaningful defaults can't be expected. (It is unclear if this was the case of &lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss" rel="noopener noreferrer"&gt;Tailwind CSS Intellisence&lt;/a&gt; plugin)&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>vscode</category>
      <category>css</category>
    </item>
    <item>
      <title>User Friendly Image Optimization Tool</title>
      <dc:creator>Jan</dc:creator>
      <pubDate>Mon, 19 May 2025 16:22:57 +0000</pubDate>
      <link>https://dev.to/uicoded/user-friendly-image-optimization-tool-2g58</link>
      <guid>https://dev.to/uicoded/user-friendly-image-optimization-tool-2g58</guid>
      <description>&lt;p&gt;There are many online image convertors and optimizers. A comprehensive list can be found in &lt;a href="https://www.smashingmagazine.com/2022/07/powerful-image-optimization-tools/" rel="noopener noreferrer"&gt;Powerful Image Optimization -  Smashing Magazine&lt;/a&gt; article  (it is dated 2022, so you can judge which survived long term).&lt;/p&gt;

&lt;p&gt;Here are two tips for open sourced, locally run tool.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jakearchibald.github.io/svgomg/" rel="noopener noreferrer"&gt;SVGOMG&lt;/a&gt; &lt;a href="https://jakearchibald.github.io/svgomg/" rel="noopener noreferrer"&gt;SVGOMG&lt;/a&gt; is GUI implementation of &lt;a href="https://github.com/svg/svgo" rel="noopener noreferrer"&gt;SVGO&lt;/a&gt; with many settings to optimize your SVG.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://imageoptim.com/" rel="noopener noreferrer"&gt;ImgOptim&lt;/a&gt; is mac app tool with simple interface integrating common image optimization CLI tools to optimize your jpeg, svg, gif, png.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Few open source projects made me instantly donate!&lt;br&gt;
Send them love and support.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Dealing With Web Fonts</title>
      <dc:creator>Jan</dc:creator>
      <pubDate>Mon, 05 May 2025 16:24:36 +0000</pubDate>
      <link>https://dev.to/uicoded/dealing-with-web-fonts-127d</link>
      <guid>https://dev.to/uicoded/dealing-with-web-fonts-127d</guid>
      <description>&lt;p&gt;When starting a web project (especially from scratch), a font is one of the questions that can spill the project into red relatively fast.&lt;/p&gt;

&lt;p&gt;Understand the Typography evokes emotions and as such it effects how people perceive, relate, trust and make buying decisions about the product, company or service.&lt;/p&gt;

&lt;p&gt;As a developer you take care about performance, cross platform support and technical accessibility.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, identify the typeface—and specific font styles—you need to implement (ask your designer if in doubt 😆).&lt;/li&gt;
&lt;li&gt;Deliver. Start with web-safe fonts, fonts already existing in your UI toolkit/CSS framework)
and fonts hosted on common font hosting platforms such as &lt;a href="https://fonts.google.com/" rel="noopener noreferrer"&gt;Google Fonts&lt;/a&gt;, &lt;a href="https://fonts.adobe.com/" rel="noopener noreferrer"&gt;Adobe Fonts&lt;/a&gt;, &lt;a href="https://www.monotype.com/" rel="noopener noreferrer"&gt;Monotype&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If dependence on, or access to a 3rd party provider is a concern, self-host your fonts for total control.&lt;/p&gt;

&lt;h2&gt;
  
  
  High level points:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You need a license to self-host a downloaded type.&lt;/li&gt;
&lt;li&gt;There are many font file formats (svg, otf, ttf, woff, woff2).&lt;/li&gt;
&lt;li&gt;Modern web format is &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_fonts/WOFF" rel="noopener noreferrer"&gt;woff&lt;/a&gt; (Web Open Font Format) with &lt;a href="https://caniuse.com/?search=woff" rel="noopener noreferrer"&gt;~97%&lt;/a&gt; browser support. Version 2 is using &lt;a href="https://github.com/google/brotli" rel="noopener noreferrer"&gt;Brotli&lt;/a&gt; compression and is ~20% - 50% more efficient.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cool links:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pair fonts with AI on &lt;a href="https://fontjoy.com/" rel="noopener noreferrer"&gt;Fontjoy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Edit Glyphs in &lt;a href="https://www.glyphrstudio.com/" rel="noopener noreferrer"&gt;glyphr studio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Learn Glyphs on &lt;a href="https://glyphsapp.com/features" rel="noopener noreferrer"&gt;Glyphs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sandbox Tests:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://livecodes.io/?x=https://github.com/uicoded/sandbox-css/blob/master/web-fonts/fonts-101.html" rel="noopener noreferrer"&gt;Fonts 101&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livecodes.io/?x=https://github.com/uicoded/sandbox-css/blob/master/web-safe-fonts.html" rel="noopener noreferrer"&gt;Web save fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livecodes.io/?x=https://github.com/uicoded/sandbox-css/blob/master/web-fonts/generic-fonts.html" rel="noopener noreferrer"&gt;Generic fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livecodes.io/?x=https://github.com/uicoded/sandbox-css/blob/master/web-fonts/google-web-fonts.html" rel="noopener noreferrer"&gt;Google web fonts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy selecting, managing and deploying fonts faster.&lt;br&gt;
It used to be much harder..&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>typography</category>
      <category>webdev</category>
    </item>
    <item>
      <title>4 Ways to Include SVG in HTML and a11y consideration</title>
      <dc:creator>Jan</dc:creator>
      <pubDate>Sat, 26 Apr 2025 03:20:09 +0000</pubDate>
      <link>https://dev.to/uicoded/4-ways-to-include-svg-in-html-and-a11y-consideration-a0c</link>
      <guid>https://dev.to/uicoded/4-ways-to-include-svg-in-html-and-a11y-consideration-a0c</guid>
      <description>&lt;p&gt;Here are &lt;strong&gt;4 common approaches&lt;/strong&gt; for including SVGs in HTML, along with a sample examples, &lt;strong&gt;comparison tables&lt;/strong&gt; and accessibility considerations:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Using &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;
&lt;/h2&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;object&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/svg+xml"&lt;/span&gt; &lt;span class="na"&gt;data=&lt;/span&gt;&lt;span class="s"&gt;"icon.svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/object&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Inline SVG
&lt;/h3&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;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 100 100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"skyblue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. SVG as a Background Image (CSS)
&lt;/h3&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
  &lt;span class="nc"&gt;.icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url('icon.svg')&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. SVG as an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;
&lt;/h3&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;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"icon.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Icon"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comparison Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Advantages&lt;/th&gt;
&lt;th&gt;Disadvantages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;- Loads external SVG &lt;br&gt; - Supports fallback &lt;br&gt; - Separate from DOM&lt;/td&gt;
&lt;td&gt;- No direct CSS/JS access to inner elements &lt;br&gt; - More HTTP requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline SVG&lt;/td&gt;
&lt;td&gt;- Full control via CSS &amp;amp; JS &lt;br&gt; - Animatable &lt;br&gt; - Accessible in DOM&lt;/td&gt;
&lt;td&gt;- Clutters HTML &lt;br&gt; - Can't reuse easily without duplication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background Image&lt;/td&gt;
&lt;td&gt;- Clean HTML &lt;br&gt; - Good for decorative use &lt;br&gt; - CSS control on container&lt;/td&gt;
&lt;td&gt;- No control over SVG internals &lt;br&gt; - Not accessible or interactive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;- Simple &amp;amp; semantic &lt;br&gt; - Easy to use &lt;br&gt; - Can include alt text&lt;/td&gt;
&lt;td&gt;- No CSS/JS access to inner elements &lt;br&gt; - Limited interactivity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  SVG &amp;amp; Accessibility
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅  1. &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt; – Moderate Accessibility
&lt;/h3&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;object&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/svg+xml"&lt;/span&gt; &lt;span class="na"&gt;data=&lt;/span&gt;&lt;span class="s"&gt;"icon.svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Fallback text&lt;span class="nt"&gt;&amp;lt;/object&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can provide &lt;strong&gt;fallback text&lt;/strong&gt; for screen readers and browsers that don’t support SVG.&lt;/li&gt;
&lt;li&gt;External SVGs can contain their own &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt;, and ARIA attributes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Screen readers might &lt;strong&gt;not access the inner SVG content&lt;/strong&gt; unless it’s well-structured inside the file.&lt;/li&gt;
&lt;li&gt;Accessibility depends heavily on how the &lt;strong&gt;external SVG file is authored&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅  2. Inline SVG – Best Accessibility
&lt;/h3&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;svg&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"img"&lt;/span&gt; &lt;span class="na"&gt;aria-labelledby=&lt;/span&gt;&lt;span class="s"&gt;"titleId descId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"titleId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Blue circle&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;desc&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"descId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;A simple circle shape filled with sky blue&lt;span class="nt"&gt;&amp;lt;/desc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"skyblue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have &lt;strong&gt;full control&lt;/strong&gt; over accessibility:

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt; for screen readers.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;role="img"&lt;/code&gt; and &lt;code&gt;aria-*&lt;/code&gt; attributes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Screen readers can interpret the SVG directly.&lt;/li&gt;

&lt;li&gt;Fully navigable in the &lt;strong&gt;accessibility tree&lt;/strong&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More verbose in the HTML.&lt;/li&gt;
&lt;li&gt;You must manually manage &lt;code&gt;id&lt;/code&gt;s and &lt;code&gt;aria&lt;/code&gt; references for accessibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚫 3. SVG as Background Image – Not Accessible
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;background-image&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;'icon.svg'&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean for purely decorative icons.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not accessible to screen readers&lt;/strong&gt; at all.&lt;/li&gt;
&lt;li&gt;Treated as a &lt;strong&gt;decorative style&lt;/strong&gt;, not as content.&lt;/li&gt;
&lt;li&gt;Can't provide alt text or semantic meaning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Should only be used&lt;/strong&gt; for purely decorative graphics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ 4. SVG as &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; – Limited Accessibility
&lt;/h3&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;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"icon.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"A sky blue circle icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses the standard &lt;code&gt;alt&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;Treated like any other image: &lt;strong&gt;accessible if &lt;code&gt;alt&lt;/code&gt; is meaningful&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Good for simple icons, logos, or illustrations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cannot describe or access inner elements.&lt;/li&gt;
&lt;li&gt;Can't be made interactive.&lt;/li&gt;
&lt;li&gt;Can’t use SVG-native accessibility features like &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt; unless you're using &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt; or inline SVG.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Recommendation Based on Accessibility
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Recommended Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interactive icons&lt;/td&gt;
&lt;td&gt;Inline SVG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decorative backgrounds&lt;/td&gt;
&lt;td&gt;CSS background image (with &lt;code&gt;aria-hidden&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semantic, non-interactive icons&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; with descriptive &lt;code&gt;alt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rich SVG with built-in a11y&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt; (only if SVG is authored well)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  QA Time:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 🧠 What are &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt; in SVG?
&lt;/h3&gt;

&lt;p&gt;Let's revisit the use of &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt; elements inside SVGs one more time. These elements are &lt;strong&gt;crucial for accessibility&lt;/strong&gt;, especially when SVGs are &lt;strong&gt;inline&lt;/strong&gt; and &lt;strong&gt;part of meaningful content&lt;/strong&gt; (like icons, logos, or illustrations conveying info).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gives the SVG a short, accessible name (like &lt;code&gt;alt&lt;/code&gt; text for images).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provides a longer, optional description (context or explanation).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They are &lt;strong&gt;read by screen readers&lt;/strong&gt; and help users who can’t see the image understand its meaning.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Basic Example
&lt;/h4&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;svg&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"img"&lt;/span&gt; &lt;span class="na"&gt;aria-labelledby=&lt;/span&gt;&lt;span class="s"&gt;"svgTitle svgDesc"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"svgTitle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Information icon&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;desc&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"svgDesc"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;A blue circle with a lowercase letter i in the center&lt;span class="nt"&gt;&amp;lt;/desc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"45"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"skyblue"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;text&lt;/span&gt; &lt;span class="na"&gt;x=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;y=&lt;/span&gt;&lt;span class="s"&gt;"60"&lt;/span&gt; &lt;span class="na"&gt;font-size=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;text-anchor=&lt;/span&gt;&lt;span class="s"&gt;"middle"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"white"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;i&lt;span class="nt"&gt;&amp;lt;/text&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🧩 Key Parts:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;role="img"&lt;/code&gt;: Tells assistive tech this is an image, not just a decorative shape.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aria-labelledby="svgTitle svgDesc"&lt;/code&gt;: Connects the text to the SVG.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;: Serves like &lt;code&gt;alt&lt;/code&gt; text.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt;: Optional, adds detail.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🗂 When to Use Them
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Use &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;?&lt;/th&gt;
&lt;th&gt;Use &lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt;?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Logo or brand icon&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI icon with meaning&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decorative image&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex charts or infographics&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For &lt;strong&gt;decorative icons&lt;/strong&gt;, you should instead use:&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;svg&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;focusable=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- no title or desc --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Can svg omit the &lt;code&gt;xmlns&lt;/code&gt;?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes — &lt;strong&gt;when used inline inside an HTML document&lt;/strong&gt;, the &lt;code&gt;xmlns&lt;/code&gt; attribute is &lt;strong&gt;not required&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So this is perfectly valid &lt;strong&gt;inline HTML5 SVG&lt;/strong&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;svg&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"img"&lt;/span&gt; &lt;span class="na"&gt;aria-labelledby=&lt;/span&gt;&lt;span class="s"&gt;"titleId descId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"titleId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Blue circle&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;desc&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"descId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;A simple circle shape filled with sky blue&lt;span class="nt"&gt;&amp;lt;/desc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"skyblue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works fine in modern browsers and supports accessibility.&lt;/p&gt;

&lt;h4&gt;
  
  
  ⚠️ &lt;strong&gt;When is &lt;code&gt;xmlns&lt;/code&gt; required?&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Only in these cases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;xmlns&lt;/code&gt; Required?&lt;/th&gt;
&lt;th&gt;Why?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inline in HTML&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Handled by browser’s HTML parser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVG file (standalone .svg)&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Required for XML validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline in XHTML&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Because XHTML is XML-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copied into XML/MathML&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Needs proper XML namespacing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example for standalone SVG files:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"skyblue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without the &lt;code&gt;xmlns&lt;/code&gt;, the file won't validate as an SVG document and could cause rendering issues in some tools or older XML-based workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪 Tips and Gotchas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔢 1. &lt;strong&gt;Use Unique &lt;code&gt;id&lt;/code&gt;s&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Avoid duplicate &lt;code&gt;id&lt;/code&gt;s like &lt;code&gt;title&lt;/code&gt; or &lt;code&gt;desc&lt;/code&gt;, especially in SPAs or when using SVGs multiple times.&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;title&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"infoIconTitle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Info icon&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ♿ 2. &lt;strong&gt;Make It Focusable if Interactive&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If the SVG is clickable (like a button):&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;svg&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"img"&lt;/span&gt; &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or better: wrap it in a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; or add keyboard handlers.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ 3. &lt;strong&gt;Don’t Rely on &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; as a Tooltip&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Browsers often &lt;strong&gt;don’t show&lt;/strong&gt; the SVG &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; as a tooltip like they do for HTML. Use &lt;code&gt;title=""&lt;/code&gt; on the container element or tooltips for visual hints.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ 4. &lt;strong&gt;Screen Reader Testing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Test with real screen readers (VoiceOver, NVDA, etc.) — support is decent but &lt;strong&gt;can vary&lt;/strong&gt; slightly between them.&lt;/p&gt;

&lt;p&gt;Test the examples &lt;a href="https://stackblitz.com/edit/svg-tests?file=index.html" rel="noopener noreferrer"&gt;live&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And that's a wrap!&lt;/p&gt;

</description>
      <category>svg</category>
    </item>
    <item>
      <title>TypeScript Generics Propagation in useOptimistic react hook</title>
      <dc:creator>Jan</dc:creator>
      <pubDate>Fri, 18 Apr 2025 19:13:17 +0000</pubDate>
      <link>https://dev.to/uicoded/typescript-generics-propagation-in-useoptimistic-react-hook-58dp</link>
      <guid>https://dev.to/uicoded/typescript-generics-propagation-in-useoptimistic-react-hook-58dp</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Generics enable reusable, type-safe code by parameterizing types, and their propagation ensures that these parameterized types are correctly applied or inferred in various contexts, such as function calls, object compositions, or React components (like the &lt;code&gt;useOptimistic&lt;/code&gt; hook example). These benefits come at a cost: generics can pose a steep learning curve and increased complexity, particularly with nested structures, potentially leading to ambiguity in code.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What Are TypeScript Generics?
&lt;/h2&gt;

&lt;p&gt;Generics allow you to define functions, interfaces, or classes that work with a variety of types while preserving type safety. Instead of hardcoding a specific type, you use a placeholder (e.g., &lt;code&gt;T&lt;/code&gt;) that is specified when the generic is used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// T is number&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// T is string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;T&lt;/code&gt; is a generic type parameter that propagates through the function, ensuring the input and output types are the same.&lt;/p&gt;

&lt;p&gt;If you’ve read the official &lt;a href="https://www.typescriptlang.org/docs/handbook/2/generics.html" rel="noopener noreferrer"&gt;TypeScript docs&lt;/a&gt; and explored more &lt;a href="https://www.freecodecamp.org/news/how-typescript-generics-work/" rel="noopener noreferrer"&gt;digestible examples&lt;/a&gt;, you might still find the following &lt;code&gt;useOptimistic&lt;/code&gt; React hook example challenging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;optimisticMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addOptimisticMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useOptimistic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;sending&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&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;p&gt;Can you clearly articulate what &lt;code&gt;&amp;lt;Message[], string&amp;gt;&lt;/code&gt; means?&lt;br&gt;&lt;br&gt;
If so, great job—stop reading here! 👍 &lt;/p&gt;

&lt;p&gt;If not, let’s dive deeper.&lt;/p&gt;
&lt;h3&gt;
  
  
  Type Inference with &lt;code&gt;useOptimistic&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;TypeScript’s type inference can sometimes eliminate the need for explicit generic annotations. For example, if the &lt;code&gt;messages&lt;/code&gt; array is already typed as &lt;code&gt;Message[]&lt;/code&gt; and the &lt;code&gt;newMessage&lt;/code&gt; parameter is annotated as &lt;code&gt;string&lt;/code&gt;, TypeScript can infer the generics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;optimisticMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addOptimisticMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useOptimistic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sending&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;p&gt;Here, TypeScript infers &lt;code&gt;T&lt;/code&gt; as &lt;code&gt;Message[]&lt;/code&gt; from &lt;code&gt;messages&lt;/code&gt; and &lt;code&gt;A&lt;/code&gt; as &lt;code&gt;string&lt;/code&gt; from &lt;code&gt;newMessage&lt;/code&gt;. Explicit generics (&lt;code&gt;&amp;lt;Message[], string&amp;gt;&lt;/code&gt;) are necessary only when TypeScript cannot infer types (e.g., with ambiguous or untyped inputs) or when you want to enforce specific types.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;useOptimistic&lt;/code&gt; with User-Friendly Typing
&lt;/h3&gt;

&lt;p&gt;To build a mental model, consider this mock implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useOptimistic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StateType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UpdateType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;StateType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;applyUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;StateType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UpdateType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;StateType&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;StateType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UpdateType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addOptimisticUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UpdateType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;applyUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addOptimisticUpdate&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;p&gt;This shows how &lt;code&gt;StateType&lt;/code&gt; and &lt;code&gt;UpdateType&lt;/code&gt; are used in the hook.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;useOptimistic&lt;/code&gt; Generic Signature
&lt;/h3&gt;

&lt;p&gt;The previous example is verbose. Let’s simplify it using &lt;code&gt;T&lt;/code&gt; and &lt;code&gt;A&lt;/code&gt; as generic parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useOptimistic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updateFn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(The real-world &lt;code&gt;useOptimistic&lt;/code&gt; signature can be found in the React &lt;a href="https://github.com/facebook/react/blob/bc6184dd993e6ea0efdee7553293676db774c3ca/packages/react/src/ReactHooks.js#L226" rel="noopener noreferrer"&gt;source code&lt;/a&gt; .)&lt;/p&gt;

&lt;p&gt;Returning to the hook usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;optimisticMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addOptimisticMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useOptimistic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, the meaning of &lt;code&gt;&amp;lt;Message[], string&amp;gt;&lt;/code&gt; becomes clearer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;T&lt;/code&gt;: The type of the state (e.g., &lt;code&gt;Message[]&lt;/code&gt;).

&lt;ul&gt;
&lt;li&gt;This defines the type of the optimistic state being managed.&lt;/li&gt;
&lt;li&gt;Here, &lt;code&gt;optimisticMessages&lt;/code&gt; is typed as an array of &lt;code&gt;Message&lt;/code&gt; objects.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;A&lt;/code&gt;: The type of the action (e.g., &lt;code&gt;string&lt;/code&gt;).

&lt;ul&gt;
&lt;li&gt;This defines the type of data passed to the updater function (&lt;code&gt;addOptimisticMessage&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;In this case, &lt;code&gt;string&lt;/code&gt; represents the text of a new message used to create an optimistic message.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
   2. Mechanics of Generics Propagation
&lt;/h2&gt;

&lt;p&gt;Generics propagation occurs when a generic type is passed or inferred through a chain of operations, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function calls&lt;/li&gt;
&lt;li&gt;Return types&lt;/li&gt;
&lt;li&gt;Object or array manipulations&lt;/li&gt;
&lt;li&gt;Component props or hooks in React&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The TypeScript compiler tracks the generic type (&lt;code&gt;T&lt;/code&gt;, &lt;code&gt;A&lt;/code&gt;, etc.) and ensures it is consistently applied or inferred based on usage. Propagation can happen explicitly (via type annotations) or implicitly (via type inference).&lt;/p&gt;

&lt;p&gt;In React, generics propagation is common in hooks, components, and utilities, ensuring type safety for props, state, or actions. Let’s analyze the &lt;code&gt;useOptimistic&lt;/code&gt; hook:&lt;/p&gt;

&lt;p&gt;1. &lt;strong&gt;Explicit Type Specification&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The generic &lt;code&gt;&amp;lt;Message[], string&amp;gt;&lt;/code&gt; is explicitly provided when calling &lt;code&gt;useOptimistic&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;T&lt;/code&gt; is set to &lt;code&gt;Message[]&lt;/code&gt;, meaning the state (&lt;code&gt;optimisticMessages&lt;/code&gt;) and the first argument to the update function (&lt;code&gt;state&lt;/code&gt;) are &lt;code&gt;Message[]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;A&lt;/code&gt; is set to &lt;code&gt;string&lt;/code&gt;, meaning the action (&lt;code&gt;newMessage&lt;/code&gt;) and the argument to &lt;code&gt;addOptimisticMessage&lt;/code&gt; are &lt;code&gt;string&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2. &lt;strong&gt;Propagation to State&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The hook returns &lt;code&gt;optimisticMessages&lt;/code&gt; as &lt;code&gt;T&lt;/code&gt; (&lt;code&gt;Message[]&lt;/code&gt;), so &lt;code&gt;optimisticMessages&lt;/code&gt; is typed as &lt;code&gt;Message[]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;This ensures that operations on &lt;code&gt;optimisticMessages&lt;/code&gt; (e.g., mapping or rendering) treat it as an array of &lt;code&gt;Message&lt;/code&gt; objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3. &lt;strong&gt;Propagation to Update Function&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The update function &lt;code&gt;(state: T, newMessage: A) =&amp;gt; T&lt;/code&gt; becomes &lt;code&gt;(state: Message[], newMessage: string) =&amp;gt; Message[]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The generic &lt;code&gt;T&lt;/code&gt; propagates to &lt;code&gt;state&lt;/code&gt; and the return type, ensuring the function returns a &lt;code&gt;Message[]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The generic &lt;code&gt;A&lt;/code&gt; propagates to &lt;code&gt;newMessage&lt;/code&gt;, ensuring it’s a &lt;code&gt;string&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4. &lt;strong&gt;Propagation to Action Handler&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The hook returns &lt;code&gt;addOptimisticMessage&lt;/code&gt; as &lt;code&gt;(action: A) =&amp;gt; void&lt;/code&gt;, which becomes &lt;code&gt;(action: string) =&amp;gt; void&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When &lt;code&gt;addOptimisticMessage("new message")&lt;/code&gt; is called, TypeScript ensures the argument is a &lt;code&gt;string&lt;/code&gt;, propagating the &lt;code&gt;A&lt;/code&gt; type.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Generics propagation ensures that:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The state (&lt;code&gt;optimisticMessages&lt;/code&gt;) remains &lt;code&gt;Message[]&lt;/code&gt; throughout the component lifecycle.&lt;/li&gt;
&lt;li&gt;The action (&lt;code&gt;addOptimisticMessage&lt;/code&gt;) only accepts &lt;code&gt;string&lt;/code&gt; inputs.&lt;/li&gt;
&lt;li&gt;The update function produces a valid &lt;code&gt;Message[]&lt;/code&gt;, preventing type mismatches (e.g., adding an invalid object to the array).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
   3. Conclusion
&lt;/h2&gt;

&lt;p&gt;Understanding TypeScript basics is a prerequisite before diving into generics. By mastering generics propagation, we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write reusable, type-safe code.&lt;/li&gt;
&lt;li&gt;Ensure hooks and components handle data consistently.&lt;/li&gt;
&lt;li&gt;Catch errors early through TypeScript’s type checking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common pitfalls are overly complex generic constraints that make code harder to read or maintain, incorrect type assumptions that lead to type errors (e.g., assuming a generic type is more specific than it is). Simplifying generics and leveraging TypeScript’s inference can often reduce complexity while maintaining safety.&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>CSS-in-JS: Pros and cons</title>
      <dc:creator>Jan</dc:creator>
      <pubDate>Fri, 11 Apr 2025 16:43:56 +0000</pubDate>
      <link>https://dev.to/uicoded/css-in-js-pros-and-cons-35ll</link>
      <guid>https://dev.to/uicoded/css-in-js-pros-and-cons-35ll</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;CSS-in-JS provides benefits like colocation, scoping, dynamic styling, and type-safety, for React-like frameworks. However, it can introduce runtime performance costs and added setup complexity. Modern libraries now offer static extraction and build support for SSR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Brief History
&lt;/h2&gt;

&lt;p&gt;CSS-in-JS emerged in 2014 with libraries like JSS and React’s inline styles, aiming to integrate styling with JavaScript for component-driven frameworks. &lt;/p&gt;

&lt;p&gt;The 2016 release of &lt;a href="https://styled-components.com/" rel="noopener noreferrer"&gt;styled-components&lt;/a&gt; popularized the approach, offering a clean syntax and React integration. &lt;/p&gt;

&lt;p&gt;By 2018, &lt;a href="https://emotion.sh/" rel="noopener noreferrer"&gt;Emotion&lt;/a&gt; and others expanded the ecosystem, addressing performance and flexibility. In server-side rendering (SSR) scenarios, CSS-in-JS libraries like styled-components and Emotion enable styles to be collected during rendering and embedded in the initial HTML response, ensuring faster page loads and preventing flash of unstyled content (FOUC). &lt;/p&gt;

&lt;p&gt;Static extraction libraries like &lt;a href="https://linaria.dev/" rel="noopener noreferrer"&gt;Linaria&lt;/a&gt; (2020) and &lt;a href="https://vanilla-extract.style/" rel="noopener noreferrer"&gt;Vanilla Extract&lt;/a&gt; (2021) later minimized runtime costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CSS-in-JS?
&lt;/h2&gt;

&lt;p&gt;1. &lt;strong&gt;Colocation&lt;/strong&gt;: Styles stay with components, easing maintenance. Example using &lt;code&gt;styled-components&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="s2"&gt;`
     background: blue;
     color: white;
     padding: 10px;
   `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2. &lt;strong&gt;Scoping&lt;/strong&gt;: Component-scoped styles prevent leaks. Emotion and styled-components generate unique class names, avoiding conflicts without BEM.&lt;/p&gt;

&lt;p&gt;3. &lt;strong&gt;Dynamic Styles&lt;/strong&gt;: JavaScript enables runtime styles via props or state&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="s2"&gt;`
     background: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primary&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gray&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;;
     font-size: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;16px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;
   `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4. &lt;strong&gt;Type-Safety&lt;/strong&gt;: TypeScript catches errors early.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ButtonProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nl"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ButtonProps&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;`
     background: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primary&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gray&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;;
   `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Not CSS-in-JS?
&lt;/h2&gt;

&lt;p&gt;1. &lt;strong&gt;Performance Overhead&lt;/strong&gt;: Runtime style generation slows rendering versus static CSS. Static extraction mitigates but doesn’t eliminate this.&lt;/p&gt;

&lt;p&gt;2. &lt;strong&gt;Learning Curve&lt;/strong&gt;: New APIs and tooling (Babel, Webpack) add complexity. Teams used to CSS or Tailwind may prefer simpler options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modern CSS-in-JS Libraries
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before Static Extraction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://styled-components.com/" rel="noopener noreferrer"&gt;styled-components&lt;/a&gt;&lt;/strong&gt;: Template literals for React-friendly styling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://emotion.sh/" rel="noopener noreferrer"&gt;Emotion&lt;/a&gt;&lt;/strong&gt;: Lightweight, with CSS prop and TypeScript support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cssinjs.org/" rel="noopener noreferrer"&gt;JSS&lt;/a&gt;&lt;/strong&gt;: Object-based styles, less common in React.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfukxxgw35pinmvwhmmy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfukxxgw35pinmvwhmmy.jpg" alt="runtime style injection" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See: &lt;a href="https://stackblitz.com/edit/css-in-js-styled-components" rel="noopener noreferrer"&gt;React: style-components Example&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  After Static Extraction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://linaria.dev/" rel="noopener noreferrer"&gt;Linaria&lt;/a&gt;&lt;/strong&gt;: Zero-runtime, styled-components-like syntax, extracts to CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://vanilla-extract.style/" rel="noopener noreferrer"&gt;Vanilla Extract&lt;/a&gt;&lt;/strong&gt;: Type-safe, JavaScript objects, generates static CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://emotion.sh/" rel="noopener noreferrer"&gt;Emotion&lt;/a&gt; (@emotion/css)&lt;/strong&gt;: Supports static extraction for build-time CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://panda-css.com/" rel="noopener noreferrer"&gt;Panda CSS&lt;/a&gt;&lt;/strong&gt;: Utility-first, static CSS with CSS-in-JS ergonomics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffton596jkszpgv64efpa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffton596jkszpgv64efpa.jpg" alt="static css in a link" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See: &lt;a href="https://stackblitz.com/edit/css-in-js-panda-css" rel="noopener noreferrer"&gt;React: panda-css Example&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  UI Libraries and CSS-in-JS Usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://mui.com/" rel="noopener noreferrer"&gt;Material-UI (MUI)&lt;/a&gt;&lt;/strong&gt;: Uses Emotion (v5+), supports styled-components via plugin, JSS in older versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://chakra-ui.com/" rel="noopener noreferrer"&gt;Chakra UI&lt;/a&gt;&lt;/strong&gt;: Emotion-based styled-system for dynamic, theme-driven styles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://mantine.dev/" rel="noopener noreferrer"&gt;Mantine&lt;/a&gt;&lt;/strong&gt;: Custom CSS-in-JS, Emotion-like, with static extraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ant.design/" rel="noopener noreferrer"&gt;Ant Design&lt;/a&gt;&lt;/strong&gt;: CSS Modules primarily, supports Emotion/styled-components via integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.radix-ui.com/" rel="noopener noreferrer"&gt;Radix UI&lt;/a&gt;&lt;/strong&gt;: No CSS-in-JS; uses vanilla CSS or Tailwind for unstyled primitives.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;CSS-in-JS offers colocation, scoping, dynamic styles, and type-safety, for React-like frameworks. Runtime performance and setup complexity are drawbacks. Static extraction tools like Linaria and Vanila Extract blend CSS-in-JS benefits with static CSS speed. UI libraries like MUI and Chakra UI favor Emotion, while Radix avoids CSS-in-JS for flexibility. Based on app scale and team skills; simplicity may favor CSS Modules or Tailwind.&lt;/p&gt;

</description>
      <category>css</category>
      <category>pandacss</category>
      <category>cssinjs</category>
      <category>react</category>
    </item>
  </channel>
</rss>
