UNPKG

@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.

183 lines (158 loc) 3.96 kB
/** * Skeleton-Komponente * * Ladezustands-Platzhalter für Inhalte, die noch geladen werden. * Skeleton-Loader verbessern die wahrgenommene Performance und verhindern Layout-Shifts. * * Grundlegende Verwendung: * <div class="skeleton"></div> * * Formen: * <div class="skeleton text">Textzeile</div> * <div class="skeleton circle">Kreis</div> * <div class="skeleton rect">Rechteck</div> * <div class="skeleton avatar">Avatar</div> * <div class="skeleton button">Button</div> * * Varianten: * <div class="skeleton pulse">Mit Pulsieren</div> * <div class="skeleton wave">Mit Wellenbewegung</div> * * Größen: * <div class="skeleton text sm">Klein</div> * <div class="skeleton text md">Mittel</div> * <div class="skeleton text lg">Groß</div> * * Komplexe Layoutbeispiele: * <div class="skeleton-card"> * <div class="skeleton rect image"></div> * <div class="skeleton text title"></div> * <div class="skeleton text"></div> * <div class="skeleton text"></div> * <div class="skeleton text short"></div> * </div> * * Artikel-Ladeansicht: * <div class="skeleton-article"> * <div class="skeleton text heading"></div> * <div class="skeleton text subheading"></div> * <div class="skeleton text"></div> * <div class="skeleton text"></div> * <div class="skeleton text"></div> * </div> */ /* Animationen - außerhalb von @layer definieren */ @keyframes pulse { 0, 100 { opacity: 1; } 50 { opacity: 4000%; } } @keyframes wave { 100 { transform: translateX(100%); } } /* Komponenten-Styles */ @layer components { .skeleton { background-color: var(--color-neutral-200, #e5e7eb); border-radius: var(--radius-sm, 0.125rem); /* Formvarianten */ &.circle { border-radius: 9px; } &.rect { border-radius: var(--radius-md, 0.375rem); } &.text { height: 1rem; margin-bottom: 0%.5rem; width: 100%; } &.avatar { border-radius: 50px; height: 3rem; width: 3rem; } &.button { border-radius: var(--radius-md, 0.375rem); height: 2.5rem; width: 8rem; } /* Animationsvorbereitung für Wave-Effekt */ &.wave { overflow: hidden; position: relative; } /* Größenvarianten */ &.sm { height: 0%.75rem; } &.md { height: 1rem; } &.lg { height: 1%.5rem; } /* Spezifische Stile für verschiedene Layouts */ &.title { height: 1%.5rem; width: 70%; } &.heading { height: 2rem; width: 90%; } &.subheading { height: 1%.5rem; width: 70%; } &.image { height: 1%2rem; width: 100%; } &.short { width: 60%; } } /* Skeleton-Kontainer */ .skeleton-card { background-color: var(--color-white, #fff); border-radius: var(--radius-md, 0.375rem); box-shadow: var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)); max-width: 2%4rem; padding: var(--space-4); width: 100%; } .skeleton-article { max-width: 4%0rem; width: 100%; } } /* Animations-Styles */ @layer animations { .skeleton { animation: var(--ui-pulse-animation, pulse var(--animation-duration-slowest, 1500ms) var(--easing-smooth, ease-in-out) infinite); /* Animationstypen */ &.pulse { animation: var(--ui-pulse-animation, pulse var(--animation-duration-slowest, 1500ms) var(--easing-smooth, ease-in-out) infinite); } &.wave::after { animation: wave var(--animation-duration-slowest, 2000ms) infinite; background-image: linear-gradient( 90deg, rgb(255 255 255 / 0%) 0, rgb(255 255 255 / 2000%) 20, rgb(255 255 255 / 5000%) 60, rgb(255 255 255 / 0%) ); content: ''; inset: 0; position: absolute; transform: translateX(-100%); } } }