/* cityhelper.net — one shared stylesheet, no framework. Ported from prototype/v1-design/site.css (approved 2026-10-26). */
/* @font-face for Onest lives in base.html.twig, so its URL is content-versioned like every other asset. */

/* ---------- Tokens ---------- */
:root{
  /* neutrals */
  --bg:#f6f6f3;            /* page */
  --surface:#ffffff;       /* cards */
  --ink:#15171c;           /* headings, body */
  --ink-2:#4b505a;         /* secondary text */
  --ink-3:#7c818b;         /* meta, captions */
  --line:#e6e6e1;          /* hairlines */
  --line-2:#d6d6d0;

  /* season accents: one per season, plus a tint for fills */
  --winter:#2b63d9;  --winter-tint:#ebf1fd;  --winter-ink:#1d4aa8;
  --summer:#14895a;  --summer-tint:#e5f4ec;  --summer-ink:#0d6b45;
  --allyear:#c2571c; --allyear-tint:#fbede3; --allyear-ink:#9a4313;
  --danger:#c23a3a;  --danger-tint:#fbeaea;

  /* the page's accent: set by .season-* on <body> */
  --accent:var(--allyear); --accent-tint:var(--allyear-tint); --accent-ink:var(--allyear-ink);

  /* spacing scale (4-based) */
  --s-1:4px; --s-2:8px; --s-3:12px; --s-4:16px; --s-5:24px; --s-6:32px; --s-7:48px; --s-8:64px; --s-9:96px;

  /* type scale (fluid for the big steps) */
  --fs-xs:.8125rem;   /* 13 */
  --fs-sm:.9375rem;   /* 15 */
  --fs-md:1.0625rem;  /* 17 body */
  --fs-lg:1.25rem;    /* 20 */
  --fs-xl:clamp(1.375rem,1.1rem + 1vw,1.75rem);
  --fs-2xl:clamp(2rem,1.4rem + 3vw,3.25rem);      /* H1 */
  --fs-num:clamp(4rem,2.5rem + 8vw,7.5rem);        /* the big number */
  --lh-tight:1.1; --lh:1.6;

  --radius:20px; --radius-sm:12px; --radius-pill:999px;
  --shadow:0 1px 2px rgba(20,22,28,.04),0 8px 24px rgba(20,22,28,.05);
  --wrap:1160px; --prose:680px; --gutter:20px;
  --font:'Onest',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
}
@media (min-width:768px){:root{--gutter:40px}}
.season-winter{--accent:var(--winter);--accent-tint:var(--winter-tint);--accent-ink:var(--winter-ink)}
.season-summer{--accent:var(--summer);--accent-tint:var(--summer-tint);--accent-ink:var(--summer-ink)}
.season-allyear{--accent:var(--allyear);--accent-tint:var(--allyear-tint);--accent-ink:var(--allyear-ink)}

/* ---------- Base ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-padding-top:var(--scroll-pad,16px)}
body{margin:0;background:var(--bg);color:var(--ink);font:400 var(--fs-md)/var(--lh) var(--font);-webkit-font-smoothing:antialiased;overflow-wrap:anywhere}
img,svg{display:block;max-width:100%}
[hidden]{display:none!important}
a{color:var(--accent-ink);text-underline-offset:3px;text-decoration-thickness:1px}
a:hover{text-decoration-thickness:2px}
h1,h2,h3{margin:0;line-height:var(--lh-tight);letter-spacing:-.02em;font-weight:650}
h1{font-size:var(--fs-2xl);letter-spacing:-.03em}
h2{font-size:var(--fs-xl)}
h3{font-size:var(--fs-lg);letter-spacing:-.01em}
p{margin:0}
:focus-visible{outline:3px solid var(--accent);outline-offset:2px;border-radius:6px}
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 var(--gutter)}
.prose{max-width:var(--prose)}
.muted{color:var(--ink-2)} .meta{color:var(--ink-3);font-size:var(--fs-sm)}
.stack>*+*{margin-top:var(--s-4)}
.section{padding-top:var(--s-8)}
@media (min-width:768px){.section{padding-top:var(--s-9)}}

/* ---------- Header / footer ---------- */
.site-head{background:var(--surface);border-bottom:1px solid var(--line)}
.site-head .wrap{display:flex;align-items:center;justify-content:space-between;height:60px;gap:var(--s-4)}
.logo{font-weight:700;font-size:1.125rem;letter-spacing:-.02em;color:var(--ink);text-decoration:none;display:flex;align-items:center;gap:10px}
.logo i{width:22px;height:22px;border-radius:7px;background:conic-gradient(var(--winter) 0 33%,var(--summer) 0 66%,var(--allyear) 0);display:block}
.city-pill{font-size:var(--fs-sm);color:var(--ink-2);border:1px solid var(--line-2);padding:5px 12px;border-radius:var(--radius-pill);text-decoration:none}
.site-foot{margin-top:var(--s-9);padding:var(--s-7) 0 var(--s-8);border-top:1px solid var(--line);color:var(--ink-3);font-size:var(--fs-sm)}
.site-foot nav{display:flex;flex-wrap:wrap;gap:var(--s-5);margin-bottom:var(--s-3)}
.site-foot a{color:var(--ink-2)}

/* ---------- Hero ---------- */
.crumbs{font-size:var(--fs-sm);color:var(--ink-3);padding-top:var(--s-6);display:flex;flex-wrap:wrap;gap:6px}
.crumbs a{color:var(--ink-2);text-decoration:none} .crumbs a:hover{text-decoration:underline}
.crumbs span[aria-hidden]{color:var(--line-2)}
.hero{padding:var(--s-5) 0 0}
.hero h1{margin-top:var(--s-4);max-width:16ch}
.hero .lede{margin-top:var(--s-4);font-size:var(--fs-lg);line-height:1.5;color:var(--ink-2);max-width:var(--prose)}
.badge{display:inline-flex;align-items:center;gap:8px;font-size:var(--fs-sm);font-weight:550;color:var(--accent-ink);background:var(--accent-tint);padding:6px 12px 6px 10px;border-radius:var(--radius-pill)}
.badge::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--accent)}
.bignum{display:flex;align-items:baseline;flex-wrap:wrap;gap:0 var(--s-4);margin-top:var(--s-6)}
.bignum b{font-size:var(--fs-num);line-height:.9;font-weight:700;letter-spacing:-.05em;color:var(--accent)}
.bignum span{font-size:var(--fs-lg);color:var(--ink-2);max-width:18ch;line-height:1.3}
.source{display:grid;grid-template-columns:16px 1fr;gap:2px 10px;align-items:start;margin-top:var(--s-5);font-size:var(--fs-sm);color:var(--ink-3);max-width:var(--prose)}
.source svg{width:16px;height:16px;margin-top:3px;grid-row:span 2}
.source span[aria-hidden]{display:none}

/* ---------- Answer box (guide) ---------- */
.answer{margin-top:var(--s-6);background:var(--surface);border-radius:var(--radius);padding:var(--s-5) var(--s-5);box-shadow:var(--shadow);border-left:4px solid var(--accent);max-width:var(--prose)}
.answer p{font-size:var(--fs-lg);line-height:1.5}
.answer p strong{color:var(--accent-ink)}
@media (min-width:768px){.answer{padding:var(--s-6) var(--s-7)}}

/* ---------- Map ---------- */
.map{height:56vh;min-height:320px;max-height:560px;border-radius:var(--radius);overflow:hidden;background:#e9eae6;box-shadow:var(--shadow);position:relative;z-index:0}
.leaflet-container{font-family:var(--font)}
.leaflet-tile-pane{filter:grayscale(.75) brightness(1.06) contrast(.9)}
.leaflet-popup-content-wrapper{border-radius:var(--radius-sm)}
.leaflet-popup-content{margin:12px 16px;font-size:var(--fs-sm);line-height:1.45}
.legend{display:flex;flex-wrap:wrap;gap:var(--s-4);margin-top:var(--s-3);font-size:var(--fs-sm);color:var(--ink-2)}
.legend i{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:6px;vertical-align:0}

/* ---------- Hub tiles ---------- */
.season-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s-4);flex-wrap:wrap;margin-bottom:var(--s-5)}
.season-head h2{display:flex;align-items:center;gap:12px}
.season-head h2::before{content:"";width:12px;height:12px;border-radius:50%;background:var(--accent)}
.tiles{display:grid;gap:var(--s-3);grid-template-columns:1fr}
@media (min-width:640px){.tiles{grid-template-columns:1fr 1fr;gap:var(--s-4)}}
@media (min-width:1000px){.tiles{grid-template-columns:repeat(3,1fr)}}
.tile{display:grid;grid-template-columns:1fr auto;align-items:center;gap:var(--s-1) var(--s-4);background:var(--surface);border-radius:var(--radius);padding:var(--s-4) var(--s-5);box-shadow:var(--shadow);text-decoration:none;color:var(--ink);transition:transform .15s,box-shadow .15s;min-height:92px}
@media (min-width:640px){.tile{padding:var(--s-5);min-height:112px}}
.tile:hover{transform:translateY(-2px);box-shadow:0 2px 4px rgba(20,22,28,.05),0 14px 32px rgba(20,22,28,.08)}
.tile h3{font-size:var(--fs-lg)}
.tile .when{grid-column:1;font-size:var(--fs-sm);color:var(--ink-3)}
.tile .n{grid-row:1/span 2;grid-column:2;font-size:2.25rem;font-weight:700;letter-spacing:-.04em;color:var(--accent);line-height:1}
.tile .n small{font-size:var(--fs-xs);font-weight:500;color:var(--ink-3);letter-spacing:0;display:block;text-align:right;margin-top:4px}

/* "Next to it" line — the differentiator, same look on every template */
.next{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:var(--s-2);font-size:var(--fs-sm);color:var(--ink-2);min-width:0}
.next>b{flex-basis:100%;font-size:var(--fs-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3)}
.next .nb{display:inline-flex;align-items:center;gap:6px;max-width:100%}
.next .nb svg{width:14px;height:14px;flex:none;color:var(--ink-3)}

/* ---------- Directory (template B) ---------- */
.dir{margin-top:var(--s-7)}
.filterbar{position:sticky;top:0;z-index:5;background:color-mix(in srgb,var(--bg) 92%,transparent);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);margin:0 calc(-1*var(--gutter));padding:var(--s-3) var(--gutter);border-bottom:1px solid transparent;transition:border-color .2s}
.filterbar.stuck{border-bottom-color:var(--line)}
.chips{display:flex;gap:var(--s-2);overflow-x:auto;scrollbar-width:none;padding:2px 0}
.chips::-webkit-scrollbar{display:none}
@media (max-width:959px){.filterbar .chips{-webkit-mask-image:linear-gradient(90deg,#000 85%,transparent);mask-image:linear-gradient(90deg,#000 85%,transparent);padding-right:40px}}
.chips+.chips{margin-top:var(--s-2)}
.chip{flex:none;font:inherit;font-size:var(--fs-sm);font-weight:500;color:var(--ink);background:var(--surface);border:1px solid var(--line-2);border-radius:var(--radius-pill);padding:8px 14px;min-height:40px;cursor:pointer;white-space:nowrap;text-decoration:none;display:inline-flex;align-items:center;gap:6px}
.chip:hover{border-color:var(--ink-3)}
.chip[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color:#fff}
.chip .c{color:var(--ink-3);font-weight:400}
.chip[aria-pressed="true"] .c{color:rgba(255,255,255,.8)}
.seg{display:inline-flex;background:var(--surface);border:1px solid var(--line-2);border-radius:var(--radius-pill);padding:3px}
.seg button{font:inherit;font-size:var(--fs-sm);border:0;background:none;padding:6px 14px;border-radius:var(--radius-pill);cursor:pointer;color:var(--ink-2)}
.seg button[aria-pressed="true"]{background:var(--ink);color:#fff}
.linkbtn{font:inherit;font-size:var(--fs-sm);border:0;background:none;color:var(--accent-ink);cursor:pointer;text-decoration:underline;text-underline-offset:3px;padding:0}
.dir-body{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s-5);margin-top:var(--s-4)}
/* phone: the map is always shown, above the cards (no List/Map toggle since 2026-10-28, MAP-HIGHER.md) */
.dir-body .map{height:45svh;min-height:280px}
@media (max-width:959px){.dir-map{order:-1}}
@media (min-width:960px){
  .dir-body{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start}
  .dir-map{position:sticky;top:120px}
  .dir-body .map{height:calc(100vh - 150px);max-height:none}
}
.cards{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s-3)}
.card{background:var(--surface);border-radius:var(--radius);padding:var(--s-5);box-shadow:var(--shadow);scroll-margin-top:140px}
.card:target{outline:2px solid var(--accent)}
.card-top{display:flex;justify-content:space-between;align-items:start;gap:var(--s-3)}
.card .area-tag{font-size:var(--fs-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3)}
.card h3{margin-top:6px}
.card .addr{margin-top:4px;color:var(--ink-2);font-size:var(--fs-sm)}
.attrs{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--s-3);padding:0;list-style:none}
.attrs li{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-xs);font-weight:550;color:var(--accent-ink);background:var(--accent-tint);border-radius:var(--radius-pill);padding:4px 10px}
.attrs svg{width:14px;height:14px}
.card .next{padding-top:var(--s-3);margin-top:var(--s-4);border-top:1px solid var(--line)}
.pin-btn{flex:none;width:40px;height:40px;border-radius:50%;border:1px solid var(--line-2);background:var(--surface);display:grid;place-items:center;cursor:pointer;color:var(--ink-2)}
.pin-btn svg{width:18px;height:18px}
.empty{background:var(--surface);border-radius:var(--radius);padding:var(--s-6);text-align:center;color:var(--ink-2)}
.card.hide{display:none}

/* ---------- Guide (template C) ---------- */
.hills{display:grid;gap:var(--s-5);margin-top:var(--s-6)}
@media (min-width:860px){.hills{grid-template-columns:1fr 1fr;gap:var(--s-5)}}
.hill{background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);padding:var(--s-6) var(--s-5);scroll-margin-top:24px}
@media (min-width:768px){.hill{padding:var(--s-6)}}
.hill dl{margin:var(--s-5) 0 0;display:grid;grid-template-columns:auto 1fr;gap:var(--s-3) var(--s-4);font-size:var(--fs-sm)}
.hill dt{color:var(--ink-3);font-weight:500}
.hill dd{margin:0}
.chips-inline{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--s-4)}
.chips-inline span{font-size:var(--fs-xs);font-weight:600;padding:4px 10px;border-radius:var(--radius-pill);background:var(--accent-tint);color:var(--accent-ink)}
.hill h3{margin-top:6px;font-size:var(--fs-xl)}
.hill .addr{margin-top:4px;color:var(--ink-3);font-size:var(--fs-sm)}
.hill dd a{color:var(--accent-ink)}
.hill .more-link{display:inline-block;margin-top:var(--s-5);font-size:var(--fs-sm)}
.area-tag{font-size:var(--fs-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3)}

/* ---------- Additions for the production templates ---------- */
.vh{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.chip.area-select{padding-right:8px}
.chip select{font:inherit;border:0;background:none;color:inherit;padding:0 4px;max-width:180px;cursor:pointer}
.map-wrap{position:relative}
/* server-side OSM credit: shown until Leaflet adds its own attribution control, then hidden by app.js */
.map-attribution{position:absolute;right:0;bottom:0;z-index:1;margin:0;padding:0 5px;font-size:12px;line-height:1.5;color:#333;background:rgba(255,255,255,.8);border-top-left-radius:6px}
.map-attribution a{color:#0078a8}
.source .licence{grid-column:2}
.lede+.lede{margin-top:var(--s-3)}
.cta{display:inline-flex;align-items:center;gap:8px;margin-top:var(--s-5);font-weight:600;font-size:var(--fs-md);color:#fff;background:var(--accent);border-radius:var(--radius-pill);padding:10px 20px;min-height:44px;text-decoration:none}
.cta:hover{filter:brightness(1.08)}
.season-head .meta{max-width:var(--prose)}
.tile .when{max-width:32ch}
/* simple text pages: about, sources, errors */
.page h1{margin-top:var(--s-4)}
.page .lede{margin-top:var(--s-4);font-size:var(--fs-lg);line-height:1.5;color:var(--ink-2);max-width:var(--prose)}
.page>section{padding-top:var(--s-7)}
.src-list{display:grid;gap:var(--s-3);margin-top:var(--s-5);max-width:var(--prose)}
.src-card{background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);padding:var(--s-5)}
.src-card h3{font-size:var(--fs-md);line-height:1.35}
.src-card dl{margin:var(--s-4) 0 0;display:grid;grid-template-columns:auto 1fr;gap:var(--s-2) var(--s-4);font-size:var(--fs-sm)}
.src-card dt{color:var(--ink-3)}
.src-card dd{margin:0}
.section>h2+.tiles{margin-top:var(--s-5)}
.prose .sub{margin-top:var(--s-3)}
.page.err{padding-top:var(--s-8)}
/* fixes after looking at the screenshots */
.chip select{field-sizing:content;max-width:150px}
.source .licence a{color:var(--ink-3);text-decoration-color:var(--line-2)}
.next .nb{align-items:flex-start}
.next .nb svg{margin-top:4px}
main>.hero:first-child{padding-top:var(--s-7)}

/* ---------- Rules and FAQ ---------- */
.rules{margin-top:var(--s-5);display:grid;gap:var(--s-3);max-width:var(--prose);padding:0;list-style:none;counter-reset:r}
.rules li{background:var(--surface);border-radius:var(--radius-sm);padding:var(--s-4) var(--s-5) var(--s-4) 64px;position:relative;box-shadow:var(--shadow)}
.rules li::before{counter-increment:r;content:counter(r);position:absolute;left:var(--s-5);top:var(--s-4);width:28px;height:28px;border-radius:50%;background:var(--accent-tint);color:var(--accent-ink);font-weight:700;font-size:var(--fs-sm);display:grid;place-items:center}
.quote{margin:var(--s-5) 0 0;max-width:var(--prose);padding-left:var(--s-5);border-left:2px solid var(--line-2);color:var(--ink-2);font-size:var(--fs-md)}
.quote cite{display:block;margin-top:var(--s-2);font-style:normal;font-size:var(--fs-sm);color:var(--ink-3)}
.faq{margin-top:var(--s-5);max-width:var(--prose)}
.faq details{border-top:1px solid var(--line)}
.faq details:last-child{border-bottom:1px solid var(--line)}
.faq summary{cursor:pointer;list-style:none;padding:var(--s-5) 40px var(--s-5) 0;font-weight:600;font-size:var(--fs-lg);letter-spacing:-.01em;position:relative;line-height:1.35}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";position:absolute;right:4px;top:var(--s-5);font-weight:400;font-size:1.5rem;line-height:1;color:var(--ink-3)}
.faq details[open] summary::after{content:"–"}
.faq details p{padding-bottom:var(--s-5);color:var(--ink-2)}
.faq-src{font-size:var(--fs-sm);white-space:nowrap}
.faq span.faq-src{color:var(--ink-3)}
.rules-src{margin-top:var(--s-3)}

/* ---------- SEO fixes (Task 9b) ---------- */
h4{margin:0;line-height:var(--lh-tight);letter-spacing:-.01em;font-weight:650}
.district-h{margin-top:var(--s-8);font-size:var(--fs-xl);display:flex;align-items:baseline;gap:var(--s-3);flex-wrap:wrap;scroll-margin-top:24px}
.district-h .c{font-size:var(--fs-sm);font-weight:500;letter-spacing:0;color:var(--ink-3)}
.district-h+.hills{margin-top:var(--s-4)}
.hill h4{margin-top:6px;font-size:var(--fs-lg)}
.hill:target{outline:2px solid var(--accent)}
.hub-notes{margin-top:var(--s-6);display:grid;gap:var(--s-4)}
.hub-notes p{color:var(--ink-2);line-height:1.55}
.hub-notes a{color:var(--ink)}
.both-links{display:flex;flex-wrap:wrap;gap:var(--s-2) var(--s-5);margin-top:var(--s-4);font-size:var(--fs-sm);font-weight:600}
.both-links a{color:var(--accent-ink)}
.site-foot .ogl{margin-top:var(--s-2)}
.site-foot .ogl a{color:var(--ink-3)}
.used-on{display:flex;flex-wrap:wrap;gap:var(--s-2) var(--s-4)}
.src-note{margin-top:var(--s-4);font-size:var(--fs-sm);color:var(--ink-2)}

/* ---------- Route (rink and hill cards; ported from the prototype, Task 10) ---------- */
.actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s-2) var(--s-4);margin-top:var(--s-4)}
.route-btn{display:inline-flex;align-items:center;gap:8px;font:inherit;font-size:var(--fs-sm);font-weight:600;color:#fff;background:var(--accent);border:0;border-radius:var(--radius-pill);padding:10px 18px 10px 14px;min-height:44px;cursor:pointer}
.route-btn[hidden]{display:none}
.route-btn:hover{filter:brightness(1.08)}
.route-btn svg{width:18px;height:18px}
.transit{font-size:var(--fs-xs);color:var(--ink-3);text-decoration:underline;text-decoration-color:var(--line-2)}
.transit:hover{color:var(--ink-2)}
.hill .actions{margin-top:var(--s-5)}
.route{position:absolute;z-index:1001;top:16px;left:16px;width:340px;max-width:calc(100% - 32px);background:var(--surface);border-radius:var(--radius);box-shadow:0 4px 12px rgba(20,22,28,.08),0 18px 48px rgba(20,22,28,.16);padding:var(--s-4) var(--s-5) var(--s-5)}
.route[hidden]{display:none}
.route-head{display:flex;align-items:start;justify-content:space-between;gap:var(--s-3)}
.route-to{font-size:var(--fs-sm);color:var(--ink-2);line-height:1.4;padding-top:6px}
.route-to b{display:block;color:var(--ink);font-size:var(--fs-md);font-weight:650}
.route-x{flex:none;width:40px;height:40px;margin:-2px -10px 0 0;border:0;border-radius:50%;background:var(--bg);font-size:24px;line-height:1;color:var(--ink-2);cursor:pointer}
.route-x:hover{background:var(--line)}
.route-modes{display:flex;width:100%;margin-top:var(--s-3)}
.route-modes button{flex:1}
.route-body{margin-top:var(--s-4);min-height:64px}
.route-sum{display:flex;align-items:baseline;flex-wrap:wrap;gap:2px 12px}
.route-sum b{font-size:2rem;font-weight:700;letter-spacing:-.03em;line-height:1.1;color:var(--accent-ink)}
.route-sum span{font-size:var(--fs-md);color:var(--ink)}
.route-note{margin-top:6px;font-size:var(--fs-xs);color:var(--ink-3);line-height:1.45}
.route-state{display:flex;flex-direction:column;gap:4px;font-size:var(--fs-sm);color:var(--ink-2);line-height:1.45}
.route-state b{color:var(--ink);font-weight:600}
.route-state small{font-size:var(--fs-xs);color:var(--ink-3)}
.route-state:has(.spinner){flex-direction:row;flex-wrap:wrap;align-items:center;column-gap:10px}
.route-state:has(.spinner) small{flex-basis:100%;padding-left:28px}
.spinner{width:18px;height:18px;border-radius:50%;border:2px solid var(--accent-tint);border-top-color:var(--accent);animation:spin .8s linear infinite;flex:none}
@keyframes spin{to{transform:rotate(360deg)}}
.route-retry{margin-top:var(--s-3);font:inherit;font-size:var(--fs-sm);font-weight:600;color:var(--accent-ink);background:var(--accent-tint);border:0;border-radius:var(--radius-pill);padding:8px 16px;cursor:pointer}
.route-transit{display:inline-block;margin-top:var(--s-3);font-size:var(--fs-xs);color:var(--ink-3);text-decoration:underline;text-decoration-color:var(--line-2)}
.leaflet-tooltip.route-tip{background:#15171c;color:#fff;border:0;border-radius:6px;padding:2px 8px;font:600 12px/1.4 var(--font);box-shadow:none}
.leaflet-tooltip.route-tip::before{border-left-color:#15171c}
@media (max-width:959px){
  /* phone: a bottom sheet over the lower part of the map; the map is scrolled to the top of the viewport */
  .route{position:fixed;top:auto;left:0;right:0;bottom:0;width:auto;max-width:none;border-radius:var(--radius) var(--radius) 0 0;padding:var(--s-3) var(--gutter) calc(var(--s-4) + env(safe-area-inset-bottom));box-shadow:0 -8px 32px rgba(20,22,28,.14)}
  .route::before{content:"";display:block;width:36px;height:4px;border-radius:2px;background:var(--line-2);margin:0 auto var(--s-2)}
  .route-body{margin-top:var(--s-3);min-height:56px}
  body.routing{padding-bottom:260px}
  /* in route mode the map takes the whole screen above/below the sheet */
  body.routing .map-wrap .map{height:calc(100svh - 24px);max-height:none}
  body.routing .dir-map .map{height:calc(100svh - 140px)}
}

/* ---------- Pre-launch review 2026-10-28 (design/review-2026-10-28/REVIEW.md, "Should fix") ---------- */
/* hill cards: one value column for every card (auto made Washroom / TTC stop / Outdoor rink start at 3 x positions) */
.hill dl{grid-template-columns:6.5rem minmax(0,1fr)}
@media (min-width:768px){.hill dl{grid-template-columns:7.5rem minmax(0,1fr)}}
/* hub "Parks with both": compact cards, 4 across on desktop (the section carries season-winter for its links) */
.both-parks{grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}
.both-parks .hill{padding:var(--s-4) var(--s-5)}
.both-parks .hill h3{margin-top:0;font-size:var(--fs-lg)}

/* ---------- Feedback form (/feedback/; design/feedback/SPEC.md) ---------- */
.form-card{margin-top:var(--s-6);max-width:var(--prose);background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);padding:var(--s-5);scroll-margin-top:var(--s-4)}
@media (min-width:768px){.form-card{padding:var(--s-6)}}
.field label{display:block;font-weight:600;font-size:var(--fs-md)}
.field .hint{display:block;margin-top:2px;font-size:var(--fs-sm);color:var(--ink-3)}
.field textarea{display:block;width:100%;margin-top:var(--s-3);min-height:168px;resize:vertical;font:inherit;font-size:var(--fs-md);line-height:1.5;color:var(--ink);background:var(--bg);border:1px solid var(--line-2);border-radius:var(--radius-sm);padding:var(--s-3) var(--s-4)}
.field textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-tint);background:var(--surface)}
.field textarea[aria-invalid="true"]{border-color:var(--danger);background:var(--surface)}
.field-error{display:flex;gap:8px;margin-top:var(--s-2);font-size:var(--fs-sm);font-weight:550;color:var(--danger)}
.field-error::before{content:"!";flex:none;width:18px;height:18px;margin-top:2px;border-radius:50%;background:var(--danger);color:#fff;font-size:12px;font-weight:700;display:grid;place-items:center}
.form-about{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 8px;margin-bottom:var(--s-4);font-size:var(--fs-sm);color:var(--ink-2)}
.form-about b{font-weight:600;color:var(--ink)}
.form-alert{margin-bottom:var(--s-4);padding:var(--s-3) var(--s-4);border-radius:var(--radius-sm);background:var(--danger-tint);color:#8f2525;font-size:var(--fs-sm);line-height:1.45}
.form-alert b{display:block;color:#7a1f1f;font-size:var(--fs-md)}
.form-foot{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s-3) var(--s-4);margin-top:var(--s-5)}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font:inherit;font-weight:600;font-size:var(--fs-md);color:#fff;background:var(--accent);border:0;border-radius:var(--radius-pill);padding:10px 28px;min-height:48px;cursor:pointer}
.btn:hover{filter:brightness(1.08)}
.form-note{font-size:var(--fs-sm);color:var(--ink-3);max-width:40ch}
.count{margin-left:auto;font-size:var(--fs-xs);color:var(--ink-3);font-variant-numeric:tabular-nums}
.count.over{color:var(--danger);font-weight:600}
.sent{margin-top:var(--s-6);max-width:var(--prose);background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);border-left:4px solid var(--summer);padding:var(--s-5);scroll-margin-top:var(--s-4)}
@media (min-width:768px){.sent{padding:var(--s-6) var(--s-7)}}
.sent h2{display:flex;align-items:center;gap:12px;font-size:var(--fs-xl)}
.sent h2::before{content:"";flex:none;width:28px;height:28px;border-radius:50%;background:var(--summer-tint) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230d6b45' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center/16px no-repeat}
.sent p{margin-top:var(--s-3);color:var(--ink-2)}
.sent .both-links{margin-top:var(--s-5)}

/* ---------- Map higher, source line at the end (design/review-2026-10-28/MAP-HIGHER.md) ---------- */
/* the map / filter bar follows the hero at 32 px, not the section rhythm */
.hero+.map-sec{padding-top:var(--s-6)}
.dir{margin-top:var(--s-6)}
/* filter bar: one row, chips left, count right; the count wraps under the chips, right-aligned, when it does not fit */
.filterbar{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s-2) var(--s-3)}
.filterbar .chips{min-width:0}
.filterbar .count{margin-left:auto;font-size:var(--fs-sm);color:var(--ink-2);white-space:nowrap}
.filterbar .count output{font-weight:600;color:var(--ink)}
.filterbar .count .linkbtn::before{content:"·";display:inline-block;margin-right:.35em;color:var(--ink-3)}
/* the page's own footnote: source, "next to it" data, feedback link */
.page-src{padding-top:var(--s-7)}
.page-src .source{margin-top:0;border-top:1px solid var(--line);padding-top:var(--s-5)}

/* ---------- Full-screen map (design/review-2026-10-28/MAP-FULLSCREEN.md) ---------- */
/* one overlay for both cases: with the Fullscreen API the wrap is also the browser's full-screen element */
.map-wrap.map-full{position:fixed;inset:0;z-index:2000;background:#e9eae6}
.map-wrap.map-full .map,
body.routing .map-wrap.map-full .map{height:100%;max-height:none;min-height:0;border-radius:0;box-shadow:none}
.map-wrap:fullscreen{width:100%;height:100%}
/* scroll lock; app.js sets top:-scrollY and scrolls back on exit (iOS ignores overflow:hidden alone) */
body.map-full-open{overflow:hidden;position:fixed;width:100%}
/* the rinks desktop map column is sticky (its own stacking context): lift it over the sticky filter bar */
.dir-map:has(.map-full){z-index:2000}
.map-full .leaflet-top.leaflet-right{top:env(safe-area-inset-top);right:env(safe-area-inset-right)}
.map-full-btn svg{width:18px;height:18px;margin:auto;color:#15171c}
.leaflet-bar a.map-full-btn{display:grid;place-items:center}
/* touch screens: the whole right column is 40 px, our minimum tap target (Leaflet marks every modern browser
   .leaflet-touch, so the pointer query decides; .map-wrap outranks leaflet.css, which loads after this file) */
@media (pointer:coarse){.map-wrap .leaflet-touch .leaflet-bar a{width:40px;height:40px;line-height:40px}}
.map-full-pill{position:absolute;z-index:1000;top:max(12px,env(safe-area-inset-top));left:12px;display:flex;gap:8px;align-items:center;background:var(--surface);border-radius:var(--radius-pill);box-shadow:var(--shadow);padding:6px 14px;font-size:var(--fs-sm);color:var(--ink-2)}
