svg-art-designer
npx skills add https://github.com/fernando-augustop/svg-art-designer --skill svg-art-designer
Agent 安装分布
Skill 文档
SVG Drawing Guide
A complete reference and methodology for hand-crafting SVG (Scalable Vector Graphics) code. Use this skill whenever you need to create or modify SVG files directly in code â icons, favicons, illustrations, badges, diagrams, or any vector graphic.
When to Use This Skill
- User asks to create/draw/design an SVG icon, favicon, logo, badge, illustration
- User asks to modify or fix an existing SVG file
- User needs an SVG element for a web component (spinner, decorative shape, etc.)
- User wants to understand SVG syntax or debug SVG code
1. SVG Fundamentals
The <svg> Root Element
Every SVG starts with the <svg> element. Always include xmlns for standalone files:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
<!-- content -->
</svg>
Key attributes:
xmlns="http://www.w3.org/2000/svg"â required for standalone.svgfiles, optional when inlined in HTMLviewBox="minX minY width height"â defines the internal coordinate system (ALWAYS use this)width/heightâ sets the rendered size in the DOM (can also be controlled via CSS)
The viewBox â Most Important Concept
The viewBox creates an internal coordinate system independent of the SVG’s rendered size. This is what makes SVGs truly scalable.
<!-- This SVG will scale to any size while keeping proportions -->
<svg viewBox="0 0 200 200">
<circle cx="100" cy="100" r="80" />
</svg>
How viewBox works:
viewBox="0 0 200 200"means: “My internal canvas goes from (0,0) to (200,200)”- All child elements use this coordinate system
- The SVG scales to fit its container while preserving the viewBox aspect ratio
- Changing the first two values pans the view; changing the last two zooms in/out
Common viewBox patterns:
viewBox="0 0 24 24" <!-- Standard icon size (Material, Lucide, etc.) -->
viewBox="0 0 32 32" <!-- Favicon-sized -->
viewBox="0 0 100 100" <!-- Easy percentage-like coordinates -->
viewBox="0 0 200 60" <!-- Horizontal logo lockup -->
Rule: Always define a viewBox. Without it, the SVG uses raw pixel coordinates and won’t scale.
Coordinate System
- Origin
(0, 0)is the top-left corner - X increases to the right, Y increases downward (opposite of math convention)
- All units are unitless within viewBox â they map proportionally to rendered size
2. Basic Shape Elements
<line>
Draws a straight line between two points.
<line x1="10" y1="10" x2="90" y2="90" stroke="#34D399" stroke-width="3" />
| Attribute | Description |
|---|---|
x1, y1 |
Start point |
x2, y2 |
End point |
stroke |
Line color (required â lines are invisible without it) |
stroke-width |
Line thickness |
<rect>
Draws a rectangle.
<rect x="10" y="10" width="80" height="60" rx="8" ry="8" fill="#4F46E5" />
| Attribute | Description |
|---|---|
x, y |
Top-left corner position |
width, height |
Dimensions |
rx, ry |
Corner radius (like border-radius). If only rx is set, ry defaults to the same value |
fill |
Fill color |
<circle>
Draws a circle.
<circle cx="50" cy="50" r="40" fill="#06B6D4" />
| Attribute | Description |
|---|---|
cx, cy |
Center point |
r |
Radius (shape disappears if r="0") |
<ellipse>
Like <circle> but with independent horizontal and vertical radii.
<ellipse cx="50" cy="50" rx="40" ry="25" fill="#8B5CF6" />
| Attribute | Description |
|---|---|
cx, cy |
Center point |
rx |
Horizontal radius |
ry |
Vertical radius |
<polygon>
A closed shape defined by a set of points. The browser automatically connects the last point back to the first.
<polygon points="50,5 95,27.5 95,72.5 50,95 5,72.5 5,27.5" fill="#10B981" />
Tip: Use commas and newlines for readability â they’re valid SVG:
<polygon points="
50,5
95,27.5
95,72.5
50,95
5,72.5
5,27.5
" />
<polyline>
Like <polygon> but does NOT auto-close. Good for open shapes (charts, graphs).
<polyline points="10,90 30,40 50,70 70,20 90,60" fill="none" stroke="#F59E0B" stroke-width="2" />
<text>
Renders text inside SVG. Positioning is from the baseline.
<text x="50" y="50" font-family="Georgia, serif" font-size="24" fill="white" text-anchor="middle">
Hello
</text>
| Attribute | Description |
|---|---|
x, y |
Position (baseline origin) |
text-anchor |
Horizontal alignment: start, middle, end |
dominant-baseline |
Vertical alignment: auto, middle, hanging |
font-family |
Font (use web-safe fonts in standalone SVGs) |
font-size |
Size in viewBox units |
font-weight |
Weight: normal, bold, 100–900 |
font-style |
normal or italic |
Centering text perfectly:
<text x="50" y="50" text-anchor="middle" dominant-baseline="central" font-size="16">
Centered
</text>
3. The <path> Element â The Most Powerful Shape
The <path> element can draw anything. It uses a mini-language of commands in its d attribute.
Path Commands Reference
All commands have uppercase (absolute coordinates) and lowercase (relative coordinates) variants.
| Command | Name | Parameters | Description |
|---|---|---|---|
M / m |
MoveTo | x y |
Move pen to point (no drawing) |
L / l |
LineTo | x y |
Draw line to point |
H / h |
Horizontal LineTo | x |
Draw horizontal line |
V / v |
Vertical LineTo | y |
Draw vertical line |
C / c |
Cubic Bezier | x1 y1 x2 y2 x y |
Curve with 2 control points |
S / s |
Smooth Cubic | x2 y2 x y |
Smooth continuation of cubic curve |
Q / q |
Quadratic Bezier | x1 y1 x y |
Curve with 1 control point |
T / t |
Smooth Quadratic | x y |
Smooth continuation of quadratic curve |
A / a |
Elliptical Arc | rx ry rotation large-arc sweep x y |
Arc segment |
Z / z |
ClosePath | (none) | Close path back to last M |
Path Examples
Triangle:
<path d="M 50 10 L 90 90 L 10 90 Z" fill="#34D399" />
Rounded square (using curves):
<path d="M 20 8 H 80 Q 92 8 92 20 V 80 Q 92 92 80 92 H 20 Q 8 92 8 80 V 20 Q 8 8 20 8 Z" fill="#1E1B4B" />
Sigma symbol (Σ):
<path d="M 28 26 L 62 26 L 46 50 L 62 74 L 28 74"
fill="none" stroke="#34D399" stroke-width="6"
stroke-linecap="round" stroke-linejoin="round" />
Heart shape:
<path d="M 50 30 Q 50 10 30 10 Q 10 10 10 30 Q 10 50 50 80 Q 90 50 90 30 Q 90 10 70 10 Q 50 10 50 30 Z"
fill="#EF4444" />
Understanding Bezier Curves
Cubic Bezier (C) â Two control points for complex curves:
C x1 y1, x2 y2, endX endY
^ ^ ^
| | âââ end point
| âââ control point 2 (influences end)
âââ control point 1 (influences start)
Quadratic Bezier (Q) â One control point for simpler curves:
Q controlX controlY, endX endY
Smooth variants (S, T) mirror the previous control point automatically, creating smooth continuations.
Elliptical Arc (A)
The most complex command. Parameters:
A rx ry x-rotation large-arc-flag sweep-flag x y
rx,ryâ radii of the ellipsex-rotationâ rotation of the ellipse in degreeslarge-arc-flagâ0for minor arc,1for major arcsweep-flagâ0for counter-clockwise,1for clockwisex,yâ end point
Semicircle:
<path d="M 10 50 A 40 40 0 0 1 90 50" fill="none" stroke="#06B6D4" stroke-width="3" />
4. Presentational Attributes (Fill & Stroke)
Fill
| Attribute | Description |
|---|---|
fill |
Fill color. Any CSS color value, url(#gradientId), or none |
fill-opacity |
Opacity of the fill (0 to 1) |
fill-rule |
nonzero (default) or evenodd â determines inside/outside for complex paths |
Stroke
| Attribute | Description |
|---|---|
stroke |
Stroke color |
stroke-width |
Width of the stroke |
stroke-opacity |
Opacity of the stroke (0 to 1) |
stroke-linecap |
End shape: butt (default), round, square |
stroke-linejoin |
Corner shape: miter (default), round, bevel |
stroke-dasharray |
Dash pattern (e.g., "10 5" = 10px dash, 5px gap) |
stroke-dashoffset |
Offset for the dash pattern start |
Important: Stroke is drawn on the center of the path, not inside or outside. A stroke-width="10" extends 5px inward and 5px outward from the path.
Opacity
| Attribute | Description |
|---|---|
opacity |
Overall element opacity (affects both fill and stroke) |
fill-opacity |
Just fill opacity |
stroke-opacity |
Just stroke opacity |
All presentational attributes can also be set in CSS:
<style>
.accent { fill: #34D399; stroke: #06B6D4; stroke-width: 2; }
</style>
<circle class="accent" cx="50" cy="50" r="30" />
5. The <defs> Element and Reusable Definitions
The <defs> element contains definitions that are not rendered directly but can be referenced by other elements. Always put gradients, filters, clip paths, and patterns inside <defs>.
<svg viewBox="0 0 100 100">
<defs>
<!-- Definitions go here â not rendered directly -->
<linearGradient id="myGrad">...</linearGradient>
<filter id="myFilter">...</filter>
<clipPath id="myClip">...</clipPath>
</defs>
<!-- Elements that use the definitions -->
<rect fill="url(#myGrad)" filter="url(#myFilter)" clip-path="url(#myClip)" ... />
</svg>
6. Gradients
Linear Gradient
Goes in a straight line from one color to another.
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#34D399" />
<stop offset="50%" stop-color="#06B6D4" />
<stop offset="100%" stop-color="#8B5CF6" />
</linearGradient>
</defs>
<rect fill="url(#grad1)" x="0" y="0" width="100" height="100" />
Direction control via x1/y1/x2/y2:
x1="0%" x2="100%" y1="0%" y2="0%"â horizontal (left to right) [default]x1="0%" x2="0%" y1="0%" y2="100%"â vertical (top to bottom)x1="0%" x2="100%" y1="0%" y2="100%"â diagonal (top-left to bottom-right)
Stop attributes:
offsetâ position along the gradient (0% to 100%)stop-colorâ color at this stopstop-opacityâ opacity at this stop (0 to 1)
Radial Gradient
Radiates outward from a center point.
<defs>
<radialGradient id="grad2" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#FFFFFF" stop-opacity="0.8" />
<stop offset="100%" stop-color="#34D399" stop-opacity="0" />
</radialGradient>
</defs>
<circle fill="url(#grad2)" cx="50" cy="50" r="40" />
Attributes:
cx,cyâ center of the gradientrâ radiusfx,fyâ focal point (where the gradient appears to originate from, defaults to cx/cy)
7. Filters
SVG filters apply visual effects (blur, shadow, glow, etc.). Defined in <defs>, referenced via filter="url(#id)".
Gaussian Blur
<defs>
<filter id="blur1">
<feGaussianBlur in="SourceGraphic" stdDeviation="3" />
</filter>
</defs>
<circle filter="url(#blur1)" cx="50" cy="50" r="30" fill="#34D399" />
Drop Shadow
<defs>
<filter id="shadow1" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="2" dy="4" stdDeviation="3" flood-color="#000000" flood-opacity="0.3" />
</filter>
</defs>
Glow Effect
<defs>
<filter id="glow1" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="4" result="blur" />
<feMerge>
<feMergeNode in="blur" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
Common Filter Primitives
| Element | Effect |
|---|---|
<feGaussianBlur> |
Blur |
<feDropShadow> |
Drop shadow (shorthand) |
<feOffset> |
Offset position |
<feFlood> |
Fill with a color |
<feComposite> |
Combine two images |
<feMerge> |
Layer multiple results |
<feColorMatrix> |
Color manipulation |
<feMorphology> |
Erode or dilate |
Tip: Expand the x, y, width, height attributes on <filter> to prevent clipping of effects that extend beyond the element bounds (blur, glow, shadow).
8. Transforms
Apply geometric transformations to elements or groups.
<rect transform="translate(10, 20) rotate(45, 50, 50) scale(1.5)" ... />
Transform Functions
| Function | Syntax | Description |
|---|---|---|
translate |
translate(tx, ty) |
Move element |
rotate |
rotate(angle, cx, cy) |
Rotate around point (cx,cy). Without cx/cy rotates around origin (0,0) |
scale |
scale(sx, sy) |
Scale. Single value scales uniformly |
skewX |
skewX(angle) |
Skew along X axis |
skewY |
skewY(angle) |
Skew along Y axis |
matrix |
matrix(a,b,c,d,e,f) |
Full 2D transformation matrix |
Important: rotate(45) rotates around the SVG origin (0,0), not the element center. To rotate around the element’s center, use rotate(45, cx, cy) where cx/cy is the center of the element.
9. Grouping and Organization
<g> â Group Element
Groups elements together. Transforms and styles applied to <g> affect all children.
<g transform="translate(50, 50)" opacity="0.8">
<circle cx="0" cy="0" r="20" fill="#34D399" />
<circle cx="30" cy="0" r="15" fill="#06B6D4" />
</g>
<use> â Reuse Elements
Reference a defined element multiple times:
<defs>
<circle id="dot" r="5" fill="#34D399" />
</defs>
<use href="#dot" x="20" y="20" />
<use href="#dot" x="50" y="50" />
<use href="#dot" x="80" y="80" />
<clipPath> â Clip to a Shape
<defs>
<clipPath id="circleClip">
<circle cx="50" cy="50" r="40" />
</clipPath>
</defs>
<rect clip-path="url(#circleClip)" x="0" y="0" width="100" height="100" fill="#4F46E5" />
<mask> â Soft Masking with Opacity
<defs>
<mask id="fadeMask">
<rect x="0" y="0" width="100" height="100" fill="white" />
<circle cx="50" cy="50" r="30" fill="black" />
</mask>
</defs>
<rect mask="url(#fadeMask)" x="0" y="0" width="100" height="100" fill="#34D399" />
White areas in the mask are visible, black areas are hidden, gray values create partial transparency.
10. Accessibility
Always add accessibility attributes to meaningful SVGs:
<svg role="img" aria-labelledby="title desc" viewBox="0 0 100 100">
<title id="title">Icon Name</title>
<desc id="desc">A brief description of what this SVG depicts</desc>
<!-- content -->
</svg>
For decorative SVGs (not conveying information):
<svg aria-hidden="true" viewBox="0 0 100 100">
<!-- decorative content -->
</svg>
11. CSS Styling in SVG
SVG attributes can be set via CSS. Use <style> inside the SVG or external stylesheets:
<svg viewBox="0 0 100 100">
<style>
.node { fill: #34D399; transition: r 300ms ease; }
.node:hover { r: 15; fill: #06B6D4; }
.link { stroke: #34D399; stroke-width: 2; opacity: 0.6; }
</style>
<line class="link" x1="20" y1="20" x2="80" y2="80" />
<circle class="node" cx="20" cy="20" r="10" />
<circle class="node" cx="80" cy="80" r="10" />
</svg>
CSS-animatable SVG properties: fill, stroke, stroke-width, stroke-dasharray, stroke-dashoffset, opacity, r, cx, cy, x, y, width, height.
CSS Animations for SVG
Dash animation (self-drawing effect):
<style>
@keyframes draw {
from { stroke-dashoffset: 763; }
to { stroke-dashoffset: 0; }
}
.draw-path {
stroke-dasharray: 763;
stroke-dashoffset: 763;
animation: draw 2s ease forwards;
}
</style>
Spinner:
<style>
@keyframes spin { to { transform: rotate(360deg); } }
.spinner { animation: spin 1s linear infinite; transform-origin: center; }
</style>
12. Favicon & Icon Best Practices
Favicon Requirements
Standard .ico contains multiple sizes: 16×16, 32×32, 48×48, 256×256.
Modern browsers also accept SVG favicons:
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
Design Rules for Small Sizes
- Simplicity is king â At 16×16, fine details vanish. Use bold, simple shapes.
- Max 2-3 visual elements â One primary shape + one accent.
- Strong silhouette â The icon should be recognizable as a solid silhouette.
- High contrast â Ensure strong contrast between foreground and background.
- Thick strokes â Minimum
stroke-widthof 2-3 in a 32×32 viewBox. - No text â Letters are illegible at 16px (a single symbol like Σ is OK).
- Test at actual size â View your SVG at 16×16 and 32×32 pixels before finalizing.
Icon Template
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#1E1B4B" />
<stop offset="100%" stop-color="#312E81" />
</linearGradient>
</defs>
<!-- Background with rounded corners -->
<rect width="32" height="32" rx="7" fill="url(#bg)" />
<!-- Main symbol here -->
</svg>
13. Optimization Checklist
Before delivering an SVG:
- Has
viewBoxâ Always present for scalability - No unnecessary attributes â Remove defaults (
fill-rule="nonzero",stroke="none"when no stroke) - Grouped logically â Use
<g>with meaningful structure - Gradients/filters in
<defs>â Never define them inline - Unique IDs â All
idattributes must be unique within the document (critical when multiple SVGs are on the same page) - Minimal decimal precision â Round to 1-2 decimal places (
50.5, not50.123456) - Readable formatting â Use commas and newlines for complex
pointsanddattributes - Accessible â
role="img"+<title>for meaningful SVGs,aria-hidden="true"for decorative ones - No invisible elements â Remove shapes with
opacity="0"or outside the viewBox - Colors use consistent format â Pick one format (hex, oklch, hsl) and use it throughout
14. Common Patterns & Recipes
Rounded Square Background (for icons)
<rect width="100" height="100" rx="22" fill="#1E1B4B" />
Glowing Node (AI/tech aesthetic)
<circle cx="50" cy="50" r="8" fill="#34D399" opacity="0.2" />
<circle cx="50" cy="50" r="4" fill="#34D399" />
Neural Network Connection
<line x1="20" y1="20" x2="80" y2="80" stroke="#06B6D4" stroke-width="2" opacity="0.6" />
<circle cx="20" cy="20" r="5" fill="#34D399" />
<circle cx="80" cy="80" r="5" fill="#06B6D4" />
Circuit Trace
<line x1="60" y1="30" x2="85" y2="30" stroke="#06B6D4" stroke-width="2" opacity="0.7" />
<circle cx="85" cy="30" r="4" fill="#06B6D4" opacity="0.8" />
Gradient Text (via clip-path)
<defs>
<linearGradient id="textGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#65F2BE" />
<stop offset="50%" stop-color="#35C9FF" />
<stop offset="100%" stop-color="#9EFF8F" />
</linearGradient>
</defs>
<text fill="url(#textGrad)" font-size="24" font-weight="bold" x="50" y="55" text-anchor="middle">
TexAI
</text>
Star / Sparkle (4-pointed)
<path d="M 50 35 L 53 47 L 65 50 L 53 53 L 50 65 L 47 53 L 35 50 L 47 47 Z" fill="#FFFFFF" />
Hexagon
<polygon points="50,5 95,27.5 95,72.5 50,95 5,72.5 5,27.5" fill="#4F46E5" />
15. Workflow for Creating SVGs
Step 1: Define the Canvas
Choose a viewBox appropriate for the use case:
- Icons:
0 0 24 24or0 0 32 32 - Logos:
0 0 200 60(horizontal) or0 0 100 100(square) - Illustrations:
0 0 400 300or whatever fits the content
Step 2: Sketch the Composition
Plan which elements go where. Think in terms of:
- Background shape (rounded rect, circle)
- Primary element (the main symbol)
- Secondary elements (accents, decorations)
Step 3: Build Layer by Layer
SVG renders in document order â later elements render on top of earlier ones:
<svg viewBox="0 0 100 100">
<!-- Layer 1: Background (renders first, at the back) -->
<rect width="100" height="100" rx="20" fill="#1E1B4B" />
<!-- Layer 2: Main symbol (renders on top of background) -->
<path d="..." fill="#34D399" />
<!-- Layer 3: Accents (renders on top of everything) -->
<circle cx="75" cy="25" r="5" fill="#06B6D4" />
</svg>
Step 4: Add Polish
- Gradients for depth
- Opacity variations for hierarchy
- Subtle glow filters for premium feel
- Consistent stroke-width across all strokes
Step 5: Test and Optimize
- View at target sizes (16px, 32px, 64px for favicons)
- Check on both light and dark backgrounds
- Validate that all IDs are unique
- Remove unnecessary attributes
Sources
Knowledge synthesized from:
- Josh W Comeau â A Friendly Introduction to SVG
- W3Schools â SVG Tutorial (paths, gradients, strokes, filters, transforms)
- MDN Web Docs â SVG Reference