Loading...
Loading...
Create beautiful, performant SVG animations and illustrations. Use this skill when the user asks to create SVG graphics, icons, illustrations, animated logos, path animations, morphing shapes, loading spinners, or any animated SVG content. Covers SMIL animations, CSS-driven SVG animation, path drawing effects, shape morphing, motion paths, gradients, masks, and filters.
npx skill4agent add supermemoryai/skills svg-animationsviewBox="minX minY width height"<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<!-- 200x200 unit canvas, scales to any size -->
</svg><rect x="10" y="10" width="80" height="40" rx="4" fill="#1a1a1a" />
<circle cx="50" cy="50" r="30" fill="#e63946" />
<ellipse cx="50" cy="50" rx="40" ry="20" fill="#457b9d" />
<line x1="10" y1="10" x2="90" y2="90" stroke="#2a9d8f" stroke-width="2" />
<polygon points="50,5 95,90 5,90" fill="#e9c46a" />
<polyline points="10,80 40,20 70,60 100,10" fill="none" stroke="#264653" stroke-width="2" /><path>d| Command | Purpose | Syntax |
|---|---|---|
| M/m | Move to | |
| L/l | Line to | |
| H/h | Horizontal line | |
| V/v | Vertical line | |
| C/c | Cubic bézier | |
| S/s | Smooth cubic bézier | |
| Q/q | Quadratic bézier | |
| T/t | Smooth quadratic | |
| A/a | Elliptical arc | |
| Z/z | Close path | |
C<path d="M 10 80 C 40 10, 65 10, 95 80" stroke="#000" fill="none" stroke-width="2" />S<path d="M 10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" stroke="#000" fill="none" />Arx ry x-rotation large-arc-flag sweep-flag x ylarge-arc-flagsweep-flag<!-- Heart shape using arcs and quadratic curves -->
<path d="M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 Z"
fill="#e63946" /><g transform="translate(50, 50) rotate(45)" opacity="0.8">
<rect x="-20" y="-20" width="40" height="40" fill="#264653" />
</g><g><defs>
<!-- Linear gradient -->
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#e63946" />
<stop offset="100%" stop-color="#457b9d" />
</linearGradient>
<!-- Radial gradient -->
<radialGradient id="glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#fff" stop-opacity="0.8" />
<stop offset="100%" stop-color="#fff" stop-opacity="0" />
</radialGradient>
<!-- Mask -->
<mask id="reveal">
<rect width="100%" height="100%" fill="black" />
<circle cx="100" cy="100" r="50" fill="white" />
</mask>
<!-- Blur filter -->
<filter id="blur">
<feGaussianBlur in="SourceGraphic" stdDeviation="3" />
</filter>
</defs>
<rect width="200" height="200" fill="url(#grad)" />
<rect width="200" height="200" fill="url(#grad)" mask="url(#reveal)" />
<circle cx="50" cy="50" r="20" filter="url(#blur)" fill="#e63946" />fillstrokeopacitytransformstroke-dasharraystroke-dashoffset.pulse {
animation: pulse 2s ease-in-out infinite;
transform-origin: center;
}
@keyframes pulse {
0%, 100% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.15); opacity: 0.7; }
}stroke-dasharraystroke-dashoffsetstroke-dasharraystroke-dashoffsetstroke-dashoffset<svg viewBox="0 0 200 200">
<path class="draw" d="M 20 100 C 20 50, 80 50, 80 100 S 140 150, 140 100"
fill="none" stroke="#1a1a1a" stroke-width="3" />
</svg>
<style>
.draw {
stroke-dasharray: 300;
stroke-dashoffset: 300;
animation: draw 2s ease forwards;
}
@keyframes draw {
to { stroke-dashoffset: 0; }
}
</style>const path = document.querySelector('.draw');
const length = path.getTotalLength();
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;.line-1 { animation-delay: 0s; }
.line-2 { animation-delay: 0.3s; }
.line-3 { animation-delay: 0.6s; }ddpath {
d: path("M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z");
transition: d 0.5s ease;
}
path:hover {
d: path("M 10,50 A 20,20 0,0,1 50,10 A 20,20 0,0,1 90,50 Q 90,80 50,100 Q 10,80 10,50 z");
}<img>background-image<animate><circle cx="50" cy="50" r="20" fill="#e63946">
<animate attributeName="r" from="20" to="40" dur="1s"
repeatCount="indefinite" />
</circle><animate attributeName="cx"
values="50; 150; 100; 50"
keyTimes="0; 0.33; 0.66; 1"
dur="3s" repeatCount="indefinite" /><animateTransform><rect x="-20" y="-20" width="40" height="40" fill="#264653">
<animateTransform attributeName="transform" type="rotate"
from="0" to="360" dur="4s" repeatCount="indefinite" />
</rect>translatescalerotateskewXskewY<animateMotion><circle r="5" fill="#e63946">
<animateMotion dur="3s" repeatCount="indefinite" rotate="auto">
<mpath href="#motionPath" />
</animateMotion>
</circle>
<path id="motionPath" d="M 20,50 C 20,0 80,0 80,50 S 140,100 140,50"
fill="none" stroke="#ccc" />rotate="auto"rotate="auto-reverse"<set><rect width="40" height="40" fill="#264653">
<set attributeName="fill" to="#e63946" begin="1s" />
</rect><!-- Chain animations by referencing IDs -->
<animate id="first" attributeName="cx" to="150" dur="1s" fill="freeze" />
<animate attributeName="cy" to="150" dur="1s" begin="first.end" fill="freeze" />
<animate attributeName="r" to="30" dur="0.5s" begin="first.end + 0.5s" fill="freeze" />begin="click"begin="2s"begin="other.end"begin="other.end + 1s"begin="other.repeat(2)"calcModekeySplines<animate attributeName="cx" values="50;150" dur="1s"
calcMode="spline" keySplines="0.42 0 0.58 1" />calcModelineardiscretepacedsplinekeySplines0.42 0 0.58 10 0 0.58 10.34 1.56 0.64 1<path fill="#e63946">
<animate attributeName="d" dur="2s" repeatCount="indefinite"
values="M 50,10 L 90,90 L 10,90 Z;
M 50,90 L 90,10 L 10,10 Z;
M 50,10 L 90,90 L 10,90 Z" />
</path><svg viewBox="0 0 50 50">
<circle cx="25" cy="25" r="20" fill="none" stroke="#1a1a1a"
stroke-width="3" stroke-linecap="round"
stroke-dasharray="90 150" stroke-dashoffset="0">
<animateTransform attributeName="transform" type="rotate"
from="0 25 25" to="360 25 25" dur="1s"
repeatCount="indefinite" />
<animate attributeName="stroke-dashoffset" values="0;-280"
dur="1.5s" repeatCount="indefinite" />
</circle>
</svg><svg viewBox="0 0 52 52">
<circle cx="26" cy="26" r="24" fill="none" stroke="#4caf50"
stroke-width="2" class="draw"
style="stroke-dasharray:150;stroke-dashoffset:150;
animation:draw .6s ease forwards" />
<path fill="none" stroke="#4caf50" stroke-width="3"
stroke-linecap="round" stroke-linejoin="round"
d="M14 27l7 7 16-16" class="draw"
style="stroke-dasharray:50;stroke-dashoffset:50;
animation:draw .4s ease .5s forwards" />
</svg><svg viewBox="0 0 24 24" id="menu">
<path id="top" d="M 3,6 L 21,6" stroke="#1a1a1a" stroke-width="2" stroke-linecap="round">
<animate attributeName="d" to="M 5,5 L 19,19" dur="0.3s" begin="menu.click" fill="freeze" />
</path>
<path id="mid" d="M 3,12 L 21,12" stroke="#1a1a1a" stroke-width="2" stroke-linecap="round">
<animate attributeName="opacity" to="0" dur="0.1s" begin="menu.click" fill="freeze" />
</path>
<path id="bot" d="M 3,18 L 21,18" stroke="#1a1a1a" stroke-width="2" stroke-linecap="round">
<animate attributeName="d" to="M 5,19 L 19,5" dur="0.3s" begin="menu.click" fill="freeze" />
</path>
</svg><defs>
<linearGradient id="shift" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%">
<animate attributeName="stop-color"
values="#e63946;#457b9d;#2a9d8f;#e63946"
dur="4s" repeatCount="indefinite" />
</stop>
<stop offset="100%">
<animate attributeName="stop-color"
values="#457b9d;#2a9d8f;#e63946;#457b9d"
dur="4s" repeatCount="indefinite" />
</stop>
</linearGradient>
</defs>
<rect width="200" height="100" fill="url(#shift)" rx="8" /><circle cx="100" cy="100" r="30" fill="#e63946">
<animate attributeName="r" values="30;35;30" dur="2s"
calcMode="spline" keySplines="0.4 0 0.6 1;0.4 0 0.6 1"
repeatCount="indefinite" />
<animate attributeName="opacity" values="1;0.6;1" dur="2s"
calcMode="spline" keySplines="0.4 0 0.6 1;0.4 0 0.6 1"
repeatCount="indefinite" />
</circle><path fill="#457b9d" opacity="0.7">
<animate attributeName="d" dur="5s" repeatCount="indefinite"
values="M 0,40 C 30,35 70,45 100,40 L 100,100 L 0,100 Z;
M 0,40 C 30,50 70,30 100,40 L 100,100 L 0,100 Z;
M 0,40 C 30,35 70,45 100,40 L 100,100 L 0,100 Z"
calcMode="spline" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
</path>viewBoxwidthheight<defs><defs><img>stroke-linecap="round"fill="freeze"transform-origin: centergetTotalLength()<g>transformopacitydpointswill-change: transformrole="img"<title><desc>prefers-reduced-motion@media (prefers-reduced-motion: reduce) {
svg * {
animation: none !important;
transition: none !important;
}
}