/* * ipswap-specific styles. * * apointless.css is vendored verbatim from bsncubed/css and must not be edited * here — re-pull it to update. This file adds only what the design system does * not ship (page chrome, tables, modals, stat tiles) and is built strictly on * its tokens, so a refreshed apointless.css restyles this too. */ /* ------------------------------------------------------------- layout --- */ .topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; padding: 14px 24px; background: var(--surface-1); border-bottom: 1px solid var(--border); } .brand { display: flex; align-items: baseline; gap: 10px; } .brand .version { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-faint); } .page { max-width: 1080px; margin: 0 auto; padding: 24px 24px 72px; } .row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; } .stack { display: flex; flex-direction: column; gap: 16px; } .section-head { display: flex; align-items: center; gap: 10px; margin: 24px 0 10px; } .muted { color: var(--text-muted); } .faint { color: var(--text-faint); font-size: 0.82rem; } /* --------------------------------------------------------- stat tiles --- */ .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; margin-bottom: 20px; } .stat { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 14px 16px; } .stat .label { display: block; margin-bottom: 4px; color: var(--text-faint); font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.06em; text-transform: uppercase; } .stat .value { font-family: var(--font-mono); font-size: 1.05rem; overflow-wrap: anywhere; } /* ------------------------------------------------------------- tables --- */ /* Wide content scrolls inside its own container so the page body never does. */ .table-scroll { overflow-x: auto; } table { width: 100%; border-collapse: collapse; } th { padding: 9px 14px; text-align: left; border-bottom: 1px solid var(--border-strong); color: var(--text-faint); font-family: var(--font-mono); font-size: 0.68rem; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase; white-space: nowrap; } td { padding: 11px 14px; border-bottom: 1px solid var(--border); vertical-align: middle; font-size: 0.88rem; } tbody tr:last-child td { border-bottom: none; } tbody tr:hover { background: var(--surface-2); } /* The row whose preset is currently live. */ tbody tr.is-active { background: var(--accent-soft); } tbody tr.is-active:hover { background: var(--accent-soft); } td.addr { font-family: var(--font-mono); font-size: 0.82rem; white-space: nowrap; } td.actions { text-align: right; white-space: nowrap; } td.actions .btn + .btn { margin-left: 6px; } /* -------------------------------------------------------------- forms --- */ .field { margin-bottom: 14px; } .field-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 14px; } .check { display: flex; align-items: center; gap: 9px; margin-bottom: 12px; } .check input { accent-color: var(--accent); width: 16px; height: 16px; } .check label { margin: 0; text-transform: none; letter-spacing: 0; font-family: var(--font-sans); font-size: 0.88rem; } select.input { font-family: var(--font-sans); } .sec-row { display: flex; gap: 8px; align-items: center; margin-bottom: 8px; } .sec-row .input { flex: 1; } .sec-row .input.narrow { flex: 0 0 150px; } /* ------------------------------------------------------------- modals --- */ dialog { padding: 0; border: 1px solid var(--border-strong); border-radius: var(--radius-lg); background: var(--surface-1); color: var(--text); box-shadow: var(--shadow); width: min(720px, 94vw); } dialog::backdrop { background: rgba(0, 0, 0, 0.62); } .modal-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 18px; border-bottom: 1px solid var(--border); } .modal-body { padding: 18px; max-height: 68vh; overflow-y: auto; } .modal-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 14px 18px; border-top: 1px solid var(--border); } /* ------------------------------------------------------------- alerts --- */ /* apointless.css ships error/warn/info but no success variant. */ .alert-ok { background: var(--ok-soft); border-color: rgba(34, 197, 94, 0.3); color: var(--ok); } .alert + .alert { margin-top: 8px; } #alerts:not(:empty) { margin-bottom: 16px; } /* -------------------------------------------------------------- misc --- */ .empty { padding: 36px 18px; text-align: center; color: var(--text-faint); } .busy { display: inline-flex; align-items: center; gap: 8px; color: var(--text-muted); font-size: 0.85rem; } @media (max-width: 640px) { .page { padding: 16px 14px 56px; } .topbar { padding: 12px 14px; } }