/* SharePoint Archiver — Discovery dashboard (story 3-9 widgets 1-6 + story 3-10 widgets 7-8).
   Productionised from the approved mockup px-output/mockups/spa-discovery-dashboard.html.
   Palette is colour-blind-safe: Documents #2a78d6 / Media #eb6834 / Legacy #1baf7a / Other #9AA4A2.
   Red (--crit) is reserved for over-quota only. Theme follows prefers-color-scheme, with an explicit
   data-theme override. The version-history section (widgets 7-8, story 3-10) IS styled here -- see
   .vgrid/.tmwrap.wide/.keepstrip below -- this header was stale from 3-9 (LN-3 fix, 2026-09-20). */

:root{
  color-scheme: light;
  --page:#EDF0EF; --panel:#FBFCFB; --panel-2:#F3F6F5; --wash:#E6EBEA;
  --ink:#111A19; --ink-2:#4A5654; --muted:#76827F; --hair:#D6DCDA; --hair-2:#E4E9E7;
  --c-docs:#2a78d6; --c-media:#eb6834; --c-legacy:#1baf7a; --c-other:#9AA4A2;
  --on-docs:#ffffff; --on-media:#1a0e07; --on-legacy:#06150f; --on-other:#111a19;
  --sel:#111A19; --sel-ink:#FBFCFB;
  --crit:#d03b3b; --crit-ink:#b02a2a; --good-ink:#006300;
  --warn:#b8791b; --warn-ink:#8a5a10; --warn-wash:#f8efdd;
  --good:#1baf7a; --good-wash:#e2f3ec;
  --tip-bg:#111A19; --tip-ink:#F3F6F5;
  --f-ui:"Archivo", system-ui, -apple-system, "Segoe UI", sans-serif;
  --f-mono:"IBM Plex Mono", ui-monospace, "Cascadia Mono", Consolas, monospace;
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    color-scheme: dark;
    --page:#0D1110; --panel:#151B1A; --panel-2:#1B2221; --wash:#222A29;
    --ink:#E9EFED; --ink-2:#AEBAB7; --muted:#7C8886; --hair:#2A3230; --hair-2:#222A28;
    --c-docs:#3987e5; --c-media:#d95926; --c-legacy:#199e70; --c-other:#5F6A68;
    --on-docs:#06101c; --on-media:#140803; --on-legacy:#04120c; --on-other:#EEF3F1;
    --sel:#E9EFED; --sel-ink:#0D1110;
    --crit:#d03b3b; --crit-ink:#e66767; --good-ink:#0ca30c;
    --warn:#e0a94b; --warn-ink:#e0a94b; --warn-wash:#2a2113;
    --good:#199e70; --good-wash:#122a20;
    --tip-bg:#E9EFED; --tip-ink:#0D1110;
  }
}
:root[data-theme="dark"]{
  color-scheme: dark;
  --page:#0D1110; --panel:#151B1A; --panel-2:#1B2221; --wash:#222A29;
  --ink:#E9EFED; --ink-2:#AEBAB7; --muted:#7C8886; --hair:#2A3230; --hair-2:#222A28;
  --c-docs:#3987e5; --c-media:#d95926; --c-legacy:#199e70; --c-other:#5F6A68;
  --on-docs:#06101c; --on-media:#140803; --on-legacy:#04120c; --on-other:#EEF3F1;
  --sel:#E9EFED; --sel-ink:#0D1110;
  --crit:#d03b3b; --crit-ink:#e66767; --good-ink:#0ca30c;
  --warn:#e0a94b; --warn-ink:#e0a94b; --warn-wash:#2a2113;
  --good:#199e70; --good-wash:#122a20;
  --tip-bg:#E9EFED; --tip-ink:#0D1110;
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--page);color:var(--ink);font-family:var(--f-ui);font-size:14px;line-height:1.45}
button,select,input{font:inherit;color:inherit}
:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.mono{font-family:var(--f-mono)}
.num{font-variant-numeric:tabular-nums}

/* ---------- shell ---------- */
.topbar{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:12px 20px;background:var(--panel);border-bottom:1px solid var(--hair)}
.brand{display:flex;align-items:center;gap:10px;font-weight:700;font-stretch:88%;letter-spacing:-.01em;font-size:16px}
.brand-mark{width:22px;height:22px;display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:2px}
.brand-mark i{display:block;border-radius:2px}
.brand-mark i:nth-child(1){grid-row:span 2;background:var(--c-docs)}
.brand-mark i:nth-child(2){background:var(--c-media)}
.brand-mark i:nth-child(3){background:var(--c-legacy)}
.tenant{display:flex;align-items:center;gap:8px;color:var(--ink-2);font-size:13px;min-width:0}
.tenant .mono{color:var(--ink);font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.topbar .spacer{flex:1}
.tag{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;padding:4px 9px;border-radius:999px;border:1px solid var(--hair);color:var(--ink-2);background:var(--panel-2);white-space:nowrap}
.tag.example{border-style:dashed}
.tag[hidden]{display:none}
.region{font-size:12.5px;color:var(--ink-2)}

.shell{display:grid;grid-template-columns:208px minmax(0,1fr);min-height:calc(100vh - 53px)}
/* .rail appearance now lives in /site-rail.css (SM-770); .shell (above) and the responsive .rail hide (below) stay here as page layout */

.main{padding-block:24px 48px;padding-inline:28px;display:flex;flex-direction:column;gap:18px;min-width:0}

/* ---------- page head ---------- */
.pagehead{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}
.pagehead h1{margin:0;font-size:30px;line-height:1.1;font-weight:760;font-stretch:80%;letter-spacing:-.015em;text-wrap:balance}
.pagehead p{margin:4px 0 0;color:var(--ink-2);max-width:68ch}
.scaninfo{display:flex;flex-direction:column;align-items:flex-end;gap:2px;font-size:12.5px;color:var(--ink-2)}
.scaninfo b{color:var(--ink);font-weight:600}
.scaninfo .posture{font-size:11.5px;color:var(--muted);max-width:44ch;text-align:right;margin-top:2px}

/* ---------- page tabs (Discovery / Versions, SM-801 LN-73 §3) ---------- */
/* Real content tabs under the shared <h1>: tab semantics (role=tab/aria-selected), an underline
   indicator, visually distinct from the filter buttons' pressed state. Client-side switch, no reload. */
.pagetabs{display:flex;gap:4px;border-bottom:1px solid var(--hair);flex-wrap:wrap}
.ptab{border:0;background:none;padding:10px 16px;cursor:pointer;font-size:15px;font-weight:600;color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px;font-family:inherit}
.ptab:hover{color:var(--ink-2)}
.ptab[aria-selected="true"]{color:var(--ink);border-bottom-color:var(--sel)}
[role="tabpanel"]{display:flex;flex-direction:column;gap:18px}
[role="tabpanel"][hidden]{display:none}

/* ---------- KPI strip ---------- */
.kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));background:var(--panel);border:1px solid var(--hair);border-radius:10px}
.kpi{padding:16px 18px 16px;display:flex;flex-direction:column;gap:6px;min-width:0}
.kpi + .kpi{border-left:1px solid var(--hair)}
.kpi-label{font-size:11.5px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--muted)}
.kpi-value{font-size:34px;line-height:1;font-weight:720;font-stretch:72%;letter-spacing:-.01em}
.kpi-value .unit{font-size:18px;font-weight:600;margin-left:3px;color:var(--ink-2)}
.kpi-sub{font-size:12.5px;color:var(--ink-2);line-height:1.4}
.kpi-sub b{color:var(--ink);font-weight:600}
.status{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--crit-ink)}
.status svg{flex:none}
.saving{color:var(--good-ink);font-weight:600}

/* ---------- filters ---------- */
.filters{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;padding:10px 12px;background:var(--panel);border:1px solid var(--hair);border-radius:10px}
.fgroup{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.flabel{font-size:11.5px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--muted)}
.seg{display:flex;flex-wrap:wrap;gap:4px}
.seg button{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--hair);background:var(--panel);border-radius:7px;padding:6px 10px;cursor:pointer;font-size:13px;white-space:nowrap}
.seg button:hover{background:var(--panel-2)}
.seg button[aria-pressed="true"]{background:var(--sel);color:var(--sel-ink);border-color:var(--sel)}
.seg .sz{font-family:var(--f-mono);font-size:11.5px;color:var(--muted)}
.seg button[aria-pressed="true"] .sz{color:inherit;opacity:.75}
.sw{width:10px;height:10px;border-radius:3px;flex:none;box-shadow:inset 0 0 0 1px rgba(0,0,0,.08)}
.sw.docs{background:var(--c-docs)} .sw.media{background:var(--c-media)} .sw.legacy{background:var(--c-legacy)} .sw.other{background:var(--c-other)}
.sw.all{background:conic-gradient(var(--c-docs) 0 25%,var(--c-media) 0 50%,var(--c-legacy) 0 75%,var(--c-other) 0)}
.vsep{width:1px;align-self:stretch;background:var(--hair);min-height:24px}
select{appearance:none;border:1px solid var(--hair);background:var(--panel) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%2376827F' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat right 10px center;border-radius:7px;padding:6px 30px 6px 10px;font-size:13px;cursor:pointer}
.chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;flex-basis:100%}
.chips:empty{display:none}
.chip{display:inline-flex;align-items:center;gap:6px;background:var(--wash);border:1px solid var(--hair);border-radius:999px;padding:3px 4px 3px 10px;font-size:12.5px}
.chip button{border:0;background:transparent;cursor:pointer;width:20px;height:20px;border-radius:50%;display:grid;place-items:center;color:var(--ink-2)}
.chip button:hover{background:var(--hair)}
.linkbtn{border:0;background:none;padding:2px 4px;color:var(--ink-2);text-decoration:underline;text-underline-offset:3px;cursor:pointer;font-size:12.5px}
/* on/off switch (SM-801 §4.4) — the "Grouped by category" toggle. Copied verbatim from policies.css:152-156
   (that component is on a page that loads policies.css; discovery does not, so the four rules live here too). */
.toggle{width:36px;height:20px;border-radius:999px;background:var(--hair);position:relative;cursor:pointer;flex:none;border:1px solid var(--ink-2);padding:0}
.toggle.on{background:var(--good);border-color:var(--good)}
.toggle .knob{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:50%;background:var(--panel);transition:left .15s}
.toggle.on .knob{left:17px;background:var(--panel)}
.flabel-inline{font-size:13px;color:var(--ink)}
.flabel-note{font-size:12px;color:var(--muted);font-style:italic}
/* chips + a trailing action on one row (SM-801 §4.5): the make-rule button (Discovery) / Reset (Versions)
   stays right-aligned via margin-left:auto whether or not a chip exists; the row itself never collapses
   (only .chips does when empty), so the trailing control is always reachable. Wraps at 375 — the control
   drops under the chips on its own line, never clips. */
.chipsrow{display:flex;align-items:center;gap:10px;flex-basis:100%;flex-wrap:wrap}
.chipsrow .chips{flex:0 1 auto;flex-basis:auto}
.chipsrow .btn,.chipsrow .linkbtn{margin-left:auto}

/* ---------- panels ---------- */
.panel{background:var(--panel);border:1px solid var(--hair);border-radius:10px;min-width:0}
.phead{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:16px 18px 10px}
.phead h2{margin:0;font-size:18px;font-weight:700;font-stretch:85%;letter-spacing:-.005em;text-wrap:balance}
.phead p{margin:3px 0 0;font-size:13px;color:var(--ink-2);max-width:62ch}
.pbody{padding:0 18px 16px}
.btn{display:inline-flex;align-items:center;gap:8px;border-radius:7px;padding:7px 12px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid var(--sel);background:var(--sel);color:var(--sel-ink);white-space:nowrap}
.btn:hover{filter:brightness(1.15)}
.btn.ghost{background:transparent;color:var(--ink);border-color:var(--hair)}
.btn.ghost:hover{background:var(--panel-2);filter:none}

.board{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(300px,1fr);gap:18px;align-items:start}
/* Widget 2 is aspect-capped (16:9; mobile 4:3) in every view so the chart never dominates the page (FD-15). */
.tmwrap{position:relative;width:100%;aspect-ratio:16/9;max-width:100%}
/* Widget 7 (version history) is shorter still — 2:1 (mobile 4:3) so the versions section never dominates (FD-15). */
.tmwrap.wide{aspect-ratio:2/1}
.tmwrap svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.pheadtools{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.chartwrap{position:relative;width:100%;aspect-ratio:16/9;max-width:100%}
.chartwrap svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.slice,.flowband,.flownode{cursor:pointer}
/* SM-801 §4.6: a grouped-pie per-category tail slice ("N smaller types") is counted, not clickable. */
.slice.tail{cursor:default}
.slice.dim,.flowband.dim,.flownode.dim{opacity:.32}
.slice.sel,.flowband.sel{filter:brightness(1.08)}
.slice:hover,.flowband:hover,.flownode:hover{filter:brightness(1.12)}
.ctext{fill:var(--ink);font-size:12.5px}
.ctext.mute{fill:var(--ink-2);font-size:11.5px}
.ctext.big{font-size:26px;font-weight:720;font-stretch:72%}
.ctext.mono{font-family:var(--f-mono, ui-monospace, monospace)}
.crumb{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 8px;font-size:12.5px;color:var(--ink-2)}
.crumb[hidden]{display:none}
.crumb .linkbtn{font-size:12.5px}
.tile rect{cursor:pointer;transition:opacity .18s}
.tile.dim rect{opacity:.28}
.tile.hot rect{stroke:var(--ink);stroke-width:2}
.tile.sel rect{stroke:var(--ink);stroke-width:2.5}
.lbl{pointer-events:none;font-family:var(--f-mono)}
.lbl.anim{animation:fade .2s .3s both}
.lbl-ext{font-size:12px;font-weight:600}
.lbl-sz{font-size:11px;font-weight:400;opacity:.85}
.tile.dim .lbl{opacity:.35}
@keyframes fade{from{opacity:0}to{opacity:1}}
.tmcap{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:10px;font-size:12px;color:var(--muted)}
.empty{position:absolute;inset:0;display:grid;place-items:center;color:var(--ink-2);font-size:13px;text-align:center;padding:20px}

/* sites */
.sites{list-style:none;margin:0;padding:0 8px 10px;display:flex;flex-direction:column}
.site{display:block;width:100%;text-align:left;border:0;background:transparent;border-radius:7px;padding:8px 10px;cursor:pointer}
.site:hover{background:var(--panel-2)}
.site[aria-pressed="true"]{background:var(--wash)}
.site-top{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.site-name{font-size:13.5px;font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.site[aria-pressed="true"] .site-name{font-weight:700}
.kind{font-family:var(--f-mono);font-size:10.5px;color:var(--muted);margin-left:6px;letter-spacing:.02em}
.site-sz{font-family:var(--f-mono);font-size:12.5px;font-variant-numeric:tabular-nums;white-space:nowrap}
.bar{display:flex;gap:2px;height:8px;margin-top:6px}
.bar i{display:block;height:100%;min-width:0}
.bar i:first-child{border-radius:2px 0 0 2px}
.bar i:last-child{border-radius:0 3px 3px 0}
.bar i:only-child{border-radius:2px 3px 3px 2px}
.bar .docs{background:var(--c-docs)} .bar .media{background:var(--c-media)} .bar .legacy{background:var(--c-legacy)} .bar .other{background:var(--c-other)}
.site.fade .bar,.site.fade .site-top{opacity:.45}
/* FD-123 build 3 (SM-727): the read-only "Size by library" list reuses .sites/.site; this row-span is not a
   clickable button, so drop the pointer cursor, and style the filtered-empty note. */
.sites .site:not(button){cursor:default}
.sites .libs-empty{list-style:none;padding:8px 10px;color:var(--muted);font-size:13px}

/* table */
.tablewrap{overflow-x:auto;padding:0 18px 6px}
table{width:100%;border-collapse:collapse;font-size:13px}
th{font-size:11px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);text-align:right;padding:8px 10px;border-bottom:1px solid var(--hair);white-space:nowrap}
th:first-child,th:nth-child(2){text-align:left}
td{padding:7px 10px;border-bottom:1px solid var(--hair-2);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
td:first-child,td:nth-child(2){text-align:left}
tbody tr{cursor:pointer}
tbody tr:hover{background:var(--panel-2)}
tbody tr[aria-selected="true"]{background:var(--wash);font-weight:600}
td .mono{font-size:12.5px}
.catcell{display:inline-flex;align-items:center;gap:7px}
.sharebar{display:inline-block;height:6px;border-radius:0 3px 3px 0;vertical-align:middle;margin-right:8px;background:var(--ink-2);opacity:.35}
.tfoot{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 18px 14px;font-size:12.5px;color:var(--muted)}

/* versions (widgets 7–8) */
.vgrid{display:grid;grid-template-columns:minmax(260px,.85fr) minmax(0,2fr);gap:18px;padding:0 18px 18px;align-items:start}
.vside{display:flex;flex-direction:column;gap:16px}
.vbig{font-size:40px;line-height:1;font-weight:740;font-stretch:72%}
.vbig .unit{font-size:20px;font-weight:600;color:var(--ink-2);margin-left:3px}
.vsub{font-size:13px;color:var(--ink-2);margin-top:6px}
.slider{display:flex;flex-direction:column;gap:6px}
.slider label{font-size:13px;font-weight:600}
input[type=range]{width:100%;accent-color:var(--ink);margin:4px 0 0;cursor:pointer}
.ticks{display:flex;justify-content:space-between;font-family:var(--f-mono);font-size:11.5px;color:var(--muted);padding:0 2px}
.ticks span.on{color:var(--ink);font-weight:600}
.keepstrip{display:flex;gap:2px;align-items:stretch;height:22px}
.keepstrip i{flex:1;border-radius:2px;background:var(--wash);border:1px solid var(--hair)}
.keepstrip i.live{background:var(--ink);border-color:var(--ink)}
.keepstrip i.count{background:repeating-linear-gradient(135deg,var(--ink-2) 0 2px,transparent 2px 5px);border-color:var(--ink-2)}
.keepstrip .gapdots{flex:0 0 auto;align-self:center;font-family:var(--f-mono);font-size:11px;color:var(--muted);padding:0 3px}
.keeplegend{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--ink-2)}
.keeplegend span{display:inline-flex;align-items:center;gap:6px}
.keeplegend i{width:12px;height:12px;border-radius:2px;display:inline-block;border:1px solid var(--hair)}
.keeplegend i.live{background:var(--ink);border-color:var(--ink)} .keeplegend i.kept{background:var(--wash)} .keeplegend i.count{background:repeating-linear-gradient(135deg,var(--ink-2) 0 2px,transparent 2px 5px);border-color:var(--ink-2)}
.explain{font-size:12.5px;color:var(--ink-2);margin:0;max-width:52ch}

/* notes */
.notes{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px 28px;padding:16px 4px 0;border-top:1px solid var(--hair);font-size:12.5px;color:var(--ink-2)}
.notes h3{margin:0 0 4px;font-size:11.5px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--muted)}
.notes p{margin:0;max-width:60ch}

/* tooltip + toast */
#tip{position:fixed;z-index:20;pointer-events:none;background:var(--tip-bg);color:var(--tip-ink);border-radius:8px;padding:9px 11px;font-size:12.5px;line-height:1.45;max-width:280px;box-shadow:0 10px 30px -12px rgba(0,0,0,.45)}
#tip .t1{display:flex;align-items:center;gap:7px;font-weight:700;margin-bottom:3px}
#tip .row{display:flex;justify-content:space-between;gap:16px;font-variant-numeric:tabular-nums}
#tip .row span:first-child{opacity:.72}
#toast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:30;background:var(--tip-bg);color:var(--tip-ink);padding:10px 14px;border-radius:8px;font-size:13px;max-width:calc(100vw - 32px)}

@media (max-width:1180px){
  .kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  .kpi:nth-child(3){border-left:0}
  .kpi:nth-child(n+3){border-top:1px solid var(--hair)}
}
@media (max-width:1040px){
  .board{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:820px){
  .shell{grid-template-columns:minmax(0,1fr)}
  .rail{display:none}
  .main{padding-inline:16px}
  .scaninfo{align-items:flex-start}
  .scaninfo .posture{text-align:left}
  /* mobile: widget 2 relaxes to 4:3 so short charts stay legible without dominating (FD-15). */
  .tmwrap,.chartwrap{aspect-ratio:4/3}
  /* .tmwrap.wide (0,2,0) out-specifies the rule above, so restate widget 7's mobile aspect explicitly (FD-15). */
  .tmwrap.wide{aspect-ratio:4/3}
  /* versions section stacks: the slider/keepstrip column above the treemap. */
  .vgrid{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:520px){
  .kpis{grid-template-columns:minmax(0,1fr)}
  .kpi + .kpi{border-left:0;border-top:1px solid var(--hair)}
  .topbar{padding-inline:16px}
  .pagehead h1{font-size:26px}
  .vsep{display:none}
}
@media (prefers-reduced-motion:reduce){
  .lbl.anim{animation:none}
  .tile rect{transition:none}
}
