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
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.
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
SafeThis 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.
- •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.
Examples
Ajoute une icône Material Symbols « save » dans mon bouton d'enregistrement, en taille md et avec la couleur on-primary du thème.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.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 animationsux-accessibility: ARIA requirements for icon-only buttonsutopia-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:
- Download from fonts.google.com/icons
- Place in
/fonts/material-symbols-outlined.woff2 - 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 filesThis 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.mdFrom 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 installationopenskills 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 syncManual 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.
React Hook Form Best Practices
Development
Master React Hook Form: avoid anti-patterns, manage subscriptions, and handle reset, dirty state, and controlled inputs correctly.
Emotion to Mantine Migration
Development
Migrate Emotion styled-components to Mantine components with style props and CSS modules. Use when converting .styled.tsx files or removing @emotion imports.
Scope Creep Detector
Development
Analyzes git diffs against a stated intent to detect scope creep, unrelated files, broad PRs, and oversized changes, then suggests keep, split, or justify actions.