Level
CSSA bubble indicator inside a horizontal glass tube outline floats left and right, slowing and centering itself between two guide lines.
- Tier
- CSS
- Dependencies
- None
- Duration
- 4 s, loops
- Categories
- Icons and micro-interactions
- Use cases
- Determinate progress, Dashboards and reporting
- Industries
- Manufacturing and industrial, Cross-industry
- Style
- Technical · light stroke
- Set
- calibrate
- Tags
- lineminimalgeometricpulsestroke
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" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="pulsar pulsar-calibrate-level" data-pulsar="calibrate-level" viewBox="0 0 160 96"><rect width="96" height="24" x="32" y="36" stroke-width="1.5" opacity=".35" rx="12"></rect><line x1="74" x2="74" y1="36" y2="60" stroke="var(--pulsar-accent, currentColor)" stroke-width="1.5"></line><line x1="86" x2="86" y1="36" y2="60" stroke="var(--pulsar-accent, currentColor)" stroke-width="1.5"></line><g class="calibrate-level-bubble"><ellipse cx="80" cy="48" fill="currentColor" fill-opacity=".1" stroke="var(--pulsar-accent, currentColor)" stroke-width="1.8" rx="8" ry="6"></ellipse></g><circle cx="80" cy="48" r="14" stroke="var(--pulsar-accent, currentColor)" stroke-width="1.2" class="calibrate-level-balanced-pulse"></circle></svg>
animation.css
.pulsar-calibrate-level {
display: block;
overflow: visible;
}
.pulsar-calibrate-level .calibrate-level-bubble {
animation: calibrate-level-oscillate 4000ms cubic-bezier(0.3, 1.2, 0.4, 1) infinite;
}
.pulsar-calibrate-level .calibrate-level-balanced-pulse {
transform-origin: 80px 48px;
animation: calibrate-level-balanced-wave 4000ms ease-out infinite;
}
@keyframes calibrate-level-oscillate {
0% {
transform: translateX(-24px);
}
22% {
transform: translateX(16px);
}
40% {
transform: translateX(-6px);
}
55%,
82% {
transform: translateX(0px);
}
92%,
100% {
transform: translateX(-24px);
}
}
@keyframes calibrate-level-balanced-wave {
0%,
54% {
transform: scale(0.6);
opacity: 0;
}
60% {
opacity: 0.8;
}
78%,
100% {
transform: scale(1.6);
opacity: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.pulsar-calibrate-level .calibrate-level-bubble,
.pulsar-calibrate-level .calibrate-level-balanced-pulse {
animation: none;
transform: none;
opacity: 1;
}
.pulsar-calibrate-level .calibrate-level-balanced-pulse {
opacity: 0;
}
}