<?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: k-s-h-r</title>
    <description>The latest articles on DEV Community by k-s-h-r (@k-s-h-r).</description>
    <link>https://dev.to/k-s-h-r</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%2F3861270%2Fc3d83311-3c1b-44fd-8142-a6848d2c76aa.jpg</url>
      <title>DEV Community: k-s-h-r</title>
      <link>https://dev.to/k-s-h-r</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/k-s-h-r"/>
    <language>en</language>
    <item>
      <title>I built Material Symbols SVG, an icon library for using Material Symbols as SVG components</title>
      <dc:creator>k-s-h-r</dc:creator>
      <pubDate>Sat, 04 Apr 2026 17:07:36 +0000</pubDate>
      <link>https://dev.to/k-s-h-r/material-symbols-svg-material-symbols-as-svg-components-across-frameworks-11lm</link>
      <guid>https://dev.to/k-s-h-r/material-symbols-svg-material-symbols-as-svg-components-across-frameworks-11lm</guid>
      <description>&lt;p&gt;I built &lt;a href="https://www.material-symbols-svg.com/" rel="noopener noreferrer"&gt;Material Symbols SVG&lt;/a&gt;, an icon library that lets you use Google's Material Symbols as SVG components across frameworks.&lt;/p&gt;

&lt;p&gt;It currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React: &lt;code&gt;@material-symbols-svg/react&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Vue: &lt;code&gt;@material-symbols-svg/vue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Svelte: &lt;code&gt;@material-symbols-svg/svelte&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Astro: &lt;code&gt;@material-symbols-svg/astro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;React Native: &lt;code&gt;@material-symbols-svg/react-native&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://www.material-symbols-svg.com/usage" rel="noopener noreferrer"&gt;https://www.material-symbols-svg.com/usage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Icon catalog: &lt;a href="https://www.material-symbols-svg.com/" rel="noopener noreferrer"&gt;https://www.material-symbols-svg.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/k-s-h-r/material-symbols-svg" rel="noopener noreferrer"&gt;https://github.com/k-s-h-r/material-symbols-svg&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;There is already an official-ish way to consume Material Symbols as SVG files, for example &lt;a href="https://www.npmjs.com/package/@material-symbols/svg-400" rel="noopener noreferrer"&gt;&lt;code&gt;@material-symbols/svg-400&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The problem I kept running into was this: if I wanted to use those icons in React as components, I usually had to rely on another layer such as &lt;code&gt;@svgr/webpack&lt;/code&gt;, or build some custom conversion flow around raw SVG files.&lt;/p&gt;

&lt;p&gt;That works, but it is not what I wanted for day-to-day UI work.&lt;/p&gt;

&lt;p&gt;What I wanted instead was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no extra SVG conversion step&lt;/li&gt;
&lt;li&gt;no framework-specific webpack setup just to render icons&lt;/li&gt;
&lt;li&gt;direct imports that already behave like components&lt;/li&gt;
&lt;li&gt;a consistent mental model across frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built a library that ships Material Symbols as framework components from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the library provides
&lt;/h2&gt;

&lt;p&gt;At the moment, the library includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3,800+ icons&lt;/li&gt;
&lt;li&gt;3 style variants: &lt;code&gt;outlined&lt;/code&gt;, &lt;code&gt;rounded&lt;/code&gt;, &lt;code&gt;sharp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;7 weight variants: &lt;code&gt;100&lt;/code&gt; through &lt;code&gt;700&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;filled variants&lt;/li&gt;
&lt;li&gt;framework packages with similar import patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because these are distributed as SVG components rather than icon fonts, they fit nicely into regular component-based UI code. You can control them with things like &lt;code&gt;size&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;className&lt;/code&gt; or &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt;, and standard SVG attributes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic usage
&lt;/h2&gt;

&lt;p&gt;Here is a React example:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Search&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;HomeRounded&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react/rounded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;HomeW500&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react/w500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Example&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Search&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#64748b"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;HomeRounded&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;HomeW500&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#0ea5e9"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;The default import is &lt;code&gt;outlined / w400&lt;/code&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// outlined / w400&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;HomeW600&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react/w600&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;HomeRounded&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react/rounded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;HomeSharpW700&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react/sharp/w700&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;p&gt;The same import-path idea is used across the other framework packages too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why style and weight are split by import path
&lt;/h2&gt;

&lt;p&gt;One of the main design choices in this library is that style and weight are selected by import path, not by runtime props.&lt;/p&gt;

&lt;p&gt;That is not just an API preference. It comes from how Material Symbols SVG data is structured.&lt;/p&gt;

&lt;p&gt;Material Symbols are not simple line icons where you can change stroke width at runtime and get a new weight. Each style and weight combination has its own filled path data.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;outlined&lt;/code&gt;, &lt;code&gt;rounded&lt;/code&gt;, and &lt;code&gt;sharp&lt;/code&gt; are different SVG paths&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;w100&lt;/code&gt; through &lt;code&gt;w700&lt;/code&gt; are also different SVG paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if I designed the API like this:&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt; &lt;span class="na"&gt;styleVariant&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded"&lt;/span&gt; &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then a single icon component would tend to carry up to &lt;code&gt;3 x 7 = 21&lt;/code&gt; path variants inside one module.&lt;/p&gt;

&lt;p&gt;That is convenient at the call site, but it is not great for module boundaries and tree-shaking. Unused variants are much more likely to sit inside the same import graph.&lt;/p&gt;

&lt;p&gt;By splitting variants into import paths like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@material-symbols-svg/react/w600&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@material-symbols-svg/react/rounded/w400&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@material-symbols-svg/react/sharp/w700&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the bundler has a much clearer module shape to work with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep imports for individual icons
&lt;/h2&gt;

&lt;p&gt;The library also supports deep imports through &lt;code&gt;icons/*&lt;/code&gt;.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HomeW400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HomeFillW600&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react/icons/home&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SettingsW400&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react/rounded/icons/settings&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;p&gt;This helps for a few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the exact icon is explicit in the import path&lt;/li&gt;
&lt;li&gt;filled variants are easy to target&lt;/li&gt;
&lt;li&gt;in some setups, dev server startup and HMR behave better than broad root imports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This part became especially important when I tested framework-specific developer experience.&lt;/p&gt;

&lt;p&gt;For example, in Astro 5 I hit cases where root imports timed out during dev startup, while &lt;code&gt;icons/*&lt;/code&gt; deep imports worked reliably. So for some frameworks, deep imports are not just a nice extra API, but a practical escape hatch for development performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standard SVG props and accessibility
&lt;/h2&gt;

&lt;p&gt;The components accept standard SVG-oriented props and attributes such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;size&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;className&lt;/code&gt; / &lt;code&gt;class&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;style&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aria-*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data-*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Example&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt;
      &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#ff6b6b"&lt;/span&gt;
      &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"drop-shadow-lg"&lt;/span&gt;
      &lt;span class="na"&gt;aria-label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Home"&lt;/span&gt;
      &lt;span class="na"&gt;data-testid&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"home-icon"&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;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;You can also pass a &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; as a child:&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which ends up inside the rendered SVG:&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="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/path&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/title&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;That keeps accessibility metadata close to the icon component itself.&lt;/p&gt;

&lt;p&gt;Tailwind CSS works well too, because you can style the icon just like any other component:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Search&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@material-symbols-svg/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SearchButton&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inline-flex items-center gap-2 rounded-md border px-3 py-2 text-sm hover:bg-slate-50"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Search&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"size-5 text-slate-600"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      Search
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;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;h2&gt;
  
  
  Next.js optimization
&lt;/h2&gt;

&lt;p&gt;For the React package, Next.js users can also improve dev-time behavior with &lt;code&gt;optimizePackageImports&lt;/code&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;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;optimizePackageImports&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;@material-symbols-svg/react&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;@material-symbols-svg/react/rounded&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;@material-symbols-svg/react/sharp&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Official docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/docs/app/api-reference/config/next-config-js/optimizePackageImports" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/api-reference/config/next-config-js/optimizePackageImports&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next.js already optimizes some libraries by default, such as &lt;code&gt;lucide-react&lt;/code&gt; and &lt;code&gt;react-icons/*&lt;/code&gt;, but &lt;code&gt;@material-symbols-svg/react&lt;/code&gt; is not included in that default list, so it needs to be configured explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  I also built an icon catalog site
&lt;/h2&gt;

&lt;p&gt;Along with the usage docs, I built a site where you can browse the icons and inspect variants:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.material-symbols-svg.com/" rel="noopener noreferrer"&gt;https://www.material-symbols-svg.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;search by icon name&lt;/li&gt;
&lt;li&gt;compare style, fill, weight, size, and color&lt;/li&gt;
&lt;li&gt;check framework-specific import snippets&lt;/li&gt;
&lt;li&gt;copy the SVG directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you are dealing with thousands of icons, that kind of browsing tool matters more than I expected. It is useful not just for common UI icons, but also for the weird niche ones.&lt;/p&gt;

&lt;p&gt;One thing I really like about Material Symbols is that the set is huge enough that you keep finding icons you did not expect to exist. There are very specific icons in there, including things like vacuum-related icons. My personal favorite is still &lt;code&gt;owl&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;I built this because I wanted Material Symbols to feel like first-class components instead of raw SVG assets that need another toolchain step.&lt;/p&gt;

&lt;p&gt;If that sounds useful, take a look here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://www.material-symbols-svg.com/usage" rel="noopener noreferrer"&gt;https://www.material-symbols-svg.com/usage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Icon catalog: &lt;a href="https://www.material-symbols-svg.com/" rel="noopener noreferrer"&gt;https://www.material-symbols-svg.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/k-s-h-r/material-symbols-svg" rel="noopener noreferrer"&gt;https://github.com/k-s-h-r/material-symbols-svg&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it and have feedback, I would love to hear it.&lt;/p&gt;

</description>
      <category>react</category>
      <category>npm</category>
      <category>typescript</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
