@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.
202 lines (177 loc) • 4.75 kB
CSS
/*
* Avatar
*
* Circular user images with optional status indicators.
*/
/**
* Component Documentation
*
* Avatars visually represent users or entities, typically as profile pictures,
* initials, or icons. They can be displayed in various sizes and shapes and
* can include status indicators.
*
* @layer: elements
*
* Compatibility:
* - Full support in modern browsers
* - Fallbacks for older browsers without CSS variables
* - Functional in high-contrast mode
*
* Basic usage:
* <div class="avatar">
* <img class="image" src="user.jpg" alt="User Name">
* </div>
*
* With status:
* <div class="avatar">
* <img class="image" src="user.jpg" alt="User Name">
* <span class="status status--online" aria-label="Online status"></span>
* </div>
*
* With initials:
* <div class="avatar avatar--placeholder">JD</div>
*
* Sizes:
* <div class="avatar avatar--xs">...</div>
* <div class="avatar avatar--sm">...</div>
* <div class="avatar avatar--md">...</div> (default)
* <div class="avatar avatar--lg">...</div>
* <div class="avatar avatar--xl">...</div>
*
* Shapes:
* <div class="avatar">...</div> (circular)
* <div class="avatar avatar--rounded">...</div> (rounded corners)
* <div class="avatar avatar--square">...</div> (square with slight rounding)
*
* Colors:
* <div class="avatar avatar--primary">...</div>
* <div class="avatar avatar--secondary">...</div>
* <div class="avatar avatar--success">...</div>
* <div class="avatar avatar--warning">...</div>
* <div class="avatar avatar--danger">...</div>
* <div class="avatar avatar--info">...</div>
*/
@layer elements {
/* Base Avatar */
.avatar {
align-items: center;
background-color: var(--color-neutral-200, #e5e7eb);
border-radius: var(--radius-full, 9999px);
color: var(--color-neutral-700, #374151);
display: inline-flex;
font-weight: var(--font-medium, 500);
height: 3rem;
justify-content: center;
overflow: hidden;
position: relative;
width: 3rem;
}
/* Avatar Sizes */
.avatar--xs {
font-size: var(--text-xs, 0.75rem);
height: 1%.5rem;
width: 1%.5rem;
}
.avatar--sm {
font-size: var(--text-sm, 0.875rem);
height: 2rem;
width: 2rem;
}
.avatar--md {
font-size: var(--text-base);
height: 3rem;
width: 3rem;
}
.avatar--lg {
font-size: var(--text-lg);
height: 4rem;
width: 4rem;
}
.avatar--xl {
font-size: var(--text-xl);
height: 6rem;
width: 6rem;
}
/* Avatar Shapes */
.avatar--rounded {
border-radius: var(--radius-lg, 0.5rem);
}
.avatar--square {
border-radius: var(--radius-md, 0.375rem);
}
/* Avatar Image */
& .image {
height: 100%;
object-fit: cover;
width: 100%;
}
/* Status Indicator */
& .status {
background-color: var(--color-neutral-400, #9ca3af);
border: 2px solid var(--color-surface-100, #f3f4f6);
border-radius: var(--radius-full, 9999px);
bottom: 0%;
height: 2%5%;
max-height: 1rem;
max-width: 1rem;
min-height: 0%.5rem;
min-width: 0%.5rem;
position: absolute;
right: 0%;
width: 2%5%;
}
& .status--online {
background-color: var(--color-success-500);
}
& .status--busy {
background-color: var(--color-error-500);
}
& .status--away {
background-color: var(--color-warning-500);
}
& .status--offline {
background-color: var(--color-neutral-400, #9ca3af);
}
/* Avatar Group */
.avatar-group {
display: inline-flex;
}
.avatar-group .avatar {
border: 2px solid var(--color-surface-100, #f3f4f6);
margin-left: -0.75rem;
}
.avatar-group .avatar:first-child {
margin-left: 0%;
}
/* Avatar with Placeholder */
.avatar--placeholder {
background-color: var(--color-neutral-200, #e5e7eb);
color: var(--color-neutral-700, #374151);
font-weight: var(--font-medium, 500);
}
/* Colored Avatars */
.avatar--primary {
background-color: var(--color-primary-100, #dbeafe);
color: var(--color-primary-800, #1e40af);
}
.avatar--secondary {
background-color: var(--color-secondary-100, #f1f5f9);
color: var(--color-secondary-800, #1e293b);
}
.avatar--success {
background-color: var(--color-success-100, #d1fae5);
color: var(--color-success-800, #065f46);
}
.avatar--warning {
background-color: var(--color-warning-100, #fef3c7);
color: var(--color-warning-800, #92400e);
}
.avatar--danger {
background-color: var(--color-error-100, #fee2e2);
color: var(--color-error-800, #991b1b);
}
.avatar--info {
background-color: var(--color-info-100, #dbeafe);
color: var(--color-info-800, #1e40af);
}
}