/* ===========================================================================
   FULL FOOTER (templates/partials/footer-full.php) — inner pages. The homepage keeps the slim strip.
   A band as wide as the page frame, with the site grid running through it:
     left  "Synchronized." (its full stop is the live network light) and the two actions;
     right the live network panel; a sync line ticked at every grid square; the site map; copyright and legal.
   Light theme: a pale blue band, just off white. Dark theme: a navy a shade lighter than the page; dark theme: a deep navy band. Same layout and grid either way; colours are the --ft-* tokens below.
   =========================================================================== */
.ft {
  --ft-pad: var(--u, 60px);
  /* Light theme: a pale blue band, just off white. Dark theme: a navy a shade lighter than the page on the page grid. Dark theme (below): the deep navy band. */
  --ft-bg: #f6f9fe; --ft-ink: #0a2341; --ft-body: #34465e; --ft-mute: #5f6f84;
  --ft-line: rgba(10, 35, 65, .12); --ft-line2: rgba(10, 35, 65, .2); --ft-acc: #1f5fd1; --ft-tint: rgba(31, 95, 209, .07);
  --ft-ok: #138a4b; --ft-maint: #1f5fd1; --ft-slow: #b7791f; --ft-part: #c2410c; --ft-down: #b42318;
  --ft-grid: rgba(10, 35, 65, .045); --ft-glow: rgba(112, 175, 233, .08); --ft-pulse: #1f5fd1; --ft-panel-bg: #ffffff;
  --ft-solid: #0a2341; --ft-solid-ink: #ffffff; --ft-solid-hover: #1f5fd1; --ft-solid-hover-ink: #ffffff; --ft-cap: none;   /* one line only: the page panel's own edge */
  position: relative; z-index: 2; flex: none; overflow: hidden;
  margin: 0 var(--fr, 120px) 0 var(--fl, 120px);
  color: var(--ft-body); font-size: 14px;
  background-color: var(--ft-bg);
  background-image: linear-gradient(var(--ft-grid) 1px, transparent 1px), linear-gradient(90deg, var(--ft-grid) 1px, transparent 1px); box-shadow: var(--ft-cap);
  background-size: var(--u, 60px) var(--u, 60px); background-position: 0 0;   /* the footer box starts on a grid corner, so its grid carries on the page grid line for line */
}
html[data-theme="dark"] .ft { --ft-bg: #0a2341; --ft-ink: #f2f6fa; --ft-body: rgba(232, 240, 248, .78); --ft-mute: rgba(214, 226, 238, .58); --ft-line: rgba(255, 255, 255, .12); --ft-line2: rgba(255, 255, 255, .2); --ft-acc: #70afe9; --ft-tint: rgba(112, 175, 233, .1); --ft-ok: #4fd18b; --ft-maint: #70afe9; --ft-slow: #f2c14e; --ft-part: #f59e4b; --ft-down: #ff7b6e; --ft-grid: rgba(255, 255, 255, .045); --ft-glow: rgba(112, 175, 233, .16); --ft-pulse: #cfe6fb; --ft-panel-bg: rgba(3, 13, 28, .38); --ft-solid: #fff; --ft-solid-ink: #0a2341; --ft-solid-hover: #70afe9; --ft-solid-hover-ink: #0a2341; --ft-bg: #0d2848; --ft-glow: rgba(112, 175, 233, .09); --ft-panel-bg: rgba(10, 35, 65, .55); }
@media (prefers-color-scheme: dark) { html[data-theme="auto"] .ft { --ft-bg: #0a2341; --ft-ink: #f2f6fa; --ft-body: rgba(232, 240, 248, .78); --ft-mute: rgba(214, 226, 238, .58); --ft-line: rgba(255, 255, 255, .12); --ft-line2: rgba(255, 255, 255, .2); --ft-acc: #70afe9; --ft-tint: rgba(112, 175, 233, .1); --ft-ok: #4fd18b; --ft-maint: #70afe9; --ft-slow: #f2c14e; --ft-part: #f59e4b; --ft-down: #ff7b6e; --ft-grid: rgba(255, 255, 255, .045); --ft-glow: rgba(112, 175, 233, .16); --ft-pulse: #cfe6fb; --ft-panel-bg: rgba(3, 13, 28, .38); --ft-solid: #fff; --ft-solid-ink: #0a2341; --ft-solid-hover: #70afe9; --ft-solid-hover-ink: #0a2341; --ft-bg: #0d2848; --ft-glow: rgba(112, 175, 233, .09); --ft-panel-bg: rgba(10, 35, 65, .55); } }
/* The footer sits right under the page panel: no spacer, no empty "Powered by" strip in between. */
body:has(> .ft) > .panel-gap, body:has(> .ft) > .sc-home.is-off { display: none; }
.ft a { color: inherit; text-decoration: none; }
.ft a:focus-visible { outline: 2px solid var(--ft-acc); outline-offset: 3px; }
.ft .is-ok, .ft .is-beta { --c: var(--ft-ok); }
.ft .is-maintenance { --c: var(--ft-maint); }
.ft .is-degraded { --c: var(--ft-slow); }
.ft .is-partial { --c: var(--ft-part); }
.ft .is-major { --c: var(--ft-down); }
/* A soft light behind the slogan, like a lit panel */
.ft::before { content: ""; position: absolute; top: -40%; left: -10%; width: 70%; height: 90%; background: radial-gradient(closest-side, var(--ft-glow), transparent); pointer-events: none; }
.ft > * { position: relative; }

/* ---- 1. Synchronized. + live network ---- */
.ft-hero { display: grid; grid-template-columns: minmax(0, 1fr) calc(var(--u, 60px) * 6); align-items: start; gap: 40px var(--ft-pad); padding: var(--ft-pad) var(--ft-pad) var(--u, 60px); }
/* Lines that sit on the page grid (site.js "Full footer" makes each block a whole number of squares). */
.ft-hero, .ft-panel, .ft-map, .ft-bottom { box-sizing: border-box; }
.ft-say { display: flex; flex-direction: column; justify-content: center; }
.ft-slogan { margin: 0; white-space: nowrap; font-size: 84px; font-weight: 500; line-height: .95; letter-spacing: -.05em; color: var(--ft-ink); }
.ft-stop { display: inline-block; width: .15em; height: .15em; margin-left: .05em; overflow: hidden; color: transparent; background: var(--c); }
.ft-stop.is-ok, .ft-stop.is-beta { animation: ft-beat 2.4s ease-in-out infinite; }
@keyframes ft-beat { 0%, 100% { box-shadow: 0 0 0 0 transparent, 0 0 0 0 transparent; } 50% { box-shadow: 0 0 0 .05em color-mix(in srgb, var(--c) 25%, transparent), 0 0 .5em color-mix(in srgb, var(--c) 45%, transparent); } }
.ft-line { max-width: 36ch; margin: 22px 0 0; font-size: 17px; line-height: 27px; color: var(--ft-body); }
.ft-acts { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 30px; }
.ft-btn { display: inline-flex; align-items: center; gap: 9px; height: 46px; padding: 0 18px; border: 1px solid var(--ft-line2); font-size: 14px; font-weight: 600; color: var(--ft-ink) !important; transition: border-color .15s ease, background-color .15s ease, color .15s ease; }
.ft-btn:hover { border-color: var(--ft-acc); background: var(--ft-tint); }
.ft-btn.is-solid { border-color: var(--ft-solid); background: var(--ft-solid); color: var(--ft-solid-ink) !important; }
.ft-btn.is-solid:hover { border-color: var(--ft-solid-hover); background: var(--ft-solid-hover); color: var(--ft-solid-hover-ink) !important; }
.ft-btn svg { transition: transform .2s ease; }
.ft-btn.is-solid:hover svg { transform: translateX(3px); }

.ft-panel { position: relative; z-index: 2; align-self: start; min-width: 0; display: flex; flex-direction: column; border: 1px solid var(--ft-line2); background: var(--ft-panel-bg); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.ft-panelhead { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 12px; box-sizing: border-box; height: var(--u, 60px); padding: 0 16px; border-bottom: 1px solid var(--ft-line); transition: background-color .15s ease; }
.ft-panelhead:hover { background: var(--ft-tint); }
.ft-lamp { position: relative; width: 10px; height: 10px; background: var(--c); }
.ft-lamp::after { content: ""; position: absolute; inset: 0; background: var(--c); animation: ft-ping 2.4s ease-out infinite; }
@keyframes ft-ping { from { opacity: .55; transform: scale(1); } to { opacity: 0; transform: scale(2.8); } }
.ft-ph { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ft-ph b { font-size: 14px; font-weight: 600; color: var(--ft-ink); }
.ft-ph small { font-family: "JetBrains Mono", monospace; font-size: 10.5px; color: var(--ft-mute); }
.ft-more { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; color: var(--ft-acc); white-space: nowrap; }
.ft-more svg { transition: transform .2s ease; }
.ft-panelhead:hover .ft-more svg { transform: translateX(3px); }
.ft-rows { flex: 1; display: flex; flex-direction: column; justify-content: space-evenly; list-style: none; margin: 0; padding: 6px 0; }
.ft-rows li { display: grid; grid-template-columns: 8px minmax(0, 1fr) auto auto; align-items: center; gap: 12px; padding: 7px 16px; }
.ft-rows i { width: 7px; height: 7px; background: var(--c); }
.ft-rows b { overflow: hidden; font-size: 13.5px; font-weight: 500; color: var(--ft-ink); white-space: nowrap; text-overflow: ellipsis; }
.ft-rows span { font-size: 12px; color: var(--ft-mute); }
.ft-rows li:not(.is-ok):not(.is-beta) span { color: var(--c); }
.ft-rows code { min-width: 64px; font-family: "JetBrains Mono", monospace; font-size: 12px; text-align: right; color: var(--ft-body); }
.ft-panelfoot { display: flex; justify-content: space-between; margin: 0; padding: 9px 16px; font-family: "JetBrains Mono", monospace; font-size: 10.5px; color: var(--ft-mute); }

/* The sync line: a tick at every grid square, and a pulse travelling along it. */
.ft-sync { position: relative; height: 13px; margin: -6px var(--ft-pad) -7px;   /* its rule sits exactly on the grid line where the hero ends */
  overflow: visible; color: var(--ft-acc); }
.ft-sync::before { content: ""; position: absolute; inset: 0; background: linear-gradient(currentColor, currentColor) 0 6px / 100% 1px no-repeat, repeating-linear-gradient(90deg, currentColor 0 1px, transparent 1px var(--u, 60px)) 0 0 / 100% 13px no-repeat; opacity: .5; }
/* The sync signal (drawn by site.js, "Full footer"): two dots lead two waves in opposite phase, one up while the
   other is down, eight grid squares per wavelength, the peaks touching the grid lines one square above and below. They travel along the line leaving a long fading tail, ease into
   each end and turn back; a bright yellow pace-setter on the line itself leads them, with its own tail, and pulls them along like gravity
   (a faint glow and rings falling into it hint at the field). */
/* The sync signal rides the sync line (placed by site.js). */
.ft-orbit { position: absolute; z-index: 1; height: 0; pointer-events: none; opacity: .9; }
/* Calm at rest: the tracking read-outs and the log fade in only while the pointer is over the footer. */
.ft-wave .ft-trk, .ft-wave .ft-v:not(.ft-v-sync), .ft-wave .ft-log { transition: opacity .45s ease; }
.ft:not(.is-tracking) .ft-wave .ft-trk, .ft:not(.is-tracking) .ft-wave .ft-v:not(.ft-v-sync), .ft:not(.is-tracking) .ft-wave .ft-log { opacity: 0; }
.ft.no-readouts .ft-wave .ft-trk, .ft.no-readouts .ft-wave .ft-v:not(.ft-v-sync), .ft.no-readouts .ft-wave .ft-log { display: none; }
.ft-wave { position: absolute; left: 0; top: -62px; width: 100%; height: 124px; overflow: visible; pointer-events: none; }   /* height and top set by site.js: one grid square above and below the line */
.ft-wave path { fill: none; stroke-width: 1.8; stroke-linecap: butt; stroke-linejoin: round; }   /* butt ends: the tail pieces join without overlapping */
.ft-wave-a { stroke: var(--ft-acc); }
.ft-wave-b { stroke: var(--ft-pulse); }
.ft-dot { stroke: none; }
.ft-wave .ft-lead { stroke: var(--ft-sun, #ffd23f); stroke-width: 2.6; stroke-linecap: butt; filter: drop-shadow(0 0 3px var(--ft-sun, #ffd23f)); }
.ft-wave .ft-ring { fill: none; stroke: var(--ft-sun, #ffd23f); stroke-width: 1; }
.ft-wave .ft-grav { stroke: none; }
.ft-wave .ft-v { font-family: "JetBrains Mono", ui-monospace, monospace; font-size: 8.5px; letter-spacing: .08em; font-variant-numeric: tabular-nums; stroke: none; opacity: .9; white-space: pre; }
.ft-wave .ft-trk { fill: none; stroke-width: 1; opacity: .7; }
.ft-trk-y { stroke: #e0a800; }
html[data-theme="dark"] .ft-trk-y { stroke: #ffd23f; }
@media (prefers-color-scheme: dark) { html[data-theme="auto"] .ft-trk-y { stroke: #ffd23f; } }
.ft-trk-a { stroke: var(--ft-acc); }
.ft-trk-b { stroke: var(--ft-mute); }
.ft-v-y { fill: #e0a800; }
html[data-theme="dark"] .ft-v-y { fill: #ffd23f; }
@media (prefers-color-scheme: dark) { html[data-theme="auto"] .ft-v-y { fill: #ffd23f; } }
.ft-v-a { fill: var(--ft-acc); }
.ft-v-b { fill: var(--ft-mute); }
.ft-dot-y { fill: #fff3b0; filter: drop-shadow(0 0 5px var(--ft-sun, #ffd23f)) drop-shadow(0 0 2px var(--ft-sun, #ffd23f)); }
.ft-wave .ft-cell { fill: var(--ft-acc); stroke: none; opacity: 0; }
.ft-wave .ft-mem { opacity: .2; }   /* just a trace */
.ft-wave .ft-burst { fill: none; stroke: var(--ft-sun, #ffd23f); stroke-width: 1.2; }
.ft-wave .ft-ripple { stroke: var(--ft-acc); }
.ft-v-sync { fill: var(--ft-sun, #e0a800); font-weight: 700; letter-spacing: .3em; }
.ft-v-g, .ft-v-log { fill: var(--ft-mute); }
.ft-wave .ft-v-tag { font-size: 7.5px; opacity: .75; }
.ft-wave .ft-v-syncrow { font-weight: 700; letter-spacing: .1em; }
.ft-wave .ft-v-syncno { font-size: 7px; font-weight: 500; }
.ft-wave .ft-grp { fill: none; stroke: #b98900; stroke-width: 1.1; stroke-linejoin: round; }
html[data-theme="dark"] .ft-wave .ft-grp { stroke: var(--ft-sun, #ffd23f); }
@media (prefers-color-scheme: dark) { html[data-theme="auto"] .ft-wave .ft-grp { stroke: var(--ft-sun, #ffd23f); } }
.ft-wave .ft-v-syncrow { fill: #b98900; }
html[data-theme="dark"] .ft-wave .ft-v-syncrow { fill: var(--ft-sun, #ffd23f); }
@media (prefers-color-scheme: dark) { html[data-theme="auto"] .ft-wave .ft-v-syncrow { fill: var(--ft-sun, #ffd23f); } }
.ft-wave .ft-v-chain { fill: var(--ft-acc); font-weight: 700; letter-spacing: .32em; }
.ft-trk-g { stroke: var(--ft-mute); }
.ft-wave .ft-cross { fill: none; stroke: var(--ft-mute); stroke-width: .6; stroke-dasharray: 2 4; opacity: .45; }
.ft-wave text { pointer-events: none; }
.ft-dot-a { fill: var(--ft-acc); filter: drop-shadow(0 0 4px var(--ft-acc)); }
.ft-dot-b { fill: var(--ft-pulse); filter: drop-shadow(0 0 4px var(--ft-pulse)); }

/* ---- 2. Site map ---- */
.ft-map { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 36px 24px; padding: var(--u, 60px) var(--ft-pad) 56px; }   /* the six menus in one row, the same width each; the menus start one square below the sync line, the same distance as the status panel sits above it */
.ft-h { margin: 0 0 14px; font-family: "JetBrains Mono", monospace; font-size: 11px; letter-spacing: .06em; color: var(--ft-acc); }
.ft-map ul { list-style: none; margin: 0; padding: 0; }
.ft-map li + li { margin-top: 2px; }
.ft-map a { position: relative; display: inline-block; padding: 5px 0; font-size: 13.5px; line-height: 19px; color: var(--ft-body); transition: color .15s ease, transform .2s cubic-bezier(.2, .8, .2, 1); }
.ft-map a::before { content: ""; position: absolute; left: -14px; top: 50%; width: 6px; height: 1.5px; background: var(--ft-acc); opacity: 0; transform: translateX(-4px); transition: opacity .15s ease, transform .2s cubic-bezier(.2, .8, .2, 1); }
.ft-map a:hover { color: var(--ft-ink); transform: translateX(4px); }
.ft-map a:hover::before { opacity: 1; transform: none; }
.ft-map a[aria-current="page"] { color: var(--ft-ink); font-weight: 600; }
.ft-grp { min-width: 0; }

/* ---- 3. Bottom bar ---- */
.ft-bottom { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 28px; min-height: var(--u, 60px); padding: 12px var(--ft-pad); border-top: 1px solid var(--ft-line); font-size: 13px; color: var(--ft-mute); }
.ft-copy { flex: 1; }
.ft-legal { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 28px; }
.ft-bottom a { color: var(--ft-mute); transition: color .15s ease; }
.ft-bottom a:hover { color: var(--ft-ink); }
.ft-bottom a[aria-current="page"] { color: var(--ft-ink); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 4px; }
.ft-up-link { display: inline-flex; align-items: center; gap: 6px; }
.ft-up-link svg { transition: transform .2s ease; }
.ft-up-link:hover svg { transform: translateY(-3px); }

/* ---- Narrower screens ---- */
@media (max-width: 1240px) {
  .ft-slogan { font-size: 70px; }
}
@media (max-width: 1100px) {
  .ft-slogan { font-size: 58px; }
}
@media (max-width: 1020px) {
  .ft { margin: 0 var(--fr, 24px) 0 var(--fl, 24px); }
  .ft-hero { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 640px) {
  .ft-slogan { font-size: 46px; }
  .ft-line { font-size: 15px; line-height: 24px; }
  .ft-rows li { grid-template-columns: 8px minmax(0, 1fr) auto; }
  .ft-rows span { display: none; }
  .ft-panelhead { height: calc(var(--u, 44px) * 2); }   /* two grid squares: the state wraps on a phone */
  .ft-map { padding-top: var(--u, 44px); padding-bottom: 36px; }
  .ft-map a:hover { transform: none; }
  .ft-bottom { flex-direction: column; align-items: flex-start; padding-top: 16px; padding-bottom: 18px; }
}
@media (prefers-reduced-motion: reduce) {
  .ft *, .ft *::before, .ft *::after { animation: none !important; transition: none !important; }
  .ft-wave { display: none; }
}

/* The slim strip (homepage): a live dot on Status */
.ftr-status { display: inline-flex; align-items: center; gap: 8px; }
.ftr-dot { width: 7px; height: 7px; border-radius: 50%; background: #138a4b; box-shadow: 0 0 0 3px color-mix(in srgb, #138a4b 18%, transparent); }
.ftr-dot.is-maintenance { background: #1f5fd1; box-shadow: 0 0 0 3px rgba(31, 95, 209, .18); }
.ftr-dot.is-degraded { background: #b7791f; box-shadow: 0 0 0 3px rgba(183, 121, 31, .18); }
.ftr-dot.is-partial { background: #c2410c; box-shadow: 0 0 0 3px rgba(194, 65, 12, .18); }
.ftr-dot.is-major { background: #b42318; box-shadow: 0 0 0 3px rgba(180, 35, 24, .18); }

/* Phones: no tracking read-outs (they would print over the first menu headings); the moving line stays. */
@media (max-width: 640px) {
  .ft-wave .ft-trk, .ft-wave .ft-v, .ft-wave .ft-log { display: none !important; }
}
/* Site map: six menus in a row on a computer, four on a tablet or narrow window, two on a phone. Each wraps
   in reading order: Get online, Run servers, Analytics, Media, Solutions, Company. */
@media (max-width: 1100px) { .ft-map { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 640px) { .ft-map { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px 16px; } .ft-map a { font-size: 14px; } }
/* Touch screens: no tracking read-outs on the sync line (they follow a mouse pointer and would print over the menus). */
@media (hover: none) {
  .ft-wave .ft-trk, .ft-wave .ft-v, .ft-wave .ft-log { display: none !important; }
}
/* Tablets and phones: the footer's text starts on the same line as the page text above it (the body's own inset). */
@media (max-width: 1020px) { .ft { --ft-pad: 24px; } .ft-map { padding-left: var(--ft-pad); padding-right: var(--ft-pad); } }
@media (max-width: 500px) { .ft { --ft-pad: 20px; } }
/* Sideways phones and tablets: like a computer — "Synchronized." and its buttons on the left, the network status
   panel on the right. */
@media (min-width: 641px) and (max-width: 1020px) and (orientation: landscape) {
  .ft-hero { grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); align-items: start; column-gap: 28px; }
  .ft-slogan { font-size: clamp(40px, 5.6vw, 56px); }
  .ft-line { font-size: 15px; line-height: 24px; }
  .ft-rows li { padding: 6px 14px; gap: 10px; }
}
.ft-bottom.is-private { margin-top: var(--u, 60px); }   /* private funding pages: one grid square between the sync line and the bottom row (CEO, 4 Nov 2026) */
