/* Wykeham base. Minimal element defaults so a bare page already reads as Wykeham. */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
body{margin:0;background:var(--surface-page);color:var(--text-body);font-family:var(--font-body);font-weight:var(--weight-regular);font-size:var(--type-body-size);line-height:var(--type-body-lh);text-wrap:pretty}
h1,h2,h3,h4,h5,h6{font-family:var(--font-display);font-weight:var(--weight-regular);margin:0;color:var(--text-display)}
h1{font-size:var(--type-display-2-size);line-height:var(--type-display-2-lh);letter-spacing:var(--type-display-2-ls)}
h2{font-size:var(--type-display-3-size);line-height:var(--type-display-3-lh);letter-spacing:var(--type-display-3-ls)}
h3{font-size:var(--type-heading-1-size);line-height:var(--type-heading-1-lh);letter-spacing:var(--type-heading-1-ls)}
h4{font-size:var(--type-heading-2-size);line-height:var(--type-heading-2-lh)}
p{margin:0 0 var(--stack-para)}
strong,b{font-weight:var(--weight-medium)}
/* No line at rest; one underline on hover (handoff of 13 October 2026, decision 7).
   The rest border-bottom this rule used to carry drew a SECOND line under every
   label that had its own hover underline, which is why a dozen components still
   opt out with border:0. Those opt-outs are now redundant, not wrong — left in
   place so a component that sets its own border still behaves. The hover
   underline is scoped to prose containers in site.css §Inline prose links, NOT
   declared here: a{...}:hover outranks .svccard{text-decoration:none}, and
   card titles must not underline (client instruction, 9 September 2026). */
/* The global link colour is --text-link, not --interactive-accent. Every
   classless <a> in running prose inherits this — the published address on
   the legal pages, the ICO link, the cookie-policy links — and copper
   measured 3.59:1 on paper, below AA for 16px text. --text-link is 4.99:1.
   --interactive-accent stays the colour of rules, borders and the focus
   ring, which are non-text and need only 3:1. */
a{color:var(--text-link);text-decoration:none;transition:var(--transition-color)}
a:hover{color:var(--interactive-accent-pressed)}
a:active{color:var(--interactive-accent-pressed)}
a:focus-visible{outline:1px solid var(--focus-ring);outline-offset:2px}
hr{border:0;border-top:var(--rule-weight) solid var(--line-hairline);margin:var(--space-12) 0}
button,input,select,textarea{font-family:var(--font-body);font-size:var(--type-body-size);border-radius:var(--radius)}
img{max-width:100%;display:block}
/* ADDED FOR SITE BUILD — 14 October 2026. The reset had no [hidden] rule, so
   the attribute only worked on elements that set no display of their own. The
   contact form is .contactform__grid{display:grid}, which beat the UA
   stylesheet's [hidden]{display:none} outright: form.hidden = true left the
   form on screen under the confirmation that had just replaced it. The apply
   form happened to work only because .applyform sets no display.
   !important is the standard exception here — every reset does this — and the
   :not() keeps hidden="until-found" findable by in-page search. */
[hidden]:not([hidden="until-found"]){display:none!important}
::selection{background:var(--wyk-copper);color:var(--wyk-paper)}
