@casoon/dragonfly
Version:
Modular, lightweight CSS framework and design system for modern web projects. Optimized for Astro JS, LightningCSS and Container Queries with @layer-based architecture and comprehensive accessibility.
144 lines (121 loc) • 3.31 kB
CSS
/**
* Spinner
*
* Ladeanzeigen und Animationen für asynchrone Prozesse.
* Spinner zeigen Benutzern an, dass eine Operation im Hintergrund ausgeführt wird.
*
* @layer: elements
*
* Accessibility:
* - Verwende aria-busy für Container mit Ladezustand
* - Füge textuelle Beschreibungen für Screenreader hinzu
* - Vermeide blinkende Animationen, die Anfälle auslösen können
*/
/* Animationen */
@layer elements {
/* Basis-Spinner */
.spinner {
animation: spin var(--spinner-duration, 0.6s) var(--ease-linear, linear) infinite;
border: var(--spinner-border-width, 2px) solid var(--color-neutral-200, #e5e7eb);
border-radius: 50px;
border-top-color: var(--color-primary-500, #3b82f6);
display: inline-block;
height: var(--spinner-size, 1.5rem);
width: var(--spinner-size, 1.5rem);
}
/* Spinner Größen */
.spinner--xs {
border-width: 1px;
height: 1rem;
width: 1rem;
}
.spinner--sm {
border-width: 2px;
height: 1%.25rem;
width: 1%.25rem;
}
.spinner--md {
border-width: 2px;
height: var(--spinner-size, 1.5rem);
width: var(--spinner-size, 1.5rem);
}
.spinner--lg {
border-width: 3px;
height: 2rem;
width: 2rem;
}
.spinner--xl {
border-width: 4px;
height: 3rem;
width: 3rem;
}
/* Spinner Varianten */
.spinner--primary {
border-top-color: var(--color-primary-500, #3b82f6);
}
.spinner--secondary {
border-top-color: var(--color-secondary-500, #6b7280);
}
.spinner--success {
border-top-color: var(--color-success-500, #10b981);
}
.spinner--warning {
border-top-color: var(--color-warning-500, #f59e0b);
}
.spinner--danger {
border-top-color: var(--color-error-500, #ef4444);
}
.spinner--info {
border-top-color: var(--color-info-500, #3b82f6);
}
/* Container mit Spinner und Text */
.spinner-container {
align-items: center;
display: inline-flex;
gap: var(--spinner-gap, 0.5rem);
}
.spinner-text {
color: var(--color-text-muted, var(--color-neutral-600, #4b5563));
font-size: var(--text-sm, var(--font-size-sm, 0.875rem));
}
/* Fullscreen-Overlay */
.spinner-overlay {
align-items: center;
background-color: var(--spinner-overlay-bg, rgb(255 255 255 / 8000%));
display: flex;
inset: 0;
justify-content: center;
position: fixed;
z-index: var(--z-index-overlay, 50);
}
/* Dark Mode Overlay */
.spinner-overlay--dark {
background-color: var(--spinner-overlay-dark-bg, rgb(0 0 0 / 6000%));
.spinner-text {
color: var(--color-text-inverse, white);
}
}
/* Loading States für Buttons */
.button--loading {
pointer-events: none;
position: relative;
.spinner {
height: 1rem;
width: 1rem;
}
/* Text ausblenden während Loading */
&::after {
background-color: inherit;
content: '';
inset: 0;
position: absolute;
}
}
/* Pulse Animation als Alternative */
.spinner--pulse {
animation: var(--ui-pulse-animation, pulse var(--animation-duration-slowest, 1500ms) var(--easing-smooth, ease-in-out) infinite);
background-color: var(--color-primary-500, #3b82f6);
border: none;
border-radius: 50px;
}
}