@import "tailwindcss/base"; @import "tailwindcss/components"; @import "tailwindcss/utilities"; /* -------------------------------------------------------------------------- * * Minimal utilitarian dashboard. * Dark background, system sans for UI, monospace for data. * Status conveyed via borders and small badges, no gradients or shadows. * -------------------------------------------------------------------------- */ :root { --bg: #0f1115; --panel: #171a21; --panel-2: #1d2029; --border: #2a2f3a; --border-strong: #3a414f; --fg: #e6e9ef; --fg-bright: #ffffff; --muted: #8a93a4; --dim: #6b7280; --ok: #7dd3a0; --warn: #e8b764; --crit: #e56b6b; --offline: #6b7280; --link: #8fb4d9; --accent: var(--ok); --mono: ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, sans-serif; } html, body { background: var(--bg); color: var(--fg); font-family: var(--sans); font-size: 14px; line-height: 1.5; -webkit-font-smoothing: antialiased; margin: 0; } a { color: var(--link); text-decoration: none; } a:hover { text-decoration: underline; } code, pre, .mono { font-family: var(--mono); } h1, h2, h3 { font-weight: 600; color: var(--fg-bright); margin: 0; } h1 { font-size: 1.25rem; letter-spacing: -0.01em; } h2 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.12em; color: var(--muted); font-weight: 600; } h3 { font-size: 0.95rem; } hr { border: 0; border-top: 1px solid var(--border); margin: 0; } /* --- nav bar -------------------------------------------------------------- */ .nav { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0.7rem 1.2rem; border-bottom: 1px solid var(--border); background: var(--bg); font-size: 0.9rem; } .nav .brand { color: var(--fg-bright); font-weight: 600; letter-spacing: 0.03em; } .nav .links { display: flex; gap: 1.1rem; align-items: center; } .nav .links a { color: var(--muted); } .nav .links a.active, .nav .links a:hover { color: var(--fg-bright); text-decoration: none; } .nav .spacer { flex: 1; } .nav .signout { color: var(--muted); font-size: 0.85rem; } /* --- page container ------------------------------------------------------- */ .page { max-width: 1200px; margin: 0 auto; padding: 1.2rem; display: flex; flex-direction: column; gap: 1.2rem; } .page .pagehead { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; } .page .pagehead .sub { color: var(--muted); font-size: 0.85rem; font-family: var(--mono); } /* --- panel ---------------------------------------------------------------- */ .panel { background: var(--panel); border: 1px solid var(--border); border-radius: 2px; } .panel > header { padding: 0.55rem 0.9rem; border-bottom: 1px solid var(--border); color: var(--muted); font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.1em; display: flex; justify-content: space-between; align-items: center; } .panel > .body { padding: 0.9rem; } .panel > .body.tight { padding: 0; } /* --- table ---------------------------------------------------------------- */ .tbl { width: 100%; border-collapse: collapse; font-size: 0.85rem; } .tbl th, .tbl td { text-align: left; padding: 0.45rem 0.9rem; border-bottom: 1px solid var(--border); vertical-align: middle; } .tbl th { font-weight: 600; color: var(--muted); text-transform: uppercase; font-size: 0.72rem; letter-spacing: 0.08em; background: var(--panel-2); } .tbl td .mono, .tbl td.mono { font-family: var(--mono); color: var(--fg-bright); } .tbl tr:last-child td { border-bottom: none; } .tbl tr:hover td { background: var(--panel-2); } .tbl td.right { text-align: right; } .tbl td.num { font-variant-numeric: tabular-nums; font-family: var(--mono); } /* --- buttons / inputs ----------------------------------------------------- */ .btn { display: inline-flex; align-items: center; padding: 0.35rem 0.9rem; border: 1px solid var(--border-strong); background: var(--panel-2); color: var(--fg); font-family: var(--sans); font-size: 0.85rem; cursor: pointer; border-radius: 2px; line-height: 1.2; } .btn:hover { background: var(--border); color: var(--fg-bright); } .btn.primary { border-color: var(--ok); color: var(--ok); } .btn.primary:hover { background: rgba(125, 211, 160, 0.12); color: var(--ok); } .btn.danger { border-color: var(--crit); color: var(--crit); } .btn.danger:hover { background: rgba(229, 107, 107, 0.1); color: var(--crit); } .btn.ghost { border-color: transparent; background: transparent; color: var(--muted); } .btn.ghost:hover { color: var(--fg); background: var(--panel-2); } .btn.sm { padding: 0.15rem 0.5rem; font-size: 0.75rem; } .input { display: block; width: 100%; padding: 0.4rem 0.7rem; background: var(--bg); border: 1px solid var(--border-strong); color: var(--fg); font-family: var(--mono); font-size: 0.9rem; border-radius: 2px; outline: none; } .input:focus { border-color: var(--link); } .input::placeholder { color: var(--dim); } /* --- form rows ------------------------------------------------------------ */ .form-row { display: flex; gap: 0.5rem; align-items: stretch; } .form-row .input { flex: 1; } /* --- status badges / ampel ----------------------------------------------- */ .badge { display: inline-block; font-family: var(--mono); font-size: 0.7rem; letter-spacing: 0.08em; text-transform: uppercase; padding: 0.1rem 0.45rem; border-radius: 2px; border: 1px solid currentColor; } .badge[data-status="ok"], .status-ok { color: var(--ok); } .badge[data-status="warning"], .status-warn { color: var(--warn); } .badge[data-status="critical"], .status-crit { color: var(--crit); } .badge[data-status="offline"], .badge[data-status="never_connected"], .status-offline { color: var(--offline); } .badge[data-status="online"] { color: var(--ok); } /* --- host cards (overview grid) ----------------------------------------- */ .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 0.9rem; } .card { background: var(--panel); border: 1px solid var(--border); border-left: 3px solid var(--offline); border-radius: 2px; padding: 0.9rem; display: flex; flex-direction: column; gap: 0.5rem; cursor: pointer; text-decoration: none; color: inherit; } .card:hover { background: var(--panel-2); text-decoration: none; } .card[data-status="ok"] { border-left-color: var(--ok); } .card[data-status="warning"] { border-left-color: var(--warn); } .card[data-status="critical"] { border-left-color: var(--crit); } .card[data-status="offline"] { border-left-color: var(--offline); opacity: 0.7; } .card .name { font-family: var(--mono); font-weight: 600; color: var(--fg-bright); font-size: 1rem; } .card .seen { color: var(--muted); font-size: 0.75rem; } .card .stat { display: flex; justify-content: space-between; font-size: 0.8rem; } .card .stat .k { color: var(--muted); } .card .stat .v { font-family: var(--mono); color: var(--fg); } /* --- detail rows --------------------------------------------------------- */ .kv { display: grid; grid-template-columns: 140px 1fr; gap: 0.5rem 1rem; font-size: 0.85rem; } .kv dt { color: var(--muted); } .kv dd { margin: 0; font-family: var(--mono); color: var(--fg-bright); } .pool-row { display: flex; justify-content: space-between; padding: 0.45rem 0; border-bottom: 1px solid var(--border); gap: 0.8rem; font-size: 0.85rem; } .pool-row:last-child { border-bottom: none; } .pool-row .details { color: var(--muted); font-family: var(--mono); font-size: 0.78rem; } /* --- callouts ------------------------------------------------------------ */ .callout { border: 1px solid var(--border); border-left: 3px solid var(--warn); padding: 0.5rem 0.8rem; background: var(--panel-2); font-size: 0.85rem; color: var(--warn); font-family: var(--mono); word-break: break-all; } .callout.err { border-left-color: var(--crit); color: var(--crit); } .callout.ok { border-left-color: var(--ok); color: var(--ok); } /* --- utilities ----------------------------------------------------------- */ .muted { color: var(--muted); } .dim { color: var(--dim); } .stack { display: flex; flex-direction: column; gap: 0.9rem; } .stack.sm { gap: 0.45rem; } .row { display: flex; gap: 0.6rem; align-items: center; } .row.wrap { flex-wrap: wrap; } .right { margin-left: auto; } .center { text-align: center; } .empty { padding: 1.5rem; text-align: center; color: var(--muted); font-size: 0.85rem; } /* Login --------------------------------------------------------------------*/ .login { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; } .login .panel { width: 100%; max-width: 22rem; } .login .panel .body { padding: 1.2rem; display: flex; flex-direction: column; gap: 0.8rem; } .login .brand { color: var(--fg-bright); font-weight: 600; letter-spacing: 0.03em; font-size: 1rem; } /* Flash --------------------------------------------------------------------*/ .flash { padding: 0.5rem 1rem; border-left: 3px solid var(--warn); background: var(--panel-2); color: var(--warn); font-size: 0.85rem; margin: 0 1.2rem; } .flash.err { border-left-color: var(--crit); color: var(--crit); } .flash.info { border-left-color: var(--link); color: var(--link); }