Use when a Multica web/desktop UI change needs an icon that `@multica/ui/icons` does not export yet, or when redrawing or reviewing a Multica glyph. Covers the grid, corner and stroke construction, the body/detail markers, and the generate-and-preview loop. Never reach for an icon library, inline SVG, or emoji instead.
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Every icon in the product is a Multica drawing exported from @multica/ui/icons. No icon library is installed, and lint rejects imports from one. When you need a new symbol, draw it.
packages/ui/icons/index.ts for the name and for synonyms. If an existing glyph already means the same thing, add an alias to ALIASES in drawings.mjs instead of drawing a near-duplicate.Webhook, not IntegrationsNav). Follow the existing PascalCase names.packages/ui/icons/drawings/construction.mjs holds the shared geometry helpers.packages/ui/icons/drawings/drawings.mjs holds every drawing as inner SVG markup, plus ALIASES.packages/ui/icons/glyphs.ts and index.ts are generated. Never edit them by hand; icons.test.ts fails when they drift.Grid. 24×24 viewBox, with a 2px round-capped, round-joined stroke from the renderer. Keep geometry inside 2.5–21.5. Most silhouettes span 2.75–21.25. An object glyph whose longest side is under about 17 renders visibly smaller than its neighbours; only chevrons, X and similar marks stay small. Keep parallel strokes at least 3 apart so a gap survives at 14px. A stroke that crosses a shape, such as a pencil's cap line, ends exactly on the outline's centreline; the round cap pokes out if it runs past. When you scale or move a body, recompute these endpoints.
Corners. Use shape([[x, y, k], ...]) and rect(x, y, w, h, k), which build continuous-curvature (squircle) corners. Typical k values:
Do not hand-write a r r arc corners for rectangles.
Anything that points. Chevrons, arrowheads, < > brackets, prompts and direction triangles (play, skip) turn at a sharp vertex: a straight polyline such as M9 6L15 12 9 18, or head(x, y, dir, depth, half) for an arrowhead with its tip at (x, y). Never round the tip with a curve or a k corner; the round stroke join is the only softening. The bend in a corner or U-turn arrow's shaft may stay rounded.
Checks. Use tick(a, v, b): two straight strokes meeting at a tight vertex. Never bow a stroke through a curve where it should turn a corner; a check or any other angular mark drawn that way reads as handwriting.
Dots. dot(x, y, r) with r 1.1–1.5. Use dots only where they carry meaning: info, alert, eyes, status lights.
Polygons and stars. polygon(cx, cy, radii, count, k).
Reuse parts. file(), folderBody, bubble, ring, user(), link, cw and ccw already exist. A variant (…Off, …Plus, …X) is the base drawing plus one stroke. A slash runs m3 3 18 18.
class="b" (body). The active sidebar item fills it at 20% opacity.
class="k" (detail).DRAWINGS in drawings.mjs. Keep sections grouped by subject.pnpm --filter @multica/ui icons --preview NewName Neighbour1 Neighbour2. Open the printed HTML file in a browser and check four things:
pnpm --filter @multica/ui icons to regenerate glyphs.ts and index.ts.@multica/ui/icons. Then run pnpm --filter @multica/ui test and the typecheck for the package that uses it.multica-ai/multica
e437b11
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.