This repository has been archived on 2026-04-03. You can view files and clone it, but cannot push or open issues or pull requests.
nyx/css/sidebar.css
Nico db10ab93fd Production-ready sidebar, toolbar, auth, and routing for loop42.de
Slim sidebar (Home, nyx, Impressum, Datenschutz, Sign-in/User), global
AppToolbar for system features, /agents→/nyx rename, agent auto-select,
OIDC user name extraction from id_token, theme-consistent content pages,
removed DevView and old system panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 16:14:24 +02:00

275 lines
6.3 KiB
CSS

/* ── Sidebar layout ───────────────────────────────────────────── */
:root {
--sidebar-width: 240px;
--sidebar-collapsed-width: 48px;
--sidebar-header-height: 40px;
}
/* ── App body: sidebar + content column ── */
.app-body {
flex: 1;
min-height: 0;
display: flex;
flex-direction: row;
overflow: hidden;
}
.main-column {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* ── Sidebar ── */
.app-sidebar {
position: fixed;
top: var(--panel-gap);
left: var(--panel-gap);
height: calc(100% - var(--panel-gap) * 2);
width: var(--sidebar-width);
flex-shrink: 0;
display: flex;
flex-direction: column;
background: var(--panel-bg);
border-radius: var(--radius-panel);
box-shadow: var(--panel-shadow);
padding: 0 6px;
transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1);
overflow: visible;
z-index: 100;
}
/* Fade text on collapse */
.sidebar-brand-name,
.sidebar-link span,
.sidebar-user-name {
opacity: 1;
transition: opacity 0.15s ease 0.1s;
}
.app-sidebar.is-collapsed .sidebar-brand-name,
.app-sidebar.is-collapsed .sidebar-link span,
.app-sidebar.is-collapsed .sidebar-user-name {
opacity: 0;
transition: opacity 0.05s ease;
pointer-events: none;
}
.app-sidebar.is-collapsed {
width: var(--sidebar-collapsed-width);
}
/* When expanded: enable click target */
.app-sidebar:not(.is-collapsed) .sidebar-close-target {
pointer-events: auto;
}
/* Invisible click target to close sidebar */
.sidebar-close-target {
position: fixed;
inset: 0;
z-index: -1;
opacity: 0;
pointer-events: none;
}
/* ── Header (toggle + brand) ── */
.sidebar-header {
height: var(--sidebar-header-height);
display: flex;
align-items: center;
flex-shrink: 0;
overflow: hidden;
}
.sidebar-brand {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
height: 100%;
color: var(--text);
text-decoration: none;
cursor: pointer;
transition: color 0.12s;
overflow: hidden;
white-space: nowrap;
padding-right: 36px; /* offset toggle btn width so brand is visually centered */
}
.sidebar-brand:hover { color: var(--text); text-decoration: none; }
.sidebar-chevron-anim {
transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.sidebar-brand-logo,
.sidebar-brand-icon {
width: 18px;
height: 18px;
flex-shrink: 0;
}
.sidebar-brand-name {
font-weight: 600;
font-size: var(--text-base);
color: var(--text);
white-space: nowrap;
}
.sidebar-toggle-btn {
width: 36px;
height: 32px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
background: none;
border: none;
cursor: pointer;
color: var(--text-dim);
border-radius: var(--radius-sm);
transition: color 0.12s, background 0.12s;
margin-left: 0;
}
.sidebar-toggle-btn:hover { color: var(--text); background: color-mix(in srgb, var(--accent) 8%, transparent); }
/* ── Nav links ── */
.sidebar-nav {
display: flex;
flex-direction: column;
padding: 4px 0;
}
/* Unified link style — used for all sidebar items */
.sidebar-link {
display: flex;
align-items: center;
gap: 0;
padding: 0;
height: 32px;
color: var(--text-dim);
text-decoration: none;
font-size: var(--text-base);
white-space: nowrap;
overflow: hidden;
transition: background 0.12s, color 0.12s;
cursor: pointer;
background: none;
border: none;
width: 100%;
text-align: left;
border-radius: var(--radius-sm);
}
.sidebar-link:hover { background: color-mix(in srgb, var(--accent) 8%, transparent); color: var(--text); }
.sidebar-link.active { color: var(--accent); }
.sidebar-link svg {
flex-shrink: 0;
width: 16px;
height: 16px;
margin-left: 10px;
margin-right: 10px;
}
/* ── Spacer ── */
.sidebar-flex-spacer {
flex: 1;
}
/* ── Footer (legal + user) ── */
.sidebar-footer {
display: flex;
flex-direction: column;
padding: 4px 0;
position: relative;
z-index: 160;
}
/* Footer links without icons: indent text to match icon-based rows */
.sidebar-footer > a.sidebar-link:not(:has(svg)) {
padding-left: 36px;
}
.app-sidebar.is-collapsed .sidebar-footer > a.sidebar-link:not(:has(svg)) {
padding-left: 0;
}
/* ── User menu ── */
.sidebar-user-wrap {
position: relative;
}
.sidebar-panel-backdrop {
position: fixed;
inset: 0;
z-index: 150;
}
.sidebar-user-menu {
position: absolute;
bottom: 0;
left: 100%;
margin-left: 4px;
width: 220px;
background: var(--panel-bg);
border-radius: var(--radius-panel);
box-shadow: var(--panel-shadow);
z-index: 200;
overflow: hidden;
}
.sidebar-user-menu-header {
padding: 8px 12px 4px;
font-size: var(--text-base);
color: var(--text-dim);
}
.sidebar-user-menu-item {
display: block;
width: 100%;
padding: 7px 12px;
background: none;
border: none;
cursor: pointer;
color: var(--text);
font-size: var(--text-base);
text-align: left;
transition: background 0.12s, color 0.12s;
}
.sidebar-user-menu-item:hover { background: color-mix(in srgb, var(--error) 12%, transparent); color: var(--error); }
/* ── Sidebar spacer (reserves rail width) ── */
.sidebar-spacer {
display: block;
width: var(--sidebar-collapsed-width);
min-width: var(--sidebar-collapsed-width);
max-width: var(--sidebar-collapsed-width);
flex: 0 0 var(--sidebar-collapsed-width);
}
/* ── Large screens: sidebar in flow ── */
@media (min-width: 1024px) {
.app-sidebar {
position: relative;
top: auto;
left: auto;
height: auto;
z-index: auto;
margin: var(--panel-gap);
margin-right: 0;
}
.app-sidebar:not(.is-collapsed) .sidebar-close-target {
pointer-events: none;
}
.sidebar-spacer {
display: none;
}
}
/* ── Mobile ── */
@media (max-width: 480px) {
.sidebar-user-menu {
width: min(220px, calc(100vw - var(--sidebar-collapsed-width) - 16px)) !important;
}
}