Cluster Self-Healing
CSSA broken direct link between two nodes detects a fault condition and dynamically traces a curved detour bypass path to autonomously restore cluster connectivity.
- Tier
- CSS
- Dependencies
- None
- Duration
- 9.6 s, loops
- Categories
- Loaders and spinners
- Use cases
- Loading and waiting, Success and confirmation
- Industries
- IT services and infrastructure, Cross-industry
- Style
- Minimal line · light stroke
- Set
- cluster
- Tags
- looplinedotsui
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" aria-labelledby="cluster-heal-title" class="pulsar pulsar-cluster-heal" data-pulsar="cluster-heal" role="img" viewBox="0 0 160 96"><title id="cluster-heal-title">Two cluster nodes detecting a severed direct link and autonomously rerouting along a curved healing bypass path</title><g fill="none" stroke="currentColor" stroke-dasharray="2 3" stroke-width=".5" opacity=".2"><line x1="16" x2="144" y1="48" y2="48"></line><circle cx="80" cy="24" r="3"></circle><circle cx="80" cy="72" r="3"></circle></g><g id="cluster-heal-broken" fill="none" stroke="currentColor" stroke-width="1.2"><line x1="44" x2="72" y1="48" y2="48" stroke-linecap="round"></line><line x1="88" x2="116" y1="48" y2="48" stroke-linecap="round"></line><path d="m77 45 6 6m0-6-6 6"></path></g><path id="cluster-heal-bypass" fill="none" stroke="currentColor" stroke-dasharray="110" stroke-dashoffset="110" stroke-linecap="round" stroke-width="1.4" d="M44 48c18-28 54-28 72 0"></path><circle id="cluster-heal-pulseA" cx="44" cy="48" r="5" fill="none" stroke="currentColor" stroke-width="1" opacity="0"></circle><circle id="cluster-heal-pulseB" cx="116" cy="48" r="5" fill="none" stroke="currentColor" stroke-width="1" opacity="0"></circle><g id="cluster-heal-nodeA"><circle cx="44" cy="48" r="5" fill="none" stroke="currentColor"></circle><circle cx="44" cy="48" r="2.5" fill="currentColor"></circle></g><g id="cluster-heal-nodeB"><circle cx="116" cy="48" r="5" fill="none" stroke="currentColor"></circle><circle cx="116" cy="48" r="2.5" fill="currentColor"></circle></g></svg>
animation.css
.pulsar-cluster-heal {
--pulsar-accent: currentColor;
}
.pulsar-cluster-heal #cluster-heal-bypass,
.pulsar-cluster-heal #cluster-heal-pulseA,
.pulsar-cluster-heal #cluster-heal-pulseB {
stroke: var(--pulsar-accent, currentColor);
}
.pulsar-cluster-heal #cluster-heal-broken {
stroke: var(--pulsar-accent, currentColor);
}
.pulsar-cluster-heal #cluster-heal-nodeA circle:last-child,
.pulsar-cluster-heal #cluster-heal-nodeB circle:last-child {
fill: var(--pulsar-accent, currentColor);
}
.pulsar-cluster-heal #cluster-heal-broken {
animation: cluster-heal-fault 6000ms ease-in-out infinite;
}
@keyframes cluster-heal-fault {
0%,
5% {
opacity: 0.2;
}
15%,
25% {
opacity: 1;
}
35%,
85% {
opacity: 0;
}
95%,
100% {
opacity: 0.2;
}
}
.pulsar-cluster-heal #cluster-heal-bypass {
animation: cluster-heal-reroute 6000ms cubic-bezier(0.16, 1, 0.3, 1) infinite;
}
@keyframes cluster-heal-reroute {
0%,
30% {
stroke-dashoffset: 110;
opacity: 0;
}
35% {
opacity: 1;
}
60%,
85% {
stroke-dashoffset: 0;
opacity: 1;
}
92%,
100% {
stroke-dashoffset: 110;
opacity: 0;
}
}
.pulsar-cluster-heal #cluster-heal-pulseA {
transform-origin: 44px 48px;
animation: cluster-heal-p 6000ms 3600ms ease-out infinite;
}
.pulsar-cluster-heal #cluster-heal-pulseB {
transform-origin: 116px 48px;
animation: cluster-heal-p 6000ms 3600ms ease-out infinite;
}
@keyframes cluster-heal-p {
0% {
opacity: 0;
transform: scale(0.6);
}
10% {
opacity: 0.8;
}
30% {
opacity: 0;
transform: scale(2.4);
}
100% {
opacity: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.pulsar-cluster-heal * {
animation: none !important;
}
.pulsar-cluster-heal #cluster-heal-bypass {
stroke-dashoffset: 0;
opacity: 1;
}
.pulsar-cluster-heal #cluster-heal-broken {
opacity: 0;
}
}