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.

236 lines (203 loc) 5.8 kB
/* * Widget-Komponente * * Flexible Boxen für Dashboards und Seitenlayouts. */ /** * Widget-Komponente * * Wiederverwendbare UI-Widgets für modulare Benutzeroberflächen. * Widgets sind eigenständige Komponenten, die bestimmte Funktionen oder Inhalte kapseln. * * @layer components.widget * * Grundlegende Verwendung: * <div class="widget"> * <div class="header">Widget-Titel</div> * <div class="body">Widget-Inhalt</div> * <div class="footer">Widget-Fußzeile</div> * </div> * * Varianten: * <div class="widget primary">Primär-Widget</div> * <div class="widget secondary">Sekundär-Widget</div> * <div class="widget light">Helles Widget</div> * <div class="widget dark">Dunkles Widget</div> * * Größen: * <div class="widget sm">Klein</div> * <div class="widget md">Mittel (Standard)</div> * <div class="widget lg">Groß</div> * <div class="widget full">Volle Breite</div> * * Zustände: * <div class="widget loading">Ladend</div> * <div class="widget collapsed">Eingeklappt</div> * <div class="widget expanded">Ausgeklappt</div> * * Widget mit Aktionsbuttons: * <div class="widget"> * <div class="header"> * <h3 class="title">Statistik</h3> * <div class="actions"> * <button class="action">Aktualisieren</button> * <button class="action">Einklappen</button> * </div> * </div> * <div class="body">...</div> * </div> */ /* Animation - außerhalb von @layer definieren */ /* Komponenten-Styles */ @layer components { .widget { background-color: var(--color-white, #fff); border: 1px solid var(--color-neutral-200, #e5e7eb); border-radius: var(--radius-md, 0.375rem); box-shadow: var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)); overflow: hidden; /* Strukturelemente */ .header { align-items: center; background-color: var(--color-neutral-50); border-bottom: 1px solid var(--color-neutral-200, #e5e7eb); display: flex; justify-content: space-between; padding: var(--space-3) var(--space-4); .title { font-size: var(--text-base); font-weight: var(--font-medium, 500); margin: 0; } .actions { display: flex; gap: var(--space-2); .action { background: none; border: none; border-radius: var(--radius-sm, 0.125rem); color: var(--color-neutral-600); cursor: pointer; font-size: var(--text-sm, 0.875rem); padding: var(--space-1) var(--space-2); &:hover { background-color: var(--color-neutral-200, #e5e7eb); color: var(--color-neutral-800, #1f2937); } } } } .body { padding: var(--space-4); } .footer { background-color: var(--color-neutral-50); border-top: 1px solid var(--color-neutral-200, #e5e7eb); color: var(--color-neutral-600); font-size: var(--text-sm, 0.875rem); padding: var(--space-3) var(--space-4); } /* Farbvarianten */ &.primary { border-color: var(--color-primary, #3b82f6); .header { background-color: var(--color-primary, #3b82f6); color: white; } } &.secondary { border-color: var(--color-secondary); .header { background-color: var(--color-secondary); color: white; } } &.light { background-color: var(--color-white, #fff); border-color: var(--color-neutral-100, #f3f4f6); .header { background-color: var(--color-white, #fff); border-bottom-color: var(--color-neutral-100, #f3f4f6); } } &.dark { background-color: var(--color-neutral-800, #1f2937); border-color: var(--color-neutral-700, #374151); color: white; .header { background-color: var(--color-neutral-900, #111827); border-bottom-color: var(--color-neutral-700, #374151); } .footer { background-color: var(--color-neutral-900, #111827); border-top-color: var(--color-neutral-700, #374151); color: var(--color-neutral-300, #d1d5db); } } /* Größenvarianten */ &.sm { .header { padding: var(--space-2) var(--space-3); .title { font-size: var(--text-sm, 0.875rem); } } .body { padding: var(--space-3); } .footer { font-size: var(--text-xs, 0.75rem); padding: var(--space-2) var(--space-3); } } &.lg { .header { padding: var(--space-4) var(--space-5); .title { font-size: var(--text-lg); } } .body { padding: var(--space-5); } .footer { padding: var(--space-4) var(--space-5); } } &.full { width: 100%; } /* Zustände */ &.loading { opacity: 0.7; position: relative; } &.collapsed { .body, .footer { display: none; } .header { border-bottom: none; } } &.highlight { background-color: color-mix(in oklab, var(--color-primary, #3b82f6), white 90); border-color: var(--color-primary, #3b82f6); } } } /* Animations-Styles */ @layer animations { .widget { &.loading::after { animation: var(--ui-loading-animation, loading var(--animation-duration-slowest, 1500ms) infinite); background: linear-gradient(90deg, var(--color-primary, #3b82f6), transparent); content: ""; height: 3px; left: 0%; position: absolute; top: 0%; width: 100%; } } }