@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.
216 lines (183 loc) • 4.85 kB
CSS
/*
* Sidebar Module
*
* Layout rules for sidebar navigation or contextual content. Uses grid column logic and Container Queries.
*/
/**
* Sidebar Component
*
* Sidebar navigation and content for layouts with side columns.
* Sidebars serve as additional navigation areas or for displaying contextual information.
*
* @layer components.sidebar
*
* Basic Usage:
* <aside class="sidebar">
* <nav class="nav">
* <ul class="links">
* <li><a href="#" class="link">Dashboard</a></li>
* <li><a href="#" class="link">Settings</a></li>
* <li><a href="#" class="link">Profile</a></li>
* </ul>
* </nav>
* </aside>
*
* Variants:
* <aside class="sidebar left">...</aside>
* <aside class="sidebar right">...</aside>
* <aside class="sidebar collapsed">...</aside>
*/
@layer components {
.sidebar {
background-color: var(--color-neutral-100, #f3f4f6);
grid-column: span 3;
padding-block: var(--space-4);
padding-inline: var(--space-3);
/* Header-Bereich */
.header {
border-bottom: 1px solid var(--color-neutral-200, #e5e7eb);
margin-bottom: var(--space-4);
padding-bottom: var(--space-2);
.title {
color: var(--color-neutral-900, #111827);
font-size: var(--text-lg);
font-weight: var(--font-medium, 500);
margin: 0;
}
}
/* Navigation */
.nav {
display: flex;
flex-direction: column;
gap: var(--space-2);
.links {
display: flex;
flex-direction: column;
gap: var(--space-1);
list-style: none;
margin: 0;
padding: 0;
}
.link {
color: var(--color-neutral-700, #374151);
display: block;
padding: var(--space-2);
text-decoration: none;
transition: color 150ms ease;
&:hover {
color: var(--color-primary, #3b82f6);
}
&.active {
color: var(--color-primary, #3b82f6);
font-weight: var(--font-semibold, 600);
}
}
}
/* Menu list */
.menu {
display: flex;
flex-direction: column;
gap: var(--space-1);
list-style: none;
margin: 0;
padding: 0;
}
/* Menu items */
.item {
width: 100%;
&.active {
> .link {
background-color: color-mix(in srgb, var(--color-primary-500) 10, transparent);
color: var(--color-primary, #3b82f6);
font-weight: var(--font-medium, 500);
}
}
}
/* Menu links */
.link {
border-radius: var(--radius-md, 0.375rem);
color: var(--color-neutral-700, #374151);
display: block;
padding: var(--space-2) var(--space-3);
text-decoration: none;
transition: background-color 150ms ease, color 150ms ease;
&:hover {
background-color: var(--color-neutral-200, #e5e7eb);
color: var(--color-neutral-900, #111827);
}
}
/* Submenu */
.submenu {
display: flex;
flex-direction: column;
gap: var(--space-1);
list-style: none;
margin: var(--space-1) 0 0 0;
padding-left: var(--space-4);
.link {
font-size: var(--text-sm, 0.875rem);
padding: var(--space-1) var(--space-3);
}
}
/* Toggle button for collapse */
.toggle {
background: none;
border: none;
cursor: pointer;
display: none;
@media (max-width: 768px) {
display: block;
}
}
/* Content (for collapse) */
.content {
width: 100%;
}
/* Variants */
&.left {
grid-column: 1 / span 3;
}
&.right {
order: 2;
}
&.light {
background-color: var(--color-neutral-50);
}
&.dark {
background-color: var(--color-neutral-800, #1f2937);
color: var(--color-neutral-100, #f3f4f6);
.title {
color: var(--color-white, #fff);
}
.link {
color: var(--color-neutral-300, #d1d5db);
&:hover {
background-color: var(--color-neutral-700, #374151);
color: var(--color-white, #fff);
}
}
.item.active > .link {
background-color: color-mix(in srgb, var(--color-primary-500) 30, transparent);
}
}
/* Collapsible-Verhalten */
&.collapsible {
@media (max-width: 768px) {
.toggle {
display: block;
}
.content {
display: none;
&.open {
display: block;
}
}
}
}
/* Responsive adjustments */
@container layout (max-width: 768px) {
grid-column: span 12;
order: 2;
}
}
}