Material Symbols v3 Icon Font System

VerifiedSafe

Variable icon font system from Material Design 3. Provides 2,500+ icons with fill, weight, grade, and optical size axes.

Sby Skills Guide Bot
DevelopmentIntermediate
7/23/2026
Claude CodeCursorWindsurfCopilot
#icons#material-symbols#variable-fonts#css#ui-components

Recommended for

Automated summary

Documents the Material Symbols v3 variable icon font system: CDN or self-hosted loading, size classes, the FILL/wght/GRAD/opsz axes, and wiring icons to the project's color tokens.

Strengths

  • Covers all four variable-font axes (fill, weight, grade, optical size) with ready-made utility classes
  • Gives both a Google Fonts import and a concrete offline self-hosting path with a woff2 @font-face
  • Ties icon colors to project tokens (semantic colors, inheritance, state colors) instead of hard-coded values
  • Provides a consistent size scale, including fluid sizing hooked into Utopia type steps

Limitations

  • The supplied file cuts off at the “Interactive Icons” section, so interactive and animation guidance is missing
  • Accessibility for icon-only buttons is only cross-referenced to the ux-accessibility skill, not explained here
  • Icons are named via text ligatures, so a typo renders the literal word rather than failing loudly
When to use it

Reach for it whenever you need to add or style Material Symbols icons in a UI — buttons, navigation, status indicators — with the correct axes and theme colors.

When not to use it

Skip it if the project does not use Material Symbols, or if you need icon accessibility and animation rules, which live in other skills.

Security analysis

Safe
Quality score85/100

This is a pure styling reference document for the Material Symbols variable icon font. It contains no shell commands, no credential handling, no obfuscated payloads, and no instructions that weaken safety mechanisms. The only external touchpoints are a public font CDN import and a well-known download URL, which are standard practice for web fonts. Risk is minimal.

Findings
  • •No executable commands; declared tools are limited to Read/Write/Edit/Glob/Grep (no Bash, no network access).
  • •References external assets: a Google Fonts CDN @import and fonts.google.com download link — informational only, browser-side font loading, no data exfiltration.
  • •Writes are limited to documentation-described CSS/HTML snippets under project paths (e.g. css/styles/icons.css); no destructive or overwrite-prone operations.
How this analysis is made

Examples

Ajouter une icône à un bouton
Ajoute une icône Material Symbols « save » dans mon bouton d'enregistrement, en taille md et avec la couleur on-primary du thème.
Variantes d'axes
Donne-moi le HTML et le CSS pour afficher l'icône « favorite » en version remplie, poids 600, taille optique 40, et explique l'effet de chaque axe.
Auto-hébergement hors ligne
Remplace l'import Google Fonts de Material Symbols par un @font-face auto-hébergé en woff2 pour un usage hors ligne.

name: material-symbols-v3 description: Material Symbols v3 variable icon font system. Use when adding icons to buttons, navigation, status indicators, or any UI element. Provides 2,500+ icons with fill, weight, grade, and optical size axes. Integrates with project color tokens. allowed-tools: Read, Write, Edit, Glob, Grep

Material Symbols v3

Material Design 3 icon system using variable fonts. This project uses Material Symbols Outlined loaded from Google Fonts CDN.

Related Skills

  • ux-iconography: UX patterns for icon usage, accessibility, and animations
  • ux-accessibility: ARIA requirements for icon-only buttons
  • utopia-fluid-scales: Type scale tokens for fluid icon sizing

Project Setup

Location: css/styles/icons.css

@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap');

Self-Hosting (Offline)

For offline/production without CDN:

  1. Download from fonts.google.com/icons
  2. Place in /fonts/material-symbols-outlined.woff2
  3. Replace CDN import:
@font-face {
  font-family: 'Material Symbols Outlined';
  src: url('/fonts/material-symbols-outlined.woff2') format('woff2');
  font-weight: 100 700;
  font-style: normal;
}

Basic Usage

<span class="icon">home</span>
<span class="icon">settings</span>
<span class="icon">favorite</span>

Use the icon name from Material Symbols as text content.


Icon Sizes

| Class | Size | Optical Size | Use Case | |-------|------|--------------|----------| | .icon--sm | 20px | 20 | Dense UI, inline text | | .icon--md | 24px | 24 | Default, buttons | | .icon--lg | 40px | 40 | Emphasis, headers | | .icon--xl | 48px | 48 | Hero sections |

<span class="icon icon--sm">info</span>
<span class="icon icon--md">info</span>
<span class="icon icon--lg">info</span>
<span class="icon icon--xl">info</span>

Fluid Sizing with Utopia

For icons that scale with typography:

.icon-fluid {
  font-size: var(--step-1);
  --icon-optical-size: 24;
}

Variable Font Axes

Material Symbols is a variable font with 4 axes:

| Axis | Range | Default | Purpose | |------|-------|---------|---------| | FILL | 0–1 | 0 | Outlined (0) vs filled (1) | | wght | 100–700 | 400 | Stroke weight | | GRAD | -25–200 | 0 | Fine thickness adjustment | | opsz | 20–48 | 24 | Optical size optimization |

Fill Styles

<span class="icon icon--outlined">favorite</span>  <!-- Outline (default) -->
<span class="icon icon--filled">favorite</span>    <!-- Filled -->

Weight Variants

<span class="icon icon--thin">home</span>     <!-- 100 -->
<span class="icon icon--light">home</span>    <!-- 300 -->
<span class="icon icon--regular">home</span>  <!-- 400 (default) -->
<span class="icon icon--medium">home</span>   <!-- 500 -->
<span class="icon icon--bold">home</span>     <!-- 700 -->

Grade Variants

<span class="icon icon--grade-low">home</span>    <!-- -25: thinner on dark bg -->
<span class="icon icon--grade-normal">home</span> <!-- 0 (default) -->
<span class="icon icon--grade-high">home</span>   <!-- 200: bolder emphasis -->

Custom Variation

.custom-icon {
  --icon-fill: 1;
  --icon-weight: 600;
  --icon-grade: 0;
  --icon-optical-size: 24;
}

Icon Colors

Semantic Colors

<span class="icon icon--primary">check_circle</span>
<span class="icon icon--secondary">info</span>
<span class="icon icon--disabled">block</span>

Inherit from Parent

.icon {
  color: inherit;  /* Default behavior */
}

.btn-primary .icon {
  color: var(--theme-on-primary);
}

State Colors

.icon-success { color: var(--color-success); }
.icon-error { color: var(--color-error); }
.icon-warning { color: var(--color-warning); }

Interactive Icons

<span class="icon icon--interactive">settings</span>
.icon--interactive {
  cursor: pointer;
  transition: color 0.2s ease, transform 0.2s ease;
}

.icon--interactive:hover {
  color: var(--icon-color-primary);
  transform: scale(1.1);
}

.icon--interactive:active {
  transform: scale(0.95);
}

Button Patterns

Icon + Text Button

<button class="btn">
  <span class="icon" aria-hidden="true">add</span>
  <span>Add Item</span>
</button>
.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--space-xs);
}

Icon-Only Button

<button class="btn-icon" aria-label="Settings">
  <span class="icon" aria-hidden="true">settings</span>
</button>
.btn-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: var(--min-touch-target);
  min-height: var(--min-touch-target);
  padding: var(--space-xs);
}

Trailing Icon

<button class="btn">
  <span>Next</span>
  <span class="icon" aria-hidden="true">arrow_forward</span>
</button>

Accessibility

Decorative Icons (with visible label)

<button>
  <span class="icon" aria-hidden="true">save</span>
  Save
</button>

Meaningful Icons (icon-only)

<button aria-label="Close dialog">
  <span class="icon" aria-hidden="true">close</span>
</button>

Screen Reader Text

<button class="btn-icon">
  <span class="icon" aria-hidden="true">delete</span>
  <span class="sr-only">Delete item</span>
</button>

High Contrast Mode

@media (forced-colors: active) {
  .icon {
    forced-color-adjust: auto;
  }
}

Common Icons Reference

Navigation

| Icon | Name | Usage | |------|------|-------| | home | home | Home/main | | menu | menu | Hamburger menu | | arrow_back | arrow_back | Back navigation | | arrow_forward | arrow_forward | Forward/next | | close | close | Close/dismiss |

Actions

| Icon | Name | Usage | |------|------|-------| | add | add | Create new | | edit | edit | Edit/modify | | delete | delete | Remove | | save | save | Save | | search | search | Search |

Status

| Icon | Name | Usage | |------|------|-------| | check_circle | check_circle | Success/complete | | error | error | Error state | | warning | warning | Warning | | info | info | Information | | help | help | Help |

Media

| Icon | Name | Usage | |------|------|-------| | play_arrow | play_arrow | Play | | pause | pause | Pause | | volume_up | volume_up | Sound on | | volume_off | volume_off | Sound off |

Settings

| Icon | Name | Usage | |------|------|-------| | settings | settings | Settings | | tune | tune | Adjustments | | brightness_6 | brightness_6 | Theme toggle | | lock | lock | Locked/secure |

Browse all icons: fonts.google.com/icons


Animation

With Anime.js

import { animate } from 'animejs';

// Wiggle
animate(iconEl, {
  rotate: [0, -10, 10, -10, 10, 0],
  duration: 300,
  ease: 'easeOutQuad'
});

// Bounce
animate(iconEl, {
  scale: [1, 1.2, 1],
  duration: 200,
  ease: 'easeOutBack'
});

CSS Transitions

.icon {
  transition: transform 0.15s ease;
}

.btn:hover .icon {
  transform: scale(1.1);
}

.btn:active .icon {
  transform: scale(0.95);
}

Web Component Wrapper

class MIcon extends HTMLElement {
  static observedAttributes = ['name', 'size', 'filled'];

  connectedCallback() {
    this.render();
  }

  attributeChangedCallback() {
    this.render();
  }

  render() {
    const name = this.getAttribute('name') || 'help';
    const size = this.getAttribute('size') || 'md';
    const filled = this.hasAttribute('filled');

    this.innerHTML = `<span class="icon icon--${size}${filled ? ' icon--filled' : ''}" aria-hidden="true">${name}</span>`;
  }
}

customElements.define('m-icon', MIcon);

Usage:

<m-icon name="home"></m-icon>
<m-icon name="favorite" filled size="lg"></m-icon>

CSS Custom Properties

:root {
  /* Font */
  --icon-font: 'Material Symbols Outlined';

  /* Sizes */
  --icon-size-sm: 20px;
  --icon-size-md: 24px;
  --icon-size-lg: 40px;
  --icon-size-xl: 48px;

  /* Variable font axes */
  --icon-fill: 0;
  --icon-weight: 400;
  --icon-grade: 0;
  --icon-optical-size: 24;

  /* Colors */
  --icon-color: var(--color-on-surface);
  --icon-color-primary: var(--color-primary);
  --icon-color-secondary: var(--color-on-surface-variant);
  --icon-color-disabled: var(--color-outline);
}

Migration from Emoji

Replace emoji icons with Material Symbols:

| Old (Emoji) | New (Material Symbol) | |-------------|----------------------| | <span aria-hidden="true">📖</span> | <span class="icon" aria-hidden="true">menu_book</span> | | <span aria-hidden="true">⚙️</span> | <span class="icon" aria-hidden="true">settings</span> | | <span aria-hidden="true">🏠</span> | <span class="icon" aria-hidden="true">home</span> | | <span aria-hidden="true">⭐</span> | <span class="icon" aria-hidden="true">star</span> | | <span aria-hidden="true">🔒</span> | <span class="icon" aria-hidden="true">lock</span> | | <span aria-hidden="true">🔊</span> | <span class="icon" aria-hidden="true">volume_up</span> | | <span aria-hidden="true">🔇</span> | <span class="icon" aria-hidden="true">volume_off</span> | | <span aria-hidden="true">✓</span> | <span class="icon" aria-hidden="true">check</span> |


Files

  • css/styles/icons.css - Icon system styles and CSS custom properties

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/material-symbols-v3-icon-font-system-mrx3xxuc/download' --output '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md.part' && mv '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md.part' '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

Tools declared by the author (check availability in your agent): Read, Write, Edit, Glob, Grep

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md' && test -s '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/material-symbols-v3' && cp -R '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc' '.claude/skills/material-symbols-v3'

Cursor
test -f '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md' && test -s '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/material-symbols-v3' && cp -R '.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc' '.cursor/skills/material-symbols-v3'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc'

openskills read 'material-symbols-v3-icon-font-system-mrx3xxuc'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/material-symbols-v3-icon-font-system-mrx3xxuc/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills