/* Scoped stylesheet for the recreated requisition-scoring pages.

   This is the retired host's app.css with every selector prefixed with .fx-scope. The two stylesheets define
   42 of the same class names - including .btn, .btn-secondary, .form-control and .cell-primary - so loading
   it unscoped would silently restyle all 57 ATS pages, because it loads after site.css and would win.

   The scope is applied by FillabilityLayout, which every page under Pages/Fillability inherits via that
   folder's _Imports.razor. Its :root block became a .fx-scope block so the custom properties it defines
   resolve inside the scope without leaking document-wide.

   Originally generated from that stylesheet, but NO LONGER a pure generated artefact: the palette block below
   was rewritten to derive from the platform theme variables so these pages follow the light/dark toggle, and
   the dark-only hexes throughout the body were replaced with those tokens. Re-generating over the top would
   reintroduce the hardcoded dark and put the whole scope back to unreadable-on-white. Port upstream changes in
   by hand, tokenising any colour they bring with them. */
.fx-scope h1:focus{
    outline: none;
}.fx-scope .valid.modified:not([type=checkbox]){
    outline: 1px solid #26b050;
}.fx-scope .invalid{
    outline: 1px solid #e50000;
}.fx-scope .validation-message{
    color: #e50000;
}.fx-scope .blazor-error-boundary{
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}.fx-scope .blazor-error-boundary::after{
        content: "An error has occurred."
    }.fx-scope .darker-border-checkbox.form-check-input{
    border-color: #929292;
}.fx-scope .form-floating > .form-control-plaintext::placeholder, .fx-scope .form-floating > .form-control::placeholder{
    color: var(--bs-secondary-color);
    text-align: end;
}.fx-scope .form-floating > .form-control-plaintext:focus::placeholder, .fx-scope .form-floating > .form-control:focus::placeholder{
    text-align: start;
}/* ---- CheckMyReq UI ---- */
/* The scope's palette is DERIVED, not fixed: every token below resolves to the platform theme variable
   site.css sets on <html>, so these pages follow the light/dark toggle like the rest of the app instead of
   staying dark on a white page. site.css's dark values were already matched to this palette, so dark mode
   renders exactly as before; light mode is what this mapping buys.

   Rule for anything added here: NEVER write a raw surface/ink hex. Use the tokens — including the derived
   ones below, which exist precisely so the old hardcoded dark hexes (#14171d, #16263a, #102b21 …) have a
   theme-aware home. Only data-encoding colours (choropleth bins, the map's gold selection glow) stay literal,
   because they carry meaning rather than following the surface.
     --sunken     a surface recessed BELOW --panel. Recessed means darker in dark and darker-grey in light,
                  which is why it is set per-theme rather than mapped to --clr-bg-tertiary in both.
     --on-accent  ink for text sitting ON --accent. The accent is a mid blue in light (needs white) and a
                  pale blue in dark (needs near-black), so it cannot be one value.
     --*-bg/-line tinted fill + border for the good/tight/hard semantic states.

   Two mappings deliberately do NOT take the obvious ATS token in light mode, because these pages lean on
   both far harder than the ATS does and the obvious choice fails WCAG AA here:
     --muted   is BODY COPY on this side — the page subtitle, every panel's explanation, the arithmetic
               lines — not the small labels --clr-text-muted was picked for. #8496a8 on white is 3.0:1.
               --clr-text-secondary gives 7.0:1, which is what the original dark pairing (#8b93a4 on
               #0f1115) also gave, so this preserves the design's intent rather than changing it.
     --accent  is both link ink and the primary button's FILL. The brand blue #3B82F6 is 3.7:1 on white
               either way round. Its hover shade #2563EB is 5.2:1 both as text on the page and under the
               white button label — so the scope uses the darker step in light and the brand blue stays
               untouched everywhere else in the app.
   Dark keeps --clr-text-muted / --clr-primary, which are the values this palette always had. */
.fx-scope{
  --bg: var(--clr-bg); --panel: var(--clr-bg-secondary); --line: var(--clr-border);
  --text: var(--clr-text); --muted: var(--clr-text-secondary);
  --good: var(--clr-success); --tight: var(--clr-warn); --hard: var(--clr-danger);
  --accent: var(--clr-primary-hover);
  --sunken: var(--clr-bg-tertiary);
  --accent-bg: color-mix(in srgb, var(--accent) 14%, var(--panel));
  --good-bg: var(--clr-success-bg); --tight-bg: var(--clr-warn-bg); --hard-bg: var(--clr-danger-bg);
  --good-line: color-mix(in srgb, var(--good) 45%, var(--line));
  --tight-line: color-mix(in srgb, var(--tight) 45%, var(--line));
  --hard-line: color-mix(in srgb, var(--hard) 45%, var(--line));
  --on-accent: #ffffff;
  --shadow: 0 8px 24px rgba(11,31,51,0.16);
}
[data-theme="dark"] .fx-scope{
  --muted: var(--clr-text-muted);
  --accent: var(--clr-primary);
  --sunken: #12151c;
  --on-accent: #06101f;
  --shadow: 0 8px 24px rgba(0,0,0,0.5);
}.fx-scope{ background: var(--bg); color: var(--text); font-family: -apple-system, Segoe UI, Roboto, sans-serif; }.fx-scope .wrap{ max-width: 900px; margin: 0 auto; padding: 32px 20px 80px; }.fx-scope .hero h1{ font-size: 2.4rem; margin: 0 0 6px; letter-spacing: -0.02em; }.fx-scope .hero .tag{ color: var(--muted); max-width: 640px; line-height: 1.5; margin: 0 0 24px; }.fx-scope .composer textarea{ width: 100%; box-sizing: border-box; background: var(--panel); color: var(--text);
  border: 1px solid var(--line); border-radius: 12px; padding: 14px; font-size: 0.95rem; resize: vertical; }.fx-scope .composer-row{ display: flex; gap: 10px; margin-top: 10px; }.fx-scope .composer-row .metro{ flex: 1; background: var(--panel); color: var(--text); border: 1px solid var(--line);
  border-radius: 10px; padding: 10px 12px; }.fx-scope .composer-row .metro:disabled{ opacity: 0.5; cursor: not-allowed; }.fx-scope .remote-toggle{ display: flex; align-items: center; gap: 6px; padding: 0 12px; white-space: nowrap;
  color: var(--muted); font-size: 0.9rem; cursor: pointer; user-select: none; border: 1px solid var(--line);
  border-radius: 10px; background: var(--panel); }.fx-scope .remote-toggle input{ accent-color: var(--accent); cursor: pointer; }.fx-scope .hint-required{ margin-top: 8px; color: var(--muted); font-size: 0.85rem; }.fx-scope .admin-note{ margin-top: 10px; display: flex; flex-direction: column; gap: 4px; }.fx-scope .admin-note label{ font-size: 0.8rem; color: var(--muted); display: flex; align-items: center; gap: 8px; }.fx-scope .admin-note textarea{ background: var(--panel); color: var(--text); border: 1px dashed var(--line);
  border-radius: 10px; padding: 8px 10px; font-size: 0.9rem; resize: vertical; }.fx-scope .admin-badge{ font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 700;
  color: var(--accent); border: 1px solid var(--accent); border-radius: 6px; padding: 1px 6px; }.fx-scope .admin-note-view{ margin-bottom: 12px; padding: 8px 12px; border: 1px dashed var(--accent); border-radius: 10px;
  font-size: 0.9rem; display: flex; align-items: center; gap: 10px; }.fx-scope .admin-nav{ margin-bottom: 12px; display: flex; align-items: center; justify-content: center; gap: 12px; }.fx-scope .admin-nav-label{ font-size: 0.85rem; color: var(--muted); display: flex; align-items: center; gap: 8px; }.fx-scope .admin-arrow{ background: var(--panel); color: var(--text); border: 1px solid var(--accent); border-radius: 8px;
  width: 34px; height: 30px; font-size: 1rem; line-height: 1; cursor: pointer; }.fx-scope .admin-arrow:hover:not(:disabled){ background: var(--accent); color: var(--on-accent); }.fx-scope .admin-arrow:disabled{ opacity: 0.35; cursor: default; }.fx-scope .go{ background: var(--accent); color: var(--on-accent); border: 0; border-radius: 10px; padding: 10px 22px;
  font-weight: 700; cursor: pointer; }.fx-scope .go:disabled{ opacity: 0.5; cursor: default; }.fx-scope .error{ margin-top: 12px; color: var(--hard); background: var(--hard-bg); border: 1px solid var(--hard-line);
  padding: 10px 12px; border-radius: 10px; font-size: 0.9rem; }/* ---- advisory banner (non-blocking caveat, e.g. not a tech role) ---- */
.fx-scope .advisory-banner{ display: flex; gap: 12px; align-items: flex-start; padding: 16px 18px;
  border-radius: 14px; border: 1px solid var(--tight); background: var(--tight-bg); }.fx-scope .advisory-banner .advisory-icon{ font-size: 1.3rem; color: var(--tight); line-height: 1.3; }.fx-scope .advisory-banner .advisory-body strong{ display: block; font-size: 1.05rem; margin-bottom: 4px; }.fx-scope .advisory-banner .advisory-body p{ margin: 4px 0 0; font-size: 0.9rem; color: var(--muted); }/* ---- metro conflict notice (caller's metro won over the metro the posting named) ---- */
.fx-scope .metro-conflict{ display: flex; gap: 10px; align-items: flex-start; margin-top: 12px;
  padding: 12px 14px; border-radius: 12px; border: 1px solid var(--line); background: var(--sunken); }.fx-scope .metro-conflict .metro-conflict-icon{ font-size: 1.1rem; line-height: 1.35; }.fx-scope .metro-conflict .metro-conflict-text{ font-size: 0.9rem; color: var(--muted); line-height: 1.45; }.fx-scope .metro-conflict .metro-conflict-text strong{ color: var(--text); font-weight: 600; }.fx-scope .metro-conflict .metro-conflict-rescore{ margin-left: auto; flex-shrink: 0; align-self: center;
  background: transparent; color: var(--text); border: 1px solid var(--line); border-radius: 9px;
  padding: 7px 14px; font-size: 0.82rem; font-weight: 600; cursor: pointer; white-space: nowrap; }.fx-scope .metro-conflict .metro-conflict-rescore:hover:not(:disabled){ border-color: var(--accent); color: var(--accent); }.fx-scope .metro-conflict .metro-conflict-rescore:disabled{ opacity: 0.5; cursor: default; }/* ---- progress meter (shown while an analysis runs) ---- */
.fx-scope .meter{ margin-top: 14px; }.fx-scope .meter-track{ height: 8px; border-radius: 999px; background: var(--sunken); border: 1px solid var(--line); overflow: hidden; }.fx-scope .meter-fill{ height: 100%; width: 4%; border-radius: 999px;
  background: linear-gradient(90deg, var(--accent), var(--good));
  /* Two-phase fill so a slower-than-expected run never visibly STALLS at the cap. The old single linear
     animation reached 92% at --meter-dur and then FROZE — very visible now that a cache-hit re-score (~2s) and
     a fresh extraction (~18s) differ ~10x, so the per-run estimate (last run's time) is often an underestimate.
       Phase 1: ease-out 4%→82% over --meter-dur — fast early, settling around the expected finish.
       Phase 2: a slow linear crawl 82%→99% over 60s, starting where phase 1 ends, so once the estimate elapses
                the bar keeps inching (~0.3%/s) instead of freezing. Any realistic run finishes mid-crawl. */
  animation:
    meter-fill var(--meter-dur, 13s) cubic-bezier(0.25, 0.8, 0.35, 1) forwards,
    meter-crawl 60s var(--meter-dur, 13s) linear forwards; }
@keyframes meter-fill { from { width: 4%; } to { width: 82%; } }
@keyframes meter-crawl { from { width: 82%; } to { width: 99%; } }.fx-scope .meter-phrase{ margin-top: 8px; font-size: 0.85rem; font-style: italic;
  /* Same blue→green gradient as the fill bar, painted onto the text — far more legible than the muted grey. */
  background: linear-gradient(90deg, var(--accent), var(--good));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent;
  animation: meter-pulse 1.9s ease-in-out infinite; }
@keyframes meter-pulse { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } }.fx-scope .result{ margin-top: 28px; }.fx-scope .scorecard{ display: flex; align-items: center; gap: 22px; padding: 22px; border-radius: 16px;
  border: 1px solid var(--line); background: var(--panel); }.fx-scope .scorecard .score{ font-size: 3.4rem; font-weight: 800; line-height: 1; }.fx-scope .scorecard .score span{ font-size: 1.1rem; color: var(--muted); font-weight: 500; }.fx-scope .scorecard.good .score{ color: var(--good); }.fx-scope .scorecard.tight .score{ color: var(--tight); }.fx-scope .scorecard.hard .score{ color: var(--hard); }.fx-scope .score-meta .confidence{ color: var(--muted); font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.04em; }.fx-scope .score-meta .headline{ font-size: 1.1rem; margin-top: 4px; }.fx-scope .score-meta .occupation{ margin-top: 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }.fx-scope .score-meta .occ-title{ font-size: 0.9rem; color: var(--muted); }.fx-scope .soc-pill{ font-size: 0.7rem; font-weight: 600; padding: 1px 8px; border-radius: 999px;
  text-transform: uppercase; letter-spacing: 0.03em; white-space: nowrap; border: 1px solid currentColor; }.fx-scope .soc-pill.soc-corroborated{ color: var(--good); }.fx-scope .soc-pill.soc-reclassified{ color: var(--tight); }.fx-scope .soc-pill.soc-inconclusive{ color: var(--muted); }/* All muted, and deliberately NOT --good: every one of these means "no O*NET verdict on the SOC", however
   different the reasons. The class name comes from the enum member, so a status with no rule here renders
   unstyled rather than wrong. */
.fx-scope .soc-pill.soc-notapplicable{ color: var(--muted); }.fx-scope .soc-pill.soc-nosignal{ color: var(--muted); }.fx-scope .soc-pill.soc-magnetrejected{ color: var(--muted); }.fx-scope .grid{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 14px; }.fx-scope .panel{ background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 16px; }.fx-scope .panel.wide{ grid-column: 1 / -1; }/* Space the contradictions panel (direct child of .result) off the scorecard above it. */
.fx-scope .result > .panel.wide{ margin-top: 14px; }.fx-scope .panel h3{ margin: 0 0 10px; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); }.fx-scope .panel .big{ font-size: 2rem; font-weight: 800; }.fx-scope .panel .big.good{ color: var(--good); }.fx-scope .panel .big.bad{ color: var(--hard); }/* Pro-tier feature sections — a red outline + PRO badge flags which panels are premium (during the
   open beta these render for everyone, so the marker is the only cue that they're gated post-launch). */
.fx-scope .panel.pro-feature{ position: relative; border-color: var(--hard); box-shadow: 0 0 0 1px var(--hard) inset; }.fx-scope .panel.pro-feature::after{ content: "PRO"; position: absolute; top: 12px; right: 14px;
  font-size: 0.62rem; font-weight: 800; letter-spacing: 0.08em; color: var(--hard);
  border: 1px solid var(--hard); border-radius: 6px; padding: 1px 6px;
  background: color-mix(in srgb, var(--hard) 14%, transparent); pointer-events: none; }.fx-scope .muted{ color: var(--muted); font-size: 0.9rem; }.fx-scope .arith{ margin-top: 8px; font-size: 0.82rem; color: var(--muted); font-family: ui-monospace, monospace; }.fx-scope .note{ margin-top: 6px; font-size: 0.8rem; color: var(--muted); }.fx-scope .geo{ margin-top: 10px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; background: var(--sunken); }.fx-scope .geo-top{ display: flex; justify-content: space-between; align-items: center; gap: 8px; }.fx-scope .geo-label{ font-size: 0.72rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; }.fx-scope .geo-badge{ font-size: 0.78rem; font-weight: 700; padding: 2px 9px; border-radius: 999px; white-space: nowrap; }.fx-scope .geo-detail{ margin-top: 5px; font-size: 0.82rem; }.fx-scope .geo-over .geo-badge{ background: var(--good-bg); color: var(--good); }.fx-scope .geo-under .geo-badge{ background: var(--tight-bg); color: var(--tight); }.fx-scope .geo-even .geo-badge{ background: var(--accent-bg); color: var(--accent); }/* Occupation-sensitivity panel — the pool under the classified SOC vs the plausible second choice. */
.fx-scope .alt-soc-panel .alt-soc-compare{ display: grid; grid-template-columns: 1fr auto 1fr; gap: 14px;
  align-items: center; margin-bottom: 4px; }/* Clickable occupation cards — reset the native <button> look, then style like the panels they replaced. */
.fx-scope .alt-soc-col{ display: block; width: 100%; text-align: left; font: inherit; color: inherit;
  padding: 10px 12px; border: 1px solid var(--line); border-radius: 10px; background: var(--panel);
  cursor: pointer; transition: border-color 0.12s, background 0.12s, transform 0.06s; }.fx-scope .alt-soc-col:hover:not(:disabled){ border-color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, var(--panel)); }.fx-scope .alt-soc-col:active:not(:disabled){ transform: translateY(1px); }.fx-scope .alt-soc-col:disabled{ cursor: default; opacity: 0.7; }.fx-scope .alt-soc-col.chosen{ border-color: var(--accent); }.fx-scope .alt-soc-col.is-selected{ box-shadow: 0 0 0 1px var(--accent) inset; }.fx-scope .alt-soc-col.alt{ border-style: dashed; }.fx-scope .alt-soc-cap{ font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); }.fx-scope .alt-soc-occ{ font-size: 0.95rem; font-weight: 700; margin: 2px 0 6px; }.fx-scope .alt-soc-swing{ text-align: center; display: flex; flex-direction: column; align-items: center; gap: 2px; }.fx-scope .alt-soc-swing-num{ font-size: 1.4rem; font-weight: 800; color: var(--hard); }
@media (max-width: 640px) {.fx-scope .alt-soc-panel .alt-soc-compare{ grid-template-columns: 1fr; }.fx-scope .alt-soc-swing{ transform: rotate(90deg); }
}/* Admin-only prevalence breakdown table. */
.fx-scope .admin-prevalence{ border-style: dashed; }.fx-scope .prev-table{ width: 100%; border-collapse: collapse; font-size: 0.85rem; margin-top: 4px; }.fx-scope .prev-table th, .fx-scope .prev-table td{ text-align: left; padding: 5px 10px; border-bottom: 1px solid var(--line); }.fx-scope .prev-table th{ font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); font-weight: 600; }.fx-scope .prev-table td.num, .fx-scope .prev-table th.num{ text-align: right; font-family: ui-monospace, monospace; }.fx-scope .prev-table tr.anchor td{ color: var(--accent); font-weight: 600; }.fx-scope .prev-table tr.unpriced td.num{ color: var(--hard); }.fx-scope .contradiction{ display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: center;
  padding: 10px 0; border-top: 1px solid var(--line); }.fx-scope .contradiction:first-of-type{ border-top: 0; }.fx-scope .contradiction .badge{ font-size: 0.7rem; padding: 3px 8px; border-radius: 999px; text-transform: uppercase; font-weight: 700; }.fx-scope .sev-blocker .badge{ background: var(--hard-bg); color: var(--hard); }.fx-scope .sev-warning .badge{ background: var(--tight-bg); color: var(--tight); }.fx-scope .sev-info .badge{ background: var(--accent-bg); color: var(--accent); }.fx-scope .contradiction .msg{ font-size: 0.92rem; }.fx-scope .contradiction .evidence{ font-family: ui-monospace, monospace; font-size: 0.78rem; color: var(--muted); margin-top: 3px; }.fx-scope .contradiction .penalty{ color: var(--hard); font-weight: 700; }.fx-scope .contradiction .penalty.advisory{ color: var(--muted); font-weight: 600; font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.04em; }.fx-scope .contradiction .stack-list{ display: flex; flex-wrap: wrap; gap: 6px; margin-top: 5px; }.fx-scope .stack-skill{ font-family: ui-monospace, monospace; font-size: 0.76rem; padding: 2px 8px;
  border-radius: 6px; border: 1px solid var(--line); color: var(--muted); background: var(--sunken); }.fx-scope .stack-skill.demote-rec{ color: var(--tight); border-color: var(--tight-line); background: var(--tight-bg); font-weight: 600; }.fx-scope .contradiction .demote-legend{ display: flex; align-items: center; gap: 6px; margin-top: 8px;
  font-size: 0.75rem; color: var(--muted); }.fx-scope .demote-legend .stack-skill{ padding: 0; width: 22px; height: 12px; }.fx-scope .fixes .fix{ display: flex; gap: 12px; align-items: center; padding: 8px 0; border-top: 1px solid var(--line); }.fx-scope .fixes .fix:first-of-type{ border-top: 0; }.fx-scope .fixes .delta{ color: var(--good); font-weight: 800; min-width: 42px; }.fx-scope .raw{ margin-top: 16px; color: var(--muted); }.fx-scope .raw summary{ cursor: pointer; font-size: 0.9rem; }.fx-scope .skills{ display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }.fx-scope .chip{ font-size: 0.8rem; padding: 4px 10px; border-radius: 999px; border: 1px solid var(--line); }.fx-scope .chip.must{ background: var(--accent-bg); color: var(--accent); }.fx-scope .chip.pref{ background: var(--sunken); color: var(--muted); }
@media (max-width: 720px) {.fx-scope .grid{ grid-template-columns: 1fr; } }/* ---- topbar + history ---- */
.fx-scope .beta-banner{ display: flex; justify-content: center; align-items: center; flex-wrap: wrap; gap: 6px 14px;
  padding: 8px 16px; font-size: 0.88rem; color: var(--text);
  background: color-mix(in srgb, var(--accent) 12%, var(--panel)); border-bottom: 1px solid var(--line); }.fx-scope .beta-banner .beta-tag{ display: inline-block; padding: 1px 7px; border-radius: 6px;
  background: var(--accent); color: var(--on-accent); font-weight: 700; font-size: 0.72rem;
  text-transform: uppercase; letter-spacing: 0.05em; }.fx-scope .beta-banner .beta-upgrade{ color: var(--accent); font-weight: 600; text-decoration: none; white-space: nowrap; }.fx-scope .beta-banner .beta-upgrade:hover{ text-decoration: underline; }.fx-scope .upgrade{ max-width: 620px; }.fx-scope .upgrade-card{ background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 28px; }.fx-scope .upgrade-card h1{ margin: 0 0 8px; font-size: 1.9rem; letter-spacing: -0.02em; }.fx-scope .upgrade-card .tag{ color: var(--muted); line-height: 1.5; margin: 0 0 4px; }.fx-scope .upgrade-benefits{ list-style: none; padding: 0; margin: 18px 0 22px; display: grid; gap: 10px; }.fx-scope .upgrade-benefits li{ position: relative; padding-left: 26px; line-height: 1.4; }.fx-scope .upgrade-benefits li::before{ content: "\2713"; position: absolute; left: 0; color: var(--good); font-weight: 700; }.fx-scope .upgrade-price{ margin-top: 10px; font-size: 0.85rem; color: var(--muted); }.fx-scope .upgrade-skip{ display: inline-block; margin-top: 16px; color: var(--muted); font-size: 0.9rem; text-decoration: none; }.fx-scope .upgrade-skip:hover{ text-decoration: underline; }.fx-scope .upgrade-cta{ margin-top: 16px; }.fx-scope .upgrade-card .err{ margin-top: 12px; color: var(--hard); font-size: 0.9rem; }/* ---- "You're all set" (active subscriber) ---- */
.fx-scope .pro-badge{ display: inline-flex; align-items: center; gap: 6px; margin-bottom: 14px;
  font-size: 0.75rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;
  color: var(--good); background: var(--good-bg); border: 1px solid var(--good-line); border-radius: 999px; padding: 5px 12px; }.fx-scope .pro-badge::before{ content: "\2713"; font-size: 0.85rem; }.fx-scope .btn-row{ display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 20px; }/* keep the anchor-styled primary the same height as the bordered ghost button */
.fx-scope .btn-row .go{ display: inline-flex; align-items: center; border: 1px solid transparent; text-decoration: none; }.fx-scope .btn-ghost{ display: inline-flex; align-items: center; background: transparent; color: var(--text);
  border: 1px solid var(--line); border-radius: 10px; padding: 10px 20px; font-weight: 600; cursor: pointer; }.fx-scope .btn-ghost:hover:not(:disabled){ border-color: var(--accent); color: var(--accent); }.fx-scope .btn-ghost:disabled{ opacity: 0.5; cursor: default; }/* width:100% is required because .topbar is a direct child of the column-flex .app-shell:
   without an explicit width, the `margin: 0 auto` cross-axis margins make the flex item
   shrink-wrap to its content and center — collapsing `space-between` so the brand + links
   cluster in the middle instead of pinning left/right. width:100% makes it fill to max-width
   (like .wrap) so the brand sits at the left edge, aligned with the composer below. */
.fx-scope .topbar{ display: flex; align-items: center; justify-content: space-between; width: 100%;
  max-width: 900px; margin: 0 auto; padding: 14px 20px; }.fx-scope .topbar .brand{ font-weight: 800; text-decoration: none; color: var(--text); font-size: 1.15rem; margin-right: auto; }.fx-scope .topbar .links{ display: flex; align-items: center; gap: 16px; }.fx-scope .topbar a{ color: var(--accent); text-decoration: none; font-size: 0.9rem; }.fx-scope .topbar .who{ color: var(--muted); font-size: 0.85rem; }.fx-scope .linkbtn{ background: none; border: 0; color: var(--accent); cursor: pointer; font-size: 0.9rem; padding: 0; }.fx-scope .logout{ display: inline; }/* ---- shared site footer (all pages except /admin) ---- *//* Sticky-footer shell: content grows to fill the viewport so the footer pins to the bottom on short pages
   (home, explore) and reads the same small height on every page instead of floating up under the content. */
.fx-scope .app-shell{ display: flex; flex-direction: column; min-height: 100vh; }.fx-scope .app-main{ flex: 1 0 auto; }.fx-scope .sitefooter{ flex-shrink: 0; border-top: 1px solid var(--line); margin-top: 32px; }.fx-scope .footer-inner{ max-width: 900px; margin: 0 auto; padding: 8px 20px; display: flex;
  align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 6px 14px; }.fx-scope .footer-links{ display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }.fx-scope .footer-links a{ color: var(--accent); text-decoration: none; font-size: 0.72rem; }.fx-scope .footer-links a:hover{ text-decoration: underline; }.fx-scope .footer-copy{ color: var(--muted); font-size: 0.68rem; }/* ---- legal pages (/privacy, /terms) ---- */
.fx-scope .legal{ max-width: 760px; line-height: 1.6; }.fx-scope .legal h1{ font-size: 1.6rem; margin: 0 0 4px; }.fx-scope .legal h2{ font-size: 1.05rem; margin: 28px 0 8px; }.fx-scope .legal .legal-updated{ color: var(--muted); font-size: 0.85rem; margin: 0 0 20px; }.fx-scope .legal p, .fx-scope .legal li{ color: var(--text); font-size: 0.95rem; }.fx-scope .legal ul{ padding-left: 20px; }.fx-scope .legal li{ margin: 6px 0; }.fx-scope .legal a{ color: var(--accent); text-decoration: none; }.fx-scope .legal a:hover{ text-decoration: underline; }.fx-scope table.history{ width: 100%; border-collapse: collapse; margin-top: 16px; }.fx-scope table.history th, .fx-scope table.history td{ text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--line); font-size: 0.9rem; }.fx-scope table.history th{ color: var(--muted); text-transform: uppercase; font-size: 0.72rem; letter-spacing: 0.05em; }/* ---- JD builder (what-if) ---- */
.fx-scope .builder .levers{ display: flex; flex-direction: column; gap: 8px; margin: 12px 0 6px; }.fx-scope .lever{ display: flex; align-items: center; gap: 10px; padding: 9px 12px; border: 1px solid var(--line);
  border-radius: 10px; background: var(--sunken); cursor: pointer; }.fx-scope .lever.on{ border-color: var(--accent); background: var(--accent-bg); }.fx-scope .lever input{ accent-color: var(--accent); width: 16px; height: 16px; cursor: pointer; }.fx-scope .lever-label{ flex: 1; font-size: 0.92rem; }.fx-scope .lever-gain{ font-weight: 700; color: var(--good); font-size: 0.85rem; white-space: nowrap; }.fx-scope .lever-gain.score-only{ color: var(--accent); font-weight: 600; }.fx-scope .lever-gain.none{ color: var(--muted); font-weight: 500; opacity: 0.7; }.fx-scope .builder-out{ margin-top: 16px; border-top: 1px solid var(--line); padding-top: 16px; }.fx-scope .ba-headline{ display: flex; gap: 28px; flex-wrap: wrap; margin-bottom: 14px; }.fx-scope .ba-metric .ba-num{ font-size: 1.5rem; font-weight: 800; }.fx-scope .ba-metric .ba-num strong.good{ color: var(--good); }.fx-scope .ba-metric .ba-num strong.tight{ color: var(--tight); }.fx-scope .ba-metric .ba-num strong.hard{ color: var(--hard); }.fx-scope .chart-h{ font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted);
  margin: 16px 0 6px; }.fx-scope .wf-chart, .fx-scope .ba-chart{ width: 100%; height: auto; overflow: visible; margin-bottom: 8px; }.fx-scope .wf-label{ fill: var(--text); font-size: 12px; }.fx-scope .wf-total-label{ font-weight: 700; }.fx-scope .wf-delta{ fill: var(--good); font-size: 12px; font-weight: 700; }.fx-scope .wf-val{ fill: var(--muted); font-size: 12px; }.fx-scope .wf-total{ fill: var(--accent); font-size: 12px; font-weight: 800; }.fx-scope .ba-label{ fill: var(--muted); font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; }.fx-scope .ba-tag{ fill: var(--muted); font-size: 11px; }.fx-scope .ba-val{ fill: var(--text); font-size: 12px; font-weight: 600; }.fx-scope .builder-hint{ margin-top: 10px; }/* ---- Pro paywall lock (shown in place of a gated section once beta ends) ---- */
.fx-scope .prolock{ grid-column: 1 / -1; margin-top: 14px; border: 1px solid var(--line); border-radius: 14px;
  background: linear-gradient(180deg, var(--panel) 0%, var(--sunken) 100%); position: relative; overflow: hidden; }.fx-scope .prolock::before{ content: ""; position: absolute; inset: 0;
  background: repeating-linear-gradient(135deg, transparent 0 14px, color-mix(in srgb, var(--accent) 6%, transparent) 14px 28px); }.fx-scope .prolock-glass{ position: relative; display: flex; align-items: center; gap: 16px; padding: 20px; }/* In-cell variant: a locked panel that occupies a single grid column (Contention/Comp) instead of spanning
   the full width. Stacks the icon/copy/CTA vertically so it reads in the narrow column. */
.fx-scope .prolock.in-cell{ grid-column: auto; margin-top: 0; }.fx-scope .prolock.in-cell .prolock-glass{ flex-direction: column; align-items: stretch; text-align: left; gap: 10px; padding: 16px; }.fx-scope .prolock.in-cell .prolock-cta{ width: 100%; }.fx-scope .prolock-icon{ font-size: 1.4rem; opacity: 0.9; }.fx-scope .prolock-copy{ flex: 1; }.fx-scope .prolock-title{ font-weight: 700; font-size: 1rem; color: var(--text); }.fx-scope .prolock-sub{ margin-top: 3px; font-size: 0.86rem; color: var(--muted); line-height: 1.45; }.fx-scope .prolock-cta{ flex-shrink: 0; background: var(--accent); color: var(--on-accent); border: 0; border-radius: 10px;
  padding: 10px 18px; font-weight: 700; font-size: 0.9rem; cursor: pointer; }.fx-scope .prolock-cta:hover{ filter: brightness(1.08); }
@media (max-width: 560px) {.fx-scope .prolock-glass{ flex-direction: column; align-items: stretch; text-align: center; } }.fx-scope .upgraded-note{ margin: 16px 0; padding: 12px 16px; border-radius: 10px; font-weight: 600;
  color: var(--good); background: var(--good-bg); border: 1px solid var(--good-line); }/* ---- recent-location chips (localStorage MRU) ---- */
.fx-scope .mru{ display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 8px; }.fx-scope .mru-label{ font-size: 0.78rem; color: var(--muted); margin-right: 2px; }.fx-scope .mru-chip{ background: var(--sunken); color: var(--text); border: 1px solid var(--line); border-radius: 999px;
  padding: 4px 11px; font-size: 0.82rem; cursor: pointer; }.fx-scope .mru-chip:hover{ border-color: var(--accent); }.fx-scope .mru-chip.active{ background: var(--accent-bg); border-color: var(--accent); color: var(--accent); }.fx-scope .mru-clear{ background: none; border: 0; color: var(--muted); font-size: 0.78rem; cursor: pointer;
  text-decoration: underline; padding: 4px 6px; margin-left: auto; }.fx-scope .mru-clear:hover{ color: var(--text); }/* ---- US listings choropleth (/listings-map) — adapted from the Market Intelligence map ---- */
.fx-scope .market-map{ display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(250px, 1fr); gap: 16px;
  align-items: start; margin-top: 18px; }/* Left column stacks the map, its legend, and the employer filter so the legend sits directly under the map
   and the filter fills the space that would otherwise be dead when the metro panel on the right is tall. */
.fx-scope .market-map-left{ display: flex; flex-direction: column; gap: 12px; min-width: 0; }.fx-scope .market-map-tools{ border: 1px solid var(--line); border-radius: 10px; background: var(--panel); padding: 12px 14px; }.fx-scope .map-filter-label{ display: block; margin-bottom: 8px; font-size: 0.8rem; color: var(--muted); }.fx-scope .list-footer{ display: flex; justify-content: center; margin-top: 14px; }/* employer multi-select */
.fx-scope .emp-filter{ position: relative; }.fx-scope .emp-trigger{ display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%;
  background: var(--sunken); color: var(--text); border: 1px solid var(--line); border-radius: 8px;
  padding: 8px 10px; font: inherit; font-size: 0.9rem; cursor: pointer; text-align: left; }.fx-scope .emp-trigger:hover:not(:disabled){ border-color: var(--accent); }.fx-scope .emp-trigger:disabled{ opacity: 0.5; cursor: not-allowed; }.fx-scope .emp-placeholder{ color: var(--muted); }.fx-scope .emp-caret{ color: var(--muted); flex-shrink: 0; }.fx-scope .emp-chips{ display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }.fx-scope .emp-chip{ display: inline-flex; align-items: center; gap: 6px; background: var(--accent-bg); color: var(--accent);
  border: 1px solid var(--accent); border-radius: 999px; padding: 2px 8px 2px 10px; font: inherit;
  font-size: 0.78rem; cursor: pointer; }.fx-scope .emp-chip:hover{ filter: brightness(1.12); }.fx-scope .emp-chip-x{ font-size: 0.7rem; opacity: 0.8; }.fx-scope .emp-backdrop{ position: fixed; inset: 0; z-index: 40; }.fx-scope .emp-dialog{ position: absolute; z-index: 41; top: calc(100% + 6px); left: 0; right: 0; background: var(--panel);
  border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow);
  padding: 10px; display: flex; flex-direction: column; gap: 8px; }.fx-scope .emp-search{ width: 100%; }.fx-scope .emp-list{ display: flex; flex-direction: column; max-height: 240px; overflow-y: auto; gap: 1px; }.fx-scope .emp-option{ display: flex; align-items: center; gap: 8px; padding: 5px 6px; border-radius: 6px;
  cursor: pointer; font-size: 0.85rem; color: var(--text); }.fx-scope .emp-option:hover{ background: var(--sunken); }.fx-scope .emp-option input{ accent-color: var(--accent); cursor: pointer; flex-shrink: 0; }.fx-scope .emp-option-name{ flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }.fx-scope .emp-option-count{ color: var(--muted); font-size: 0.78rem; flex-shrink: 0; }.fx-scope .emp-empty{ color: var(--muted); font-size: 0.82rem; padding: 8px 6px; margin: 0; }.fx-scope .emp-actions{ display: flex; align-items: center; justify-content: space-between; gap: 10px;
  border-top: 1px solid var(--line); padding-top: 8px; }.fx-scope .market-map-canvas{ min-width: 0; }.fx-scope .market-map-canvas svg{ width: 100%; height: auto; display: block; }
@media (max-width: 820px) {.fx-scope .market-map{ grid-template-columns: 1fr; } }.fx-scope .us-state{ stroke: var(--bg); stroke-width: 0.75; cursor: pointer; transition: fill .15s ease, opacity .15s ease; }.fx-scope .us-state:hover{ opacity: .82; stroke: var(--text); stroke-width: 1.25; }/* No listings for the selected metric: outline only, so only states with data stand out. */
.fx-scope .us-state.nodata{ fill: transparent; stroke: var(--line); stroke-width: 0.75; }.fx-scope .us-state.nodata:hover{ opacity: 1; stroke: var(--muted); stroke-width: 1; }.fx-scope .us-state.b1{ fill: #3a4f8c; }.fx-scope .us-state.b2{ fill: #7168d6; }.fx-scope .us-state.b3{ fill: #b9b2ff; }/* The selected state's gold outline, drawn as a separate overlay path so its glow sits above neighbors. */
.fx-scope .map-selection-glow{ fill: none; stroke: #fbbf24; stroke-width: 2.25; pointer-events: none;
  filter: drop-shadow(0 0 4px rgba(251, 191, 36, 0.7)); }.fx-scope .market-map-panel{ border: 1px solid var(--line); border-radius: 12px; background: var(--panel);
  padding: 16px; display: flex; flex-direction: column; }.fx-scope .mmp-metric{ flex-direction: column; align-items: stretch; gap: 5px; margin-bottom: 14px;
  padding-bottom: 12px; border-bottom: 1px solid var(--line); font-size: 0.8rem; color: var(--muted); }.fx-scope .mmp-metric select, .fx-scope .search-input{ width: 100%; background: var(--sunken); color: var(--text);
  border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; font-size: 0.9rem; }.fx-scope .mmp-title{ font-size: 1rem; font-weight: 600; color: var(--text); margin-bottom: 12px; }.fx-scope .mmp-empty, .fx-scope .mmp-hint{ color: var(--muted); font-size: 0.82rem; text-align: center; }.fx-scope .mmp-empty{ margin: auto 0; }.fx-scope .mmp-hint{ margin-top: auto; padding-top: 12px; }.fx-scope .mmp-stat.mmp-primary{ display: flex; flex-direction: column; gap: 2px; padding-bottom: 12px;
  margin-bottom: 12px; border-bottom: 1px solid var(--line); }.fx-scope .mmp-primary .mmp-value{ font-size: 1.6rem; font-weight: 700; color: var(--text); }.fx-scope .mmp-label{ font-size: 0.68rem; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); }.fx-scope .mmp-grid{ display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }.fx-scope .mmp-grid > div{ display: flex; flex-direction: column; gap: 2px; }.fx-scope .mmp-grid > div span:not(.mmp-label){ font-size: 0.95rem; font-weight: 600; color: var(--text); }.fx-scope .mmp-move{ color: var(--good) !important; }.fx-scope .mmp-open{ margin-top: auto; width: 100%; }.fx-scope .btn{ border: 1px solid var(--line); border-radius: 8px; padding: 8px 12px; font-size: 0.85rem;
  cursor: pointer; background: var(--sunken); color: var(--text); }.fx-scope .btn-secondary:hover{ border-color: var(--accent); color: var(--accent); }.fx-scope .market-map-legend{ display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 0;
  font-size: 0.75rem; color: var(--muted); }.fx-scope .market-map-legend .lg{ display: inline-block; width: 13px; height: 13px; border-radius: 3px;
  vertical-align: -2px; margin-right: 5px; }.fx-scope .market-map-legend .lg-scale{ display: inline-flex; align-items: center; gap: 3px; }.fx-scope .market-map-legend .lg-scale .lg{ margin-right: 0; width: 15px; height: 11px; border-radius: 2px; }.fx-scope .lg-nodata{ background: transparent; border: 1px solid var(--line); }.fx-scope .lg-b1{ background: #3a4f8c; }.fx-scope .lg-b2{ background: #7168d6; }.fx-scope .lg-b3{ background: #b9b2ff; }/* state-filtered listings under the map */
.fx-scope .listings-section{ margin-top: 28px; border-top: 1px solid var(--line); padding-top: 18px; }.fx-scope .listings-head{ display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 6px; }.fx-scope .listings-head h2{ margin: 0; font-size: 1.15rem; }.fx-scope .listings-table{ width: 100%; border-collapse: collapse; font-size: 0.88rem; }/* Re-sort / re-filter in flight: dim the rows we're keeping on screen instead of collapsing the table to the
   loading line (which shoves the page around). Rows stay put; only opacity changes, so there's no layout shift. */
.fx-scope .listings-table.reloading{ opacity: 0.5; pointer-events: none; }.fx-scope .listings-table th, .fx-scope .listings-table td{ text-align: left; padding: 8px 10px;
  border-bottom: 1px solid var(--line); vertical-align: top; }.fx-scope .listings-table th{ color: var(--muted); text-transform: uppercase; font-size: 0.68rem; letter-spacing: 0.05em; }.fx-scope .listings-table th.sortable{ cursor: pointer; user-select: none; white-space: nowrap; }.fx-scope .listings-table th.sortable:hover{ color: var(--accent); }.fx-scope .listings-table .cell-primary a{ color: var(--accent); text-decoration: none; }.fx-scope .listings-table .cell-primary a:hover{ text-decoration: underline; }.fx-scope .listings-table .cell-date{ color: var(--muted); white-space: nowrap; }.fx-scope .status-dot{ font-weight: 600; font-size: 0.82rem; }.fx-scope .tag-remote{ display: inline-block; margin-left: 6px; padding: 1px 7px; border-radius: 999px;
  font-size: 0.68rem; font-weight: 600; background: var(--accent-bg); color: var(--accent); }/* enrichment cells: occupation / seniority / skill counts / advertised comp — all degrade to empty when the
   posting's cluster isn't extracted (occ/seniority/skills) or no USD comp was advertised. */
.fx-scope .listings-table .cell-occ{ color: var(--muted); }.fx-scope .badge-seniority{ display: inline-block; padding: 1px 8px; border-radius: 999px; white-space: nowrap;
  font-size: 0.68rem; font-weight: 600; background: var(--sunken); color: var(--text); text-transform: capitalize; }.fx-scope .listings-table .cell-skills{ white-space: nowrap; font-size: 0.82rem; }/* rows whose cluster has named skills: signal the hover tooltip with a help cursor + dotted underline. */
.fx-scope .listings-table .cell-skills.has-tip{ cursor: help; }.fx-scope .listings-table .cell-skills.has-tip .skill-req{ border-bottom: 1px dotted var(--muted); }.fx-scope .cell-skills .skill-req{ font-weight: 600; }.fx-scope .cell-skills .skill-pref{ color: var(--muted); }.fx-scope .listings-table .cell-comp{ white-space: nowrap; font-variant-numeric: tabular-nums; color: var(--good); }/* listings filter bar: toggles + chips that narrow the list under the map (not the choropleth). */
.fx-scope .filter-bar{ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; margin: 4px 0 12px; }.fx-scope .filter-bar.occ-bar{ margin-top: -4px; }.fx-scope .filter-bar .fchk{ display: inline-flex; align-items: center; gap: 5px; font-size: 0.82rem; color: var(--text);
  cursor: pointer; user-select: none; }.fx-scope .filter-bar .fgroup{ display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }.fx-scope .filter-bar .flabel{ color: var(--muted); text-transform: uppercase; font-size: 0.66rem; letter-spacing: 0.05em; }.fx-scope .filter-bar .fselect{ background: var(--sunken); color: var(--text); border: 1px solid var(--line); border-radius: 6px;
  padding: 3px 6px; font-size: 0.8rem; }.fx-scope .filter-bar .fskill{ background: var(--sunken); color: var(--text); border: 1px solid var(--line); border-radius: 6px;
  padding: 3px 8px; font-size: 0.8rem; min-width: 150px; }.fx-scope .filter-bar .fskill:focus, .fx-scope .filter-bar .fselect:focus{ outline: none; border-color: var(--accent); }/* toggle chips (seniority + occupation): off = outlined, on = accent-filled */
.fx-scope .chip{ background: transparent; color: var(--muted); border: 1px solid var(--line); border-radius: 999px;
  padding: 2px 10px; font-size: 0.76rem; cursor: pointer; line-height: 1.5; white-space: nowrap; }.fx-scope .chip:hover{ border-color: var(--accent); color: var(--text); }.fx-scope .chip.chip-on{ background: var(--accent-bg); border-color: var(--accent); color: var(--accent); font-weight: 600; }.fx-scope .chip .chip-count{ color: var(--muted); font-weight: 400; font-size: 0.7rem; margin-left: 2px; }.fx-scope .chip.chip-on .chip-count{ color: var(--accent); }/* skill multi-select: a trigger button that opens a searchable checkbox panel; picks apply on "Apply". */
.fx-scope .filter-bar .skill-filter{ position: relative; }.fx-scope .skill-trigger{ background: var(--sunken); color: var(--text); border: 1px solid var(--line); border-radius: 6px;
  padding: 3px 8px; font-size: 0.8rem; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; }.fx-scope .skill-trigger:hover{ border-color: var(--accent); }.fx-scope .skill-trigger.has-sel{ border-color: var(--accent); color: var(--accent); }.fx-scope .skill-trigger .caret{ font-size: 0.6rem; color: var(--muted); }.fx-scope .skill-panel{ position: absolute; top: calc(100% + 4px); left: 0; z-index: 40; width: 260px;
  background: var(--panel); border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow);
  display: flex; flex-direction: column; }.fx-scope .skill-panel-head{ padding: 8px; border-bottom: 1px solid var(--line); }.fx-scope .skill-search{ width: 100%; box-sizing: border-box; background: var(--bg); color: var(--text);
  border: 1px solid var(--line); border-radius: 5px; padding: 4px 8px; font-size: 0.82rem; }.fx-scope .skill-search:focus{ outline: none; border-color: var(--accent); }.fx-scope .skill-hint{ font-size: 0.68rem; color: var(--muted); }/* All/Any combine-mode toggle in the panel head */
.fx-scope .skill-mode{ display: flex; align-items: center; gap: 8px; margin-top: 8px; }.fx-scope .seg{ display: inline-flex; border: 1px solid var(--line); border-radius: 6px; overflow: hidden; }.fx-scope .seg-btn{ background: transparent; color: var(--muted); border: 0; padding: 2px 12px; font-size: 0.74rem;
  font-weight: 600; cursor: pointer; }.fx-scope .seg-btn + .seg-btn{ border-left: 1px solid var(--line); }.fx-scope .seg-btn:hover:not(.seg-on){ color: var(--text); }.fx-scope .seg-btn.seg-on{ background: var(--accent-bg); color: var(--accent); }.fx-scope .skill-options{ max-height: 240px; overflow-y: auto; padding: 4px; }.fx-scope .skill-opt{ display: flex; align-items: center; gap: 7px; padding: 4px 6px; border-radius: 5px;
  font-size: 0.82rem; cursor: pointer; }.fx-scope .skill-opt:hover{ background: var(--sunken); }.fx-scope .skill-opt .skill-opt-name{ flex: 1; }.fx-scope .skill-opt .skill-opt-count{ color: var(--muted); font-size: 0.7rem; }.fx-scope .skill-add{ width: 100%; text-align: left; background: transparent; color: var(--accent); border: 0;
  padding: 5px 6px; font-size: 0.8rem; cursor: pointer; border-radius: 5px; }.fx-scope .skill-add:hover{ background: var(--accent-bg); }.fx-scope .skill-empty{ color: var(--muted); font-size: 0.8rem; padding: 6px; margin: 0; }.fx-scope .skill-panel-foot{ display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 8px; border-top: 1px solid var(--line); }.fx-scope .btn-apply{ background: var(--accent); color: var(--on-accent); border: 0; border-radius: 6px; padding: 4px 14px;
  font-size: 0.8rem; font-weight: 600; cursor: pointer; }.fx-scope .btn-apply:hover{ filter: brightness(1.08); }/* admin-only per-row liveness maintenance: small open/closed buttons + a status banner. */
.fx-scope .listings-table .cell-verify{ white-space: nowrap; }.fx-scope .vbtn{ padding: 2px 8px; border-radius: 5px; font-size: 0.72rem; font-weight: 600; cursor: pointer;
  background: transparent; line-height: 1.5; }.fx-scope .vbtn:disabled{ opacity: 0.4; cursor: default; }.fx-scope .vbtn-open{ border: 1px solid var(--good-line); color: var(--good); }.fx-scope .vbtn-open:hover:not(:disabled){ background: var(--good-bg); }.fx-scope .vbtn-closed{ border: 1px solid var(--hard-line); color: var(--hard); margin-left: 4px; }.fx-scope .vbtn-closed:hover:not(:disabled){ background: var(--hard-bg); }.fx-scope .admin-msg{ margin: 4px 0 10px; padding: 6px 12px; border-radius: 6px; font-size: 0.85rem;
  background: var(--good-bg); color: var(--good); border: 1px solid var(--good-line); }.fx-scope .admin-msg.admin-msg-err{ background: var(--hard-bg); color: var(--hard); border-color: var(--hard-line); }/* metro (CBSA) drill-down: a zoomed single-state SVG with a bubble per metro */
.fx-scope .zoom-canvas{ border: 1px solid var(--line); border-radius: 10px; background: var(--sunken);
  padding: 6px; margin-bottom: 12px; }.fx-scope .zoom-canvas svg{ width: 100%; height: auto; display: block; max-height: 300px; }.fx-scope .zoom-state{ fill: var(--sunken); stroke: var(--muted); stroke-width: 0.6; }.fx-scope .us-metro{ fill: var(--accent); fill-opacity: 0.55; stroke: var(--accent); cursor: pointer;
  transition: fill-opacity .12s ease; }.fx-scope .us-metro:hover{ fill-opacity: 0.85; }.fx-scope .us-metro.selected{ fill: var(--good); fill-opacity: 0.8; stroke: var(--text); }.fx-scope .us-metro-label{ fill: var(--text); text-anchor: middle; pointer-events: none;
  paint-order: stroke; stroke: var(--bg); stroke-width: 2.4px; stroke-linejoin: round; font-weight: 600; }.fx-scope .mmp-metros{ display: flex; flex-direction: column; gap: 2px; overflow-y: auto; max-height: 240px;
  margin: 0 -4px; padding: 0 4px; }.fx-scope .metro-row{ display: flex; align-items: center; justify-content: space-between; gap: 8px;
  width: 100%; text-align: left; font: inherit; color: var(--text); cursor: pointer;
  background: none; border: 0; border-radius: 6px; padding: 6px 8px; }.fx-scope .metro-row:hover{ background: var(--sunken); }.fx-scope .metro-row.active{ background: var(--accent-bg); color: var(--accent); }.fx-scope .metro-name{ font-size: 0.85rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }.fx-scope .metro-noloc{ color: var(--muted); }.fx-scope .metro-count{ font-size: 0.82rem; font-weight: 600; color: var(--muted); flex-shrink: 0; }.fx-scope .metro-row.active .metro-count{ color: var(--accent); }.fx-scope .mmp-note{ margin-top: 8px; font-size: 0.72rem; color: var(--muted); }/* ---- /occupations charts page ---- */
/* min-width:0 because a flex item's default min-width:auto is its MIN-CONTENT width, and a select's
   min-content width is its widest option — "New York-Newark-Jersey City, NY-NJ-PA (2,020 reqs)" refused to
   shrink and pushed the whole page sideways on a phone, whatever flex-shrink said. */
.fx-scope .occ-picker{ display: flex; align-items: center; gap: 10px; margin-bottom: 22px; }.fx-scope .occ-picker select{ min-width: 0; }.fx-scope .occ-picker label{ font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); }.fx-scope .occ-picker select{ flex: 1; max-width: 420px; background: var(--panel); color: var(--text);
  border: 1px solid var(--line); border-radius: 10px; padding: 9px 12px; font-size: 0.95rem; cursor: pointer; }.fx-scope .occ-picker select:focus{ outline: none; border-color: var(--accent); }.fx-scope .occ-charts{ display: flex; flex-direction: column; gap: 18px; }.fx-scope .chart-card h3{ margin: 0 0 4px; }.fx-scope .chart-card .note-top{ margin: 0 0 12px; }/* ---- /metros tables (roles in demand, seniority mix, what roles earn here) ----
   These classes were referenced by MetroInsights.razor and defined NOWHERE, so the tables rendered with the
   browser's default cell spacing: five money columns on "what roles earn here" ran together into one string.
   Separation comes from the numeric columns' own left padding rather than from fixed widths — occupation
   names run from "Actuaries" to "Software Quality Assurance Analysts and Testers", so the first column takes
   width:100%, absorbs all the slack, and the figures stay the same distance apart either way. */
.fx-scope .cbsa-table{ width: 100%; border-collapse: collapse; font-size: 0.9rem; }
.fx-scope .cbsa-table th{ text-align: left; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;
  color: var(--muted); font-weight: 600; white-space: nowrap; padding: 0 0 8px;
  border-bottom: 1px solid var(--line); }.fx-scope .cbsa-table td{ padding: 8px 0; border-bottom: 1px solid var(--line); vertical-align: baseline; }.fx-scope .cbsa-table tbody tr:last-child td{ border-bottom: 0; }.fx-scope .cbsa-table th:first-child, .fx-scope .cbsa-table td:first-child{ width: 100%; padding-right: 20px; }.fx-scope .cbsa-table th.num, .fx-scope .cbsa-table td.num{ text-align: right; white-space: nowrap; padding-left: 28px;
  font-variant-numeric: tabular-nums; }.fx-scope .cbsa-table td.strong{ font-weight: 700; color: var(--text); }.fx-scope .cbsa-table .muted{ color: var(--muted); font-size: 0.85em; }/* A five-column money table cannot shrink below its own digits, and this is a public page that is indexed
   mobile-first — so the table scrolls inside its panel instead of pushing the page sideways. */
.fx-scope .cbsa-scroll{ overflow-x: auto; }/* shared chart chrome */
.fx-scope .pv-chart, .fx-scope .wage-chart{ width: 100%; height: auto; overflow: visible; }.fx-scope .pv-label{ fill: var(--text); font-size: 12px; }.fx-scope .pv-val{ fill: var(--muted); font-size: 12px; font-weight: 600; }.fx-scope .wage-lbl{ fill: var(--text); font-size: 13px; font-weight: 600; }.fx-scope .wage-lbl.wage-median{ fill: var(--good); }.fx-scope .wage-tag{ fill: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; }.fx-scope .edu-chart svg{ width: 100%; height: auto; display: block; }.fx-scope .edu-seg-lbl{ fill: #f5f8ff; font-size: 12px; font-weight: 700; }.fx-scope .edu-legend{ margin-top: 10px; }.fx-scope .chart-legend{ display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 8px; }.fx-scope .chart-legend .lg{ display: inline-flex; align-items: center; gap: 6px; font-size: 0.82rem; color: var(--muted); }.fx-scope .chart-legend .sw{ width: 11px; height: 11px; border-radius: 3px; display: inline-block; flex-shrink: 0; }.fx-scope .chart-legend .sw-accent{ background: var(--accent); }.fx-scope .chart-legend .sw-line{ background: var(--line); }.fx-scope .chart-legend .sw-good{ background: var(--good); }/* skills that travel together — one mini bar-set per anchor skill *//* talent-supply section: heading with an inline language selector */
.fx-scope .supply-head{ display: flex; align-items: center; justify-content: space-between; gap: 12px;
  flex-wrap: wrap; margin-bottom: 4px; }.fx-scope .supply-head h3{ margin: 0; }.fx-scope .supply-picker{ display: flex; align-items: center; gap: 8px; }.fx-scope .supply-picker label{ font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); }.fx-scope .supply-picker select{ background: var(--panel); color: var(--text); border: 1px solid var(--line);
  border-radius: 10px; padding: 7px 10px; font-size: 0.9rem; cursor: pointer; }.fx-scope .supply-picker select:focus{ outline: none; border-color: var(--accent); }/* O*NET salience panel */
.fx-scope .salience-stats{ display: flex; flex-wrap: wrap; gap: 10px 28px; margin: 4px 0 14px; }.fx-scope .sstat{ display: flex; flex-direction: column; }.fx-scope .sstat-num{ font-size: 1.6rem; font-weight: 700; line-height: 1.1; }.fx-scope .sstat-num.good{ color: var(--good); }.fx-scope .sstat-num.accent{ color: var(--accent); }.fx-scope .sstat-lbl{ font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); }.fx-scope .chip-row{ display: flex; flex-wrap: wrap; gap: 6px; }.fx-scope .chip-hot{ background: var(--tight-bg); color: var(--tight); border-color: var(--tight); }
