/* Shell · footer. A night band that closes every page the same way in both themes: statement, the state's connected towns, sections and credit.
 * Pure CSS motion (aurora, scan beam, signal routes, ticker, shimmer, spinning borders); app.js adds only the reveal, the clock, the pointer light and «back to top».
 * Every animation is off under prefers-reduced-motion and paused while the footer is off screen. Tokens only; no inline styles (production CSP). */
@property --ft-angle{syntax:"<angle>";inherits:false;initial-value:0deg}
.site-footer{
 --color-ink:oklch(95.5% .012 215);--color-muted:oklch(77% .025 225);--color-subtle:oklch(66% .028 228);--color-rule:oklch(32% .032 240);--color-rule-strong:oklch(53% .04 232);
 --color-accent:oklch(83% .13 188);--color-accent-ink:oklch(19% .04 230);--color-accent-soft:oklch(29% .06 200);--color-accent-line:oklch(64% .11 192);--color-accent-strong:oklch(88% .12 186);
 --color-soft:oklch(23.5% .032 244);--color-surface:oklch(19.5% .028 246);--color-raised:oklch(26.5% .035 242);--color-focus:oklch(89% .14 95);--color-grid:oklch(70% .06 215 / .075);
 --color-hover:oklch(95% .012 215 / .05);--color-press:oklch(95% .012 215 / .09);--color-selected:oklch(83% .13 188 / .12);--color-rim:oklch(96% .02 205 / .075);
 --shadow-1:0 1px 2px oklch(6% .02 250 / .45);--ft-night:oklch(12% .022 250);--ft-deep:oklch(16% .03 248);
 position:relative;margin-top:var(--space-4xl);padding:var(--space-3xl) 0 calc(var(--space-xl) + var(--app-bar-h,0px) + 48px);border-top:1px solid var(--color-rule);background:linear-gradient(180deg,var(--ft-deep),var(--ft-night));color:var(--color-ink);color-scheme:dark;isolation:isolate;overflow:clip}
.site-footer .logo-light{display:none}.site-footer .logo-dark{display:block}
.site-footer .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
.site-footer :is(a,button):focus-visible{outline:3px solid var(--color-focus);outline-offset:3px;border-radius:6px}
/* Background: aurora, survey grid with a scan beam, a travelling edge light and a pointer glow. */
.ft-bg{position:absolute;inset:0;z-index:-1;overflow:hidden;pointer-events:none}
.ft-aurora{position:absolute;border-radius:50%;filter:blur(90px);will-change:transform}
.ft-aurora-a{left:-14%;top:-30%;width:58vmax;height:58vmax;background:oklch(66% .14 205);opacity:.26}
.ft-aurora-b{right:-18%;top:6%;width:52vmax;height:52vmax;background:oklch(50% .17 268);opacity:.3}
.ft-aurora-c{left:30%;bottom:-40%;width:44vmax;height:30vmax;background:oklch(78% .11 82);opacity:.1}
.ft-grid{position:absolute;inset:0;background:linear-gradient(90deg,var(--color-grid) 1px,transparent 1px) 0 0/64px 64px,linear-gradient(0deg,var(--color-grid) 1px,transparent 1px) 0 0/64px 64px;-webkit-mask-image:linear-gradient(180deg,oklch(0% 0 0),transparent 82%);mask-image:linear-gradient(180deg,oklch(0% 0 0),transparent 82%)}
.ft-grid:after{content:"";position:absolute;inset:0;width:26%;background:linear-gradient(90deg,transparent,oklch(83% .13 188 / .16),transparent)}
.ft-beam{position:absolute;top:-1px;left:0;width:34%;height:2px;background:linear-gradient(90deg,transparent,var(--color-accent),transparent);filter:drop-shadow(0 0 8px var(--color-accent))}
.ft-spot{position:absolute;inset:0;background:radial-gradient(540px circle at var(--mx,50%) var(--my,28%),oklch(83% .13 188 / .11),transparent 62%);opacity:0;transition:opacity .5s var(--ease-out)}
.site-footer[data-hover] .ft-spot{opacity:1}
/* Statement */
.ft-hero{position:relative;display:grid;min-height:clamp(300px,42vw,420px);padding-bottom:var(--space-2xl)}
.ft-statement{position:relative;z-index:1;display:grid;align-content:start;justify-items:start;gap:var(--space-md);max-width:min(100%,40rem)}
.ft-kicker{display:inline-flex;align-items:center;gap:10px;margin:0;padding:6px 14px 6px 12px;border:1px solid var(--color-rule);border-radius:var(--radius-pill);background:oklch(19.5% .028 246 / .6);font:500 var(--text-xs)/1.3 var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-muted)}
.ft-live{position:relative;flex:none;width:8px;height:8px;border-radius:50%;background:var(--color-accent)}
.ft-live:after{content:"";position:absolute;inset:0;border-radius:50%;background:inherit}
.ft-title{margin:0;max-width:11ch;font-family:var(--font-display);font-size:clamp(2.7rem,7.4vw,6rem);font-weight:600;line-height:.96;letter-spacing:-.058em;text-wrap:balance;background:linear-gradient(100deg,var(--color-ink) 0%,var(--color-ink) 36%,var(--color-accent) 50%,var(--color-ink) 64%,var(--color-ink) 100%) 0 0/280% 100%;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}
.ft-lede{max-width:46ch;margin:0;font-size:var(--text-md);line-height:1.6;color:var(--color-muted)}
.ft-cta{position:relative;display:flex;align-items:center;gap:var(--space-md);max-width:34rem;margin-top:var(--space-sm);padding:14px 14px 14px 22px;border-radius:24px;background:linear-gradient(135deg,oklch(26% .045 232 / .78),oklch(19% .03 248 / .78));-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:var(--color-ink);text-decoration:none;overflow:hidden;box-shadow:0 30px 60px -36px var(--color-accent),inset 0 1px 0 var(--color-rim);transition:transform var(--dur-short) var(--ease-out),box-shadow var(--dur-short) var(--ease-out)}
.ft-cta:before,.ft-built:before{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;background:conic-gradient(from var(--ft-angle),var(--color-rule) 0 56%,var(--color-accent) 78%,var(--color-rule) 100%);-webkit-mask:linear-gradient(oklch(0% 0 0) 0 0) content-box,linear-gradient(oklch(0% 0 0) 0 0);-webkit-mask-composite:xor;mask:linear-gradient(oklch(0% 0 0) 0 0) content-box,linear-gradient(oklch(0% 0 0) 0 0);mask-composite:exclude;pointer-events:none}
.ft-cta:after{content:"";position:absolute;inset:0;background:linear-gradient(115deg,transparent 30%,oklch(100% 0 0 / .14) 48%,transparent 66%);transform:translateX(-130%);pointer-events:none}
.ft-cta-copy{display:grid;gap:3px;min-width:0;flex:1}.ft-cta-copy strong{font:600 var(--text-md)/1.3 var(--font-display);letter-spacing:-.02em}.ft-cta-copy small{font-size:var(--text-sm);line-height:1.5;color:var(--color-muted)}
.ft-cta-go{display:grid;place-items:center;flex:none;width:48px;height:48px;border-radius:50%;background:var(--color-accent);color:var(--color-accent-ink);transition:transform var(--dur-short) var(--ease-out)}
.ft-cta-go svg,.ft-top svg,.ft-clock svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* The state's connected towns */
.ft-net{position:absolute;right:-4%;top:-8px;height:calc(100% + 8px);max-height:470px;width:auto;aspect-ratio:620/1000;opacity:.3;pointer-events:none;overflow:visible}
.ft-net pattern circle{fill:var(--color-accent);opacity:.34}
.ft-net-coast{fill:none;stroke:var(--color-accent);stroke-opacity:.5;stroke-width:1.3;stroke-dasharray:2 5;stroke-linecap:round;vector-effect:non-scaling-stroke}
.ft-route{fill:none;stroke:var(--color-accent);stroke-opacity:.85;stroke-width:1.7;stroke-dasharray:5 9;stroke-linecap:round;vector-effect:non-scaling-stroke}
.ft-node-dot{fill:var(--color-accent)}
.ft-node-ring{fill:none;stroke:var(--color-accent);stroke-width:1.4;transform-box:fill-box;transform-origin:center;vector-effect:non-scaling-stroke}
.ft-node.is-hub .ft-node-dot{fill:var(--color-ink)}.ft-node.is-hub .ft-node-ring{stroke:var(--color-ink)}
.ft-node-name{fill:var(--color-muted);font:500 26px var(--font-mono);letter-spacing:.04em;paint-order:stroke;stroke:var(--ft-night);stroke-width:8px;stroke-linejoin:round}
.ft-ticker{position:relative;overflow:hidden;padding-block:16px;border-block:1px solid var(--color-rule);-webkit-mask-image:linear-gradient(90deg,transparent,oklch(0% 0 0) 12%,oklch(0% 0 0) 88%,transparent);mask-image:linear-gradient(90deg,transparent,oklch(0% 0 0) 12%,oklch(0% 0 0) 88%,transparent)}
.ft-track{display:flex;width:max-content}.ft-track ul{display:flex;margin:0;padding:0;list-style:none}
.ft-track li{display:flex;align-items:center;white-space:nowrap;font:500 var(--text-xs)/1 var(--font-mono);letter-spacing:.16em;text-transform:uppercase;color:var(--color-subtle)}
.ft-track li:after{content:"";width:5px;height:5px;margin-inline:30px;border-radius:50%;background:var(--color-accent);box-shadow:0 0 12px var(--color-accent);opacity:.75}
/* Brand, status, credit and navigation */
.ft-main{display:grid;gap:var(--space-2xl);padding-block:var(--space-2xl)}
.ft-brand{display:grid;align-content:start;justify-items:start;gap:var(--space-md)}
.ft-brand .brand img{width:min(235px,64vw);height:auto}
.ft-status{display:flex;flex-wrap:wrap;gap:8px;margin:0;padding:0;list-style:none}
.ft-pill{display:inline-flex;align-items:center;gap:8px;min-height:34px;padding:0 14px 0 12px;border:1px solid var(--color-rule);border-radius:var(--radius-pill);background:oklch(19.5% .028 246 / .6);font:500 var(--text-xs)/1 var(--font-mono);letter-spacing:.04em;color:var(--color-muted)}
.ft-pill[hidden]{display:none}.ft-pill svg{width:15px;height:15px;stroke-width:1.8;color:var(--color-accent)}.ft-pill time{color:var(--color-ink);font-variant-numeric:tabular-nums}
.ft-built{position:relative;display:inline-flex;flex-direction:column;align-items:flex-start;gap:8px;width:fit-content;margin-top:var(--space-xs);padding:14px 22px 14px 18px;border-radius:20px;background:linear-gradient(135deg,oklch(14% .02 250),oklch(21% .035 82 / .55));color:var(--color-ink);text-decoration:none;overflow:hidden;box-shadow:0 26px 50px -34px oklch(78% .11 82),inset 0 1px 0 var(--color-rim);transition:transform var(--dur-short) var(--ease-out),box-shadow var(--dur-short) var(--ease-out)}
.ft-built:before{background:conic-gradient(from var(--ft-angle),var(--color-rule) 0 50%,oklch(80% .11 82) 76%,var(--color-rule) 100%)}
.ft-built:after{content:"";position:absolute;inset:0;background:linear-gradient(115deg,transparent 34%,oklch(100% 0 0 / .13) 50%,transparent 66%);transform:translateX(-130%);pointer-events:none}
.ft-built-text{font:500 .625rem/1 var(--font-mono);letter-spacing:.24em;text-transform:uppercase;color:oklch(75% .025 225)}
.ft-built img{display:block;width:150px;height:auto;max-width:100%}
.ft-nav{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-xl) var(--space-lg)}
.footer-group{display:grid;align-content:start;gap:2px;min-width:0}
.footer-group h2{display:flex;align-items:center;gap:10px;margin:0 0 var(--space-sm);font:500 var(--text-xs)/1.4 var(--font-mono);letter-spacing:var(--tracking-label);text-transform:uppercase;color:var(--color-subtle)}
.footer-group h2:before{content:"";width:18px;height:2px;border-radius:2px;background:linear-gradient(90deg,var(--color-accent),transparent)}
.ft-nav a{position:relative;display:flex;align-items:center;width:fit-content;max-width:100%;min-height:40px;color:var(--color-muted);font-size:var(--text-sm);text-decoration:none;white-space:nowrap;transition:color var(--dur-short) var(--ease-out),transform var(--dur-short) var(--ease-out)}
.ft-nav a:before{content:"";position:absolute;left:0;right:0;bottom:7px;height:1px;background:linear-gradient(90deg,var(--color-accent),transparent);transform:scaleX(0);transform-origin:left;transition:transform .4s var(--ease-out)}
.local-admin-entry{display:inline-flex;align-items:center;min-height:var(--tap);font-size:var(--text-xs);color:var(--color-subtle)}
.ft-bottom{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm) var(--space-lg);justify-content:space-between;padding-top:var(--space-lg);border-top:1px solid var(--color-rule);color:var(--color-muted);font:400 var(--text-xs)/1.4 var(--font-mono);letter-spacing:.02em}
.ft-tagline{background:linear-gradient(90deg,var(--color-muted),var(--color-accent),var(--color-muted)) 0 0/200% 100%;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}
.ft-top{display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:0 16px 0 12px;border:1px solid var(--color-rule-strong);border-radius:var(--radius-pill);background:var(--color-surface);color:var(--color-ink);font:600 var(--text-xs)/1 var(--font-body);cursor:pointer;transition:transform var(--dur-short) var(--ease-out),border-color var(--dur-fast) var(--ease-out),background-color var(--dur-fast) var(--ease-out)}
.ft-top[hidden]{display:none}.ft-top svg{width:18px;height:18px;color:var(--color-accent)}
.site-footer .measurement-settings{margin-top:var(--space-md)}
@media(min-width:40rem){.ft-nav{grid-template-columns:repeat(3,minmax(0,1fr))}.ft-net{opacity:.7}}
@media(min-width:60rem){.ft-main{grid-template-columns:minmax(0,1fr) minmax(0,1.9fr);align-items:start}.ft-statement{max-width:min(58%,40rem)}.ft-net{right:3%;max-height:500px;opacity:.95}.ft-hero{min-height:440px}}
/* Hover (fine pointers only) */
@media(hover:hover){
 .ft-cta:hover{transform:translateY(-2px);box-shadow:0 40px 70px -34px var(--color-accent),inset 0 1px 0 var(--color-rim)}.ft-cta:hover:after,.ft-built:hover:after{transform:translateX(130%);transition:transform .9s var(--ease-out)}.ft-cta:hover .ft-cta-go{transform:translateX(4px) scale(1.04)}
 .ft-built:hover{transform:translateY(-2px);box-shadow:0 34px 60px -32px oklch(78% .11 82),inset 0 1px 0 var(--color-rim)}
 .ft-nav a:hover{color:var(--color-ink);transform:translateX(5px)}.ft-nav a:hover:before{transform:scaleX(1)}
 .ft-top:hover{transform:translateY(-2px);border-color:var(--color-accent);background:var(--color-accent-soft)}
 .ft-ticker:hover .ft-track{animation-play-state:paused}
}
/* Motion */
@media(prefers-reduced-motion:no-preference){
 .ft-aurora-a{animation:ft-drift-a 26s ease-in-out infinite alternate}.ft-aurora-b{animation:ft-drift-b 31s ease-in-out infinite alternate}.ft-aurora-c{animation:ft-drift-c 22s ease-in-out infinite alternate}
 .ft-grid:after{animation:ft-scan 12s linear infinite}.ft-beam{animation:ft-travel 8s cubic-bezier(.4,0,.2,1) infinite}
 .ft-live:after{animation:ft-ping 2.2s ease-out infinite}
 .ft-title{animation:ft-shimmer 10s ease-in-out infinite}.ft-tagline{animation:ft-shimmer-x 7s linear infinite}
 .ft-cta:before,.ft-built:before{animation:ft-spin 6s linear infinite}
 .ft-route{animation:ft-flow 3.4s linear infinite}
 .ft-node-ring{animation:ft-ring 4s ease-out infinite}.ft-node:nth-of-type(3n+2) .ft-node-ring{animation-delay:-1.3s}.ft-node:nth-of-type(3n) .ft-node-ring{animation-delay:-2.6s}.ft-node.is-hub .ft-node-ring{animation-duration:2.6s}
 .ft-track{animation:ft-marquee 52s linear infinite}
 /* Armed by app.js: parts rise in once, then everything pauses while the footer is off screen. */
 .site-footer[data-armed]:not([data-in]) :is(.ft-statement>*,.ft-net,.ft-ticker,.ft-brand>*,.footer-group,.ft-bottom){opacity:0;transform:translateY(22px)}
 .site-footer[data-armed] :is(.ft-statement>*,.ft-net,.ft-ticker,.ft-brand>*,.footer-group,.ft-bottom){transition:opacity .9s var(--ease-out),transform .9s var(--ease-out);transition-delay:calc(var(--i,0) * 90ms)}
 .site-footer[data-armed] :is(.ft-statement>*,.ft-brand>*,.footer-group):nth-child(2){--i:1}.site-footer[data-armed] :is(.ft-statement>*,.ft-brand>*,.footer-group):nth-child(3){--i:2}.site-footer[data-armed] :is(.ft-statement>*,.ft-brand>*,.footer-group):nth-child(4){--i:3}.site-footer[data-armed] .ft-net{--i:2}.site-footer[data-armed] .ft-ticker{--i:3}
 .site-footer[data-armed]:not([data-in]) :is(.ft-aurora,.ft-grid:after,.ft-beam,.ft-route,.ft-node-ring,.ft-track,.ft-cta:before,.ft-built:before,.ft-title,.ft-tagline,.ft-live:after){animation-play-state:paused}
 @keyframes ft-drift-a{to{transform:translate3d(10%,14%,0) scale(1.14)}}@keyframes ft-drift-b{to{transform:translate3d(-12%,10%,0) scale(.9)}}@keyframes ft-drift-c{to{transform:translate3d(14%,-8%,0) scale(1.2)}}
 @keyframes ft-scan{from{transform:translateX(-110%)}to{transform:translateX(460%)}}@keyframes ft-travel{0%{transform:translateX(-100%)}100%{transform:translateX(300%)}}
 @keyframes ft-ping{0%{transform:scale(1);opacity:.7}80%,100%{transform:scale(3.2);opacity:0}}
 @keyframes ft-shimmer{0%,100%{background-position:100% 0}50%{background-position:0 0}}@keyframes ft-shimmer-x{to{background-position:200% 0}}
 @keyframes ft-spin{to{--ft-angle:360deg}}@keyframes ft-flow{to{stroke-dashoffset:-56}}
 @keyframes ft-ring{0%{transform:scale(.5);opacity:.95}100%{transform:scale(2.6);opacity:0}}@keyframes ft-marquee{to{transform:translateX(-50%)}}
}
@media(prefers-reduced-motion:reduce){.ft-spot{display:none}.ft-track{width:100%;overflow:hidden}.ft-track ul:last-child{display:none}.ft-title{background-position:0 0}}
@media(forced-colors:active){.ft-title,.ft-tagline{background:none;-webkit-text-fill-color:currentColor;color:CanvasText}.ft-cta:before,.ft-built:before{display:none}.ft-cta,.ft-built{border:1px solid CanvasText}}
/* The assistant button floats over the bottom-right corner: keep the last row clear of it. */
@media(min-width:48rem){.ft-bottom{padding-right:96px}}
