Pulsar

Overwrite

CSS

A square container block with a diagonal 'X' is overwritten as a clean vertical sweep line erases the 'X' and leaves a checkmark.

Tier
CSS
Dependencies
None
Duration
4.5 s, loops
Categories
Icons and micro-interactions
Use cases
Success and confirmation, Security and trust
Industries
SaaS and software, Security and identity
Style
Minimal line · light stroke
Set
patch
Tags
wipeglowgeometricminimalui

Companion assets

The same artwork, not animated. Derived from the entry’s own resting state, so it matches exactly.

Animated
CSS tier
Static vector
Overwrite, not animated
Download SVG

Code

animation.svg

<svg xmlns="http://www.w3.org/2000/svg" fill="none" aria-hidden="true" class="pulsar pulsar-patch-overwrite" data-pulsar="patch-overwrite" viewBox="0 0 160 96"><rect width="72" height="52" x="44" y="22" stroke="currentColor" stroke-width="1.5" opacity=".4" rx="6"></rect><g stroke="currentColor" stroke-linecap="round" stroke-width="2.5" class="patch-overwrite-bad" opacity=".7"><line x1="68" x2="92" y1="36" y2="60"></line><line x1="92" x2="68" y1="36" y2="60"></line></g><line x1="44" x2="44" y1="22" y2="74" stroke="var(--pulsar-accent, currentColor)" stroke-linecap="round" stroke-width="2" class="patch-overwrite-blade"></line><path stroke="var(--pulsar-accent, currentColor)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="m66 48 10 10 18-20" class="patch-overwrite-check"></path></svg>

animation.css

.pulsar-patch-overwrite {
  display: block;
  overflow: visible;
}
.pulsar-patch-overwrite .patch-overwrite-bad {
  animation: patch-overwrite-bad-anim 4500ms ease infinite;
}
.pulsar-patch-overwrite .patch-overwrite-blade {
  animation: patch-overwrite-blade-anim 4500ms cubic-bezier(0.4, 0, 0.2, 1) infinite;
}
.pulsar-patch-overwrite .patch-overwrite-check {
  stroke-dasharray: 45;
  stroke-dashoffset: 45;
  animation: patch-overwrite-check-anim 4500ms cubic-bezier(0.2, 1, 0.3, 1) infinite;
}

@keyframes patch-overwrite-bad-anim {
  0%,
  25% {
    opacity: 0.7;
    transform: scale(1);
    transform-origin: 80px 48px;
  }
  38% {
    opacity: 0;
    transform: scale(0.8);
    transform-origin: 80px 48px;
  }
  85% {
    opacity: 0;
    transform: scale(0.8);
    transform-origin: 80px 48px;
  }
  95%,
  100% {
    opacity: 0.7;
    transform: scale(1);
    transform-origin: 80px 48px;
  }
}

@keyframes patch-overwrite-blade-anim {
  0%,
  15% {
    transform: translateX(0);
    opacity: 0;
  }
  20% {
    opacity: 1;
  }
  50% {
    transform: translateX(72px);
    opacity: 1;
  }
  58% {
    transform: translateX(72px);
    opacity: 0;
  }
  100% {
    transform: translateX(0);
    opacity: 0;
  }
}

@keyframes patch-overwrite-check-anim {
  0%,
  42% {
    stroke-dashoffset: 45;
    opacity: 0;
  }
  48% {
    opacity: 1;
  }
  62%,
  80% {
    stroke-dashoffset: 0;
    opacity: 1;
  }
  90%,
  100% {
    stroke-dashoffset: 45;
    opacity: 0;
  }
}

@media (prefers-reduced-motion: reduce) {
  .pulsar-patch-overwrite * {
    animation: none !important;
  }
}

From this family15 in Patch

See the family