/* The dashboard's one stylesheet. IDFusion's website style, as the pm tool's
   status report draws it (pm/status_report/generate.py, Chris's 2026-10-02
   redesign): Noto Sans, a blue rule, the coloured squares down the left edge,
   panels with a coloured left border, small uppercase section heads.
   Noto Sans is self-hosted (fonts/, SIL OFL 1.1: fonts/OFL.txt; the latin and
   latin-ext subsets of @fontsource/noto-sans 5.3.0). Nothing is loaded from
   anywhere else. */
@font-face{font-family:"Noto Sans";font-style:normal;font-display:swap;font-weight:400;
src:url(fonts/noto-sans-latin-400-normal.woff2) format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Noto Sans";font-style:normal;font-display:swap;font-weight:600;
src:url(fonts/noto-sans-latin-600-normal.woff2) format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Noto Sans";font-style:normal;font-display:swap;font-weight:700;
src:url(fonts/noto-sans-latin-700-normal.woff2) format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Noto Sans";font-style:normal;font-display:swap;font-weight:400;
src:url(fonts/noto-sans-latin-ext-400-normal.woff2) format("woff2");
unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Noto Sans";font-style:normal;font-display:swap;font-weight:600;
src:url(fonts/noto-sans-latin-ext-600-normal.woff2) format("woff2");
unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Noto Sans";font-style:normal;font-display:swap;font-weight:700;
src:url(fonts/noto-sans-latin-ext-700-normal.woff2) format("woff2");
unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}

/* The status report's palette (generate.py: INK, MUTED, RULE, PANEL, BLUE,
   BLUE_DARK, STATUS, BAR), with dark-mode equivalents below. */
:root{
--bg:#FFFFFF;--ink:#231F20;--ink2:#3F4443;--muted:#5F6361;--rule:#E2E2DF;--panel:#F6F6F4;
--blue:#007DCC;--blue-dark:#0069AC;--link:#0069AC;
--green:#00A88F;--amber:#E8A800;--red:#EE4256;--grey:#9A9E9C;
--green-ink:#00745F;--amber-ink:#8A6000;--red-ink:#C42238;
--chip-ink:#FFFFFF;--amber-chip-ink:#231F20;
--tbc-bg:#FFF4D6;--tbc-ink:#8A6000;
--done:#0069AC;--done-bg:#CFE3F2;--now:#007DCC;--now-bg:#D6ECFA;--todo:#ECECEA;--todo-ink:#7A7E7C;
--hover:#EEF5FB;--focus:#007DCC;--logo-filter:none}
@media (prefers-color-scheme:dark){:root{
--bg:#151617;--ink:#E9E9E6;--ink2:#D2D4D2;--muted:#A5A9A7;--rule:#33363A;--panel:#1E2022;
--blue:#2E9BE6;--blue-dark:#5BB8E6;--link:#6CC0F0;
--green:#1FB89E;--amber:#E8A800;--red:#F0566A;--grey:#7D817F;
--green-ink:#4FD1B9;--amber-ink:#F2C14E;--red-ink:#F7889A;
--chip-ink:#0E0F10;--amber-chip-ink:#0E0F10;
--tbc-bg:#3B3010;--tbc-ink:#F2C96B;
--done:#5BB8E6;--done-bg:#17344A;--now:#2E9BE6;--now-bg:#163A57;--todo:#2A2D30;--todo-ink:#8C908E;
--hover:#1B2631;--focus:#6CC0F0;--logo-filter:invert(1) hue-rotate(180deg) brightness(1.15)}}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--ink);
font:15px/1.5 "Noto Sans","Roboto","Helvetica Neue",Arial,system-ui,sans-serif}
/* the squares down the left edge */
body::before{content:"";position:fixed;left:6px;top:0;bottom:0;width:38px;
background:url(mosaic.svg) repeat-y 0 0;pointer-events:none}
.frame{max-width:80rem;margin:0 auto;padding:0 24px 3rem 64px}
a{color:var(--link);text-decoration:none}
a:hover{text-decoration:underline}
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible,th:focus-visible{
outline:2px solid var(--focus);outline-offset:2px}

/* ---- header: the logo and product, the tabs, the person */
header.top{display:flex;flex-wrap:wrap;align-items:center;gap:10px 22px;padding:18px 0 10px}
header.top .brand{display:flex;align-items:center;gap:14px;color:var(--ink2);font-weight:700;letter-spacing:.02em}
header.top .brand img{height:26px;width:auto;display:block;filter:var(--logo-filter)}
header.top .brand span{text-transform:uppercase;font-size:.85rem;letter-spacing:.06em}
header.top .who{margin-left:auto;display:flex;align-items:center;gap:12px;color:var(--ink2);font-weight:600;font-size:.9rem}
header.top .who .tz{color:var(--muted);font-weight:400}
nav.tabs{display:flex;flex-wrap:wrap;gap:2px;border-bottom:1px solid var(--rule);margin:0 0 4px}
nav.tabs a{padding:8px 14px 7px;color:var(--muted);font-weight:600;font-size:.82rem;text-transform:uppercase;
letter-spacing:.06em;border-bottom:3px solid transparent;margin-bottom:-1px}
nav.tabs a:hover{color:var(--ink);text-decoration:none}
nav.tabs a.on{color:var(--ink);border-bottom-color:var(--blue)}

/* ---- the page title, as the report's: big, bold, a muted line, the blue rule */
h1{font-size:1.9rem;line-height:1.15;margin:22px 0 2px;font-weight:700;letter-spacing:-.005em}
.sub{color:var(--muted);margin:0 0 10px}
.rule{height:3px;background:var(--blue);margin:0 0 18px}
h2{font-size:.82rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-weight:700;
margin:28px 0 8px;display:flex;align-items:baseline;gap:8px}
h3{font-size:1rem;margin:20px 0 6px}
.count{display:inline-block;min-width:1.6em;text-align:center;background:var(--panel);color:var(--ink2);
border:1px solid var(--rule);border-radius:10px;padding:0 .45em;font-size:.75rem;letter-spacing:0}
p{margin:0 0 10px}
.dim,.muted{color:var(--muted)}
.small{font-size:.85rem}
code{font-size:.9em}

/* ---- panels: the report's cards (PANEL, a 6px coloured left border) */
.panel{background:var(--panel);border-left:6px solid var(--blue);padding:12px 16px;margin:14px 0}
.panel.green{border-left-color:var(--green)}
.panel.amber{border-left-color:var(--amber)}
.panel.red{border-left-color:var(--red)}
.panel.grey{border-left-color:var(--grey)}
.panel h2{margin:0 0 6px}
.panel p:last-child,.panel ul:last-child{margin-bottom:0}
.panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));gap:14px;margin:14px 0}
.panels .panel{margin:0}
dl.kv{display:grid;grid-template-columns:max-content 1fr;gap:6px 18px;margin:0}
dl.kv dt{color:var(--muted)}
dl.kv dd{margin:0;font-weight:600;overflow-wrap:anywhere}
dl.kv dd .dim{font-weight:400}

/* ---- buttons and forms */
button{font:inherit;font-size:.85rem;font-weight:600;padding:6px 14px;border-radius:3px;border:1px solid var(--rule);
background:var(--panel);color:var(--ink);cursor:pointer}
button:hover{border-color:var(--muted)}
button.primary{background:var(--blue);border-color:var(--blue);color:#fff;font-size:1rem;padding:10px 20px}
button.primary:hover{background:var(--blue-dark)}
form.signout{margin:0}
form.search{display:flex;flex-wrap:wrap;gap:10px;align-items:end;margin:0 0 6px}
form.search label{display:flex;flex-direction:column;gap:3px;font-size:.75rem;font-weight:700;color:var(--muted);
text-transform:uppercase;letter-spacing:.06em}
form.search label.grow{flex:1 1 16rem}
input[type=search],input[type=text],select{font:inherit;font-size:.95rem;color:var(--ink);background:var(--bg);
border:1px solid var(--rule);border-radius:3px;padding:7px 10px;min-height:38px}
input[type=search]:focus,select:focus{border-color:var(--blue)}

/* ---- tables: compact, a rule between rows, uppercase muted heads */
.scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 6px}
table{border-collapse:collapse;width:100%;font-size:.92rem}
th,td{text-align:left;padding:9px 12px;border-bottom:1px solid var(--rule);vertical-align:top}
thead th{font-size:.72rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;
white-space:nowrap;border-bottom:2px solid var(--rule);padding-top:6px;padding-bottom:6px;vertical-align:bottom}
thead th a{color:inherit}
tbody tr:hover>td{background:var(--hover)}
td.num,th.num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
td.date,td.nw{white-space:nowrap;font-variant-numeric:tabular-nums}
td.id{white-space:nowrap;color:var(--muted);font-variant-numeric:tabular-nums}
td.fl{white-space:nowrap;width:1%}
td.name{min-width:14rem}
td.name a{font-weight:600}
td .meta{display:block;color:var(--muted);font-size:.8rem;margin-top:1px}
.total{font-weight:700}
tfoot td{border-bottom:0;border-top:2px solid var(--rule);font-weight:700}
tr.gap td{color:var(--amber-ink);font-style:italic}
td.clip{max-width:22rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
table.week td.num a{color:inherit}
table.week td.num a:hover{color:var(--link)}
/* task tables share their column widths, so the agenda's groups line up */
table.tasks{table-layout:fixed;min-width:44rem}
table.tasks .c-id{width:4.5rem}
table.tasks .c-fl{width:4.6rem}
table.tasks .c-proj{width:22%}
table.tasks .c-with{width:7.5rem}
table.tasks .c-pri{width:4.2rem}
table.tasks .c-due{width:7.6rem}
table.tasks .c-st{width:7.4rem}
table.tasks .c-days{width:5.8rem}
table.tasks td{overflow-wrap:anywhere}

table.steps .c-step{width:4.5rem}
table.steps .c-st{width:7rem}
table.steps .c-at{width:10rem}
p.empty{color:var(--muted);background:var(--panel);padding:12px 16px;border-left:6px solid var(--rule)}

/* sortable heads and the filter box (added by dashboard.js; without it the
   tables render as they are) */
th[data-sortable]{cursor:pointer;user-select:none}
th[data-sortable]:hover{color:var(--ink)}
th[data-sortable]::after{content:"\2195";margin-left:4px;opacity:.35;font-size:.9em}
th[aria-sort=ascending]::after{content:"\2191";opacity:1;color:var(--blue)}
th[aria-sort=descending]::after{content:"\2193";opacity:1;color:var(--blue)}
.filter{display:flex;align-items:center;gap:10px;margin:0 0 8px}
.filter input{flex:0 1 18rem;min-height:32px;padding:4px 10px;font-size:.88rem}
.filter .n{color:var(--muted);font-size:.8rem}
tr[hidden]{display:none}

/* details rows: long text under a compact row (no script needed) */
tr.more>td{border-top:0;padding-top:0;padding-bottom:10px}
tbody tr.more:hover>td,tbody tr.lead:hover>td{background:transparent}
tr.lead>td{border-bottom:0}
details>summary{cursor:pointer;color:var(--muted);font-size:.8rem;font-weight:600;list-style:none;display:inline-block}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"\25B8";display:inline-block;width:1em;color:var(--blue)}
details[open]>summary::before{content:"\25BE"}
details .body{background:var(--panel);border-left:3px solid var(--blue);padding:8px 14px;margin:6px 0 0;font-size:.88rem}
details .body h4{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:8px 0 4px}
details .body h4:first-child{margin-top:0}
ul.ev{margin:0;padding-left:1.1rem}
ul.ev li{margin:0 0 4px;line-height:1.35}
ul.ev .at{color:var(--muted);font-variant-numeric:tabular-nums;margin-right:4px}

/* ---- chips: the report's status colours, white uppercase on colour */
.chip{display:inline-block;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;
padding:1px 7px;border-radius:3px;color:var(--chip-ink);background:var(--grey);white-space:nowrap;vertical-align:1px}
.chip.green{background:var(--green)}
.chip.amber{background:var(--amber);color:var(--amber-chip-ink)}
.chip.red{background:var(--red)}
.chip.blue{background:var(--blue)}
.chip.grey{background:var(--grey)}
.chip.quiet{background:transparent;color:var(--muted);border:1px solid var(--rule);font-weight:600;margin-left:4px}
.days{font-weight:700}
.days.amber{color:var(--amber-ink)}
.days.red{color:var(--red-ink)}
.late{color:var(--red-ink);font-weight:700}
.soon{color:var(--amber-ink);font-weight:700}
.warn{color:var(--amber-ink);font-weight:700;margin-left:2px}
.proj,.owner{color:var(--muted)}
.flag{display:inline-block;min-width:1.35em;text-align:center;border-radius:3px;font-weight:700;font-size:.72rem;
text-decoration:none;margin-right:2px;padding:0 3px;border:1px solid var(--rule);color:var(--ink2);background:var(--bg)}
.fB{color:var(--red-ink);border-color:var(--red)}
.fC{color:var(--red-ink)}
.fD{color:var(--blue-dark);border-color:var(--blue)}

.withheld{color:var(--muted);font-style:italic}

/* ---- the stage strip: the report's phase-state colours */
ol.strip{display:flex;gap:2px;list-style:none;margin:2px 0;padding:0;min-width:10.5rem;max-width:14rem}
ol.strip li{flex:1 1 0;min-width:1rem;height:1.05rem;border-radius:2px;background:var(--todo);font-size:.62rem;
text-align:center;line-height:1.05rem;color:var(--todo-ink);font-weight:600}
ol.strip li.done{background:var(--done-bg);color:var(--done)}
ol.strip li.now{background:var(--now);color:#fff;font-weight:700}
ol.strip.big{max-width:30rem;margin:6px 0 4px}
ol.strip.big li{height:1.5rem;line-height:1.5rem;font-size:.75rem}
ol.timeline{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(13rem,1fr));gap:6px}
ol.timeline li{padding:6px 10px;border-left:4px solid var(--todo);background:var(--panel);font-size:.88rem}
ol.timeline li.done{border-left-color:var(--done)}
ol.timeline li.now{border-left-color:var(--now);background:var(--now-bg)}
ol.timeline li.todo{color:var(--muted)}
ol.timeline li .dim{display:block;font-size:.78rem}

.pager{display:flex;gap:16px;align-items:center;margin:0 0 12px;font-size:.9rem}
nav.people{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 14px}
nav.people a{padding:3px 12px;border:1px solid var(--rule);border-radius:14px;font-size:.85rem;color:var(--ink2)}
nav.people a.on{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:600}
nav.people a:hover{text-decoration:none;border-color:var(--blue)}
ul.warnings{color:var(--amber-ink);font-size:.88rem;margin:6px 0}
ul.plain{margin:0;padding-left:1.1rem}
.legend{color:var(--muted);font-size:.8rem;margin:6px 0 0}
.signin{max-width:34rem}
.signin p{font-size:1.02rem}

@media (max-width:700px){
body{font-size:14px}
body::before{left:2px;width:24px;background-size:24px auto}
.frame{padding:0 14px 2rem 34px}
header.top{padding:12px 0 6px;gap:8px 14px}
header.top .who{margin-left:0;width:100%;justify-content:space-between}
nav.tabs a{padding:7px 9px 6px;font-size:.74rem}
h1{font-size:1.45rem;margin-top:14px}
th,td{padding:7px 8px}
td.name{min-width:11rem}
td.clip{max-width:12rem}
.filter input{flex:1 1 auto}
table.tasks{min-width:46rem}
table.tasks .c-id{width:3.4rem}
table.tasks .c-fl{width:3.6rem}
table.tasks .c-proj{width:8.5rem}
table.tasks .c-with{width:5.6rem}
table.tasks .c-pri{width:3.2rem}
table.tasks .c-due{width:6.8rem}
table.tasks .c-days{width:4.6rem}
dl.kv{grid-template-columns:1fr;gap:0}
dl.kv dt{margin-top:6px}
}
