with-icons
Skill3 starsChanged 28 days agoMITView on GitHub
Icons for any web, app or UI project from the "with icons" library (withicons.com, npm @withicons/*), 1000 MIT-licensed icons in 34 styles: line, solid, duo, office suite, 3D (clay, glass, liquid glass, chrome, soft 3D, luxe, skeuomorphic), brand (bento, app-dock tiles, neo-brutalism, bauhaus), playful (kawaii, plush, sticker, pastel, pixel, retro), artistic (sketch, engrave, blueprint, anime, gothic, coquette) and holiday styles (Diwali, Holi, Halloween, Christmas, Lunar New Year, Valentine's). React, Vue, Svelte, Angular, SolidJS, web component, CSS classes, sprites, CDN, download-all zips. Festival icons, inclusive avatars, animated and 3D icons (@withicons/motion), live date or count icons (@withicons/dynamic), files for slides, print, email and social (SVG, PNG, PDF, PowerPoint, GIF, Lottie). Use it whenever a task needs an icon, icon set or avatar, the right icon name or style for a job, icon search over MCP, or to replace emoji, inline SVG or another set (Lucide, Heroicons, Font Awesome).
- Installs packages
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 5 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 31
Every framework package, <with-icon> and the class loader carry all 34 styles (they fetch companions themselves).
- Very specific: line 32
Only raw files are split: the newest styles' SVGs and node data are in @withicons/core-plus, soft3d and holiday, prebuilt SVGs and sprites …
- Very specific: line 37
Every framework has the same props: size (24), color (currentColor.
- Distinctive: line 89
Look every name up before writing it (section 5) or read reference/icons.md (all 1000 names, categories, aliases).
- Distinctive: line 100
Never rely on the icon alone.
- Distinctive: line 151
When the result is a deck, document, print file, email or post, give FILES, not code (Node 18+, no browser):
- Distinctive: line 190
Every live icon with its params, sizes and recipes: reference/live.md.
- Distinctive: line 227
Don't mix with icons and another set in one UI region.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
with icons
1000 icons, each drawn once and rendered in 34 styles. The ink is currentColor, the grid 24x24, the default size 24.
Site https://withicons.com · repo https://github.com/withevergrow/withicons · MIT. Detail lives in reference/; read
the file a rule links to before going beyond the rule.
1. Pick the package
| project | install | use |
| React / Next.js / Remix | npm i @withicons/react | import { Home } from '@withicons/react' then <Home /> |
| Vue 3 / Nuxt | npm i @withicons/vue | same named imports |
| Svelte 4/5 | npm i @withicons/svelte | same named imports |
| Angular 17+ | npm i @withicons/angular | imports: [WithIconComponent], <with-icon [icon]="Home" /> |
| SolidJS | npm i @withicons/solid | same named imports |
| any HTML, no build | CDN @withicons/web/dist/cdn.js | <with-icon name="home"></with-icon> |
| Font Awesome-style classes | CDN @withicons/classes/dist/with-loader.js | <i class="with with-home"></i> |
| static SVG, sprite, CMS | npm i @withicons/static (newer styles: static-plus) | <svg><use href="sprite-line.svg#with-home"/></svg> |
| a whole style as files | https://withicons.com/downloads/with-icons-<style>.zip | every SVG + an offline searchable viewer |
| files (slides, print, email, social) | npx withicons export <name> --format … | section 7 |
| Node, name lookup | npm i @withicons/core | resolve('bin').name is 'trash' |
| animation (also 3D) | npm i @withicons/motion | section 6 |
| live icons (date, count …) | npm i @withicons/dynamic | section 8 |
| loaders, spinners, loading states | <img src> of a CDN SVG, or npm i @withicons/loaders | section 9 |
Every framework package, <with-icon> and the class loader carry all 34 styles (they fetch companions themselves).
Only raw files are split: the newest styles' SVGs and node data are in @withicons/core-plus, soft3d and holiday,
prebuilt SVGs and sprites in static-plus, classes in classes-plus / soft3d / holiday (so soft3d's SVGs and nodes are in
@withicons/soft3d, its sprite sprite-soft3d.svg in @withicons/static-plus): see
frameworks.md for any file's URL.
Every framework has the same props: size (24), color (currentColor; prefer CSS color on a parent), strokeWidth
(line, duo, blueprint, sketch, kawaii only), absoluteStrokeWidth, title, className/class; the rest is spread onto
the <svg>. The web component takes attributes (variant, not style; label, not title). Snippets per framework,
the props table, CDN sizes and version pinning: reference/frameworks.md.
2. Pick the style
Six groups, named for what people make. Use ONE style per page or UI region (the only routine mix: line for inactive,
solid for active). Each style is a subpath with the same export names: @withicons/react/solid, /clay, /christmas …
| group | styles | for |
| Essentials | line, solid, duo, suite | app and web UI, docs, dashboards, slides; only line, solid and duo go in 16-24px controls |
| Product & brand | bento, dock, brutal, bauhaus | SaaS landing pages, feature grids, app tiles, bold startup and poster looks |
| 3D & glass | clay, glass, liquid, chrome, soft3d, luxe, skeuo | AI products, heroes, launches, premium brands, soft 3D hero art and avatars |
| Playful | kawaii, plush, sticker, gloss, pastel, pixel, retro | kids, games, social posts, cosy and wellness apps |
| Artistic | sketch, engrave, blueprint, anime, gothic, coquette | print, editorial, education, fandom, themed designs |
| Holidays | utsav, rangoli, halloween, christmas, lunar, valentine | festive campaigns, seasonal themes, greetings, sale banners |
What are you making? (best first; full list in styles.md, MCP
recommend_styles): app or website: line, duo, solid · slides: solid, duo, suite · SaaS landing page: bento, soft3d, duo ·
AI product: clay, liquid, chrome · premium: glass, luxe · playful: kawaii, plush, sticker · print: engrave, sketch,
blueprint · a festival: its holiday style.
- Festivals: Diwali, Durga Puja, Holi ->
rangoli(clean, brand-friendly) orutsav(ornate); Halloween ->halloween; Christmas ->christmas; Lunar New Year ->lunar; Valentine's, weddings ->valentine. Pair them with the 95 festival icons (categoriesindian-festivals,christmas,lunar-new-year,valentines,halloween:diya,red-lantern,jack-o-lantern…) and everyday ones (shopping-bag,tag). Switch festivals by palette (holi,diwali,nordic…: every colour in styles.md; CLI--colors "…", since--palettetakes per-icon ids only). - Avatars (category
avatars, 40avatar-*): people, animals, friendly monsters. In every person c1 is the skin and c2 the hair (or turban, cap), so one tone picker fits all (skin tones); offer several, never one default skin tone. Role-named styles keep the roles stable: plush, clay, pastel; duo or line for small UI. - Duo has an accent colour (
--with-duo-accent: the icon's badge, plus or slash, else an inner part like a bell's clapper) and two presets: "Duo with an accent" (--with-duo: #6B70F7; --with-duo-accent: #6B70F7, strokeWidth 1.5) works in every package; "Duo gradient" (lines swept indigo to pink) is made only in the studio (withicons.com/icons/<name>.html?style=duo#studio), whose downloads bake it into the file (no package or CLI API yet: use the downloaded file as an image). styles.md. - Sizes: line and solid from 12px, duo 18px; everything else is illustration at 32px+ (luxe, skeuo, gothic, plush 48px).
- Colour: multi-colour styles paint CSS variables
--with-<style>-<role>with defaults (role-named styles also give the outline its own--with-<style>-ink; elsewhere the ink iscurrentColor). For a brand colour set the icon's main role:npx withicons palettes <icon> --style <style>names it, andget/exporttake role flags (--c1,--tint…). For one exact hex across a set, use solid or line withcolor. - Rich styles draw gradients in one
<defs>(idswg-<style>-<icon>-<n>, made unique per instance by every package).
Looks, minimum sizes, every variable, holiday palettes and Duo presets: reference/styles.md.
3. Names (never guess one)
- Canonical names are kebab-case (
arrow-right); components are PascalCase, exported asArrowRightandArrowRightIcon. - Aliases (
bin,house,gear) resolve in name-based APIs (<with-icon name>,<Icon name>,resolve(), search, MCP) but are not exports:import { Bin }fails, useTrash. - Look every name up before writing it (section 5) or read reference/icons.md (all 1000 names,
categories, aliases). Common: delete/bin ->
trash, gear ->settings, x/dismiss ->close, hamburger ->menu, house ->home, magnifier ->search, profile picture ->user-circleor anavatar-*icon.
4. Accessibility (every time)
- Icon next to visible text: nothing to add; it is
aria-hiddenby default. - Icon-only button or link: name the control, not the icon:
<button type="button" aria-label="Delete row"><Trash /></button>. - Meaningful standalone icon (status, rating):
title="Error"(components) orlabel="Error"(web component). <i class="with …">has no semantics: addaria-hidden="true"and visible or.sr-onlytext.- Exported SVG files contain a
<title>: next to text usearia-hidden="true"inline oralt=""on<img>. - Never rely on the icon alone; 3:1 contrast for meaningful icons; targets of at least 24x24 px (44 on touch) via padding.
More in reference/frameworks.md.
5. Find the right icon
- MCP (best for agents): remote
https://withicons.com/mcp(about 1,000 requests per IP per 5 minutes, then HTTP 429), local and unlimitednpx -y @withicons/mcp(prefer it for batch work). Tools:search_icons,get_icon,resolve_icon,recommend_styles(best styles for a job, a festival or an audience, with packages, presets and palettes),preview_icons(one labelled picture of icons x styles: look before you choose),animate_icon,export_icon,list_palettes,list_styles(grouped),list_categories; confirm withtools/list. Not connected?npx withicons initadds the skill and the server to the project's AI tools (--dry-runfirst). - CLI
npx withicons search "throw away"· HTTPhttps://withicons.com/api/search?q=throw+away&limit=5(on a timeout retry once, or readhttps://withicons.com/icons.json) · offline reference/icons.md orimport { search, resolve } from '@withicons/core'. - One concept per query; if nothing fits, try a synonym, then the object you would draw, then browse the category.
- Trust
confidencehigh and medium;low(reason "(related, low confidence)") is only related. Some words return nothing (shirt,pram) or only low matches (yoga-> dumbbell): pick the closest honest icon, label it in text, and never pass it off as exact. There are no brand or social logos: use a neutral stand-in (camera,play,message-circle,code) with the brand name as text oraria-label.
MCP client setup, every tool's arguments, the HTTP API, content gaps and search tips: reference/search.md.
6. Animate (optional, @withicons/motion)
Pure CSS (plus a tiny JS API) that wraps the element holding the icon, so it works with every style and package.
Get paste-ready code from MCP animate_icon or npx withicons animate <name> --trigger hover --format react.
import '@withicons/motion/motion.css' // presets
import '@withicons/motion/icons.css' // every icon's tuned motion (or one CDN file per icon: dist/icons/<name>.css)
<span className="wm wm-loop" data-wm="loader"><Loader /></span>
<button className="wm-trigger" aria-label="Alerts"><span className="wm wm-hover" data-wm="bell"><Bell /></span></button>
<span className={'wm-swap wm-fx-morph' + (playing ? ' is-on' : '')}><Play className="wm-a" /><Pause className="wm-b" /></span><with-icon>uses themotionattribute plus@withicons/motion/dist/element.js, never a.wmwrapper (its svg is in a shadow root). Wrappers are for inline SVG, components, live icons and<i>classes.- Motion explains state or invites action; one or two loops per screen; no hover on touch (prefer
wm-inview/wm-once). Reduced motion turns everything off. The accessible name stays on the button. - 3D: in clay, glass, liquid, chrome, soft3d, luxe, skeuo, dock and plush the icon's motion plays in 3D (turns, lifts,
lands).
<with-icon variant="clay" motion="loop">does it itself; wrappers addwm-3d. soft3d has 3-5 moves per icon (npx withicons motions <icon> --style soft3d, MCPanimate_iconmoves). Exports of a 3D style move in 3D too. - Scroll-triggered in React and other frameworks:
motion(el, name, { trigger: 'inview', style })from@withicons/motionin an effect,m.destroy()on unmount (.wm-inviewin markup alone does nothing; motion.md).
Triggers, presets, swaps, TypeScript casts, checking that it runs: reference/motion.md.
7. Files for slides, print, email, docs and social
When the result is a deck, document, print file, email or post, give FILES, not code (Node 18+, no browser):
npx withicons export truck package home --format svg-flat,png,pdf --out icons
npx withicons export bell --format gif --background "#ffffff" --out slides # animated, loops forever
npx withicons export rocket --style luxe --format pptx-animated --background "#0f172a" --color "#ffffff"MCP export_icon takes the same options in snake_case (out_dir on the local server). The remote server makes PNG and
the other still formats itself (inline, base64) and answers gif, apng, pptx-animated and pptx-sheet with the
npx withicons export … command to run.
- Slides and docs:
pngat 512 px, transparent, embedded as a picture (PNG, not SVG); design tools:svg-flat; print:pdf,epsorsvg-flat(never PNG); email: PNG at 2x, hosted on your https URLs (never SVG); a moving icon:gif(plays in PowerPoint, Keynote, Google Slides, Gmail, Slack). - Colours are baked in; a
currentColorink becomes black (role-named styles keep their own ink colour): on dark backgrounds pass--color "#ffffff"and the slide colour as--background(GIF), and pick anon-darkpalette for multi-colour styles. Quote colours (#starts a comment). - One look for many icons: role flags on one call (
--c1,--tint…), since palette ids are per icon. Export one and look before the whole set. - A whole style for designers or no-code:
https://withicons.com/downloads/with-icons-<style>.zip(every SVG + an offline searchable viewer),with-icons-all.zipfor every style. A festive campaign: export in its holiday style (--style rangoli). pptx-animatedis one sample slide: for a deck insert GIFs.--padding,--size,--fps,--nameand the rest:npx withicons export --help.
Formats per job, file names, GIF sizes, email HTML, print stroke weight: reference/files.md.
8. Live icons (content you set, @withicons/dynamic)
Up to 50 icons that draw a value inside: a calendar's date, a clock's time, a badge count, a battery level, a short label (max 4 characters; counts show "99+"). They render in every style.
<script src="https://cdn.jsdelivr.net/npm/@withicons/dynamic@latest/dist/cdn/lite.js"></script>
<with-live-icon name="calendar-date" today label="Today"></with-live-icon>
<with-live-icon name="bell-count" count="3" animate label="3 unread"></with-live-icon>React / Vue: import { LiveIcon } from '@withicons/dynamic/react' (or /vue), <LiveIcon name="bell-count" count={n} animate />.
Pure function: render(name, params, style) from @withicons/dynamic (never reads the clock: pass now()). Change a
value by setting the attribute or prop; in React never change the key to replay. Vite needs worker: { format: 'es' }.
Every live icon with its params, sizes and recipes: reference/live.md.
9. Loaders (loading states, @withicons/loaders)
Animated loaders in every style: everyday spinners and dots, creative ones (ai-sparkle, rocket, coffee, atom …), festival ones (diya, fireworks, ghost, lantern …) and morph sequences of library icons (file → cloud → check). Each is one self-contained SVG animated with CSS: no JavaScript, 60 fps, slows for reduced motion, labelled "Loading". Cheapest form:
<img src="https://cdn.jsdelivr.net/npm/@withicons/loaders@latest/dist/svg/line/spinner.svg" width="32" height="32" alt="Loading">Colour, speed, custom sequences, a finished state: the tag (or Loader / Morph from @withicons/loaders/react or /vue).
<script src="https://cdn.jsdelivr.net/npm/@withicons/loaders@latest/dist/cdn/loaders.js"></script>
<with-loader name="orbit" variant="glass" color="#7c5cff" speed="1.2"></with-loader>
<with-loader morph="file,cloud-upload,check-circle" effect="slide-up"></with-loader> <!-- then el.done() -->Morph items are icon names (even rocket, download, gift, which are loaders too); write loader:<name> to put a
loader in the chain (since 0.6.0).
Pick by what is loading (MCP get_loader(query) answers with the URL and code). Every name and what it says:
reference/loaders.md.
10. Pitfalls
- The generic
<Icon name=…>renders line at once and loads other styles on first use (React/Solid: wrap in<Suspense>; sync SSR:await preloadStyles(...)first): only for truly dynamic names; otherwise named imports. <img src="….svg">cannot followcurrentColorand renders black; inline, use a component, sprite or classes.- Sprites must be served from your own origin (cross-origin
<use href>is blocked). - Icon classes are CSS masks: multi-colour variables only work in components,
<with-icon>, sprites orwith-icons.js. - From a CDN load only what the page shows (
cdn.js,with-loader.js,lite.js); neverwith-all.cssor@withicons/web/fullon a real page.@latestfollows releases; pin one version for a fixed look. React, Vue or Solid from an ESM CDN: name the icons (https://esm.sh/@withicons/react?exports=Home,Search), never a bare style URL. - Svelte 4 does not forward
on:clickto the icon (wrap it in a button); Angularname=needsprovideWithIcons(...). - Right-to-left: mirror only directional icons (
with-rtl,mirror-rtl, or a:dir(rtl)CSS rule on components). - Don't mix with icons and another set in one UI region; replace the old icons one-for-one using search.
Details for each: reference/frameworks.md.
11. From a chat assistant (no tools, no install)
Briefs from withicons.com's "Ask AI" buttons start by sending you here and carry a MY TASK: line (find, code, set,
fit, slides). Do that task, search before naming anything, link https://withicons.com/icons/<name>.html for every
pick, and give code to developers and the page's Copy image / SVG / PNG buttons to everyone else.
What each task should return: reference/chat.md.
In this repository2 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .cursor/rules/with-icons.mdcCursor rule
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

