Files
certain/web/src/finance.css
T
GuidoandClaude Opus 4.8 a31ba0c785 fix: IBAN-Wertfeld im Konto-Formular war zu schmal (Flex-Shrink)
Ein 100%-breites select drängte das danebenliegende Eingabefeld auf 0.
Select auf feste Breite, .row-Kinder dürfen schrumpfen (min-width:0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 19:59:14 +02:00

529 lines
10 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.
/* Eigene Stil-Ergänzungen für Certain Finance – bewusst getrennt von der aus
der Vorlage übernommenen styles.css, damit Basis und Ergänzung sauber bleiben. */
.brand-mark {
display: flex;
align-items: center;
gap: var(--sp-2);
}
.brand-name {
font-weight: 650;
font-size: 1rem;
letter-spacing: -0.01em;
color: var(--text);
}
/* Beträge: Vorzeichenfarbe. Grün = Einnahme/im Budget, Rot = Ausgabe/über Budget. */
.amount.pos { color: var(--ok); }
.amount.neg { color: var(--danger); }
.amount.muted { color: var(--muted); }
/* Umgerechneter Zweitbetrag (Originalwährung -> Hauptwährung) klein und gedämpft. */
.amount-converted {
color: var(--muted);
font-size: 0.82em;
margin-left: 4px;
}
/* Schlichtes zentriertes Layout für Login / Passwort ändern. */
.auth-screen {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: var(--sp-5);
background: var(--bg);
}
.auth-card {
width: 100%;
max-width: 380px;
}
.auth-card .brand-mark {
justify-content: center;
margin-bottom: var(--sp-4);
}
/* Eingabefeld mit angehängtem Icon-Knopf (z. B. Passwort ein-/ausblenden). */
.input-with-button {
display: flex;
align-items: center;
gap: var(--sp-2);
}
.input-with-button > input {
flex: 1 1 auto;
min-width: 0;
}
/* Flex-Kinder dürfen schrumpfen – sonst drängt ein 100%-breites select/input
ein danebenliegendes Feld auf 0 (das war der Grund für das winzige IBAN-Feld). */
.row > * {
min-width: 0;
}
/* Leerer Zustand (z. B. Dashboard ohne Karten). */
.empty-state {
text-align: center;
color: var(--muted);
padding: var(--sp-6) var(--sp-4);
}
.empty-state .icon {
opacity: 0.5;
margin-bottom: var(--sp-3);
}
/* Farbiges Icon-Plättchen (Konten/Kategorien). */
.icon-chip {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-sm);
flex: 0 0 auto;
}
/* Betrag + umgerechneter Wert (rechtsbündig gestapelt). */
.money {
display: inline-flex;
flex-direction: column;
align-items: flex-end;
line-height: 1.3;
}
.money .amount {
font-variant-numeric: tabular-nums;
font-weight: 560;
}
/* Icon-Auswahlgitter. */
.icon-picker {
display: flex;
flex-wrap: wrap;
gap: var(--sp-2);
margin-top: 5px;
}
.icon-picker-item {
width: 38px;
height: 38px;
display: inline-flex;
align-items: center;
justify-content: center;
border: 1px solid var(--border-strong);
border-radius: var(--radius-sm);
background: var(--surface);
color: var(--muted);
cursor: pointer;
transition: border-color .12s, color .12s, background .12s;
}
.icon-picker-item:hover {
color: var(--text);
background: var(--surface-2);
}
.icon-picker-item.selected {
background: var(--accent-soft);
}
/* Farbwähler-Zeile. */
.color-row {
display: flex;
align-items: center;
gap: var(--sp-2);
margin-top: 5px;
}
.color-row input[type="color"] {
width: 44px;
height: 34px;
padding: 2px;
cursor: pointer;
}
/* Name + Icon nebeneinander (Listen). */
.named {
display: flex;
align-items: center;
gap: var(--sp-3);
min-width: 0;
}
.named .named-text {
min-width: 0;
}
.named .named-sub {
color: var(--muted);
font-size: 0.8rem;
}
/* Kategorie-Gruppe (Verwaltung). */
.cat-group + .cat-group {
margin-top: var(--sp-4);
}
.cat-group-head {
display: flex;
align-items: center;
gap: var(--sp-3);
margin-bottom: var(--sp-2);
}
.cat-group-head h2 {
margin: 0;
}
.cat-list {
display: flex;
flex-direction: column;
gap: 6px;
}
.cat-row {
display: flex;
align-items: center;
gap: var(--sp-3);
padding: var(--sp-2) var(--sp-3);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
background: var(--surface);
}
.cat-row .grow {
flex: 1;
min-width: 0;
}
/* Seitenkopf mit Titel + Aktion rechts. */
.page-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--sp-3);
margin-bottom: var(--sp-4);
}
.page-head h1 {
margin: 0;
}
/* Konten. */
.account-total {
display: flex;
align-items: baseline;
justify-content: space-between;
padding-bottom: var(--sp-3);
margin-bottom: var(--sp-2);
border-bottom: 1px solid var(--border);
}
.account-total strong {
font-size: 1.2rem;
font-variant-numeric: tabular-nums;
}
.account-list {
display: flex;
flex-direction: column;
}
.account-row {
display: flex;
align-items: center;
gap: var(--sp-3);
padding: var(--sp-3) 0;
border-bottom: 1px solid var(--border);
}
.account-row:last-child {
border-bottom: none;
}
.row-actions {
display: flex;
gap: 4px;
flex: 0 0 auto;
}
/* Filterleiste. */
.filter-bar {
display: flex;
gap: var(--sp-3);
flex-wrap: wrap;
margin-bottom: var(--sp-4);
}
.filter-bar select {
width: auto;
min-width: 160px;
margin-top: 0;
}
/* Segmentierte Umschaltung (Ausgabe/Einnahme/Transfer). */
.seg {
display: flex;
border: 1px solid var(--border-strong);
border-radius: var(--radius-sm);
overflow: hidden;
margin-bottom: var(--sp-4);
}
.seg-btn {
flex: 1;
padding: 8px 10px;
border: none;
background: var(--surface);
color: var(--muted);
font-weight: 560;
cursor: pointer;
border-right: 1px solid var(--border);
}
.seg-btn:last-child {
border-right: none;
}
.seg-btn.active {
background: var(--accent);
color: #fff;
}
.nowrap {
white-space: nowrap;
}
/* Budget. */
.budget-navbar {
display: flex;
align-items: center;
gap: var(--sp-3);
}
.budget-month {
font-size: 1.05rem;
min-width: 170px;
text-align: center;
}
.flip {
transform: rotate(180deg);
}
.budget-group + .budget-group {
margin-top: var(--sp-4);
}
.budget-group-head {
display: flex;
align-items: center;
gap: var(--sp-2);
padding: var(--sp-2) 0;
margin-bottom: 4px;
border-bottom: 2px solid var(--border-strong);
}
.budget-cat {
display: flex;
align-items: center;
gap: var(--sp-3);
padding: 7px 0;
border-bottom: 1px solid var(--border);
}
.budget-cat:last-child {
border-bottom: none;
}
.budget-cat-name {
display: flex;
align-items: center;
gap: var(--sp-2);
min-width: 0;
}
.budget-cat-bar {
flex: 1;
}
.amount-input {
width: 96px;
text-align: right;
margin-top: 0;
padding: 5px 8px;
font-variant-numeric: tabular-nums;
}
.budget-actual {
width: 96px;
text-align: right;
font-variant-numeric: tabular-nums;
}
.budget-slash {
margin: 0 -4px;
}
.budget-bar {
height: 7px;
background: var(--surface-2);
border-radius: 4px;
overflow: hidden;
}
.budget-bar-fill {
height: 100%;
background: var(--ok);
border-radius: 4px;
transition: width 0.2s;
}
.budget-bar-fill.over {
background: var(--danger);
}
.budget-total-row.card-total {
display: flex;
align-items: center;
gap: var(--sp-2);
padding-top: var(--sp-3);
margin-top: var(--sp-2);
border-top: 2px solid var(--border-strong);
}
tr.budget-total-row td {
border-top: 2px solid var(--border-strong);
padding-top: var(--sp-2);
}
/* Sparen-Option im Transfer-Formular. */
.savings-opt {
padding: var(--sp-3);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
background: var(--surface-2);
margin-bottom: var(--sp-4);
}
.checkline {
display: flex;
align-items: center;
gap: var(--sp-2);
margin-bottom: var(--sp-2);
}
.checkline input[type="checkbox"] {
width: auto;
margin-top: 0;
}
.checkline span {
color: var(--text);
font-weight: 560;
}
/* ---------- Dashboard-Grid ---------- */
.dash-toolbar {
display: flex;
align-items: center;
gap: var(--sp-2);
position: relative;
}
.dash-add {
position: relative;
}
.dash-add-menu {
position: absolute;
right: 0;
top: calc(100% + 4px);
z-index: 20;
background: var(--surface);
border: 1px solid var(--border-strong);
border-radius: var(--radius-sm);
box-shadow: var(--shadow);
min-width: 200px;
overflow: hidden;
}
.dash-add-item {
display: block;
width: 100%;
text-align: left;
padding: 8px 12px;
border: none;
background: none;
color: var(--text);
cursor: pointer;
}
.dash-add-item:hover {
background: var(--surface-2);
}
.dash-grid {
position: relative;
}
.dash-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: var(--shadow);
display: flex;
flex-direction: column;
overflow: hidden;
}
.dash-card-head {
display: flex;
align-items: center;
gap: var(--sp-2);
padding: 8px 12px;
border-bottom: 1px solid var(--border);
flex: 0 0 auto;
}
.dash-card-title {
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--muted);
font-weight: 650;
flex: 1;
}
.dash-grid.editing .dash-card-head {
cursor: move;
background: var(--surface-2);
}
.dash-remove {
color: var(--danger);
}
.dash-card-body {
flex: 1;
min-height: 0;
overflow: auto;
padding: var(--sp-3);
}
.dash-list {
display: flex;
flex-direction: column;
gap: 2px;
}
.dash-line {
display: flex;
align-items: center;
gap: var(--sp-2);
padding: 6px 0;
border-bottom: 1px solid var(--border);
}
.dash-line:last-child {
border-bottom: none;
}
.dash-total {
display: flex;
align-items: baseline;
gap: var(--sp-2);
padding-top: var(--sp-2);
margin-top: 2px;
border-top: 2px solid var(--border-strong);
font-variant-numeric: tabular-nums;
}
.ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dash-loading, .dash-empty {
padding: var(--sp-4);
text-align: center;
}
.dash-progress {
padding: 6px 0;
}
.dash-progress-top {
display: flex;
align-items: center;
gap: var(--sp-2);
margin-bottom: 4px;
}
.dash-kpis {
display: flex;
flex-direction: column;
justify-content: center;
gap: var(--sp-2);
height: 100%;
}
.dash-kpi {
display: flex;
align-items: baseline;
justify-content: space-between;
}
.dash-kpi strong {
font-size: 1.1rem;
font-variant-numeric: tabular-nums;
}
/* react-grid-layout: Platzhalter + Resize-Griff an das Theme angleichen. */
.react-grid-item.react-grid-placeholder {
background: var(--accent);
opacity: 0.15;
border-radius: var(--radius);
}
.react-grid-item > .react-resizable-handle::after {
border-right-color: var(--border-strong);
border-bottom-color: var(--border-strong);
}