    :root { color-scheme: light; --ink:#000000; --ink-dim:#333333; --ink-faint:#666666; --paper:#ffffff; --paper2:#f2f2f2; --card-bg:#ffffff; --cc:#c41e1e; --rdark:#8b1a1a; --rtint:#f7dcdc; --sepia:#999999; --rule:#444444; --rule-light:#888888; --rule-thin:#dddddd; --panel:rgba(255,255,255,.96); --panel-hover:rgba(242,242,242,.9); }
    * { box-sizing:border-box; }
    body { margin:0; background:var(--paper); color:var(--ink); font:17px/1.6 "Source Serif 4","Georgia","Times New Roman",serif; -webkit-font-smoothing:antialiased; }
    a { color:var(--ink); text-decoration-color:var(--rule); text-underline-offset:2px; }
    a:hover { color:var(--rdark); text-decoration-color:var(--cc); }
    ::selection { background:var(--rtint); color:var(--ink); }
    .red-banner { background:var(--cc); color:#fff; text-align:center; padding:22px 20px 12px; }
    .red-banner .masthead-h1 { font:900 clamp(1.8rem,7vw,4.2rem)/1.05 "Playfair Display",Georgia,serif; letter-spacing:-.03em; margin:0; color:#fff; text-decoration:none; display:inline-block; max-width:100%; overflow-wrap:anywhere; }
    .red-banner .masthead-sub { font:400 italic .85rem/1.3 "Source Serif 4",Georgia,serif; color:rgba(255,255,255,.85); margin:2px 0 0; letter-spacing:.02em; }
    .masthead-date-row { border-bottom:3px solid var(--ink); }
    .masthead-date-row .inner { max-width:1260px; margin:0 auto; display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:4px; padding:4px 20px; }
    .masthead-date { font:600 .68rem/1 Inter,sans-serif; letter-spacing:.18em; text-transform:uppercase; color:var(--ink-faint); margin:0; }
    .masthead-date .red-prefix { color:var(--cc); font-weight:700; }
    .masthead-nav-wrap { border-bottom:3px double var(--ink); }
    .masthead-nav-wrap .inner { max-width:1260px; margin:0 auto; padding:4px 20px; }
    .masthead-nav { display:flex; flex-wrap:wrap; justify-content:flex-start; align-items:center; }
    .masthead-nav a { position:relative; font:500 .74rem/1 Inter,sans-serif; letter-spacing:.04em; text-transform:uppercase; color:var(--ink); text-decoration:none; padding:5px 10px; white-space:nowrap; transition:color .15s; }
    .masthead-nav a:hover, .masthead-nav a[aria-current="page"] { color:var(--cc); }
    .page { max-width:1260px; margin:0 auto; padding:0 20px 60px; }
    .section-head { display:flex; align-items:baseline; gap:10px; margin:36px 0 12px; padding-bottom:5px; border-top:3px solid var(--cc); flex-wrap:wrap; }
    .section-head h2 { font:700 clamp(1.15rem,2vw,1.5rem)/1.15 "Playfair Display",Georgia,serif; margin:0; letter-spacing:-.01em; color:var(--ink); }
    .section-head .meta { font:.72rem/1 Inter,sans-serif; color:var(--ink-faint); text-transform:uppercase; letter-spacing:.1em; margin-left:auto; max-width:100%; overflow-wrap:anywhere; }
    .banner { border:1px solid var(--rule); border-left:4px solid var(--cc); background:var(--panel); padding:12px 16px; font-size:.92rem; margin-bottom:10px; }
    .banner.degraded { border-left-color:var(--rdark); background:var(--rtint); }
    .banner.unavailable { border-left-color:var(--ink); background:var(--rule-light); }
    .cards-row { display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:8px; margin:10px 0; }
    .card { background:var(--card-bg); border:1px solid var(--rule-thin); border-left:3px solid var(--cc); padding:10px 12px; text-align:center; }
    .card .value { font:700 1.4rem/1.1 "Playfair Display",Georgia,serif; color:var(--cc); }
    .card .label { font:.72rem/1.3 Inter,sans-serif; color:var(--ink-faint); text-transform:uppercase; letter-spacing:.08em; margin-top:2px; }
    .health-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(270px,1fr)); gap:8px; }
    .source { background:var(--panel); border:1px solid var(--rule-thin); padding:11px 13px 11px 18px; position:relative; }
    .source::before { content:""; position:absolute; left:6px; top:17px; width:5px; height:5px; border-radius:50%; background:var(--ink-faint); }
    .source.ok::before { background:var(--ink); } .source.empty::before { background:var(--sepia); }
    .source.unavailable::before,.source.stale::before { background:var(--cc); }
    .source h3 { font:600 .88rem/1.2 "Source Serif 4",Georgia,serif; margin:0 0 2px; }
    .status { font-weight:700; letter-spacing:.04em; font-size:.82rem; }
    .status.ok { color:var(--ink); } .status.empty { color:var(--ink-faint); } .status.unavailable,.status.stale { color:var(--cc); } .status.not-checked { color:var(--ink-dim); }
    .items { display:grid; gap:8px; }
    .item { background:var(--card-bg); border:1px solid var(--rule-thin); padding:12px 14px; border-left:3px solid var(--cc); }
    .item h3 { font:600 .98rem/1.25 "Source Serif 4",Georgia,serif; margin:0 0 3px; }
    .item h3 a { color:var(--ink); text-decoration:none; }
    .item h3 a:hover { color:var(--rdark); text-decoration:underline; text-decoration-color:var(--cc); }
    .item .meta { font:.74rem/1.3 Inter,sans-serif; color:var(--ink-faint); margin-bottom:3px; }
    .item p { font:.88rem/1.5 "Source Serif 4",Georgia,serif; color:var(--ink-dim); margin:5px 0 0; }
    .item .tag { display:inline-block; margin:3px 3px 0 0; padding:2px 7px; border:1px solid var(--rule); font-size:.74rem; font-family:Inter,sans-serif; color:var(--ink-dim); }
    table { border-collapse:collapse; width:100%; background:var(--card-bg); border:1px solid var(--rule); font-size:.84rem; }
    th,td { text-align:left; padding:7px 9px; border-bottom:1px solid var(--rule-thin); vertical-align:top; }
    th { font:.68rem/1 Inter,sans-serif; text-transform:uppercase; letter-spacing:.08em; color:var(--ink-faint); background:var(--paper2); }
    tr:last-child td { border-bottom:0; }
    .pill { display:inline-block; padding:2px 6px; border:1px solid var(--rule); font-size:.72rem; font-family:Inter,sans-serif; color:var(--ink-dim); max-width:100%; overflow-wrap:anywhere; }
    .controls { display:flex; flex-wrap:wrap; gap:6px; align-items:center; margin:6px 0; }
    input,select { border:1px solid var(--rule); background:var(--card-bg); color:var(--ink); padding:6px 10px; font:500 .8rem/1 Inter,sans-serif; }
    input:focus,select:focus { outline:2px solid var(--ink); outline-offset:2px; }
    .empty-state { color:var(--ink-faint); border:1px dashed var(--rule); padding:12px; font-style:italic; }
    .error { color:var(--ink); font-weight:600; }
    .subtle { font:.8rem/1.4 "Source Serif 4",Georgia,serif; color:var(--ink-dim); }
    .ics-badge { display:inline-block; padding:5px 12px; border:2px solid var(--cc); background:var(--rtint); color:var(--rdark); font:700 .78rem/1 Inter,sans-serif; letter-spacing:.05em; text-transform:uppercase; text-decoration:none; border-radius:2px; transition:background .15s,color .15s; }
    .ics-badge:hover { background:var(--cc); color:#fff; text-decoration:none; }
    .cal-dateline { font:700 .7rem/1 Inter,sans-serif; letter-spacing:.16em; text-transform:uppercase; color:#fff; background:var(--ink); padding:5px 11px; display:block; margin-top:8px; }
    .footer { border-top:3px solid var(--cc); margin-top:28px; padding-top:14px; font:.78rem/1.4 "Source Serif 4",Georgia,serif; color:var(--ink-dim); }
    .footer .contact-line { font-family:"DM Mono","Courier New",monospace; font-size:.74rem; color:var(--ink-faint); margin-top:4px; }
    @media (max-width:600px) { .cards-row { grid-template-columns:repeat(2,1fr); } .page { padding:0 12px 48px; } }
    /* --- Accessibility (lane3) --- */
    a:focus-visible, .welcome-link:focus-visible, .ics-badge:focus-visible, .button:focus-visible, .window-btn:focus-visible, .kind-chip:focus-visible { outline:3px solid var(--cc); outline-offset:2px; }
    .skip-link { position:absolute; left:-9999px; }
    .skip-link:focus, .skip-link:focus-visible { position:fixed; top:8px; left:8px; width:auto; height:auto; margin:0; padding:10px 16px; clip:auto; overflow:visible; white-space:nowrap; background:var(--paper); color:var(--ink); border:2px solid var(--cc); z-index:2147483646; font:600 .85rem/1 Inter,sans-serif; text-decoration:none; }
    @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; scroll-behavior:auto !important; } body::before { display:none; } }
    @media (pointer: coarse) { .masthead-nav a, .ics-badge, .button, .window-btn, .kind-chip, input, select { min-height:44px; min-width:44px; } .masthead-nav a { display:inline-flex; align-items:center; } }
    .newspaper-label { display:block; font:700 .68rem/1 Inter,sans-serif; letter-spacing:.18em; text-transform:uppercase; color:var(--cc); margin-bottom:6px; }
    .grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:8px; }
    /* --- Lane2: mobile nav + overflow backstop + aria-current (2.3/2.4/2.5) --- */
    @media (max-width:768px) {
      .masthead-nav { flex-wrap:wrap; justify-content:flex-start; }
      .masthead-nav a { white-space:normal; }
      .masthead-nav-wrap .inner { overflow:visible; }
    }
    /* Lane 4 r3 (P1-A): the global `html, body { overflow-x:hidden }` backstop was
       removed here. It made <html> a scroll container, which pins every
       `position:sticky` descendant — the month datelines never travelled. Wide
       content now scrolls inside its own `.table-scroll`/`.scroll-x` wrapper. */
    .masthead-nav a[aria-current="page"] { font-weight:700; box-shadow:0 2px 0 0 var(--cc); }
    .breadcrumb { border-bottom:1px solid var(--rule); }
    .breadcrumb .inner { max-width:1260px; margin:0 auto; padding:4px 20px; }
    .breadcrumb ol { list-style:none; display:flex; flex-wrap:wrap; gap:4px; margin:0; padding:0; font:.72rem/1 Inter,sans-serif; letter-spacing:.06em; text-transform:uppercase; color:var(--ink-faint); }
    .breadcrumb li[aria-current] { color:var(--ink); font-weight:700; }
    .breadcrumb a { color:var(--ink-faint); text-decoration:none; }
    .breadcrumb a:hover { color:var(--cc); }
    .panel-heading { font:700 1.05rem/1.2 "Playfair Display",Georgia,serif; margin:0; letter-spacing:-.01em; color:var(--ink); }
#event-items .cal-dateline { font:700 .7rem/1 Inter,sans-serif; letter-spacing:.16em; text-transform:uppercase; color:#fff; background:var(--ink); padding:5px 11px; display:block; }
#event-items .cal-entry { background:var(--card-bg); border:1px solid var(--rule-thin); border-top:0; border-left-width:3px; border-left-color:var(--cc); padding:11px 14px; break-inside:avoid; }
#event-items .cal-entry + .cal-entry { border-top:1px dotted var(--rule-light); }
#event-items .cal-when { display:flex; justify-content:space-between; align-items:center; gap:8px; margin-bottom:3px; }
#event-items .cal-time { font:500 .78rem/1 "DM Mono","Courier New",monospace; color:var(--cc); letter-spacing:.02em; white-space:nowrap; }
/* --- lane cci-frontend: sticky month headers, kind chips, window buttons, ics help --- */
#event-items .cal-dateline { position:sticky; top:0; z-index:5; }
.kind-chip { display:inline-block; cursor:pointer; border-radius:0; margin-bottom:4px; padding:2px 8px; border:1px solid var(--rule); border-left:3px solid var(--rule); font:600 .68rem/1.4 Inter,sans-serif; letter-spacing:.05em; text-transform:uppercase; color:var(--ink-dim); background:var(--paper2); }
.kind-chip--meeting { border-left-color:var(--cc); color:var(--rdark); background:var(--rtint); border-color:var(--rdark); }
.kind-chip--community { border-left-color:var(--ink-dim); }
.kind-chip--news { border-left-color:var(--ink); color:var(--ink); }
.kind-chip--youtube { border-left-color:var(--sepia); color:var(--ink-dim); }
.kind-chip--closure { border-left-color:var(--rule); color:var(--ink-faint); }
.kind-chip:hover { border-color:var(--cc); color:var(--rdark); }
.kind-chip[aria-pressed="true"] { background:var(--cc); border-color:var(--cc); color:#fff; }
.window-btn { border:1px solid var(--rule); background:var(--card-bg); color:var(--ink); padding:6px 12px; font:600 .74rem/1 Inter,sans-serif; letter-spacing:.04em; text-transform:uppercase; cursor:pointer; }
.window-btn:hover { border-color:var(--cc); color:var(--rdark); }
.window-btn[aria-pressed="true"] { background:var(--cc); border-color:var(--cc); color:#fff; }
.ics-help { margin:6px 0 0; font:.85rem/1.5 "Source Serif 4",Georgia,serif; }
.ics-help summary { cursor:pointer; font:600 .78rem/1.4 Inter,sans-serif; color:var(--rdark); letter-spacing:.03em; }
.ics-help summary:hover { color:var(--cc); }
.ics-help-body { border:1px solid var(--rule-thin); border-left:3px solid var(--cc); background:var(--card-bg); padding:10px 14px; margin-top:6px; }
.ics-help-body p { margin:0 0 6px; }
.ics-help-body ul { margin:0; padding-left:20px; }
.ics-help-body li { margin:3px 0; }
.ics-help-body code { font-family:"DM Mono","Courier New",monospace; font-size:.78rem; background:var(--paper2); padding:1px 4px; }
#event-items .cal-entry h3 { font-size:1rem; margin-bottom:2px; }

/* --- Lane B r2: WCAG 2.5.8 target-size — inline table links need 24x24px min. --- */
.table-scroll td a { display:inline-block; min-height:24px; line-height:24px; }

/* ===================================================================
   Lane 4 r3 — rules re-split by consumption (R2 P0.2/P0.9/P1-A).
   Everything below was authored in index.css, which only index.html
   links, while the elements it styles are rendered by assets/site.js
   (shared by all eight pages) or by events/gui/news/sources markup.
   A rule a page uses must live in a stylesheet that page loads.
   Appended as one block so the move stays rebase-friendly.
   =================================================================== */
.meta { font:.74rem/1.4 Inter,sans-serif; color:var(--ink-faint); }
.banner strong { font-weight:600; }
.banner.degraded .meta, .banner.degraded .item .meta { color:var(--ink-dim); }
.banner.unavailable .meta { color:var(--ink); }
.footer a { color:var(--ink-dim); }
.pill.monitored { color:var(--ink); border-color:var(--ink-dim); }
.pill.discovery-only { color:var(--ink-faint); border-color:var(--ink-faint); }
.pill.reference-only { color:var(--ink-faint); }
input,select,.button { border:1px solid var(--rule); background:var(--card-bg); color:var(--ink); padding:6px 10px; font:500 .8rem/1 Inter,sans-serif; }
input:focus,select:focus,.button:focus-visible { outline:2px solid var(--ink); outline-offset:2px; }
.button { cursor:pointer; text-decoration:none; display:inline-flex; align-items:center; gap:3px; transition:background .15s,border-color .15s; }
.button:hover { background:var(--panel-hover); border-color:var(--cc); color:var(--cc); }
.button.secondary { background:transparent; color:var(--ink-dim); }
.button[disabled] { opacity:.5; cursor:default; }
.masthead-nav-wrap { overflow:visible; }

/* Per-container horizontal scroll, replacing the global overflow-x backstop.
   `.table-scroll` was index-only while gui.html and sources.html both emit
   wrapped tables; `.scroll-x` is the general-purpose wrapper. */
code { overflow-wrap:anywhere; }
/* min-width:0 is what makes the scroller actually scroll. A grid or flex child
   defaults to min-width:auto — it refuses to shrink below its content's
   min-content width — so a wide table grew its own wrapper instead of
   overflowing inside it, and the document grew with it. max-width:100% cannot
   fix that on its own: the track was already wider than the viewport. */
.table-scroll, .scroll-x { overflow-x:auto; -webkit-overflow-scrolling:touch; margin:8px 0; max-width:100%; min-width:0; }
.items > *, .grid > *, .cards-row > *, .section-head > *, .controls > *, .action-bar > * { min-width:0; }
/* Every string on these pages is data: a source id, a station name, an agenda
   URL, a monitor summary. Any of them can be one long unbreakable token, and a
   token wider than the viewport widens the document no matter how the layout is
   built. `anywhere` only breaks when a break is needed to avoid overflow, and
   unlike `break-word` it also shrinks min-content, so grid tracks and table
   cells stop being sized by their longest word. */
.page, .red-banner, .masthead-nav-wrap, .breadcrumb { overflow-wrap:anywhere; }
.table-scroll table { min-width:640px; max-width:none; width:max-content; }
/* A single unbreakable token in a cell (a long URL, a station id, a CI-rendered
   wide word) used to spill past the table's own box and widen the document even
   though the wrapper scrolls: the cell overflowed visibly rather than the table
   growing inside its scroller. Cells wrap; the table sizes to its content. */
.table-scroll td, .table-scroll th { overflow-wrap:anywhere; }

/* P0.9: `.items` is applied to <ol>, so the UA list reset has to be authored —
   without it the calendar renders browser decimals at a 40px inline indent. */
.items { list-style:none; margin:0; padding:0; }

/* P1-A: the month dateline is a <li> sibling of the event <li>s. While
   #event-items was `display:grid` every child was its own grid item, so a
   sticky dateline had exactly its own height to travel in — zero movement.
   Flow layout gives it the rest of the list to stick over. */
#event-items.items { display:block; gap:0; margin-top:10px; border-top:3px solid var(--ink); }
