* { margin: 0; padding: 0; box-sizing: border-box; } :root { --bg: #ffffff; --bg-hover: #f6f8fa; --bg-subtle: #f8f9fb; --text: #1a1f36; --text-2: #5e6678; --text-3: #8a93a3; --line: #ebeef1; --line-strong: #d8dde3; --accent: #111111; --accent-hover: #2b2b2b; --accent-ink: #111111; --accent-soft: rgba(17,17,17,.06); --accent-ring: rgba(17,17,17,.14); --grey-bg: #ebeef1; --grey-fg: #414552; --blue-bg: #e0f2fe; --blue-fg: #075985; --orange-bg: #fcedb9; --orange-fg: #a82c00; --violet-bg: #efeafe; --violet-fg: #5b21b6; --green-bg: #d7f7c2; --green-fg: #006908; --red-bg: #ffe7f2; --red-fg: #b3093c; --danger: #c0123c; --danger-ring: rgba(192,18,60,.18); --radius: 6px; --radius-lg: 12px; --ring: 0 0 0 1px rgba(60,66,87,.16), 0 1px 1px rgba(0,0,0,.06); --shadow-btn: 0 1px 1px rgba(0,0,0,.12), 0 2px 5px rgba(60,66,87,.08); --shadow-pop: 0 0 0 1px rgba(60,66,87,.06), 0 12px 32px rgba(26,31,54,.14), 0 2px 6px rgba(26,31,54,.06); --overlay: rgba(26,31,54,.32); --scrim: rgba(26,31,54,.24); --nav-dot: #e5a000; --appt-akquise: #fdf4e3; --appt-akquise-hover: #fbeccd; --appt-hover: #eef1f4; --sidebar-w: 232px; --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; /* Abstaende (unveraendert) */ --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 24px; --sp-6: 32px; /* Alte Token-Namen als Aliase bis P10: Fremd-CSS und JSX nutzen sie noch, so wird Bestandscode sofort weiss. */ --surface-1: var(--bg); --surface-3: var(--bg); --surface: var(--bg); --dark-bg: var(--bg); --dark-card-bg: var(--bg); --surface-2: var(--bg-hover); --surface-hover: var(--bg-hover); --border: var(--line); --gray-700: var(--line); --admin-line: var(--line); --border-strong: var(--line-strong); --admin-line-strong: var(--line-strong); --border-accent: var(--accent-ring); --text-muted: var(--text-2); --text-faint: var(--text-2); --gray-800: var(--text-2); --dark-text: var(--text); --gray-900: var(--text); --accent-2: var(--accent-hover); --green-secondary: var(--accent-hover); --green-primary: var(--accent); --info: var(--blue-fg); --warn: var(--orange-fg); --ok: var(--green-fg); --r-sm: var(--radius); --r-md: var(--radius-lg); --r-lg: var(--radius-lg); --r-pill: 4px; --shadow-1: none; --shadow-2: var(--shadow-btn); --shadow-3: var(--shadow-pop); } /* NEU-ANFANG: Basis und Bausteine des weissen Designs (P1 Task 2/3). Klassen darin bekommen ihre Benutzer in P1 Task 5-8 */ /* und P2-P9; css-klassen.mjs zaehlt sie bis dahin nicht als tot. */ html { color-scheme: light; } body { font-family: var(--font); font-size: 14px; line-height: 20px; color: var(--text); background: var(--bg); -webkit-font-smoothing: antialiased; } a { color: inherit; text-decoration: none; } a:not([class]) { text-decoration: underline; text-decoration-color: var(--line-strong); text-underline-offset: 3px; } a:not([class]):hover { text-decoration-color: currentColor; } button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; } input, select, textarea { font: inherit; color: inherit; } :focus-visible { outline: 2px solid #111111; outline-offset: 2px; } :disabled { opacity: .55; cursor: not-allowed; } fieldset:disabled { opacity: 1; } [readonly] { background: var(--bg-subtle); } .link { color: var(--accent-ink); font-weight: 500; text-decoration: underline; text-decoration-color: var(--line-strong); text-underline-offset: 3px; text-decoration-thickness: 1px; } .link:hover { text-decoration-color: currentColor; } .link-danger { color: var(--danger); font-weight: 500; } .link-danger:hover { text-decoration: underline; text-underline-offset: 3px; } /* ============================================================= */ /* =================== BAUSTEINE (weisses Design) ============ */ /* Werte aus quelle/styles.css (Prototyp). Steht vor dem Altbestand, */ /* damit gleichnamige Altregeln (Task 3) nicht mehr dazwischenfunken. */ /* ============================================================= */ /* ---------- Grundgeruest ---------- */ .shell { display: flex; min-height: 100vh; } .sidebar { position: fixed; inset: 0 auto 0 0; width: var(--sidebar-w); border-right: 1px solid var(--line); display: flex; flex-direction: column; padding: 20px 12px 16px; background: var(--bg); z-index: 20; } .brand { display: flex; align-items: center; gap: 10px; padding: 0 10px 22px; font-weight: 600; font-size: 15px; letter-spacing: -0.01em; } .brand svg { width: 24px; height: 24px; flex: none; } .nav { display: flex; flex-direction: column; gap: 1px; overflow-y: auto; } .nav-item { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 10px; border-radius: var(--radius); color: var(--text-2); font-weight: 500; } .nav-item:hover { background: var(--bg-hover); color: var(--text); } .nav-item.active { color: var(--accent-ink); background: var(--accent-soft); font-weight: 600; } .nav-item.sub { padding-left: 22px; font-size: 13px; font-weight: 400; } .nav-item.sub.active { font-weight: 600; } .nav-item.paused { color: var(--text-3); cursor: default; } .nav-item.paused:hover { background: none; color: var(--text-3); } .nav-count { font-size: 12px; color: var(--text-3); font-variant-numeric: tabular-nums; } .nav-count.hot { color: var(--accent-ink); font-weight: 600; } .nav-item.active .nav-count:not(.hot) { color: var(--text-2); } /* auf der grauen Markierung reicht --text-3 nicht (2,7:1) */ .nav-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--nav-dot); } .nav-dot.critical { background: var(--danger); } .sidebar-foot { margin-top: auto; padding: 14px 10px 0; border-top: 1px solid var(--line); display: flex; flex-direction: column; gap: 2px; } .sidebar-foot .who { font-weight: 500; } .sidebar-foot .link { align-self: flex-start; } /* Knopf statt Link: sonst steht "Abmelden" mittig in der vollen Breite */ .main { flex: 1; margin-left: var(--sidebar-w); min-width: 0; } .page { max-width: 1160px; margin: 0 auto; padding: 36px 48px 80px; } .page section + section { margin-top: 36px; } .mobile-bar { display: none; } /* ---------- Seitenkopf ---------- */ .crumb { font-size: 13px; color: var(--text-2); margin-bottom: 10px; display: flex; gap: 6px; } .crumb a:hover { color: var(--text); } .page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; margin-bottom: 24px; } .page-head h1 { font-size: 28px; line-height: 34px; font-weight: 700; letter-spacing: -0.02em; } .page-head .sub { color: var(--text-2); margin-top: 4px; } .page-head .eyebrow { font-size: 13px; color: var(--text-2); margin-bottom: 4px; } .actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: flex-end; } h2.section { font-size: 16px; line-height: 24px; font-weight: 600; margin: 36px 0 12px; display: flex; align-items: baseline; justify-content: space-between; gap: 12px; } h2.section:first-child { margin-top: 8px; } h2.section .link { font-size: 14px; font-weight: 500; } /* ---------- Knoepfe ---------- */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 32px; padding: 0 12px; border-radius: var(--radius); font-weight: 500; white-space: nowrap; background: var(--bg); box-shadow: var(--ring); transition: background-color 0.12s, box-shadow 0.12s; } .btn:hover { background: var(--bg-hover); } .btn-primary { background: var(--accent); color: #fff; box-shadow: var(--shadow-btn); } .btn-primary:hover { background: var(--accent-hover); } .btn-quiet { box-shadow: none; color: var(--text-2); padding: 0 8px; } .btn-quiet:hover { color: var(--text); } .btn-block { width: 100%; height: 36px; } /* ---------- Status-Marken ---------- */ .badge { display: inline-flex; align-items: center; height: 20px; padding: 0 6px; border-radius: 4px; font-size: 12px; font-weight: 500; white-space: nowrap; background: var(--grey-bg); color: var(--grey-fg); } .badge.blue { background: var(--blue-bg); color: var(--blue-fg); } .badge.orange { background: var(--orange-bg); color: var(--orange-fg); } .badge.violet { background: var(--violet-bg); color: var(--violet-fg); } .badge.green { background: var(--green-bg); color: var(--green-fg); } .badge.red { background: var(--red-bg); color: var(--red-fg); } .badge.plain { background: none; color: var(--text-2); padding: 0; } /* ---------- Reiter ---------- */ .tabs { display: flex; gap: 24px; border-bottom: 1px solid var(--line); margin-bottom: 16px; overflow-x: auto; scrollbar-width: none; } .tab { padding: 8px 0 10px; color: var(--text-2); font-weight: 500; white-space: nowrap; border-bottom: 2px solid transparent; margin-bottom: -1px; } .tab:hover { color: var(--text); } .tab.active, .tab[aria-selected="true"] { color: var(--accent-ink); border-bottom-color: var(--accent); font-weight: 600; } .tab .count { color: var(--text-3); font-weight: 400; margin-left: 4px; font-variant-numeric: tabular-nums; } /* ---------- Filterzeile ---------- */ .toolbar { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; flex-wrap: wrap; } .toolbar .grow { flex: 1; } .input, .select, .textarea { height: 32px; padding: 0 10px; border: 0; border-radius: var(--radius); background: var(--bg); box-shadow: var(--ring); outline: none; transition: box-shadow 0.12s; min-width: 0; } .textarea { height: auto; min-height: 96px; padding: 8px 10px; resize: vertical; line-height: 20px; } .select { padding-right: 28px; appearance: none; background-image: linear-gradient(45deg, transparent 50%, var(--text-2) 50%), linear-gradient(135deg, var(--text-2) 50%, transparent 50%); background-position: calc(100% - 14px) 14px, calc(100% - 10px) 14px; background-size: 4px 4px; background-repeat: no-repeat; } .input:focus, .select:focus, .textarea:focus { box-shadow: 0 0 0 1px var(--accent), 0 0 0 4px var(--accent-ring); } .input[aria-invalid="true"], .select[aria-invalid="true"], .textarea[aria-invalid="true"], .form-control[aria-invalid="true"], .input.is-invalid, .select.is-invalid, .textarea.is-invalid, .form-control.is-invalid { box-shadow: 0 0 0 1px var(--danger), 0 0 0 4px var(--danger-ring); } .input::placeholder, .textarea::placeholder { color: var(--text-3); } .search { width: 300px; } .select-quiet { box-shadow: none; padding-left: 0; color: var(--text-2); font-weight: 500; background-color: transparent; } .select-quiet:hover { color: var(--text); } .check { display: inline-flex; align-items: center; gap: 8px; color: var(--text-2); cursor: pointer; user-select: none; } .check input { accent-color: var(--accent); width: 15px; height: 15px; } /* ---------- Tabellen ---------- */ .table { width: 100%; border-collapse: collapse; } .table th { text-align: left; font-size: 12px; font-weight: 500; color: var(--text-2); padding: 8px 12px 8px 0; border-bottom: 1px solid var(--line); white-space: nowrap; } .table td { padding: 12px 12px 12px 0; border-bottom: 1px solid var(--line); vertical-align: top; } .table th:last-child, .table td:last-child { padding-right: 0; } .table tr.row { cursor: pointer; } .table tr.row:hover td { background: var(--bg-subtle); } .table tr.row td:first-child { box-shadow: -12px 0 0 transparent; } .table tr.row:hover td:first-child { box-shadow: -12px 0 0 var(--bg-subtle); } .table tr.row:hover td:last-child { box-shadow: 12px 0 0 var(--bg-subtle); } .table .right { text-align: right; } .cell-title { font-weight: 500; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .cell-sub { font-size: 13px; color: var(--text-2); margin-top: 2px; } .id { font-size: 13px; color: var(--text-3); font-variant-numeric: tabular-nums; } .table-foot { display: flex; justify-content: space-between; align-items: center; padding: 14px 0; color: var(--text-2); font-size: 13px; } .empty { padding: 56px 0; text-align: center; color: var(--text-2); } .empty strong { display: block; color: var(--text); font-weight: 600; margin-bottom: 4px; } .loading { padding: 56px 0; text-align: center; color: var(--text-2); } .msg { font-size: 13px; } .msg.err { color: var(--red-fg); } .msg.ok { color: var(--green-fg); } .msg.warn { color: var(--orange-fg); } /* ---------- Kennzahlen / Schluesselwerte ---------- */ .facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0; margin: 4px 0 28px; } .fact { padding: 0 20px; border-left: 1px solid var(--line); min-width: 0; } .fact:first-child { padding-left: 0; border-left: 0; } .fact .k { font-size: 13px; color: var(--text-2); margin-bottom: 2px; white-space: nowrap; } .fact .v { font-weight: 500; overflow-wrap: anywhere; } .fact .v .select-quiet { color: var(--text); font-weight: 500; height: 20px; } .stats { display: flex; gap: 48px; margin: 4px 0 20px; flex-wrap: wrap; } .stat .k { font-size: 13px; color: var(--text-2); } .stat .v { font-size: 22px; line-height: 30px; font-weight: 600; letter-spacing: -0.01em; font-variant-numeric: tabular-nums; } .stat .v.warn { color: var(--orange-fg); } .v.neg { color: var(--red-fg); } .stat .sub { font-size: 12px; line-height: 16px; color: var(--text-2); } .kv { display: grid; grid-template-columns: 180px 1fr; row-gap: 10px; column-gap: 24px; } .kv dt { color: var(--text-2); } .kv dd { min-width: 0; overflow-wrap: anywhere; } .kv .input { width: 100%; max-width: 360px; } .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 0 56px; } .prose { color: var(--text); line-height: 22px; white-space: pre-wrap; max-width: 680px; } /* ---------- Ticket-Kopf ---------- */ .urgent-toggle { display: inline-flex; align-items: center; gap: 8px; color: var(--text-2); font-weight: 500; cursor: pointer; user-select: none; height: 32px; padding: 0 4px; } .urgent-toggle .sw { width: 28px; height: 16px; border-radius: 99px; background: var(--line-strong); position: relative; transition: background 0.15s; } .urgent-toggle .sw::after { content: ""; position: absolute; top: 2px; left: 2px; width: 12px; height: 12px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.2); transition: transform 0.15s; } .urgent-toggle.on { color: var(--red-fg); } .urgent-toggle.on .sw { background: var(--danger); } .urgent-toggle.on .sw::after { transform: translateX(12px); } /* ---------- Listen (einfach) ---------- */ .list-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--line); } .list-row:first-child { border-top: 1px solid var(--line); } a.list-row:hover .cell-title { color: var(--accent-ink); } /* ---------- Dialog ---------- */ .overlay { position: fixed; inset: 0; background: var(--overlay); display: flex; align-items: flex-start; justify-content: center; padding: 10vh 16px 16px; z-index: 50; animation: fade 0.12s ease-out; } .dialog { width: 100%; max-width: 520px; background: var(--bg); border-radius: var(--radius-lg); box-shadow: var(--shadow-pop); max-height: 84vh; display: flex; flex-direction: column; animation: pop 0.14s ease-out; } .dialog-wide { max-width: 760px; } .dialog-head { display: flex; align-items: center; justify-content: space-between; padding: 20px 24px 4px; } .dialog-head h3 { font-size: 18px; line-height: 26px; font-weight: 600; } .dialog-close { width: 28px; height: 28px; border-radius: var(--radius); color: var(--text-2); font-size: 20px; line-height: 1; } .dialog-close:hover { background: var(--bg-hover); color: var(--text); } .dialog-body { padding: 16px 24px 8px; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; } .dialog-foot { display: flex; align-items: center; gap: 8px; padding: 16px 24px 20px; } .dialog-foot .grow { flex: 1; } .field { display: flex; flex-direction: column; gap: 6px; } .field > label { font-weight: 500; } .field .hint { font-size: 13px; color: var(--text-2); } .field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .field-row-3 { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 12px; } .seg { display: inline-flex; padding: 2px; border-radius: var(--radius); background: var(--bg-hover); gap: 2px; } .seg button { height: 28px; padding: 0 12px; border-radius: 5px; color: var(--text-2); font-weight: 500; } .seg button.on, .seg button[aria-pressed="true"] { background: var(--bg); color: var(--text); box-shadow: 0 1px 2px rgba(26,31,54,.12), 0 0 0 1px rgba(26,31,54,.04); } .toast { position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%); background: var(--text); color: #fff; padding: 10px 16px; border-radius: 8px; font-weight: 500; box-shadow: var(--shadow-pop); z-index: 60; animation: rise 0.18s ease-out; } @keyframes fade { from { opacity: 0; } } @keyframes pop { from { opacity: 0; transform: translateY(6px) scale(0.99); } } @keyframes rise { from { opacity: 0; transform: translate(-50%, 8px); } } /* ---------- Anmeldung ---------- */ .login { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 32px 16px 96px; } .login-box { width: 100%; max-width: 360px; } .login-box svg { width: 40px; height: 40px; margin-bottom: 28px; } .login-box h1 { font-size: 24px; line-height: 32px; font-weight: 700; letter-spacing: -0.02em; } .login-box .sub { color: var(--text-2); margin: 4px 0 28px; } .login-box form { display: flex; flex-direction: column; gap: 16px; } .login-box .input { height: 36px; } .code-input { letter-spacing: 0.5em; font-size: 18px; font-variant-numeric: tabular-nums; text-align: center; } .login-links { display: flex; gap: 16px; justify-content: center; margin-top: 20px; font-size: 13px; } .login-foot { position: fixed; bottom: 24px; left: 0; right: 0; text-align: center; font-size: 12px; color: var(--text-3); } /* ---------- Schmale Bildschirme ---------- */ @media (max-width: 1100px) { .page { padding: 32px 28px 80px; } .hide-md { display: none; } } @media (max-width: 860px) { .sidebar { transform: translateX(-100%); transition: transform 0.18s ease-out; width: min(300px, 86vw); box-shadow: none; } .shell.menu-open .sidebar { transform: none; box-shadow: var(--shadow-pop); } .shell.menu-open .scrim { position: fixed; inset: 0; background: var(--scrim); z-index: 15; } .main { margin-left: 0; } .mobile-bar { display: flex; align-items: center; justify-content: space-between; height: 52px; padding: 0 16px; border-bottom: 1px solid var(--line); position: sticky; top: 0; background: var(--bg); z-index: 10; } .mobile-bar .brand { padding: 0; } .page { padding: 20px 16px 120px; } .page-head { flex-direction: column; gap: 14px; margin-bottom: 18px; } .page-head h1 { font-size: 24px; line-height: 30px; } .actions { justify-content: flex-start; } .hide-sm { display: none; } .search { width: 100%; } .toolbar .grow { display: none; } .facts { grid-template-columns: 1fr 1fr; row-gap: 16px; } .fact { border-left: 0; padding: 0; } .two-col { grid-template-columns: 1fr; } .kv { grid-template-columns: 1fr; row-gap: 2px; } .kv dd { margin-bottom: 10px; } .stats { display: grid; grid-template-columns: repeat(3, auto); justify-content: start; gap: 24px; } .stat .v { font-size: 18px; } .field-row, .field-row-3 { grid-template-columns: 1fr; } .overlay { padding: 16px; align-items: flex-end; } .dialog { max-height: 92vh; } } /* NEU-ENDE */ /* Utilities */ .text-center { text-align: center; } .mt-2 { margin-top: 16px; } .mt-3 { margin-top: 24px; } .mb-2 { margin-bottom: 16px; } .p-1 { padding: 8px; } .p-2 { padding: 16px; } .hidden { display: none; } .ticket-projects { margin-top: 16px; } /* Zeile unter der Projektliste: Projekt waehlen + Zuweisen + Neues Projekt */ .ticket-projects-assign { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } .ticket-projects-assign .form-control { flex: 1 1 220px; margin: 0; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* ============================================================= */ /* =================== REDESIGN (Designsystem) =============== */ /* ============================================================= */ /* --- Page header + container --- */ .page-header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--sp-4); margin-bottom: var(--sp-5); flex-wrap: wrap; } .page-title { font-size: 24px; font-weight: 800; margin: 0; } .page-subtitle { color: var(--text-muted); font-size: 14px; margin-top: 4px; } .page-actions { display: flex; gap: var(--sp-2); flex-wrap: wrap; } /* --- Ticket Card (ersetzt Tabelle) --- */ .tickets-list { display: flex; flex-direction: column; gap: var(--sp-3); } .tcard { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); overflow: visible; transition: border-color 0.15s ease; } .tcard:hover { border-color: var(--border-strong); } .tcard.open { border-color: var(--border-accent); } .tcard-detail { border-radius: 0 0 var(--r-md) var(--r-md); } .tcard-main { display: grid; grid-template-columns: 92px 1fr auto; gap: var(--sp-4); padding: var(--sp-4); align-items: center; cursor: pointer; } .tcard-woid { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; } .tcard-woid .id { font-weight: 800; font-size: 15px; color: var(--accent); } .tcard-woid .age { font-size: 11px; color: var(--text-faint); } .tcard-body { min-width: 0; } .tcard-row1 { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; margin-bottom: 4px; } .tcard-customer { font-weight: 700; } .tcard-loc { color: var(--text-muted); font-size: 13px; } .tcard-topic { color: var(--text-muted); font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .tcard-badges { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; } /* Eine Zeile ueber der Arbeitsblatt-Liste */ .worksheet-summary { display: flex; flex-wrap: wrap; gap: 6px 20px; align-items: baseline; padding: 10px 14px; margin-bottom: 16px; font-size: 14px; color: var(--text-muted); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); } .worksheet-summary strong { color: var(--text); } .worksheet-summary .open { color: var(--orange-fg); font-weight: 700; } .tcard-side { display: flex; align-items: center; gap: var(--sp-3); } .tcard-detail { border-top: 1px solid var(--border); padding: var(--sp-4); background: var(--surface-1); } .chevron { color: var(--text-muted); transition: transform 0.2s ease; } .chevron.up { transform: rotate(180deg); } @media (max-width: 720px) { .tcard-main { grid-template-columns: 64px 1fr; } .tcard-side { grid-column: 1 / -1; justify-content: space-between; } } /* --- Generic data list rows (Kunden/Finanzen/Dokumente) --- */ .list { display: flex; flex-direction: column; } /* --- Clean table (ohne rowSpan-Tricks) --- */ .ui-table { width: 100%; border-collapse: collapse; } .ui-table th { text-align: left; font-size: 12px; text-transform: uppercase; letter-spacing: 0.4px; color: var(--text-faint); font-weight: 600; padding: 10px var(--sp-3); border-bottom: 1px solid var(--border); background: transparent; } .ui-table td { padding: 11px var(--sp-3); border-bottom: 1px solid var(--border); font-size: 14px; } .ui-table tbody tr:hover td { background: var(--surface-2); } /* --- Suchfeld --- */ .search-input { flex: 1; min-width: 200px; } /* --- Utilities --- */ /* NEU-ANFANG: Hilfsklassen (P1 Task 2), Benutzer folgen mit den neuen Bausteinen */ .num { font-variant-numeric: tabular-nums; } .muted { color: var(--text-2); } .faint { color: var(--text-3); } .small { font-size: 13px; } .xs { font-size: 12px; line-height: 16px; } .strong { font-weight: 600; } .nowrap { white-space: nowrap; } /* NEU-ENDE */ .flex { display: flex; } .items-center { align-items: center; } .justify-between { justify-content: space-between; } .gap-2 { gap: var(--sp-2); } .gap-3 { gap: var(--sp-3); } .grow { flex: 1; min-width: 0; } .wrap { flex-wrap: wrap; } .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; } .text-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .automatic-assignment-note { padding: 12px 14px; border-left: 2px solid var(--accent); background: var(--surface-2); } .automatic-assignment-note p { margin: 5px 0 0; color: var(--text-muted); font-size: 13px; line-height: 1.45; } /* Neues Ticket: Datum + Uhrzeit nebeneinander (heller Kalender, kein color-scheme: dark) */ .datetime-pair { display: flex; gap: 8px; } .datetime-pair .form-control, .datetime-pair .input { flex: 1; min-width: 0; } .datetime-pair input[type="date"] { flex: 1.3; cursor: pointer; } /* Autovervollstaendigung (Requested by / Requested for) */ .autocomplete { position: relative; } .autocomplete-list { position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 20; margin: 0; padding: 4px; list-style: none; max-height: 280px; overflow-y: auto; background: var(--bg); border: 1px solid var(--border-strong); border-radius: 8px; box-shadow: var(--shadow-pop); } .autocomplete-item { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 8px 10px; border-radius: 6px; color: var(--text); font-size: 14px; cursor: pointer; } .autocomplete-item.active, .autocomplete-item:hover { background: var(--bg-hover); } .autocomplete-item.active .autocomplete-value { color: var(--accent); } .autocomplete-value { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .autocomplete-hint { flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-faint); font-size: 12px; } /* --- Rechtliches --- */ .legal-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(360px, 100%), 1fr)); gap: var(--sp-4); align-items: start; margin-top: var(--sp-4); } .legal-grid > .legal-error { grid-column: 1 / -1; } .legal-doc-summary { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; cursor: pointer; } .legal-toggle { margin-left: auto; font-size: 13px; } .legal-live { display: inline-block; margin-top: 8px; font-size: 13px; color: var(--accent); } .legal-history { list-style: none; margin: 12px 0 0; padding: 0; display: grid; gap: 8px; } .legal-version { border: 1px solid var(--border); border-radius: var(--r-sm); padding: 8px 10px; font-size: 14px; } .legal-version-current { border-color: var(--ok); background: rgba(16, 185, 129, 0.08); } .legal-version-draft { border-style: dashed; } .legal-version-superseded { color: var(--text-muted); } .legal-version-head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } .legal-note { white-space: pre-wrap; margin: 4px 0; color: var(--text-muted); font-size: 13px; } .legal-files { display: inline-flex; flex-wrap: wrap; gap: 4px 12px; font-size: 13px; } .legal-files a { color: var(--accent); } .legal-error { background: var(--danger); color: #fff; padding: 8px 12px; border-radius: var(--r-sm); margin: 8px 0; } .legal-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-3); } .legal-contracts { margin-top: var(--sp-2); } .legal-contracts tbody tr { cursor: pointer; } .legal-tone-red td { background: rgba(239, 68, 68, 0.10); } .legal-tone-red .legal-deadline { color: var(--danger); font-weight: 700; } .legal-tone-orange td { background: rgba(245, 158, 11, 0.10); } .legal-tone-orange .legal-deadline { color: #b45309; font-weight: 600; } .legal-tone-missing .legal-deadline { color: var(--text-faint); font-style: italic; } .legal-tone-grey td { color: var(--text-faint); } .legal-detail td { background: var(--surface-2); cursor: default; } .legal-actions { margin-top: 8px; flex-wrap: wrap; } @media (max-width: 700px) { .legal-grid { grid-template-columns: 1fr; } .legal-form-row { grid-template-columns: 1fr; } .legal-contracts { display: block; overflow-x: auto; } } /* --- Finanzen --- */ .fin-amount { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } .fin-stack { display: flex; flex-direction: column; gap: var(--sp-5); } .fin-stack .kpi-grid { margin-bottom: 0; } .fin-spin { animation: spin 1s linear infinite; } .fin-hint { margin: 0; font-size: 13px; color: var(--text-muted); } .fin-hint-warn { color: var(--warn); } .fin-flag { color: var(--danger); font-weight: 700; } .fin-link { background: none; border: 0; padding: 0; font: inherit; cursor: pointer; color: var(--accent); display: inline-flex; align-items: center; gap: 6px; text-decoration: underline; text-underline-offset: 2px; } .fin-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; } /* Block 0: Statuszeile */ .fin-status-wrap { display: flex; flex-direction: column; gap: var(--sp-2); } .fin-status { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-3); padding: 10px 14px; font-size: 13px; color: var(--text-muted); background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); } .fin-status-items { display: flex; flex-wrap: wrap; gap: 4px var(--sp-4); min-width: 0; } .fin-status-item { display: inline-flex; align-items: center; gap: 6px; min-width: 0; overflow-wrap: anywhere; } .fin-status-warn { color: var(--warn); font-weight: 600; } /* Block 1: Liquiditaetskopf */ .fin-head .kpi-value { font-variant-numeric: tabular-nums; } .fin-breakdown { list-style: none; margin: var(--sp-2) 0 0; padding: 0; display: grid; gap: 4px; color: var(--text-muted); } .fin-breakdown li { display: flex; justify-content: space-between; gap: var(--sp-3); } .fin-breakdown .fin-amount { color: var(--text); } .fin-breakdown-total { border-top: 1px solid var(--border-strong); padding-top: 4px; font-weight: 700; color: var(--text); } .fin-lows { display: grid; grid-template-columns: auto auto minmax(0, 1fr); gap: 6px 10px; align-items: baseline; font-size: 14px; font-weight: 600; } .fin-low { display: contents; } .fin-low-label { color: var(--text-muted); } .fin-low .fin-amount { font-size: 20px; font-weight: 800; } .fin-low-when { color: var(--text-muted); font-size: 13px; font-weight: 500; } /* Block 2: Zu erledigen */ .fin-todo-card { overflow: hidden; } .fin-todos { list-style: none; margin: 0; padding: 0; } .fin-todo { display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; gap: var(--sp-3); align-items: start; padding: 12px var(--sp-4); border-bottom: 1px solid var(--border); border-left: 3px solid var(--border); } .fin-todo:last-child { border-bottom: none; } .fin-todo-hoch { border-left-color: var(--danger); } .fin-todo-mittel { border-left-color: var(--warn); } .fin-todo .badge { justify-self: start; } .fin-todo-title { font-weight: 700; } .fin-todo-text { font-size: 13px; margin-top: 2px; overflow-wrap: anywhere; } .fin-todo .fin-hint { margin-top: 6px; } .fin-todos-more { padding: var(--sp-3) var(--sp-4); border-top: 1px solid var(--border); } @media (max-width: 720px) { .fin-todo { grid-template-columns: minmax(0, 1fr); gap: var(--sp-2); } .fin-todo .ui-btn { justify-self: start; } } /* Bloecke 3-5: Vorschau, Steuer, Abos */ .fin-sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; } .fin-neg { color: var(--danger); } .fin-cols { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-5); align-items: start; } @media (min-width: 1100px) { .fin-cols { grid-template-columns: minmax(0, 1.8fr) minmax(0, 1fr); } .fin-cols-half { grid-template-columns: repeat(2, minmax(0, 1fr)); } } /* Block 3: Vorschau (Tabelle; in einer schmalen Karte wird jede Zeile zweizeilig) */ .fin-forecast-card { container-type: inline-size; overflow: hidden; } .fin-table-wrap { overflow-x: auto; } .fin-forecast th, .fin-forecast td { padding: 9px 10px; vertical-align: baseline; } .fin-forecast th.fin-amount { text-align: right; } .fin-forecast th:first-child, .fin-forecast td:first-child { padding-left: var(--sp-4); } .fin-forecast th:last-child, .fin-forecast td:last-child { padding-right: var(--sp-4); } .fin-forecast tbody tr:last-child td { border-bottom: none; } .fin-forecast-date { white-space: nowrap; font-variant-numeric: tabular-nums; } .fin-forecast-label { overflow-wrap: anywhere; } .fin-forecast-foot { display: grid; gap: var(--sp-2); padding: var(--sp-3) var(--sp-4); border-top: 1px solid var(--border); } .fin-forecast-foot .fin-hint svg { vertical-align: -2px; } @container (max-width: 560px) { .fin-forecast thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } .fin-forecast, .fin-forecast tbody { display: block; } .fin-forecast tr { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 4px 0; align-items: baseline; grid-template-areas: "date date kind kind amount amount" "label label label label label label" "sicher sicher sicher erwartet erwartet erwartet"; padding: 10px var(--sp-4); border-bottom: 1px solid var(--border); } .fin-forecast-nobal tr { grid-template-areas: "date date kind kind amount amount" "label label label label label label"; } .fin-forecast tbody tr:last-child { border-bottom: none; } .fin-forecast td, .fin-forecast td:first-child, .fin-forecast td:last-child { display: block; padding: 0; border: 0; min-width: 0; } .fin-forecast tbody tr:hover td { background: transparent; } .fin-forecast-date { grid-area: date; } .fin-forecast-kind { grid-area: kind; } .fin-forecast-amount { grid-area: amount; font-weight: 700; } .fin-forecast-label { grid-area: label; } .fin-forecast td.fin-forecast-sicher, .fin-forecast td.fin-forecast-erwartet { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: var(--sp-2); font-size: 13px; } .fin-forecast-sicher { grid-area: sicher; } .fin-forecast-erwartet { grid-area: erwartet; } .fin-forecast td.fin-forecast-sicher { padding-right: var(--sp-3); } .fin-forecast td.fin-forecast-erwartet { padding-left: var(--sp-3); } .fin-saldo { margin-left: auto; } .fin-forecast td[data-label]::before { content: attr(data-label); color: var(--text-muted); font-size: 12px; font-weight: 500; white-space: nowrap; } } /* Block 4: Steuer */ .fin-facts { display: grid; gap: var(--sp-4); } .fin-fact { display: grid; gap: 3px; padding-bottom: var(--sp-4); border-bottom: 1px solid var(--border); } .fin-fact:last-child { padding-bottom: 0; border-bottom: none; } .fin-fact-row { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-3); } .fin-fact-label { color: var(--text-muted); font-size: 13px; } .fin-fact-big { font-size: 24px; font-weight: 800; } .fin-fact-strong { font-size: 16px; font-weight: 700; } .fin-fact-value { font-weight: 700; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; } .fin-fact-unknown { color: var(--warn); } .fin-fact-sub { font-size: 13px; color: var(--text-muted); overflow-wrap: anywhere; } .fin-fact-sub-strong { color: var(--text); } /* Block 5: Abos */ .fin-abo-card { overflow: hidden; } .fin-stats { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 6px var(--sp-3); align-items: baseline; padding: var(--sp-4); border-bottom: 1px solid var(--border); } .fin-stat-value { font-size: 20px; font-weight: 800; } .fin-stat-label { color: var(--text-muted); } .fin-stat-label.fin-flag { color: var(--danger); } .fin-stat-label svg { vertical-align: -2px; } .fin-abos { list-style: none; margin: 0; padding: 0; } .fin-abo { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px var(--sp-3); align-items: baseline; padding: 11px var(--sp-4); border-bottom: 1px solid var(--border); } .fin-abo:last-child { border-bottom: none; } .fin-abo-customer { font-weight: 700; overflow-wrap: anywhere; } .fin-abo-meta { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 4px var(--sp-3); font-size: 13px; } /* Block 6 und 7: Rechnungen und Buchungen (Tabellen; in einer schmalen Karte wird jede Zeile ein Raster) */ .fin-block { scroll-margin-top: var(--sp-4); } .fin-invoices-card, .fin-tx-card { container-type: inline-size; overflow: hidden; } .fin-toolbar { padding: var(--sp-3) var(--sp-4); } .fin-toolbar .seg { flex-wrap: wrap; max-width: 100%; } .fin-notice { padding: var(--sp-3) var(--sp-4) var(--sp-2); } .fin-load-error { display: grid; gap: var(--sp-3); justify-items: start; padding: var(--sp-4); } .fin-page-notice { margin-bottom: var(--sp-4); } .fin-ages { list-style: none; margin: 0; padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--border); display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-3); } .fin-age { display: grid; gap: 2px; min-width: 0; } .fin-age-label { color: var(--text-muted); font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.4px; } .fin-age-count { font-size: 13px; color: var(--text-muted); } .fin-age-sum { text-align: left; font-size: 18px; font-weight: 800; } .fin-pager { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); border-top: 1px solid var(--border); } .fin-pager-info { font-size: 13px; color: var(--text-muted); font-variant-numeric: tabular-nums; } .fin-invoices th, .fin-invoices td, .fin-tx th, .fin-tx td { padding: 9px 10px; vertical-align: top; } .fin-invoices th.fin-amount, .fin-tx th.fin-amount { text-align: right; } .fin-invoices th:first-child, .fin-invoices td:first-child, .fin-tx th:first-child, .fin-tx td:first-child { padding-left: var(--sp-4); } .fin-invoices th:last-child, .fin-invoices td:last-child, .fin-tx th:last-child, .fin-tx td:last-child { padding-right: var(--sp-4); } .fin-invoices tbody tr:last-child td, .fin-tx tbody tr:last-child td { border-bottom: none; } .fin-inv-number { font-weight: 700; white-space: nowrap; } .fin-inv-customer { overflow-wrap: anywhere; } .fin-inv-created, .fin-inv-due, .fin-tx-date { white-space: nowrap; font-variant-numeric: tabular-nums; } .fin-inv-statusbox { display: grid; gap: 3px; justify-items: start; } .fin-inv-note { font-size: 12px; } .fin-actions { display: flex; flex-wrap: wrap; gap: 6px; } .fin-tx-counterparty { font-weight: 600; overflow-wrap: anywhere; } .fin-tx-remittance { font-size: 13px; overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .fin-tx-amount { font-weight: 700; } .fin-tx-badges { display: flex; flex-wrap: wrap; gap: 4px; } .fin-tx-assign .badge { white-space: normal; } .fin-tx-suggestion, .fin-tx-note { font-size: 12px; margin-top: 4px; overflow-wrap: anywhere; } .fin-tx-action { white-space: nowrap; text-align: right; } @container (max-width: 860px) { .fin-ages { grid-template-columns: repeat(2, minmax(0, 1fr)); } .fin-invoices thead, .fin-tx thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } .fin-invoices, .fin-invoices tbody, .fin-tx, .fin-tx tbody { display: block; } .fin-invoices tr { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px var(--sp-4); align-items: baseline; grid-template-areas: "number status" "customer customer" "created due" "total remaining" "actions actions"; padding: 10px var(--sp-4); border-bottom: 1px solid var(--border); } .fin-invoices tbody tr:last-child { border-bottom: none; } .fin-invoices td, .fin-invoices td:first-child, .fin-invoices td:last-child, .fin-tx td, .fin-tx td:first-child, .fin-tx td:last-child { display: block; padding: 0; border: 0; min-width: 0; } .fin-invoices tbody tr:hover td, .fin-tx tbody tr:hover td { background: transparent; } .fin-inv-number { grid-area: number; } .fin-inv-status { grid-area: status; } .fin-inv-statusbox { justify-items: end; text-align: right; } .fin-inv-customer { grid-area: customer; } .fin-inv-created { grid-area: created; } .fin-inv-due { grid-area: due; } .fin-inv-total { grid-area: total; } .fin-inv-remaining { grid-area: remaining; } .fin-inv-actions { grid-area: actions; padding-top: 4px; } .fin-invoices td[data-label] { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 0 var(--sp-2); font-size: 13px; } .fin-invoices td[data-label]::before { content: attr(data-label); color: var(--text-muted); font-weight: 500; } } @container (max-width: 640px) { .fin-tx tr { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px var(--sp-4); align-items: baseline; grid-template-areas: "date amount" "what what" "assign action"; padding: 10px var(--sp-4); border-bottom: 1px solid var(--border); } .fin-tx tbody tr:last-child { border-bottom: none; } .fin-tx-date { grid-area: date; } .fin-tx-amount { grid-area: amount; } .fin-tx-what { grid-area: what; } .fin-tx-assign { grid-area: assign; } .fin-tx-action { grid-area: action; align-self: start; } } /* Dialoge: Rechnung schreiben, Buchung zuordnen (auf dem dunklen Overlay) */ .fin-close { background: none; border: 0; padding: 0; line-height: 1; font-size: 32px; top: 16px; right: 24px; z-index: 1; } .fin-close:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: 4px; } .fin-close:disabled { opacity: 0.4; cursor: not-allowed; } .fin-overlay { background: rgba(6, 9, 14, 0.98); } .fin-dialog { max-width: 760px; } .fin-dialog:focus { outline: none; } .fin-dialog-error { margin-bottom: var(--sp-4); padding: var(--sp-3) var(--sp-4); border-radius: var(--r-sm); border: 1px solid var(--danger); background: rgba(239, 68, 68, 0.16); color: #fecaca; overflow-wrap: anywhere; } .fin-dialog-warn { margin: 6px 0 0; font-size: 13px; color: #fbbf24; overflow-wrap: anywhere; } .fin-dialog-sub { margin: 6px 0 0; font-size: 13px; color: var(--text-muted); overflow-wrap: anywhere; } .fin-fixed-customer { margin: 0; overflow-wrap: anywhere; } .fin-address-warn { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px var(--sp-3); font-size: 13px; overflow-wrap: anywhere; } .fin-address-warn-dialog { margin: 6px 0 0; color: #fbbf24; } .fin-address-warn-page { margin: 0 0 var(--sp-4); padding: var(--sp-3) var(--sp-4); border: 1px solid var(--warn); border-radius: var(--r-sm); color: var(--warn); } .fin-address-warn .fin-link { font-size: 13px; } .fin-items { border: 0; padding: 0; margin: 0 0 var(--sp-4); min-width: 0; } .fin-items legend { padding: 0; } .fin-item { display: grid; grid-template-columns: minmax(0, 1fr) 90px 130px 120px 38px; gap: 8px; align-items: end; margin-bottom: 8px; } .fin-item-field { min-width: 0; } .fin-item-label { display: block; margin-bottom: 4px; font-size: 12px; color: var(--text-muted); } .fin-item ~ .fin-item .fin-item-label { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } .fin-item .form-control.fin-amount { text-align: right; } .fin-item-total { display: block; padding: 10px 0; font-weight: 600; } .fin-icon-btn { width: 38px; height: 40px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; background: transparent; border: 1px solid var(--border-strong); border-radius: 6px; color: var(--text-muted); } .fin-icon-btn:hover:not(:disabled) { color: #f87171; border-color: #f87171; } .fin-icon-btn:disabled { opacity: 0.35; cursor: not-allowed; } .fin-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .fin-items-foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-top: var(--sp-3); } .fin-total { display: flex; align-items: baseline; gap: var(--sp-4); font-size: 18px; font-weight: 700; } .fin-dialog-row { display: grid; grid-template-columns: 180px minmax(0, 1fr); gap: var(--sp-4); } .fin-dialog-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--sp-3); margin-top: var(--sp-4); } .fin-tx-facts { display: grid; gap: 6px; margin: 0 0 var(--sp-4); padding: var(--sp-3) var(--sp-4); border: 1px solid var(--border-strong); border-radius: var(--r-sm); } .fin-tx-facts > div { display: grid; grid-template-columns: 130px minmax(0, 1fr); gap: var(--sp-3); align-items: baseline; } .fin-tx-facts dt { color: var(--text-muted); font-size: 13px; } .fin-tx-facts dd { margin: 0; overflow-wrap: anywhere; } .fin-tx-facts .fin-tx-facts-amount { text-align: left; font-weight: 700; } .fin-assigned { margin: 0 0 var(--sp-2); } .fin-choices { border: 0; padding: 0; margin: 0 0 var(--sp-4); display: grid; gap: 8px; min-width: 0; } .fin-choices legend { padding: 0; margin-bottom: 4px; } .fin-choice { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; cursor: pointer; border: 1px solid var(--border-strong); border-radius: var(--r-sm); } .fin-choice:has(input:checked) { border-color: var(--accent); background: var(--accent-soft); } .fin-choice:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; } .fin-choice input { margin-top: 4px; accent-color: var(--accent); } .fin-choice-off { opacity: 0.65; cursor: not-allowed; } .fin-choice-text { display: grid; gap: 2px; min-width: 0; } .fin-choice-label { font-weight: 600; overflow-wrap: anywhere; } .fin-choice-detail { font-size: 13px; overflow-wrap: anywhere; } .fin-confirm { margin-top: var(--sp-4); padding: var(--sp-4); border: 1px solid var(--warn); border-radius: var(--r-sm); background: rgba(245, 158, 11, 0.1); } .fin-confirm:focus { outline: 2px solid var(--warn); outline-offset: 2px; } .fin-confirm p { margin: 0; font-weight: 600; overflow-wrap: anywhere; } @media (max-width: 640px) { .fin-item { grid-template-columns: minmax(0, 0.7fr) minmax(0, 1fr) minmax(0, 1fr) 38px; grid-template-areas: "desc desc desc desc" "qty price sum remove"; } .fin-item-desc { grid-area: desc; } .fin-item-qty { grid-area: qty; } .fin-item-price { grid-area: price; } .fin-item-sum { grid-area: sum; text-align: right; } .fin-item-remove { grid-area: remove; } .fin-item ~ .fin-item .fin-item-label { position: static; width: auto; height: auto; margin: 0 0 4px; overflow: visible; clip: auto; white-space: normal; } .fin-dialog-row { grid-template-columns: minmax(0, 1fr); } .fin-tx-facts > div { grid-template-columns: minmax(0, 1fr); gap: 2px; } .fin-dialog-actions .ui-btn { flex: 1 1 auto; } .fin-toolbar .seg button { padding: 6px 9px; } } /* Finanzen: Einstellungen (Formular, Bankzugang, Fixkosten) */ .fin-fieldset { border: 0; padding: 0; margin: 0; min-width: 0; } .fin-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 var(--sp-4); } .fin-form-field { min-width: 0; } .fin-form-hint { font-size: 12px; overflow-wrap: anywhere; } .fin-field-error { font-size: 13px; font-weight: 600; color: var(--danger); overflow-wrap: anywhere; } .fin-input-amount { text-align: right; font-variant-numeric: tabular-nums; } .fin-counter { margin: -6px 0 var(--sp-3); text-align: right; font-size: 12px; color: var(--text-muted); font-variant-numeric: tabular-nums; } .fin-counter-over { color: var(--danger); font-weight: 700; } .fin-form-notice { margin: 0 0 var(--sp-3); } .fin-form-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); margin-top: var(--sp-3); } .fin-bank-facts { display: grid; gap: 6px; margin: 0 0 var(--sp-3); } .fin-bank-facts > div { display: grid; grid-template-columns: 170px minmax(0, 1fr); gap: var(--sp-3); align-items: baseline; } .fin-bank-facts dt { color: var(--text-muted); font-size: 13px; } .fin-bank-facts dd { margin: 0; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; } .fin-fixed-form { margin-bottom: var(--sp-4); padding: var(--sp-4); border: 1px solid var(--border-strong); border-radius: var(--r-sm); } .fin-fixed-form-title { margin: 0 0 var(--sp-3); font-size: 15px; font-weight: 700; } .fin-fixed-list { list-style: none; margin: 0; padding: 0; } .fin-fixed { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px var(--sp-4); align-items: baseline; padding: var(--sp-3) 0; border-bottom: 1px solid var(--border); } .fin-fixed:last-child { border-bottom: none; } .fin-fixed-off .fin-fixed-name, .fin-fixed-off .fin-fixed-amount { color: var(--text-muted); } .fin-fixed-main { display: flex; flex-wrap: wrap; align-items: center; gap: 6px var(--sp-2); min-width: 0; } .fin-fixed-name { font-weight: 700; overflow-wrap: anywhere; } .fin-fixed-amount { font-weight: 700; } .fin-fixed-meta { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 2px var(--sp-4); font-size: 13px; overflow-wrap: anywhere; } .fin-fixed-actions { grid-column: 1 / -1; padding-top: 4px; } @media (max-width: 640px) { .fin-form-grid { grid-template-columns: minmax(0, 1fr); } .fin-bank-facts > div { grid-template-columns: minmax(0, 1fr); gap: 2px; } } /* ===== KOMPAT (bis P10) ===== */ /* Uebergangsschicht: alte Klassen im neuen Look, damit Seiten und Dialoge, die noch nicht umgebaut sind, weiss, kastenlos */ /* und lesbar bleiben. Steht am Dateiende und gewinnt dort gegen die Altregeln und gegen die anderen Stylesheets (global.css */ /* wird zuletzt geladen). P10 loescht den ganzen Block. */ /* Abschnitt statt Karte (.ui-card*) */ .ui-card { background: none; border: 0; border-radius: 0; box-shadow: none; } .ui-card.pad { padding: 12px 0; } .ui-card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 12px 0 8px; } .ui-card-head h3 { margin: 0; font-size: 16px; line-height: 24px; font-weight: 600; } .ui-card-body { padding: 4px 0 12px; } /* Knoepfe (.ui-btn*) wie .btn / .btn-primary / .link-danger */ .ui-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 32px; padding: 0 12px; border: 0; border-radius: var(--radius); font-weight: 500; white-space: nowrap; text-decoration: none; cursor: pointer; background: var(--bg); color: var(--text); box-shadow: var(--ring); transition: background-color 0.12s, box-shadow 0.12s; } .ui-btn:hover { background: var(--bg-hover); } .ui-btn-primary { background: var(--accent); color: #fff; box-shadow: var(--shadow-btn); } .ui-btn-primary:hover { background: var(--accent-hover); } .ui-btn-danger { background: none; box-shadow: none; padding: 0 4px; color: var(--danger); } .ui-btn-danger:hover { background: none; text-decoration: underline; text-underline-offset: 3px; } .btn-dark, .btn-teal, .btn-green { background: var(--accent); color: #fff; box-shadow: var(--shadow-btn); } .btn-dark:hover, .btn-teal:hover, .btn-green:hover { background: var(--accent-hover); } /* Formular (.form-group, .form-label, .form-control) wie .field, Beschriftung und .input / .select / .textarea */ .form-group { margin-bottom: 16px; } .form-label { display: block; margin-bottom: 6px; font-weight: 500; } .form-control { display: block; width: 100%; height: 32px; padding: 0 10px; border: 0; border-radius: var(--radius); background: var(--bg); box-shadow: var(--ring); outline: none; transition: box-shadow 0.12s; min-width: 0; } .form-control::placeholder { color: var(--text-3); } .form-control:focus { box-shadow: 0 0 0 1px var(--accent), 0 0 0 4px var(--accent-ring); } .form-control[readonly] { background: var(--bg-subtle); } textarea.form-control { height: auto; min-height: 96px; padding: 8px 10px; resize: vertical; line-height: 20px; } select.form-control { padding-right: 28px; appearance: none; background-image: linear-gradient(45deg, transparent 50%, var(--text-2) 50%), linear-gradient(135deg, var(--text-2) 50%, transparent 50%); background-position: calc(100% - 14px) 14px, calc(100% - 10px) 14px; background-size: 4px 4px; background-repeat: no-repeat; } /* Abzeichen: .badge-*, .status-*, .priority-* auf die Badge-Toene (die Form kommt von .badge bzw. dem Inline-Stil) */ .badge-muted, .status-open { background: var(--grey-bg); color: var(--grey-fg); } .badge-info, .status-working { background: var(--blue-bg); color: var(--blue-fg); } .badge-warn, .status-awaiting { background: var(--orange-bg); color: var(--orange-fg); } .status-assigned { background: var(--violet-bg); color: var(--violet-fg); } .badge-ok { background: var(--green-bg); color: var(--green-fg); } .badge-danger, .priority-critical { background: var(--red-bg); color: var(--red-fg); } .status-closed { background: none; color: var(--text-2); } /* Alt-Dialoge: .overlay mit .overlay-content scrollt, wenn die Box hoeher ist als das Fenster. Geschrieben als :has(), */ /* damit die Grundregel .overlay des neuen Dialogs (.overlay > .dialog) einzigartig bleibt. Ohne Einblend-Animation wie bisher. */ .overlay:has(> .overlay-content) { overflow-y: auto; align-items: flex-start; padding: 24px 16px; background: var(--overlay); animation: none; } .overlay-content { width: 100%; max-width: 520px; margin: 0 auto; padding: 24px; background: var(--bg); color: var(--text); border-radius: 12px; box-shadow: var(--shadow-pop); } .overlay-content.fin-dialog { max-width: 760px; } .overlay-close { position: fixed; top: 16px; right: 16px; z-index: 1; display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border-radius: 50%; background: var(--bg); color: var(--text-2); box-shadow: var(--shadow-btn); font-size: 20px; line-height: 1; cursor: pointer; } .overlay-close:hover { color: var(--text); background: var(--bg-hover); } /* Reiter (Tabs.jsx): Unterstrich statt Kasten wie .tabs / .tab */ .ticket-tabs { display: flex; gap: 24px; margin-bottom: 16px; border-bottom: 1px solid var(--line); overflow-x: auto; scrollbar-width: none; } .ticket-tab { margin-bottom: -1px; padding: 8px 0 10px; border-bottom: 2px solid transparent; color: var(--text-2); font-weight: 500; white-space: nowrap; } .ticket-tab:hover { color: var(--text); } .ticket-tab-active, .ticket-tab-active:hover { border-bottom-color: var(--accent); color: var(--accent-ink); font-weight: 600; } .ticket-tab-content { min-height: 120px; } /* Umschalter */ .seg button.active { background: var(--bg); color: var(--text); box-shadow: 0 1px 2px rgba(26,31,54,.12), 0 0 0 1px rgba(26,31,54,.04); } /* Textfarben und Fehlerzeile (.text-white allein bekommt keine Regel) */ .bg-red { background: none; color: var(--red-fg); font-size: 13px; } .text-grey { color: var(--text-2); } .text-red { color: var(--red-fg); } /* Zaehler und Initiale der Altlisten: .side-count bis P6 (Chat-Liste), .side-logo bis P4 (Kundenliste) */ .side-count { margin-left: auto; font-size: 12px; font-weight: 500; color: var(--text-2); font-variant-numeric: tabular-nums; } .side-logo { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 32px; height: 32px; border-radius: var(--radius); background: var(--grey-bg); color: var(--grey-fg); font-weight: 600; } /* Neutral: Karte, Raster, Aufklappmenue */ .card { margin-bottom: 16px; background: none; border: 0; border-radius: 0; color: var(--text); } .card-header { padding: 0 0 8px; background: none; border-bottom: 1px solid var(--line); color: var(--text); font-weight: 600; } .card-body { padding: 12px 0; color: var(--text); } div.row { display: flex; flex-wrap: wrap; margin: 0 -8px; } .col { padding: 0 8px; } .col-6 { width: 50%; } @media (max-width: 768px) { .col-6 { width: 100%; } } .dropdown { position: relative; display: inline-block; width: 100%; text-align: center; } .dropdown .btn { width: 100%; padding: 0 8px; font-size: 12px; box-shadow: none; } .dropdown-content { display: none; position: absolute; left: 50%; transform: translateX(-50%); z-index: 100; min-width: 160px; background: var(--bg); border-radius: var(--radius); box-shadow: var(--shadow-pop); text-align: left; } .dropdown:hover .dropdown-content { display: block; } .dropdown-item { display: block; padding: 8px 16px; color: var(--text); cursor: pointer; } .dropdown-item:hover { background: var(--bg-hover); } /* Laden: neutraler grauer Ring */ .spinner { width: 40px; height: 40px; margin: 0 auto; border: 4px solid var(--line); border-top-color: var(--text-2); border-radius: 50%; animation: spin 1s linear infinite; } /* Verschachtelte Seiten: Abstand und Breite des inneren Rahmens entfallen */ .page .page { margin: 0; padding: 0; max-width: none; } /* Links in Bestandsklassen, die bisher --accent als Farbe nutzten: feiner Unterstrich */ .fin-link, .legal-files a, .credit-cols a, .area-rows a { text-decoration: underline; text-decoration-color: var(--line-strong); text-underline-offset: 3px; text-decoration-thickness: 1px; } .fin-link:hover, .legal-files a:hover, .credit-cols a:hover, .area-rows a:hover { text-decoration-color: currentColor; } /* ===== ENDE KOMPAT ===== */