/* THE PORTAL RAIL — one look on every page (Sam 2026-09-29). Markup comes only from /portal-rail.js.
   Doubled class (.sprail.sprail) so no page's own .rail/.side/.navItem rules can reshape it. */
aside.sprail.sprail{
  --spr-bg:rgba(6,8,15,.92);--spr-line:rgba(222,230,240,.12);--spr-tx:#c2cde2;--spr-faint:#7f8aa1;--spr-gold:#ffc65a;--spr-gold-b:#ffdd94;
  --spr-serif:"Fraunces",Georgia,serif;--spr-sans:"Hanken Grotesk",system-ui,sans-serif;--spr-mono:"Spline Sans Mono",ui-monospace,Consolas,monospace;
  box-sizing:border-box;width:240px!important;min-width:240px!important;max-width:240px!important;flex:none!important;
  position:sticky!important;top:0!important;height:100vh!important;align-self:flex-start!important;
  display:flex!important;flex-direction:column!important;gap:0!important;margin:0!important;
  padding:18px 12px 14px!important;overflow-y:auto!important;overflow-x:hidden!important;
  background:var(--spr-bg)!important;border-right:1px solid var(--spr-line)!important;backdrop-filter:blur(14px);
  font-family:var(--spr-sans)!important;color:var(--spr-tx)!important;z-index:40;text-align:left
}
aside.sprail.sprail *{box-sizing:border-box}
aside.sprail.sprail .spr-brand{display:flex;align-items:center;gap:10px;padding:2px 8px 16px}
aside.sprail.sprail .spr-moon{width:34px;height:34px;flex:none;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:19px;
  background:radial-gradient(circle at 35% 35%,rgba(255,221,148,.22),rgba(255,198,90,.05));box-shadow:inset 0 0 0 1px rgba(255,198,90,.35)}
aside.sprail.sprail .spr-brand b{display:block;font-family:var(--spr-serif);font-weight:400;font-size:19px;line-height:1.1;color:#fff;white-space:nowrap}
aside.sprail.sprail .spr-brand span:not(.spr-moon){display:block;margin-top:3px;font-family:var(--spr-mono);font-size:9px;letter-spacing:.24em;text-transform:uppercase;color:var(--spr-gold)}
aside.sprail.sprail .spr-label{font-family:var(--spr-mono);font-size:9px;letter-spacing:.24em;text-transform:uppercase;color:var(--spr-faint);padding:4px 10px 8px}
aside.sprail.sprail .spr-nav{display:flex;flex-direction:column;gap:3px}
aside.sprail.sprail .spr-spacer{flex:1 1 auto;min-height:14px}
aside.sprail.sprail .spr-bot{padding-top:10px;border-top:1px solid var(--spr-line)}
aside.sprail.sprail a.spr-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:999px;text-decoration:none;
  font-family:var(--spr-mono);font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--spr-tx);
  border:1px solid transparent;background:none;line-height:1.35;transition:background .2s,color .2s,border-color .2s}
aside.sprail.sprail a.spr-item:hover{background:rgba(255,198,90,.08);color:var(--spr-gold-b)}
aside.sprail.sprail a.spr-item.active{background:rgba(255,198,90,.13);color:var(--spr-gold);border-color:rgba(255,198,90,.45)}
aside.sprail.sprail .spr-ic{width:18px;flex:none;text-align:center;font-size:13px;letter-spacing:0}
aside.sprail.sprail .spr-t{min-width:0;flex:1 1 auto;overflow-wrap:normal;word-break:normal} /* long names wrap between words, never cut off */
aside.sprail.sprail .spr-soon{margin-left:auto;flex:none;font:600 8px/1.4 var(--spr-mono);letter-spacing:.05em;color:var(--spr-faint);border:1px solid var(--spr-line);border-radius:999px;padding:1px 6px;white-space:nowrap}
aside.sprail.sprail .spr-tag{margin-left:auto;font:700 8.5px/1.4 var(--spr-mono);letter-spacing:.08em;color:#1a1206;background:var(--spr-gold);border-radius:999px;padding:1px 6px}
aside.sprail.sprail .spr-mewrap{position:relative}
aside.sprail.sprail .spr-me{display:flex;align-items:center;gap:10px;margin-top:12px;padding:10px 8px 2px;border-top:1px solid var(--spr-line)}
aside.sprail.sprail .spr-me.spr-click{cursor:pointer}
aside.sprail.sprail .spr-av{width:34px;height:34px;flex:none;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;
  font-weight:700;color:#241703;background:linear-gradient(115deg,#fff3c9,#ffc65a 50%,#4da3ff 118%)}
aside.sprail.sprail .spr-av img,aside.sprail.sprail .spr-mav img{width:100%;height:100%;object-fit:cover}
aside.sprail.sprail .spr-nm{min-width:0;font-family:var(--spr-serif);font-size:15px;color:#fff;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
aside.sprail.sprail .spr-nm small{display:block;font-family:var(--spr-mono);font-size:9px;letter-spacing:.2em;text-transform:uppercase;color:var(--spr-faint)}
aside.sprail.sprail .spr-caret,aside.sprail.sprail .spr-out{margin-left:auto;color:var(--spr-faint);text-decoration:none;font-size:13px}
aside.sprail.sprail .spr-menu{position:absolute;left:0;right:0;bottom:100%;margin-bottom:6px;padding:6px;display:flex;flex-direction:column;gap:2px;
  background:#0c1120;border:1px solid rgba(255,198,90,.35);border-radius:14px;box-shadow:0 14px 40px rgba(0,0,0,.6);z-index:99}
aside.sprail.sprail .spr-menu[hidden]{display:none}
aside.sprail.sprail .spr-mlabel{font-family:var(--spr-mono);font-size:9px;letter-spacing:.2em;text-transform:uppercase;color:var(--spr-faint);padding:4px 10px 6px}
aside.sprail.sprail .spr-menu a{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:10px;color:var(--spr-tx);text-decoration:none;font-size:13px}
aside.sprail.sprail .spr-menu a:hover{background:rgba(255,198,90,.08);color:var(--spr-gold-b)}
aside.sprail.sprail .spr-menu a.cur{color:#fff;font-weight:600}
aside.sprail.sprail .spr-menu a.dim{opacity:.5}
aside.sprail.sprail .spr-mav{width:22px;height:22px;flex:none;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;background:rgba(255,198,90,.18);color:var(--spr-gold-b)}
aside.sprail.sprail .spr-ck{margin-left:auto}
/* page shells: the rail's column is always 240px, whatever the page used to reserve */
.shell:has(> aside.sprail){grid-template-columns:240px minmax(0,1fr)}
/* phones / small tablets: the rail becomes one scrolling row on top (same items, same order) */
@media (max-width:940px){
  .shell:has(> aside.sprail){grid-template-columns:1fr}
  aside.sprail.sprail{position:sticky!important;width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;
    flex-direction:row!important;align-items:center;gap:6px!important;padding:8px 10px!important;overflow-x:auto!important;overflow-y:hidden!important;border-right:none!important;border-bottom:1px solid var(--spr-line)!important}
  aside.sprail.sprail .spr-brand{padding:0 6px 0 0}
  aside.sprail.sprail .spr-brand div,aside.sprail.sprail .spr-label,aside.sprail.sprail .spr-spacer,aside.sprail.sprail .spr-mewrap,aside.sprail.sprail > .spr-me{display:none}
  aside.sprail.sprail .spr-nav{flex-direction:row;gap:4px}
  aside.sprail.sprail .spr-bot{padding-top:0;border-top:none}
}
/* Vault: the rail is fixed to the left edge (the page body shifts right by 240px) */
aside.sprail.sprail.spr-fixed{position:fixed!important;top:0!important;left:0!important;bottom:0!important;height:100vh!important;z-index:5000}
/* static flex shells + the WIP page stack the rail on top on phones */
@media (max-width:940px){.shell:has(> aside.sprail),.spr-page{flex-direction:column}aside.sprail.sprail.spr-fixed{position:sticky!important;height:auto!important}}
/* Vault on phones: its script pushes the page right for a side rail — on a phone the rail is a top bar instead */
@media (max-width:940px){
  aside.sprail.sprail.spr-fixed{position:fixed!important;top:0!important;left:0!important;right:0!important;bottom:auto!important;width:100%!important;height:auto!important}
  body.sp-rail-open{margin-left:0!important;padding-top:56px!important}
  body.sp-rail-open .viewer,body.sp-rail-open .lightbox{left:0!important}
  aside.sprail.sprail a.spr-item{white-space:nowrap}
}
/* Sam 2026-10-05 ("the very bottom where the name shows up is not visible … make sure this never happens again on any
   profile or any login"): the menu needs ~745-805px; under the top bars on a laptop window that is more than there is,
   and the name card slid below the edge inside a hidden scroll. Desktop: brand, the bottom block (Billing … Log out)
   and the name card NEVER shrink; only the top page list gives up height and scrolls. Guard: railfit_test.py. */
@media (min-width:941px){
  aside.sprail.sprail{overflow:hidden!important}
  aside.sprail.sprail > .spr-brand,aside.sprail.sprail > .spr-label,aside.sprail.sprail > .spr-bot,
  aside.sprail.sprail > .spr-me,aside.sprail.sprail > .spr-mewrap{flex:none!important}
  aside.sprail.sprail > .spr-nav:not(.spr-bot){flex:0 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin}
  aside.sprail.sprail > .spr-spacer{min-height:6px}
}
