Create minimalistic, production-grade illustrations for documentation, changelogs, and marketing. Trigger whenever the user asks for an illustration, diagram, comparison, annotated visual, or any graphic to accompany docs, changelogs, or marketing copy.
Refined, minimalistic HTML/CSS/SVG illustrations for documentation. One insight per illustration, compressed into a visual a reader grasps in under three seconds.
${CLAUDE_PLUGIN_ROOT}/resources/base.css — design tokens, shared components, dark-mode palette. Read this before writing any markup. Link it from the CDN; never copy it locally:
<link rel="stylesheet" href="https://uflo-agents.netlify.app/plugins/illustrator/resources/base.css">
${CLAUDE_PLUGIN_ROOT}/resources/glass-lens.*, glass-toolbox.*, liquidGL.js — composable magnifying-glass effect. See Common Patterns below.${CLAUDE_PLUGIN_ROOT}/scripts/screenshot.js — captures light + dark PNG/WebP of an HTML file.${CLAUDE_PLUGIN_DATA}/node_modules — Playwright and sharp, installed by the plugin's SessionStart hook.If this is a fresh illustration (not iterating on an existing one), invoke the frontend-design:frontend-design skill via the Skill tool before building. It provides general frontend craft guidance that complements the rules below. Skip this step when the user is asking for tweaks to an already-built illustration.
Write the illustration as a single sentence — what insight it compresses. If you can't, you don't have a concept yet. Push back on vague briefs before any markup. If the brief contains multiple insights, split into separate illustrations and ask which to build first.
Read ${CLAUDE_PLUGIN_ROOT}/resources/base.css in full. Identify reusable tokens and components before writing anything new.
Create images/illustrations/<kebab-name>/index.html (unless the user specifies otherwise). Scope one-off styles to an inline <style> block. Follow all design rules in this document.
Icons. Use the HugeIcons MCP tools when an icon is needed:
mcp__plugin_illustrator_hugeicons__search_icons to find candidates by keyword.mcp__plugin_illustrator_hugeicons__preview_icon on the top 3–5 to compare visually.mcp__plugin_illustrator_hugeicons__get_icon_svg to retrieve the chosen icon as a <symbol> + <use> pair.Hand-draw instead when: the shape is trivial (checkmark, arrow, X), the visual is unique to this concept, HugeIcons returns nothing relevant, or the library style clashes with the composition.
CLAUDE_PLUGIN_DATA="${CLAUDE_PLUGIN_DATA}" node "${CLAUDE_PLUGIN_ROOT}/scripts/screenshot.js" <path-to-folder> --scale 6 --padding 0 --theme both --transparent --format webp
This writes light.webp and dark.webp next to index.html.
Read both screenshots and check every point below. Fix, re-screenshot, and review again until nothing can be improved:
Show the final screenshots and report:
base.css promotion candidates with justification.After hand-off, the user views the HTML directly in a browser. Make requested changes and wait — do not re-screenshot unless asked.
base.css fits, use it. Don't reinvent a badge or pick a hex that's already a token.<style> block. Local CSS custom properties are fine — they still participate in dark mode.base.css promotion candidate.Keep the bar high — base.css should stay lean. If you can't name a concrete second illustration that would use a pattern, it doesn't belong in base.css yet.
--success, --danger, etc.) marks emphasis; neutrals carry everything else. If you color three things, three things had better deserve emphasis. More color is fine when the concept demands it (palette demos, charts, legends, multi-stage flows) — let the concept decide.Reach for text-size tokens first. When a composition needs something different (a caption inside a card, a tiny label, a huge hero number), scope it to the illustration. Promote if the same extra size recurs.
--shadow-card and --shadow-float cover most needs. Write specific shadows deliberately — each one adds weight.If the illustration zooms into a detail that's 14% clipped, show it as 14% clipped — not "about a seventh." Calculate, don't eyeball.
<symbol> + <use>. Repeated SVG content goes in a hidden <defs> block, referenced via <use href="#id">. Never duplicate.fill="#22c55e" breaks dark mode. Use a CSS class (.foo { fill: var(--ink); }) or currentColor with color: set on a parent.width: 1em; height: 1em in CSS, drop width/height attributes. Illustration-scale SVGs can size however the composition needs.style="fill: var(--x)" works on SVG nodes. Classes are cleaner when the same rule applies to many elements.stroke-rounded (default, line icons) and solid-rounded (filled). Icons inherit currentColor.Not required — available in the toolkit:
backdrop-filter: blur() plus a tinted translucent overlay for an "obscured / unreadable" effect — often more elegant than hatched or dashed alternatives.color-mix(in srgb, var(--token) 22%, transparent) for tinted translucency that adapts to dark mode. Prefer over hand-picked rgba() literals.overflow: hidden, giving physical clipping with padding around it..container > .panel + .divider + .panel with .badge.success / .badge.danger at top and .label.success / .label.danger below. All components are in base.css.<head>, JS at end of <body>:
<!-- head -->
<link rel="stylesheet" href="https://uflo-agents.netlify.app/plugins/illustrator/resources/glass-lens.css">
<link rel="stylesheet" href="https://uflo-agents.netlify.app/plugins/illustrator/resources/glass-toolbox.css">
<!-- end of body -->
<div class="glass-lens" style="top: 100px; left: 47px;"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js" defer></script>
<script src="https://uflo-agents.netlify.app/plugins/illustrator/resources/liquidGL.js" defer></script>
<script src="https://uflo-agents.netlify.app/plugins/illustrator/resources/glass-toolbox.js" defer></script>
<script src="https://uflo-agents.netlify.app/plugins/illustrator/resources/glass-lens.js" defer></script>
Position each .glass-lens with top/left inline styles. Add margin-top to .label when lenses extend below the page.rgba() literals) — silently breaks dark mode<symbol> + <use><div>s and border tricks instead of a single SVG path.my-illustration-correct) instead of generic modifiers (.success / .danger)base.css firstThe best illustration is the one the reader doesn't have to think about.39:["$","$L41",null,{"content":"$42","frontMatter":{"name":"illustration","description":"Create minimalistic, production-grade illustrations for documentation, changelogs, and marketing. Trigger whenever the user asks for an illustration, diagram, comparison, annotated visual, or any graphic to accompany docs, changelogs, or marketing copy."}}]