/* Catppuccin Mocha — dieselbe Palette wie das eingebaute Terminal. Die App verwaltet Terminals; sie spricht deren visuelle Sprache. */ :root { --base: #1e1e2e; --mantle: #181825; --crust: #11111b; --surface0: #313244; --surface1: #45475a; --surface2: #585b70; --text: #cdd6f4; --subtext: #a6adc8; --overlay: #6c7086; --green: #a6e3a1; --red: #f38ba8; --blue: #89b4fa; --peach: #fab387; --lavender: #b4befe; --mauve: #cba6f7; --mono: "JetBrains Mono", Menlo, monospace; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-size: 14px; color: var(--text); background: var(--base); color-scheme: dark; } * { box-sizing: border-box; } body { margin: 0; } /* ---------- Header ---------- */ header { display: flex; align-items: center; gap: 1.5rem; padding: 0.85rem 1.5rem; background: var(--mantle); border-bottom: 1px solid var(--surface0); } h1 { font-family: var(--mono); font-size: 0.9rem; font-weight: 500; letter-spacing: 0.03em; color: var(--lavender); margin: 0; } nav, .lang { display: flex; gap: 2px; padding: 2px; background: var(--crust); border-radius: 8px; } nav button, .lang button { background: transparent; border: none; border-radius: 6px; color: var(--subtext); padding: 0.3rem 0.9rem; } .lang button { font-family: var(--mono); font-size: 0.7rem; padding: 0.3rem 0.55rem; } nav button:hover, .lang button:hover { background: var(--surface0); color: var(--text); } nav button.active, .lang button.active { background: var(--surface0); color: var(--text); } .header-right { margin-left: auto; display: flex; align-items: center; gap: 1.25rem; } header .autostart { display: flex; align-items: center; gap: 0.4rem; color: var(--subtext); cursor: pointer; } input[type="checkbox"] { padding: 0; accent-color: var(--mauve); } main { padding: 1.5rem; } /* ---------- Controls ---------- */ button, select, input { font: inherit; color: var(--text); background: var(--surface0); border: 1px solid var(--surface1); border-radius: 7px; padding: 0.4rem 0.8rem; } button { cursor: pointer; background: transparent; color: var(--subtext); } button:hover:not(:disabled) { background: var(--surface0); color: var(--text); } button:disabled { opacity: 0.5; cursor: default; } button:focus-visible, select:focus-visible, input:focus-visible { outline: 2px solid var(--lavender); outline-offset: 1px; } button.primary { background: var(--blue); border-color: var(--blue); color: var(--crust); font-weight: 500; } button.primary:hover:not(:disabled) { background: var(--lavender); border-color: var(--lavender); color: var(--crust); } button.start { background: var(--green); border-color: var(--green); color: var(--crust); font-weight: 500; width: 6.5rem; } button.start:hover:not(:disabled) { background: #b8ecb3; color: var(--crust); } button.stop { background: var(--red); border-color: var(--red); color: var(--crust); font-weight: 500; width: 6.5rem; } button.stop:hover:not(:disabled) { background: #f6a3bb; color: var(--crust); } button.danger { color: var(--red); border-color: color-mix(in srgb, var(--red) 40%, transparent); } button.danger:hover:not(:disabled) { background: color-mix(in srgb, var(--red) 12%, transparent); color: var(--red); } .row-actions { display: inline-flex; align-items: stretch; gap: 0.4rem; } button.gear { display: inline-flex; align-items: center; justify-content: center; width: 2.3rem; padding: 0; font-size: 1.2rem; line-height: 1; } .toolbar { display: flex; gap: 0.6rem; margin-bottom: 1.5rem; } /* ---------- Tabellen ---------- */ table.grid { width: 100%; table-layout: fixed; border-collapse: collapse; } col.col-dot { width: 2.25rem; } col.col-pool { width: 12rem; } col.col-actions { width: 15rem; } col.col-actions-wide { width: 19rem; } col.col-type { width: 7rem; } col.col-projects { width: 10rem; } th { text-align: left; font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--overlay); padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--surface0); } td { padding: 0.8rem 0.75rem; border-bottom: 1px solid color-mix(in srgb, var(--surface0) 45%, transparent); vertical-align: middle; } tbody tr:hover { background: color-mix(in srgb, var(--mantle) 60%, transparent); } .cell-name strong { font-family: var(--mono); font-size: 0.85rem; font-weight: 500; } .cell-name small { display: block; font-family: var(--mono); font-size: 0.7rem; color: var(--overlay); margin-top: 0.2rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .cell-actions { text-align: right; white-space: nowrap; } td select { width: 100%; } /* Status-Punkt: leuchtet nur, wenn eine Session läuft. */ .dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; background: transparent; } .dot.on { background: var(--green); box-shadow: 0 0 8px color-mix(in srgb, var(--green) 70%, transparent); } /* ---------- Pools ---------- */ .badge { display: inline-block; font-family: var(--mono); font-size: 0.7rem; padding: 0.15rem 0.6rem; border-radius: 999px; border: 1px solid var(--surface1); color: var(--subtext); } .badge.oauth { border-color: color-mix(in srgb, var(--green) 40%, transparent); color: var(--green); } .badge.apikey { border-color: color-mix(in srgb, var(--peach) 40%, transparent); color: var(--peach); } /* Zugeordnete Projekte: Anzahl in der Zeile, Liste im Hover. */ .assigned { position: relative; color: var(--subtext); font-size: 0.8rem; cursor: default; border-bottom: 1px dotted var(--surface2); padding-bottom: 1px; } .assigned .pop { display: none; position: absolute; top: calc(100% + 8px); left: 0; z-index: 20; min-width: 13rem; flex-direction: column; gap: 0.4rem; background: var(--crust); border: 1px solid var(--surface1); border-radius: 9px; padding: 0.7rem 0.9rem; box-shadow: 0 12px 32px rgba(0, 0, 0, 0.55); } .assigned:hover .pop { display: flex; } .pop-item { font-family: var(--mono); font-size: 0.8rem; line-height: 1.4; color: var(--text); white-space: nowrap; } .empty { color: var(--overlay); } .error { color: var(--red); white-space: pre-wrap; } /* ---------- Dialoge ---------- */ .overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.55); backdrop-filter: blur(3px); display: flex; align-items: center; justify-content: center; z-index: 10; } .dialog { display: flex; flex-direction: column; gap: 0.9rem; background: var(--mantle); border: 1px solid var(--surface0); border-radius: 12px; padding: 1.75rem 2rem; min-width: 26rem; max-width: 34rem; box-shadow: 0 18px 50px rgba(0, 0, 0, 0.5); } .dialog h3 { margin: 0; font-size: 1rem; } .dialog p { margin: 0; line-height: 1.5; color: var(--subtext); } .dialog .hint { color: var(--overlay); font-size: 0.85rem; } .hint.busy { color: var(--blue); } .dialog .field { display: grid; grid-template-columns: 6rem 1fr; align-items: center; gap: 0.75rem; color: var(--subtext); font-size: 0.85rem; } .icon-row { display: flex; align-items: center; gap: 0.5rem; } .icon-path { font-family: var(--mono); color: var(--overlay); font-size: 0.75rem; word-break: break-all; } .dialog .pools { display: flex; align-items: center; gap: 0.6rem; margin: 0.25rem 0; } .chip { font-family: var(--mono); font-size: 0.8rem; background: var(--surface0); border: 1px solid var(--surface1); border-radius: 999px; padding: 0.2rem 0.7rem; } .chip.new { border-color: var(--blue); color: var(--blue); } .arrow { color: var(--overlay); } .dialog .actions { display: flex; justify-content: flex-end; gap: 0.6rem; margin-top: 0.75rem; } /* ---------- Formulare (Pools-Dialoge) ---------- */ form.dialog input { width: 100%; }