* { 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; } .tab:focus-visible, .nav-item:focus-visible { outline-offset: -2px; } /* in Scroll-Containern (.tabs, .nav) wuerde der Ring sonst abgeschnitten */ /* ---------- 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); } .input[readonly], .textarea[readonly] { background: var(--bg-subtle); } .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); } .list-row-text { min-width: 0; overflow-wrap: anywhere; } 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:focus { outline: none; } .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; } @media (prefers-reduced-motion: reduce) { .overlay, .dialog { animation: none; } } .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%); visibility: hidden; transition: transform 0.18s ease-out, visibility 0s 0.18s; width: min(300px, 86vw); box-shadow: none; } .shell.menu-open .sidebar { transform: none; visibility: visible; transition-delay: 0s; 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; } @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; } /* --- 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; } /* 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 > .input { display: block; width: 100%; } .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: var(--orange-fg); 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. Overlay, Box und Schliessknopf kommen aus KOMPAT (.overlay:has(> .overlay-content), */ /* .overlay-content, .overlay-close); hier nur, was dort fehlt. */ .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-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: var(--red-bg); color: var(--red-fg); overflow-wrap: anywhere; } .fin-dialog-warn { margin: 6px 0 0; font-size: 13px; color: var(--orange-fg); 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: var(--orange-fg); } .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: var(--red-fg); border-color: var(--red-fg); } .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; } } /* ===== Tickets (P2) ===== */ /* Arbeitsblatt-Zeilen, Zeilenlinks, Nachladen und Unterstuetzungs-Zeile. Steht direkt vor KOMPAT: gewinnt ueber die Bausteinregeln */ /* oberhalb durch die Reihenfolge, nie durch eine Erzwingung. */ /* ---------- Arbeitsblaetter ---------- */ .ws { padding: 16px 0; border-bottom: 1px solid var(--line); display: grid; grid-template-columns: 148px minmax(0, 1fr) auto; gap: 4px 24px; } .ws:first-of-type { border-top: 1px solid var(--line); } .ws-when { color: var(--text-2); font-size: 13px; line-height: 20px; } .ws-when .d { color: var(--text); font-weight: 500; font-size: 14px; } .ws-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .ws-head .who { font-weight: 600; overflow-wrap: anywhere; } .ws-text { color: var(--text); margin-top: 4px; max-width: 640px; white-space: pre-wrap; overflow-wrap: anywhere; } .ws-support { margin-top: 8px; font-size: 13px; color: var(--text-2); overflow-wrap: anywhere; } .ws-acts { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 8px; font-size: 13px; } .ws-time { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } .ws-time .t { font-weight: 600; } .ws.comment .ws-text { color: var(--text-2); } button.link, .abo-toggle { background: none; border: 0; padding: 0; font: inherit; cursor: pointer; } button.link { font-weight: 500; } /* font: inherit setzt sonst das Gewicht von .link zurueck */ .abo-toggle { font-size: 12px; font-weight: 500; color: var(--text-2); } .abo-toggle:hover { color: var(--text); } .abo-toggle.on { color: var(--blue-fg); } /* ---------- Zeilenlinks, Nachladen, Suche ---------- */ .row-link { display: inline-flex; align-items: baseline; gap: 8px; min-width: 0; color: inherit; overflow-wrap: anywhere; } /* Die Nummer bleibt eine Zeile; nur der Betreff darf umbrechen (sonst schrumpft .id auf ein Zeichen) */ .row-link .id { flex: none; white-space: nowrap; } .table td .cell-sub { overflow-wrap: anywhere; } /* Auf der markierten Zeile (--bg-subtle) reicht das helle Grau von .id und .faint nicht fuer den Kontrast */ .table tr.row:hover .id, .table tr.row:hover .faint { color: var(--text-2); } .list-more { display: flex; justify-content: center; padding: 8px 0 24px; } /* Der lange Platzhalter wird am Handy mit "…" gekuerzt statt hart abgeschnitten */ .toolbar .search { text-overflow: ellipsis; } @media (min-width: 861px) { .toolbar .search { width: 400px; } } /* ---------- Unterstuetzung im Dialog ---------- */ .supporter-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px 12px; align-items: center; margin-top: 8px; } .supporter-row .sup-meta { grid-column: 1 / -1; display: flex; justify-content: space-between; align-items: center; font-size: 13px; color: var(--text-2); } /* Kaestchen im Dialog stehen in einer Spalte (flex): ohne das waere die ganze Zeile klickbar */ .dialog-body > .check, .supporters-editor > .check { align-self: flex-start; } @media (max-width: 860px) { .ws { grid-template-columns: minmax(0, 1fr) auto; } .ws-when { grid-column: 1 / -1; display: flex; gap: 8px; } .supporter-row { grid-template-columns: minmax(0, 1fr); } } /* ===== ENDE Tickets (P2) ===== */ /* ===== Planboard (P3) ===== */ /* Woche ohne Karten: sieben Tagesspalten mit feinen Trennlinien, Wochenende hell abgesetzt, heute als schwarze Datumspille */ .week { display: grid; grid-template-columns: repeat(7, minmax(128px, 1fr)); border-top: 1px solid var(--line); min-height: 420px; overflow-x: auto; } .day { border-left: 1px solid var(--line); padding: 10px 8px 16px; min-width: 0; } .day:first-child { border-left: 0; padding-left: 0; } .day-head { display: flex; align-items: baseline; gap: 6px; margin-bottom: 12px; padding-left: 4px; flex-wrap: wrap; row-gap: 0; } .day-head .wd { font-size: 12px; color: var(--text-2); font-weight: 500; text-transform: uppercase; letter-spacing: 0.04em; } .day-head .dn { font-size: 18px; font-weight: 600; font-variant-numeric: tabular-nums; } .day.today .wd { color: var(--text); } .day.today .dn { background: var(--accent); color: #fff; border-radius: 99px; padding: 0 8px; } .day.weekend { background: var(--bg-subtle); } .appt { display: block; padding: 8px 10px; border-radius: var(--radius); background: var(--bg-hover); margin-bottom: 6px; font-size: 13px; line-height: 18px; overflow-wrap: anywhere; } .appt:hover { background: var(--appt-hover); } .appt .tm { font-weight: 600; font-variant-numeric: tabular-nums; } .appt .tt { color: var(--text); margin-top: 2px; } .appt .cu { color: var(--text-2); margin-top: 2px; } .appt.akquise { background: var(--appt-akquise); } .appt.akquise:hover { background: var(--appt-akquise-hover); } .appt:focus-visible { outline-offset: -2px; } /* im Scroll-Container .week wuerde der Ring sonst abgeschnitten */ .day.weekend .appt:not(.akquise) { background: var(--bg); } .day.weekend .appt:not(.akquise):hover { background: var(--appt-hover); } .day .none { font-size: 12px; color: var(--text-2); padding-left: 4px; } /* Ab 861 px stehen die Spalten nebeneinander: Wochentag ueber der Datumszahl, in jeder Spalte gleich hoch, alle Termine beginnen auf einer Hoehe */ @media (min-width: 861px) { .day-head { flex-direction: column; align-items: flex-start; gap: 0; } } @media (max-width: 860px) { .week { grid-template-columns: 1fr; border-top: 0; min-height: 0; overflow-x: visible; } .day { border-left: 0; padding: 12px 0; border-top: 1px solid var(--line); } .day.weekend { background: none; } .day.weekend .appt:not(.akquise) { background: var(--bg-hover); } } /* ===== ENDE Planboard (P3) ===== */ /* ===== Kunden (P4) ===== */ /* Die Prototypregel .kv .input gilt nur fuer einzeilige Felder */ .kv .textarea { width: 100%; max-width: 360px; } /* Wertetabellen mit Feldern: Beschriftung und Feld teilen die Grundlinie (Textfeld: erste Zeile) */ .kunde-kv { align-items: baseline; } /* Mehrzeiliges Feld: die Beschriftung steht auf Hoehe der ersten Zeile (Innenabstand des Textfelds), nicht an seiner Unterkante */ @media (min-width: 861px) { .kunde-kv .kunde-kv-oben { align-self: start; padding-top: 8px; } } /* Uebersicht: unter der Wertetabelle kommen das Kaestchen "Wichtiger Kunde" und die Knopfzeile */ .kv + .check { margin-top: 16px; } .kv ~ .toolbar { margin-top: 16px; } .kunde-hinweis { margin-bottom: 12px; } /* Abzeichen unter dem Namen: Abstand zum Folgenden, oben buendig (sonst waechst die Zeile um 1 px) */ .kunde-sub .badge { margin-right: 8px; vertical-align: top; } /* Reiter "Abo & Angebote": Abstand zwischen Abo-Status und Angeboten (der Umschlag ist ein div, .page section + section greift dort nicht) */ .kunde-abo-angebote { margin-top: 36px; } /* Reiter "Funktionen": eine Tabelle, je Projekt eine Gruppenzeile; Bestaetigung und Panels sind Zusatzzeilen direkt unter der Funktionszeile */ .funktionen-group th { text-align: left; font-size: 14px; font-weight: 600; color: var(--text); padding-top: 20px; overflow-wrap: anywhere; white-space: normal; } .funktionen-group .link { font-size: 13px; font-weight: 400; margin-left: 8px; } .funktionen-sitekey { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; margin-top: 4px; } .funktionen-sitekey code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; overflow-wrap: anywhere; user-select: all; } .funktionen-actions { display: flex; flex-wrap: wrap; gap: 4px 14px; } .funktionen-confirm td { padding-top: 0; } .funktionen-note { width: 100%; max-width: 260px; } /* Zeilen einer Gruppe (Funktionszeile, Bestaetigung, Panels): nur die letzte behaelt die Haarlinie */ .funktionen-offen td { border-bottom: 0; } .funktionen-extra td { padding-top: 0; } .funktionen-panel { display: flex; flex-direction: column; gap: 8px; padding: 12px 16px; background: var(--bg-subtle); border-radius: var(--radius); } .funktionen-panel-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; } .funktionen-panel-warnungen { margin: 0; padding-left: 18px; } .funktionen-panel-abschnitt { border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg); min-width: 0; } .funktionen-panel-abschnitt > summary { padding: 8px 12px; cursor: pointer; font-weight: 600; } .funktionen-panel-abschnitt pre { margin: 0; padding: 10px 12px; border-top: 1px solid var(--line); max-width: 100%; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; user-select: text; } /* Oeffnungszeiten live (Panel unter der Funktionszeile): Team-Formular und Ersatz-HTML */ .funktionen-panel-form { display: flex; flex-direction: column; gap: 8px; } .funktionen-panel-feld { display: flex; flex-direction: column; gap: 4px; max-width: 520px; } .funktionen-panel-html { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; min-height: 120px; } .funktionen-zustimmung { display: flex; align-items: flex-start; gap: 8px; cursor: pointer; } .funktionen-zustimmung input { flex: none; margin-top: 3px; width: 15px; height: 15px; accent-color: var(--accent); } .funktionen-vorlage summary { cursor: pointer; } .funktionen-vorlage p { margin: 6px 0; white-space: pre-wrap; } .funktionen-msg { margin-top: 12px; } /* Webshop-Anfrage je Projekt unter der Tabelle: ein Block je Eintrag, dazwischen eine Haarlinie */ .funktionen-shop { display: flex; flex-direction: column; gap: 8px; margin-top: 24px; } .funktionen-shop + .funktionen-shop { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--line); } .funktionen-shop dd { white-space: pre-wrap; } .funktionen-begruendung { width: 100%; max-width: 560px; } @media (min-width: 861px) { .funktionen-shop .kv { grid-template-columns: max-content minmax(0, 1fr); } } /* Handy: Kopf nur fuer Screenreader, jede Funktionszeile als zwei Spalten (Name | Status, Ticket, Aktionen untereinander) */ @media (max-width: 860px) { .funktionen-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } .funktionen-table, .funktionen-table tbody, .funktionen-table tr, .funktionen-table td, .funktionen-table th { display: block; } .funktionen-table .funktionen-zeile { display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: 4px 12px; padding: 12px 0; border-bottom: 1px solid var(--line); } .funktionen-table .funktionen-zeile.funktionen-offen { border-bottom: 0; } .funktionen-zeile > td { grid-column: 2; min-width: 0; padding: 0; border-bottom: 0; } .funktionen-zeile > td:first-child { grid-column: 1; grid-row: 1; } .funktionen-zeile > td:empty, .funktionen-zeile > .funktionen-ohne-ticket { display: none; } .funktionen-confirm td { padding-bottom: 12px; } .funktionen-extra td { padding-bottom: 12px; } } /* ===== ENDE Kunden (P4) ===== */ /* ===== Projekte (P5) ===== */ /* Projektliste als Tabelle, Dialog-Inhalte, Preview-Block, Projektzeile am Ticket und beim Kunden, Zuordnen-Assistent. Steht direkt vor */ /* KOMPAT: gewinnt ueber die Bausteinregeln oberhalb durch die Reihenfolge, nie durch eine Erzwingung. */ button.link { text-align: left; } /* Reset und Gewicht von button.link stehen im Block Tickets (P2) */ /* ---------- Projektliste (Tabelle) ---------- */ .projects-table td:first-child { min-width: 140px; } .projects-table th, .projects-table td { padding-right: 8px; } .projects-table th:last-child, .projects-table td:last-child { padding-right: 0; } .projects-table .cell-title .link, .projects-table .cell-sub { overflow-wrap: anywhere; } .projects-table td.num { min-width: 64px; overflow-wrap: anywhere; } /* Ticket ohne Eintrag in der Ticketliste zeigt die lange $id: sie bricht um, die Tabelle waechst nicht ueber den Rahmen; 64 px halten 6-stellige Nummern in einer Zeile */ .projects-table .select { width: clamp(104px, 10vw, 180px); max-width: 100%; } .projects-table td.cell-address code { display: block; max-width: 84px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; } .projects-table td.cell-updated { min-width: 70px; } .projects-table tr.is-archived td { opacity: .72; } .projects-table tr.is-archived .faint { color: var(--text-2); } /* mit opacity .72 fiele das helle Grau von .faint unter 3:1 (Muster: .table tr.row:hover .faint) */ .row-actions { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px; font-size: 13px; } /* Links (a) und Textknoepfe (button) auf einer Zeile; ohne baseline sitzt ein button.link-danger in einer hoeheren Zeile mittig statt oben */ .row-actions .link { white-space: nowrap; } .projects-table .row-actions { justify-content: flex-end; } /* Unter 860 px steht jede Zeile als zweispaltiges Raster: Projekt ueber beide Spalten, Kunde und Status nebeneinander, Aktionen darunter. */ /* Rollen (table, row, cell) stehen im JSX, damit die Tabellensemantik beim Stapeln erhalten bleibt. */ @media (max-width: 860px) { .projects-table, .projects-table tbody, .projects-table td { display: block; } .projects-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } /* nur fuer Screenreader */ .projects-table tbody tr { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 12px; padding: 14px 0; border-bottom: 1px solid var(--line); } .projects-table td { padding: 0; border: 0; } .projects-table td:first-child, .projects-table td.cell-actions { grid-column: 1 / -1; } .projects-table td[data-label]::before { content: attr(data-label); display: block; font-size: 12px; color: var(--text-2); } .projects-table .select { width: 100%; } .projects-table .row-actions { justify-content: flex-start; } .projects-table tr.row:hover td, .projects-table tr.row:hover td:first-child, .projects-table tr.row:hover td:last-child { background: none; box-shadow: none; } /* (0,2,1) schlaegt .hide-sm (0,1,0) und .projects-table td { display: block } (0,1,1) ueber die Spezifitaet, ohne Erzwingung */ .projects-table td.hide-sm, .projects-table td.hide-md { display: none; } } .badge.wrap { white-space: normal; height: auto; min-height: 20px; padding-top: 2px; padding-bottom: 2px; overflow-wrap: anywhere; } /* ---------- Dialog-Inhalte ---------- */ .dialog-form { display: flex; flex-direction: column; gap: 16px; } /* Textvorlage der Analyse-Zustimmung (details im Dialog): Zeiger wie vorher, Abstaende statt Aussenabstaende im JSX, die Vorlage enthaelt lange Adressen ohne Leerzeichen */ .dialog-body details > summary { cursor: pointer; } .dialog-body details[open] > summary { margin-bottom: 8px; } .dialog-body details > .prose { margin-bottom: 8px; overflow-wrap: anywhere; } /* ---------- Preview-Block (im Projekt-Dialog, am Ticket und beim Kunden) ---------- */ .pv-block { font-size: 13px; display: flex; flex-direction: column; gap: 10px; } .pv-row, .pv-add, .pv-var { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } .pv-var { padding-bottom: 8px; border-bottom: 1px solid var(--line); } .pv-mode { width: 200px; max-width: 100%; } .pv-title { font-size: 13px; font-weight: 600; } .pv-block .msg { overflow-wrap: anywhere; } /* Fehlertexte des Runners enthalten lange Pfade ohne Leerzeichen */ .pv-log { background: var(--bg-subtle); max-height: 260px; overflow: auto; white-space: pre-wrap; word-break: break-all; padding: 8px; border-radius: var(--radius); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; line-height: 16px; } .pv-var code, .pv-var .input, .pv-add .input { flex: 1 1 140px; min-width: 0; } .pv-var code { overflow-wrap: anywhere; } /* ---------- Projektzeile am Ticket und beim Kunden ---------- */ /* Spalte mit Abstand statt Aussenabstaenden an den Kindern: ein offener Dialog (fest, ausserhalb des Flusses) bekaeme sonst einen Versatz */ .proj-item { padding: 16px 0; border-bottom: 1px solid var(--line); display: flex; flex-direction: column; gap: 8px; } .proj-item > button.link { align-self: flex-start; } /* sonst waere der ganze Streifen klickbar */ .proj-head { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px 16px; } .proj-main { min-width: 0; overflow-wrap: anywhere; } .proj-meta { display: flex; flex-wrap: wrap; gap: 4px 16px; font-size: 12px; color: var(--text-2); } .ticket-projects-assign { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 12px; } .ticket-projects-assign .select { flex: 1 1 220px; min-width: 0; } .ticket-projects-assign .input { flex: 1 1 160px; min-width: 0; } /* ---------- Zuordnen-Assistent ---------- */ .seg.wrap { flex-wrap: wrap; } .row-buttons { display: flex; flex-wrap: wrap; gap: 8px; } .check.top { align-items: flex-start; } .pick-list { max-height: 360px; overflow-y: auto; } .pick-empty { padding: 12px 0; } button.list-row { width: 100%; text-align: left; background: none; border: 0; border-bottom: 1px solid var(--line); font: inherit; color: inherit; cursor: pointer; } button.list-row:hover, button.list-row[aria-pressed="true"] { background: var(--bg-hover); } button.list-row .cell-sub { display: block; } button.list-row:focus-visible { outline-offset: -2px; } /* in .pick-list (Scroll-Container) wuerde der Ring sonst abgeschnitten */ .summary { list-style: none; display: flex; flex-direction: column; gap: 6px; } /* Inhalt eines Schritts als Spalte mit Abstand (der Reset setzt jeden Aussenabstand auf 0); Segment und Haken bleiben so breit wie ihr Inhalt */ .assign-step { display: flex; flex-direction: column; gap: 12px; } .assign-step > .seg, .assign-step > .check { align-self: flex-start; } .page .assign-step .field { margin-bottom: 0; } /* KOMPAT gibt .page .field 12 px unten; hier steht der Abstand der Spalte (P10 loescht beide) */ button.list-row:hover .faint, button.list-row[aria-pressed="true"] .faint { color: var(--text-2); } /* .faint hat auf --bg-hover nur 2,9:1 (Muster: .table tr.row:hover .faint) */ /* ---------- Services ---------- */ /* Beschreibung, Funktions-Badges und Zeilen einer Art als Spalte mit Abstand (der Reset setzt jeden Aussenabstand auf 0); auch Fehlermeldung plus Knopf */ .services-stack { display: flex; flex-direction: column; gap: 12px; } .services-stack > .pick-empty { padding: 0; } /* der Abstand kommt aus gap */ /* ===== ENDE Projekte (P5) ===== */ /* ===== Kunden-Unterseiten (P6) ===== */ /* Kleine Ergaenzungen fuer Gutschriften, Angebote und E-Mail-Speicher. Steht direkt vor KOMPAT: gewinnt bei gleicher Spezifitaet */ /* ueber die Bausteinregeln oberhalb durch die Reihenfolge, nie durch eine Erzwingung. */ /* table-wrap gilt nur fuer die drei P6-Tabellen: lange Namen, Domains und Anbieter brechen statt die Seite zu verbreitern */ .table.table-wrap td { overflow-wrap: anywhere; } /* Die aufgeklappte Gutschrift liegt auf --bg-subtle; die Zeilen sind nicht klickbar, daher kein tr.row */ .table tr[aria-current="true"] td { background: var(--bg-subtle); } /* Aktionszeile in der letzten Zelle (button.link / .link-danger); ersetzt das gestrichene .mt-1. Nur fuer das div: P5 nutzt */ /* td.cell-actions als Zellenmarker der Projektliste (display bleibt table-cell), die Klasse darf dort kein Flex setzen. */ div.cell-actions { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 6px; } /* Dialogfuss bricht um, wenn Knoepfe und Hinweis nicht in eine Zeile passen (Handy) */ .dialog-foot { flex-wrap: wrap; } /* Eine lange Knopfbeschriftung (Wortlaut bleibt, z. B. "Angebot anlegen und aufs laufende Abo anwenden") bricht im Dialogfuss um, */ /* statt ihn zu verbreitern: .btn ist nowrap, Umbrechen der Zeile allein reicht nicht. Einzeilig bleibt der Knopf 32 px hoch. */ .dialog-foot .btn { white-space: normal; height: auto; min-height: 32px; padding-top: 6px; padding-bottom: 6px; text-align: center; } /* deckt auch verschachtelte Felder, P7 prueft die Regel */ .autocomplete .input { width: 100%; } /* ===== ENDE Kunden-Unterseiten (P6) ===== */ /* ===== 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 { background: var(--accent); color: #fff; box-shadow: var(--shadow-btn); } .btn-dark:hover, .btn-teal: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[aria-invalid="true"]:focus, .form-control.is-invalid:focus { box-shadow: 0 0 0 1px var(--danger), 0 0 0 4px var(--danger-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; } /* Bausteine .input / .select / .textarea direkt im Altcontainer .form-group fuellen die Breite wie frueher .form-control (in .field tut das schon die Spalte) */ .form-group > .input, .form-group > .select, .form-group > .textarea { display: block; width: 100%; } /* 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); } /* 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 der Altliste: .side-count bis P6 (Chat-Liste) */ .side-count { margin-left: auto; font-size: 12px; font-weight: 500; color: var(--text-2); font-variant-numeric: tabular-nums; } /* Neutral: Karte, Raster */ .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%; } } /* 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; } /* Abschnitte (Card =
) als Spalten nebeneinander: der Abstand .page section + section gilt nur fuer untereinander stehende Abschnitte */ .legal-grid > section + section, .fin-cols > section + section, .page div[style*="display: grid"] > section + section { margin-top: 0; } /* Altformulare mit (Kunde, Projekt zuweisen, Neuer Lead): Zeilenabstand wie frueher; neue Container bestimmen ihren Abstand selbst */ .page .field { margin-bottom: 12px; } .dialog-body .field, .field-row .field, .field-row-3 .field, .kv .field { margin-bottom: 0; } /* Kennzahlen nebeneinander (LiquidityHead), bis P7 sie ersetzt */ .kpi-grid { display: flex; flex-wrap: wrap; gap: 48px; } /* ===== ENDE KOMPAT ===== */