Asset Creator Skill
<core-responsibility> ## Core Responsibility Create SVG assets using fetched icons and/or custom SVG elements. - **SVG code only** - No React, no JavaScript, slight animations - **Transparent background** - No background unless explicitly requested </core-responsibility> <references> **Understand Requirements** → Determine what icons/shapes/illustrations/graphics are needed <path-creation-ref> ### **Path Creation** → To create any lines, curves, paths, this is important that you use the learnings from this Read [path-creation.md](./references/path-creation.md) </path-creation-ref> <character-creation-ref> ### **Character Creation** → Whenver scene needs characters, use this Read [primitive-characters.md](./references/character/primitive-characters.md) </character-creation-ref> <arrow-creation-ref> ### **Arrow Creation** → Whenever scene needs to create arrows, use this Read [arrow-guidelines.md](./references/arrow-guidelines.md) </arrow-creation-ref> </references> <fetch-icons-ref> High-quality assets require visual references—use the steps below to fetch icons that guide each asset's shape. <tools-to-use> Use the `mcp__video_gen_tools__search_icons` tool to fetch the list of icon names. Use it multiple times with different keywords if needed to get enough candidates. Use the `mcp__video_gen_tools__get_icons` tool to fetch SVG content for icons returned by search_icons.For each asset, fetch multiple reference icons before selecting the best match. The agent specifies the exact number of icons to read per asset. </tools-to-use>
<handling-failed-searches> <fallback-strategies> 1. Try alternative keyword to fetch the icon list. </fallback-strategies> </handling-failed-searches>
</fetch-icons-ref> <asset-type-handling> ## Creation Guidelines by Asset Type
logo
- •Fetch reference icons
- •Use EXACTLY as-is. Zero modifications.
- •If no matching references found: Write the name of that brand/entity inside a visual box.
icon
- •Fetch reference icons
- •Use EXACTLY as-is. Zero modifications.
- •If no matching references found: Create from scratch, keep simple like icons
customized
- •Fetch reference icons
- •If a reference matches description → use as-is
- •Only if NO reference matches → tweak the closest one
- •If no direct references found → search for similar references, understand their shape, and create the asset
character
- •NO icon fetching
- •Use <character-creation-ref> to create from scratch
| Attribute | Purpose | Example |
|---|---|---|
viewBox | Internal coordinate system | "0 0 100 100" |
xmlns | XML namespace (required) | "http://www.w3.org/2000/svg" |
| Attribute | Purpose |
|---|---|
x, y | Position (top-left corner) |
width, height | Dimensions |
rx, ry | Corner radius |
fill | Fill color |
svg
<circle cx="50" cy="50" r="40" fill="#EF4444"/>
| Attribute | Purpose |
|---|---|
cx, cy | Center position |
r | Radius |
svg
<ellipse cx="50" cy="50" rx="40" ry="25" fill="#10B981"/>
| Attribute | Purpose |
|---|---|
cx, cy | Center position |
rx, ry | X and Y radii |
svg
<line x1="10" y1="10" x2="90" y2="90" stroke="#000" stroke-width="2"/>
svg
<polyline points="10,90 50,10 90,90" fill="none" stroke="#000" stroke-width="2"/>
svg
<polygon points="50,10 90,90 10,90" fill="#F59E0B"/>
| Command | Name | Parameters | Example |
|---|---|---|---|
M | Move to | x, y | M 10 10 |
L | Line to | x, y | L 90 90 |
H | Horizontal line | x | H 50 |
V | Vertical line | y | V 50 |
C | Cubic Bezier | x1,y1 x2,y2 x,y | C 20,20 80,20 90,90 |
Q | Quadratic Bezier | x1,y1 x,y | Q 50,0 90,90 |
A | Arc | rx ry rotation large-arc sweep x y | A 25 25 0 0 1 50 50 |
Z | Close path | - | Z |
Lowercase commands use relative coordinates (relative to current position). </path-commands> <path-example>
svg
<!-- Triangle --> <path d="M 50 10 L 90 90 L 10 90 Z" fill="#8B5CF6"/> <!-- Curved shape --> <path d="M 10 50 Q 50 10 90 50 T 170 50" stroke="#000" fill="none"/>
svg
<g transform="translate(50, 50)" fill="#3B82F6"> <circle r="20"/> <rect x="-10" y="25" width="20" height="10"/> </g>
| Transform | Syntax | Example |
|---|---|---|
| Translate | translate(x, y) | translate(50, 50) |
| Scale | scale(s) or scale(sx, sy) | scale(2) |
| Rotate | rotate(deg) or rotate(deg, cx, cy) | rotate(45) |
| Skew | skewX(deg) or skewY(deg) | skewX(10) |
svg
<rect fill="#3B82F6" /* Fill color */ fill-opacity="0.8" /* Fill transparency */ stroke="#1D4ED8" /* Stroke color */ stroke-width="2" /* Stroke width */ stroke-opacity="0.9" /* Stroke transparency */ stroke-linecap="round" /* Line end style: butt | round | square */ stroke-linejoin="round" /* Corner style: miter | round | bevel */ stroke-dasharray="5 3" /* Dash pattern */ />
svg
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<style>
.primary { fill: #3B82F6; }
.secondary { fill: #EF4444; }
.outline { fill: none; stroke: #000; stroke-width: 2; }
</style>
<circle class="primary" cx="50" cy="50" r="30"/>
</svg>
svg
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#3B82F6"/>
<stop offset="100%" stop-color="#8B5CF6"/>
</linearGradient>
</defs>
<rect fill="url(#grad1)" x="10" y="10" width="80" height="80"/>
| Transform | Syntax | Example |
|---|---|---|
| Translate | translate(x, y) | translate(50, 50) |
| Scale | scale(s) or scale(sx, sy) | scale(2) |
| Rotate | rotate(deg) or rotate(deg, cx, cy) | rotate(45) |
| Skew | skewX(deg) or skewY(deg) | skewX(10) |
Reference defined elements:
svg
<defs> <circle id="dot" r="5"/> </defs> <use href="#dot" x="20" y="20" fill="red"/> <use href="#dot" x="50" y="50" fill="blue"/> <use href="#dot" x="80" y="80" fill="green"/>
svg
<defs>
<linearGradient id="linear" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#3B82F6"/>
<stop offset="100%" stop-color="#EF4444"/>
</linearGradient>
</defs>
svg
<defs>
<clipPath id="circle-clip">
<circle cx="50" cy="50" r="40"/>
</clipPath>
</defs>
<rect clip-path="url(#circle-clip)" x="0" y="0" width="100" height="100" fill="#3B82F6"/>
svg
<defs>
<mask id="fade-mask">
<linearGradient id="fade" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="white"/>
<stop offset="100%" stop-color="black"/>
</linearGradient>
<rect fill="url(#fade)" width="100" height="100"/>
</mask>
</defs>
<rect mask="url(#fade-mask)" fill="#3B82F6" width="100" height="100"/>
- •Always use viewBox - Enables proper scaling
- •Use transparent background - No background rect unless needed
- •Group related elements - Use
<g>for organization and shared transforms - •Use meaningful IDs - For gradients, clips, and reusable elements
- •Optimize paths - Remove unnecessary precision (2 decimal places max)
- •Use classes for styling - Separate presentation from structure </best-practices>
svg
<svg viewBox="minX minY width height" xmlns="http://www.w3.org/2000/svg">
| Parameter | Meaning |
|---|---|
minX | Left edge X coordinate (usually 0) |
minY | Top edge Y coordinate (usually 0) |
width | Internal width in SVG units |
height | Internal height in SVG units |
code
(0,0) ─────────────────────────► X (width) │ │ (25%,25%) (75%,25%) │ ●────────────────● │ │ │ │ │ (50%,50%) │ │ │ ● │ │ │ center │ │ │ │ │ ●────────────────● │ (25%,75%) (75%,75%) │ ▼ Y (height)
| Position | Formula |
|---|---|
| Top-left | (0, 0) |
| Top-center | (width/2, 0) |
| Center | (width/2, height/2) |
| Bottom-center | (width/2, height) |
Keep icon centers within 10%-90% of viewBox to prevent clipping:
code
availableSpace = viewBoxSize * 0.8 maxScale = availableSpace / iconViewBoxSize
Process:
- •Identify the attachment point in the icon's original coordinate space (e.g., gun barrel tip)
- •Position the effect at that coordinate using
transform="translate(x, y)"
Example: Gun with muzzle flash
svg
<!-- Gun icon with viewBox 0 0 512 512, barrel tip at (486, 175) -->
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path d="M79.238 115.768..." fill="#333"/> <!-- Gun icon -->
<!-- Position muzzle flash at barrel tip coordinates -->
<g transform="translate(486, 175)">
<polygon points="0,0 15,-8 12,0 15,8" fill="#FF6600">
<animate attributeName="opacity" values="1;0;1" dur="0.1s" repeatCount="indefinite"/>
</polygon>
</g>
</svg>
Finding attachment points:
| Icon Type | Attachment Point | How to Find |
|---|---|---|
| Guns/Weapons | Barrel tip | Rightmost X, mid-height Y in icon's coordinate space |
| Swords/Blades | Blade tip | Topmost or rightmost point in icon's coordinate space |
| Characters | Hand position | Look for arm/hand path segments, note their coordinates |
| Vehicles | Exhaust/Wheels | Bottom or rear coordinates in icon's coordinate space |
Debugging tip: Add a visible circle at the attachment point to verify position:
svg
<circle cx="486" cy="175" r="5" fill="red"/> <!-- Shows barrel tip location -->
| Target | Transform |
|---|---|
| 45° (up-right) | rotate(45) ✓ |
| 135° (down-right) | rotate(135) ✓ |
| 270° (left) | rotate(270) or rotate(-90) ✓ |
❌ Wrong: rotate(-45) for 45° gives 315° (up-left), not 45°