/* ==========================================================================
   app.css — the single source of truth for the whole site.
   ==========================================================================

   WHY THIS FILE EXISTS
   The site previously had ZERO external stylesheets. 111,237 lines of CSS
   lived inline across ~100 pages, each declaring its own :root block. That
   produced 275 unique hex colours, 21 border-radius values and four different
   ways of writing the Inter font stack — which is why no two pages matched.

   Everything here is referenced by token name. Add a page, get the design.

   HOW TO USE
     <?php include $_SERVER['DOCUMENT_ROOT'].'/includes/ui/page-head.php'; ?>
     <?php include $_SERVER['DOCUMENT_ROOT'].'/includes/ui/page-nav.php'; ?>
       ... page content, using the classes below ...
     <?php include $_SERVER['DOCUMENT_ROOT'].'/includes/ui/page-foot.php'; ?>

   RULES
     1. Never hard-code a colour. Use a token.
     2. Green and red mean money direction only. Never decorative.
     3. Numbers always get .n (tabular figures) so columns align.
     4. Mobile first-class: every component below has a mobile behaviour.
   ========================================================================== */

/* ============================== 1. TOKENS ============================== */
:root{
  --font:'Plus Jakarta Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;

  /* Money + status. Semantic only. */
  --gain:#3ECF8E;  --gain-soft:rgba(62,207,142,.13);
  --loss:#FF6166;  --loss-soft:rgba(255,97,102,.13);
  --flag:#F5C451;  --flag-soft:rgba(245,196,81,.13);
  --info:#5B9DFF;  --info-soft:rgba(91,157,255,.13);

  --r-sm:8px; --r-md:12px; --r-lg:18px; --r-xl:26px; --r-pill:999px;

  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:20px; --s6:28px; --s7:40px; --s8:64px;

  --rail:240px;
  --wrap:1440px;

  /* Motion */
  --fast:.14s ease;
  --med:.2s ease;
}

/* The rail keeps a dark surface in both themes. In light mode an all-white
   sidebar next to an almost-white canvas washed the page out. */
[data-theme="dark"]{
  --bg:#08080A;
  --surface:#101013;
  --surface-2:#17171B;
  --surface-3:#1F1F24;
  --hair:rgba(255,255,255,.06);
  --hair-2:rgba(255,255,255,.11);
  --text:#FAFAFA;
  --text-2:#9E9EA7;
  --text-3:#6B6B75;
  --inv-bg:#FAFAFA; --inv-fg:#0B0B0D;
  --shadow-sm:0 1px 2px rgba(0,0,0,.4);
  --shadow:0 1px 2px rgba(0,0,0,.5),0 18px 44px rgba(0,0,0,.55);
  --scrim:linear-gradient(to top,rgba(6,6,8,.96) 0%,rgba(6,6,8,.6) 42%,rgba(6,6,8,0) 88%);
  --glass:rgba(16,16,19,.82);
  --overlay:rgba(4,4,6,.7);
  --rail-bg:#000000;
  --rail-line:rgba(255,255,255,.07);
  --rail-text:#FAFAFA;
  --rail-text-2:#9294A0;
  --rail-text-3:#63656F;
  --rail-hover:rgba(255,255,255,.06);
  --rail-active:rgba(255,255,255,.11);
}
[data-theme="light"]{
  --bg:#F0F0F4;
  --surface:#FFFFFF;
  --surface-2:#F7F7F9;
  --surface-3:#EDEDF1;
  --hair:rgba(10,10,14,.07);
  --hair-2:rgba(10,10,14,.13);
  --text:#0B0B0D;
  --text-2:#5C5C66;
  --text-3:#8E8E99;
  --inv-bg:#0B0B0D; --inv-fg:#FAFAFA;
  --shadow-sm:0 1px 2px rgba(10,10,14,.06);
  --shadow:0 1px 2px rgba(10,10,14,.05),0 18px 44px rgba(10,10,14,.10);
  --scrim:linear-gradient(to top,rgba(8,8,10,.92) 0%,rgba(8,8,10,.5) 42%,rgba(8,8,10,0) 88%);
  --glass:rgba(255,255,255,.86);
  --overlay:rgba(20,20,26,.5);
  --gain:#12A06A; --loss:#DE3C42; --flag:#C08A12; --info:#2F6FD0;
  --rail-bg:#000000;
  --rail-line:rgba(255,255,255,.08);
  --rail-text:#F7F7F9;
  --rail-text-2:#A2A4B0;
  --rail-text-3:#70737E;
  --rail-hover:rgba(255,255,255,.07);
  --rail-active:rgba(255,255,255,.13);
}

/* ============================== 2. BASE ============================== */
*,*::before,*::after{box-sizing:border-box}
/* The canvas colour must be on <html>, not just body: during a navigation the
   browser paints the root background before author styles finish, and without
   this it paints white — the flash between pages. `color-scheme` tells the UA
   which default to use for that first frame and for form controls/scrollbars. */
html{-webkit-text-size-adjust:100%;background:var(--bg);color-scheme:dark}
[data-theme="light"]{color-scheme:light}
body{
  margin:0;background:var(--bg);color:var(--text);
  font-family:var(--font);font-size:15px;line-height:1.5;letter-spacing:-.01em;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  transition:background .3s ease,color .3s ease;
}
img,svg,video{display:block;max-width:100%}
button,input,select,textarea{font:inherit;color:inherit}
a{color:inherit}
:focus-visible{outline:2px solid var(--text);outline-offset:2px;border-radius:6px}
::selection{background:var(--text);color:var(--bg)}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important;scroll-behavior:auto!important}}

.i{width:18px;height:18px;flex:0 0 auto;stroke:currentColor;stroke-width:1.7;fill:none;
   stroke-linecap:round;stroke-linejoin:round}
.i-sm{width:15px;height:15px}
.i-lg{width:22px;height:22px}

/* Screen-reader only, for icon-only controls. */
.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
    clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* NUMBERS. Tabular figures, eased tracking — deliberately looser than
   headings, because tabular digits are fixed-width and tighten badly. */
.n{font-variant-numeric:tabular-nums;letter-spacing:-.018em;font-weight:600}

.eyebrow{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-3)}
.muted{color:var(--text-2)}
.dim{color:var(--text-3)}
.up{color:var(--gain)} .down{color:var(--loss)}

/* ============================== 3. TYPE SCALE ============================== */
h1,.h1{font-size:29px;font-weight:800;letter-spacing:-.045em;line-height:1.08;margin:0}
h2,.h2{font-size:22px;font-weight:700;letter-spacing:-.038em;line-height:1.15;margin:0}
h3,.h3{font-size:16.5px;font-weight:700;letter-spacing:-.03em;margin:0}
.lede{font-size:14.5px;color:var(--text-2);margin:5px 0 0}
.fig-xl{font-size:42px;font-weight:700;letter-spacing:-.04em;line-height:1.02;
        font-variant-numeric:tabular-nums}
.fig-lg{font-size:25px;font-weight:600;letter-spacing:-.025em;font-variant-numeric:tabular-nums}
.fig-md{font-size:19px;font-weight:600;letter-spacing:-.022em;font-variant-numeric:tabular-nums}

/* ============================== 4. SHELL ============================== */
.app{display:flex;min-height:100vh}

.rail{
  width:var(--rail);flex:0 0 var(--rail);position:sticky;top:0;height:100vh;
  border-right:1px solid var(--rail-line);display:flex;flex-direction:column;
  padding:var(--s5) var(--s3);background:var(--rail-bg);color:var(--rail-text);
}
.brand{display:flex;align-items:center;gap:10px;padding:0 var(--s3) var(--s6);text-decoration:none}
.brand-mark{width:30px;height:30px;border-radius:9px;background:#FAFAFA;color:#0B0B0D;
            display:grid;place-items:center;flex:0 0 30px}
.rail .brand-name{color:var(--rail-text)}
.brand-name{font-size:15px;font-weight:700;letter-spacing:-.03em}

.nav{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:1px}
.nav-sec{margin:var(--s5) 0 var(--s2);padding:0 var(--s3);font-size:10.5px;font-weight:700;
         letter-spacing:.09em;text-transform:uppercase;color:var(--rail-text-3)}
.nav-sec:first-child{margin-top:0}
.nav-item{
  display:flex;align-items:center;gap:10px;padding:8px var(--s3);border-radius:var(--r-sm);
  color:var(--rail-text-2);font-size:14px;font-weight:500;text-decoration:none;cursor:pointer;
  transition:background var(--fast),color var(--fast);
}
.nav-item:hover{background:var(--rail-hover);color:var(--rail-text)}
.nav-item[aria-current="page"]{background:var(--rail-active);color:var(--rail-text);font-weight:600}
.badge{margin-left:auto;font-size:10.5px;font-weight:700;background:var(--rail-hover);
       color:var(--rail-text-2);padding:1px 6px;border-radius:5px;font-variant-numeric:tabular-nums}
.nav-item[aria-current="page"] .badge{background:var(--rail-active);color:var(--rail-text)}
.badge.alert{background:var(--loss-soft);color:var(--loss)}
.badge.flag{background:var(--flag-soft);color:var(--flag)}

.rail-foot{padding-top:var(--s4);border-top:1px solid var(--rail-line);display:flex;align-items:center;gap:9px}
.rail-foot .ghost{color:var(--rail-text-3)}
.rail-foot .ghost:hover{background:var(--rail-hover);color:var(--rail-text)}
.avatar{width:29px;height:29px;flex:0 0 29px;border-radius:var(--r-pill);background:var(--rail-hover);
        display:grid;place-items:center;font-size:11.5px;font-weight:700;color:var(--rail-text-2);overflow:hidden}
.avatar img{width:100%;height:100%;object-fit:cover}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{padding:var(--s6) var(--s7) var(--s5);display:flex;align-items:center;gap:var(--s4);
        flex-wrap:wrap;max-width:var(--wrap);width:100%;margin:0 auto}
.topbar-actions{margin-left:auto;display:flex;gap:var(--s2);align-items:center;flex-wrap:wrap}
/* Centred BETWEEN the rail and the right edge of the window, not across the
   whole viewport — the auto margins are what balance the gutters. */
.content{padding:0 var(--s7) var(--s8);max-width:var(--wrap);width:100%;margin:0 auto}

/* ============================== 5. CONTROLS ============================== */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  font-size:13.5px;font-weight:600;letter-spacing:-.015em;
  padding:9px 15px;border-radius:10px;cursor:pointer;white-space:nowrap;
  border:1px solid var(--hair-2);background:transparent;color:var(--text);
  transition:background var(--fast),border-color var(--fast),opacity var(--fast);
}
.btn:hover{background:var(--surface-2)}
.btn:active{transform:translateY(1px)}
.btn[disabled]{opacity:.45;cursor:not-allowed}
.btn-primary{background:var(--inv-bg);color:var(--inv-fg);border-color:transparent}
.btn-primary:hover{background:var(--inv-bg);opacity:.88}
.btn-danger{background:var(--loss);color:#fff;border-color:transparent}
.btn-danger:hover{opacity:.9}
.btn-sm{padding:6px 11px;font-size:12.5px;border-radius:8px}
.btn-lg{padding:12px 20px;font-size:15px;border-radius:12px}
.btn-icon{padding:8px;border-radius:9px}
.btn-block{width:100%}

.ghost{background:none;border:0;color:var(--text-3);cursor:pointer;padding:6px;border-radius:var(--r-sm);
       display:grid;place-items:center;transition:background var(--fast),color var(--fast)}
.ghost:hover{background:var(--surface-2);color:var(--text)}
.more{background:none;border:0;color:var(--text-3);font-size:13px;font-weight:600;cursor:pointer;
      padding:4px 8px;border-radius:6px;transition:background var(--fast),color var(--fast)}
.more:hover{background:var(--surface-2);color:var(--text)}

.seg{display:inline-flex;background:var(--surface-2);border-radius:10px;padding:3px;gap:2px}
.seg button{font-size:13px;font-weight:600;letter-spacing:-.01em;padding:6px 13px;border:0;
            border-radius:7px;background:none;color:var(--text-2);cursor:pointer;
            transition:background var(--fast),color var(--fast)}
.seg button[aria-selected="true"]{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm)}

/* Form fields */
.field{display:block;margin-bottom:var(--s4)}
.field > label,.label{display:block;font-size:12.5px;font-weight:600;color:var(--text-2);margin-bottom:6px}
.input,.select,.textarea{
  width:100%;padding:10px 13px;border-radius:10px;
  background:var(--surface-2);border:1px solid var(--hair-2);color:var(--text);
  font-size:14.5px;transition:border-color var(--fast),background var(--fast);
}
.input:focus,.select:focus,.textarea:focus{outline:none;border-color:var(--text-3);background:var(--surface)}
.input::placeholder,.textarea::placeholder{color:var(--text-3)}
.textarea{min-height:110px;resize:vertical}
.hint{font-size:12px;color:var(--text-3);margin-top:5px}
.error{font-size:12px;color:var(--loss);margin-top:5px;font-weight:500}
.input[aria-invalid="true"]{border-color:var(--loss)}

.switch{position:relative;display:inline-flex;align-items:center;gap:10px;cursor:pointer}
.switch input{position:absolute;opacity:0;width:0;height:0}
.switch-track{width:38px;height:22px;border-radius:var(--r-pill);background:var(--surface-3);
              transition:background var(--fast);flex:0 0 38px;position:relative}
.switch-track::after{content:"";position:absolute;top:3px;left:3px;width:16px;height:16px;
                     border-radius:50%;background:var(--text-2);transition:transform var(--fast),background var(--fast)}
.switch input:checked + .switch-track{background:var(--gain)}
.switch input:checked + .switch-track::after{transform:translateX(16px);background:#fff}
.switch input:focus-visible + .switch-track{outline:2px solid var(--text);outline-offset:2px}

/* ============================== 6. SURFACES ============================== */
.panel{background:var(--surface);border-radius:var(--r-lg);box-shadow:var(--shadow-sm);overflow:hidden}
.panel-head{padding:var(--s5) var(--s5) var(--s4);display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap}
.panel-head > :last-child.btn,.panel-head > :last-child.more,.panel-head > :last-child.seg{margin-left:auto}
.panel-pad{padding:0 var(--s5) var(--s5)}
.panel-body{padding:var(--s5)}
.panel-foot{padding:var(--s4) var(--s5);border-top:1px solid var(--hair);display:flex;gap:var(--s2);align-items:center}

.section{margin-bottom:var(--s4)}
.grid{display:grid;gap:var(--s4)}
.grid-2{grid-template-columns:repeat(2,1fr)}
.grid-3{grid-template-columns:repeat(3,1fr)}
.grid-4{grid-template-columns:repeat(4,1fr)}
.grid-main{grid-template-columns:1.6fr 1fr}
.row{display:flex;align-items:center;gap:var(--s3)}
.spacer{margin-left:auto}

/* Figure strip — the quiet stats block. */
.figs{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--hair)}
.figs.figs-2{grid-template-columns:repeat(2,1fr)}
.fig{background:var(--surface);padding:var(--s5)}
.fig-l{font-size:12.5px;color:var(--text-3);font-weight:500}
.fig-v{font-size:25px;font-weight:600;letter-spacing:-.025em;font-variant-numeric:tabular-nums;
       margin-top:5px;display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}

/* ============================== 7. CHIPS & STATUS ============================== */
.chip{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;font-weight:700;
      padding:2px 7px;border-radius:6px;letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.chip-gain{background:var(--gain-soft);color:var(--gain)}
.chip-loss{background:var(--loss-soft);color:var(--loss)}
.chip-flag{background:var(--flag-soft);color:var(--flag)}
.chip-info{background:var(--info-soft);color:var(--info)}
.chip-mute{background:var(--surface-3);color:var(--text-2)}

.sdot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:5px;vertical-align:1px}
.sdot-gain{background:var(--gain)} .sdot-loss{background:var(--loss)}
.sdot-flag{background:var(--flag)} .sdot-mute{background:var(--text-3)}

/* Floating chip over an image */
.chipfloat{
  position:absolute;display:inline-flex;align-items:center;gap:5px;
  background:rgba(10,10,12,.6);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  border:1px solid rgba(255,255,255,.12);color:#FAFAFA;
  font-size:11px;font-weight:600;padding:3px 8px;border-radius:var(--r-pill);
}
.chipfloat.tl{top:10px;left:10px} .chipfloat.tr{top:10px;right:10px}
.chipfloat.bl{bottom:10px;left:10px} .chipfloat.br{bottom:10px;right:10px}

/* ============================== 8. HERO ============================== */
/* The .hero image component was removed: nothing used it, and its generic
   name collided with fmr/crime where .hero is a plain page section. */
/* .hero-title is still used by fmr/crime as a page heading; page CSS sets its size. */
.hero-title{font-weight:800;letter-spacing:-.045em;line-height:1.06;color:var(--text)}
.hs-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:rgba(250,250,250,.5)}
.hs-v{font-size:24px;font-weight:600;letter-spacing:-.028em;font-variant-numeric:tabular-nums;margin-top:4px}
.tagline{display:inline-flex;align-items:center;gap:6px;background:rgba(255,255,255,.12);
         backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
         border:1px solid rgba(255,255,255,.16);color:#FAFAFA;font-size:11.5px;font-weight:600;
         padding:5px 11px;border-radius:var(--r-pill)}

/* ============================== 9. MEDIA CARDS ============================== */
.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4)}
.card{background:var(--surface);border-radius:var(--r-lg);overflow:hidden;cursor:pointer;
      box-shadow:var(--shadow-sm);transition:transform var(--med),box-shadow var(--med);
      text-decoration:none;color:inherit;display:block}
.card:hover{transform:translateY(-3px);box-shadow:var(--shadow)}
.card-img{position:relative;aspect-ratio:3/2;overflow:hidden;background:var(--surface-3)}
/* Direct children only, and never an icon. This rule previously matched the
   camera icon inside .chipfloat and blew it up to fill the whole card. */
.card-img > img,.card-img > svg:not(.i){width:100%;height:100%;object-fit:cover}
.card-img .i{width:18px;height:18px}
.card-img .i-lg{width:26px;height:26px}
.card-body{padding:var(--s4) var(--s4) var(--s5)}
.card-title{font-size:15.5px;font-weight:700;letter-spacing:-.03em}
.card-sub{font-size:12.5px;color:var(--text-3);margin-top:2px}
.card-facts{display:flex;gap:var(--s4);margin-top:var(--s4);font-size:12.5px;
            color:var(--text-2);font-weight:500;flex-wrap:wrap}
.fact{display:flex;align-items:center;gap:5px}
.card-foot{display:flex;align-items:center;gap:var(--s2);margin-top:var(--s4);
           padding-top:var(--s4);border-top:1px solid var(--hair)}
.card-foot > :last-child{margin-left:auto}

/* ============================== 10. LISTS ============================== */
.list{display:flex;flex-direction:column}
.li{display:flex;align-items:center;gap:var(--s3);padding:11px var(--s5);cursor:pointer;
    transition:background var(--fast);text-decoration:none;color:inherit}
.li:hover{background:var(--surface-2)}
.li-th{width:40px;height:40px;flex:0 0 40px;border-radius:10px;overflow:hidden;background:var(--surface-3)}
.li-th > img,.li-th > svg:not(.i){width:100%;height:100%;object-fit:cover}
.li-th .i{width:16px;height:16px}
.li-ico{width:30px;height:30px;flex:0 0 30px;border-radius:9px;display:grid;place-items:center}
.li-ico.gain{background:var(--gain-soft);color:var(--gain)}
.li-ico.loss{background:var(--loss-soft);color:var(--loss)}
.li-ico.flag{background:var(--flag-soft);color:var(--flag)}
.li-ico.info{background:var(--info-soft);color:var(--info)}
.li-t{font-size:13.5px;font-weight:600;letter-spacing:-.02em}
.li-s{font-size:11.5px;color:var(--text-3);margin-top:1px;font-weight:500}
.li-right{margin-left:auto;text-align:right}
.li-v{font-size:13.5px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.02em}

/* ============================== 11. TABLES ============================== */
.tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tbl{width:100%;border-collapse:collapse;font-size:13.5px;color:var(--text)}
.tbl th{text-align:left;padding:var(--s3) var(--s5);border-bottom:1px solid var(--hair);
        font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
        color:var(--text-3);white-space:nowrap}
.tbl td{padding:var(--s4) var(--s5);border-bottom:1px solid var(--hair);vertical-align:middle;
        color:var(--text)}
.tbl td strong,.tbl td b{color:var(--text);font-weight:700}
.tbl td .num{color:inherit}
.tbl tbody tr:last-child td{border-bottom:0}
.tbl tbody tr{transition:background var(--fast)}
.tbl tbody tr:hover{background:var(--surface-2)}
.tbl .right{text-align:right}
.tbl .num{font-variant-numeric:tabular-nums;font-weight:600;letter-spacing:-.018em}

/* ============================== 12. MAP ============================== */
.map{position:relative;min-height:320px;background:var(--surface-2)}
.map > *{width:100%;height:100%}
.map-legend{position:absolute;left:var(--s4);bottom:var(--s4);background:var(--glass);
            backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
            border:1px solid var(--hair-2);border-radius:10px;padding:8px 11px;
            display:flex;flex-direction:column;gap:5px}
.map-legend span{font-size:11.5px;color:var(--text-2);font-weight:500;display:flex;align-items:center}

/* Google's InfoWindow wraps content in a scrolling div and adds its own
   padding, which clipped the photo and cut the button off the bottom. */
.gm-style .gm-style-iw-c{padding:0!important;border-radius:14px!important;
  box-shadow:0 8px 28px rgba(0,0,0,.28)!important;max-width:none!important}
.gm-style .gm-style-iw-d{overflow:hidden!important;max-height:none!important;
  max-width:none!important}
.gm-style .gm-style-iw-c button.gm-ui-hover-effect{top:4px!important;right:4px!important}
.gm-style .gm-style-iw-tc::after{background:#fff}
.map-pop{width:238px;font-family:var(--font)}
.map-pop-img{width:100%;height:126px;object-fit:cover;display:block;background:#EDEDF1}
.map-pop-ph{width:100%;height:126px;display:grid;place-items:center;background:#EDEDF1;color:#8E8E99}
.map-pop-b{padding:12px 13px 13px}
.map-pop-t{font-weight:700;font-size:14px;letter-spacing:-.02em;color:#14162B;line-height:1.25}
.map-pop-s{font-size:12px;color:#8E8E99;margin-top:2px}
.map-pop-g{display:flex;gap:16px;margin-top:10px;font-variant-numeric:tabular-nums}
.map-pop-l{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:#8E8E99}
.map-pop-v{font-weight:600;color:#14162B;font-size:13.5px}
.map-pop-a{display:block;text-align:center;margin-top:12px;padding:9px;border-radius:9px;
  background:#0B0B0D;color:#fff;text-decoration:none;font-size:12.5px;font-weight:600}

/* ============================== 13. EMPTY / LOADING ============================== */
.empty{padding:var(--s8) var(--s5);text-align:center}
.empty-ico{width:44px;height:44px;border-radius:13px;background:var(--surface-3);color:var(--text-3);
           display:grid;place-items:center;margin:0 auto var(--s4)}
.empty h3{margin-bottom:6px}
.empty p{color:var(--text-2);font-size:14px;margin:0 auto var(--s5);max-width:44ch}

.skel{background:var(--surface-3);border-radius:6px;position:relative;overflow:hidden}
.skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
             background:linear-gradient(90deg,transparent,var(--hair),transparent);
             animation:sweep 1.4s infinite}
@keyframes sweep{100%{transform:translateX(100%)}}

.spinner{width:16px;height:16px;border-radius:50%;border:2px solid var(--hair-2);
         border-top-color:var(--text);animation:spin .7s linear infinite;display:inline-block}
@keyframes spin{100%{transform:rotate(360deg)}}

/* ============================== 14. TOAST ============================== */
.toasts{position:fixed;bottom:var(--s5);right:var(--s5);z-index:200;display:flex;
        flex-direction:column;gap:var(--s2);max-width:min(380px,calc(100vw - 32px))}
.toast{background:var(--surface);border:1px solid var(--hair-2);border-radius:12px;
       box-shadow:var(--shadow);padding:12px 14px;display:flex;gap:10px;align-items:flex-start;
       animation:rise .22s ease}
@keyframes rise{from{opacity:0;transform:translateY(8px)}}
.toast-t{font-size:13.5px;font-weight:600}
.toast-m{font-size:12.5px;color:var(--text-2);margin-top:2px}

/* ============================== 15. MODAL / SHEET ============================== */
.overlay{position:fixed;inset:0;background:var(--overlay);backdrop-filter:blur(3px);
         z-index:100;display:grid;place-items:center;padding:var(--s4)}
/* .overlay sets display:grid, which has the same specificity as the browser's
   default [hidden]{display:none} — so the later rule wins and a hidden overlay
   stayed visible. This makes hidden actually hidden. */
.overlay[hidden]{display:none}
[hidden]{display:none!important}
.modal{background:var(--surface);border-radius:var(--r-xl);box-shadow:var(--shadow);
       width:min(620px,100%);max-height:calc(100vh - 64px);display:flex;flex-direction:column;
       animation:pop .2s ease}
@keyframes pop{from{opacity:0;transform:scale(.97)}}
.modal-head{padding:var(--s5) var(--s5) var(--s4);display:flex;align-items:center;gap:var(--s3);
            border-bottom:1px solid var(--hair)}
.modal-body{padding:var(--s5);overflow-y:auto}
.modal-foot{padding:var(--s4) var(--s5);border-top:1px solid var(--hair);display:flex;
            gap:var(--s2);justify-content:flex-end}

/* ============================== 16. MOBILE ============================== */
.mtop,.mbar{display:none}
/* The in-content heading exists for mobile, where .topbar is hidden.
   It must be hidden on desktop or the page shows its title twice. */
.mhead{display:none}

@media(max-width:1180px){
  .grid-main,.grid-4{grid-template-columns:repeat(2,1fr)}
  .figs{grid-template-columns:repeat(2,1fr)}
  .cards,.grid-3{grid-template-columns:repeat(2,1fr)}
  .topbar,.content{padding-left:var(--s6);padding-right:var(--s6)}
}

@media(max-width:860px){
  /* Rail and desktop topbar out; mobile header + floating tab bar in. */
  .rail,.topbar{display:none}
  .content{padding:0 var(--s4) 108px}

  .mtop{
    display:flex;align-items:center;gap:10px;padding:var(--s4);
    position:sticky;top:0;z-index:30;background:var(--bg);border-bottom:1px solid var(--hair);
  }
  .mtop-title{font-size:16px;font-weight:700;letter-spacing:-.03em}

  .mhead{display:block;padding:var(--s5) 0 var(--s4)}

  .grid-main,.grid-2,.grid-3,.grid-4,.cards{grid-template-columns:1fr}
  .figs,.figs.figs-2{grid-template-columns:repeat(2,1fr)}

  h1,.h1{font-size:26px}
  .fig-xl{font-size:34px}

  .hero{min-height:330px;border-radius:var(--r-lg)}
  .hero-body{padding:var(--s6) var(--s4) var(--s5)}
  .hero-top{left:var(--s4);right:var(--s4)}
  .hero-title{font-size:27px}
  .hero-stats{gap:var(--s6);margin-top:var(--s5)}
  .hs-v{font-size:20px}

  .panel-head{padding:var(--s4)}
  .panel-pad,.panel-body,.fig,.li,.tbl td,.tbl th{padding-left:var(--s4);padding-right:var(--s4)}

  /* Tables become stacked records. Add data-l="Label" to each td. */
  .tbl thead{display:none}
  .tbl,.tbl tbody,.tbl tr,.tbl td{display:block;width:100%}
  .tbl tr{border-bottom:1px solid var(--hair);padding:var(--s3) 0}
  .tbl tbody tr:last-child{border-bottom:0}
  .tbl td{border:0;padding:3px var(--s4);text-align:left!important}
  .tbl td[data-l]::before{
    content:attr(data-l);display:inline-block;min-width:104px;
    font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);
  }

  /* Modals become bottom sheets — the correct mobile pattern. */
  .overlay{place-items:end;padding:0}
  .modal{width:100%;max-height:88vh;border-radius:var(--r-xl) var(--r-xl) 0 0;animation:sheet .24s ease}
  @keyframes sheet{from{transform:translateY(100%)}}
  .modal-foot{position:sticky;bottom:0;background:var(--surface)}
  .modal-foot .btn{flex:1}

  .toasts{left:var(--s3);right:var(--s3);bottom:96px;max-width:none}

  .mbar{
    display:grid;grid-template-columns:repeat(5,1fr);
    position:fixed;left:var(--s3);right:var(--s3);bottom:var(--s3);z-index:40;
    background:var(--glass);backdrop-filter:blur(28px);-webkit-backdrop-filter:blur(28px);
    border:1px solid var(--hair-2);border-radius:22px;padding:7px 5px;box-shadow:var(--shadow);
    padding-bottom:calc(7px + env(safe-area-inset-bottom));
  }
  .tab{display:flex;flex-direction:column;align-items:center;gap:4px;background:none;border:0;
       cursor:pointer;padding:6px 2px;border-radius:9px;font-size:10px;font-weight:600;
       color:var(--text-3);letter-spacing:-.01em;text-decoration:none}
  .tab[aria-current="page"]{color:var(--text)}

  /* Comfortable touch targets everywhere. */
  .btn{padding:11px 16px}
  .btn-sm{padding:8px 12px}
  .li{padding-top:13px;padding-bottom:13px}
  .input,.select,.textarea{padding:12px 13px;font-size:15px} /* 15px+ stops iOS zooming on focus */
}

@media(max-width:430px){
  .figs,.figs.figs-2{grid-template-columns:1fr}
  .hero-stats{gap:var(--s5)}
}

/* ============================== 17. PRINT ============================== */
@media print{
  .rail,.mbar,.mtop,.topbar-actions,.btn,.more{display:none!important}
  body{background:#fff;color:#000}
  .panel{box-shadow:none;border:1px solid #ddd}
}

/* ==================== 12. PAGE LAYOUT PRIMITIVES ======================= *
 * Promoted out of page-dashboard.css so EVERY page shares one page-header
 * and one figure-strip. Previously these lived only in the dashboard sheet,
 * which is why fmr / crime / invoices fell back to their own bespoke hero
 * blocks and looked like a different product.
 * ---------------------------------------------------------------------- */
.dash-top{
  display:flex;align-items:flex-end;gap:var(--s4);flex-wrap:wrap;
  padding:var(--s6) 0 var(--s5);
}
.dash-top-actions{margin-left:auto;display:flex;gap:var(--s2);flex-wrap:wrap}
.dash-section{margin-bottom:var(--s4)}

.figstrip{
  display:grid;grid-template-columns:repeat(4,1fr);gap:1px;
  background:var(--hair);border-radius:var(--r-lg);overflow:hidden;
  box-shadow:var(--shadow-sm);margin-bottom:var(--s4);
}
.figstrip-cell{background:var(--surface);padding:var(--s5)}
.figstrip-l{display:block;font-size:12.5px;color:var(--text-3);font-weight:500}
.figstrip-v{
  display:block;margin-top:5px;font-size:27px;font-weight:700;
  letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--text);
}
@media(max-width:1180px){ .figstrip{grid-template-columns:repeat(2,1fr)} }
@media(max-width:860px){
  .dash-top{padding:var(--s5) 0 var(--s4)}
  .dash-top-actions{margin-left:0;width:100%}
  .dash-top-actions .btn{flex:1}
  .figstrip{grid-template-columns:repeat(2,1fr)}
  .figstrip-v{font-size:22px}
}

/* ==================== 13. ICONS INSIDE HEADINGS ========================= *
 * Legacy pages write <h2 class="modal-title"><i data-lucide="..."></i> Text</h2>
 * and <div class="section-title"><i></i> Text</div>. When that icon computes to
 * a block box the words drop onto a second line — the "icon sitting on top of
 * the text" fault that kept reappearing on page after page.
 *
 * Rather than patching it per page, any heading or label that DIRECTLY contains
 * an icon becomes a flex row. :has() means nothing else is touched.
 * ---------------------------------------------------------------------- */
:is(h1,h2,h3,h4,h5,h6,
    [class*="-title"],[class*="-label"],[class*="-heading"],
    [class*="-header"],[class*="-message"],[class*="-note"],
    [class*="-warning"],[class*="-hint"],[class*="-text"],[class*="-subtitle"],
    legend,summary):has(> svg,> i,> .i,> [data-lucide]){
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
/* a paragraph of prose keeps its icon on the FIRST line and lets the words
   wrap beneath, rather than stretching the icon down the whole block */
:is([class*="-message"],[class*="-note"],[class*="-warning"],[class*="-hint"]):has(> svg,> i,> [data-lucide]){
  align-items:flex-start;
}
:is([class*="-message"],[class*="-note"],[class*="-warning"],[class*="-hint"]) > :is(svg,i,.i,[data-lucide]){
  flex:0 0 auto;width:1em;height:1em;display:block;margin-top:.15em;
}
:is(h1,h2,h3,h4,h5,h6,
    [class*="-title"],[class*="-label"],[class*="-heading"]) > :is(svg,i,.i,[data-lucide]){
  flex:0 0 auto;width:1em;height:1em;display:block;
}
/* status rows and chips read the same way */
:is([class*="sync"],[class*="status"],[class*="badge"],[class*="chip"]):has(> svg,> i,> [data-lucide]){
  display:inline-flex;align-items:center;gap:6px;
}

/* ==================== 14. SCROLL LOCK BEHIND DIALOGS ==================== *
 * A fixed overlay does not stop the page beneath it scrolling: once the
 * overlay's own content has nothing left to scroll, the browser chains the
 * gesture to the document. Two defences, both CSS so no page needs JS changes:
 *
 *   overscroll-behavior:contain  — stops the scroll chaining outward
 *   body:has(open dialog)        — freezes the document while one is open
 * ---------------------------------------------------------------------- */
.modal,.modal-overlay,.modal-backdrop,
.delete-modal,.delete-modal-overlay,
.edit-task-modal,.edit-task-overlay,
.free-llc-modal,.view-modal,.fullscreen-gallery-modal,
[class*="-modal"],[class*="-overlay"]{
  overscroll-behavior:contain;
}

body:has(.modal.active),        body:has(.modal.show),
body:has(.modal[style*="flex"]),body:has(.modal[style*="block"]),
body:has(.modal-overlay.active),body:has(.modal-overlay[style*="flex"]),
body:has(.modal-backdrop.active),body:has(.modal-backdrop[style*="flex"]),
body:has(.delete-modal.active), body:has(.delete-modal.show),
body:has(.delete-modal[style*="flex"]),body:has(.delete-modal[style*="block"]),
body:has(.edit-task-modal.active),body:has(.edit-task-modal.show),
body:has(.edit-task-modal[style*="flex"]),body:has(.edit-task-modal[style*="block"]),
body:has(.delete-modal-overlay.active),body:has(.edit-task-overlay.active),
body:has(.free-llc-modal.active),body:has(.free-llc-modal[style*="flex"]),
body:has(#fullscreen-gallery-modal){
  overflow:hidden;
}

/* =====================================================================
   REHAB MONEY strip on the Overview page.
   Append to assets/css/app.css, or paste into the dashboard's own
   stylesheet. Uses the same tokens as everything else.
   ===================================================================== */

.rm-dash-link { margin-left: auto; font-size: 13px; color: var(--info); }

.rm-dash-tiles {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s4);
  padding: var(--s5) var(--s5) 0;
}
.rm-dash-tile {
  position: relative; overflow: hidden;
  padding: var(--s4); border-radius: var(--r-lg);
  background: var(--surface-2); border: 1px solid var(--hair);
}
.rm-dash-tile::before {
  content: ''; position: absolute; inset: 0 auto 0 0; width: 3px; background: var(--text-3);
}
.rm-dash-tile.is-out::before   { background: var(--loss); }
.rm-dash-tile.is-in::before    { background: var(--gain); }
.rm-dash-tile.is-float::before { background: var(--flag); }
.rm-dash-label {
  font-size: 11px; letter-spacing: .10em; text-transform: uppercase;
  color: var(--text-3); font-weight: 700; margin-bottom: 6px;
}
.rm-dash-value {
  font-size: 26px; font-weight: 800; letter-spacing: -.015em;
  font-variant-numeric: tabular-nums; line-height: 1.05;
}
.rm-dash-tile.is-out   .rm-dash-value { color: var(--loss); }
.rm-dash-tile.is-in    .rm-dash-value { color: var(--gain); }
.rm-dash-tile.is-float .rm-dash-value { color: var(--flag); }
.rm-dash-sub { margin-top: 5px; font-size: 12px; color: var(--text-3); line-height: 1.45; }

.rm-dash-table { width: 100%; border-collapse: collapse; font-size: 14px; margin-top: var(--s5); }
.rm-dash-table th {
  text-align: left; font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--text-3); font-weight: 700; padding: 0 var(--s3) var(--s3); white-space: nowrap;
}
.rm-dash-table th:first-child, .rm-dash-table td:first-child { padding-left: var(--s5); }
.rm-dash-table th:last-child,  .rm-dash-table td:last-child  { padding-right: var(--s5); }
.rm-dash-table td { padding: var(--s3); border-top: 1px solid var(--hair); }
.rm-dash-table .num {
  text-align: right; font-variant-numeric: tabular-nums; font-weight: 700; white-space: nowrap;
}
.rm-dash-table .num.in    { color: var(--gain); }
.rm-dash-table .num.out   { color: var(--loss); }
.rm-dash-table .num.flag  { color: var(--flag); }
.rm-dash-table .num.muted { color: var(--text-3); font-weight: 400; }
.rm-dash-table a { color: var(--text); font-weight: 600; }
.rm-dash-table a:hover { color: var(--info); }

@media (max-width: 900px) {
  .rm-dash-tiles { grid-template-columns: 1fr; }
  .rm-dash-table thead { display: none; }
  .rm-dash-table, .rm-dash-table tbody, .rm-dash-table tr, .rm-dash-table td { display: block; width: 100%; }
  .rm-dash-table tr { border: 1px solid var(--hair); border-radius: var(--r-md); margin: 0 var(--s4) var(--s3); padding: var(--s2); }
  .rm-dash-table td { border: 0; display: flex; justify-content: space-between; gap: var(--s4); padding: 6px var(--s2); }
  .rm-dash-table td::before {
    content: attr(data-l); font-size: 11px; letter-spacing: .07em; text-transform: uppercase;
    color: var(--text-3); font-weight: 700;
  }
}

/* ---------- SweetAlert, dragged into this decade -----------------------
   Four pages raise messages through SweetAlert (50 call sites), whose default skin is
   the rounded-white-box-with-a-cartoon-icon look this app moved away from.
   Restyling it here reaches every one of them at once; replacing the
   library outright is a separate job.
   ------------------------------------------------------------------- */
.swal2-container { backdrop-filter: blur(3px); }
.swal2-popup {
  background: var(--surface, #101013) !important;
  color: var(--text, #FAFAFA) !important;
  border: 1px solid var(--hair-2, rgba(255,255,255,.11));
  border-radius: var(--r-lg, 18px) !important;
  font-family: var(--font), sans-serif !important;
  padding: 26px 24px 20px !important;
  box-shadow: 0 24px 60px rgba(0,0,0,.45);
}
.swal2-title {
  color: var(--text, #FAFAFA) !important;
  font-size: 19px !important; font-weight: 800 !important;
  letter-spacing: -.02em; padding: 0 0 6px !important;
}
.swal2-html-container {
  color: var(--text-2, #9E9EA7) !important;
  font-size: 14px !important; line-height: 1.6 !important; margin: 0 !important;
}
.swal2-actions { gap: 10px; margin-top: 22px !important; }
.swal2-styled {
  border-radius: var(--r-md, 12px) !important;
  font-family: var(--font), sans-serif !important;
  font-size: 14px !important; font-weight: 600 !important;
  padding: 9px 18px !important; box-shadow: none !important;
}
.swal2-styled.swal2-confirm {
  background: var(--inv-bg, #FAFAFA) !important;
  color: var(--inv-fg, #0B0B0D) !important;
}
.swal2-styled.swal2-confirm:hover { opacity: .85; }
.swal2-styled.swal2-cancel {
  background: transparent !important;
  color: var(--text-2, #9E9EA7) !important;
  border: 1px solid var(--hair-2, rgba(255,255,255,.11)) !important;
}
/* The cartoon icons are the most dated part of the default skin. */
.swal2-icon { display: none !important; }
.swal2-timer-progress-bar { background: var(--info, #5B9DFF) !important; }
