Route
CSSA flow of dots traveling along a main horizontal line redirects onto a parallel backup track when a barrier rises.
- Tier
- CSS
- Dependencies
- None
- Duration
- 5.5 s, loops
- Categories
- Icons and micro-interactions
- Use cases
- Sync and integration, Workflow and approvals
- Industries
- SaaS and software, IT services and infrastructure
- Style
- Technical · light stroke
- Set
- failover
- Tags
- arrowdotsgeometriclineloop
Companion assets
The same artwork, not animated. Derived from the entry’s own resting state, so it matches exactly.
Code
animation.svg
<svg xmlns="http://www.w3.org/2000/svg" fill="none" aria-hidden="true" class="pulsar pulsar-failover-route" data-pulsar="failover-route" viewBox="0 0 160 96"><g stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"><line x1="16" x2="60" y1="36" y2="36"></line><line id="failover-route-primary-track" x1="60" x2="144" y1="36" y2="36"></line><path id="failover-route-backup-track" stroke="var(--pulsar-accent, currentColor)" d="m60 36 22 28h62" opacity=".35"></path><circle cx="16" cy="36" r="3" fill="currentColor"></circle><circle cx="144" cy="36" r="3"></circle><circle cx="144" cy="64" r="3" stroke="var(--pulsar-accent, currentColor)"></circle></g><g id="failover-route-barrier" stroke="var(--pulsar-accent, currentColor)" stroke-linecap="round" stroke-width="2"><line x1="68" x2="68" y1="26" y2="46"></line><line x1="64" x2="72" y1="31" y2="41" stroke-width="1.2"></line><line x1="64" x2="72" y1="41" y2="31" stroke-width="1.2"></line></g><g id="failover-route-prim-dots" fill="currentColor"><circle cx="36" cy="36" r="2.5"></circle><circle cx="102" cy="36" r="2.5"></circle><circle cx="126" cy="36" r="2.5"></circle></g><g id="failover-route-sec-dots" fill="var(--pulsar-accent, currentColor)"><circle id="failover-route-sec-p1" cx="71" cy="50" r="2.5"></circle><circle id="failover-route-sec-p2" cx="106" cy="64" r="2.5"></circle><circle id="failover-route-sec-p3" cx="130" cy="64" r="2.5"></circle></g></svg>
animation.css
.pulsar-failover-route #failover-route-barrier {
animation: failover-route-gate 5500ms cubic-bezier(0.4, 0, 0.2, 1) infinite;
}
@keyframes failover-route-gate {
0%,
30% {
transform: translateY(-16px);
opacity: 0;
}
38%,
80% {
transform: translateY(0);
opacity: 1;
}
88%,
100% {
transform: translateY(-16px);
opacity: 0;
}
}
.pulsar-failover-route #failover-route-primary-track {
animation: failover-route-prim-track-anim 5500ms ease-in-out infinite;
}
@keyframes failover-route-prim-track-anim {
0%,
32% {
opacity: 1;
}
38%,
80% {
opacity: 0.2;
}
88%,
100% {
opacity: 1;
}
}
.pulsar-failover-route #failover-route-backup-track {
animation: failover-route-sec-track-anim 5500ms ease-in-out infinite;
}
@keyframes failover-route-sec-track-anim {
0%,
32% {
opacity: 0.25;
}
40%,
80% {
opacity: 1;
}
88%,
100% {
opacity: 0.25;
}
}
.pulsar-failover-route #failover-route-prim-dots {
animation: failover-route-prim-flow 5500ms linear infinite;
}
@keyframes failover-route-prim-flow {
0% {
transform: translateX(0);
opacity: 1;
}
30% {
transform: translateX(18px);
opacity: 1;
}
35%,
82% {
opacity: 0;
}
88%,
100% {
transform: translateX(0);
opacity: 1;
}
}
.pulsar-failover-route #failover-route-sec-dots {
animation: failover-route-sec-flow 5500ms ease-in-out infinite;
}
@keyframes failover-route-sec-flow {
0%,
35% {
opacity: 0;
transform: translateX(-10px);
}
42%,
78% {
opacity: 1;
transform: translateX(6px);
}
86%,
100% {
opacity: 0;
transform: translateX(16px);
}
}
@media (prefers-reduced-motion: reduce) {
.pulsar-failover-route * {
animation: none !important;
}
}