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>
275 lines
6.3 KiB
CSS
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;
|
|
}
|
|
}
|