icons
Installation
SKILL.md
IntelliJ Platform New UI Icons
Guidance for authoring SVG icons for the New UI.
Background: the IDE maintains Classic UI and New UI in parallel. Code branches with ExperimentalUI.isNewUI(); icons follow the same split. Old icons stay in their original resource folders for Classic-UI compatibility. New-UI icons live under expui/ folders and are substituted for the old ones at runtime by icon mappers.
Golden rules
- Always ship two SVGs — one for the light theme (e.g.
addFile.svg) and one for the dark theme with the_darksuffix (addFile_dark.svg). Geometry must be identical between them; only the palette swaps.- Tool-window icons ship as a quartet, not a pair. When a tool window has both a 16×16 base (
name.svg/name_dark.svg) and a 20×20 New-UI stripe variant (name@20x20.svg/name@20x20_dark.svg), they must share the same metaphor. The stripe is only one surface — the 16×16 base also appears in Search Everywhere, Find Action, context menus, the Services tool window, recent locations, and the View ▸ Tool Windows menu. Changing only the @20x20 leaves users seeing two different icons for the same tool window depending on where they encounter it. Always update all four files together (and the same applies to plugin-local icons liketoolWindowChat.svg+toolWindowChat@20x20.svg).
- Tool-window icons ship as a quartet, not a pair. When a tool window has both a 16×16 base (
- Only use colors from the canonical palette. See palette.md. Picking a one-off color breaks theming and contrast.
- One canvas size per icon role. See Icon roles. Do not invent new sizes or pad with empty space — IntelliJ scales the canvas as a single unit.
- No raster, no gradients, no filters, no embedded fonts. Path geometry only (
<path>,<rect>,<circle>,<line>,<polyline>,<polygon>). Text must be converted to outlines. - Use
fill="none"on the root<svg>and setfill/strokeexplicitly per shape — never rely on CSS orcurrentColor. - Strokes use
stroke-width="1",stroke-linecap="round",stroke-linejoin="round"(orstroke-miterlimit="10"for hard joins). Heavier strokes are reserved for hero glyphs inside a circle badge (e.g. status checkmarks) and usestroke-width="1.5"or"2". - Pixel-grid align: keep stroke axes on half-pixel centers (
x.5) and fills on whole pixels so the icon stays crisp at 1× rendering. - Preserve the Apache 2.0 copyright comment as line 1. Match the year of contribution.
- File names use camelCase matching the action/node ID and stay ASCII-only.