/* Accelerator dashboard. Light + dark themes via [data-theme] attribute on
   <html>. The toggle in base.html sets it; localStorage persists; system
   pref is the initial default. */

:root,
:root[data-theme="light"] {
  --bg:           #f5f7fa;
  --card-bg:      #ffffff;
  --hover-bg:     #f1f5f9;
  --fg:           #2a3036;
  --fg-muted:     #6e7785;
  --fg-faint:     #b3bac0;
  --line:         #e3e7ec;
  --line-strong:  #d3d8de;

  --accent:       #6cc5b8;
  --accent-soft:  #e7f5f3;
  --blue:         #3b82c4;
  --blue-soft:    #e6f0fa;
  --blue-hover:   #2f6da4;
  --green:        #5cb85c;
  --green-hover:  #4ba34b;
  --pink:         #e88e9e;
  --pink-soft:    #fde8ec;

  --code-bg:      #f7f9fa;

  /* Module name colors — kept consistent between themes (slightly desaturated for dark) */
  --mod-ext:      #c98344;       /* .ext.so — extensions */
  --mod-srv:      #3f86c8;       /* _srv.so — engine binaries */
  --mod-mm:       #4a9e6f;       /* _mm.so — metamod plugins */
  --mod-lib:      #8a6cb6;       /* lib*.so — runtime libs */
  --mod-game:     #c54e6e;       /* server.so / dedicated_srv.so / engine_srv.so */
  --mod-default:  var(--fg);

  --shadow-sm:    0 1px 2px rgba(15, 23, 42, 0.04), 0 1px 3px rgba(15, 23, 42, 0.04);
  --shadow-md:    0 4px 12px rgba(15, 23, 42, 0.08);
}

:root[data-theme="dark"] {
  --bg:           #0f1419;
  --card-bg:      #1a2028;
  --hover-bg:     #232a35;
  --fg:           #d6dee8;
  --fg-muted:     #8c95a3;
  --fg-faint:     #5d6573;
  --line:         #2a323d;
  --line-strong:  #3a4350;

  --accent:       #6cc5b8;
  --accent-soft:  #1f3633;
  --blue:         #5ca2e0;
  --blue-soft:    #1e3349;
  --blue-hover:   #74b3eb;
  --green:        #6dc46d;
  --green-hover:  #82d182;
  --pink:         #e88e9e;
  --pink-soft:    #3a1f24;

  --code-bg:      #141a21;

  --mod-ext:      #d8a070;
  --mod-srv:      #6aa8e8;
  --mod-mm:       #6dc497;
  --mod-lib:      #b09ad8;
  --mod-game:     #e87694;
  --mod-default:  var(--fg);

  --shadow-sm:    0 1px 2px rgba(0, 0, 0, 0.4);
  --shadow-md:    0 4px 12px rgba(0, 0, 0, 0.4);
}

:root {
  --mono:         "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
  --sans:         -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--fg);
  font: 14px/1.5 var(--sans);
  -webkit-font-smoothing: antialiased;
}

a { color: var(--blue); text-decoration: none; }
a:hover { text-decoration: underline; }

code, pre { font-family: var(--mono); font-size: 13px; }
pre { background: var(--code-bg); border: 1px solid var(--line); border-radius: 4px;
      padding: 12px 14px; overflow-x: auto; color: var(--fg); }

.muted { color: var(--fg-muted); }
.small { font-size: 12px; }
.nowrap { white-space: nowrap; }

/* ---------- top bar ---------- */

.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 28px;
  background: var(--card-bg);
  border-bottom: 1px solid var(--line);
}

.brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  color: var(--fg-muted);
  font-weight: 500;
  font-size: 16px;
}

.brand-mark {
  display: inline-block;
  width: 24px; height: 24px; line-height: 24px;
  text-align: center;
  background: var(--accent-soft);
  color: var(--accent);
  border-radius: 4px;
  font-weight: 700;
  font-size: 14px;
}

.brand:hover { text-decoration: none; color: var(--fg); }

.topbar-right { display: inline-flex; align-items: center; gap: 12px; }

/* Theme toggle — single button, swaps icon based on theme. */
.theme-toggle {
  background: none;
  border: 1px solid transparent;
  color: var(--fg-muted);
  padding: 6px 9px;
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;
  line-height: 1;
}
.theme-toggle:hover { background: var(--hover-bg); border-color: var(--line); color: var(--fg); }
.theme-toggle-light { display: none; }
.theme-toggle-dark { display: inline; }
[data-theme="dark"] .theme-toggle-light { display: inline; }
[data-theme="dark"] .theme-toggle-dark { display: none; }

.user-menu { position: relative; }
.user-menu summary {
  list-style: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 8px;
  border: 1px solid transparent;
  border-radius: 4px;
  user-select: none;
}
.user-menu summary::-webkit-details-marker { display: none; }
.user-menu[open] summary { background: var(--hover-bg); border-color: var(--line); }

.user-avatar { width: 32px; height: 32px; border-radius: 4px; display: block; }
.user-avatar-fallback {
  display: inline-block;
  width: 32px; height: 32px; line-height: 32px;
  text-align: center;
  background: var(--fg-muted);
  color: var(--card-bg);
  border-radius: 4px;
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 600;
}
.user-menu-caret { color: var(--fg-faint); font-size: 11px; }

.user-menu-panel {
  position: absolute; right: 0; top: calc(100% + 6px);
  min-width: 180px;
  background: var(--card-bg);
  border: 1px solid var(--line);
  border-radius: 6px;
  box-shadow: var(--shadow-md);
  padding: 6px 0;
  z-index: 10;
}
.user-menu-name {
  padding: 8px 14px;
  font-size: 12px;
  color: var(--fg-muted);
  border-bottom: 1px solid var(--line);
  margin-bottom: 4px;
}
.user-menu-panel a {
  display: block;
  padding: 8px 14px;
  color: var(--fg);
  font-size: 13px;
}
.user-menu-panel a:hover { background: var(--hover-bg); text-decoration: none; }

/* ---------- footer ---------- */

footer {
  margin: 60px 0 24px;
  text-align: center;
  color: var(--fg-faint);
  font-size: 11px;
}
footer a { color: var(--fg-muted); }

/* ---------- main layout ---------- */

main {
  max-width: 1080px;
  margin: 32px auto;
  padding: 0 28px;
}

h1 { font-size: 22px; font-weight: 600; margin: 0 0 8px; }
h2 { font-size: 18px; font-weight: 500; margin: 32px 0 14px; color: var(--fg); }
h3 { font-size: 13px; font-weight: 600; margin: 0 0 8px; color: var(--fg-muted); }

/* Reusable container */
.card {
  background: var(--card-bg);
  border: 1px solid var(--line);
  border-radius: 6px;
  box-shadow: var(--shadow-sm);
  overflow: hidden;
}

/* ---------- buttons ---------- */

.btn {
  display: inline-block;
  padding: 9px 18px;
  border: 1px solid var(--line);
  background: var(--card-bg);
  color: var(--fg);
  border-radius: 4px;
  font: inherit;
  cursor: pointer;
  text-decoration: none;
  text-align: center;
}
.btn:hover { border-color: var(--fg-faint); text-decoration: none; }

.btn-primary { background: var(--blue); border-color: var(--blue); color: white; }
.btn-primary:hover { background: var(--blue-hover); border-color: var(--blue-hover); color: white; }

.btn-login { background: var(--green); border-color: var(--green); color: white; }
.btn-login:hover { background: var(--green-hover); border-color: var(--green-hover); color: white; }
.login-icon { display: inline-block; margin-right: 4px; }

.btn-go { background: var(--blue); border-color: var(--blue); color: white; padding: 9px 22px; }
.btn-go:hover { background: var(--blue-hover); border-color: var(--blue-hover); color: white; }

.btn-danger { background: var(--pink-soft); border-color: var(--pink); color: var(--pink); }
.btn-danger:hover { background: var(--pink); color: white; }

.btn-block { display: block; width: 100%; padding: 12px; font-size: 15px; }

.link { color: var(--blue); }

/* ---------- landing page ---------- */

.landing { max-width: 720px; margin: 60px auto 0; }

.stats-row {
  display: flex;
  justify-content: center;
  gap: 80px;
  margin-bottom: 36px;
  flex-wrap: wrap;
}
.stat { text-align: center; }
.stat-number {
  font-size: 38px;
  font-weight: 300;
  line-height: 1.1;
  color: var(--fg);
}
.stat-label {
  margin-top: 6px;
  color: var(--fg-muted);
  font-size: 13px;
}

.lookup-card {
  background: var(--card-bg);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 20px;
  box-shadow: var(--shadow-sm);
}

.lookup-form {
  display: flex;
  align-items: stretch;
  border: 1px solid var(--line);
  border-radius: 4px;
  overflow: hidden;
}
.lookup-label {
  padding: 9px 14px;
  background: var(--hover-bg);
  color: var(--fg-muted);
  font-size: 13px;
  border-right: 1px solid var(--line);
  white-space: nowrap;
}
.lookup-form input {
  flex: 1;
  border: none;
  outline: none;
  padding: 9px 14px;
  font-family: var(--mono);
  font-size: 13px;
  color: var(--fg);
  background: var(--card-bg);
}
.lookup-form input::placeholder { color: var(--fg-faint); }
.lookup-form .btn-go { border-radius: 0; border: none; }

.lookup-or {
  text-align: center; margin: 16px 0; position: relative;
  color: var(--fg-faint); font-size: 12px; letter-spacing: 0.05em;
}
.lookup-or::before, .lookup-or::after {
  content: ''; position: absolute; top: 50%;
  width: calc(50% - 32px); height: 1px; background: var(--line);
}
.lookup-or::before { left: 0; } .lookup-or::after { right: 0; }
.lookup-or span { background: var(--card-bg); padding: 0 8px; }

/* ---------- /stats page ---------- */

.stats-page h1 { font-size: 24px; margin-bottom: 24px; }
.stats-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 16px; margin-bottom: 40px;
}
.stats-grid-3 { grid-template-columns: repeat(3, minmax(140px, 1fr)); }
.sig-code { font-family: var(--mono); font-size: 18px; color: var(--fg-muted);
            background: var(--code-bg); padding: 4px 10px; border-radius: 4px; }
.stat-card {
  background: var(--card-bg);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 20px;
  text-align: center;
  box-shadow: var(--shadow-sm);
}
.stat-card-num { font-size: 28px; font-weight: 300; color: var(--fg); }
.stat-card-label { margin-top: 4px; color: var(--fg-muted); font-size: 12px; }

.sig-list { width: 100%; border-collapse: collapse;
            background: var(--card-bg); border: 1px solid var(--line);
            border-radius: 6px; overflow: hidden; box-shadow: var(--shadow-sm); }
.sig-list th, .sig-list td { padding: 10px 14px; text-align: left;
  border-bottom: 1px solid var(--line); font-weight: 400; }
.sig-list th { color: var(--fg-muted); font-size: 11px; text-transform: uppercase;
  letter-spacing: 0.04em; font-weight: 500; background: var(--hover-bg); }
.sig-list tr:last-child td { border-bottom: none; }
.sig-list code { color: var(--fg-muted); font-size: 12px; }

/* ---------- dashboard list ---------- */

.dashboard-header {
  display: flex; align-items: baseline; justify-content: space-between;
  margin-bottom: 18px;
}

.crash-list { width: 100%; border-collapse: collapse;
              background: var(--card-bg); border: 1px solid var(--line);
              border-radius: 6px; overflow: hidden; box-shadow: var(--shadow-sm); }
.crash-list th, .crash-list td { padding: 10px 14px; text-align: left;
  border-bottom: 1px solid var(--line); font-weight: 400; }
.crash-list th { color: var(--fg-muted); font-size: 11px; text-transform: uppercase;
  letter-spacing: 0.04em; font-weight: 500; background: var(--hover-bg); }
.crash-list tr:last-child td { border-bottom: none; }
.crash-list code.sig { color: var(--fg-muted); font-size: 12px; }
.crash-list tr:hover { background: var(--hover-bg); }

.empty { padding: 40px; text-align: center; color: var(--fg-muted);
         background: var(--card-bg); border: 1px solid var(--line); border-radius: 6px; }

/* ---------- crash detail ---------- */

.crash-page > h2 { margin: 28px 0 12px; }
.crash-page > h2:first-of-type { margin-top: 28px; }

.metadata-card { padding: 14px 22px; }
.metadata { border-collapse: collapse; margin: 0 auto; width: auto; line-height: 1.35; }
.metadata th, .metadata td { padding: 2px 14px; vertical-align: top; }
.metadata th {
  text-align: right;
  color: var(--fg-muted);
  font-weight: 500;
  white-space: nowrap;
  font-size: 13px;
}
.metadata td        { color: var(--fg); font-size: 13px; }
.metadata td.value  { color: var(--fg); font-family: var(--mono); font-size: 12px;
                      word-break: break-all; max-width: 720px; line-height: 1.45; }

/* Limetech-style "you are not the owner" banner — sits at the top of the
   crash page when the viewer doesn't own the SteamID. */
.visitor-notice {
  padding: 14px 18px;
  margin: 0 0 16px;
  background: var(--blue-soft);
  border: 1px solid var(--blue);
  border-radius: 6px;
  color: var(--blue);
  text-align: center;
  font-size: 13px;
}
.visitor-notice code { color: var(--blue); font-weight: 600; }
.visitor-notice a    { color: var(--blue); text-decoration: underline; }
.visitor-notice a:hover { color: var(--blue-hover); }

.signature-banner {
  display: block;
  margin: 16px 0;
  padding: 12px 18px;
  border: 1px solid var(--blue);
  border-radius: 6px;
  text-align: center;
  color: var(--blue);
  background: var(--blue-soft);
  text-decoration: none;
  position: relative;
}
.signature-banner.clickable:hover { background: var(--blue); color: white; text-decoration: none; }
.signature-banner.clickable:hover .muted { color: rgba(255,255,255,0.8); }
.signature-banner.clickable:hover .banner-arrow { color: white; transform: translateX(4px); }
.signature-banner strong { font-weight: 600; }
.signature-banner.muted-banner { background: var(--card-bg); color: var(--fg-muted);
                                 border-color: var(--line); }
.signature-banner.muted-banner code { color: var(--fg-muted); }
.banner-arrow { position: absolute; right: 18px; top: 50%; transform: translateY(-50%);
                color: var(--blue); transition: transform .15s ease, color .15s ease; }

.crash-actions-card {
  display: flex; align-items: center; gap: 12px;
  padding: 14px 18px;
  margin: 16px 0;
}
.crash-actions-card .spacer { flex: 1; }

.owner-only-note { margin: 0; padding: 4px 0; flex: 1;
                   color: var(--fg-muted); }

/* ---------- collapse / expand mechanics ----------
   Markup pattern:
     <div class="card collapsible">  -- starts collapsed
       <table>
         <tbody>
           <tr class="row-extra">...rows hidden when collapsed...</tr>
           <tr class="expand-row">[show more button]</tr>
           <tr class="collapse-row">[hide button]</tr>
         </tbody>
       </table>
     </div>
   When .expanded is added by JS:
     - .row-extra rows reveal
     - .expand-row hides
     - .collapse-row reveals
*/
.collapsible .row-extra      { display: none; }
.collapsible .collapse-row   { display: none; }
.collapsible.expanded .row-extra    { display: table-row; }
.collapsible.expanded .expand-row   { display: none; }
.collapsible.expanded .collapse-row { display: table-row; }

/* Whole row is the button. cursor: pointer + hover state on the row, not just
   on an inner button — clicking anywhere along the bar toggles. */
.expand-row, .collapse-row { cursor: pointer; user-select: none; }
.expand-row td, .collapse-row td {
  background: var(--hover-bg);
  text-align: center;
  padding: 11px 14px;
  border-top: 1px solid var(--line);
  border-bottom: none !important;
  color: var(--fg-muted);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.02em;
  transition: background .12s ease, color .12s ease;
}
.expand-row:hover td, .collapse-row:hover td {
  background: var(--blue-soft);
  color: var(--blue);
}

/* ---------- module-color legend ---------- */

.legend-toggle {
  background: none; border: 1px dashed var(--line-strong); color: var(--fg-muted);
  font-size: 11px; padding: 2px 8px; border-radius: 3px; cursor: pointer;
  font-family: var(--sans); margin-left: 12px; vertical-align: middle;
}
.legend-toggle:hover { color: var(--blue); border-color: var(--blue); }

.module-legend {
  display: none;
  background: var(--card-bg);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 12px 18px;
  margin: 0 0 14px;
  box-shadow: var(--shadow-sm);
}
.module-legend.open { display: block; }
.legend-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 4px 0;
  font-size: 12px;
  color: var(--fg-muted);
}
.legend-row strong { color: var(--fg); margin-right: 4px; font-weight: 500; }
.legend-row code   { color: var(--fg-muted); background: var(--code-bg);
                     padding: 1px 5px; border-radius: 3px; font-size: 11px; }
.legend-swatch {
  display: inline-block;
  width: 14px; height: 14px;
  border-radius: 3px;
  flex-shrink: 0;
}
.swatch-game  { background: var(--mod-game); }
.swatch-srv   { background: var(--mod-srv); }
.swatch-ext   { background: var(--mod-ext); }
.swatch-mm    { background: var(--mod-mm); }
.swatch-lib   { background: var(--mod-lib); }
.swatch-faded { background: var(--fg-muted); opacity: 0.45; }

/* ---------- stack trace table ---------- */

.stack-trace { width: 100%; border-collapse: collapse; }
.stack-trace th { color: var(--fg-muted); font-size: 11px; text-transform: uppercase;
  letter-spacing: 0.04em; font-weight: 500; text-align: left;
  padding: 10px 14px; border-bottom: 1px solid var(--line); background: var(--hover-bg); }
.stack-trace td { padding: 8px 14px; vertical-align: top;
                  border-bottom: 1px solid var(--line); }
.stack-trace tr:last-child td { border-bottom: none; }
.stack-trace tr:hover td { background: var(--hover-bg); }
.col-index { width: 36px; }
.frame-index { color: var(--fg-faint); font-family: var(--mono); width: 36px;
               text-align: right; padding-right: 18px; }
.frame-body code.frame { color: var(--fg); white-space: nowrap; overflow-x: auto;
                         display: inline-block; max-width: 100%; }
.frame-mod    { color: var(--mod-default); }
.frame-bang   { color: var(--fg-faint); }
.frame-func   { color: var(--blue); font-weight: 500; }
.frame-offset { color: var(--fg-faint); }
.frame-offset-bare { color: var(--fg-faint); }
.frame-truncated { color: var(--fg-muted); font-style: italic; text-align: center; }

/* ---------- modules table ---------- */

.module-table { width: 100%; border-collapse: collapse; }
.module-table th {
  color: var(--fg-muted); font-size: 11px; text-transform: uppercase;
  letter-spacing: 0.04em; font-weight: 500; text-align: left;
  padding: 10px 14px; border-bottom: 1px solid var(--line); background: var(--hover-bg);
}
.module-table th.col-name { text-align: right; }
.module-table th.col-base { text-align: right; }
.module-table td { padding: 8px 14px; vertical-align: middle;
                   border-bottom: 1px solid var(--line); }
.module-table tr:last-child td { border-bottom: none; }
.module-table tr:hover td { background: var(--hover-bg); }
.module-table .mod-name { text-align: right; font-family: var(--mono); font-size: 12px;
                          font-weight: 500; }
.module-table .mod-id   { font-family: var(--mono); font-size: 11px;
                          color: var(--fg-muted); letter-spacing: 0.02em; }
.module-table .mod-base { text-align: right; font-family: var(--mono); font-size: 11px;
                          color: var(--fg-muted); }
.module-table .mod-no-syms { opacity: 0.55; }
.module-table .mod-no-syms::after {
  content: " (no symbols)";
  font-family: var(--sans); font-size: 10px; font-weight: 400;
  color: var(--fg-faint); text-transform: uppercase; letter-spacing: 0.05em;
  margin-left: 6px;
}

/* Module name color classification — match by suffix patterns. The classes
   come from the template's `mod-class-<name_with_underscores>` mangling, so
   we use [class*=...] selectors that survive the mangling. */
.module-table .mod-name [class*="_ext_so"]            { color: var(--mod-ext); }
.module-table .mod-name [class*="_ext_2_l4d2_so"]     { color: var(--mod-ext); }
.module-table .mod-name [class*="_srv_so"]            { color: var(--mod-srv); }
.module-table .mod-name [class*="_mm_so"]             { color: var(--mod-mm); }
.module-table .mod-name [class*="_mm_i486_so"]        { color: var(--mod-mm); }
.module-table .mod-name [class*="lib"]                { color: var(--mod-lib); }
.module-table .mod-name [class*="server_so"],
.module-table .mod-name [class*="engine_srv_so"],
.module-table .mod-name [class*="dedicated_srv_so"]   { color: var(--mod-game); }

/* Stack trace frame colors — same scheme so frames and modules visually link. */
code.frame[class*="libc_so"]      { color: var(--mod-lib); }
code.frame[class*="libpthread"]   { color: var(--mod-lib); }
code.frame[class*="linux_gate"]   { color: var(--mod-lib); }
code.frame[class*="libstdc"]      { color: var(--mod-lib); }
code.frame[class*="engine_srv"]   { color: var(--mod-game); }
code.frame[class*="server_so"]    { color: var(--mod-game); }
code.frame[class*="dedicated"]    { color: var(--mod-srv); }
code.frame[class*="sourcemod"]    { color: var(--mod-srv); }
code.frame[class*="ext_so"]       { color: var(--mod-ext); }

.modules, .console, .raw-body {
  color: var(--fg);
  font-size: 12px;
  white-space: pre;
}

/* ---------- raw view ---------- */

.raw {
  background: var(--card-bg);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 24px;
  box-shadow: var(--shadow-sm);
}
.raw-nav {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: 16px;
}
.raw-body {
  background: var(--code-bg);
  border: 1px solid var(--line);
  padding: 18px 20px;
  white-space: pre;
  color: var(--fg);
  font-size: 12px;
  line-height: 1.55;
  overflow-x: auto;
  border-radius: 4px;
}

/* ---------- error page ---------- */

.error { max-width: 640px; margin: 60px auto; text-align: center; }
.error h1 { font-size: 64px; color: var(--fg-faint); margin: 0; }
.error .lede { color: var(--fg-muted); margin: 0 0 20px; }
.error-detail { color: var(--fg); }

/* ---------- responsive ---------- */

@media (max-width: 720px) {
  main { padding: 0 16px; }
  .topbar { padding: 12px 16px; }
  .stats-row { gap: 32px; }
  .stat-number { font-size: 28px; }
  .crash-list th:nth-child(3),
  .crash-list td:nth-child(3) { display: none; }
  .metadata th { text-align: left; }
  .module-table .mod-id { display: none; }
}
