/* GENERATED by build/build.py from build/additions/portal.css, a copy for the hand-built home (sync_home.py links it). Do not edit this file: edit build/additions/ and run the build. */
/* ---- additions/portal.css ---- */
/* portal: the website portal (2026-10-23). The footer's visit-code line, the first-visit notice, the "Sent. Your code is"
   panel, the extra fields on Enquire and Book a visit, and the question helper (launcher + panel). Also linked alone by
   the home (site/css/portal.css), which loads no pages.css: every rule here stands on main.css's tokens only.
   Tokens only; 44 px targets; motion only through the site's own durations, none under reduced motion. */

[data-portal-only][hidden] { display: none !important; }
:root { --gold-light: rgb(241, 221, 109); /* the brand's light gold (F1DD6D): main.css has no token for it, so it is set here, where the crest, the robot's face and the focus ring use it */ --pp-actions-h: 0px; --pp-hero-offset: 0px; --pp-mono: ui-monospace, 'SFMono-Regular', 'Cascadia Mono', Consolas, 'Liberation Mono', monospace; --ppc-visor-y: 30%; /* the lit visor of assets/chat/assistant.png sits at 30 % of its height (rows 96-98 of 320) */ }

/* ---- the honeypot: never seen, never focused ---- */
.pp-hp { position: absolute !important; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden; }

/* ---- footer: "Your visit code: V-7K3Q9M" ---- */
.foot__visit {
  flex-basis: 100%;
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 18px;
  margin-top: 4px; padding-top: 16px; border-top: 1px solid var(--night-line);
  font: 400 14px / 1.5 var(--font-sans); color: var(--bone-dim);
}
.foot__visit[hidden] { display: none; }
.foot__visit-code { font: 500 15px / 1 var(--pp-mono); letter-spacing: 0.06em; color: var(--paper); }
.foot__visit-btn {
  min-height: 44px; padding: 0; border: 0; background: none; cursor: pointer;
  font: 500 14px / 1.2 var(--font-sans); color: var(--gold-text);
  text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px;
}
.foot__visit-btn:hover { color: var(--paper); }
.foot__visit-more { display: inline-flex; align-items: center; min-height: 44px; font-size: 14px; }
.foot__bottom .foot__visit-more { color: var(--bone-dim); }

/* ---- first-visit notice: small card, bottom left, never a wall ---- */
.pp-notice {
  position: fixed; z-index: 61;
  left: 16px; right: 88px; bottom: calc(16px + var(--pp-actions-h, 0px));
  max-width: 360px;
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 16px;
  padding: 14px 16px 10px;
  background: var(--paper-3); color: var(--ink);
  border: 1px solid var(--clay); border-radius: 6px;
  box-shadow: 0 18px 40px -24px rgba(28, 23, 21, 0.45);
  font: 400 14px / 1.5 var(--font-sans);
  transition: bottom var(--t-ui) var(--ease-out);
}
.pp-notice__text { flex: 1 1 220px; margin: 0; }
.pp-notice__more { color: var(--ink); }
.pp-notice__close {
  min-height: 44px; min-width: 44px; padding: 0 12px; margin-left: auto;
  border: 1px solid var(--ink); border-radius: 999px; background: transparent; color: var(--ink);
  font: 500 14px / 1 var(--font-sans); cursor: pointer;
}
.pp-notice__close:hover { color: var(--maroon); border-color: var(--maroon); }
@media (min-width: 600px) { .pp-notice { right: auto; } }

/* ---- "Sent. Your code is" ---- */
.pp-code {
  margin-top: 24px; padding: 22px 22px 18px;
  background: var(--paper-3); color: var(--ink);
  border: 1px solid var(--clay); border-left: 3px solid var(--gold); border-radius: 4px;
  max-width: 40rem;
}
.pp-code__h { margin: 0; font: 400 clamp(20px, 2vw, 24px) / 1.2 var(--font-serif); color: var(--ink); }
.pp-code__h:focus { outline: none; }
.pp-code__h:focus-visible { outline: 2px solid var(--maroon); outline-offset: 3px; }
.pp-code__code {
  margin: 10px 0 14px; font: 500 clamp(30px, 6vw, 44px) / 1.05 var(--pp-mono); letter-spacing: 0.08em; color: var(--ink);
  overflow-wrap: anywhere; user-select: all;
}
.pp-code__copy {
  display: inline-flex; align-items: center; justify-content: center; min-height: 44px; padding: 0 18px;
  border: 1px solid var(--ink); border-radius: 999px; background: transparent; color: var(--ink);
  font: 500 14px / 1 var(--font-sans); cursor: pointer;
}
.pp-code__copy:hover { color: var(--maroon); border-color: var(--maroon); }
.pp-code__keep { margin: 14px 0 0; font: 400 16px / 1.5 var(--font-serif); color: var(--ink); }
.pp-code__line { margin: 10px 0 0; font: 400 15px / 1.5 var(--font-sans); color: var(--ink-2); }
.pp-code__line .link, .pp-lines__tel { color: var(--ink); font-weight: 500; }
.pp-code__small { margin: 14px 0 0; padding-top: 10px; border-top: var(--hairline); font: 400 13px / 1.45 var(--font-sans); color: var(--ink-2); }

/* the three section lines (fallbacks and the code panel) */
.pp-lines { list-style: none; margin: 8px 0 0; padding: 0; }
.pp-lines__row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0 12px; min-height: 44px; border-bottom: var(--hairline); font: 400 14px / 1.3 var(--font-sans); }
.pp-lines__row:last-child { border-bottom: 0; }
.pp-lines__who { color: var(--ink-2); }
.pp-lines__tel { display: inline-flex; align-items: center; min-height: 44px; text-decoration: underline; text-underline-offset: 4px; }

/* ---- Enquire and Book a visit: the extra questions ---- */
.page-form__consent { margin: 4px 0 22px; padding: 0; border: 0; }
.page-form__consent legend { margin-bottom: 4px; }
.page-form__checks { display: flex; flex-wrap: wrap; gap: 0 28px; }
.page-form__when { margin: 4px 0 22px; padding: 0; border: 0; }
.page-form__when legend { margin-bottom: 10px; }
.page-form__when .form-row { margin-bottom: 0; }
.form-notice .pp-fail { margin-bottom: 8px; font-weight: 500; color: var(--maroon); }

/* ---- the question helper: the Admissions Desk launcher (2026-10-23 v3, figure edition, no face) ----
   A maroon pill with a gold-ringed crest, a title and a status line. The crest holds the assistant figure (a robot
   bust, /assets/chat/assistant.png) once the launcher has drawn it (.has-fig); until then it is the gold "P" monogram.
   On arrival it fades in once, a gold sheen crosses the crest once, the halo breathes once and the visor pulses once;
   after ~4.8 s nothing moves until the visitor acts (one window of motion under the 5 s line of WCAG 2.2.2). Under
   reduced motion it simply appears. The figure file is opaque (no alpha), so the halo is blended above it with screen:
   it brightens the dark ground around the bust and leaves the bust itself as it is. */
.ppc-launch {
  position: fixed; z-index: 62;
  right: 16px; bottom: calc(16px + var(--pp-actions-h, 0px) + var(--pp-hero-offset, 0px));
  display: inline-flex; align-items: center; gap: 10px;
  height: 56px; padding: 0 18px 0 4px; max-width: calc(100vw - 32px);
  border: 1px solid rgba(200, 155, 60, 0.55); border-radius: 28px;
  background: linear-gradient(180deg, var(--maroon) 0%, var(--maroon-deep) 100%);
  box-shadow: inset 0 0 0 1px rgba(217, 178, 92, 0.22), 0 8px 24px -8px rgba(20, 17, 16, 0.45);
  color: var(--paper); text-align: left; cursor: pointer;
  animation: ppc-enter 0.45s ease-out 0.15s backwards;
  transition: bottom var(--t-ui) var(--ease-out), border-color 0.16s ease, box-shadow 0.16s ease, transform 0.16s ease;
  -webkit-tap-highlight-color: transparent;
}
.ppc-launch:hover, .ppc-launch:focus-visible { transform: translateY(-2px); border-color: var(--gold); box-shadow: inset 0 0 0 1px rgba(217, 178, 92, 0.35), 0 12px 28px -8px rgba(20, 17, 16, 0.55); }
.ppc-launch:active { transform: scale(0.985); }
/* two-tone focus ring: night outside (15:1 on the paper pages) and gold-light inside (7:1 on the maroon pill) */
.ppc-launch:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; box-shadow: 0 0 0 2px var(--gold-light), inset 0 0 0 1px rgba(217, 178, 92, 0.35), 0 12px 28px -8px rgba(20, 17, 16, 0.55); }
/* the crest: a fixed 48 px box whatever it holds, so the pill never shifts. Layers, bottom to top: figure or monogram (1),
   halo (2, screen-blended above the opaque figure), visor light (2, later in the DOM), ring (3), sheen (::after) and the
   thinking arc (::before). */
.ppc-crest { position: relative; flex: none; width: 48px; height: 48px; border-radius: 50%; display: block; overflow: hidden; background: radial-gradient(circle at 50% 35%, var(--maroon-deep) 0%, var(--night) 100%); }
.ppc-crest__ring { position: absolute; inset: 0; display: block; width: 100%; height: 100%; transform-origin: 50% 50%; z-index: 3; }
.ppc-crest__halo { position: absolute; inset: 6px; border-radius: 50%; display: block; background: var(--gold); filter: blur(7px); opacity: 0.2; z-index: 2; mix-blend-mode: screen; pointer-events: none; animation: ppc-halo 4.2s ease-in-out 0.6s 1; transition: opacity 0.3s ease; } /* ends at 4.8 s */
.ppc-crest__fig { position: absolute; inset: 0; width: 100%; height: 100%; display: block; opacity: 0; pointer-events: none; object-fit: cover; object-position: 50% 18%; z-index: 1; } /* kept in layout (not display:none) so a lazy image still loads */
.ppc-crest__mono { position: absolute; inset: 0; display: grid; place-items: center; font: 400 22px / 1 var(--font-serif); color: var(--gold-light); letter-spacing: 0.02em; z-index: 1; }
.ppc-crest__visor { position: absolute; left: 50%; top: var(--ppc-visor-y, 30%); width: 14px; height: 3px; margin-left: -7px; margin-top: -1px; border-radius: 2px; display: block; background: var(--gold-light); filter: blur(0.6px); mix-blend-mode: screen; opacity: 0; z-index: 2; pointer-events: none; }
.ppc-launch.has-fig .ppc-crest__fig { opacity: 1; }
.ppc-launch.has-fig .ppc-crest__mono { display: none; }
.ppc-launch.has-fig .ppc-crest__visor { opacity: 0.35; animation: ppc-visor 3.2s ease-in-out 0.8s 1; }
.ppc-launch:hover .ppc-crest__halo, .ppc-launch:focus-visible .ppc-crest__halo { opacity: 0.4; }
.ppc-launch.has-fig.is-thinking .ppc-crest__visor { animation: ppc-visor 1.4s ease-in-out infinite; } /* only while a request the visitor sent is in flight, max 8 s (fetch abort) */
.ppc-crest::after { /* one finite gold sheen on first appearance */
  content: ""; position: absolute; inset: 0; display: block; pointer-events: none; z-index: 4;
  background: linear-gradient(115deg, transparent 35%, rgba(241, 221, 109, 0.45) 50%, transparent 65%);
  transform: translateX(-100%); animation: ppc-sheen 1.4s ease-in-out 0.7s 1 forwards;
}
.ppc-crest__lamp { position: absolute; right: 3px; top: 3px; width: 7px; height: 7px; border-radius: 50%; display: block; z-index: 5; background: var(--gold-light); box-shadow: 0 0 0 1.5px var(--maroon-deep), 0 0 6px rgba(241, 221, 109, 0.8); }
.ppc-launch__text { display: flex; flex-direction: column; min-width: 0; line-height: 1.15; }
.ppc-launch__title { font: 600 14px / 1.15 var(--font-sans); color: var(--paper); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ppc-launch__title--short { display: none; }
.ppc-launch__status { margin-top: 2px; font: 500 11px / 1.2 var(--font-sans); letter-spacing: 0.03em; color: var(--gold-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ppc-launch.is-pulse .ppc-crest__ring { animation: ppc-ringpulse 1.2s ease-out 1; }
.ppc-launch.is-thinking .ppc-crest::before {
  content: ""; position: absolute; inset: 1px; border-radius: 50%; display: block; z-index: 4;
  border: 1.5px solid transparent; border-top-color: var(--gold-light);
  animation: ppc-arc 1.1s linear infinite; /* only while a request the visitor started is in flight; at most 8 s (fetch abort) */
}
@keyframes ppc-enter { from { opacity: 0; transform: translateY(8px); } }
@keyframes ppc-sheen { to { transform: translateX(100%); } }
@keyframes ppc-ringpulse { 0% { opacity: 1; transform: scale(1); } 50% { opacity: 0.55; transform: scale(1.06); } 100% { opacity: 1; transform: scale(1); } }
@keyframes ppc-arc { to { transform: rotate(360deg); } }
@keyframes ppc-halo { 0%, 100% { opacity: 0.2; } 50% { opacity: 0.34; } }
@keyframes ppc-visor { 0%, 100% { opacity: 0.35; } 50% { opacity: 0.75; } }
/* phones: a shorter pill with the short title only */
@media (max-width: 479px) {
  .ppc-launch { height: 48px; padding: 0 14px 0 4px; gap: 8px; border-radius: 24px; }
  .ppc-crest { width: 40px; height: 40px; }
  .ppc-crest__halo { inset: 5px; }
  .ppc-crest__mono { font-size: 18px; }
  .ppc-crest__visor { width: 12px; height: 2.5px; margin-left: -6px; }
  .ppc-crest__lamp { width: 6px; height: 6px; right: 2px; top: 2px; }
  .ppc-launch__title { display: none; }
  .ppc-launch__title--short { display: block; }
  .ppc-launch__status { display: none; }
}
/* while the first-visit notice shows on a narrow screen, the pill folds to its crest so the two never overlap */
@media (max-width: 679px) {
  html.pp-noticed .ppc-launch__text { display: none; }
  html.pp-noticed .ppc-launch { padding-right: 4px; gap: 0; }
  html.pp-noticed .ppc-launch:not(.has-robot) { padding-left: 4px; }
}

/* ---- the live robot (2026-10-23 v4, robot edition) ----
   The founder's robot stands in a 96 px slot at the pill's left end (72 px on phones); its head and a "?" bubble peek
   above the pill's top edge. The pill grows its left padding so the text starts after the slot; the v3 crest stays in
   the flow (faded out) so nothing reflows and it is the fallback when the robot file is missing. The face (eyes, smile,
   thinking dots) is an SVG laid over the blank glass; blink, float, bob and the curious nudge are CSS animations on
   transforms and opacity only; the pointer tilt comes from --rx/--ry set by the script. Everything is aria-hidden.
   Layout: slot 96 at left 2 / bottom 2 → head top ≈ 36 px above the pill, base inside the pill. */
.ppc-launch { overflow: visible; }
.ppc-launch.has-robot { padding-left: 42px; transition: bottom var(--t-ui) var(--ease-out), border-color 0.16s ease, box-shadow 0.16s ease, transform 0.16s ease, padding-left 0.24s ease; } /* 42 + crest 48 + gap 10 = text at 100 */
.ppc-launch.has-robot .ppc-crest { opacity: 0; transition: opacity 0.2s ease; } /* kept in the flow: no reflow, still the fallback */
.ppc-bot {
  position: absolute; left: 2px; bottom: 2px; width: 96px; height: 96px; display: block; z-index: 2;
  perspective: 320px; pointer-events: none; /* only the head's hit disc and the bubble take the pointer (below) */
  --rx: 0deg; --ry: 0deg; --rz: 0deg; --ex: 0; --ey: 0; --sx: 0px;
  animation: ppc-bot-in 0.52s cubic-bezier(0.34, 1.56, 0.64, 1) 0.2s backwards;
}
.ppc-bot__shadow {
  position: absolute; left: 20%; right: 20%; bottom: 1px; height: 8px; border-radius: 50%; display: block;
  background: radial-gradient(50% 50% at 50% 50%, rgba(20, 17, 16, 0.45), rgba(20, 17, 16, 0) 70%);
  animation: ppc-shadow 3.6s ease-in-out infinite;
}
.ppc-bot__float { position: absolute; inset: 0; display: block; animation: ppc-float 3.6s ease-in-out infinite; }
.ppc-bot__tilt {
  position: absolute; inset: 0; display: block; transform-style: preserve-3d; transform-origin: 50% 100%;
  transform: rotateX(var(--rx)) rotateY(var(--ry)); rotate: var(--rz);
  transition: transform 0.16s ease-out, rotate 0.32s cubic-bezier(0.34, 1.56, 0.64, 1), scale 0.24s ease;
}
.ppc-launch.has-robot .ppc-bot__tilt { animation: ppc-wobble 0.9s ease-in-out 0.7s 1; } /* one hello on arrival */
.ppc-bot__pic, .ppc-bot__img { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
.ppc-bot__img { object-fit: contain; filter: drop-shadow(0 6px 6px rgba(20, 17, 16, 0.28)); }
/* the hit disc: a transparent circle over the head (the image's head spans x 6-93 %, y 4-72 %), so the empty corners
   of the slot and the air above the head take no click and no hover; the bust stands inside the pill, which is the
   button itself. Clicks and hover bubble up to the <button>. */
.ppc-bot__hit { position: absolute; left: 5%; top: 2%; width: 90%; height: 74%; border-radius: 50%; display: block; pointer-events: auto; }
.ppc-bot__bubble { pointer-events: auto; }
/* the face */
.ppc-bot__face {
  position: absolute; inset: 0; width: 100%; height: 100%; display: block; overflow: visible;
  filter: drop-shadow(0 0 1.5px rgba(241, 221, 109, 0.9)) drop-shadow(0 0 4px rgba(217, 178, 92, 0.55));
}
.ppc-bot__eyes { transform: translate(calc(var(--ex, 0) * 1px), calc(var(--ey, 0) * 1px)); transition: transform 0.16s ease-out; }
.ppc-bot__eye { transform-box: fill-box; transform-origin: 50% 50%; transition: transform 0.2s ease; }
.ppc-bot__eye-h, .ppc-bot__smile { fill: none; stroke: var(--gold-light); stroke-linecap: round; stroke-width: 2.4; }
.ppc-bot__face pattern circle { fill: var(--gold-light); } /* the LED dots */
.ppc-bot__eye-o:first-child { fill: var(--gold-text); } /* the soft underlay below the dots */
.ppc-bot__smile { stroke-width: 2.2; transform-box: fill-box; transform-origin: 50% 50%; transition: transform 0.2s ease, opacity 0.12s ease; }
.ppc-bot__eye-h { opacity: 0; transition: opacity 0.12s ease; }
.ppc-bot__eye-o { transition: opacity 0.12s ease; }
.ppc-bot__think { fill: var(--gold-light); opacity: 0; transition: opacity 0.12s ease; }
.ppc-bot__think circle { animation: ppc-scan 1.1s ease-in-out infinite; animation-play-state: paused; }
.ppc-bot__think circle:nth-child(2) { animation-delay: 0.18s; }
.ppc-bot__think circle:nth-child(3) { animation-delay: 0.36s; }
.is-blink .ppc-bot__eye { animation: ppc-blink 0.16s ease-in-out 1; }
/* hover and keyboard focus: ^ ^ and a wider smile. Hover only on a real hover device: on touch screens :hover sticks
   after a tap, so the face would stay squinting until the next tap elsewhere. */
.ppc-launch:focus-visible .ppc-bot__eye-o { opacity: 0; }
.ppc-launch:focus-visible .ppc-bot__eye-h { opacity: 1; }
.ppc-launch:focus-visible .ppc-bot__smile { transform: scaleX(1.12); }
@media (hover: hover) {
  .ppc-launch:hover .ppc-bot__eye-o { opacity: 0; }
  .ppc-launch:hover .ppc-bot__eye-h { opacity: 1; }
  .ppc-launch:hover .ppc-bot__smile { transform: scaleX(1.12); }
}
/* curious (every 12-15 s, 1.4 s): one eye bigger, a small head tilt, the bubble nudges */
.ppc-launch.is-curious .ppc-bot__eye--r { transform: scale(1.18); }
.ppc-launch.is-curious .ppc-bot__eye--l { transform: scale(0.92); }
.ppc-launch.is-curious .ppc-bot { --rz: -6deg; }
/* thinking: three scanning dots replace the face, only while a request the visitor sent is in flight (max 8 s) */
.ppc-launch.is-thinking .ppc-bot__eyes, .ppc-launch.is-thinking .ppc-bot__smile { opacity: 0; }
.ppc-launch.is-thinking .ppc-bot__think { opacity: 1; }
.ppc-launch.is-thinking .ppc-bot__think circle { animation-play-state: running; }
/* the glass sheen slides a little against the tilt */
.ppc-bot__sheen {
  position: absolute; left: 18.24%; top: 18.36%; width: 63.53%; height: 43.74%; display: block;
  border-radius: 30% / 40%; pointer-events: none; mix-blend-mode: screen;
  background: linear-gradient(160deg, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0.06) 32%, transparent 48%);
  transform: translateX(var(--sx, 0px)); transition: transform 0.16s ease-out;
}
/* the "?" bubble on top of the head; "Ask me" on hover / focus (fine pointers only) */
.ppc-bot__bubble {
  position: absolute; left: 60%; top: -14px; height: 26px; width: 26px; min-width: 26px; padding: 0;
  border-radius: 13px; border: 1.5px solid var(--gold); background: var(--paper); color: var(--maroon);
  box-shadow: 0 4px 10px -4px rgba(20, 17, 16, 0.5); display: grid; place-items: center; white-space: nowrap;
  font: 400 17px / 1 var(--font-serif); transform-origin: 20% 100%;
  animation: ppc-pop 0.48s cubic-bezier(0.34, 1.56, 0.64, 1) 0.9s backwards, ppc-bob 2.8s ease-in-out 1.4s infinite;
  transition: width 0.2s ease, opacity 0.2s ease;
}
.ppc-bot__tail { position: absolute; left: 7px; bottom: -4.5px; width: 7px; height: 7px; display: block; background: var(--paper); border-right: 1.5px solid var(--gold); border-bottom: 1.5px solid var(--gold); transform: rotate(45deg); }
.ppc-bot__bubble-q { display: block; padding-bottom: 1px; }
.ppc-bot__bubble-a { display: none; font: 600 11px / 1 var(--font-sans); letter-spacing: 0.04em; color: var(--maroon); animation: ppc-fade 0.16s ease 0.1s backwards; }
.ppc-launch:focus-visible .ppc-bot__bubble { width: 62px; }
.ppc-launch:focus-visible .ppc-bot__bubble-q { display: none; }
.ppc-launch:focus-visible .ppc-bot__bubble-a { display: block; }
@media (hover: hover) {
  .ppc-launch:hover .ppc-bot__bubble { width: 62px; }
  .ppc-launch:hover .ppc-bot__bubble-q { display: none; }
  .ppc-launch:hover .ppc-bot__bubble-a { display: block; }
}
/* the nudge is appended to the list (pop and bob keep their places), so they carry on instead of replaying */
.ppc-launch.is-curious .ppc-bot__bubble { animation: ppc-pop 0.48s cubic-bezier(0.34, 1.56, 0.64, 1) 0.9s backwards, ppc-bob 2.8s ease-in-out 1.4s infinite, ppc-nudge 0.9s ease-in-out 1; }
/* while the panel is open the robot sits down into the pill (96 × .56 ≈ 54 px) and the bubble and shadow go */
html.ppc-open .ppc-bot__tilt { scale: 0.56; }
html.ppc-open .ppc-bot__bubble, html.ppc-open .ppc-bot__shadow { opacity: 0; transition: opacity 0.2s ease; }
/* .is-still: the script's "stopped" state (panel open, tab hidden, reduced motion). The pure loops (float, shadow) and
   the class-driven blink are cleared; the bubble and the head carry one-shots too (pop, wobble), so those two are PAUSED
   instead: a finished one-shot keeps its end state and never replays when the class comes off again (close, alt-tab,
   the motion switch), while the bob loop freezes and resumes. */
.ppc-launch.is-still .ppc-bot__float, .ppc-launch.is-still .ppc-bot__shadow, .ppc-launch.is-still .ppc-bot__eye { animation: none; }
.ppc-launch.is-still .ppc-bot__bubble, .ppc-launch.is-still .ppc-bot__tilt { animation-play-state: paused; }
@keyframes ppc-bot-in { from { opacity: 0; transform: translateY(14px) scale(0.8); } }
@keyframes ppc-wobble { 0%, 100% { rotate: 0deg; } 25% { rotate: -6deg; } 55% { rotate: 5deg; } 80% { rotate: -2deg; } }
@keyframes ppc-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-2.5px); } }
@keyframes ppc-shadow { 0%, 100% { transform: scaleX(1); opacity: 1; } 50% { transform: scaleX(0.9); opacity: 0.7; } }
@keyframes ppc-blink { 0%, 100% { transform: scaleY(1); } 45% { transform: scaleY(0.08); } }
@keyframes ppc-pop { from { transform: scale(0); opacity: 0; } }
@keyframes ppc-bob { 0%, 100% { translate: 0 0; } 50% { translate: 0 -3px; } }
@keyframes ppc-nudge { 0%, 100% { scale: 1; rotate: 0deg; } 30% { scale: 1.18; rotate: -8deg; } 60% { scale: 1.08; rotate: 6deg; } }
@keyframes ppc-scan { 0%, 100% { opacity: 0.25; } 50% { opacity: 1; } }
@keyframes ppc-fade { from { opacity: 0; } }
/* the medallions (teaser card, panel header) show the robot's head: the image box is nudged down so the head
   centre lands near the circle's centre; the face box matches it so the face map still lines up */
.ppc-tease__fig__img.is-robot, .ppc__fig__img.is-robot { object-fit: contain; width: 104%; height: 104%; left: -2%; top: 14%; }
.ppc-tease__fig__face, .ppc__fig__face { position: absolute; inset: auto; width: 104%; height: 104%; left: -2%; top: 14%; z-index: 1; filter: drop-shadow(0 0 1.5px rgba(241, 221, 109, 0.9)); }
/* phones: a 72 px slot in the 48 px pill */
@media (max-width: 479px) {
  .ppc-launch.has-robot { padding-left: 30px; } /* 30 + crest 40 + gap 8 = text at 78 */
  .ppc-bot { width: 72px; height: 72px; left: 2px; bottom: 1px; perspective: 260px; }
  .ppc-bot__bubble { height: 22px; width: 22px; min-width: 22px; top: -10px; font-size: 14px; border-radius: 11px; }
  .ppc-bot__tail { left: 5px; width: 6px; height: 6px; bottom: -4px; }
  html.ppc-open .ppc-bot__tilt { scale: 0.62; }
}
/* the folded pill (first-visit notice on a narrow screen) keeps the slot: 42 + 48 + 14 = 104 wide, phones 30 + 40 + 8 = 78.
   The robot pill is ~285 px wide (the slot ate the air the crest pill had), so it folds 40 px earlier than the crest pill
   (719 instead of 679) to keep clear of the 360 px notice on the left. */
@media (max-width: 719px) {
  html.pp-noticed .ppc-launch.has-robot .ppc-launch__text { display: none; }
  html.pp-noticed .ppc-launch.has-robot { padding-right: 14px; gap: 0; }
}
@media (max-width: 479px) {
  html.pp-noticed .ppc-launch.has-robot { padding-right: 8px; }
}
@media (max-width: 599px) {
  html.ppc-robot.pp-noticed .pp-notice { right: 0; }
}
/* final review 2026-10-25: on phones the first-visit notice is a slim full-width bar docked at the bottom (above the sticky
   actions), not a card over the hero, and the launcher rises above it while it shows (--pp-notice-h is measured by
   portal.js), so the two never touch and the first screen keeps its photograph */
@media (max-width: 599px) {
  .pp-notice {
    left: 0; right: 0; bottom: var(--pp-actions-h, 0px); max-width: none;
    flex-wrap: nowrap; gap: 12px; padding: 8px 12px 8px 16px;
    border-width: 1px 0 0; border-radius: 0;
    box-shadow: 0 -10px 24px -18px rgba(28, 23, 21, 0.45);
    font-size: 13px; line-height: 1.4;
  }
  .pp-notice__text { flex: 1 1 auto; }
  .pp-notice__close { flex: none; }
  html.pp-noticed .ppc-launch { bottom: calc(12px + var(--pp-actions-h, 0px) + var(--pp-notice-h, 0px)); }
}

/* ---- the teaser: three real questions for this page, above the launcher ----
   The medallion (figure or monogram) rises 26 px above the card's top edge; the text sits to its right and the chips use
   the full width below. It is position:absolute inside the card, so the stacking against the launcher is unchanged. */
.ppc-tease {
  position: fixed; z-index: 63;
  right: 16px; bottom: calc(16px + 56px + 12px + var(--pp-actions-h, 0px) + var(--pp-hero-offset, 0px));
  width: min(340px, calc(100vw - 32px));
  padding: 22px 48px 12px 16px;
  background: var(--paper); color: var(--night);
  border: 1px solid var(--gold); border-left: 3px solid var(--maroon); border-radius: 12px;
  box-shadow: 0 18px 40px -20px rgba(20, 17, 16, 0.5);
  font-family: var(--font-sans);
  overflow: visible;
  opacity: 0; transform: translateY(10px);
  transition: opacity 0.24s ease, transform 0.24s ease, bottom var(--t-ui) var(--ease-out);
}
.ppc-tease.is-in { opacity: 1; transform: none; }
html.ppc-robot .ppc-tease { bottom: calc(16px + 56px + 12px + 68px + var(--pp-actions-h, 0px) + var(--pp-hero-offset, 0px)); } /* clear of the robot's head and bubble (slot top 40 px above the pill, bubble 14 + 3 bob above that, 8 px air) */
.ppc-tease__fig {
  position: absolute; left: 14px; top: -26px; width: 72px; height: 72px; border-radius: 50%; overflow: hidden; display: block;
  background: radial-gradient(circle at 50% 35%, var(--maroon-deep), var(--night));
  box-shadow: 0 0 0 2px var(--gold), 0 8px 18px -8px rgba(20, 17, 16, 0.6);
}
.ppc-tease__fig__halo { position: absolute; inset: 8px; border-radius: 50%; display: block; background: var(--gold); filter: blur(9px); opacity: 0.22; z-index: 1; mix-blend-mode: screen; pointer-events: none; } /* above the opaque figure */
.ppc-tease__fig__img { position: absolute; inset: 0; width: 100%; height: 100%; display: block; object-fit: cover; object-position: 50% 16%; z-index: 0; }
.ppc-tease__fig__mono { position: absolute; inset: 0; display: none; place-items: center; font: 400 30px / 1 var(--font-serif); color: var(--gold-light); }
.ppc-tease__fig.is-mono .ppc-tease__fig__mono { display: grid; }
.ppc-tease__fig.is-mono .ppc-tease__fig__img { opacity: 0; }
.ppc-tease__body { padding-left: 84px; min-height: 56px; }
.ppc-tease__eyebrow { margin: 0 0 4px; font: 600 11px / 1.2 var(--font-sans); letter-spacing: 0.08em; text-transform: uppercase; color: var(--maroon); }
.ppc-tease__q { margin: 0; font: 400 17px / 1.3 var(--font-serif); color: var(--night); }
.ppc-tease__trust { margin: 6px 0 10px; font: 400 12px / 1.4 var(--font-sans); color: var(--ink-2); }
.ppc-tease__chips { display: flex; flex-wrap: wrap; gap: 6px; padding-top: 4px; }
.ppc-tease__chip { border-style: solid; border-color: var(--gold); background: var(--paper); color: var(--night); }
.ppc-tease__chip:hover { background: var(--paper-2); }
.ppc-tease__foot { display: flex; justify-content: flex-end; margin-top: 4px; }
.ppc-tease__later { min-height: 44px; padding: 0 6px; border: 0; background: none; color: var(--ink-2); font: 500 13px / 1 var(--font-sans); text-decoration: underline; text-underline-offset: 4px; cursor: pointer; }
.ppc-tease__later:hover, .ppc-tease__later:focus-visible { color: var(--maroon); }
.ppc-tease__close { position: absolute; right: 2px; top: 2px; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--ink-2); display: grid; place-items: center; cursor: pointer; }
.ppc-tease__close:hover { color: var(--maroon); background: var(--paper-2); }
.ppc-tease__chip:focus-visible, .ppc-tease__later:focus-visible, .ppc-tease__close:focus-visible { outline: 2px solid var(--maroon); outline-offset: 2px; }
@media (max-width: 479px) {
  .ppc-tease { bottom: calc(16px + 48px + 10px + var(--pp-actions-h, 0px) + var(--pp-hero-offset, 0px)); padding-top: 16px; }
  html.ppc-robot .ppc-tease { bottom: calc(16px + 48px + 10px + 46px + var(--pp-actions-h, 0px) + var(--pp-hero-offset, 0px)); }
  .ppc-tease__fig { width: 56px; height: 56px; top: -18px; left: 12px; }
  .ppc-tease__fig__halo { inset: 6px; }
  .ppc-tease__fig__mono { font-size: 24px; }
  .ppc-tease__body { padding-left: 70px; min-height: 44px; }
  html.ppc-open .ppc-tease { display: none; }
}
/* short viewports (phones in landscape): the card would leave the screen above the robot, so it stays away
   (the script also waits while the viewport is this short, and retries after a rotation) */
@media (max-height: 519px) { .ppc-tease { display: none; } }

/* ---- the panel ---- */
.ppc {
  position: fixed; z-index: 64;
  right: 16px; bottom: calc(84px + var(--pp-actions-h, 0px));
  width: min(380px, calc(100vw - 32px));
  height: min(560px, calc(100vh - 120px));
  height: min(560px, calc(100dvh - 120px));
  display: flex; flex-direction: column;
  background: var(--paper-3); color: var(--ink);
  border: 1px solid var(--clay); border-radius: 8px;
  box-shadow: 0 30px 60px -30px rgba(28, 23, 21, 0.55);
  overflow: hidden;
  font-family: var(--font-sans);
}
.ppc[hidden] { display: none; }
.ppc__head {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 10px 12px 16px;
  background: var(--night); color: var(--paper);
}
/* the small medallion in the header: decoration only, the h2 labels the dialog */
.ppc__fig {
  position: relative; flex: none; width: 36px; height: 36px; border-radius: 50%; overflow: hidden; display: block;
  background: radial-gradient(circle at 50% 35%, var(--maroon-deep), var(--night)); box-shadow: 0 0 0 1.5px var(--gold);
}
.ppc__fig__halo { position: absolute; inset: 4px; border-radius: 50%; display: block; background: var(--gold); filter: blur(5px); opacity: 0.22; z-index: 1; mix-blend-mode: screen; pointer-events: none; } /* above the opaque figure */
.ppc__fig__img { position: absolute; inset: 0; width: 100%; height: 100%; display: block; object-fit: cover; object-position: 50% 18%; z-index: 0; }
.ppc__fig__mono { position: absolute; inset: 0; display: none; place-items: center; font: 400 17px / 1 var(--font-serif); color: var(--gold-light); }
.ppc__fig.is-mono .ppc__fig__mono { display: grid; }
.ppc__fig.is-mono .ppc__fig__img { opacity: 0; }
.ppc__htext { flex: 1 1 auto; min-width: 0; }
.ppc__title { margin: 0; font: 400 20px / 1.2 var(--font-serif); color: var(--paper); }
.ppc__title:focus { outline: none; }
.ppc__title:focus-visible { outline: 2px solid var(--amber); outline-offset: 2px; }
.ppc__sub { margin: 4px 0 0; font: 400 12.5px / 1.45 var(--font-sans); color: var(--bone-dim); }
.ppc__close {
  flex: none; display: inline-grid; place-items: center; width: 44px; height: 44px; padding: 0;
  border: 0; border-radius: 50%; background: transparent; color: var(--paper); cursor: pointer;
}
.ppc__close:hover { background: var(--night-2); }
.ppc__close:focus-visible { outline: 2px solid var(--amber); outline-offset: 0; }

.ppc__log {
  flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
  list-style: none; margin: 0; padding: 16px 14px 8px;
  display: flex; flex-direction: column; gap: 12px;
}
.ppc__log:focus-visible { outline: 2px solid var(--maroon); outline-offset: -2px; }
.ppc__msg { max-width: 88%; }
.ppc__msg--bot { align-self: flex-start; }
.ppc__msg--me { align-self: flex-end; }
.ppc__msg--code, .ppc__msg--form { max-width: 100%; align-self: stretch; }
.ppc__text {
  margin: 0; padding: 10px 14px; border-radius: 14px 14px 14px 4px;
  background: var(--paper-2); color: var(--ink);
  font: 400 15px / 1.5 var(--font-sans); white-space: pre-line; overflow-wrap: anywhere;
}
.ppc__msg--me .ppc__text { border-radius: 14px 14px 4px 14px; background: var(--ink); color: var(--paper); }
.ppc__acts { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.ppc__act {
  display: inline-flex; align-items: center; min-height: 44px; padding: 0 14px;
  border: 1px solid var(--ink); border-radius: 999px; background: transparent; color: var(--ink);
  font: 500 14px / 1.2 var(--font-sans); text-decoration: none; cursor: pointer;
}
.ppc__act:hover { color: var(--maroon); border-color: var(--maroon); }
.ppc__act--form { border-color: var(--gold); }
.ppc__src { margin: 6px 0 0 2px; font: 400 13px / 1.4 var(--font-sans); color: var(--ink-2); }
.ppc__src .link { color: var(--ink-2); display: inline-flex; align-items: center; min-height: 32px; }
.ppc__chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.ppc__chip {
  min-height: 44px; padding: 6px 14px; text-align: left;
  border: 1px dashed var(--gold); border-radius: 999px; background: var(--paper-3); color: var(--ink);
  font: 400 14px / 1.3 var(--font-sans); cursor: pointer;
}
.ppc__chip:hover { border-style: solid; background: var(--paper); }
.ppc__lines { margin-top: 6px; padding: 0 4px; }
/* suggested questions under the question box (2026-10-26): never inside or over the conversation */
.ppc__suggest { margin-top: 8px; }
.ppc__suggest[hidden] { display: none; }
.ppc__suggest .ppc__chips { margin-top: 0; }
.ppc__suggest .ppc__chips {
  flex-wrap: nowrap; overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x proximity;
  padding-bottom: 4px; scrollbar-width: thin;
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
  mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
}
.ppc__suggest .ppc__chip { flex: none; white-space: nowrap; scroll-snap-align: start; }
.ppc__suggest .ppc__chip:last-child { margin-right: 24px; }
/* footer links and the "How this chat works" note (2026-10-26) */
.ppc__links { flex: none; display: inline-flex; gap: 2px 14px; flex-wrap: wrap; }
.ppc__about { margin: 8px 0 0; padding: 10px 12px; border-left: 3px solid var(--gold); background: var(--paper); font: 400 13px / 1.45 var(--font-sans); color: var(--ink); }
.ppc__about[hidden] { display: none; }
/* a short screen (a phone with its keyboard open): while typing, the suggestions step aside so the answer keeps the room */
@media (max-height: 560px) { .ppc__form:focus-within .ppc__suggest { display: none; } }

.ppc__typing { align-self: flex-start; display: inline-flex; gap: 5px; align-items: center; padding: 14px 16px; border-radius: 14px; background: var(--paper-2); }
.ppc__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--ink-2); opacity: 0.35; animation: ppc-dot 1.1s var(--ease-soft) infinite; }
.ppc__dot:nth-child(2) { animation-delay: 0.15s; }
.ppc__dot:nth-child(3) { animation-delay: 0.3s; }
.ppc__typing-text { font: 400 13px / 1 var(--font-sans); color: var(--ink-2); }
@keyframes ppc-dot { 0%, 80%, 100% { opacity: 0.35; transform: none; } 40% { opacity: 1; transform: translateY(-3px); } }

.ppc__form { flex: none; padding: 10px 14px 12px; border-top: var(--hairline); background: var(--paper-3); }
.ppc__label { display: block; margin-bottom: 4px; font: 500 13px / 1.2 var(--font-sans); color: var(--ink-2); }
.ppc__row { display: flex; gap: 8px; align-items: stretch; }
.ppc__input {
  flex: 1 1 auto; min-width: 0; min-height: 44px; padding: 8px 12px;
  border: 1px solid var(--ink-2); border-radius: 999px; background: var(--paper); color: var(--ink);
  font: 400 16px / 1.3 var(--font-sans);
}
.ppc__input:focus-visible { outline: 2px solid var(--maroon); outline-offset: 2px; }
.ppc__send {
  flex: none; min-height: 44px; min-width: 64px; padding: 0 18px;
  border: 0; border-radius: 999px; background: var(--maroon); color: var(--paper);
  font: 500 15px / 1 var(--font-sans); cursor: pointer;
}
.ppc__send:hover { background: var(--maroon-deep); }
.ppc__send:disabled { opacity: 0.55; cursor: progress; }
.ppc__foot { display: flex; align-items: center; justify-content: space-between; gap: 4px 10px; margin-top: 6px; flex-wrap: wrap; }
.ppc__hint { flex: 1 1 180px; margin: 0; font: 400 12px / 1.4 var(--font-sans); color: var(--ink-2); }
.ppc__person, .ppc__how {
  flex: none; min-height: 44px; padding: 0 4px; border: 0; background: none; color: var(--ink); cursor: pointer;
  font: 500 13px / 1.2 var(--font-sans); text-decoration: underline; text-underline-offset: 4px;
}
.ppc__person:hover, .ppc__how:hover { color: var(--maroon); }

/* the short enquiry form inside the helper */
.ppc__hand { padding: 14px 14px 6px; border: 1px solid var(--clay); border-left: 3px solid var(--gold); border-radius: 4px; background: var(--paper); }
.ppc__hand-title { margin: 0; font: 400 18px / 1.25 var(--font-serif); }
.ppc__hand-title:focus { outline: none; }
.ppc__hand-title:focus-visible { outline: 2px solid var(--maroon); outline-offset: 3px; }
.ppc__hand-note { margin: 4px 0 12px; font: 400 13px / 1.45 var(--font-sans); color: var(--ink-2); }
.ppc__field { margin-bottom: 12px; }
.ppc__field input, .ppc__field select, .ppc__field textarea { min-height: 44px; font-size: 16px; }
.ppc__fhint { margin: 0; font: 400 12.5px / 1.4 var(--font-sans); color: var(--ink-2); }
.ppc__consent { margin: 0 0 10px; padding: 0; border: 0; }
.ppc__consent legend { padding: 0; margin-bottom: 2px; font: 500 13px / 1.2 var(--font-sans); color: var(--ink-2); }
.ppc__check { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; margin-right: 16px; font: 400 15px / 1.2 var(--font-sans); cursor: pointer; }
.ppc__check input { width: 20px; height: 20px; margin: 0; accent-color: var(--maroon); }
.ppc__hand-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; margin-top: 4px; }
.ppc__hand-send { white-space: normal; text-align: center; }
.ppc__hand-cancel { min-height: 44px; padding: 0 4px; border: 0; background: none; color: var(--ink); cursor: pointer; font: 500 14px / 1 var(--font-sans); text-decoration: underline; text-underline-offset: 4px; }
.ppc__hand-status { margin-top: 6px; }
.ppc__hand-fail { margin: 0; font: 500 14px / 1.45 var(--font-sans); color: var(--maroon); }
.ppc .pp-code { margin-top: 0; padding: 16px 16px 12px; }
.ppc .pp-code__code { font-size: 30px; }
.ppc .pp-code__h { font-size: 19px; }

/* phones: the panel becomes a full-width sheet above the sticky actions */
@media (max-width: 479px) {
  .ppc {
    left: 0; right: 0; bottom: var(--pp-actions-h, 0px);
    width: 100%;
    height: min(560px, calc(100vh - 72px - var(--pp-actions-h, 0px)));
    height: min(620px, calc(100dvh - 56px - var(--pp-actions-h, 0px)));
    border-radius: 12px 12px 0 0; border-left: 0; border-right: 0; border-bottom: 0;
  }
  html.ppc-open .ppc-launch { visibility: hidden; }
  html.ppc-open .pp-notice { display: none; }
}

/* reduced motion: the site's own switch and the system setting */
@media (prefers-reduced-motion: reduce) {
  .ppc-launch, .pp-notice { transition: none; }
  .ppc__dot { animation: none; opacity: 0.7; }
  .ppc-launch, .ppc-crest::after, .ppc-crest::before, .ppc-crest__ring, .ppc-crest__halo, .ppc-crest__visor, .ppc-tease, .ppc-tease__fig { animation: none !important; transition: none !important; }
  .ppc-launch, .ppc-launch:hover, .ppc-launch:focus-visible { opacity: 1; transform: none; }
  .ppc-crest::after { display: none; }
  .ppc-crest__halo, .ppc-launch:hover .ppc-crest__halo, .ppc-launch:focus-visible .ppc-crest__halo { opacity: 0.2; }
  .ppc-launch.has-fig .ppc-crest__visor { opacity: 0.35; }
  .ppc-launch.is-thinking .ppc-crest::before { display: none; }
  .ppc-tease { opacity: 1; transform: none; }
  /* the robot stands still, eyes open, the "?" bubble shown; hover ^ ^ and "Ask me" are state changes and stay */
  .ppc-bot, .ppc-bot__float, .ppc-bot__shadow, .ppc-bot__tilt, .ppc-bot__bubble, .ppc-bot__bubble-a, .ppc-bot__eye, .ppc-bot__think circle { animation: none !important; transition: none !important; }
  .ppc-bot__tilt { transform: none !important; rotate: 0deg !important; }
  .ppc-bot__eyes, .ppc-bot__sheen { transform: none !important; transition: none !important; }
  .ppc-bot__smile, .ppc-bot__eye-o, .ppc-bot__eye-h { transition: none !important; } /* the hover ^ ^ and wider smile switch at once, nothing glides */
  .ppc-launch.is-curious .ppc-bot__eye--r, .ppc-launch.is-curious .ppc-bot__eye--l { transform: none; }
  .ppc-launch.has-robot { transition: none; }
  .ppc-bot__bubble { opacity: 1; transform: none; }
  html.ppc-open .ppc-bot__bubble, html.ppc-open .ppc-bot__shadow { opacity: 0; }
  .ppc-launch.is-thinking .ppc-bot__think circle { animation: none !important; opacity: 0.7; }
}
html[data-motion="reduced"] .ppc-launch, html[data-motion="reduced"] .pp-notice { transition: none; }
html[data-motion="reduced"] .ppc__dot { animation: none; opacity: 0.7; }
html[data-motion="reduced"] .ppc-launch, html[data-motion="reduced"] .ppc-crest::after, html[data-motion="reduced"] .ppc-crest::before,
html[data-motion="reduced"] .ppc-crest__ring, html[data-motion="reduced"] .ppc-crest__halo, html[data-motion="reduced"] .ppc-crest__visor,
html[data-motion="reduced"] .ppc-tease, html[data-motion="reduced"] .ppc-tease__fig { animation: none !important; transition: none !important; }
html[data-motion="reduced"] .ppc-launch, html[data-motion="reduced"] .ppc-launch:hover, html[data-motion="reduced"] .ppc-launch:focus-visible { opacity: 1; transform: none; }
html[data-motion="reduced"] .ppc-crest::after { display: none; }
html[data-motion="reduced"] .ppc-crest__halo, html[data-motion="reduced"] .ppc-launch:hover .ppc-crest__halo, html[data-motion="reduced"] .ppc-launch:focus-visible .ppc-crest__halo { opacity: 0.2; }
html[data-motion="reduced"] .ppc-launch.has-fig .ppc-crest__visor { opacity: 0.35; }
html[data-motion="reduced"] .ppc-launch.is-thinking .ppc-crest::before { display: none; }
html[data-motion="reduced"] .ppc-tease { opacity: 1; transform: none; }
/* the robot under the site's own switches: the footer switch (data-motion) and the home's gate (data-tier="still") */
:is(html[data-motion="reduced"], html[data-tier="still"]) :is(.ppc-bot, .ppc-bot__float, .ppc-bot__shadow, .ppc-bot__tilt, .ppc-bot__bubble, .ppc-bot__bubble-a, .ppc-bot__eye, .ppc-bot__think circle) { animation: none !important; transition: none !important; }
:is(html[data-motion="reduced"], html[data-tier="still"]) .ppc-bot__tilt { transform: none !important; rotate: 0deg !important; }
:is(html[data-motion="reduced"], html[data-tier="still"]) :is(.ppc-bot__eyes, .ppc-bot__sheen) { transform: none !important; transition: none !important; }
:is(html[data-motion="reduced"], html[data-tier="still"]) :is(.ppc-bot__smile, .ppc-bot__eye-o, .ppc-bot__eye-h) { transition: none !important; }
:is(html[data-motion="reduced"], html[data-tier="still"]) .ppc-launch.is-curious :is(.ppc-bot__eye--r, .ppc-bot__eye--l) { transform: none; }
:is(html[data-motion="reduced"], html[data-tier="still"]) .ppc-launch.has-robot { transition: none; }
:is(html[data-motion="reduced"], html[data-tier="still"]) .ppc-bot__bubble { opacity: 1; transform: none; }
:is(html[data-motion="reduced"], html[data-tier="still"]).ppc-open :is(.ppc-bot__bubble, .ppc-bot__shadow) { opacity: 0; }
:is(html[data-motion="reduced"], html[data-tier="still"]) .ppc-launch.is-thinking .ppc-bot__think circle { animation: none !important; opacity: 0.7; }

/* menus, the lightbox and print come first */
html.menu-open .ppc-launch, html.menu-open .ppc-tease, html.menu-open .pp-notice,
html.lightbox-open .ppc-launch, html.lightbox-open .ppc-tease, html.lightbox-open .pp-notice { visibility: hidden; }
@media print {
  .ppc-launch, .ppc-tease, .ppc, .pp-notice, .foot__visit { display: none !important; }
}
html.af-printing .ppc-launch, html.af-printing .ppc-tease, html.af-printing .ppc, html.af-printing .pp-notice { display: none !important; }

/* Review 2026-10-23: the parent-or-guardian tick, the join tick and the privacy line on Enquire and Book a visit; the
   "Send another" button after a send; the admission form's note on what stays on paper. */
.page-form__guardian, .page-form__join { margin: 0 0 10px; }
.page-form__privacy { margin: 0 0 22px; }
.page-form__privacy .link { color: var(--ink); }
.pp-code__again { margin-top: 14px; padding: 0; min-height: 44px; border: 0; background: none; font: 500 15px / 1.4 var(--font-sans); color: var(--ink); text-decoration: underline; text-underline-offset: 4px; cursor: pointer; }
.pp-code__again:hover { color: var(--maroon); }
.af__keep, .af__as-note { margin: 0 0 12px; max-width: 46rem; font: 400 14px / 1.5 var(--font-sans); color: var(--ink-2); }
.af__as-note { color: var(--ink); font-weight: 500; }
.ppc__form[hidden] { display: none; }
.af__join { margin-top: 6px; }
.af__join[hidden] { display: none; }

/* ---- figure only (founder 2026-10-23): when the robot is drawn, the launcher is just the robot and its "?" bubble.
   No pill, no visible text, no "Ask me" swap. The title and status stay in the button for screen readers, so the
   button is still named "Ask the Admissions Desk, AI assistant". If the robot file fails, the pill comes back. ---- */
.ppc-launch.has-robot {
  width: 104px; height: 104px; padding: 0; gap: 0;
  border: 0; border-radius: 50%; background: transparent; box-shadow: none;
}
.ppc-launch.has-robot:hover, .ppc-launch.has-robot:focus-visible { box-shadow: none; transform: translateY(-2px); }
.ppc-launch.has-robot:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; box-shadow: 0 0 0 4px var(--gold-light); }
.ppc-launch.has-robot .ppc-crest { display: none; }
.ppc-launch.has-robot .ppc-launch__text {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.ppc-launch.has-robot .ppc-bot { left: 4px; bottom: 0; }
.ppc-launch .ppc-bot__bubble-a { display: none !important; }
.ppc-launch .ppc-bot__bubble-q { display: block !important; }
.ppc-launch:hover .ppc-bot__bubble, .ppc-launch:focus-visible .ppc-bot__bubble { width: 26px; }
@media (max-width: 479px) {
  .ppc-launch.has-robot { width: 80px; height: 80px; padding: 0; }
  .ppc-launch.has-robot .ppc-bot { left: 4px; bottom: 0; }
  .ppc-launch:hover .ppc-bot__bubble, .ppc-launch:focus-visible .ppc-bot__bubble { width: 22px; }
}
@media (max-width: 719px) {
  html.pp-noticed .ppc-launch.has-robot { padding: 0; }
}
