librelad 16eda07b3d fix(webui): make SSH Access page full-width like config/admin pages
The SSH Access page was boxed to max-width 860px and centered, unlike the
Overview and System admin pages (.admin-page) which span the full content
width. Drop the cap and match .admin-page padding so /admin/tools/ssh-access
looks like the rest of the Admin area.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Signed-off-by: librelad <librelad@digitalangels.vip>
2026-05-25 22:12:50 +01:00

277 lines
19 KiB
CSS

/* ============ NEBULA THEME (lifted from the dashboard) ============ */
:root{
--gradient-from:#1a1442; /* indigo */
--gradient-mid:#1b2a5e; /* violet-blue */
--gradient-to:#0f3b6e; /* ocean */
--surface-solid:#0f1729;
--accent:#00d4ff;
--accent-hover:#0099cc;
--accent-rgb:0,212,255;
--accent-soft:rgba(0,212,255,.15);
--text-primary:#ffffff;
--text-secondary:rgba(255,255,255,.82);
--text-muted:rgba(255,255,255,.65);
--text-faint:rgba(255,255,255,.45);
--text-on-accent:#0a1426;
--text-rgb:255,255,255;
--border:rgba(255,255,255,.16);
--border-strong:rgba(255,255,255,.26);
--border-subtle:rgba(255,255,255,.08);
--card-bg:linear-gradient(155deg, rgba(255,255,255,.09) 0%, rgba(0,212,255,.05) 100%);
--card-border:rgba(255,255,255,.16);
--card-shadow:0 4px 18px rgba(0,0,0,.30), inset 0 1px 0 rgba(255,255,255,.06);
--card-shadow-hover:0 10px 32px rgba(0,212,255,.18), 0 4px 18px rgba(0,0,0,.40), inset 0 1px 0 rgba(255,255,255,.10);
--topbar-bg:rgba(15,25,50,.40);
--console-bg:rgba(0,0,0,.40);
--surface-bg-solid:#0f1729;
--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
--font-mono:"SF Mono", "Monaco", "Menlo", "Ubuntu Mono", "Courier New", monospace;
--maxw:1180px;
--ease:cubic-bezier(.22,.61,.36,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--font-sans);background:var(--surface-solid);color:var(--text-primary);
line-height:1.6;overflow-x:hidden;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
/* ============ AURORA BACKDROP (from aurora-background.css) ============ */
.cosmos{position:fixed;inset:0;z-index:-2;pointer-events:none;overflow:hidden;
background:
radial-gradient(ellipse at 20% 22%, var(--gradient-mid) 0%, transparent 55%),
radial-gradient(ellipse at 82% 74%, var(--gradient-to) 0%, transparent 55%),
linear-gradient(135deg, var(--gradient-from) 0%, var(--gradient-from) 40%, var(--gradient-mid) 100%);}
.cosmos::before{content:'';position:absolute;inset:-25%;
background:conic-gradient(from 0deg at 50% 50%,
rgba(var(--accent-rgb),0) 0deg, rgba(var(--accent-rgb),.18) 60deg,
rgba(var(--accent-rgb),.22) 130deg, rgba(var(--accent-rgb),.20) 200deg,
rgba(var(--accent-rgb),.18) 280deg, rgba(var(--accent-rgb),0) 360deg);
filter:blur(70px);animation:auroraSpin 38s linear infinite;}
.cosmos::after{content:'';position:absolute;inset:-10%;
background:
radial-gradient(circle at 18% 22%, rgba(var(--accent-rgb),.38) 0%, transparent 35%),
radial-gradient(circle at 78% 18%, rgba(var(--accent-rgb),.32) 0%, transparent 32%),
radial-gradient(circle at 30% 80%, rgba(var(--accent-rgb),.30) 0%, transparent 38%),
radial-gradient(circle at 84% 82%, rgba(var(--accent-rgb),.34) 0%, transparent 36%),
radial-gradient(circle at 50% 50%, rgba(var(--accent-rgb),.14) 0%, transparent 50%);
filter:blur(50px);animation:auroraDrift 22s ease-in-out infinite alternate;}
.stars{position:fixed;inset:0;z-index:-1;pointer-events:none}
.stars::before,.stars::after{content:'';position:absolute;inset:0;background-repeat:repeat}
.stars::before{background-image:
radial-gradient(1.5px 1.5px at 12px 18px, rgba(var(--text-rgb),.9), transparent 60%),
radial-gradient(1px 1px at 47px 92px, rgba(var(--accent-rgb),.85), transparent 60%),
radial-gradient(1.2px 1.2px at 110px 40px, rgba(var(--text-rgb),.75), transparent 60%),
radial-gradient(1px 1px at 165px 130px, rgba(var(--accent-rgb),.7), transparent 60%);
background-size:200px 200px;animation:auroraTwinkleA 4.5s ease-in-out infinite;}
.stars::after{background-image:
radial-gradient(1px 1px at 30px 60px, rgba(var(--accent-rgb),.8), transparent 60%),
radial-gradient(1.4px 1.4px at 88px 22px, rgba(var(--text-rgb),.7), transparent 60%),
radial-gradient(1px 1px at 140px 100px, rgba(var(--accent-rgb),.85), transparent 60%),
radial-gradient(1.2px 1.2px at 195px 70px, rgba(var(--text-rgb),.6), transparent 60%);
background-size:240px 240px;background-position:80px 50px;animation:auroraTwinkleB 6.5s ease-in-out infinite;}
@keyframes auroraSpin{to{transform:rotate(360deg)}}
@keyframes auroraDrift{0%{transform:translate(0,0) scale(1);opacity:.85}50%{transform:translate(-3%,4%) scale(1.08);opacity:1}100%{transform:translate(2%,-3%) scale(.95);opacity:.9}}
@keyframes auroraTwinkleA{0%,100%{opacity:.55}50%{opacity:1}}
@keyframes auroraTwinkleB{0%,100%{opacity:1}50%{opacity:.45}}
/* ============ shared ============ */
.grad{background:linear-gradient(100deg,#7ae9ff,#00d4ff 55%,#0aa6d6);
-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 clamp(18px,5vw,48px)}
section{position:relative;z-index:1}
.eyebrow{font-family:var(--font-mono);font-size:.74rem;letter-spacing:.22em;text-transform:uppercase;color:var(--accent);margin-bottom:16px;display:block}
h2{font-size:clamp(2rem,4.6vw,3.2rem);line-height:1.08;letter-spacing:-.02em;font-weight:800}
.lead{color:var(--text-secondary);font-size:1.08rem;max-width:54ch;margin-top:18px;font-weight:400}
.pad{padding:clamp(80px,12vh,140px) 0}
.glass{background:var(--card-bg);border:1px solid var(--card-border);box-shadow:var(--card-shadow);
backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}
/* ============ TOPBAR — grafted from the dashboard (topbar.css) ============ */
.topbar{display:flex;justify-content:space-between;align-items:center;padding:0 24px;height:60px;
position:fixed;top:0;left:0;right:0;z-index:1000;background:var(--topbar-bg);
border-bottom:1px solid var(--border);backdrop-filter:blur(12px) saturate(140%);-webkit-backdrop-filter:blur(12px) saturate(140%)}
.mobile-menu-toggle{display:none;background:none;border:none;color:var(--text-primary);cursor:pointer;padding:6px;margin-right:4px}
.topbar-left{display:flex;align-items:center;flex:0 0 auto}
.libreportal-logo{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--text-primary);font-weight:700;font-size:1.05rem}
.libreportal-logo img{width:32px;height:32px}
.libreportal-logo b{color:var(--accent);font-weight:700}
.mobile-drawer{display:flex;align-items:center;flex:1;justify-content:space-between;gap:12px;min-width:0;margin-left:24px}
.topbar-nav{display:flex;gap:8px;align-items:center}
.topbar-nav .nav-item{background:rgba(var(--text-rgb),.10);border:1px solid rgba(var(--text-rgb),.20);border-radius:8px;
padding:10px 16px;font-size:14px;font-weight:500;color:var(--text-muted);text-decoration:none;display:flex;align-items:center;gap:8px;
transition:all .2s ease;cursor:pointer;min-height:42px;white-space:nowrap}
.topbar-nav .nav-item:hover{background:rgba(var(--text-rgb),.20);transform:translateY(-1px);color:var(--text-primary)}
.topbar-nav .nav-item.nav-active{background:var(--accent);color:var(--text-primary);border-color:var(--accent)}
.topbar-nav .nav-item.nav-active:hover{background:var(--accent-hover);border-color:var(--accent-hover)}
.topbar-nav .nav-item svg{width:16px;height:16px}
.topbar-controls{display:flex;align-items:center;gap:12px}
.tb-ghost{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border:1px solid var(--border);border-radius:8px;
background:rgba(var(--text-rgb),.05);color:var(--text-secondary);text-decoration:none;font-size:.85rem;font-weight:600;transition:all .2s}
.tb-ghost:hover{background:rgba(var(--text-rgb),.12);color:var(--text-primary)}
.tb-cta{display:inline-flex;align-items:center;gap:6px;padding:8px 18px;border-radius:8px;background:var(--accent);
color:var(--text-on-accent);text-decoration:none;font-size:.85rem;font-weight:700;transition:all .2s}
.tb-cta:hover{background:#22dbff;transform:translateY(-1px);box-shadow:0 8px 22px -8px rgba(var(--accent-rgb),.6)}
@media(max-width:768px){
.topbar{padding:0 12px;gap:8px;justify-content:flex-start}
.mobile-menu-toggle{display:flex;align-items:center}
.mobile-drawer{position:fixed;top:60px;left:0;width:100vw;height:calc(100vh - 60px);flex-direction:column;align-items:stretch;
justify-content:flex-start;gap:0;padding:16px;margin-left:0;background:var(--surface-bg-solid);border-right:1px solid var(--border);
box-shadow:6px 0 24px rgba(0,0,0,.35);overflow-y:auto;transform:translateX(-100%);transition:transform .3s ease;z-index:101}
.mobile-drawer.mobile-open{transform:translateX(0)}
.mobile-drawer .topbar-nav{flex-direction:column;align-items:stretch;gap:6px;width:100%}
.mobile-drawer .topbar-nav .nav-item{width:100%;justify-content:flex-start}
.mobile-drawer .topbar-controls{flex-direction:column;align-items:stretch;gap:8px;width:100%;margin-top:auto;padding-top:16px;
border-top:1px solid rgba(var(--text-rgb),.12)}
.mobile-drawer .topbar-controls a{width:100%;justify-content:center}
}
/* ============ hero ============ */
header.hero{min-height:100vh;display:flex;flex-direction:column;justify-content:center;align-items:center;
text-align:center;padding:140px clamp(18px,5vw,48px) 90px;position:relative}
.badge{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:.72rem;
letter-spacing:.14em;text-transform:uppercase;color:var(--accent);padding:7px 15px;border-radius:999px;
border:1px solid rgba(var(--accent-rgb),.35);background:var(--accent-soft);margin-bottom:30px}
.badge .dot{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent);animation:pulse 2.4s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:.4}50%{opacity:1}}
.hero-logo{width:64px;height:64px;margin-bottom:22px;filter:drop-shadow(0 6px 24px rgba(var(--accent-rgb),.45))}
h1{font-size:clamp(2.6rem,7vw,5.2rem);line-height:1.03;letter-spacing:-.03em;font-weight:800;max-width:15ch}
.sub{margin:26px auto 0;max-width:50ch;font-size:clamp(1.02rem,2vw,1.2rem);color:var(--text-secondary);font-weight:400}
/* install portal */
.portal{margin:46px auto 0;width:min(660px,100%);position:relative}
.portal::before{content:"";position:absolute;inset:-26px;border-radius:28px;z-index:-1;
background:radial-gradient(60% 80% at 50% 50%, rgba(var(--accent-rgb),.5), transparent 70%);filter:blur(22px);animation:breathe 6s ease-in-out infinite}
@keyframes breathe{0%,100%{opacity:.45;transform:scale(.98)}50%{opacity:.8;transform:scale(1.03)}}
.term{border:1px solid var(--card-border);border-radius:16px;overflow:hidden;
background:linear-gradient(155deg, rgba(255,255,255,.10) 0%, rgba(0,212,255,.06) 100%);
backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:var(--card-shadow-hover)}
.term-bar{display:flex;align-items:center;gap:7px;padding:12px 16px;border-bottom:1px solid var(--border-subtle);background:var(--console-bg)}
.term-bar i{width:11px;height:11px;border-radius:50%;display:block}
.term-bar i:nth-child(1){background:#ff6b5e}.term-bar i:nth-child(2){background:#ffc107}.term-bar i:nth-child(3){background:var(--accent)}
.term-bar em{margin-left:auto;font-family:var(--font-mono);font-size:.72rem;color:var(--text-faint);font-style:normal}
.term-body{display:flex;align-items:center;gap:14px;padding:22px 20px}
.term-body code{font-family:var(--font-mono);font-size:clamp(.82rem,2.3vw,1.02rem);color:var(--text-primary);
white-space:nowrap;overflow-x:auto;flex:1;text-align:left;scrollbar-width:none}
.term-body code::-webkit-scrollbar{display:none}
.term-body code .p{color:var(--accent)}
.term-body code .u{color:#e6f3ff}
.copy{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;font-family:var(--font-sans);font-weight:700;
font-size:.84rem;color:var(--text-on-accent);background:var(--accent);border:none;border-radius:9px;padding:9px 15px;cursor:pointer;
transition:transform .15s,background .25s,box-shadow .25s}
.copy:hover{transform:translateY(-1px);background:#22dbff;box-shadow:0 8px 22px -8px rgba(var(--accent-rgb),.7)}
.copy.done{background:#28a745;color:#fff}
.portal-foot{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:16px;flex-wrap:wrap;font-size:.86rem;color:var(--text-faint)}
.portal-foot a{color:var(--text-secondary);text-decoration:none;border-bottom:1px dashed rgba(255,255,255,.3);transition:color .2s,border-color .2s}
.portal-foot a:hover{color:var(--accent);border-color:var(--accent)}
.hint{font-family:var(--font-mono);font-size:.78rem}
.scroll-cue{position:absolute;bottom:28px;left:50%;transform:translateX(-50%);color:var(--text-faint);
font-family:var(--font-mono);font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;
display:flex;flex-direction:column;align-items:center;gap:8px;animation:bob 2.6s ease-in-out infinite}
.scroll-cue::after{content:"";width:1px;height:34px;background:linear-gradient(var(--text-faint),transparent)}
@keyframes bob{0%,100%{transform:translateX(-50%) translateY(0)}50%{transform:translateX(-50%) translateY(8px)}}
/* ============ features ============ */
.feat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:54px}
.card{border-radius:16px;padding:28px 26px;position:relative;overflow:hidden;transition:transform .4s var(--ease),border-color .4s,box-shadow .4s}
.card:hover{transform:translateY(-6px);border-color:rgba(var(--accent-rgb),.45);box-shadow:var(--card-shadow-hover)}
.card .ico{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;margin-bottom:18px;
background:var(--accent-soft);border:1px solid rgba(var(--accent-rgb),.30)}
.card .ico svg{width:22px;height:22px;stroke:var(--accent);fill:none;stroke-width:1.6}
.card h3{font-size:1.24rem;margin-bottom:8px;font-weight:700;letter-spacing:-.01em}
.card p{color:var(--text-secondary);font-size:.96rem}
/* ============ apps (data-driven) ============ */
.apps-section{text-align:center}
.app-filters{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin-top:40px}
.chip{font-family:var(--font-mono);font-size:.76rem;letter-spacing:.04em;padding:8px 15px;border-radius:999px;
border:1px solid var(--border);background:rgba(255,255,255,.05);color:var(--text-secondary);cursor:pointer;transition:all .2s}
.chip:hover{color:var(--text-primary);border-color:rgba(var(--accent-rgb),.45)}
.chip.active{background:var(--accent);color:var(--text-on-accent);border-color:var(--accent);font-weight:600}
.chip .n{opacity:.55;margin-left:6px}
.app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:16px;margin-top:34px;text-align:left}
.app-card{border-radius:14px;padding:20px;display:flex;flex-direction:column;gap:11px;transition:transform .3s var(--ease),border-color .3s,box-shadow .3s}
.app-card.hidden{display:none}
.app-card:hover{transform:translateY(-4px);border-color:rgba(var(--accent-rgb),.4);box-shadow:var(--card-shadow-hover)}
.app-card-head{display:flex;align-items:center;gap:12px}
.app-ico{width:42px;height:42px;border-radius:10px;background:rgba(255,255,255,.06);padding:6px;object-fit:contain;border:1px solid var(--border-subtle);flex:0 0 auto}
.app-card h3{font-size:1.06rem;font-weight:700;line-height:1.2}
.app-cat{font-family:var(--font-mono);font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;color:var(--accent)}
.app-card p{font-size:.9rem;color:var(--text-secondary);margin:0}
.app-count{margin-top:26px;color:var(--text-faint);font-size:.85rem;font-family:var(--font-mono)}
/* ============ connect / courier ============ */
.connect{display:grid;grid-template-columns:1.05fr .95fr;gap:60px;align-items:center}
.pill{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:.72rem;
letter-spacing:.1em;text-transform:uppercase;color:var(--text-secondary);padding:7px 14px;border-radius:999px;
border:1px solid var(--border);background:rgba(255,255,255,.04);margin-top:24px}
.connect ul{list-style:none;margin-top:26px;display:flex;flex-direction:column;gap:15px}
.connect li{display:flex;gap:13px;color:var(--text-secondary);font-size:1rem}
.connect li svg{flex:0 0 auto;width:21px;height:21px;stroke:var(--accent);fill:none;stroke-width:1.6;margin-top:3px}
.connect li b{color:var(--text-primary);font-weight:700}
.vault{position:relative;aspect-ratio:1;display:grid;place-items:center}
.vault svg{width:min(360px,82%);height:auto;overflow:visible}
.orbit{transform-origin:center;animation:spin 26s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
/* ============ promise ============ */
.promise{text-align:center}
.pledges{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:52px}
.pledge{border-radius:14px;padding:28px 18px}
.pledge .big{font-size:2.4rem;font-weight:800;margin-bottom:8px;line-height:1}
.pledge p{font-size:.92rem;color:var(--text-secondary)}
.promise .link{display:inline-block;margin-top:40px;color:var(--accent);text-decoration:none;font-weight:700;
border-bottom:1px solid rgba(var(--accent-rgb),.45);padding-bottom:2px;transition:color .2s,border-color .2s}
.promise .link:hover{color:#fff;border-color:#fff}
/* ============ final ============ */
.final{text-align:center;padding:clamp(90px,14vh,160px) 0}
.final h2{max-width:18ch;margin-inline:auto}
.final .portal{margin-top:42px}
/* ============ footer ============ */
footer{border-top:1px solid var(--border-subtle);padding:54px 0 70px;margin-top:40px;background:rgba(10,16,32,.55);backdrop-filter:blur(8px)}
.foot-grid{display:flex;justify-content:space-between;gap:40px;flex-wrap:wrap;align-items:flex-start}
.foot-grid .libreportal-logo{margin-bottom:14px}
.foot-col h4{font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;color:var(--text-faint);margin-bottom:14px;font-family:var(--font-mono)}
.foot-col a{display:block;color:var(--text-secondary);text-decoration:none;font-size:.95rem;margin-bottom:9px;transition:color .2s}
.foot-col a:hover{color:var(--accent)}
.colophon{margin-top:46px;padding-top:26px;border-top:1px solid var(--border-subtle);
display:flex;justify-content:space-between;gap:18px;flex-wrap:wrap;color:var(--text-faint);font-size:.86rem}
.colophon a{color:var(--text-secondary);text-decoration:none}
.colophon a:hover{color:var(--accent)}
/* ============ reveal ============ */
.reveal{opacity:0;transform:translateY(28px);transition:opacity .9s var(--ease),transform .9s var(--ease)}
.reveal.in{opacity:1;transform:none}
.stagger>*{opacity:0;transform:translateY(20px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
.stagger.in>*{opacity:1;transform:none}
.stagger.in>*:nth-child(2){transition-delay:.07s}.stagger.in>*:nth-child(3){transition-delay:.14s}
.stagger.in>*:nth-child(4){transition-delay:.21s}.stagger.in>*:nth-child(5){transition-delay:.28s}.stagger.in>*:nth-child(6){transition-delay:.35s}
.h-anim{opacity:0;transform:translateY(24px);animation:rise .95s var(--ease) forwards}
.d1{animation-delay:.05s}.d2{animation-delay:.16s}.d3{animation-delay:.28s}.d4{animation-delay:.4s}.d5{animation-delay:.52s}
@keyframes rise{to{opacity:1;transform:none}}
/* ============ responsive ============ */
@media(max-width:860px){
.feat-grid{grid-template-columns:1fr 1fr}
.connect{grid-template-columns:1fr;gap:36px}
.vault{order:-1;max-width:320px;margin-inline:auto}
.pledges{grid-template-columns:1fr 1fr}
}
@media(max-width:540px){
.feat-grid{grid-template-columns:1fr}
.term-body{flex-direction:column;align-items:stretch}
.copy{justify-content:center}
}
@media(prefers-reduced-motion:reduce){
*{animation:none!important;transition:none!important}
.reveal,.stagger>*,.h-anim{opacity:1;transform:none}
}