CP_EHRENAMT/app/static/components-admin.css
2026-06-25 18:58:44 +02:00

397 lines
12 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* =============================================================================
CheckPoint Ehrenamt · components-admin.css
Komponenten der ADMIN-Shell (Sidebar links, mobil Off-Canvas). Nutzt
AUSSCHLIESSLICH --cp-admin-*-Tokens aus tokens.css niemals --cp-user-*.
Geteilte Klassennamen mit der User-Shell (.cp-card, .cp-btn, …), aber eigenes
Aussehen: jede Shell lädt nur ihr Komponenten-CSS, daher keine Kollision.
Desktop-first; unter 900px kollabiert die Sidebar zum Off-Canvas-Overlay.
============================================================================= */
*,
*::before,
*::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
body {
margin: 0;
min-height: 100vh;
background: var(--cp-admin-bg);
color: var(--cp-admin-text);
font-family: var(--cp-admin-font-ui);
line-height: 1.5;
-webkit-font-smoothing: antialiased;
}
:focus-visible {
outline: 2px solid var(--cp-admin-teal);
outline-offset: 2px;
}
/* =============================================================================
Layout: Sidebar + Hauptbereich
============================================================================= */
.cp-sidebar {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: var(--cp-admin-sidebar-width);
z-index: 30;
display: flex;
flex-direction: column;
gap: var(--cp-admin-space-2);
padding: var(--cp-admin-space-4);
overflow-y: auto;
background: var(--cp-admin-sidebar-bg);
color: var(--cp-admin-sidebar-text);
}
.cp-sidebar__brand {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--cp-admin-space-2);
font-family: var(--cp-admin-font-display);
font-size: 1.3rem;
color: var(--cp-admin-on-brand);
padding: var(--cp-admin-space-3) var(--cp-admin-space-2) var(--cp-admin-space-5);
}
.cp-sidebar__bell { color: var(--cp-admin-sidebar-text); flex: none; }
.cp-admin-topbar__bell { margin-left: auto; color: var(--cp-admin-on-brand); }
.cp-sidebar__nav {
display: flex;
flex-direction: column;
gap: var(--cp-admin-space-1);
}
.cp-navlink {
display: flex;
align-items: center;
gap: var(--cp-admin-space-3);
width: 100%;
min-height: 44px;
padding: 0 var(--cp-admin-space-3);
border: 0;
border-radius: var(--cp-admin-radius-md);
background: none;
color: var(--cp-admin-sidebar-text-muted);
font: inherit;
font-weight: 500;
text-align: left;
text-decoration: none;
cursor: pointer;
}
.cp-navlink__icon { flex: none; color: var(--cp-admin-sidebar-icon); }
.cp-navlink:hover {
background: var(--cp-admin-sidebar-hover);
color: var(--cp-admin-sidebar-text);
}
.cp-navlink[aria-current="page"] {
background: var(--cp-admin-sidebar-active-bg);
color: var(--cp-admin-sidebar-active-text);
font-weight: 700;
}
.cp-sidebar__footer {
margin-top: auto;
display: flex;
flex-direction: column;
gap: var(--cp-admin-space-1);
padding-top: var(--cp-admin-space-4);
border-top: 1px solid var(--cp-admin-brand-navy-soft);
}
.cp-sidebar__footer form { margin: 0; }
/* Theme-Umschalter im (dunklen) Sidebar-Fuß. */
.cp-iconbtn {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
border: 0;
border-radius: var(--cp-admin-radius-md);
background: none;
color: var(--cp-admin-sidebar-text);
font: inherit;
cursor: pointer;
text-decoration: none;
}
.cp-topbar__theme { margin: 0; display: inline-flex; }
/* Zähler-Badge auf der Glocke (ungelesene Benachrichtigungen). */
.cp-badge {
position: absolute;
top: 4px;
right: 4px;
min-width: 16px;
height: 16px;
padding: 0 4px;
border-radius: 999px;
background: var(--cp-admin-red);
color: var(--cp-admin-on-brand);
font-size: 0.65rem;
font-weight: 700;
line-height: 1;
display: grid;
place-items: center;
}
/* Ungelesene Benachrichtigung: Akzentstreifen (zusätzlich zum „Neu"-Tag). */
.cp-card--ungelesen { border-left: 3px solid var(--cp-admin-teal); }
/* Mobile-Topbar (nur unter dem Breakpoint sichtbar). */
.cp-admin-topbar {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
height: 56px;
z-index: 20;
align-items: center;
gap: var(--cp-admin-space-3);
padding: 0 var(--cp-admin-space-4);
background: var(--cp-admin-sidebar-bg);
color: var(--cp-admin-on-brand);
}
.cp-admin-topbar__title {
font-family: var(--cp-admin-font-display);
font-size: 1.1rem;
}
.cp-hamburger {
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
border: 0;
background: none;
color: var(--cp-admin-on-brand);
cursor: pointer;
}
.cp-overlay {
position: fixed;
inset: 0;
z-index: 25;
background: rgba(0, 0, 0, 0.5);
}
.cp-overlay[hidden] { display: none; }
.cp-admin-main {
margin-left: var(--cp-admin-sidebar-width);
min-height: 100vh;
}
.cp-page {
width: 100%;
max-width: 1080px;
margin-inline: auto;
padding: var(--cp-admin-space-6);
}
/* =============================================================================
Off-Canvas unter dem Breakpoint
============================================================================= */
@media (max-width: 899px) {
.cp-admin-topbar { display: flex; }
.cp-sidebar {
width: min(86vw, 320px);
transform: translateX(-100%);
transition: transform var(--cp-admin-transition);
box-shadow: var(--cp-admin-shadow-soft);
}
body.cp-sidebar-open .cp-sidebar { transform: translateX(0); }
/* Hintergrund nicht mitscrollen, solange das Overlay offen ist. */
body.cp-sidebar-open { overflow: hidden; }
.cp-admin-main {
margin-left: 0;
padding-top: 56px;
}
.cp-page { padding: var(--cp-admin-space-4); }
}
/* =============================================================================
Typografie
============================================================================= */
h1 {
margin: 0 0 var(--cp-admin-space-4);
font-family: var(--cp-admin-font-display);
font-weight: 400;
font-size: 1.7rem;
line-height: 1.15;
color: var(--cp-admin-heading);
}
h2 {
margin: var(--cp-admin-space-5) 0 var(--cp-admin-space-3);
font-weight: 700;
font-size: 1.2rem;
color: var(--cp-admin-heading);
}
.cp-muted { color: var(--cp-admin-muted); }
/* Profilbild auf der Profilseite. */
.cp-profilbild {
width: 96px;
height: 96px;
border-radius: 50%;
object-fit: cover;
}
.cp-profilbild--leer {
display: grid;
place-items: center;
background: var(--cp-admin-teal-soft);
color: var(--cp-admin-teal-dark);
font-weight: 700;
font-size: 1.6rem;
}
/* =============================================================================
Formulare
============================================================================= */
.cp-form {
display: flex;
flex-direction: column;
gap: var(--cp-admin-space-4);
margin-block: var(--cp-admin-space-5);
max-width: 560px;
}
.cp-field { display: flex; flex-direction: column; gap: var(--cp-admin-space-2); }
.cp-field label { font-weight: 600; color: var(--cp-admin-text); }
.cp-field input,
.cp-field select,
.cp-field textarea {
min-height: 44px;
padding: 0 var(--cp-admin-space-3);
border: 1px solid var(--cp-admin-line);
border-radius: var(--cp-admin-radius-sm);
background: var(--cp-admin-surface);
color: var(--cp-admin-text);
font: inherit;
}
.cp-field textarea { padding: var(--cp-admin-space-3); min-height: 88px; resize: vertical; }
/* =============================================================================
Buttons
============================================================================= */
.cp-btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 44px;
padding: 0 var(--cp-admin-space-5);
border: 1px solid transparent;
border-radius: var(--cp-admin-radius-md);
font: inherit;
font-weight: 600;
text-decoration: none;
cursor: pointer;
}
.cp-btn--primary { background: var(--cp-admin-teal-ui); color: var(--cp-admin-on-brand); box-shadow: var(--cp-admin-shadow-action); }
.cp-btn--urgent { background: var(--cp-admin-red); color: var(--cp-admin-on-brand); }
.cp-btn--ghost { background: var(--cp-admin-surface); color: var(--cp-admin-text); border-color: var(--cp-admin-line); }
/* =============================================================================
Flash, Liste, Tags, Karten, Aktionen
============================================================================= */
.cp-flash {
list-style: none;
margin: 0 0 var(--cp-admin-space-4);
padding: var(--cp-admin-space-3) var(--cp-admin-space-4);
border: 1px solid var(--cp-admin-line);
border-radius: var(--cp-admin-radius-md);
background: var(--cp-admin-surface-soft);
color: var(--cp-admin-text);
}
.cp-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: var(--cp-admin-space-3);
}
.cp-tag {
display: inline-block;
margin-left: var(--cp-admin-space-2);
padding: 2px var(--cp-admin-space-2);
border-radius: var(--cp-admin-radius-sm);
background: var(--cp-admin-status-neutral-bg);
color: var(--cp-admin-status-neutral-text);
font-size: 0.82rem;
font-weight: 600;
}
.cp-tag--urgent { background: var(--cp-admin-status-error-bg); color: var(--cp-admin-status-error-text); margin-left: 0; }
.cp-card {
display: flex;
flex-direction: column;
gap: var(--cp-admin-space-2);
padding: var(--cp-admin-space-5);
border: 1px solid var(--cp-admin-line);
border-radius: var(--cp-admin-radius-lg);
background: var(--cp-admin-surface);
box-shadow: var(--cp-admin-shadow-soft);
}
.cp-card--leer { border-style: dashed; background: var(--cp-admin-surface-soft); box-shadow: none; }
.cp-card a { color: var(--cp-admin-teal-dark); text-decoration: none; font-weight: 600; }
.cp-actions { display: flex; flex-wrap: wrap; gap: var(--cp-admin-space-2); margin-top: var(--cp-admin-space-2); }
.cp-actions form { margin: 0; }
/* =============================================================================
Tabellen (Kopf in Navy, Statusspalten mit Text nie nur Farbe)
============================================================================= */
.cp-table { width: 100%; border-collapse: collapse; background: var(--cp-admin-surface); border-radius: var(--cp-admin-radius-md); overflow: hidden; }
.cp-table th { padding: var(--cp-admin-space-3); background: var(--cp-admin-brand-navy); color: var(--cp-admin-on-brand); text-align: left; font-weight: 700; }
.cp-table td { padding: var(--cp-admin-space-3); border-top: 1px solid var(--cp-admin-line-soft); }
/* =============================================================================
Zwei-Knopf-Umschalter (kann / kann_nicht)
============================================================================= */
.cp-toggle { display: flex; gap: var(--cp-admin-space-2); margin: var(--cp-admin-space-2) 0 0; }
.cp-toggle__btn {
flex: 1;
min-height: 44px;
padding: 0 var(--cp-admin-space-3);
border: 1px solid var(--cp-admin-line);
border-radius: var(--cp-admin-radius-sm);
background: var(--cp-admin-surface);
color: var(--cp-admin-text);
font: inherit;
font-weight: 600;
cursor: pointer;
}
.cp-toggle__btn.is-active {
background: var(--cp-admin-teal-soft);
border-color: var(--cp-admin-teal);
color: var(--cp-admin-teal-dark);
font-weight: 700;
}
/* =============================================================================
Chat
============================================================================= */
.cp-chat { list-style: none; margin: 0 0 var(--cp-admin-space-4); padding: 0; display: flex; flex-direction: column; gap: var(--cp-admin-space-2); }
.cp-msg { padding: var(--cp-admin-space-2) var(--cp-admin-space-3); border: 1px solid var(--cp-admin-line); border-radius: var(--cp-admin-radius-md); background: var(--cp-admin-surface); }
.cp-msg--eigen { background: var(--cp-admin-teal-soft); border-color: transparent; align-self: flex-end; }
.cp-msg__meta { font-size: 0.78rem; color: var(--cp-admin-muted); margin-bottom: 2px; }
.cp-msg__text { white-space: pre-wrap; word-break: break-word; }