
  /* ───────────────────────────────────────── Tokens */
  :root {
    /* Aliases onto the shared Wilder Insights Lab tokens (static/css/wil-tokens.css). */
    --bg: var(--wil-bg);
    --card: var(--wil-card);
    --card-grad: var(--wil-card);
    --forest: var(--wil-forest);
    --primary: var(--wil-primary);
    --sage: var(--wil-sage);
    --sand: var(--wil-sand);
    --roest: var(--wil-roest);
    --amber: var(--wil-amber);
    /* Readable pairs — see the note in wil-tokens.css. Use these for `color:`,
       the plain ones for fills, borders and chart series. */
    --sage-text: var(--wil-sage-text);
    --roest-text: var(--wil-roest-text);
    --amber-text: var(--wil-amber-text);
    --text: var(--wil-text);
    --text-2: var(--wil-text-2);
    --border: var(--wil-border);
    --hairline: var(--wil-hairline);
    --shadow: var(--wil-shadow);
    --radius: var(--wil-radius);
    --font-sans: var(--wil-font-sans);
    --font-mono: var(--wil-font-mono);

    /* The deep panels: the two big dark blocks on the live page (the bird just
       heard, and "in vogelvlucht"). Their fill and every level of text on them
       is a token, because a partner house style replaces the fill -- and then
       cream-on-forest would be cream on navy, or cream on yellow. The template
       overrides this whole set with colours computed from the brand colour, so
       the type contrasts with whatever the panel became. */
    --deep: var(--forest);
    --on-deep: #EFE9DA;
    --on-deep-strong: #F4EFE3;
    --on-deep-soft: rgba(239,233,218,.82);
    --on-deep-mute: rgba(239,233,218,.6);
    --deep-label: #9DBDB3;
    --deep-border: #1F2A24;
  }

  .wil-dashboard * { box-sizing: border-box; }
  .wil-dashboard { background: var(--bg); color: var(--text); font-family: 'DM Sans', system-ui, sans-serif; -webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.5; }
  .wil-dashboard a { color: inherit; text-decoration: none; }
  .wil-dashboard button { font: inherit; color: inherit; background: none; border: none; cursor: pointer; }

  /* Inline icons (see templates/_wil_icons.html) — sized like a glyph so they
     drop into the same slots the Font Awesome <i> elements used to fill. */
  .wil-ic { width: 1em; height: 1em; flex: 0 0 auto; vertical-align: -0.125em; }

  .wil-dashboard .mono { font-family: 'DM Mono', ui-monospace, monospace; }
  .wil-dashboard .serif { font-family: var(--font-sans); font-weight: 600; }

  /* ───────────────────────────────────────── Layout */
  .wil-dashboard .app { max-width: 1440px; margin: 0 auto; }

  /* ───────────────────────────────────────── Header */
  .wil-dashboard .header {
    display: flex; align-items: center; justify-content: space-between;
    padding: 14px 32px; border-bottom: 1px solid var(--border);
    background: rgba(250, 250, 247, .85); backdrop-filter: blur(8px);
    position: sticky; top: 0; z-index: 10;
  }
  .wil-dashboard .brand { display: flex; align-items: center; gap: 10px; }
  .wil-dashboard .brand-mark {
    width: 28px; height: 28px; border-radius: 8px;
    background: var(--forest);
    display: grid; place-items: center;
  }
  .wil-dashboard .brand-name { font-weight: 600; letter-spacing: -0.01em; font-size: 14px; }
  .wil-dashboard .brand-tag { font-size: 11px; color: var(--text-2); margin-top: -2px; letter-spacing: 0.02em; }

  .wil-dashboard .selector {
    display: flex; align-items: center; gap: 12px;
    padding: 6px 6px 6px 14px; border: 1px solid var(--border); border-radius: 999px;
    background: var(--card);
    transition: border-color .2s;
  }
  .wil-dashboard .selector:hover { border-color: var(--sage); }
  .wil-dashboard .selector-label { font-weight: 500; font-size: 13px; }
  .wil-dashboard .chev { width: 14px; height: 14px; opacity: .6; }
  .wil-dashboard .pill {
    font-size: 11px; padding: 4px 10px; border-radius: 999px;
    background: rgba(123, 160, 152, .14); color: var(--primary);
    font-weight: 500;
    display: inline-flex; align-items: center; gap: 6px;
  }
  .wil-dashboard .pill .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--sage); }

  .wil-dashboard .header-right { display: flex; align-items: center; gap: 12px; }
  .wil-dashboard .period {
    display: flex; align-items: center; gap: 8px;
    padding: 7px 12px; border: 1px solid var(--border); border-radius: 8px;
    font-size: 13px; font-weight: 500; background: var(--card);
  }
  .wil-dashboard .icon-btn {
    width: 34px; height: 34px; border-radius: 8px; border: 1px solid var(--border);
    background: var(--card); display: grid; place-items: center;
    transition: border-color .2s;
  }
  .wil-dashboard .icon-btn:hover { border-color: var(--sage); }
  .wil-dashboard .avatar {
    width: 34px; height: 34px; border-radius: 50%;
    background: var(--sand);
    display: grid; place-items: center; color: var(--forest);
    font-size: 12px; font-weight: 600;
  }

  /* ───────────────────────────────────────── Live status bar */
  .wil-dashboard .live-bar {
    display: grid; grid-template-columns: 1fr auto 1fr;
    align-items: center; gap: 24px;
    padding: 10px 32px;
    border-bottom: 1px solid var(--border);
    background: var(--card);
  }
  .wil-dashboard .live-left { display: flex; align-items: center; gap: 10px; font-size: 12px; }
  .wil-dashboard .live-dot {
    width: 8px; height: 8px; border-radius: 50%; background: #4ea66f;
    box-shadow: 0 0 0 0 rgba(78, 166, 111, .6);
    animation: pulse 1.8s infinite;
  }
  @keyframes pulse {
    0%   { box-shadow: 0 0 0 0 rgba(78,166,111,.55); }
    70%  { box-shadow: 0 0 0 8px rgba(78,166,111,0); }
    100% { box-shadow: 0 0 0 0 rgba(78,166,111,0); }
  }
  .wil-dashboard .live-label { font-family: 'DM Mono', monospace; letter-spacing: .04em; color: var(--primary); font-weight: 500; }
  .wil-dashboard .live-meta { color: var(--text-2); }
  .wil-dashboard .sparkline { height: 24px; width: 360px; }
  .wil-dashboard .live-right { text-align: right; font-size: 11px; color: var(--text-2); letter-spacing: .03em; }

  /* ───────────────────────────────────────── Sections */
  .wil-dashboard .section { padding: 32px; }
  .wil-dashboard .section + .section { padding-top: 8px; }

  .wil-dashboard .section-head { margin-bottom: 20px; }
  .wil-dashboard .eyebrow {
    font-family: 'DM Mono', monospace; font-size: 11px;
    letter-spacing: .08em; color: var(--text-2); text-transform: uppercase;
    margin-bottom: 8px;
  }
  .wil-dashboard .section-title { font-family: var(--font-sans); font-weight: 600; font-size: 28px; letter-spacing: -0.01em; line-height: 1.15; margin-bottom: 6px; }
  .wil-dashboard .section-sub { color: var(--text-2); max-width: 640px; }

  /* ───────────────────────────────────────── Card */
  .wil-dashboard .card {
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    padding: 24px;
    transition: border-color .25s ease;
  }
  .wil-dashboard .card:hover { border-color: rgba(123, 160, 152, .55); }
  .wil-dashboard .card-eyebrow { font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .08em; color: var(--text-2); text-transform: uppercase; }

  /* ───────────────────────────────────────── Hero grid */
  .wil-dashboard .hero-grid {
    display: grid; grid-template-columns: 1.5fr 1fr; gap: 20px;
  }

  /* Score card */
  .wil-dashboard .score-card { padding: 32px; display: flex; flex-direction: column; min-height: 460px; }
  .wil-dashboard .score-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 28px; }
  .wil-dashboard .trend-pill {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 12px; border-radius: 999px;
    background: rgba(123, 160, 152, .15);
    color: var(--primary); font-size: 12px; font-weight: 500;
  }
  .wil-dashboard .trend-pill .arrow {
    display: inline-block; opacity: 0; transform: translateY(2px);
    animation: arrowIn .5s .8s forwards;
  }
  @keyframes arrowIn { to { opacity: 1; transform: translateY(0); } }

  .wil-dashboard .score-body {
    display: grid; grid-template-columns: auto 1fr; gap: 32px; align-items: center;
    flex: 1;
  }
  /* Round version of the comparison glider: a full-circle gradient scale
     (roest→forest, low→high) with an external pointer at the score and the
     value in the middle. */
  .wil-dashboard .score-gauge { position: relative; width: 168px; height: 168px; }
  /* 0 at the top (dark red), sweeping clockwise up to dark green near the top
     again — so a higher score visibly climbs from red round to green. */
  .wil-dashboard .sg-ring {
    position: absolute; inset: 0; border-radius: 50%;
    background: conic-gradient(from 0deg,
      #B85C3A, #C8924A, #7BA098, #2D4A3E);
    -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 15px), #000 calc(100% - 14px));
            mask: radial-gradient(farthest-side, transparent calc(100% - 15px), #000 calc(100% - 14px));
  }
  /* The pointer orbits just OUTSIDE the ring, pointing inward. */
  .wil-dashboard .sg-arrow {
    position: absolute; inset: 0; transform-origin: 50% 50%;
    transform: rotate(0deg);  /* 0-score start (top); JS animates to score */
    transition: transform 1.3s cubic-bezier(.22,.61,.36,1);
  }
  .wil-dashboard .sg-tip {
    position: absolute; top: -15px; left: 50%; margin-left: -8px;
    width: 0; height: 0;
    border-left: 8px solid transparent; border-right: 8px solid transparent;
    border-top: 14px solid var(--amber);
    filter: drop-shadow(0 1px 1px rgba(0, 0, 0, .2));
  }
  .wil-dashboard .sg-center {
    position: absolute; inset: 0; display: grid; place-items: center;
    font-family: var(--font-sans); font-weight: 600;
  }
  .wil-dashboard .sg-center .sg-val { display: inline-flex; align-items: baseline; }
  .wil-dashboard .sg-center .pct { font-size: 44px; font-weight: 600; letter-spacing: -0.03em; line-height: 1; }
  .wil-dashboard .sg-center .sg-unit { font-size: 20px; color: var(--text-2); margin-left: 2px; }

  .wil-dashboard .score-num { display: flex; align-items: baseline; gap: 8px; }
  .wil-dashboard .score-num .big {
    font-family: var(--font-sans); font-weight: 600; font-size: 132px; line-height: .9;
    color: var(--amber-text); letter-spacing: -.02em;
  }
  .wil-dashboard .score-num .denom { font-family: var(--font-sans); font-weight: 600; font-size: 32px; color: #C7C2B5; }
  .wil-dashboard .score-label { font-family: var(--font-sans); font-weight: 600; font-size: 18px; color: var(--text); margin-top: 6px; }

  .wil-dashboard .score-explain { margin-top: 24px; color: var(--text-2); max-width: 540px; line-height: 1.55; }

  .wil-dashboard .score-stats {
    display: grid; grid-template-columns: repeat(4, 1fr);
    margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--border);
  }
  .wil-dashboard .stat { padding: 0 18px; border-right: 1px solid var(--border); }
  .wil-dashboard .stat:first-child { padding-left: 0; }
  .wil-dashboard .stat:last-child { border-right: none; padding-right: 0; }
  .wil-dashboard .stat-num { font-family: var(--font-sans); font-weight: 600; font-size: 22px; color: var(--text); display: flex; align-items: baseline; gap: 8px; }
  .wil-dashboard .stat-sub { font-size: 12px; color: var(--text-2); margin-top: 4px; display: flex; align-items: center; gap: 6px; }
  .wil-dashboard .arrow-up { color: #4ea66f; opacity: 0; animation: arrowIn .5s 1s forwards; }
  .wil-dashboard .arrow-roest { color: var(--roest-text); opacity: 0; animation: arrowIn .5s 1.1s forwards; }

  /* Right column cards */
  .wil-dashboard .right-col { display: flex; flex-direction: column; gap: 20px; }

  .wil-dashboard .feed-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 14px; }
  .wil-dashboard .feed-title { font-family: var(--font-sans); font-weight: 600; font-size: 20px; }
  /* No bullets and no default ul indent: the list shares the left edge of the
     "Now audible" heading (Bootstrap gives ul a 2rem padding otherwise). */
  .wil-dashboard .feed-list { display: flex; flex-direction: column; list-style: none; margin: 0; padding: 0; }
  .wil-dashboard .feed-row {
    display: grid; grid-template-columns: 48px 1fr auto auto;
    align-items: center; gap: 12px;
    padding: 10px 0; border-top: 1px solid var(--border);
    transition: background .2s;
  }
  .wil-dashboard .feed-row:first-child { border-top: none; padding-top: 12px; }
  .wil-dashboard .feed-row:hover { background: rgba(123, 160, 152, .05); }
  .wil-dashboard .feed-time { font-family: 'DM Mono', monospace; font-size: 12px; color: var(--text-2); }
  .wil-dashboard .feed-time.now { color: var(--primary); font-weight: 500; }
  .wil-dashboard .feed-bird {
    width: 32px; height: 32px; border-radius: 50%;
    background: rgba(123, 160, 152, .12);
    display: grid; place-items: center;
  }
  .wil-dashboard .feed-name { font-weight: 500; font-size: 14px; display: flex; align-items: center; gap: 8px; }
  .wil-dashboard .badge-new {
    font-family: 'DM Mono', monospace; font-size: 9px; letter-spacing: .08em;
    padding: 2px 6px; border-radius: 4px;
    background: rgba(184, 92, 58, .14); color: var(--roest-text); font-weight: 500;
  }
  .wil-dashboard .sensor-tag {
    font-family: 'DM Mono', monospace; font-size: 10px;
    padding: 3px 7px; border-radius: 4px;
    background: var(--bg); border: 1px solid var(--border);
    color: var(--text-2);
  }
  .wil-dashboard .speaker { width: 28px; height: 28px; border-radius: 6px; display: grid; place-items: center; color: var(--text-2); }
  .wil-dashboard .speaker:hover { background: var(--bg); color: var(--primary); }

  .wil-dashboard .feed-foot {
    margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--border);
    font-size: 13px; color: var(--primary); font-weight: 500;
  }
  .wil-dashboard .feed-foot:hover { color: var(--forest); }

  /* Card B — soort van de week */
  .wil-dashboard .week-card { display: grid; grid-template-columns: 96px 1fr; gap: 20px; align-items: center; }
  .wil-dashboard .week-img {
    width: 96px; height: 96px; border-radius: 10px;
    background: var(--card);
    display: grid; place-items: center;
    border: 1px solid var(--border);
  }
  .wil-dashboard .week-eyebrow { display: flex; align-items: center; gap: 10px; margin-bottom: 6px; }
  .wil-dashboard .week-name { font-family: var(--font-sans); font-weight: 600; font-size: 22px; line-height: 1; }
  .wil-dashboard .week-latin { color: var(--text-2); font-size: 13px; margin-top: 4px; margin-bottom: 8px; }
  .wil-dashboard .week-context { color: var(--text-2); font-size: 13px; line-height: 1.5; margin-bottom: 10px; }
  .wil-dashboard .badge-roest {
    display: inline-block;
    font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .08em;
    padding: 3px 8px; border-radius: 4px;
    background: rgba(184, 92, 58, .12); color: var(--roest-text);
  }

  /* ───────────────────────────────────────── Section 2 grid */
  .wil-dashboard .why-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; }
  .wil-dashboard .why-card { display: flex; flex-direction: column; gap: 14px; }
  .wil-dashboard .why-icon {
    width: 36px; height: 36px; border-radius: 8px;
    background: rgba(45,74,62,.06); display: grid; place-items: center;
    color: var(--primary);
  }
  .wil-dashboard .why-head { display: flex; align-items: center; justify-content: space-between; }
  .wil-dashboard .why-title { font-family: var(--font-sans); font-weight: 600; font-size: 22px; line-height: 1.1; }
  .wil-dashboard .why-key {
    display: flex; align-items: baseline; gap: 10px;
    padding: 12px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
  }
  .wil-dashboard .why-key-num { font-family: var(--font-sans); font-weight: 600; font-size: 28px; color: var(--text); }
  .wil-dashboard .why-key-label { color: var(--text-2); font-size: 13px; }
  .wil-dashboard .why-trend {
    font-size: 12px; padding: 3px 8px; border-radius: 4px;
    background: rgba(123,160,152,.14); color: var(--primary); font-weight: 500;
  }
  .wil-dashboard .why-trend.amber { background: rgba(200,146,74,.15); color: var(--amber-text); }

  .wil-dashboard .why-body { color: var(--text-2); font-size: 13px; line-height: 1.55; }

  .wil-dashboard .contrib {
    margin-top: auto; padding-top: 14px; border-top: 1px solid var(--border);
    display: flex; align-items: center; justify-content: space-between;
  }
  .wil-dashboard .contrib-label { font-size: 12px; color: var(--text-2); }
  .wil-dashboard .contrib-label .v { color: var(--text); font-weight: 500; }
  .wil-dashboard .bars { display: inline-flex; gap: 3px; }
  .wil-dashboard .bar { width: 6px; height: 14px; border-radius: 2px; background: var(--border); }
  .wil-dashboard .bar.on { background: var(--amber); }
  .wil-dashboard .bar.on.low { background: var(--roest); }

  /* Sparkline (component 1) */
  .wil-dashboard .mini-line { width: 100%; height: 56px; }

  /* Stacked dominance bar */
  .wil-dashboard .stack {
    display: flex; height: 12px; border-radius: 6px; overflow: hidden;
    border: 1px solid var(--border);
  }
  .wil-dashboard .stack > span { display: block; height: 100%; }

  .wil-dashboard .top-list { display: flex; flex-direction: column; gap: 8px; font-size: 13px; }
  .wil-dashboard .top-row { display: grid; grid-template-columns: 14px 1fr auto; align-items: center; gap: 10px; }
  .wil-dashboard .swatch { width: 10px; height: 10px; border-radius: 2px; }
  .wil-dashboard .top-name { font-weight: 500; }
  .wil-dashboard .top-pct { font-family: 'DM Mono', monospace; font-size: 12px; color: var(--text-2); }

  /* Indicator list */
  .wil-dashboard .ind-list { display: flex; flex-direction: column; }
  .wil-dashboard .ind-row {
    display: grid; grid-template-columns: 22px 1fr auto;
    align-items: center; gap: 12px;
    padding: 10px 0; border-top: 1px solid var(--border); font-size: 13px;
  }
  .wil-dashboard .ind-row:first-child { border-top: none; }
  .wil-dashboard .ind-status { width: 18px; height: 18px; border-radius: 50%; display: grid; place-items: center; }
  .wil-dashboard .ind-status.ok { background: rgba(123,160,152,.18); color: var(--primary); }
  .wil-dashboard .ind-status.warn { background: rgba(200,146,74,.2); color: var(--amber-text); }
  .wil-dashboard .ind-status.miss { background: rgba(184,92,58,.16); color: var(--roest-text); }
  .wil-dashboard .ind-name { font-weight: 500; }
  .wil-dashboard .ind-state { font-family: 'DM Mono', monospace; font-size: 11px; color: var(--text-2); }
  .wil-dashboard .ind-state.ok { color: var(--primary); }
  .wil-dashboard .ind-state.warn { color: var(--amber-text); }
  .wil-dashboard .ind-state.miss { color: var(--roest-text); }

  /* ───────────────────────────────────────── Insight block (forest) */
  .wil-dashboard .insight {
    margin-top: 24px;
    background: var(--forest);
    color: #EFE9DA; border-radius: var(--radius); padding: 36px 40px;
    position: relative; overflow: hidden;
    border: 1px solid var(--forest);
  }
  .wil-dashboard .insight::before {
    content: ""; position: absolute; right: -60px; top: -60px; width: 240px; height: 240px;
    background: transparent;
    pointer-events: none;
  }
  .wil-dashboard .insight-eyebrow {
    font-family: 'DM Mono', monospace; font-size: 11px; letter-spacing: .1em;
    text-transform: uppercase; color: var(--sage-text);
  }
  .wil-dashboard .insight-quote {
    font-family: var(--font-sans); font-weight: 600;
    font-size: 26px; line-height: 1.35; max-width: 920px; margin-top: 14px;
    color: #F4EFE3; letter-spacing: -0.005em;
    text-wrap: pretty;
  }
  .wil-dashboard .insight-cta {
    display: inline-flex; align-items: center; gap: 8px; margin-top: 22px;
    color: var(--sage-text); font-weight: 500; font-size: 14px;
  }
  .wil-dashboard .insight-cta:hover { color: #A6C4BD; }

  /* ───────────────────────────────────────── Section 3: Heartbeat */
  .wil-dashboard .heartbeat-card {
    display: grid; grid-template-columns: 240px 1fr 200px;
    gap: 32px; padding: 28px;
  }
  .wil-dashboard .hb-left { display: flex; flex-direction: column; gap: 14px; }
  .wil-dashboard .hb-title { font-family: var(--font-sans); font-weight: 600; font-size: 22px; line-height: 1.15; }
  .wil-dashboard .hb-sub { color: var(--text-2); font-size: 13px; line-height: 1.5; }
  .wil-dashboard .toggles { display: flex; gap: 6px; flex-wrap: wrap; }
  .wil-dashboard .toggle {
    font-size: 12px; padding: 5px 11px; border-radius: 999px;
    border: 1px solid var(--border); background: var(--card);
    color: var(--text-2); font-weight: 500;
  }
  .wil-dashboard .toggle.active { background: rgba(123,160,152,.18); border-color: rgba(123,160,152,.4); color: var(--primary); }
  .wil-dashboard .legend { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; font-size: 11px; color: var(--text-2); }
  .wil-dashboard .legend-row { display: flex; align-items: center; gap: 8px; }
  .wil-dashboard .legend-key { width: 22px; height: 2px; }
  .wil-dashboard .legend-key.solid { background: #2D4A3E; }
  .wil-dashboard .legend-key.dash { border-top: 2px dashed currentColor; height: 0; height: 2px; }
  .wil-dashboard .legend-key.vert { width: 2px; height: 12px; background: var(--roest); }

  .wil-dashboard .hb-chart { position: relative; min-height: 240px; }
  .wil-dashboard .hb-chart svg { width: 100%; height: 240px; display: block; }
  .wil-dashboard .interv-flag {
    position: absolute; top: 8px; transform: translateX(8px);
    background: var(--card); border: 1px solid var(--border);
    border-left: 2px solid var(--roest); border-radius: 6px;
    padding: 8px 10px; font-size: 11px; line-height: 1.4;
    box-shadow: var(--shadow); max-width: 180px;
  }
  .wil-dashboard .interv-flag .ttl { font-family: 'DM Mono', monospace; color: var(--roest-text); font-weight: 500; letter-spacing: .04em; margin-bottom: 2px; }
  .wil-dashboard .interv-flag .body { color: var(--text); }

  .wil-dashboard .hb-stats { display: flex; flex-direction: column; gap: 10px; }
  .wil-dashboard .mini-stat {
    border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px;
    background: var(--card);
  }
  .wil-dashboard .mini-stat.hl { background: transparent; border-color: rgba(123,160,152,.35); }
  .wil-dashboard .mini-stat .lbl { font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .08em; color: var(--text-2); text-transform: uppercase; }
  .wil-dashboard .mini-stat .num { font-family: var(--font-sans); font-weight: 600; font-size: 28px; line-height: 1; margin: 4px 0 4px; color: var(--text); }
  .wil-dashboard .mini-stat.hl .num { color: var(--primary); }
  .wil-dashboard .mini-stat .desc { font-size: 11.5px; color: var(--text-2); line-height: 1.4; }

  /* Section 3 row 2 */
  .wil-dashboard .ev-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-top: 20px; }
  .wil-dashboard .ev-card { display: flex; flex-direction: column; gap: 14px; }

  .wil-dashboard .hours { display: flex; align-items: flex-end; gap: 2px; height: 100px; padding-top: 8px; }
  .wil-dashboard .hour { flex: 1; background: var(--border); border-radius: 2px 2px 0 0; position: relative; min-height: 2px; transition: background .2s; }
  .wil-dashboard .hour:hover { background: var(--primary); }
  .wil-dashboard .hour:hover::after {
    content: attr(data-tip); position: absolute; bottom: 100%; left: 50%;
    transform: translateX(-50%); background: var(--forest); color: #EFE9DA;
    padding: 4px 8px; border-radius: 4px; font-size: 10px; white-space: nowrap;
    font-family: 'DM Mono', monospace; margin-bottom: 6px; pointer-events: none;
  }
  .wil-dashboard .hours-axis { display: flex; justify-content: space-between; font-family: 'DM Mono', monospace; font-size: 9.5px; color: var(--text-2); margin-top: 6px; letter-spacing: .03em; }

  .wil-dashboard .recent-list { display: flex; flex-direction: column; }
  .wil-dashboard .recent-row {
    display: grid; grid-template-columns: 36px 1fr; gap: 12px;
    padding: 12px 0; border-top: 1px solid var(--border); align-items: center;
  }
  .wil-dashboard .recent-row:first-child { border-top: none; padding-top: 4px; }
  .wil-dashboard .recent-icon {
    width: 32px; height: 32px; border-radius: 50%;
    background: rgba(123,160,152,.14); display: grid; place-items: center;
  }
  .wil-dashboard .recent-name { font-weight: 500; font-size: 14px; }
  .wil-dashboard .recent-meta { font-family: 'DM Mono', monospace; font-size: 10.5px; color: var(--text-2); margin-top: 2px; }
  .wil-dashboard .recent-context { font-size: 12px; color: var(--text-2); margin-top: 4px; line-height: 1.4; }

  .wil-dashboard .decline-card {
    border-left: 3px solid var(--roest);
    background: rgba(184,92,58,.03);
  }
  .wil-dashboard .decline-row {
    display: grid; grid-template-columns: 24px 1fr auto; gap: 12px;
    padding: 12px 0; border-top: 1px solid var(--border); align-items: center;
  }
  .wil-dashboard .decline-row:first-child { border-top: none; padding-top: 4px; }
  .wil-dashboard .decline-warn {
    width: 22px; height: 22px; border-radius: 50%;
    background: rgba(184,92,58,.14); color: var(--roest-text);
    display: grid; place-items: center;
  }
  .wil-dashboard .decline-name { font-weight: 500; font-size: 14px; }
  .wil-dashboard .decline-context { font-size: 11.5px; color: var(--text-2); margin-top: 2px; line-height: 1.4; }
  .wil-dashboard .decline-pct { font-family: 'DM Mono', monospace; font-size: 12px; color: var(--roest-text); font-weight: 500; }
  .wil-dashboard .insight-italic { color: var(--text-2); font-size: 13px; line-height: 1.5; }

  /* ───────────────────────────────────────── Section 4: Benchmark */
  .wil-dashboard .bench-grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: 20px; }
  .wil-dashboard .bench-card { padding: 32px; display: flex; flex-direction: column; gap: 22px; }
  .wil-dashboard .bench-badge {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 12px; border-radius: 999px;
    background: rgba(184,92,58,.12); color: var(--roest-text);
    font-family: 'DM Mono', monospace; font-size: 11px; letter-spacing: .08em;
    font-weight: 500; align-self: flex-start;
  }
  .wil-dashboard .bench-claim {
    font-family: var(--font-sans); font-weight: 600; font-size: 30px; line-height: 1.25;
    letter-spacing: -0.005em; color: var(--text); text-wrap: pretty;
    max-width: 640px;
  }
  .wil-dashboard .bench-claim .accent { color: var(--primary); }

  .wil-dashboard .dist-wrap { position: relative; padding-top: 28px; }
  .wil-dashboard .dist-svg { width: 100%; height: 110px; display: block; }
  .wil-dashboard .dist-axis {
    display: flex; justify-content: space-between; margin-top: 8px;
    font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .04em;
    color: var(--text-2);
  }
  .wil-dashboard .dist-marker {
    position: absolute; top: 0; transform: translateX(-50%);
    display: flex; flex-direction: column; align-items: center;
    pointer-events: none;
  }
  .wil-dashboard .dist-marker .flag {
    background: var(--roest); color: #FFF6EE;
    font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .04em;
    padding: 4px 8px; border-radius: 4px; white-space: nowrap;
    font-weight: 500;
    animation: bounceIn .6s 1s backwards cubic-bezier(.34,1.56,.64,1);
  }
  .wil-dashboard .dist-marker .stem { width: 2px; flex: 1; background: var(--roest); margin-top: 0; }
  @keyframes bounceIn {
    0% { opacity: 0; transform: translateY(-12px) scale(.85); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
  }
  .wil-dashboard .dist-median {
    position: absolute; top: 28px; transform: translateX(-50%);
    font-family: 'DM Mono', monospace; font-size: 9.5px; color: var(--text-2);
    letter-spacing: .04em;
  }

  .wil-dashboard .bench-progress {
    display: flex; align-items: center; gap: 10px;
    padding: 12px 14px; border-radius: 8px;
    background: rgba(123,160,152,.1); border: 1px solid rgba(123,160,152,.25);
  }
  .wil-dashboard .bench-progress .arr {
    width: 26px; height: 26px; border-radius: 50%;
    background: rgba(123,160,152,.25); color: var(--primary);
    display: grid; place-items: center; flex-shrink: 0;
  }
  .wil-dashboard .bench-progress .txt { font-size: 13px; color: var(--text); }
  .wil-dashboard .bench-progress .txt strong { color: var(--primary); font-weight: 600; }

  .wil-dashboard .bench-foot { font-size: 12px; color: var(--text-2); line-height: 1.5; padding-top: 12px; border-top: 1px solid var(--border); }

  /* Ranking card */
  .wil-dashboard .rank-list { display: flex; flex-direction: column; gap: 14px; }
  .wil-dashboard .rank-row { display: flex; flex-direction: column; gap: 6px; }
  .wil-dashboard .rank-head { display: flex; align-items: baseline; justify-content: space-between; }
  .wil-dashboard .rank-name { font-weight: 500; font-size: 13px; }
  .wil-dashboard .rank-tag { font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .04em; }
  .wil-dashboard .rank-tag.good { color: var(--primary); }
  .wil-dashboard .rank-tag.mid { color: var(--amber-text); }
  .wil-dashboard .rank-tag.low { color: var(--roest-text); }
  .wil-dashboard .rank-track {
    height: 6px; border-radius: 3px; background: var(--border); position: relative;
  }
  .wil-dashboard .rank-marker {
    position: absolute; top: 50%; width: 12px; height: 12px; border-radius: 50%;
    transform: translate(-50%, -50%); border: 2px solid var(--card);
    box-shadow: 0 0 0 1px var(--border);
  }
  .wil-dashboard .rank-marker.good { background: var(--sage); box-shadow: 0 0 0 1px var(--primary); }
  .wil-dashboard .rank-marker.mid { background: var(--amber); }
  .wil-dashboard .rank-marker.low { background: var(--roest); }

  /* small forest insight (B) */
  .wil-dashboard .insight-sm {
    background: var(--forest);
    color: #EFE9DA; border-radius: var(--radius); padding: 24px;
    position: relative; overflow: hidden;
    border: 1px solid var(--forest);
  }
  .wil-dashboard .insight-sm::before {
    content: ""; position: absolute; right: -40px; bottom: -40px; width: 160px; height: 160px;
    background: transparent;
    pointer-events: none;
  }
  .wil-dashboard .insight-sm .eb { font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--sage-text); }
  .wil-dashboard .insight-sm .q { font-family: var(--font-sans); font-weight: 600; font-size: 18px; line-height: 1.4; margin-top: 10px; color: #F4EFE3; text-wrap: pretty; }
  .wil-dashboard .insight-sm .cta { display: inline-flex; align-items: center; gap: 6px; margin-top: 14px; color: var(--sage-text); font-weight: 500; font-size: 13px; }
  .wil-dashboard .insight-sm .cta:hover { color: #A6C4BD; }

  /* ───────────────────────────────────────── Section 5: Action */
  .wil-dashboard .action-intro {
    font-family: var(--font-sans); font-weight: 600;
    font-size: 22px; line-height: 1.4; color: var(--forest);
    max-width: 920px; text-wrap: pretty; margin-bottom: 24px;
    letter-spacing: -0.005em;
  }
  .wil-dashboard .action-intro strong { font-style: normal; color: var(--primary); font-weight: 400; border-bottom: 2px solid rgba(123,160,152,.4); }

  .wil-dashboard .actions-grid { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 20px; }

  .wil-dashboard .act-card { display: flex; flex-direction: column; gap: 16px; padding: 28px; }
  .wil-dashboard .act-hero {
    border: 1.5px solid rgba(123,160,152,.55);
    background: var(--card);
  }

  .wil-dashboard .act-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
  .wil-dashboard .act-badge {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 11px; border-radius: 999px;
    font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .08em;
    font-weight: 500;
  }
  .wil-dashboard .act-badge.hot { background: rgba(184,92,58,.14); color: var(--roest-text); animation: pulseBadge 2.4s ease-in-out infinite; }
  @keyframes pulseBadge {
    0%, 100% { box-shadow: 0 0 0 0 rgba(184,92,58,.35); }
    50% { box-shadow: 0 0 0 6px rgba(184,92,58,0); }
  }
  .wil-dashboard .act-badge.mid { background: rgba(212,196,168,.45); color: #8a6f3d; }
  .wil-dashboard .act-badge.win { background: rgba(123,160,152,.18); color: var(--primary); }

  .wil-dashboard .act-title { font-family: var(--font-sans); font-weight: 600; font-size: 28px; line-height: 1.15; letter-spacing: -0.005em; }
  .wil-dashboard .act-title.sm { font-size: 21px; }

  .wil-dashboard .act-body { color: var(--text-2); font-size: 13px; line-height: 1.55; }

  .wil-dashboard .impact-block {
    background: rgba(212,196,168,.18);
    border: 1px solid rgba(212,196,168,.55);
    border-radius: 10px; padding: 16px;
    display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px;
  }
  .wil-dashboard .impact-stat { display: flex; flex-direction: column; gap: 4px; }
  .wil-dashboard .impact-stat .num { font-family: var(--font-sans); font-weight: 600; font-size: 24px; line-height: 1.05; color: var(--text); }
  .wil-dashboard .impact-stat .num .arrow-rt { color: var(--text-2); margin: 0 4px; font-size: 18px; }
  .wil-dashboard .impact-stat .num .to { color: var(--primary); }
  .wil-dashboard .impact-stat .lbl { font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .06em; color: var(--text-2); text-transform: uppercase; }

  .wil-dashboard .impact-mini {
    display: flex; flex-direction: column; gap: 6px;
    padding: 12px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
  }
  .wil-dashboard .impact-mini .num { font-family: var(--font-sans); font-weight: 600; font-size: 22px; color: var(--text); line-height: 1; }
  .wil-dashboard .impact-mini .lbl { font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .06em; color: var(--text-2); text-transform: uppercase; }
  .wil-dashboard .progress-mini { height: 4px; background: var(--border); border-radius: 2px; overflow: hidden; margin-top: 4px; }
  .wil-dashboard .progress-mini .fill { display: block; height: 100%; background: var(--sage); border-radius: 2px; }

  .wil-dashboard .actions-list { display: flex; flex-direction: column; gap: 4px; }
  .wil-dashboard .action-row {
    display: grid; grid-template-columns: 28px 1fr auto;
    gap: 14px; padding: 14px 0; border-top: 1px solid var(--border); align-items: flex-start;
    transition: background .2s, padding .2s;
  }
  .wil-dashboard .action-row:first-child { border-top: none; }
  .wil-dashboard .action-row:hover { background: rgba(123,160,152,.05); padding-left: 6px; }
  .wil-dashboard .action-check {
    width: 22px; height: 22px; border: 1.5px solid var(--border); border-radius: 6px;
    display: grid; place-items: center; color: transparent; margin-top: 2px;
    transition: border-color .2s, background .2s, color .2s;
  }
  .wil-dashboard .action-row:hover .action-check { border-color: var(--sage); color: var(--sage-text); background: rgba(123,160,152,.08); }
  .wil-dashboard .action-icon-sm { width: 20px; height: 20px; color: var(--primary); flex-shrink: 0; }
  .wil-dashboard .action-name { font-weight: 500; font-size: 14px; display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }
  .wil-dashboard .action-desc { font-size: 12.5px; color: var(--text-2); line-height: 1.5; }
  .wil-dashboard .effort-tag {
    font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .06em;
    padding: 3px 8px; border-radius: 4px; white-space: nowrap;
    border: 1px solid var(--border); color: var(--text-2);
    align-self: flex-start; margin-top: 2px;
  }
  .wil-dashboard .effort-tag.low { background: rgba(123,160,152,.1); color: var(--primary); border-color: rgba(123,160,152,.3); }
  .wil-dashboard .effort-tag.mid { background: rgba(212,196,168,.25); color: #8a6f3d; border-color: rgba(212,196,168,.6); }
  .wil-dashboard .effort-tag.high { background: rgba(184,92,58,.1); color: var(--roest-text); border-color: rgba(184,92,58,.25); }

  .wil-dashboard .compact-actions { display: flex; flex-direction: column; gap: 10px; font-size: 13px; }
  .wil-dashboard .compact-action {
    display: grid; grid-template-columns: 18px 1fr; gap: 10px;
    padding: 10px 0; border-top: 1px solid var(--border);
    color: var(--text); line-height: 1.45;
  }
  .wil-dashboard .compact-action:first-child { border-top: none; padding-top: 4px; }
  .wil-dashboard .compact-action svg { color: var(--primary); }

  .wil-dashboard .act-foot {
    margin-top: auto; padding-top: 14px; border-top: 1px solid var(--border);
    display: flex; align-items: center; justify-content: space-between; gap: 8px;
  }
  .wil-dashboard .act-foot a { color: var(--primary); font-weight: 500; font-size: 13px; }
  .wil-dashboard .info-i {
    display: inline-flex; align-items: center; gap: 6px;
    font-size: 11px; color: var(--text-2);
  }
  .wil-dashboard .info-i .ic { width: 14px; height: 14px; border-radius: 50%; background: var(--border); color: var(--text-2); display: grid; place-items: center; font-size: 9px; font-family: 'DM Mono', monospace; font-weight: 600; }

  /* mini month bars (card 3) */
  .wil-dashboard .month-bars { display: flex; align-items: flex-end; gap: 3px; height: 50px; }
  .wil-dashboard .month-bars .mb { flex: 1; background: var(--border); border-radius: 2px 2px 0 0; min-height: 4px; }
  .wil-dashboard .month-axis { display: flex; justify-content: space-between; font-family: 'DM Mono', monospace; font-size: 9px; color: var(--text-2); margin-top: 4px; letter-spacing: .03em; }

  /* Impact simulation */
  .wil-dashboard .sim-wrap {
    margin-top: 28px;
    background: transparent;
    border: 1px solid rgba(123,160,152,.3);
    border-radius: var(--radius); padding: 32px;
  }
  .wil-dashboard .sim-head { margin-bottom: 22px; }
  .wil-dashboard .sim-eyebrow { font-family: 'DM Mono', monospace; font-size: 11px; letter-spacing: .08em; color: var(--primary); text-transform: uppercase; }
  .wil-dashboard .sim-title { font-family: var(--font-sans); font-weight: 600; font-size: 26px; margin-top: 6px; }

  .wil-dashboard .sim-grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: 28px; }

  .wil-dashboard .sim-chart-wrap { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 18px; }
  .wil-dashboard .sim-legend { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 12px; font-size: 11.5px; color: var(--text-2); }
  .wil-dashboard .sim-legend .row { display: flex; align-items: center; gap: 6px; }
  .wil-dashboard .sim-legend .key { width: 18px; height: 2px; background: var(--primary); }
  .wil-dashboard .sim-legend .key.dash { border-top: 2px dashed currentColor; height: 0; }
  .wil-dashboard .sim-legend .key.gray { background: #C5C0B5; }

  .wil-dashboard .sim-svg { width: 100%; height: 220px; display: block; }
  .wil-dashboard .sim-foot { font-size: 11.5px; color: var(--text-2); margin-top: 10px; line-height: 1.45; }

  .wil-dashboard .sim-stats { display: flex; flex-direction: column; gap: 10px; }
  .wil-dashboard .sim-stat {
    background: var(--card); border: 1px solid var(--border); border-radius: 10px;
    padding: 16px 18px;
  }
  .wil-dashboard .sim-stat .num { font-family: var(--font-sans); font-weight: 600; font-size: 30px; line-height: 1; color: var(--primary); }
  .wil-dashboard .sim-stat.ts .num { color: var(--text); }
  .wil-dashboard .sim-stat .lbl { font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .06em; color: var(--text-2); text-transform: uppercase; margin-top: 6px; }

  .wil-dashboard .sim-cta {
    display: inline-flex; align-items: center; gap: 8px;
    padding: 12px 16px; border-radius: 8px;
    background: var(--roest); color: #FFF6EE;
    font-weight: 500; font-size: 13px; margin-top: 4px;
    border: 1px solid #9C4B2D;
    transition: background .2s;
  }
  .wil-dashboard .sim-cta:hover { background: #9C4B2D; }

  .wil-dashboard .closing-strip {
    margin: 24px 0 0;
    padding: 14px 24px; border-top: 1px solid var(--border);
    display: flex; align-items: center; justify-content: space-between; gap: 16px;
    font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .04em;
    color: var(--text-2); flex-wrap: wrap;
  }
  .wil-dashboard .closing-strip a { color: var(--primary); }

  /* ───────────────────────────────────────── Section 6: Share */
  .wil-dashboard .share-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; }
  .wil-dashboard .share-card { display: flex; flex-direction: column; gap: 14px; }
  .wil-dashboard .share-preview {
    border: 1px solid var(--border); border-radius: 10px; overflow: hidden;
    background: var(--card); position: relative;
    box-shadow: 0 1px 3px rgba(28,35,30,.04);
  }
  .wil-dashboard .ratio-1 { aspect-ratio: 1 / 1; }
  .wil-dashboard .ratio-16-9 { aspect-ratio: 16 / 9; }
  .wil-dashboard .ratio-4-5 { aspect-ratio: 4 / 5; }

  .wil-dashboard .preview-pad { position: absolute; inset: 0; display: flex; flex-direction: column; padding: 18px; }

  .wil-dashboard .preview-1 {
    background: var(--forest);
    color: #F4EFE3;
  }
  .wil-dashboard .preview-1::before {
    content: ""; position: absolute; inset: 0;
    background: transparent;
  }
  .wil-dashboard .preview-1 .top { display: flex; gap: 8px; align-items: center; font-family: 'DM Mono', monospace; font-size: 9px; letter-spacing: .08em; opacity: .85; position: relative; z-index: 1; }
  .wil-dashboard .preview-1 .logo-dot { width: 14px; height: 14px; border-radius: 4px; background: rgba(255,255,255,.15); display: inline-block; }
  .wil-dashboard .preview-1 .hero { font-family: var(--font-sans); font-weight: 600; font-size: 26px; line-height: 1.1; margin-top: auto; position: relative; z-index: 1; letter-spacing: -0.01em; text-wrap: balance; }
  .wil-dashboard .preview-1 .sub { font-family: 'DM Sans'; font-size: 12px; color: var(--sage-text); margin-top: 6px; position: relative; z-index: 1; }
  .wil-dashboard .preview-1 .stamp { position: absolute; right: 14px; bottom: 12px; font-family: 'DM Mono', monospace; font-size: 8px; letter-spacing: .1em; opacity: .55; }

  .wil-dashboard .preview-2 { background: #FFFFFF; color: var(--text); }
  .wil-dashboard .preview-2 .top { display: flex; justify-content: space-between; font-family: 'DM Mono', monospace; font-size: 8.5px; color: var(--text-2); letter-spacing: .06em; }
  .wil-dashboard .preview-2 .ttl { font-family: var(--font-sans); font-weight: 600; font-size: 16px; margin-top: 6px; line-height: 1.1; }
  .wil-dashboard .preview-2 .interp { font-size: 10px; color: var(--text-2); margin-top: 2px; line-height: 1.3; }
  .wil-dashboard .preview-2 .mini-chart { flex: 1; display: flex; align-items: stretch; margin: 8px 0; }
  .wil-dashboard .preview-2 .mini-chart svg { width: 100%; height: 100%; }
  .wil-dashboard .preview-2 .ftr { display: flex; justify-content: space-between; font-family: 'DM Mono', monospace; font-size: 7.5px; color: var(--text-2); letter-spacing: .06em; padding-top: 6px; border-top: 1px solid var(--border); }

  .wil-dashboard .preview-3 { background: #FFFFFF; color: var(--text); padding: 0 !important; }
  .wil-dashboard .preview-3 .img {
    flex: 0 0 60%;
    background: var(--sand);
    display: grid; place-items: center; position: relative;
  }
  .wil-dashboard .preview-3 .info { padding: 12px 14px; display: flex; flex-direction: column; gap: 4px; }
  .wil-dashboard .preview-3 .name { font-family: var(--font-sans); font-weight: 600; font-size: 18px; line-height: 1; }
  .wil-dashboard .preview-3 .latin { font-size: 10px; color: var(--text-2); }
  .wil-dashboard .preview-3 .ctx { font-size: 11px; color: var(--text); margin-top: 2px; line-height: 1.3; }
  .wil-dashboard .preview-3 .meta { font-family: 'DM Mono', monospace; font-size: 8px; color: var(--text-2); letter-spacing: .06em; margin-top: auto; padding-top: 4px; }

  .wil-dashboard .share-buttons { display: flex; gap: 8px; }
  .wil-dashboard .btn {
    flex: 1; padding: 9px 12px; border-radius: 8px;
    border: 1px solid var(--border); background: var(--card);
    font-size: 12.5px; font-weight: 500; color: var(--text);
    display: inline-flex; align-items: center; justify-content: center; gap: 6px;
    transition: border-color .2s, background .2s;
  }
  .wil-dashboard .btn:hover { border-color: var(--sage); background: rgba(123,160,152,.06); }
  .wil-dashboard .btn.primary { background: var(--primary); color: #F4EFE3; border-color: var(--primary); }
  .wil-dashboard .btn.primary:hover { background: var(--forest); border-color: var(--forest); }

  .wil-dashboard .share-cta-strip {
    margin-top: 20px; padding: 16px 20px;
    border: 1px dashed var(--border); border-radius: 10px;
    display: flex; justify-content: space-between; align-items: center; gap: 16px;
    font-size: 13px; color: var(--text-2); flex-wrap: wrap;
  }
  .wil-dashboard .share-cta-strip a { color: var(--primary); font-weight: 500; }

  /* ───────────────────────────────────────── Section 7: Export */
  .wil-dashboard .export-section { display: grid; grid-template-columns: 460px 1fr; gap: 32px; align-items: flex-start; }
  .wil-dashboard .export-head { display: flex; flex-direction: column; gap: 6px; }
  .wil-dashboard .export-title { font-family: 'DM Sans'; font-weight: 600; font-size: 18px; color: var(--text); }

  .wil-dashboard .export-card { padding: 24px; display: flex; flex-direction: column; gap: 18px; }
  .wil-dashboard .pill-tabs { display: flex; gap: 6px; border-bottom: 1px solid var(--border); padding-bottom: 14px; }
  .wil-dashboard .pill-tab {
    padding: 6px 12px; border-radius: 6px; font-size: 12px; font-weight: 500;
    background: var(--bg); color: var(--text-2); border: 1px solid var(--border);
    font-family: 'DM Sans';
  }
  .wil-dashboard .pill-tab.active { background: rgba(123,160,152,.18); color: var(--primary); border-color: rgba(123,160,152,.4); }

  .wil-dashboard .export-list { display: flex; flex-direction: column; gap: 8px; }
  .wil-dashboard .export-list .lbl { font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .08em; color: var(--text-2); text-transform: uppercase; margin-bottom: 4px; }
  .wil-dashboard .export-list ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 6px; }
  .wil-dashboard .export-list li {
    font-size: 12.5px; color: var(--text); padding-left: 18px; position: relative; line-height: 1.45;
  }
  .wil-dashboard .export-list li::before {
    content: ""; position: absolute; left: 4px; top: 7px; width: 5px; height: 5px;
    border-radius: 1px; background: var(--sage);
  }

  .wil-dashboard .date-range {
    display: flex; align-items: center; gap: 10px;
    padding: 10px 14px; border: 1px solid var(--border); border-radius: 8px;
    font-size: 13px;
  }
  .wil-dashboard .date-range .lbl { font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .08em; color: var(--text-2); }
  .wil-dashboard .date-range .val { font-weight: 500; }

  .wil-dashboard .export-buttons { display: flex; gap: 10px; }
  .wil-dashboard .export-meta { font-family: 'DM Mono', monospace; font-size: 10.5px; color: var(--text-2); letter-spacing: .04em; }

  .wil-dashboard .export-aside {
    padding: 24px; border-radius: 10px;
    background: rgba(123,160,152,.06); border: 1px solid rgba(123,160,152,.2);
    color: var(--text-2); font-size: 13px; line-height: 1.55;
  }
  .wil-dashboard .export-aside .ttl { font-family: var(--font-sans); font-weight: 600; font-size: 18px; color: var(--text); margin-bottom: 8px; }

  /* ───────────────────────────────────────── Section 8: Detail table */
  .wil-dashboard .filter-bar {
    display: flex; gap: 10px; flex-wrap: wrap; align-items: center;
    padding: 12px; background: var(--card); border: 1px solid var(--border);
    border-radius: 10px; margin-bottom: 12px;
  }
  .wil-dashboard .search-input {
    flex: 1; min-width: 200px;
    display: flex; align-items: center; gap: 8px;
    padding: 7px 12px; border: 1px solid var(--border); border-radius: 7px;
    background: var(--bg); font-size: 13px; color: var(--text-2);
  }
  .wil-dashboard .search-input svg { color: var(--text-2); }
  .wil-dashboard .filter-pill {
    padding: 7px 11px; border: 1px solid var(--border); border-radius: 7px;
    font-size: 12.5px; background: var(--card); display: inline-flex; align-items: center; gap: 6px;
    color: var(--text);
  }
  .wil-dashboard .filter-pill .chev { width: 12px; height: 12px; opacity: .55; }
  .wil-dashboard .toggle-pills { display: flex; gap: 4px; padding: 3px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg); }
  .wil-dashboard .toggle-pills .tp {
    padding: 6px 10px; border-radius: 6px; font-size: 12px; color: var(--text-2); font-weight: 500;
  }
  .wil-dashboard .toggle-pills .tp.active { background: var(--card); color: var(--text); box-shadow: 0 1px 2px rgba(28,35,30,.06); }

  .wil-dashboard .data-table {
    background: var(--card); border: 1px solid var(--border); border-radius: 10px;
    overflow: hidden;
  }
  .wil-dashboard .data-table table { width: 100%; border-collapse: collapse; }
  .wil-dashboard .data-table th, .wil-dashboard .data-table td {
    text-align: left; padding: 12px 14px; border-bottom: 1px solid var(--border);
    font-size: 13px; vertical-align: middle;
  }
  .wil-dashboard .data-table th {
    font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .08em;
    text-transform: uppercase; color: var(--text-2); font-weight: 500;
    background: rgba(232,228,219,.4); border-bottom: 1px solid var(--border);
  }
  .wil-dashboard .data-table tr:last-child td { border-bottom: none; }
  .wil-dashboard .data-table tr:hover td { background: rgba(123,160,152,.04); }

  .wil-dashboard .sp-cell { display: flex; align-items: center; gap: 10px; }
  .wil-dashboard .sp-thumb {
    width: 32px; height: 32px; border-radius: 6px;
    background: rgba(123,160,152,.12); display: grid; place-items: center; flex-shrink: 0;
  }
  .wil-dashboard .sp-name { font-weight: 500; }
  .wil-dashboard .sp-latin { color: var(--text-2); font-size: 11.5px; }

  .wil-dashboard .det-cell { display: flex; align-items: center; gap: 8px; font-family: 'DM Mono', monospace; font-size: 12px; }
  .wil-dashboard .det-cell svg { flex-shrink: 0; }

  .wil-dashboard .trend-up { color: var(--primary); font-family: 'DM Mono', monospace; font-size: 12px; }
  .wil-dashboard .trend-flat { color: var(--text-2); font-family: 'DM Mono', monospace; font-size: 12px; }
  .wil-dashboard .trend-down { color: var(--roest-text); font-family: 'DM Mono', monospace; font-size: 12px; }
  .wil-dashboard .trend-new { color: var(--roest-text); font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .08em; padding: 2px 6px; background: rgba(184,92,58,.12); border-radius: 4px; }

  .wil-dashboard .date-mono { font-family: 'DM Mono', monospace; font-size: 11.5px; color: var(--text-2); }

  .wil-dashboard .sensor-pills { display: inline-flex; gap: 3px; }
  .wil-dashboard .sp-tag {
    font-family: 'DM Mono', monospace; font-size: 9.5px;
    padding: 2px 6px; border-radius: 3px;
    background: var(--bg); border: 1px solid var(--border); color: var(--text-2);
  }
  .wil-dashboard .sp-tag.on { background: rgba(123,160,152,.18); color: var(--primary); border-color: rgba(123,160,152,.4); }

  .wil-dashboard .status-badge {
    font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .06em;
    padding: 3px 7px; border-radius: 4px; text-transform: uppercase;
  }
  .wil-dashboard .status-reg { background: var(--bg); color: var(--text-2); border: 1px solid var(--border); }
  .wil-dashboard .status-ind { background: rgba(123,160,152,.18); color: var(--primary); }
  .wil-dashboard .status-new { background: rgba(184,92,58,.12); color: var(--roest-text); }
  .wil-dashboard .status-att { background: rgba(200,146,74,.18); color: var(--amber-text); }

  .wil-dashboard .row-actions { display: flex; gap: 6px; }
  .wil-dashboard .row-actions button { width: 28px; height: 28px; border-radius: 6px; color: var(--text-2); display: grid; place-items: center; }
  .wil-dashboard .row-actions button:hover { background: var(--bg); color: var(--primary); }

  .wil-dashboard .table-foot {
    display: flex; align-items: center; justify-content: space-between; padding: 14px 16px;
    border-top: 1px solid var(--border); background: rgba(250,250,247,.55);
    font-family: 'DM Mono', monospace; font-size: 11px; color: var(--text-2); letter-spacing: .04em;
  }
  .wil-dashboard .table-foot .pager { display: flex; align-items: center; gap: 12px; }
  .wil-dashboard .table-foot button { padding: 5px 10px; border: 1px solid var(--border); border-radius: 6px; font-family: 'DM Sans'; font-size: 12px; color: var(--text); }
  .wil-dashboard .table-foot button:hover { border-color: var(--sage); }
  .wil-dashboard .table-foot a { color: var(--primary); font-family: 'DM Sans'; font-weight: 500; font-size: 12.5px; }

  .wil-dashboard .table-context { margin-top: 10px; font-family: 'DM Mono', monospace; font-size: 11px; color: var(--text-2); letter-spacing: .04em; }

  /* ───────────────────────────────────────── Page footer */
  .wil-dashboard .page-footer {
    margin-top: 48px;
    background: var(--forest);
    color: #C8C2B0; padding: 48px 32px 24px; position: relative; overflow: hidden;
  }
  .wil-dashboard .page-footer::before {
    content: ""; position: absolute; left: -80px; top: -80px; width: 320px; height: 320px;
    background: transparent;
    pointer-events: none;
  }
  .wil-dashboard .footer-grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 32px; max-width: 1376px; margin: 0 auto; position: relative; }
  .wil-dashboard .footer-brand { display: flex; flex-direction: column; gap: 12px; }
  .wil-dashboard .footer-brand .row { display: flex; align-items: center; gap: 10px; }
  .wil-dashboard .footer-brand .nm { font-family: 'DM Sans'; font-weight: 600; color: #F4EFE3; font-size: 15px; }
  .wil-dashboard .footer-brand .tag { font-family: var(--font-sans); font-weight: 600; font-size: 18px; color: var(--sage-text); max-width: 320px; line-height: 1.3; }
  .wil-dashboard .footer-col-ttl { font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .1em; text-transform: uppercase; color: var(--sage-text); margin-bottom: 12px; }
  .wil-dashboard .footer-links { display: flex; flex-direction: column; gap: 8px; }
  .wil-dashboard .footer-links a { color: #C8C2B0; font-size: 13px; }
  .wil-dashboard .footer-links a:hover { color: #F4EFE3; }
  .wil-dashboard .footer-meta { display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
  .wil-dashboard .footer-meta .k { color: #8a9489; font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .06em; text-transform: uppercase; }
  .wil-dashboard .footer-bottom {
    margin-top: 32px; padding-top: 18px; border-top: 1px solid rgba(196,191,176,.15);
    display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
    font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .04em; color: #8a9489;
    max-width: 1376px; margin-left: auto; margin-right: auto; position: relative;
  }
  .wil-dashboard .status-ok { color: #7BA098; }
  .wil-dashboard .status-ok::before { content: "● "; }

  /* Footer placeholder */
  .wil-dashboard .next {
    margin: 32px; padding: 20px 24px; border: 1px dashed var(--border);
    border-radius: var(--radius); text-align: center;
    color: var(--text-2); font-family: 'DM Mono', monospace; font-size: 12px;
    letter-spacing: .04em;
  }

  /* ───────────────────────────────────────── Count-up wrapper */
  .wil-dashboard .countup { display: inline-block; }

  /* small svg icons */
  .wil-dashboard .ico { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
  .wil-dashboard .ico-sm { width: 14px; height: 14px; }
  .wil-dashboard .ico-lg { width: 22px; height: 22px; }

  /* ─────────────────────────────────────────────────────────────────────
     TYPOGRAPHY OVERRIDE — neutral, system-driven sans-serif throughout.
     Hierarchy via size · weight · spacing only. No serif, no italics,
     no expressive type. "Default but refined."
     ───────────────────────────────────────────────────────────────────── */


  /* Force the sans stack everywhere */
  html, body, .wil-dashboard .serif, .wil-dashboard .section-title, .wil-dashboard .feed-title, .wil-dashboard .week-name, .wil-dashboard .why-title, .wil-dashboard .hb-title, .wil-dashboard .bench-claim, .wil-dashboard .act-title, .wil-dashboard .sim-title, .wil-dashboard .insight-quote, .wil-dashboard .insight-sm .q, .wil-dashboard .action-intro, .wil-dashboard .score-num .big, .wil-dashboard .score-num .denom, .wil-dashboard .score-label, .wil-dashboard .stat-num, .wil-dashboard .why-key-num, .wil-dashboard .mini-stat .num, .wil-dashboard .impact-stat .num, .wil-dashboard .impact-mini .num, .wil-dashboard .sim-stat .num, .wil-dashboard .ring-center, .wil-dashboard .preview-3 .name, .wil-dashboard .export-aside .ttl, .wil-dashboard .footer-brand .tag, .wil-dashboard .sp-latin {
    font-family: var(--font-sans) !important;
    font-style: normal !important;
  }

  /* Mono only retained for tabular / metadata micro-labels */
  .wil-dashboard .mono, .wil-dashboard .live-label, .wil-dashboard .eyebrow, .wil-dashboard .card-eyebrow, .wil-dashboard .feed-time, .wil-dashboard .badge-new, .wil-dashboard .sensor-tag, .wil-dashboard .badge-roest, .wil-dashboard .top-pct, .wil-dashboard .ind-state, .wil-dashboard .insight-eyebrow, .wil-dashboard .interv-flag .ttl, .wil-dashboard .mini-stat .lbl, .wil-dashboard .hours-axis, .wil-dashboard .recent-meta, .wil-dashboard .decline-pct, .wil-dashboard .dist-axis, .wil-dashboard .dist-marker .flag, .wil-dashboard .dist-median, .wil-dashboard .rank-tag, .wil-dashboard .insight-sm .eb, .wil-dashboard .act-badge, .wil-dashboard .impact-stat .lbl, .wil-dashboard .impact-mini .lbl, .wil-dashboard .effort-tag, .wil-dashboard .month-axis, .wil-dashboard .sim-eyebrow, .wil-dashboard .sim-stat .lbl, .wil-dashboard .footer-col-ttl, .wil-dashboard .det-cell {
    font-family: var(--font-mono) !important;
  }

  /* Body baseline */
  body { font-size: 14px; line-height: 1.55; letter-spacing: -0.005em; }

  /* Calmer, system-driven hierarchy */
  .wil-dashboard .section-title {
    font-size: 26px; font-weight: 600;
    letter-spacing: -0.018em; line-height: 1.2;
  }
  .wil-dashboard .section-sub { font-size: 14px; color: var(--text-2); line-height: 1.55; }

  .wil-dashboard .eyebrow, .wil-dashboard .card-eyebrow, .wil-dashboard .insight-eyebrow, .wil-dashboard .insight-sm .eb, .wil-dashboard .sim-eyebrow, .wil-dashboard .footer-col-ttl, .wil-dashboard .mini-stat .lbl, .wil-dashboard .impact-stat .lbl, .wil-dashboard .impact-mini .lbl, .wil-dashboard .sim-stat .lbl, .wil-dashboard .hours-axis, .wil-dashboard .recent-meta, .wil-dashboard .month-axis {
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.08em;
  }

  /* Hero score — refined, not editorial */
  .wil-dashboard .score-num .big {
    font-size: 116px; font-weight: 600;
    letter-spacing: -0.04em; line-height: 0.9;
  }
  .wil-dashboard .score-num .denom {
    font-size: 28px; font-weight: 400;
    letter-spacing: -0.02em;
  }
  .wil-dashboard .score-label {
    font-size: 15px; font-weight: 500;
    letter-spacing: 0; line-height: 1.4;
  }
  .wil-dashboard .ring-center { font-size: 12px; font-weight: 500; letter-spacing: 0.04em; }
  .wil-dashboard .ring-center .pct { font-size: 22px; font-weight: 600; letter-spacing: -0.02em; }

  /* Numeric stats — tighter, weight-based emphasis */
  .wil-dashboard .stat-num, .wil-dashboard .why-key-num, .wil-dashboard .mini-stat .num, .wil-dashboard .impact-stat .num, .wil-dashboard .impact-mini .num, .wil-dashboard .sim-stat .num {
    font-weight: 600;
    letter-spacing: -0.02em;
  }
  .wil-dashboard .stat-num { font-size: 20px; }
  .wil-dashboard .why-key-num { font-size: 26px; }
  .wil-dashboard .mini-stat .num { font-size: 24px; }
  .wil-dashboard .impact-stat .num { font-size: 22px; }
  .wil-dashboard .impact-mini .num { font-size: 20px; }
  .wil-dashboard .sim-stat .num { font-size: 26px; }

  /* Card / feed / week titles — calm and precise */
  .wil-dashboard .feed-title, .wil-dashboard .week-name, .wil-dashboard .why-title, .wil-dashboard .hb-title, .wil-dashboard .preview-3 .name, .wil-dashboard .export-aside .ttl, .wil-dashboard .footer-brand .tag {
    font-weight: 600;
    letter-spacing: -0.012em;
    line-height: 1.25;
  }
  .wil-dashboard .feed-title { font-size: 18px; }
  .wil-dashboard .week-name { font-size: 19px; }
  .wil-dashboard .why-title { font-size: 19px; }
  .wil-dashboard .hb-title { font-size: 19px; }
  .wil-dashboard .preview-3 .name { font-size: 16px; }
  .wil-dashboard .export-aside .ttl { font-size: 16px; }
  .wil-dashboard .footer-brand .tag { font-size: 15px; line-height: 1.4; }

  /* Headline-feeling claims — same family, restrained scale */
  .wil-dashboard .bench-claim {
    font-size: 24px; font-weight: 500;
    letter-spacing: -0.018em; line-height: 1.3;
  }
  .wil-dashboard .bench-claim strong { font-weight: 600; }

  .wil-dashboard .act-title {
    font-size: 24px; font-weight: 600;
    letter-spacing: -0.02em; line-height: 1.2;
  }
  .wil-dashboard .act-title.sm { font-size: 18px; letter-spacing: -0.012em; }
  .wil-dashboard .sim-title {
    font-size: 22px; font-weight: 600;
    letter-spacing: -0.018em;
  }

  /* Insight quotes — quiet emphasis through weight, not italics */
  .wil-dashboard .insight-quote {
    font-size: 22px; font-weight: 500;
    letter-spacing: -0.014em; line-height: 1.4;
  }
  .wil-dashboard .insight-sm .q {
    font-size: 16px; font-weight: 500;
    letter-spacing: -0.008em; line-height: 1.45;
  }
  .wil-dashboard .action-intro {
    font-size: 17px; font-weight: 500;
    letter-spacing: -0.01em; line-height: 1.5;
  }

  /* Latin names — keep secondary tone via weight + color, not italics */
  .wil-dashboard .sp-latin { font-weight: 400; }
  .wil-dashboard .insight-italic { font-weight: 400; }

  /* Brand mark stays neutral too */
  .wil-dashboard .brand-name { font-weight: 600; letter-spacing: -0.012em; }

  /* Buttons / pills retained but tightened */
  .wil-dashboard .pill { font-weight: 500; letter-spacing: 0; }

  /* ─────────────────────────────────────────────────────────────────────
     RESPONSIVE — collapse the fixed multi-column grids on tablet/phone.
     The Bootstrap rows in sections 3–4 already reflow via col-* classes;
     these rules cover the custom CSS grids (hero, score, why, etc.) and
     scale down the oversized hero number so nothing overflows on mobile.
     Same visual language — only the layout adapts.
     ───────────────────────────────────────────────────────────────────── */

  /* Never let a wide child force a horizontal scroll on small screens */
  .wil-dashboard { overflow-x: hidden; }
  .wil-dashboard .card,
  .wil-dashboard .insight,
  .wil-dashboard .insight-sm,
  .wil-dashboard .sim-wrap { min-width: 0; }

  @media (max-width: 900px) {
    /* Section-2 component cards drop from 3 → 2 columns before going to 1 */
    .wil-dashboard .why-grid { grid-template-columns: 1fr 1fr; }
  }

  @media (max-width: 768px) {
    .wil-dashboard { font-size: 14px; }

    /* Tighter section rhythm */
    .wil-dashboard .section { padding: 22px 16px; }
    .wil-dashboard .section + .section { padding-top: 4px; }
    .wil-dashboard .section-head { margin-bottom: 16px; }
    .wil-dashboard .section-title { font-size: 22px; }

    /* Cards lose some breathing room so content keeps its width */
    .wil-dashboard .card { padding: 18px; }
    .wil-dashboard .insight { padding: 24px 22px; }
    .wil-dashboard .sim-wrap { padding: 22px; }

    /* Live bar: stop forcing a 3-column grid — wrap instead */
    .wil-dashboard .live-bar {
      display: flex; flex-wrap: wrap; gap: 6px 16px;
      justify-content: space-between; padding: 10px 16px;
    }
    .wil-dashboard .live-right { text-align: left; }

    /* Hero: stack the score card above the live/feed column */
    .wil-dashboard .hero-grid { grid-template-columns: 1fr; gap: 16px; }
    .wil-dashboard .score-card { padding: 22px; min-height: 0; }
    .wil-dashboard .score-head { margin-bottom: 18px; }

    /* Score body: ring on top, text below, both centred */
    .wil-dashboard .score-body { grid-template-columns: 1fr; gap: 18px; text-align: center; }
    .wil-dashboard .score-gauge { margin: 0 auto; }
    .wil-dashboard .score-num { justify-content: center; }
    .wil-dashboard .score-num .big { font-size: 84px; }
    .wil-dashboard .score-explain { margin: 16px auto 0; }

    /* Section 2 + every other custom multi-column grid → single column */
    .wil-dashboard .why-grid,
    .wil-dashboard .heartbeat-card,
    .wil-dashboard .ev-grid,
    .wil-dashboard .bench-grid,
    .wil-dashboard .actions-grid,
    .wil-dashboard .sim-grid,
    .wil-dashboard .share-grid,
    .wil-dashboard .export-section,
    .wil-dashboard .impact-block,
    .wil-dashboard .footer-grid {
      grid-template-columns: 1fr;
    }

    /* Score stats: 4 across gets cramped once the card is full-width, so drop
       to a tidy 2×2 with the divider only between the two columns. */
    .wil-dashboard .score-stats { grid-template-columns: 1fr 1fr; row-gap: 16px; }
    .wil-dashboard .stat { padding: 0 16px; }
    .wil-dashboard .stat:nth-child(2n) { border-right: none; padding-right: 0; }
    .wil-dashboard .stat:nth-child(2n+1) { padding-left: 0; }

    /* Trend chart a touch shorter so it isn't dominant on a phone */
    .wil-dashboard #dashTrendChart { max-height: 240px; }
  }

  @media (max-width: 480px) {
    .wil-dashboard .section-title { font-size: 20px; }
    .wil-dashboard .score-num .big { font-size: 64px; }
    .wil-dashboard .score-num .denom { font-size: 22px; }

    /* Stack the three hero stats — three columns get cramped under ~360px */
    .wil-dashboard .score-stats { grid-template-columns: 1fr; margin-top: 20px; padding-top: 16px; }
    .wil-dashboard .stat {
      padding: 12px 0; border-right: none;
      border-bottom: 1px solid var(--border); text-align: center;
    }
    .wil-dashboard .stat:first-child { padding-top: 0; }
    .wil-dashboard .stat:last-child { border-bottom: none; padding-bottom: 0; }
    .wil-dashboard .stat-num { justify-content: center; }
  }

  /* ─────────────────────────────────────────────────────────────────────
     ADDED INFOGRAPHICS — radar, score-trend area, momentum gauge,
     balance/dominance gauges, top-species bars, comparison gauges.
     All reuse the existing token palette so they sit inside the same
     visual language as the rest of the dashboard.
     ───────────────────────────────────────────────────────────────────── */

  /* Canvas wrappers give Chart.js a fixed box to fill (it is responsive
     with maintainAspectRatio:false). */
  .wil-dashboard .chart-box { position: relative; width: 100%; }
  .wil-dashboard .chart-box.radar { height: 300px; }
  .wil-dashboard .chart-box.area  { height: 240px; }
  .wil-dashboard .chart-box.gauge { height: 190px; }
  .wil-dashboard .chart-box.donut { height: 220px; }

  /* Momentum gauge — value overlaid in the doughnut hole. The value sits on a
     single baseline-aligned line so the whole line (not a stacked block)
     centres inside the ring. */
  .wil-dashboard .gauge-wrap { position: relative; }
  .wil-dashboard .gauge-center {
    position: absolute; inset: 0; display: grid; place-items: center;
    pointer-events: none;
  }
  .wil-dashboard .gauge-center .g-line { display: flex; align-items: baseline; gap: 3px; }
  .wil-dashboard .gauge-center .g-num {
    font-family: var(--font-sans); font-size: 38px; font-weight: 600;
    letter-spacing: -0.03em; color: var(--primary); line-height: 1;
  }
  .wil-dashboard .gauge-center .g-unit {
    font-family: var(--font-mono); font-size: 13px; color: var(--text-2);
  }

  /* Balance & dominance horizontal gauges */
  .wil-dashboard .gauge-list { display: flex; flex-direction: column; gap: 18px; margin-top: 4px; }
  .wil-dashboard .metric-gauge .mg-head {
    display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 7px;
  }
  .wil-dashboard .metric-gauge .mg-label { font-size: 13px; font-weight: 500; color: var(--text); }
  .wil-dashboard .metric-gauge .mg-val {
    font-family: var(--font-mono); font-size: 12px; color: var(--text-2);
  }
  .wil-dashboard .metric-gauge .mg-track {
    height: 8px; border-radius: 4px; background: var(--border); overflow: hidden;
  }
  .wil-dashboard .metric-gauge .mg-fill {
    height: 100%; border-radius: 4px; width: 0;
    background: var(--primary);
    transition: width 1.1s cubic-bezier(.22,.61,.36,1);
  }
  .wil-dashboard .metric-gauge .mg-fill.amber { background: transparent; }
  .wil-dashboard .metric-gauge .mg-note { font-size: 11.5px; color: var(--text-2); margin-top: 5px; line-height: 1.4; }

  /* Top-species proportional bars */
  .wil-dashboard .tsp-item { padding: 8px 0; border-bottom: 1px solid var(--border); }
  .wil-dashboard .tsp-item:last-child { border-bottom: none; }
  .wil-dashboard .tsp-top {
    display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 6px;
  }
  .wil-dashboard .tsp-name { font-size: 13px; font-weight: 500; }
  .wil-dashboard .tsp-count { font-family: var(--font-mono); font-size: 11.5px; color: var(--text-2); }
  .wil-dashboard .tsp-track { height: 6px; border-radius: 3px; background: var(--border); overflow: hidden; }
  .wil-dashboard .tsp-fill {
    height: 100%; border-radius: 3px;
    background: var(--primary);
  }

  /* Comparison "glider" gauges (section 04) — a numbered horizontal scale with
     a downward "your result" marker, mirroring a slider/benchmark chart. */
  .wil-dashboard .glider { margin-top: 40px; position: relative; }

  .wil-dashboard .glider-track {
    position: relative; height: 14px; border-radius: 7px;
  }
  /* Left card: low→high biodiversity gradient (benchmark feel). */
  .wil-dashboard .glider--benchmark .glider-track {
    background: transparent;
  }
  /* Right card: neutral track, the highlighted band carries the meaning. */
  .wil-dashboard .glider--range .glider-track {
    background: rgba(123, 160, 152, .16);
  }
  .wil-dashboard .glider-band {
    position: absolute; top: 0; height: 100%; border-radius: 7px;
    background: rgba(45, 74, 62, .32);
  }
  .wil-dashboard .glider--range .glider-band { background: rgba(45, 74, 62, .28); }
  .wil-dashboard .glider-median {
    position: absolute; top: -3px; width: 2px; height: 20px;
    background: var(--text); transform: translateX(-50%); opacity: .55;
  }

  /* Downward marker + label sitting above the track. */
  .wil-dashboard .glider-marker {
    position: absolute; top: -30px; transform: translateX(-50%);
    display: flex; flex-direction: column; align-items: center; z-index: 3;
  }
  .wil-dashboard .glider-marker .gm-label {
    font-family: var(--font-mono); font-size: 10px; letter-spacing: .02em;
    color: var(--text); white-space: nowrap;
    background: var(--card); border: 1px solid var(--border);
    padding: 2px 6px; border-radius: 5px; box-shadow: var(--shadow);
  }
  .wil-dashboard .glider-marker .gm-arrow {
    width: 0; height: 0; margin-top: 3px;
    border-left: 5px solid transparent; border-right: 5px solid transparent;
    border-top: 7px solid var(--primary);
  }
  .wil-dashboard .glider-marker.behind .gm-arrow { border-top-color: var(--amber); }

  .wil-dashboard .glider-axis { position: relative; height: 14px; margin-top: 8px; }
  .wil-dashboard .glider-axis .gx {
    position: absolute; transform: translateX(-50%);
    font-family: var(--font-mono); font-size: 10px; color: var(--text-2);
  }
  .wil-dashboard .glider-caption {
    text-align: center; margin-top: 6px;
    font-family: var(--font-mono); font-size: 10px; letter-spacing: .08em;
    text-transform: uppercase; color: var(--text-2);
  }
  .wil-dashboard .glider-note { font-size: 12px; color: var(--text-2); margin-top: 14px; line-height: 1.45; }

  .wil-dashboard .cmp-foot { font-size: 12px; color: var(--text-2); margin-top: 10px; line-height: 1.45; }
  .wil-dashboard .cmp-foot strong { color: var(--primary); }

  /* Recently-appeared chips (section 03) */
  .wil-dashboard .chip-row { display: flex; flex-wrap: wrap; gap: 8px; }
  .wil-dashboard .appeared-chip {
    display: inline-flex; align-items: center; gap: 8px;
    padding: 6px 6px 6px 12px; border-radius: 999px;
    background: rgba(123, 160, 152, .1); border: 1px solid rgba(123, 160, 152, .28);
    font-size: 13px; font-weight: 500; color: var(--primary);
  }
  .wil-dashboard .appeared-chip .ac-date {
    font-family: var(--font-mono); font-size: 10.5px; color: var(--text-2);
    background: var(--card); border-radius: 999px; padding: 2px 8px;
  }

  /* Share-the-story card (section 06) */
  .wil-dashboard .story-card {
    display: grid; grid-template-columns: 300px 1fr; gap: 0; overflow: hidden; padding: 0;
  }
  .wil-dashboard .story-media { position: relative; min-height: 280px; background: var(--forest); }
  .wil-dashboard .story-media img { width: 100%; height: 100%; object-fit: cover; display: block; position: absolute; inset: 0; }
  .wil-dashboard .story-media-fallback {
    position: absolute; inset: 0; display: grid; place-items: center;
    background: var(--forest);
    color: rgba(244,239,227,.5); font-size: 48px;
  }
  .wil-dashboard .story-media-cap {
    position: absolute; left: 0; right: 0; bottom: 0; z-index: 1;
    display: flex; flex-direction: column; gap: 2px;
    padding: 40px 18px 16px;
    background: transparent;
    color: #F4EFE3;
  }
  .wil-dashboard .story-media-cap .smc-eyebrow {
    font-family: var(--font-mono); font-size: 10px; letter-spacing: .1em;
    text-transform: uppercase; color: var(--sage-text);
  }
  .wil-dashboard .story-media-cap .smc-name { font-size: 20px; font-weight: 600; letter-spacing: -0.01em; }
  .wil-dashboard .story-media-cap .smc-latin { font-size: 12px; color: rgba(244,239,227,.7); }

  .wil-dashboard .story-body { padding: 28px; display: flex; flex-direction: column; gap: 14px; }
  .wil-dashboard .story-text { font-size: 15px; line-height: 1.6; color: var(--text); max-width: 62ch; }
  .wil-dashboard .story-text p { margin: 0 0 10px; }
  .wil-dashboard .story-text p:last-child { margin-bottom: 0; }
  .wil-dashboard .story-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: auto; padding-top: 6px; }
  .wil-dashboard .story-share-btn {
    display: inline-flex; align-items: center; gap: 8px;
    padding: 10px 18px; border-radius: 999px;
    background: var(--primary); color: #F4EFE3; font-weight: 600; font-size: 14px;
    border: 1px solid var(--primary); transition: background .2s, transform .1s;
  }
  .wil-dashboard .story-share-btn:hover { background: var(--forest); }
  .wil-dashboard .story-share-btn:active { transform: translateY(1px); }
  .wil-dashboard .story-share-btn.copied { background: var(--sage); border-color: var(--sage); }

  @media (max-width: 768px) {
    .wil-dashboard .story-card { grid-template-columns: 1fr; }
    .wil-dashboard .story-media { min-height: 200px; }
  }

  /* ─────────────────────────────────────────────────────────────────────────
     Partner live dashboard — a big-screen kiosk for entrance halls and ABRI
     billboards. It must read across a room and grab attention at a glance, so
     the design leads with a single live hero — the bird that was just heard —
     and keeps everything else quiet and disciplined. Locked to one viewport
     (100vh, no scroll) in landscape; a scrolling column on a phone.

     Written for the browser it actually runs on. The screen this was made for
     is a Samsung QM43R-T (Tizen 4, SSSP6) whose browser is roughly Chromium 56:
     no CSS grid, no flexbox `gap`, no `clamp()`, no `aspect-ratio`, no `inset`,
     no `color-mix()`, no `transform-box`, no `:has()`. There used to be a
     second stylesheet layer (`.pl-legacy`) restating every size in pixels for
     exactly that screen, and it drifted out of step with the first. So: one
     layer, flexbox with margins, and every size in vh/vw — which is also what
     makes the page scale to a 1080p signage panel, a laptop and a phone from
     the same numbers. At 1920×1080, 1vh = 10.8px.

     Reuses the WIL-dashboard tokens/cards above. */
  body.partner-live {
    margin: 0; height: 100vh; overflow: hidden;
    display: flex; flex-direction: column;
    font-family: 'DM Sans', system-ui, sans-serif;
    background: var(--bg);
    --pin: var(--primary);
    /* Province fills. A partner house style replaces these with its own colour
       faded into the card (see branding.py); without one the map keeps the
       Wilder greens. */
    --map-land: #eff2ed;
    --map-land-sensor: #dde7df;
  }

  /* ── Header ──────────────────────────────────────────────────────────────
     Three zones: maker/partner branding (left), the place as the headline
     (centre), live state + clock (right). A flex row with two equal 1fr sides
     keeps the middle truly centred whatever the sides weigh — what a grid used
     to do, without the grid. */
  .partner-live .pl-header {
    display: flex; align-items: center; flex: 0 0 auto;
    padding: 1.2vh 1.8vw .6vh;
  }
  .partner-live .pl-brand { flex: 1 1 0; min-width: 0; display: flex; align-items: center; }
  .partner-live .pl-powered { display: inline-flex; flex-direction: column; text-decoration: none; color: inherit; }
  .partner-live .pl-powered:hover .pl-wil-logo { opacity: .8; }
  .partner-live .pl-powered-label {
    font-family: 'DM Mono', monospace; font-size: 1vh; letter-spacing: .14em;
    text-transform: uppercase; color: var(--text-2);
  }
  .partner-live .pl-wil-logo { height: 2.3vh; width: auto; display: block; margin-top: .3vh; }
  .partner-live .pl-partner-logo { height: 2.8vh; width: auto; display: block; margin-left: 1.4vw; }
  .partner-live .pl-partner-block { flex: 0 0 auto; padding: 0 1.2vw; text-align: center; }
  .partner-live .pl-partner-eyebrow {
    font-family: 'DM Mono', monospace; font-size: 1.1vh; letter-spacing: .18em;
    text-transform: uppercase; color: var(--text-2); margin-bottom: .2vh;
  }
  /* The place name, the largest type on the page: the brand colour when there
     is one (darkened until it reads), the house near-black otherwise. */
  .partner-live .pl-partner {
    font-family: var(--font-sans); font-weight: 600; font-size: 3.2vh; line-height: 1.05;
    color: var(--primary-text, var(--text)); white-space: nowrap;
  }
  .partner-live .pl-header-right { flex: 1 1 0; min-width: 0; display: flex; align-items: center; justify-content: flex-end; }
  .partner-live .pl-header-right > * + * { margin-left: 1vw; }
  .partner-live .pl-header-live {
    /* The one thing on this row allowed to shrink; the ellipsis lives on the
       ago-span below, which is the part that actually overflows. */
    flex: 0 1 auto; min-width: 0; overflow: hidden;
    display: flex; align-items: center; white-space: nowrap; gap: .3vw;
    font-family: 'DM Mono', monospace; font-size: 1.25vh; letter-spacing: .12em;
    color: var(--primary-text, var(--primary));
  }
  /* A quiet or silent scope drops the green: the badge is a status, not a
     decoration, and colour is never the only thing that says so (the word
     changes too). */
  .partner-live .pl-header-ago { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  .partner-live .pl-header-live.is-delayed,
  .partner-live .pl-header-live.is-offline,
  .partner-live .pl-header-live.is-never { color: var(--text-2); }
  .partner-live .pl-header-live > * + * { margin-left: .4vw; }
  .partner-live .pl-header-ago { color: var(--text-2); letter-spacing: 0; text-transform: none; font-weight: 400; }
  .partner-live .pl-header-ago [data-live] { color: var(--text); }
  .partner-live .pl-clock { font-family: 'DM Mono', monospace; font-size: 2.6vh; color: var(--text); }
  .partner-live .pl-fs-btn {
    display: inline-flex; align-items: center; justify-content: center;
    width: 3.4vh; height: 3.4vh; padding: 0;
    border-radius: .9vh; border: 1px solid var(--border); background: var(--card);
    color: var(--text-2); cursor: pointer; transition: border-color .2s, color .2s;
  }
  .partner-live .pl-fs-btn .wil-ic { width: 1.4vh; height: 1.4vh; }
  .partner-live .pl-fs-btn:hover { border-color: var(--sage); color: var(--primary-text, var(--primary)); }
  /* Language: NL | EN, one segmented pill. Small on purpose -- it is a way
     out for a visitor who cannot read the page, not a control the screen is
     about -- and it keeps its place on a phone, where the kiosk buttons are
     hidden. */
  .partner-live .pl-lang {
    /* Never squeezed: the status text beside it is variable-length (a sensor
       that has been quiet says more than one that has not), and the toggle was
       losing its second button to it. Controls hold their size; prose gives. */
    flex: 0 0 auto;
    display: inline-flex; align-items: stretch; overflow: hidden;
    /* margin-block, not margin: the header spaces its children with a
       margin-left rule, and a shorthand here would zero that out. */
    margin-block: 0;
    border: 1px solid var(--border); border-radius: .9vh; background: var(--card);
  }
  .partner-live .pl-lang-btn {
    padding: .5vh .7vw; border: 0; background: none; cursor: pointer; line-height: 1;
    font-family: 'DM Mono', monospace; font-size: 1.1vh; letter-spacing: .1em;
    color: var(--text-2); transition: background .2s, color .2s;
  }
  .partner-live .pl-lang-btn + .pl-lang-btn { border-left: 1px solid var(--border); }
  .partner-live .pl-lang-btn:hover { color: var(--primary-text, var(--primary)); }
  .partner-live .pl-lang-btn.is-on { background: var(--primary); color: var(--on-primary, #fff); }

  /* The sound button shares the fullscreen button's shape; it only appears
     when a browser refused to play a bird by itself. */
  .partner-live .pl-sound-btn[aria-pressed="false"] { color: var(--roest-text); border-color: rgba(184,92,58,.45); }
  /* DEMO badge — only shown in ?demo=1 mode so simulated data is never mistaken
     for real detections on a public screen. */
  .partner-live .pl-demo-badge {
    font-family: 'DM Mono', monospace; font-size: 1.1vh; letter-spacing: .1em; text-transform: uppercase;
    padding: .4vh .6vw; border-radius: 999px; background: var(--amber); color: #fff; font-weight: 500;
  }

  /* ── Hero ────────────────────────────────────────────────────────────────
     The thesis: the bird just heard, large, next to the ones before it. */
  .partner-live .pl-hero { flex: 0 0 auto; display: flex; padding: .8vh 1.8vw 1.2vh; }
  .partner-live .pl-hero-feature {
    flex: 0 0 24vw; min-width: 0; display: flex; align-items: center;
    background: var(--deep); border: 1px solid var(--deep-border); color: var(--on-deep);
    border-radius: 1.1vh; padding: 1.4vh 1.2vw;
  }
  .partner-live .pl-hero-photo {
    width: 14vh; height: 14vh; border-radius: 1vh; flex: 0 0 auto;
    /* contain, not cover: a species photo is a cut-out on white, and cropping
       one to a square cuts the bird's tail off. */
    object-fit: contain; object-position: center;
    background: #fff; /* uniform white ground: transparent-bg species match the white-bg ones */
    box-shadow: 0 .5vh 1.8vh rgba(0,0,0,.22);
  }
  /* The photo box is a uniform white ground, so the placeholder is a muted
     forest rather than the cream that suited the old dark box (1.06:1 on
     white — the feather was invisible). */
  .partner-live .pl-hero-photo.is-empty {
    display: flex; align-items: center; justify-content: center;
    color: rgba(45,74,62,.3);
  }
  .partner-live .pl-hero-photo.is-empty .wil-ic { width: 5vh; height: 5vh; }
  /* min-width:0 lets the text column shrink so long names wrap instead of
     overflowing the card and being clipped. */
  .partner-live .pl-hero-body { min-width: 0; flex: 1 1 auto; margin-left: 1.1vw; }
  .partner-live .pl-hero-eyebrow {
    display: flex; align-items: center;
    font-family: 'DM Mono', monospace; font-size: 1.15vh; letter-spacing: .12em;
    text-transform: uppercase; color: var(--deep-label);
  }
  .partner-live .pl-hero-eyebrow > * + * { margin-left: .4vw; }
  /* Clamp to two lines so a long name can't grow the hero card and jog the
     layout as birds cycle through. */
  .partner-live .pl-hero-name {
    font-family: var(--font-sans); font-weight: 600; font-size: 3vh; line-height: 1.06;
    color: var(--on-deep-strong); margin-top: .5vh;
    overflow-wrap: break-word; hyphens: auto;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  }
  .partner-live .pl-hero-latin { color: var(--on-deep-mute); font-size: 1.4vh; margin-top: .2vh; }
  .partner-live .pl-hero-meta {
    font-family: 'DM Mono', monospace; font-size: 1.3vh; color: var(--on-deep-soft); margin-top: 1vh;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  }

  /* Recent strip — the birds heard just before, as a photo row. */
  .partner-live .pl-strip-wrap { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; margin-left: 1.2vw; }
  .partner-live .pl-strip-title {
    font-family: 'DM Mono', monospace; font-size: 1.15vh; letter-spacing: .1em;
    text-transform: uppercase; color: var(--text-2); margin-bottom: .7vh;
  }
  .partner-live .pl-strip { display: flex; overflow: hidden; flex: 1 1 auto; }
  /* A fixed 1/7.5 width (not flex:1) so the cards never resize when the list
     has fewer than eight items — otherwise fewer chips would each grow wider
     and the photos would balloon, making the whole gallery jump. The half card
     at the end is deliberate: a conveyor-belt hint that the strip keeps
     shifting, like the home-page gallery. */
  .partner-live .pl-chip {
    flex: 0 0 calc((100% - 7 * .7vw) / 7.5); min-width: 0;
    display: flex; flex-direction: column; margin-right: .7vw;
  }
  .partner-live .pl-chip-photo {
    width: 100%; height: 12.6vh; border-radius: 1vh; display: block;
    object-fit: contain; object-position: center; background: #fff; border: 1px solid var(--border);
  }
  .partner-live .pl-chip-photo.is-empty { display: flex; align-items: center; justify-content: center; color: var(--text-2); }
  .partner-live .pl-chip-name {
    font-weight: 600; font-size: 1.35vh; color: var(--text); margin-top: .5vh;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .partner-live .pl-chip-loc {
    font-size: 1.15vh; color: var(--text-2);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .partner-live .pl-chip-time { font-family: 'DM Mono', monospace; font-size: 1.1vh; color: var(--text-2); margin-top: .1vh; }

  /* Arrival animation — a new bird slides in at the front, like the home page. */
  @keyframes pl-bump-in {
    0%   { opacity: 0; transform: translateX(-24px) scale(0.96); }
    60%  { opacity: 1; transform: translateX(3px) scale(1.02); }
    100% { opacity: 1; transform: translateX(0) scale(1); }
  }
  .partner-live .pl-bump { animation: pl-bump-in 0.5s ease both; }
  @media (prefers-reduced-motion: reduce) { .partner-live .pl-bump { animation: none; } }

  /* ── Main ────────────────────────────────────────────────────────────────
     The map takes the left column whole; the right column carries four fixed
     numbers and the two rotating panels under them. */
  .partner-live .pl-main {
    flex: 1 1 auto; min-height: 0; padding: 0 1.8vw 1.2vh; display: flex;
  }
  .partner-live .pl-card {
    min-height: 0; min-width: 0;
    background: var(--card); border: 1px solid var(--border);
    border-radius: 1.1vh; box-shadow: var(--shadow);
    display: flex; flex-direction: column;
    /* The page is one viewport with no scroll, so a card that cannot fit its
       content must clip it rather than paint over the card below. */
    overflow: hidden;
  }
  .partner-live .card-eyebrow { flex: 0 0 auto; font-size: 1.05vh; letter-spacing: .08em; }
  .partner-live .pl-empty { font-size: 1.3vh; color: var(--text-2); }

  .partner-live .pl-map-card { flex: 0 0 36%; padding: 1.3vh 1vw; }
  .partner-live .pl-map { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
  /* The map fills whatever the card has left. Absolutely positioned inside a
     relative box, because an inline SVG with height:100% against a flex item of
     indefinite height resolves to nothing on the signage browser — which is
     exactly why the map card was empty on the screen in the hall. The box has a
     definite height, so the SVG has one too. */
  .partner-live .pl-map-inner { position: relative; flex: 1 1 auto; min-height: 0; margin-top: .8vh; }
  .partner-live .pl-map-inner .pl-nlmap {
    position: absolute; top: 0; left: 0; right: 0; bottom: 0;
    width: 100%; height: 100%; display: block;
  }
  .partner-live .pl-map-card .card-eyebrow b { color: var(--primary-text, var(--primary)); font-weight: 700; }

  /* Bats: a small panel under the map for the locations that listen for them,
     showing one species at a time (see the rotation in the page script). */
  .partner-live .pl-bats { flex: 0 0 auto; margin-top: 1vh; padding-top: 1vh; border-top: 1px solid var(--border); }
  .partner-live .pl-bats-title {
    display: flex; align-items: center;
    font-family: 'DM Mono', monospace; font-size: 1vh;
    letter-spacing: .12em; text-transform: uppercase; color: var(--text-2);
  }
  .partner-live .pl-bats-title .wil-ic { width: 1.2vh; height: 1.2vh; margin-right: .4vw; }
  .partner-live .pl-bats-list { margin-top: .7vh; }
  .partner-live .pl-bat { display: flex; align-items: center; min-width: 0; }
  .partner-live .pl-bat[hidden] { display: none; }
  .partner-live .pl-bat-photo {
    width: 4.2vh; height: 4.2vh; border-radius: .9vh; object-fit: contain;
    background: #fff; border: 1px solid var(--border); flex: 0 0 auto; margin-right: .6vw;
  }
  .partner-live .pl-bat-body { min-width: 0; display: flex; flex-direction: column; }
  .partner-live .pl-bat-name {
    font-weight: 600; font-size: 1.45vh; color: var(--text);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .partner-live .pl-bat-meta,
  .partner-live .pl-bats-meta { font-size: 1.1vh; color: var(--text-2); }
  .partner-live .pl-bats-meta { margin-top: .6vh; }

  .partner-live .pl-map-caption {
    flex: 0 0 auto; margin-top: 1vh; display: flex; align-items: center;
    font-family: 'DM Mono', monospace; font-size: 1.05vh; letter-spacing: .06em;
    text-transform: uppercase; color: var(--text-2);
  }
  .partner-live .pl-map-caption .wil-ic { width: 1.3vh; height: 1.3vh; margin-right: .4vw; color: var(--primary-text, var(--primary)); }

  /* ── Right column ────────────────────────────────────────────────────── */
  .partner-live .pl-right { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; margin-left: 1vw; }

  /* In a nutshell — four numbers in a strip, not a panel. As a panel it took a
     third of the page height to say four things. */
  .partner-live .pl-vogelvlucht {
    flex: 0 0 auto; min-width: 0; padding: 1.3vh 1.4vw 1.5vh;
    background: var(--deep); border: 1px solid var(--deep-border); color: var(--on-deep);
    border-radius: 1.1vh; display: flex; flex-direction: column; overflow: hidden;
  }
  .partner-live .pl-vogelvlucht .card-eyebrow { color: var(--deep-label); }
  .partner-live .pl-vv-rows { display: flex; margin-top: 1vh; }
  .partner-live .pl-vv-row { flex: 1 1 0; min-width: 0; }
  .partner-live .pl-vv-row + .pl-vv-row { margin-left: 1vw; }
  .partner-live .pl-vv-num {
    display: block; font-family: var(--font-sans); font-weight: 600;
    font-size: 3.4vh; line-height: 1; color: var(--on-deep-strong);
  }
  .partner-live .pl-vv-label { display: block; font-size: 1.3vh; color: var(--on-deep-soft); margin-top: .5vh; }

  /* ── The two rotating panels ─────────────────────────────────────────────
     Species on the left, patterns on the right. They alternate, so only one
     thing on the page changes at a time (the half-period tick in the page
     script), and each carries a progress bar saying how long the current slide
     still has. */
  .partner-live .pl-rotators { flex: 1 1 auto; min-height: 0; display: flex; margin-top: 1.2vh; }
  .partner-live .pl-rot { position: relative; flex: 1 1 0; padding: 1.3vh 1vw 1.6vh; }
  .partner-live .pl-rot-b { margin-left: 1vw; }
  .partner-live .pl-rot-head { display: flex; align-items: center; justify-content: space-between; flex: 0 0 auto; }
  .partner-live .pl-rot-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .partner-live .pl-dots { display: flex; flex: 0 0 auto; margin-left: .6vw; align-items: center; }
  /* The dot is the visible mark; the button around it carries the tap area, so
     a finger on a screen in a hall has something to hit (6.7 / section 8). */
  .partner-live .pl-dot {
    width: 2.2vh; height: 2.2vh; min-width: 22px; min-height: 22px;
    padding: 0; border: 0; background: transparent; cursor: pointer;
    display: grid; place-items: center; border-radius: 50%;
  }
  .partner-live .pl-dot::before {
    content: ''; width: .7vh; height: .7vh; min-width: 6px; min-height: 6px;
    border-radius: 50%; background: var(--border); display: block;
  }
  .partner-live .pl-dot.is-on::before { background: var(--primary); }
  .partner-live .pl-dot:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }

  .partner-live .pl-slide {
    flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column;
    margin-top: .6vh; overflow: hidden;
    animation: pl-fade .45s ease both;
  }
  .partner-live .pl-slide[hidden] { display: none; }
  @keyframes pl-fade { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }

  /* The progress bar. A new bar element is created on every slide change (see
     the script), which is what restarts the animation — Chromium 56 will not
     replay a running one just because a class changed. */
  /* A countdown nobody asked for should not be the brightest thing on the
     card: thin, neutral grey, no track behind it (6.7). The duration is set
     from the script, so it follows the configured rotation instead of a
     number baked in here. */
  .partner-live .pl-progress { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: transparent; }
  .partner-live .pl-progress-bar { height: 100%; width: 0; background: var(--text-2); opacity: .25; animation: pl-progress 12s linear both; }
  @keyframes pl-progress { from { width: 0; } to { width: 100%; } }

  /* Species rows (top species by day / by night) */
  .partner-live .pl-splist { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; justify-content: space-between; overflow: hidden; }
  .partner-live .pl-sprow { display: flex; align-items: center; padding: .55vh 0; border-bottom: 1px solid var(--hairline); }
  /* 6.5 -- about 40% larger than before (3.6vh), with one row fewer to pay for
     it: on a screen across a hall the photograph is what carries a species. */
  .partner-live .pl-sp-photo {
    width: 5vh; height: 5vh; border-radius: .8vh; object-fit: contain;
    background: #fff; border: 1px solid var(--border); flex: 0 0 auto; margin-right: .6vw;
  }
  .partner-live .pl-sp-body { flex: 1 1 auto; min-width: 0; }
  .partner-live .pl-sp-top { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: .45vh; }
  .partner-live .pl-sp-name { font-size: 1.45vh; font-weight: 500; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .partner-live .pl-sp-count { font-family: 'DM Mono', monospace; font-size: 1.15vh; color: var(--text-2); flex: 0 0 auto; margin-left: .5vw; }
  .partner-live .pl-sp-track { height: .6vh; border-radius: .3vh; background: var(--border); overflow: hidden; }
  .partner-live .pl-sp-fill { display: block; height: 100%; border-radius: .3vh; background: var(--primary); }
  .partner-live .pl-dn-note { flex: 0 0 auto; font-size: 1.15vh; color: var(--text-2); margin-top: .6vh; }

  /* Indicator species — heard, and expected but still silent */
  .partner-live .pl-ind-intro { flex: 0 0 auto; font-size: 1.3vh; color: var(--text-2); line-height: 1.45; }
  .partner-live .pl-indlist { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; justify-content: space-around; margin-top: .4vh; overflow: hidden; }
  .partner-live .pl-indrow { display: flex; align-items: center; padding: .5vh 0; border-bottom: 1px solid var(--hairline); }
  .partner-live .pl-ind-photo {
    width: 3.6vh; height: 3.6vh; border-radius: .8vh; object-fit: contain;
    background: #fff; border: 1px solid var(--border); flex: 0 0 auto; margin-right: .6vw;
  }
  /* A species that belongs here but has not been heard: an outline where its
     photo would be, so the two lists read as the same list in two states. */
  .partner-live .pl-ind-photo.is-awaited {
    display: flex; align-items: center; justify-content: center;
    background: var(--bg); border: 1px dashed var(--wil-sand); color: var(--wil-sand-dark);
  }
  .partner-live .pl-ind-photo.is-awaited .wil-ic { width: 1.6vh; height: 1.6vh; }
  .partner-live .pl-ind-body { flex: 1 1 auto; min-width: 0; }
  .partner-live .pl-ind-name { font-size: 1.45vh; font-weight: 500; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .partner-live .pl-ind-habitat { font-size: 1.2vh; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .partner-live .pl-pill {
    flex: 0 0 auto; display: inline-flex; align-items: center; margin-left: .6vw;
    font-family: 'DM Mono', monospace; font-size: 1vh; letter-spacing: .06em;
    text-transform: uppercase; padding: .35vh .5vw; border-radius: 999px; white-space: nowrap;
  }
  .partner-live .pl-pill .wil-ic { width: 1.1vh; height: 1.1vh; margin-right: .3vw; }
  /* Semantic, never partner-coloured: present and expected mean the same thing
     on every page of the product. */
  .partner-live .pl-pill.is-heard { color: var(--wil-sage-text); background: var(--wil-tint-primary); }
  .partner-live .pl-pill.is-expected { color: var(--amber-text); background: rgba(200,146,74,.14); }

  /* ── Charts ──────────────────────────────────────────────────────────────
     Both are inline SVG the server hands over finished. They are stretched to
     the card (preserveAspectRatio="none"), so no type lives inside them: the
     axes and the labels are HTML, positioned in percentages the view computed.
     Stretching an SVG stretches its letters with it. */
  .partner-live .pl-chart { position: relative; flex: 1 1 auto; min-height: 0; margin-top: .6vh; }
  .partner-live .pl-trend-svg,
  .partner-live .pl-hours-svg {
    position: absolute; top: 0; left: 0; right: 0; bottom: 0;
    width: 100%; height: 100%; overflow: visible;
  }
  .partner-live .pl-trend-grid { stroke: var(--hairline); stroke-width: 1; }
  .partner-live .pl-trend-line { fill: none; vector-effect: non-scaling-stroke; }
  .partner-live .pl-trend-line.is-detections { stroke: var(--primary-text, var(--primary)); stroke-width: 2.5; }
  .partner-live .pl-trend-line.is-species { stroke: var(--roest); stroke-width: 2; }
  /* The running month: it counts through yesterday, so joining it solidly to a
     completed month would claim a drop that is only the month being young. */
  .partner-live .pl-trend-line.is-running { stroke-dasharray: 4 4; opacity: .6; }
  .partner-live .pl-trend-dot.is-det { fill: var(--primary-text, var(--primary)); }
  .partner-live .pl-trend-dot.is-sp { fill: var(--roest); }
  /* The two axes sit in the margins the plot box leaves free (40 and 36 of 600
     viewBox units — see TREND_L / TREND_R in the view). */
  .partner-live .pl-axis { position: absolute; top: 0; bottom: 0; }
  .partner-live .pl-axis span {
    position: absolute; transform: translateY(-50%); white-space: nowrap;
    font-family: 'DM Mono', monospace; font-size: 1vh;
  }
  .partner-live .pl-axis.is-left { left: 0; width: 6.5%; }
  .partner-live .pl-axis.is-left span { right: 0; padding-right: .3vw; color: var(--primary-text, var(--primary)); }
  .partner-live .pl-axis.is-right { right: 0; width: 6%; }
  .partner-live .pl-axis.is-right span { left: 0; padding-left: .3vw; color: var(--roest-text); }
  .partner-live .pl-trend-labels { position: absolute; left: 6.5%; right: 6%; bottom: 0; height: 1.4vh; }
  .partner-live .pl-trend-labels span,
  .partner-live .pl-hours-labels span {
    position: absolute; transform: translateX(-50%); white-space: nowrap;
    font-family: 'DM Mono', monospace; font-size: 1vh; color: var(--text-2);
  }
  .partner-live .pl-legend { flex: 0 0 auto; display: flex; flex-wrap: wrap; margin-top: .8vh; font-size: 1.15vh; color: var(--text-2); }
  .partner-live .pl-legend-item { display: inline-flex; align-items: center; }
  .partner-live .pl-legend-item + .pl-legend-item { margin-left: 1.2vw; }
  .partner-live .pl-legend-line { width: 1.1vw; height: 2px; display: block; margin-right: .35vw; }
  .partner-live .pl-legend-line.is-detections { background: var(--primary-text, var(--primary)); }
  .partner-live .pl-legend-line.is-species { background: var(--roest); }
  .partner-live .pl-legend-line.is-running { height: 0; border-top: 2px dashed var(--text-2); }

  .partner-live .pl-sofar { flex: 0 0 auto; display: flex; align-items: baseline; flex-wrap: wrap; font-size: 1.2vh; color: var(--text-2); }
  .partner-live .pl-sofar-label {
    font-family: 'DM Mono', monospace; letter-spacing: .06em; text-transform: uppercase;
    font-size: 1vh; color: var(--amber-text); margin-right: .6vw;
  }
  .partner-live .pl-sofar-num { font-family: var(--font-sans); font-weight: 600; font-size: 2vh; color: var(--text); }
  .partner-live .pl-sofar-unit { margin-left: .4vw; }

  /* The loudest moment of the day */
  .partner-live .pl-peak-head { flex: 0 0 auto; font-weight: 600; font-size: 2.2vh; line-height: 1.15; color: var(--text); }
  .partner-live .pl-peak-sub { flex: 0 0 auto; font-size: 1.3vh; color: var(--text-2); margin-top: .3vh; }
  .partner-live .pl-hours { margin-top: 1vh; }
  .partner-live .pl-hours-axis { stroke: var(--border); stroke-width: 1; }
  /* Three strengths of the one brand colour: the loudest hour, the daylight
     hours, and the night. fill-opacity rather than a mixed colour — there is no
     color-mix() on the screen this is for. */
  .partner-live .pl-hour-bar { fill: var(--primary); }
  .partner-live .pl-hour-bar.is-peak { fill-opacity: 1; }
  .partner-live .pl-hour-bar.is-day { fill-opacity: .5; }
  .partner-live .pl-hour-bar.is-night { fill-opacity: .28; }
  .partner-live .pl-sun-line { stroke: var(--amber); stroke-width: 1; stroke-dasharray: 3 3; vector-effect: non-scaling-stroke; }
  .partner-live .pl-sun-mark {
    position: absolute; top: 0; transform: translateX(-50%);
    display: flex; align-items: center; white-space: nowrap;
    font-family: 'DM Mono', monospace; font-size: 1vh; color: var(--amber-text);
  }
  .partner-live .pl-sun-mark .wil-ic { width: 1.2vh; height: 1.2vh; margin-right: .2vw; }
  .partner-live .pl-hours-labels { position: absolute; left: 0; right: 0; bottom: 0; height: 1.4vh; }

  /* Twelve-month rankings (species, and locations on a partner page): compact
     rows that fill the card, in CSS so they need no chart library. */
  .partner-live .pl-hist { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; justify-content: space-between; margin-top: .2vh; overflow: hidden; }
  .partner-live .pl-hist-photo {
    width: 3.4vh; height: 3.4vh; min-width: 26px; min-height: 26px; border-radius: .6vh;
    object-fit: contain; background: #fff; border: 1px solid var(--border);
    flex: 0 0 auto; margin-right: .5vw;
  }
  .partner-live .pl-hist-row { display: flex; align-items: center; min-width: 0; }
  .partner-live .pl-hist-name {
    flex: 0 0 34%; min-width: 0; margin-right: .5vw; font-size: 1.35vh; color: var(--text);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  /* Location names are longer than species names and worth reading whole. */
  .partner-live .pl-hist.is-locations .pl-hist-name { flex: 0 0 38%; }
  /* A short list is not spread over the whole card. A partner with two
     locations got one row at the top and one at the bottom with a hole
     between them, which reads as a broken table rather than as two places.
     Under five rows they sit at the top, each with a little more room. */
  .partner-live .pl-hist.is-short { justify-content: flex-start; flex: 0 0 auto; }
  .partner-live .pl-hist.is-short .pl-hist-row + .pl-hist-row { margin-top: 1.8vh; }
  .partner-live .pl-hist.is-short .pl-hist-name { font-size: 1.6vh; }
  .partner-live .pl-hist.is-short .pl-hist-track { height: 1.1vh; }
  .partner-live .pl-hist.is-short .pl-hist-value { font-size: 1.35vh; }
  .partner-live .pl-hist-track { flex: 1 1 auto; min-width: 0; height: .8vh; border-radius: 999px; background: var(--wil-tint-primary); overflow: hidden; display: block; }
  .partner-live .pl-hist-fill { display: block; height: 100%; border-radius: 999px; background: var(--primary); }
  .partner-live .pl-hist-value {
    flex: 0 0 auto; margin-left: .5vw; font-family: 'DM Mono', monospace; font-size: 1.15vh;
    color: var(--text-2); min-width: 3.2vw; text-align: right;
  }

  /* ── Province map ────────────────────────────────────────────────────────
     Inline SVG (design handoff "Nederland Sensorkaart"): quiet land tones, drop
     pins in the pin colour, a tooltip per pin. The land takes the partner's
     colour where there is one (--map-land / --map-land-sensor). */
  .partner-live .pl-prov { fill: var(--map-land); stroke: #ffffff; stroke-width: 1.4; transition: fill .18s ease; }
  .partner-live .pl-prov.has-sensor { fill: var(--map-land-sensor); }
  .partner-live .pl-prov:hover { fill: var(--map-land-sensor); }
  .partner-live .pl-nlmap-outline { fill: none; stroke: #c3cdc4; stroke-width: 1; stroke-linejoin: round; pointer-events: none; }
  .partner-live .pl-npin { cursor: pointer; outline: none; }
  .partner-live .pl-npin-shape { transition: transform .16s ease; }
  .partner-live .pl-npin:hover .pl-npin-shape,
  .partner-live .pl-npin.on .pl-npin-shape,
  .partner-live .pl-npin:focus .pl-npin-shape { transform: scale(1.18); }
  .partner-live .pl-npin.is-hot .pl-npin-shape { transform: scale(1.35); }
  .partner-live .pl-npin path { fill: var(--pin); }
  /* The dot in the pin head: the bright accent when the house style has one
     that reads on the panels, white otherwise — the same rule the eyebrows
     follow, so the pin belongs to the same set of marks. */
  .partner-live .pl-npin circle { fill: #ffffff; }
  .partner-live .pl-npin .pl-npin-shape circle { fill: var(--pin-dot, #ffffff); }
  .partner-live .pl-npin:focus path { stroke: var(--roest); stroke-width: 2; }
  .partner-live .pl-npin-shadow { fill: #1f2d27; opacity: .14; }
  /* The rest of the network: quiet dots, so the pins of this page's own
     locations are unmistakably the subject. They carry no name and no hover —
     they are context, not something to click through. */
  .partner-live .pl-npin.is-other { cursor: default; pointer-events: none; }
  .partner-live .pl-npin.is-other .pl-npin-dot { fill: var(--pin); opacity: .38; r: 3.5; }
  .partner-live .pl-npin.is-own .pl-npin-shape { filter: drop-shadow(0 1px 2px rgba(31,45,39,.35)); }
  /* The ping animates the radius, not a transform: scaling an SVG element from
     its own centre needs transform-box, which the signage browser does not
     have, and without it the ring flew off the map. */
  .partner-live .pl-npin-ping { fill: none; stroke: var(--pin); stroke-width: 2; opacity: 0; }
  .partner-live .pl-npin.is-hot .pl-npin-ping { animation: pl-ping-r 1.6s ease-out infinite; }
  @keyframes pl-ping-r {
    0%   { r: 7; opacity: .9; }
    100% { r: 34; opacity: 0; }
  }
  /* ── Region inset ────────────────────────────────────────────────────────
     The same map zoomed to one region (frontend/_region_inset.html): the
     province rules above do the land and the pins, these add what only a
     zoomed map needs — water behind the municipalities, names on the map,
     a frame and a scale. */
  .partner-live .pl-rwater { fill: #e6ebe6; }
  .partner-live .pl-rframe { fill: none; stroke: var(--border); stroke-width: 1; pointer-events: none; }
  /* Names get a paper halo (paint-order, then a fat stroke under the fill), so
     a label stays readable where it crosses a border or a pin's shadow. */
  .partner-live .pl-rlabel {
    font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .04em;
    fill: var(--text); paint-order: stroke; stroke: #fbfbf8; stroke-width: 3.2;
    stroke-linejoin: round; pointer-events: none;
  }
  .partner-live .pl-rgem {
    font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .12em;
    fill: var(--text-2); opacity: .7; paint-order: stroke; stroke: #fbfbf8;
    stroke-width: 3; stroke-linejoin: round; pointer-events: none;
  }
  .partner-live .pl-rscale line { stroke: var(--text-2); stroke-width: 1; opacity: .55; }
  .partner-live .pl-rscale text {
    font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .1em;
    fill: var(--text-2); opacity: .8;
  }
  /* ── Region callout ──────────────────────────────────────────────────────
     The region on the national map twice over (frontend/_region_callout.html):
     a rectangle where it is, two lines out of it, and the same ground drawn
     large in a panel on the sea. The panel's own insides are the rules above;
     these are only the marks that tie it to the country. */
  .partner-live .pl-callout-cone { fill: var(--pin); opacity: .055; pointer-events: none; }
  .partner-live .pl-callout-line {
    stroke: var(--pin); stroke-width: 1.3; opacity: .6; pointer-events: none;
  }
  .partner-live .pl-callout-rect {
    fill: var(--pin); fill-opacity: .1; stroke: var(--pin); stroke-width: 1.6;
    pointer-events: none;
  }
  /* The sheet: a shadow, then paper just past the panel's edge, so the map
     under it reads as under it and not as a hole in the country. */
  .partner-live .pl-callout-shadow { fill: #1f2d27; opacity: .15; pointer-events: none; }
  .partner-live .pl-callout-mat { fill: #fbfbf8; pointer-events: none; }
  .partner-live .pl-callout-panel .pl-rframe { stroke: var(--text-2); opacity: .4; }

  .partner-live .pl-nlmap-tip { pointer-events: none; }
  .partner-live .pl-nlmap-tip.is-off { display: none; }
  .partner-live .pl-nlmap-tip rect { fill: #ffffff; stroke: var(--border); stroke-width: 1; }
  .partner-live .pl-nlmap-tip text { font-family: var(--font-sans); font-size: 12.5px; fill: var(--text); }
  @media (prefers-reduced-motion: reduce) {
    .partner-live .pl-npin.is-hot .pl-npin-ping { animation: none; opacity: .6; }
    .partner-live .pl-slide { animation: none; }
    .partner-live .pl-progress-bar { animation: none; }
    .partner-live .live-dot { animation: none; }
  }

  /* ── Footer ──────────────────────────────────────────────────────────── */
  .partner-live .pl-footer {
    flex: 0 0 auto; display: flex; align-items: center; justify-content: space-between;
    padding: .9vh 1.8vw 1vh; border-top: 1px solid var(--border); background: var(--card);
  }
  .partner-live .pl-footer-text { margin: 0; font-size: 1.15vh; line-height: 1.5; color: var(--text-2); max-width: 60vw; }
  .partner-live .pl-footer-brand {
    display: inline-flex; align-items: center; margin-left: 1.2vw; text-decoration: none;
    color: var(--text-2); font-family: 'DM Mono', monospace; font-size: 1vh;
    letter-spacing: .14em; text-transform: uppercase; white-space: nowrap;
  }
  .partner-live .pl-footer-brand > * + * { margin-left: .4vw; }
  .partner-live .pl-footer-brand img { height: 1.7vh; width: auto; }
  .partner-live .pl-footer-brand:hover { color: var(--primary-text, var(--primary)); }

  /* ── Portrait and narrow screens (ABRI portrait, phones) ─────────────────
     One scrolling column: the landscape kiosk layout is too wide for a phone,
     and vh-sized type in a scrolling column needs a floor under it, which the
     cards' own min-heights provide. */
  @media (max-aspect-ratio: 1/1), (max-width: 900px) {
    body.partner-live { height: auto; min-height: 100vh; overflow-x: hidden; overflow-y: auto; }
    .partner-live .pl-hero { flex-direction: column; }
    .partner-live .pl-hero-feature { flex: 0 0 auto; }
    .partner-live .pl-strip-wrap { margin: 1.2vh 0 0; }
    .partner-live .pl-main { flex-direction: column; }
    .partner-live .pl-map-card { flex: 0 0 auto; min-height: 52vh; }
    .partner-live .pl-right { margin: 1.2vh 0 0; }
    .partner-live .pl-rotators { flex-direction: column; }
    .partner-live .pl-rot { min-height: 40vh; }
    .partner-live .pl-rot-b { margin: 1.2vh 0 0; }
    /* Declutter the cramped mobile header — the LIVE state is implied by the
       hero, and fullscreen is a kiosk feature. */
    .partner-live .pl-clock,
    .partner-live .pl-header-live,
    .partner-live .pl-fs-btn { display: none; }
    .partner-live .pl-partner { white-space: normal; }
    /* Fewer, larger recent-heard cards; the last still clipped in half. */
    .partner-live .pl-chip { flex: 0 0 calc((100% - 3 * .7vw) / 3.5); }
    .partner-live .pl-footer { flex-direction: column; align-items: flex-start; }
    .partner-live .pl-footer-text { max-width: none; }
    .partner-live .pl-footer-brand { margin: 1.2vh 0 0; }

    /* Type floors. Every size on this page is in vh, which is what makes it
       scale to a signage panel -- but a scrolling phone column is 700-900
       CSS px tall, and 1.05vh of that is 8px. The kiosk minimums were set for
       a screen read from across a room, not a phone in the hand. */
    .partner-live .pl-powered-label, .partner-live .pl-hero-eyebrow, .partner-live .pl-strip-title,
    .partner-live .pl-chip-time, .partner-live .pl-map-caption, .partner-live .pl-bats-title,
    .partner-live .pl-partner-eyebrow, .partner-live .pl-sofar-label, .partner-live .pl-header-live,
    .partner-live .pl-footer-brand, .partner-live .card-eyebrow, .partner-live .pl-demo-badge,
    .partner-live .pl-pill, .partner-live .pl-axis span, .partner-live .pl-trend-labels span,
    .partner-live .pl-hours-labels span, .partner-live .pl-sun-mark,
    .partner-live .pl-lang-btn { font-size: 11px; }
    /* The one header control that stays on a phone, so it gets a thumb's
       worth of height rather than a signage panel's fraction of one. */
    .partner-live .pl-lang-btn { padding: 8px 10px; }
    .partner-live .pl-lang { border-radius: 8px; }
    .partner-live .pl-chip-loc, .partner-live .pl-hero-meta, .partner-live .pl-sofar,
    .partner-live .pl-dn-note, .partner-live .pl-sp-count, .partner-live .pl-hist-value,
    .partner-live .pl-ind-habitat, .partner-live .pl-legend { font-size: 12px; }
    .partner-live .pl-chip-name, .partner-live .pl-hero-latin, .partner-live .pl-vv-label,
    .partner-live .pl-sp-name, .partner-live .pl-ind-name, .partner-live .pl-hist-name,
    .partner-live .pl-bat-name, .partner-live .pl-ind-intro, .partner-live .pl-peak-sub,
    .partner-live .pl-empty { font-size: 13px; }
    .partner-live .pl-footer-text { font-size: 12.5px; }
    .partner-live .pl-vv-num { font-size: 26px; }
    .partner-live .pl-peak-head { font-size: 19px; }
    .partner-live .pl-sofar-num { font-size: 17px; }
    /* Photos stop shrinking with the viewport too, or the rows lose their
       subject on the device that has the most room for it. */
    .partner-live .pl-sp-photo, .partner-live .pl-ind-photo { width: 48px; height: 48px; }
    .partner-live .pl-bat-photo { width: 40px; height: 40px; }
    /* The eyebrow may wrap, but it must not GROW: in a column card
       flex-grow makes it swallow the height the map needs, which is what
       left the map card three-quarters empty on a phone. */
    .partner-live .pl-card .card-eyebrow { flex: 0 0 auto; min-width: 0; }
    /* A phone has room for the whole "where · when" line. */
    .partner-live .pl-hero-meta { -webkit-line-clamp: 3; }
    /* Touch targets: the two links that are really links. */
    .partner-live .pl-powered, .partner-live .pl-footer-brand { min-height: 44px; display: inline-flex; align-items: center; }
    .partner-live .pl-powered { flex-direction: column; align-items: flex-start; justify-content: center; }
  }

  /* Export format menu (wil-export.js): opens under a download icon, anywhere
     on the page, so it is not scoped to .wil-dashboard. */
  .viz-dl-menu {
    position: fixed; z-index: 1000; min-width: 196px; padding: 6px;
    background: var(--wil-card, #fff); border: 1px solid var(--wil-border, #E8E4DB); border-radius: 10px;
    box-shadow: 0 4px 18px rgba(28, 35, 30, .10); display: flex; flex-direction: column; gap: 2px;
    font-family: var(--wil-font-sans, 'DM Sans', system-ui, sans-serif);
  }
  .viz-dl-opt {
    display: flex; flex-direction: column; align-items: flex-start; gap: 2px; width: 100%;
    padding: 8px 10px; border: 0; border-radius: 8px; background: none; cursor: pointer; text-align: left;
    color: var(--wil-text, #1A1F1B); font: inherit; line-height: 1.3;
  }
  .viz-dl-opt b { font-family: var(--wil-font-mono, 'DM Mono', monospace); font-weight: 500; font-size: 12px; letter-spacing: .04em; }
  .viz-dl-opt span { font-size: 11.5px; color: var(--wil-text-2, #5A645C); }
  .viz-dl-opt:hover, .viz-dl-opt:focus-visible { background: var(--wil-tint-primary, rgba(123,160,152,.14)); outline: none; }

  /* ─────────────────────────────────────────────────────────────────────────
     Wild Score dashboard v2 — additions. */
  .wil-dashboard .live-bar { flex-wrap: wrap; gap: 8px 16px; }
  .wil-dashboard .live-left { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
  .wil-dashboard .live-sep { width: 1px; height: 14px; background: var(--border); display: inline-block; }
  .wil-dashboard .live-right { display: flex; align-items: center; gap: 12px; }
  .wil-dashboard .section-sub { color: var(--text-2); max-width: 720px; font-size: 14px; margin-top: 6px; }
  .wil-dashboard .wild-expand { font-family: 'DM Sans', sans-serif; font-size: 11px; color: var(--text-2); text-transform: none; letter-spacing: 0; }
  .wil-dashboard .trend-pill.down { background: rgba(200,146,74,.15); color: var(--amber-text); }
  /* A change too small to mean anything keeps the neutral grey: the score
     looks back twelve months, so a point either way is drift. */
  .wil-dashboard .trend-pill.flat { background: var(--surface-2, rgba(0,0,0,.04)); color: var(--text-2); }
  .wil-dashboard .stat-unit { font-size: 13px; color: var(--text-2); font-family: 'DM Sans', sans-serif; margin-left: 4px; }
  .wil-dashboard .score-context { font-size: 12px; color: var(--text-2); margin-top: 8px; }

  /* Info toggles + panels */
  .wil-dashboard .info-btn {
    width: 20px; height: 20px; border-radius: 50%; border: 1px solid var(--border); background: var(--card);
    color: var(--text-2); font-size: 10px; display: inline-grid; place-items: center; cursor: pointer; padding: 0;
    transition: background .15s, color .15s, border-color .15s;
  }
  .wil-dashboard .info-btn:hover, .wil-dashboard .info-btn.open { background: var(--primary); color: #fff; border-color: var(--primary); }
  .wil-dashboard .info-panel {
    margin: 12px 0 4px; padding: 14px 16px; border-radius: 10px; background: rgba(123,160,152,.08);
    border: 1px solid rgba(123,160,152,.25); font-size: 13px; line-height: 1.55; color: var(--text);
  }
  .wil-dashboard .info-panel p { margin: 0 0 8px; }
  .wil-dashboard .info-panel ul { margin: 0 0 8px; padding-left: 18px; }
  .wil-dashboard .info-panel li { margin-bottom: 4px; }
  .wil-dashboard .info-title { font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; color: var(--primary); margin: 6px 0 4px; }

  /* Tier progress under the score label */
  .wil-dashboard .tier-progress { margin-top: 12px; max-width: 420px; }
  .wil-dashboard .tier-track { position: relative; height: 8px; border-radius: 4px; background: var(--border); overflow: visible; }
  .wil-dashboard .tier-fill { height: 100%; border-radius: 4px; background: var(--primary); }
  .wil-dashboard .tier-mark { position: absolute; top: -3px; width: 1px; height: 14px; background: var(--text-2); opacity: .4; }
  .wil-dashboard .tier-text { font-size: 12px; color: var(--text-2); margin-top: 6px; }

  /* Pride species card */
  .wil-dashboard .pride-body { display: flex; gap: 14px; align-items: center; text-decoration: none; color: inherit; margin-top: 10px; }
  .wil-dashboard .pride-body:hover .week-name { color: var(--primary); }
  .wil-dashboard .pride-img { width: 84px; height: 84px; border-radius: 12px; object-fit: cover; background: #fff; border: 1px solid var(--border); flex: 0 0 auto; }
  .wil-dashboard .pride-why { font-size: 12px; color: var(--text-2); margin-top: 6px; line-height: 1.45; }
  .wil-dashboard .week-name { font-size: 22px; line-height: 1.15; }

  /* Component cards v2 */
  .wil-dashboard .why-headline { display: flex; align-items: baseline; gap: 8px; margin-top: 10px; }
  .wil-dashboard .why-num { font-size: 40px; line-height: 1; color: var(--text); }
  .wil-dashboard .why-unit { font-size: 14px; color: var(--text-2); }
  .wil-dashboard .why-qualifier { font-size: 13px; color: var(--text); margin-top: 6px; line-height: 1.45; }
  .wil-dashboard .why-subtext { font-size: 11px; color: var(--text-2); margin-top: 6px; }

  /* Diversity measures infographic */
  .wil-dashboard .metric-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 12px; }
  .wil-dashboard .metric-tile { border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; background: var(--card); display: flex; flex-direction: column; gap: 6px; }
  .wil-dashboard .metric-tile.hl { border-color: rgba(123,160,152,.6); background: rgba(123,160,152,.08); }
  .wil-dashboard .mt-label { font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-2); display: flex; justify-content: space-between; gap: 6px; }
  .wil-dashboard .mt-sym { color: var(--primary); text-transform: none; letter-spacing: 0; }
  .wil-dashboard .mt-val { font-size: 28px; line-height: 1; color: var(--text); }
  .wil-dashboard .metric-tile.hl .mt-val { color: var(--primary); }
  .wil-dashboard .mt-desc { font-size: 11.5px; color: var(--text-2); line-height: 1.45; }
  .wil-dashboard .mt-track { height: 5px; border-radius: 3px; background: var(--border); overflow: hidden; }
  .wil-dashboard .mt-fill { height: 100%; width: 0; background: var(--primary); border-radius: 3px; transition: width .9s ease; }
  .wil-dashboard .mt-fill.amber { background: var(--amber); }
  .wil-dashboard .metric-foot { font-size: 12px; color: var(--text-2); margin-top: 14px; line-height: 1.5; }
  @media (max-width: 1100px) { .wil-dashboard .metric-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
  @media (max-width: 640px) { .wil-dashboard .metric-grid { grid-template-columns: 1fr 1fr; } }

  /* Indicator species list (with the shared species visual in front of the name) */
  .wil-dashboard .ind-main { display: inline-flex; align-items: center; gap: 8px; min-width: 0; }
  .wil-dashboard .ind-img { width: 22px; height: 22px; border-radius: 6px; object-fit: cover; background: #fff; border: 1px solid var(--border); flex: 0 0 auto; }
  .wil-dashboard .ac-img { width: 20px; height: 20px; border-radius: 50%; object-fit: cover; background: #fff; border: 1px solid var(--border); flex: 0 0 auto; }
  .wil-dashboard .ind-row { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--border); font-size: 13px; }
  .wil-dashboard .ind-name { color: var(--text); text-decoration: none; }
  .wil-dashboard a.ind-name:hover { color: var(--primary); text-decoration: underline; }
  .wil-dashboard .ind-name.muted { color: var(--text-2); }
  .wil-dashboard .ind-state { font-family: 'DM Mono', monospace; font-size: 11px; white-space: nowrap; }

  /* Calls to action */
  .wil-dashboard .cta-box { border: 1px dashed rgba(123,160,152,.7); border-radius: 12px; padding: 18px 20px; background: rgba(123,160,152,.06); }
  .wil-dashboard .cta-title { font-family: var(--font-sans); font-weight: 600; font-size: 20px; margin-bottom: 6px; }
  .wil-dashboard .cta-box p { font-size: 13px; color: var(--text-2); margin-bottom: 12px; }
  .wil-dashboard .cta-btn {
    display: inline-flex; align-items: center; gap: 8px; padding: 9px 14px; border-radius: 999px; border: 0;
    background: var(--primary); color: #fff; font-size: 13px; font-weight: 500; text-decoration: none; cursor: pointer;
  }
  .wil-dashboard .cta-btn:hover { background: var(--forest); color: #fff; }
  .wil-dashboard .cta-btn.sm { padding: 6px 12px; font-size: 12px; }
  .wil-dashboard .cta-btn.light { background: var(--sage); color: var(--forest); }

  /* Inline "your profile is still empty" notice on the cards that lean on it
     (see management/_dash_profile_hint.html). Quieter than a .cta-box: it sits
     inside a card that already has content, not in place of it. */
  .wil-dashboard .profile-hint {
    display: flex; gap: 8px; align-items: flex-start; margin: 10px 0 0;
    padding: 8px 10px; border-radius: 10px; border: 1px dashed rgba(123,160,152,.7);
    background: rgba(123,160,152,.06); font-size: 12px; line-height: 1.5; color: var(--text-2);
  }
  .wil-dashboard .profile-hint i { color: var(--sage-text); margin-top: 2px; }
  .wil-dashboard .profile-hint a { color: var(--primary); text-decoration: underline; }

  /* Score-over-time legend + activity card */
  /* What the activity bars compare: equal windows, named. */
  .wil-dashboard .activity-window { font-size: 11px; color: var(--text-2); margin-top: 8px; }
  .wil-dashboard .legend-row { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 8px; font-size: 11px; color: var(--text-2); }
  .wil-dashboard .lg { display: inline-flex; align-items: center; gap: 6px; }
  .wil-dashboard .lg-line { width: 18px; height: 2px; background: var(--primary); display: inline-block; }
  .wil-dashboard .lg-vert { width: 2px; height: 12px; border-left: 2px dashed var(--roest); display: inline-block; }
  .wil-dashboard .activity-num { font-size: 44px; line-height: 1; margin-top: 14px; color: var(--text); }
  .wil-dashboard .activity-num.up { color: var(--primary); }
  .wil-dashboard .activity-num.down { color: var(--amber-text); }
  .wil-dashboard .activity-sub { font-family: 'DM Mono', monospace; font-size: 12px; color: var(--text-2); margin-top: 6px; }

  /* Activity bars: shown whatever we can compare. Without a year of history
     there is no headline percentage, so these carry the comparison on their own. */
  .wil-dashboard .activity-bars { display: flex; flex-direction: column; gap: 7px; margin-top: 10px; }
  .wil-dashboard .activity-bar-row { display: grid; grid-template-columns: 96px 1fr auto; align-items: center; gap: 8px; }
  .wil-dashboard .activity-bar-label { font-size: 11px; color: var(--text-2); line-height: 1.15; }
  .wil-dashboard .activity-bar-track { height: 10px; border-radius: 999px; background: rgba(123, 160, 152, .16); overflow: hidden; }
  .wil-dashboard .activity-bar-fill { display: block; height: 100%; border-radius: 999px; background: var(--sage, #7BA098); }
  .wil-dashboard .activity-bar-fill.is-current { background: var(--primary); }
  .wil-dashboard .activity-bar-value { font-family: 'DM Mono', monospace; font-size: 11.5px; color: var(--text-2); }

  /* Opportunities + "I've done this" */
  .wil-dashboard .opp-actions { list-style: none; padding: 0; margin: 8px 0 0; }
  .wil-dashboard .opp-action { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; padding: 9px 0; border-top: 1px solid var(--border); font-size: 14px; }
  .wil-dashboard .opp-action-main { flex: 1 1 260px; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
  .wil-dashboard .opp-horizon { font-size: 10.5px; color: var(--text-2); }
  .wil-dashboard .opp-action.is-done .opp-text { color: var(--text-2); text-decoration: line-through; }
  .wil-dashboard .opp-action.is-done .fa-check-circle { color: var(--sage-text); text-decoration: none; }
  .wil-dashboard .done-btn {
    border: 1px solid var(--border); background: var(--card); color: var(--primary); border-radius: 999px;
    padding: 5px 11px; font-size: 12px; font-weight: 500; cursor: pointer; display: inline-flex; gap: 6px; align-items: center; white-space: nowrap;
  }
  .wil-dashboard .done-btn:hover { border-color: var(--sage); background: rgba(123,160,152,.12); }
  .wil-dashboard .done-form { flex: 1 1 100%; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 8px 10px; border-radius: 8px; background: rgba(123,160,152,.08); }
  .wil-dashboard .done-form[hidden] { display: none; }
  .wil-dashboard .done-form .form-control { max-width: 170px; }
  .wil-dashboard .done-label { font-size: 12px; color: var(--text-2); margin: 0; }
  .wil-dashboard .opp-action-btns { display: flex; gap: 6px; flex-wrap: wrap; }
  /* A planned measure keeps its place on the list -- nothing has changed on the
     ground yet, so it is not ticked off, only marked. */
  .wil-dashboard .opp-action.is-planned .opp-text { color: var(--text-2); }
  .wil-dashboard .opp-planned {
    font-size: 11px; color: var(--roest-text); border: 1px solid var(--border);
    border-radius: 999px; padding: 3px 9px; white-space: nowrap;
  }
  .wil-dashboard .interv-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 13px; }
  .wil-dashboard .interv-date { color: var(--roest-text); font-size: 11px; white-space: nowrap; }
  .wil-dashboard .interv-note { color: var(--text-2); }
  .wil-dashboard .interv-del { border: 0; background: transparent; color: var(--text-2); cursor: pointer; padding: 2px 6px; }
  .wil-dashboard .interv-del:hover { color: var(--roest-text); }
  .wil-dashboard .interv-form { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
  .wil-dashboard .interv-form input[type=text] { flex: 1 1 220px; }
  .wil-dashboard .interv-form input[type=date] { max-width: 170px; }

  /* Comparison (Strava-style) */
  .wil-dashboard .cmp-tabs { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 16px; }
  .wil-dashboard .cmp-tab {
    border: 1px solid var(--border); background: var(--card); color: var(--text-2); border-radius: 999px; padding: 6px 12px;
    font-size: 12px; font-weight: 500; cursor: pointer; display: inline-flex; gap: 6px; align-items: center;
  }
  .wil-dashboard .cmp-tab.active { background: var(--forest); color: #EFE9DA; border-color: var(--forest); }
  .wil-dashboard .cmp-n { font-family: 'DM Mono', monospace; font-size: 10px; }
  .wil-dashboard .cmp-grid { display: grid; grid-template-columns: auto auto 1fr; gap: 28px; align-items: end; }
  .wil-dashboard .cmp-big { font-size: 56px; line-height: 1; color: var(--text); }
  .wil-dashboard .cmp-big.muted { color: var(--text-2); font-size: 40px; }
  .wil-dashboard .cmp-unit { font-size: 20px; margin-left: 2px; }
  .wil-dashboard .cmp-lbl { font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-2); margin-top: 6px; }
  .wil-dashboard .cmp-badges { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
  .wil-dashboard .cmp-badge { padding: 6px 12px; border-radius: 999px; font-size: 12px; font-weight: 600; background: var(--bg); border: 1px solid var(--border); color: var(--text); }
  .wil-dashboard .cmp-badge.good { background: rgba(123,160,152,.18); color: var(--primary); border-color: rgba(123,160,152,.4); }
  .wil-dashboard .cmp-badge.mid { background: rgba(200,146,74,.15); color: var(--amber-text); border-color: rgba(200,146,74,.35); }
  .wil-dashboard .cmp-badge.rank { background: var(--forest); color: #EFE9DA; border-color: var(--forest); }
  .wil-dashboard .cmp-claim { font-size: 15px; margin: 18px 0 14px; line-height: 1.5; }
  .wil-dashboard .hist { display: grid; grid-template-columns: repeat(10, 1fr); gap: 6px; height: 110px; align-items: end; }
  .wil-dashboard .hist-col { position: relative; height: 100%; display: flex; align-items: flex-end; }
  .wil-dashboard .hist-bar { width: 100%; min-height: 3px; border-radius: 4px 4px 2px 2px; background: rgba(123,160,152,.45); transition: height .6s ease; }
  .wil-dashboard .hist-col.mine .hist-bar { background: var(--roest); }
  .wil-dashboard .hist-you { position: absolute; top: -18px; left: 50%; transform: translateX(-50%); font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: .08em; text-transform: uppercase; color: var(--roest-text); }
  .wil-dashboard .hist-axis { display: flex; justify-content: space-between; font-size: 10px; color: var(--text-2); margin-top: 6px; }
  .wil-dashboard .hist-note { font-size: 12px; color: var(--text-2); margin-top: 8px; }
  @media (max-width: 700px) { .wil-dashboard .cmp-grid { grid-template-columns: 1fr 1fr; } .wil-dashboard .cmp-badges { grid-column: 1 / -1; justify-content: flex-start; } }

  /* Deeper section */
  .wil-dashboard .sofar { font-size: 11px; color: var(--amber-text); margin-top: 4px; }
  .wil-dashboard .sofar strong { color: var(--text); }
  .wil-dashboard .chart-link { display: block; text-decoration: none; color: inherit; }
  .wil-dashboard .tsp-link { display: flex; gap: 10px; align-items: center; text-decoration: none; color: inherit; }
  .wil-dashboard .tsp-link:hover .tsp-name { color: var(--primary); }
  .wil-dashboard .tsp-img { width: 32px; height: 32px; border-radius: 8px; object-fit: cover; background: #fff; border: 1px solid var(--border); flex: 0 0 auto; }
  .wil-dashboard .tsp-body { flex: 1 1 auto; min-width: 0; }
  .wil-dashboard a.appeared-chip { text-decoration: none; color: inherit; }
  .wil-dashboard a.appeared-chip:hover { border-color: var(--sage); color: var(--primary); }
  .wil-dashboard .deep-links { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .wil-dashboard .deep-link { display: flex; gap: 10px; align-items: center; padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; text-decoration: none; color: inherit; background: var(--card); }
  .wil-dashboard .deep-link:hover { border-color: var(--sage); }
  .wil-dashboard .deep-link i { color: var(--primary); width: 18px; text-align: center; }
  .wil-dashboard .deep-link span { display: flex; flex-direction: column; }
  .wil-dashboard .deep-link small { color: var(--text-2); font-size: 11px; }
  .wil-dashboard .story-powered { position: absolute; right: 12px; bottom: 10px; font-family: 'DM Mono', monospace; font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: rgba(255,255,255,.85); text-shadow: 0 1px 2px rgba(0,0,0,.4); }
  .wil-dashboard .story-media { position: relative; }
  .wil-dashboard .data-card { background: var(--bg); box-shadow: none; }
  .wil-dashboard .feed-link { color: var(--text); text-decoration: none; }
  .wil-dashboard .feed-link:hover { color: var(--primary); }

  /* Share studio */
  .wil-dashboard .share-chips { display: flex; gap: 6px; flex-wrap: wrap; }
  .wil-dashboard .share-chip { border: 1px solid var(--border); background: var(--card); color: var(--text-2); border-radius: 999px; padding: 6px 12px; font-size: 12px; font-weight: 500; cursor: pointer; }
  .wil-dashboard .share-chip.active { background: var(--forest); color: #EFE9DA; border-color: var(--forest); }
  .wil-dashboard .share-grid { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(260px, 1fr); gap: 20px; align-items: start; }
  .wil-dashboard .share-preview canvas { width: 100%; height: auto; display: block; border-radius: 12px; border: 1px solid var(--border); background: var(--bg); box-shadow: var(--shadow); }
  .wil-dashboard .share-side { display: flex; flex-direction: column; gap: 10px; }
  .wil-dashboard .share-label { font-family: 'DM Mono', monospace; font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-2); }
  .wil-dashboard .share-side textarea { font-size: 13px; line-height: 1.5; }
  .wil-dashboard .share-actions { display: flex; gap: 8px; flex-wrap: wrap; }
  @media (max-width: 900px) { .wil-dashboard .share-grid { grid-template-columns: 1fr; } }

  /* Season score strip inside the Wild Score card */
  .wil-dashboard .season-strip { margin-top: 24px; padding: 14px 16px; border-radius: 10px; background: rgba(212,196,168,.18); border: 1px solid rgba(212,196,168,.6); }
  .wil-dashboard .season-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
  .wil-dashboard .season-flag { font-size: 10.5px; color: var(--amber-text); letter-spacing: .06em; text-transform: uppercase; }
  .wil-dashboard .season-row { display: flex; gap: 22px; flex-wrap: wrap; align-items: flex-end; margin-top: 10px; }
  .wil-dashboard .season-num { font-size: 40px; line-height: 1; color: var(--text); }
  .wil-dashboard .season-val { font-family: var(--font-sans); font-weight: 600; font-size: 20px; line-height: 1.1; color: var(--text); }
  .wil-dashboard .season-val.up { color: var(--primary); }
  .wil-dashboard .season-val.down { color: var(--amber-text); }
  .wil-dashboard .season-lbl { font-size: 11px; color: var(--text-2); margin-top: 3px; }


  /* ─── Fase D: personalisation line, metrics row, scale bar, explanations ─── */
  .wil-dashboard .profile-line { font-size: 11.5px; color: var(--text-2); letter-spacing: .04em; text-transform: uppercase; margin-top: 6px; }
  .wil-dashboard .feed-thumb { width: 26px; height: 26px; border-radius: 6px; object-fit: cover; background: #fff; border: 1px solid var(--border); }
  .wil-dashboard .explain-list { margin: 10px 0 0; padding-left: 18px; font-size: 12.5px; color: var(--text-2); line-height: 1.5; }
  .wil-dashboard .lg-tri { width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 8px solid var(--roest); display: inline-block; }
  .wil-dashboard .ind-state.expected { color: var(--wil-status-expected); }
  /* Species of a habitat that borders the location but is not part of it:
     reported, never scored. */
  .wil-dashboard .ind-state.context { color: var(--sage); }
  .wil-dashboard .ind-context { border-top: 1px solid var(--border); }
  .wil-dashboard .ind-secondary { border-top: 1px solid var(--border); }

  /* Score breakdown: staff and full-scope validators only. */
  .wil-dashboard .sb-card { border-color: rgba(200, 146, 74, .35); }
  .wil-dashboard .sb-sum { display: flex; align-items: flex-end; gap: 18px; flex-wrap: wrap; }
  .wil-dashboard .sb-part-label {
    font-family: 'DM Mono', monospace;
    font-size: 10.5px; text-transform: uppercase; letter-spacing: .08em;
    color: var(--text-2);
  }
  .wil-dashboard .sb-part-val { font-size: 28px; font-weight: 600; line-height: 1.1; letter-spacing: -.01em; }
  .wil-dashboard .sb-part-val.strong { color: var(--primary); font-size: 34px; }
  .wil-dashboard .sb-part-sub { font-family: 'DM Mono', monospace; font-size: 11px; color: var(--text-2); }
  .wil-dashboard .sb-plus { font-size: 20px; color: var(--text-2); padding-bottom: 6px; }
  .wil-dashboard .sb-open {
    border-left: 2px solid var(--amber);
    padding-left: 12px;
    font-size: 12.5px;
  }
  .wil-dashboard .sb-table { font-size: 12.5px; }
  .wil-dashboard .sb-table th {
    font-family: 'DM Mono', monospace;
    font-size: 10.5px; text-transform: uppercase; letter-spacing: .06em;
    color: var(--text-2); font-weight: 500;
  }
  .wil-dashboard .sb-sci { display: block; font-style: italic; font-size: 11px; color: var(--text-2); }
  .wil-dashboard .sb-await { color: var(--amber-text); }
  .wil-dashboard .sb-missing td { opacity: .6; }
  .wil-dashboard .sb-validate { font-size: 11.5px; white-space: nowrap; }
  .wil-dashboard .sb-derive { border-top: 1px solid var(--border); padding-top: 12px; }
  /* Score page: the arithmetic on the left, the same thing in words on the
     right. Two columns on a desk-sized screen, stacked below that. */
  .wil-dashboard .sb-top { display: grid; grid-template-columns: minmax(0, 380px) minmax(0, 1fr); gap: 28px; }
  .wil-dashboard .sb-numbers { min-width: 0; }
  .wil-dashboard .sb-story { min-width: 0; border-left: 1px solid var(--border); padding-left: 24px; }
  .wil-dashboard .sb-story .sb-plain:last-child { margin-bottom: 0; }
  .wil-dashboard .sb-aside { color: var(--text-2); }
  .wil-dashboard .sb-derive-context { color: var(--text-2); }
  @media (max-width: 992px) {
    .wil-dashboard .sb-top { grid-template-columns: minmax(0, 1fr); gap: 18px; }
    .wil-dashboard .sb-story { border-left: 0; padding-left: 0; border-top: 1px solid var(--border); padding-top: 14px; }
  }

  /* The one species table: its head, its filters and the tags in its rows. */
  .wil-dashboard .sb-table-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
  .wil-dashboard .sb-count { font-size: 11.5px; color: var(--text-2); }
  .wil-dashboard .sb-filters { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
  .wil-dashboard .sb-filters input[type="search"] { max-width: 220px; }
  .wil-dashboard .sb-filters select { width: auto; max-width: 220px; }
  .wil-dashboard .sb-tag {
    display: inline-block; padding: 2px 8px; border-radius: 999px;
    font-size: 11px; line-height: 1.5; white-space: nowrap;
  }
  .wil-dashboard .sb-tag.ind { background: var(--wil-tint-primary); color: var(--primary); border: 1px solid rgba(123,160,152,.4); }
  .wil-dashboard .sb-tag.ind2 { background: rgba(123,160,152,.12); color: var(--text-2); border: 1px solid var(--border); }
  .wil-dashboard .sb-tag.ctx { background: transparent; color: var(--text-2); border: 1px dashed var(--border); }
  .wil-dashboard .sb-nil { color: var(--text-2); }
  .wil-dashboard .sb-flyover { color: var(--roest-text); }
  .wil-dashboard tr.sb-flyover td,
  .wil-dashboard tr.sb-context td { opacity: .75; }
  /* Plain-language paragraphs on the score-breakdown page: the arithmetic in
     words, for the readers who validate rather than derive. */
  .wil-dashboard .sb-plain { font-size: 13px; line-height: 1.6; max-width: 68ch; margin: 0 0 8px; }
  .wil-dashboard .sb-derive-row {
    display: flex; justify-content: space-between; gap: 12px;
    padding: 5px 0; font-size: 12.5px; max-width: 380px;
  }
  .wil-dashboard .sb-derive-row.strong { font-weight: 600; }
  .wil-dashboard .sb-sym {
    font-family: 'DM Mono', monospace; font-size: 11px; color: var(--text-2);
    display: inline-block; min-width: 52px;
  }
  .wil-dashboard .ind-state.await { color: var(--amber-text); }
  .wil-dashboard .ind-chips { display: flex; flex-wrap: wrap; gap: 6px; }
  .wil-dashboard .ind-chip {
    font-size: 12px;
    padding: 4px 10px;
    border-radius: 999px;
    background: var(--wil-tint-primary);
    border: 1px solid rgba(123, 160, 152, .3);
    color: var(--primary);
    text-decoration: none;
  }
  .wil-dashboard a.ind-chip:hover { border-color: rgba(123, 160, 152, .6); }
  .wil-dashboard .ind-group + .ind-group { margin-top: 12px; }
  .wil-dashboard .ind-group-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
  .wil-dashboard .ind-group-name { font-size: 12.5px; font-weight: 500; }
  .wil-dashboard .ind-group-count { font-size: 11px; color: var(--text-2); }
  .wil-dashboard .ind-group-bar {
    flex: 1; height: 4px; border-radius: 2px; background: #e0ddd6; overflow: hidden; max-width: 160px;
  }
  .wil-dashboard .ind-group-bar span { display: block; height: 100%; background: var(--sage); }

  .wil-dashboard .ind-state.miss { color: var(--wil-status-absent); }
  /* D2 metrics: typographic only, separated by hairlines. The collapse this
     block used to own now lives one level up, on the whole measured layer. */
  .wil-dashboard .metrics-body { display: grid; grid-template-rows: 1fr; }
  .wil-dashboard .metrics-body-inner { min-height: 0; }

  /* Section 02's fold: conclusions above it, everything measured inside. */
  .wil-dashboard .deeper-block { border-top: 1px solid var(--border); padding-top: 12px; }
  .wil-dashboard .deeper-summary {
    cursor: pointer; list-style: none; font-size: 13px; font-weight: 500;
    color: var(--primary); display: inline-flex; align-items: center; gap: 8px; padding: 4px 0;
  }
  .wil-dashboard .deeper-summary::-webkit-details-marker { display: none; }
  .wil-dashboard .deeper-summary::before { content: '\203A'; transition: transform .2s ease; display: inline-block; }
  .wil-dashboard .deeper-block[open] > .deeper-summary::before { transform: rotate(90deg); }
  .wil-dashboard .deeper-summary:focus-visible { outline: 2px solid var(--primary); outline-offset: 4px; }
  .wil-dashboard .deeper-body { padding-top: 8px; }
  @media (prefers-reduced-motion: reduce) { .wil-dashboard .deeper-summary::before { transition: none; } }

  /* "What has changed": one dated line per event, with a small mark whose
     colour says which kind it is. A planned measure is outlined, not filled --
     it has not happened yet. */
  .wil-dashboard .chg-list { list-style: none; margin: 0; padding: 0; }
  .wil-dashboard .chg-row {
    display: grid; grid-template-columns: 96px 12px 1fr; align-items: baseline; gap: 10px;
    padding: 9px 0; border-top: 1px solid var(--border); font-size: 14px;
  }
  .wil-dashboard .chg-row:first-child { border-top: 0; }
  .wil-dashboard .chg-date { font-size: 11px; color: var(--text-2); white-space: nowrap; }
  .wil-dashboard .chg-mark {
    width: 8px; height: 8px; border-radius: 50%; background: var(--sage, #7BA098);
    justify-self: center; transform: translateY(-2px);
  }
  .wil-dashboard .chg-measure .chg-mark { background: var(--roest-text, #B85C3A); }
  .wil-dashboard .chg-planned .chg-mark { background: transparent; border: 1.5px solid var(--roest-text, #B85C3A); }
  .wil-dashboard .chg-start .chg-mark { background: var(--primary); }
  .wil-dashboard .chg-note { color: var(--text-2); font-size: 12.5px; }
  .wil-dashboard .chg-body a { color: inherit; }
  @media (max-width: 520px) {
    .wil-dashboard .chg-row { grid-template-columns: 12px 1fr; }
    .wil-dashboard .chg-date { grid-column: 1 / -1; }
  }

  /* A chart that can name its own conclusion says it here, with the
     descriptive line demoted to a subtitle underneath. */
  .wil-dashboard .chart-title { font-size: 17px; line-height: 1.3; margin: 0 0 4px; }

  /* Section 02 primary layer: one conclusion per tile, nothing else. */
  .wil-dashboard .insight-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px;
  }
  .wil-dashboard .insight-tile-title { font-size: 17px; line-height: 1.3; margin: 0; }
  .wil-dashboard .insight-tile-title a { color: inherit; text-decoration: none; }
  .wil-dashboard .insight-tile-title a:hover { text-decoration: underline; }
  .wil-dashboard .insight-tile-text { font-size: 13.5px; line-height: 1.5; color: var(--text-2); margin: 8px 0 0; }
  .wil-dashboard .metric-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 0; }
  .wil-dashboard .metric { padding: 12px 18px 12px 0; border-left: 1px solid var(--border); padding-left: 18px; }
  .wil-dashboard .metric:first-child { border-left: 0; padding-left: 0; }
  .wil-dashboard .metric-head { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
  .wil-dashboard .metric-name { font-size: 12px; color: var(--text-2); }
  .wil-dashboard .metric-sym { font-family: var(--font-mono); color: var(--text); margin-left: 4px; }
  .wil-dashboard .metric-val { font-size: 34px; font-weight: 600; letter-spacing: -.02em; line-height: 1.05; margin-top: 6px; font-variant-numeric: tabular-nums; }
  .wil-dashboard .metric-of { font-size: 14px; font-weight: 400; color: var(--text-2); margin-left: 4px; }
  .wil-dashboard .metric-ctx { font-size: 12px; color: var(--text-2); margin-top: 4px; min-height: 16px; }
  @media (max-width: 640px) { .wil-dashboard .metric-row { grid-template-columns: 1fr; } .wil-dashboard .metric { border-left: 0; padding-left: 0; border-top: 1px solid var(--border); } .wil-dashboard .metric:first-child { border-top: 0; } }
  /* D4 scale bar */
  .wil-dashboard .cmp-toolbar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding-right: 44px; }
  .wil-dashboard .cmp-select-label { font-size: 12px; color: var(--text-2); }
  .wil-dashboard .cmp-select { border: 1px solid var(--border); border-radius: 8px; padding: 6px 10px; font: inherit; font-size: 13px; background: var(--card); color: var(--text); max-width: 100%; }
  .wil-dashboard .cmp-n { font-size: 11px; color: var(--text-2); }
  .wil-dashboard .scale { margin: 46px 0 8px; }
  .wil-dashboard .scale-track { position: relative; height: 18px; border-radius: 9px; background: var(--wil-hairline); }
  .wil-dashboard .scale-range { position: absolute; top: 0; bottom: 0; background: rgba(123,160,152,.22); border-radius: 9px; }
  .wil-dashboard .scale-segment { position: absolute; top: -4px; bottom: -4px; border-radius: 6px; border: 1px dashed var(--text-2); opacity: .5; }
  .wil-dashboard .scale-mean { position: absolute; top: -10px; bottom: -10px; width: 2px; background: var(--text-2); transform: translateX(-1px); }
  .wil-dashboard .scale-mean-label { position: absolute; top: -24px; left: 50%; transform: translateX(-50%); white-space: nowrap; font-size: 11px; color: var(--text-2); }
  .wil-dashboard .scale-you { position: absolute; top: 50%; width: 18px; height: 18px; border-radius: 50%; background: var(--primary); border: 3px solid var(--card); box-shadow: 0 0 0 1px var(--primary); transform: translate(-50%, -50%); }
  .wil-dashboard .scale-you-label { position: absolute; top: 22px; left: 50%; transform: translateX(-50%); white-space: nowrap; font-size: 11px; color: var(--primary); font-weight: 500; }
  .wil-dashboard .scale-axis { display: flex; justify-content: space-between; font-size: 10px; color: var(--text-2); margin-top: 30px; }
  .wil-dashboard .cmp-claim { font-size: 16px; margin: 14px 0 4px; }
  .wil-dashboard .cmp-note { font-size: 12px; color: var(--text-2); margin: 0; }
  .wil-dashboard .cmp-note a { color: var(--primary); text-decoration: underline; }
  .wil-dashboard .done-details { margin-top: 8px; }
  .wil-dashboard .done-details summary { cursor: pointer; font-size: 12px; color: var(--text-2); }
  .wil-dashboard .done-details .interv-del { font-size: 11px; }

