/* ============================================================================= 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; }