/* ---------------------------------------------------------------------------
   Neue Grafik: the converted surfaces.

   Loaded by every surface that has converted, each of which sets `is-neue` on
   <body>. Every rule here is scoped to that class, so surfaces still running
   the retired Bound Volume system in base.css are untouched. See DESIGN.md,
   Rollout status; when the last surface converts, these rules move to base.css
   and the scoping comes off.

   One file rather than one per surface, so a visitor going from a search to a
   record pays for it once.

   The footer block restyles base.css's markup rather than forking the shared
   template, so the conversion reverses cleanly. The masthead is left alone.

   Sections below, in order: tokens and primitives, chrome, the record
   (item pages), the search.
   --------------------------------------------------------------------------- */

.is-neue {
  --ground: #e4e5e7;
  --field: #ffffff;
  --ink: #101113;
  --ink-muted: #55585e;
  --rule: #101113;
  --rule-soft: #c4c6ca;
  /* The platform's own link blue and a navy press, so the record introduces
     no hue the rest of the site does not already use. */
  --link: #0071b5;
  --link-press: #123b66;
  --knock: #ffffff;
  /* The masthead's navy, carried onto the one primary action so the record
     stays tied to the site's identity. See DESIGN.md, The Action Navy Rule. */
  --action: #0b2341;
  --action-press: #101113;
  --band-muted: #9aa0ad;
  --band-chip: #26282d;
  --band-rule: #3a3d44;

  --gutter: 1.5rem;
  --pad: clamp(1rem, 0.4rem + 2.4vw, 3rem);
}

/* base.css sets body.bg-light with !important. */
body.is-neue,
body.is-neue.bg-light {
  background: var(--ground) !important;
  color: var(--ink);
  font-family: Archivo, system-ui, sans-serif;
  font-size: 16px;
  line-height: 1.55;
}

.is-neue h1,
.is-neue h2,
.is-neue h3 {
  font-family: Archivo, system-ui, sans-serif;
  color: var(--ink);
}

/* Headings inside the black band. Without this the rule above wins over the
   band's inherited knockout and prints ink on ink. */
.is-neue .record-custody h2 {
  color: var(--knock);
}

.is-neue .record-shell {
  margin: 0 auto;
  max-width: 1560px;
  padding: 0 var(--pad);
}

.is-neue .mono {
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  letter-spacing: -0.02em;
}

.is-neue .visually-hidden {
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  height: 1px;
  overflow: hidden;
  position: absolute;
  white-space: nowrap;
  width: 1px;
}

.is-neue a:focus-visible,
.is-neue button:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

/* Squared corners are the rule this system leans on hardest, and it is the one
   a user-agent default breaks on its own: Chrome rounds a bare <button>. */
.is-neue button,
.is-neue input,
.is-neue select,
.is-neue textarea,
.is-neue img,
.is-neue table {
  border-radius: 0;
}

/* ---------------------------------------------------------------------------
   Chrome: base.css markup, this system's material.

   The masthead is deliberately NOT converted. It stays the retired Bound
   Volume header from base.css so navigation reads identically on every page,
   converted or not. Only the footer below the record adopts this system.
   --------------------------------------------------------------------------- */

.is-neue main {
  min-height: 0;
}

.is-neue .site-footer {
  margin-top: 0 !important;
}

/* The footer is chrome, so it keeps the masthead's navy rather than the
   record's ink. What it loses is the gradient and the glass tiles: a flat
   field and ruled blocks. Its hairlines and muted voice are navy-tinted
   accordingly, because the ink band's grays read as muddy over blue. */
.is-neue .footer-sections {
  background: var(--global-color-8);
  border-top: 0;
}

.is-neue .footer-sections-container {
  max-width: 1560px;
  padding: 3rem var(--pad) 3.25rem;
}

.is-neue .footer-column {
  backdrop-filter: none;
  background: transparent;
  border: 0;
  border-top: 1px solid rgba(255, 255, 255, 0.16);
  border-radius: 0;
  padding: 0.55rem 0 0;
}

.is-neue .footer-column:hover {
  background: transparent;
  border-color: rgba(255, 255, 255, 0.16);
}

.is-neue .footer-sections .footer-title {
  color: #9dc0ee;
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.68rem;
  font-weight: 400;
  letter-spacing: -0.02em;
  margin-bottom: 0.85rem;
}

.is-neue .footer-sections a {
  color: var(--knock);
  font-size: 0.92rem;
  opacity: 1;
}

@media (hover: hover) {
  .is-neue .footer-sections a:hover {
    color: var(--knock);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
  }
}

/* The platform's own copyright-bar navy, one step darker than the footer, so
   the two darks read as a deliberate step rather than a seam. */
.is-neue .site-info {
  background-color: #071426;
  border-top: 1px solid rgba(255, 255, 255, 0.16);
  color: #adc0d8;
}

.is-neue .site-info-container {
  max-width: 1560px;
  padding: 0 var(--pad);
}

.is-neue .copyright-bar {
  font-size: 0.78rem;
}

.is-neue .site-info a {
  color: var(--knock);
}

@media (hover: hover) {
  .is-neue .site-info a:hover {
    color: var(--knock);
    text-decoration: underline;
  }
}

.is-neue .footer-social-icons a {
  background: rgba(255, 255, 255, 0.1);
  border: 0;
  border-radius: 0;
  color: var(--knock);
  height: 1.9rem;
  width: 1.9rem;
}

@media (hover: hover) {
  .is-neue .footer-social-icons a:hover {
    background: var(--knock);
    color: var(--ink);
    transform: none;
  }
}

/* ---------------------------------------------------------------------------
   The record.
   --------------------------------------------------------------------------- */

.is-neue .record-main {
  display: block;
  padding: 0;
}

.record-body-field {
  background: var(--field);
  margin-bottom: 2px;
  padding-bottom: clamp(2rem, 1rem + 3vw, 3.5rem);
}

.record-titleblock {
  border-bottom: 2px solid var(--rule);
  padding: clamp(1.75rem, 1rem + 3vw, 3.25rem) 0 clamp(1.25rem, 0.8rem + 2vw, 2.25rem);
}

.record-backlink {
  color: var(--ink);
  display: inline-block;
  font-size: 0.78rem;
  margin-bottom: clamp(1.25rem, 1rem + 2vw, 2.5rem);
  min-height: 44px;
  text-decoration: none;
}

@media (hover: hover) {
  .record-backlink:hover {
    color: var(--link);
    text-decoration: underline;
  }
}

.record-grantor {
  border-top: 2px solid var(--rule);
  font-size: 0.86rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0 0 0.9rem;
  padding-top: 0.5rem;
}

.record-title {
  font-size: clamp(2.1rem, 1.1rem + 3.9vw, 4.1rem);
  font-weight: 600;
  letter-spacing: -0.028em;
  line-height: 1.02;
  margin: 0;
  max-width: min(20ch, 100%);
  overflow-wrap: break-word;
  text-wrap: balance;
}

.record-byline {
  column-gap: var(--gutter);
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  margin-top: clamp(1.25rem, 0.9rem + 1.6vw, 2rem);
  row-gap: 0.75rem;
}

@media (min-width: 860px) {
  .record-byline {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

.record-byline-cell {
  border-top: 1px solid var(--rule-soft);
  padding-top: 0.5rem;
}

.record-byline-cell .predicate {
  display: block;
  margin-bottom: 0.15rem;
}

.record-byline-cell .record-value {
  font-size: 1.05rem;
}

.record-layout {
  column-gap: var(--gutter);
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  padding-top: clamp(1.5rem, 1rem + 2vw, 2.75rem);
  row-gap: 2.5rem;
}

@media (min-width: 1080px) {
  .record-layout {
    grid-template-columns: repeat(12, minmax(0, 1fr));
  }

  .record-register {
    grid-column: 9 / 13;
    grid-row: 1;
    position: sticky;
    top: 1.5rem;
  }

  .record-sections {
    grid-column: 1 / 9;
    grid-row: 1;
    min-width: 0;
  }
}

/* The one filled action on the page, in the masthead's navy and wearing the
   masthead's 3px gold rule. Gold on navy is the retired system's Foil Rule,
   which this keeps rather than breaks. */
.record-action,
.record-action:hover,
.record-action:focus {
  background: var(--action);
  border-bottom: 3px solid var(--ndltd-gold);
  color: var(--knock);
  display: block;
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  padding: 1rem 1.15rem;
  text-decoration: none;
}

.record-action span {
  display: block;
  font-size: 0.7rem;
  font-weight: 400;
  letter-spacing: 0;
  margin-top: 0.2rem;
  opacity: 0.85;
  overflow-wrap: anywhere;
}

/* Bootstrap's own `a:hover` recolours every link, so a filled anchor has to
   restate its ink or the label turns mid-blue on a dark fill. */
@media (hover: hover) {
  .record-action:hover {
    background: var(--action-press);
    color: var(--knock);
  }
}

.record-register-group {
  border-top: 1px solid var(--rule-soft);
  margin-top: 1.5rem;
  padding-top: 0.55rem;
}

.record-register-label {
  color: var(--ink-muted);
  font-size: 0.68rem;
  margin: 0 0 0.6rem;
}

/* The permalink, printed rather than hidden behind a control, and one solid
   ink block to take it. A filled block is this world's control; the gray chip
   is the vocabulary it refuses. */
.record-permalink {
  color: var(--ink-muted);
  font-size: 0.72rem;
  line-height: 1.5;
  margin: 0 0 0.55rem;
  overflow-wrap: anywhere;
}

.record-copy {
  align-items: center;
  background: var(--ink);
  border: 0;
  color: var(--knock);
  cursor: pointer;
  display: inline-flex;
  font-size: 0.72rem;
  gap: 0.5rem;
  justify-content: center;
  letter-spacing: -0.02em;
  min-height: 44px;
  padding: 0 1rem;
}

/* Icon only: it sits directly beneath the value it copies, so the label is for
   assistive technology rather than the page. */
.record-copy-icon-only {
  min-width: 44px;
  padding: 0;
}

.record-copy svg {
  fill: currentColor;
  flex: none;
  height: 15px;
  width: 15px;
}

.record-copy-done,
.record-copy[data-copied="true"] .record-copy-rest {
  display: none;
}

.record-copy[data-copied="true"] .record-copy-done {
  display: block;
}

@media (hover: hover) {
  .record-copy:hover {
    background: var(--link);
  }
}

/* Confirmation is a state, so it speaks blue like every other state. */
.record-copy[data-copied="true"] {
  background: var(--link);
}

/* Representations. Full-measure ruled rows carrying each media type, the way
   a journal lists its alternates. The row reverses on hover, which is the
   emphasis move this world has instead of a fill change. */
.record-formats {
  list-style: none;
  margin: 0;
  padding: 0;
}

.record-formats li {
  border-top: 1px solid var(--rule-soft);
}

.record-formats li:first-child {
  border-top: 0;
}

.record-formats a {
  align-items: baseline;
  color: var(--ink);
  display: grid;
  gap: 0.2rem 0.75rem;
  grid-template-columns: minmax(0, auto) minmax(0, 1fr);
  min-height: 44px;
  padding: 0.5rem 0.5rem 0.5rem 0;
  text-decoration: none;
}

.record-format-name {
  font-size: 0.9rem;
  font-weight: 500;
  letter-spacing: -0.01em;
}

.record-format-type {
  color: var(--ink-muted);
  font-size: 0.68rem;
  overflow-wrap: anywhere;
  text-align: right;
}

@media (hover: hover) {
  .record-formats a:hover {
    background: var(--ink);
    color: var(--knock);
    padding-left: 0.5rem;
  }

  .record-formats a:hover .record-format-type {
    color: var(--band-muted);
  }
}

/* The representation being read. Marked, not linked away from. */
.record-formats a[aria-current="true"] {
  color: var(--ink-muted);
}

.record-formats a[aria-current="true"] .record-format-name {
  font-weight: 400;
}

/* Contents. The active mark fills blue: a colour and weight swap with no
   movement, so reduced motion needs no special case. */
.record-contents ol {
  list-style: none;
  margin: 0;
  padding: 0;
}

.record-contents li {
  border-top: 1px solid var(--rule-soft);
}

.record-contents li:first-child {
  border-top: 0;
}

.record-contents a {
  align-items: baseline;
  color: var(--ink);
  display: grid;
  gap: 0.7rem;
  grid-template-columns: 0.55rem minmax(0, 1fr);
  padding: 0.45rem 0;
  text-decoration: none;
}

.record-contents a::before {
  background: var(--rule-soft);
  content: "";
  display: block;
  height: 0.55rem;
  width: 0.55rem;
}

@media (hover: hover) {
  .record-contents a:hover {
    color: var(--link);
  }
}

.record-contents li[aria-current="true"] a {
  font-weight: 600;
}

.record-contents li[aria-current="true"] a::before {
  background: var(--link);
}

.record-section {
  border-top: 2px solid var(--rule);
  margin-top: 2.5rem;
  padding-top: 0.55rem;
  scroll-margin-top: 1.5rem;
}

.record-section:first-child {
  margin-top: 0;
}

.record-section-head {
  align-items: baseline;
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  justify-content: space-between;
  margin-bottom: 1.1rem;
}

.record-section > .record-section-head > h2 {
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0;
}

/* The machine record in the margin of the human one. */
.predicate {
  color: var(--ink-muted);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.68rem;
  letter-spacing: -0.02em;
  overflow-wrap: anywhere;
}

.record-abstract {
  font-size: 1.05rem;
  line-height: 1.62;
  margin: 0;
}

.record-abstract mjx-container {
  max-width: 100%;
}

.record-abstract mjx-container[display="true"] {
  overflow-x: auto;
  overflow-y: hidden;
}

.etd-inline-math {
  font-family: "Times New Roman", Times, serif;
}

.etd-inline-math-roman {
  font-style: normal;
}

.record-fields {
  display: grid;
  gap: 0;
  margin: 0;
}

/* Every row keeps its rule and padding. A :first-child exception staggers the
   columns against each other as soon as a value wraps. */
.record-field {
  border-top: 1px solid var(--rule-soft);
  display: grid;
  gap: 0.1rem 1.25rem;
  grid-template-columns: minmax(0, 1fr);
  padding: 0.6rem 0;
}

.record-field:first-child {
  border-top: 0;
  padding-top: 0;
}

@media (min-width: 640px) {
  .record-field {
    grid-template-columns: 13rem minmax(0, 1fr);
  }
}

.record-field dt {
  display: grid;
  gap: 0.1rem;
}

.record-field-name {
  font-size: 0.86rem;
  font-weight: 500;
}

.record-field dd {
  font-size: 1rem;
  margin: 0;
  overflow-wrap: anywhere;
}

.record-value {
  font-weight: 500;
  letter-spacing: -0.01em;
}

/* Links in the record body speak this system's blue, not base.css's link blue,
   which is the retired system's voice. */
.record-field a,
.record-abstract a {
  color: var(--link);
}

@media (hover: hover) {
  .record-field a:hover,
  .record-abstract a:hover {
    color: var(--link-press);
  }
}

.record-field dd ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.record-field dd li + li {
  margin-top: 0.2rem;
}

.record-terms {
  display: flex;
  flex-wrap: wrap;
  gap: 1px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.record-terms a {
  background: var(--ground);
  color: var(--ink);
  display: inline-block;
  font-size: 0.86rem;
  padding: 0.3rem 0.6rem;
  text-decoration: none;
}

@media (hover: hover) {
  .record-terms a:hover {
    background: var(--link);
    color: var(--knock);
  }
}

/* Chain of custody: the band that takes a reader from the rendered record to
   the raw harvested one. */
.record-custody {
  background: var(--ink);
  color: var(--knock);
  margin-bottom: 2px;
  padding: clamp(1.75rem, 1rem + 2.4vw, 2.75rem) 0;
}

.record-custody > .record-shell > h2 {
  font-size: 0.86rem;
  font-weight: 600;
  margin: 0 0 1.25rem;
}

.record-custody-grid {
  column-gap: var(--gutter);
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  row-gap: 1.5rem;
}

@media (min-width: 860px) {
  .record-custody-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

.record-custody-block {
  border-top: 1px solid var(--band-rule);
  padding-top: 0.55rem;
}

.record-custody-block .predicate {
  color: var(--band-muted);
}

.record-custody dl {
  display: grid;
  gap: 0.7rem;
  margin: 0.6rem 0 0;
}

.record-custody dt {
  color: var(--band-muted);
  font-size: 0.7rem;
}

.record-custody dd {
  font-size: 0.92rem;
  margin: 0;
  overflow-wrap: anywhere;
}

/* Same Bootstrap hazard on the black band: its link hover colour lands at
   3.5:1 against ink. */
.record-custody a,
.record-custody a:hover,
.record-custody a:focus {
  color: var(--knock);
}

.record-citation {
  font-size: 0.92rem;
  margin: 0.6rem 0 0.9rem;
}

/* On the black band the recipes invert: an ink control would vanish into it,
   and the light term chip would sit at 1.4:1. */
.record-custody .record-copy {
  background: var(--knock);
  color: var(--ink);
}

.record-custody .record-terms a {
  background: var(--band-chip);
  color: var(--knock);
}

@media (hover: hover) {
  .record-custody .record-copy:hover,
  .record-custody .record-terms a:hover {
    background: var(--link);
    color: var(--knock);
  }
}

.record-custody .record-copy[data-copied="true"] {
  background: var(--link);
  color: var(--knock);
}

.record-neighbours {
  background: var(--field);
  padding: clamp(1.75rem, 1rem + 2.4vw, 2.75rem) 0;
}

.record-neighbours > .record-shell > h2 {
  border-top: 2px solid var(--rule);
  font-size: 0.86rem;
  font-weight: 600;
  margin: 0 0 1.1rem;
  padding-top: 0.55rem;
}

.record-neighbours ol {
  list-style: none;
  margin: 0;
  padding: 0;
}

.record-neighbours li {
  border-top: 1px solid var(--rule-soft);
}

.record-neighbours li:first-child {
  border-top: 0;
}

.record-neighbours a {
  color: var(--ink);
  display: grid;
  gap: 0.15rem 1.25rem;
  grid-template-columns: minmax(0, 1fr);
  padding: 0.8rem 0;
  text-decoration: none;
}

@media (min-width: 860px) {
  .record-neighbours a {
    align-items: baseline;
    grid-template-columns: minmax(0, 1fr) 16rem 5rem;
  }
}

@media (hover: hover) {
  .record-neighbours a:hover .record-neighbour-title {
    color: var(--link);
    text-decoration: underline;
  }
}

.record-neighbour-title {
  font-size: 1.05rem;
  font-weight: 500;
  letter-spacing: -0.01em;
}

.record-neighbour-meta {
  color: var(--ink-muted);
  font-size: 0.82rem;
}

/* ---------------------------------------------------------------------------
   The search.
   --------------------------------------------------------------------------- */

.is-neue .search-main {
  display: block;
  padding: 0;
}

.search-field-surface {
  background: var(--field);
  margin-bottom: 2px;
  padding-bottom: clamp(1.75rem, 1rem + 2.4vw, 3rem);
}

.search-masthead {
  border-bottom: 2px solid var(--rule);
  padding: clamp(1.75rem, 1rem + 3vw, 3.25rem) 0 clamp(1.25rem, 0.8rem + 2vw, 2rem);
}

.search-title {
  font-size: clamp(2.1rem, 1.1rem + 3.9vw, 4.1rem);
  font-weight: 600;
  letter-spacing: -0.028em;
  line-height: 1.02;
  margin: 0;
  max-width: min(16ch, 100%);
}

.search-lede {
  color: var(--ink-muted);
  font-size: 1.02rem;
  margin: 1rem 0 0;
  max-width: min(56ch, 100%);
}

/* base.css wraps the form, the facet block, and the result list in rounded
   white cards with shadows. Cards are the container this system replaced with
   rules, so each one is unwrapped rather than restyled. */
.is-neue .search-form,
.is-neue .search-facets,
.is-neue .search-result-list,
.is-neue .search-result,
.is-neue .search-landing,
.is-neue .search-empty {
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  overflow: visible;
  padding: 0;
}

/* base.css rounds several smaller pieces too, including the pill-shaped facets
   and the mark highlight. Squared corners are not negotiable in this system,
   so this catches anything the rules above did not name. */
.is-neue [class^="search-"],
.is-neue [class*=" search-"] {
  border-radius: 0;
}

/* The query field. A bare ruled line read as another section divider rather
   than as an input, so the field takes the same ground fill the filters below
   it already use, plus a magnifier and a rule that thickens on focus. Filled
   and ruled and marked; no box and no radius. */
.is-neue .search-form {
  padding-top: clamp(1.5rem, 1rem + 2vw, 2.25rem);
}

.search-primary {
  align-items: end;
  display: grid;
  gap: 0.75rem;
  grid-template-columns: minmax(0, 1fr);
}

@media (min-width: 700px) {
  .search-primary {
    grid-template-columns: minmax(0, 1fr) auto;
  }
}

/* A form label is human text, not machine data, so it is not notation. Setting
   it in mono was what made "Search terms" read as an annotation on the rule
   beneath it rather than as the name of a field. */
.is-neue .search-label {
  color: var(--ink);
  display: block;
  font-family: Archivo, system-ui, sans-serif;
  font-size: 0.86rem;
  font-weight: 500;
  letter-spacing: -0.01em;
  margin-bottom: 0.4rem;
  text-transform: none;
}

.search-primary-field {
  position: relative;
}

.search-input-mark {
  color: var(--ink-muted);
  left: 1rem;
  pointer-events: none;
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

.search-input-mark svg {
  display: block;
  fill: currentColor;
  height: 18px;
  width: 18px;
}

.search-primary-field:focus-within .search-input-mark {
  color: var(--link);
}

.is-neue .search-input {
  background: var(--ground);
  border: 0;
  border-bottom: 2px solid var(--rule);
  border-radius: 0;
  box-shadow: none;
  color: var(--ink);
  font-family: Archivo, system-ui, sans-serif;
  font-size: clamp(1.15rem, 0.9rem + 1vw, 1.6rem);
  font-weight: 500;
  letter-spacing: -0.015em;
  min-height: 3.5rem;
  padding: 0 1rem 0 3rem;
  width: 100%;
}

.is-neue .search-input::placeholder {
  color: var(--ink-muted);
  font-weight: 400;
  opacity: 1;
}

.is-neue .search-input:focus {
  background: var(--field);
  border-bottom-color: var(--link);
  box-shadow: none;
  outline: 3px solid var(--link);
  outline-offset: 2px;
}

/* The one filled action on the page, same recipe as the record's. */
.is-neue .search-submit,
.is-neue .search-submit.btn,
.is-neue .search-submit.btn-primary {
  background: var(--action);
  border: 0;
  border-bottom: 3px solid var(--ndltd-gold);
  border-radius: 0;
  box-shadow: none;
  color: var(--knock);
  font-family: Archivo, system-ui, sans-serif;
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  min-height: 3.5rem;
  padding: 0 1.5rem;
}

/* Any other primary button on a converted surface takes the same recipe; the
   empty state's "search everything" fallback is one. */
.is-neue .btn-primary {
  background: var(--action);
  border: 0;
  border-bottom: 3px solid var(--ndltd-gold);
  border-radius: 0;
  box-shadow: none;
  color: var(--knock);
  font-family: Archivo, system-ui, sans-serif;
  font-weight: 600;
  letter-spacing: -0.01em;
  min-height: 44px;
  padding: 0.6rem 1.25rem;
}

@media (hover: hover) {
  .is-neue .search-submit:hover,
  .is-neue .search-submit.btn-primary:hover,
  .is-neue .btn-primary:hover {
    background: var(--action-press);
    color: var(--knock);
  }
}

/* Filters. A disclosure whose summary is a ruled row, not a control. */
.is-neue .search-filters {
  border-top: 1px solid var(--rule-soft);
  margin-top: 1.75rem;
  padding-top: 0.5rem;
}

.is-neue .search-filters-summary {
  align-items: center;
  color: var(--ink);
  cursor: pointer;
  display: flex;
  font-size: 0.86rem;
  font-weight: 500;
  gap: 0.5rem;
  list-style: none;
  min-height: 44px;
  padding: 0;
}

.is-neue .search-filters-summary::-webkit-details-marker {
  display: none;
}

.is-neue .search-filters-summary::before {
  content: "+";
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.9rem;
}

.is-neue .search-filters[open] .search-filters-summary::before {
  content: "\2212";
}

@media (hover: hover) {
  .is-neue .search-filters-summary:hover {
    color: var(--link);
  }
}

.is-neue .search-filters-grid {
  border-top: 1px solid var(--rule-soft);
  column-gap: var(--gutter);
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  padding-top: 1.1rem;
  row-gap: 1.1rem;
}

@media (min-width: 700px) {
  .is-neue .search-filters-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

.is-neue .search-field .form-control,
.is-neue .search-field .form-select {
  background-color: var(--ground);
  border: 0;
  border-radius: 0;
  box-shadow: none;
  color: var(--ink);
  font-family: Archivo, system-ui, sans-serif;
  font-size: 0.94rem;
  min-height: 44px;
  padding: 0 0.7rem;
}

.is-neue .search-field .form-control:focus,
.is-neue .search-field .form-select:focus {
  box-shadow: none;
  outline: 3px solid var(--link);
  outline-offset: 2px;
}

.is-neue .search-hint {
  color: var(--ink-muted);
  font-size: 0.78rem;
  margin: 0.35rem 0 0;
}

/* Results, and the two states that stand in for them. All three open on the
   same 2px rule, so the page has one shape whatever the query returned.
   The .is-neue prefix is required: the card unwrap above zeroes padding at
   that specificity and would otherwise win. */
.is-neue .search-results,
.is-neue .search-empty,
.is-neue .search-landing {
  margin-top: clamp(1.5rem, 1rem + 2vw, 2.5rem);
}

.is-neue .search-empty,
.is-neue .search-landing {
  border-top: 2px solid var(--rule);
  padding-top: 0.55rem;
}

.is-neue .search-empty .search-count {
  margin-top: 0.4rem;
}

.is-neue .search-results-head {
  align-items: baseline;
  border-top: 2px solid var(--rule);
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1rem;
  justify-content: space-between;
  padding-top: 0.55rem;
}

.is-neue .search-results-heading,
.is-neue .search-empty-heading,
.is-neue .search-landing-heading {
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0;
}

.is-neue .search-count {
  color: var(--ink-muted);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  font-size: 0.68rem;
  letter-spacing: -0.02em;
  margin: 0;
}

/* Facets sit beside the results, which is where a reader looks for them.
   Above 1080px they are a left column of ruled rows; below it they collapse
   to inline chips so they cost a few lines rather than a screenful. */
.search-results-layout {
  column-gap: 2.5rem;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  margin-top: 1.5rem;
  row-gap: 1.75rem;
}

@media (min-width: 1080px) {
  .search-results-layout {
    align-items: start;
    grid-template-columns: 15rem minmax(0, 1fr);
  }

  .search-results-layout.has-no-facets {
    grid-template-columns: minmax(0, 1fr);
  }
}

.search-results-body {
  min-width: 0;
}

.is-neue .search-facets {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  margin: 0;
  row-gap: 1.5rem;
}


.search-facet-group {
  border-top: 1px solid var(--rule-soft);
  padding-top: 0.55rem;
}

/* base.css lays these out as a wrapping flex row of pills. Here they are a
   ruled column, so the display has to be reset or the rules become stray
   segments between inline items. */
.is-neue .search-facet-list {
  display: block;
  list-style: none;
  margin: 0.5rem 0 0;
  padding: 0;
}

.is-neue .search-facet-list li + li {
  border-top: 1px solid var(--rule-soft);
}

.is-neue .search-facet {
  align-items: baseline;
  border: 0;
  border-radius: 0;
  color: var(--ink);
  display: grid;
  gap: 0.5rem;
  /* value / count / clear marker. An inactive row has no marker and simply
     leaves the last column at zero width. */
  grid-template-columns: minmax(0, 1fr) auto auto;
  min-height: 44px;
  padding: 0.4rem 0.4rem 0.4rem 0;
  text-decoration: none;
}

.is-neue .search-facet-clear {
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.8rem;
  line-height: 1;
}

@media (hover: hover) {
  .is-neue .search-facet:hover {
    background: var(--ink);
    color: var(--knock);
    padding-left: 0.4rem;
  }
}

.is-neue .search-facet.is-active {
  background: var(--action);
  color: var(--knock);
  padding-left: 0.4rem;
}

.is-neue .search-facet-count {
  color: var(--ink-muted);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  font-size: 0.68rem;
  letter-spacing: -0.02em;
}

.is-neue .search-facet:hover .search-facet-count,
.is-neue .search-facet.is-active .search-facet-count {
  color: var(--band-muted);
}

/* Below the split the column becomes a wrapping chip row, so filters cost a
   few lines instead of a screenful above the results. This has to follow the
   rules above: same specificity, and the cascade decides. */
@media (max-width: 1079.98px) {
  .is-neue .search-facet-list {
    display: flex;
    flex-wrap: wrap;
    gap: 1px;
  }

  .is-neue .search-facet-list li + li {
    border-top: 0;
  }

  .is-neue .search-facet {
    background: var(--ground);
    grid-template-columns: auto auto auto;
    padding: 0.3rem 0.6rem;
  }
}

/* The result register. Each row is numbered with its absolute rank, which is
   information the reader is actually using: "showing 11 to 20 of 3,472". */
.is-neue .search-result-list {
  counter-reset: none;
  list-style: none;
  margin: 1.75rem 0 0;
  padding: 0;
}

.is-neue .search-result {
  border-top: 1px solid var(--rule-soft);
  display: grid;
  gap: 0 var(--gutter);
  grid-template-columns: minmax(0, 1fr);
  padding: 1.1rem 0;
}

.is-neue .search-result:first-child {
  border-top: 2px solid var(--rule);
}

@media (min-width: 860px) {
  .is-neue .search-result {
    grid-template-columns: 3.5rem minmax(0, 1fr);
  }
}

.search-result-body {
  min-width: 0;
}

/* Below 860px the grid is one column, so the rank would take a whole row of
   its own above the title. */
@media (max-width: 859.98px) {
  .search-result-rank {
    display: none;
  }
}

.search-result-rank {
  color: var(--ink-muted);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  font-size: 0.68rem;
  letter-spacing: -0.02em;
  padding-top: 0.3rem;
}

.is-neue .search-result-title {
  font-size: 1.15rem;
  font-weight: 500;
  letter-spacing: -0.015em;
  line-height: 1.25;
  margin: 0;
  max-width: min(52ch, 100%);
}

.is-neue .search-result-title a {
  color: var(--ink);
  text-decoration: none;
}

@media (hover: hover) {
  .is-neue .search-result-title a:hover {
    color: var(--link);
    text-decoration: underline;
    text-underline-offset: 0.18em;
  }
}

.is-neue .search-result-byline {
  color: var(--ink-muted);
  font-size: 0.86rem;
  margin: 0.3rem 0 0;
}

.is-neue .search-result-byline > span:not(:last-child)::after {
  color: var(--rule-soft);
  content: " / ";
}

.is-neue .search-result-year {
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  letter-spacing: -0.02em;
}

.is-neue .search-result-snippet {
  color: var(--ink);
  font-size: 0.94rem;
  line-height: 1.55;
  margin: 0.5rem 0 0;
  max-width: min(72ch, 100%);
}

/* A query match is marked by weight and a rule beneath it, not by a
   highlighter fill, which would be the only other colour on the page. */
.is-neue .search-result-snippet mark,
.is-neue .search-result-title mark {
  background: transparent;
  border-bottom: 2px solid var(--link);
  color: inherit;
  font-weight: 700;
  padding: 0;
}

.is-neue .search-result-meta {
  align-items: baseline;
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1rem;
  margin: 0.55rem 0 0;
}

.is-neue .search-result-repo {
  background: var(--ground);
  border: 0;
  border-radius: 0;
  text-transform: none;
  color: var(--ink);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.68rem;
  letter-spacing: -0.02em;
  padding: 0.2rem 0.45rem;
}

.is-neue .search-result-source {
  color: var(--link);
  font-size: 0.78rem;
  text-decoration: none;
}

@media (hover: hover) {
  .is-neue .search-result-source:hover {
    color: var(--link-press);
    text-decoration: underline;
  }
}

/* Pagination. */
.is-neue .search-pagination {
  align-items: center;
  border-top: 2px solid var(--rule);
  display: flex;
  justify-content: flex-start;
  flex-wrap: wrap;
  gap: 1px;
  margin-top: 1.75rem;
  padding-top: 1.1rem;
}

.is-neue .search-page-list {
  display: flex;
  flex-wrap: wrap;
  gap: 1px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.is-neue .search-pagination-link,
.is-neue .search-page-step {
  align-items: center;
  background: var(--ground);
  border: 0;
  border-radius: 0;
  color: var(--ink);
  display: inline-flex;
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  font-size: 0.72rem;
  justify-content: center;
  letter-spacing: -0.02em;
  min-height: 44px;
  min-width: 44px;
  padding: 0 0.75rem;
  text-decoration: none;
}

@media (hover: hover) {
  .is-neue .search-pagination-link:hover,
  .is-neue .search-page-step:hover {
    background: var(--ink);
    color: var(--knock);
  }
}

.is-neue .search-pagination-link.is-current {
  background: var(--action);
  color: var(--knock);
}

.is-neue .search-page-step.is-disabled {
  background: transparent;
  color: var(--rule-soft);
}

.is-neue .search-page-position {
  color: var(--ink-muted);
  text-align: left;
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  font-size: 0.68rem;
  letter-spacing: -0.02em;
  margin: 0.75rem 0 0;
}

/* Empty and landing states. */
.is-neue .search-empty-note,
.is-neue .search-landing-note,
.is-neue .search-landing-coverage {
  color: var(--ink);
  font-size: 1rem;
  margin: 0.9rem 0 0;
  max-width: min(62ch, 100%);
}

.is-neue .search-landing-coverage {
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  font-size: 0.86rem;
  letter-spacing: -0.02em;
}

.is-neue .search-empty-filters {
  list-style: none;
  margin: 0.75rem 0 0;
  max-width: min(40rem, 100%);
  padding: 0;
}

.is-neue .search-empty-filters li {
  align-items: baseline;
  border-top: 1px solid var(--rule-soft);
  display: grid;
  gap: 0.2rem 1rem;
  grid-template-columns: minmax(0, 10rem) minmax(0, 1fr);
  padding: 0.5rem 0;
}

.is-neue .search-landing-examples {
  display: flex;
  flex-wrap: wrap;
  gap: 1px;
  list-style: none;
  margin: 1.1rem 0 0;
  padding: 0;
}

.is-neue .search-landing-examples a {
  background: var(--ground);
  border-radius: 0;
  color: var(--ink);
  display: inline-block;
  font-size: 0.9rem;
  padding: 0.45rem 0.75rem;
  text-decoration: none;
}

@media (hover: hover) {
  .is-neue .search-landing-examples a:hover {
    background: var(--ink);
    color: var(--knock);
  }
}

/* PRODUCT.md sets 44px as the standing touch-target minimum under coarse
   pointers. The dense rows above stay compact for a mouse and grow for a
   finger, rather than being sized for the worst case everywhere. */
@media (pointer: coarse) {
  .is-neue .record-contents a,
  .is-neue .record-formats a,
  .is-neue .record-terms a,
  .is-neue .search-landing-examples a,
  .is-neue .search-result-source,
  .is-neue .footer-sections a {
    align-items: center;
    min-height: 44px;
  }
}

/* ---------------------------------------------------------------------------
   Prose pages: the portal and the documentation area.

   These templates are raw Bootstrap rather than project classes, so the card
   wrapper is flattened into the page's white field instead of being replaced
   in every template. A card that spans the shell and carries the whole page is
   no longer a card; it is the surface.
   --------------------------------------------------------------------------- */

.is-neue .page-main {
  display: block;
  padding: 0;
}

.is-neue .page-main > .row,
.is-neue .page-main > .row > [class^="col"] {
  margin: 0;
  max-width: none;
  padding: 0;
  width: 100%;
}

/* Consecutive cards are one continuous field. The 2px rule that opens each
   h2 is what divides the page, not a seam between two white blocks. */
.is-neue .page-main .card {
  background: var(--field);
  border: 0;
  border-radius: 0;
  box-shadow: none;
  margin: 0;
}

.is-neue .page-main .card + .card .card-body {
  padding-top: 0;
}

/* width: 100% matters. Bootstrap makes .card a column flex container, and an
   auto cross-axis margin on a flex item shrink-wraps it to its content instead
   of stretching, so cards would each centre at a different width. */
.is-neue .page-main .card-body {
  margin: 0 auto;
  max-width: 1560px;
  padding: clamp(1.75rem, 1rem + 3vw, 3.25rem) var(--pad);
  width: 100%;
}

/* Headings. Bootstrap's h3/h4/h5 utility classes carry the hierarchy in these
   templates, so the system's scale is applied through them. */
.is-neue .page-main h1,
.is-neue .page-main .h3 {
  font-size: clamp(2.1rem, 1.3rem + 2.6vw, 3.2rem);
  font-weight: 600;
  letter-spacing: -0.026em;
  line-height: 1.05;
  margin: 0 0 1.1rem;
  max-width: min(20ch, 100%);
}

.is-neue .page-main h2,
.is-neue .page-main .h4 {
  border-top: 2px solid var(--rule);
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 2.5rem 0 1rem;
  padding-top: 0.55rem;
}

.is-neue .page-main h3,
.is-neue .page-main .h5,
.is-neue .page-main .h6 {
  font-size: 0.94rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 1.75rem 0 0.6rem;
}

.is-neue .page-main p,
.is-neue .page-main li {
  font-size: 1rem;
  line-height: 1.62;
  max-width: min(72ch, 100%);
}

.is-neue .page-main p {
  margin: 0 0 1rem;
}

.is-neue .page-main a {
  color: var(--link);
}

@media (hover: hover) {
  .is-neue .page-main a:hover {
    color: var(--link-press);
  }
}

/* Code and pre. Machine strings, so notation, on the ground fill. */
.is-neue .page-main code {
  background: var(--ground);
  border-radius: 0;
  color: var(--ink);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.82rem;
  letter-spacing: -0.02em;
  padding: 0.1rem 0.35rem;
}

.is-neue .page-main pre {
  background: var(--ground);
  border-radius: 0;
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.8rem;
  letter-spacing: -0.02em;
  line-height: 1.6;
  margin: 0 0 1.25rem;
  padding: 1rem 1.1rem;
}

.is-neue .page-main pre code {
  background: transparent;
  font-size: inherit;
  padding: 0;
}

.is-neue .page-main .bg-body-tertiary {
  background: var(--ground) !important;
  border: 0 !important;
  border-radius: 0 !important;
}

/* Tables run as ruled rows, like every other list in this system. */
.is-neue .page-main table {
  border-collapse: collapse;
  font-size: 0.94rem;
  margin: 0 0 1.5rem;
  width: 100%;
}

.is-neue .page-main th {
  border-bottom: 2px solid var(--rule);
  font-weight: 600;
  padding: 0.5rem 0.75rem 0.5rem 0;
  text-align: left;
}

.is-neue .page-main td {
  border-bottom: 1px solid var(--rule-soft);
  padding: 0.55rem 0.75rem 0.55rem 0;
  vertical-align: top;
}

/* An alert is a ruled note, not a tinted box. */
.is-neue .page-main .alert {
  background: transparent;
  border: 0;
  border-left: 3px solid var(--action);
  border-radius: 0;
  color: var(--ink);
  margin: 0 0 1.5rem;
  padding: 0.2rem 0 0.2rem 1rem;
}

/* The interface index and the docs index: ruled rows carrying a name, a line
   of description, and the endpoint that serves it. */
.page-index {
  border-top: 2px solid var(--rule);
  list-style: none;
  margin: 0 0 1.5rem;
  padding: 0;
}

/* The measure cap on page prose applies to li as well, and would squeeze
   these three columns into a 72ch box. */
.is-neue .page-main .page-index > li {
  border-bottom: 1px solid var(--rule-soft);
  display: grid;
  gap: 0.2rem 2rem;
  grid-template-columns: minmax(0, 1fr);
  max-width: none;
  padding: 0.9rem 0;
}

@media (min-width: 860px) {
  .is-neue .page-main .page-index > li {
    align-items: baseline;
    grid-template-columns: minmax(0, 12rem) minmax(0, 1fr) minmax(0, 27rem);
  }
}

.page-index-name {
  font-size: 0.94rem;
  font-weight: 600;
  letter-spacing: -0.01em;
}

.is-neue .page-main .page-index-note {
  color: var(--ink-muted);
  font-size: 0.94rem;
  margin: 0;
  max-width: none;
}

.page-index-endpoint {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 0.75rem;
}

/* The one filled action, same recipe as the record and the search. */
.is-neue .page-main .btn-primary {
  background: var(--action);
  border: 0;
  border-bottom: 3px solid var(--ndltd-gold);
  border-radius: 0;
  box-shadow: none;
  color: var(--knock);
  display: inline-block;
  font-family: Archivo, system-ui, sans-serif;
  font-weight: 600;
  letter-spacing: -0.01em;
  min-height: 44px;
  padding: 0.7rem 1.25rem;
}

@media (hover: hover) {
  .is-neue .page-main .btn-primary:hover {
    background: var(--action-press);
    color: var(--knock);
  }
}

/* The human-facing callout on a machine-facing page. */
.page-callout {
  border-top: 2px solid var(--rule);
  margin: 2rem 0 0;
  padding-top: 1rem;
}

/* The docs landing page's list-group becomes the same ruled index the portal
   front page uses, since both are a list of interfaces with a description. */
.is-neue .page-main .list-group {
  border-radius: 0;
  border-top: 2px solid var(--rule);
  display: block;
  margin: 0 0 1.5rem;
}

.is-neue .page-main .list-group-item {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--rule-soft);
  border-radius: 0;
  color: var(--ink);
  display: block;
  padding: 0.9rem 0;
  text-decoration: none;
}

@media (hover: hover) {
  .is-neue .page-main a.list-group-item:hover {
    background: var(--ink);
    color: var(--knock);
    padding-left: 0.5rem;
  }

  .is-neue .page-main a.list-group-item:hover .text-secondary {
    color: var(--band-muted) !important;
  }
}

.is-neue .page-main .list-group-item .fw-semibold {
  font-size: 0.94rem;
  font-weight: 600;
  letter-spacing: -0.01em;
}

.is-neue .page-main .list-group-item .small {
  font-size: 0.94rem;
  max-width: min(72ch, 100%);
}

.is-neue .page-main .text-secondary {
  color: var(--ink-muted) !important;
}

/* union/_base.html sets word-break: break-all on code, which snaps inline URLs
   mid-token ("localhost:808 / 1"). Breaking anywhere is only needed when a
   token genuinely cannot fit. */
.is-neue .page-main code {
  overflow-wrap: anywhere;
  word-break: normal;
}

/* ---------------------------------------------------------------------------
   The registry.

   An Operate surface, not a Read one: dense tables, forms, and status. The
   task outranks expression here, so this section mostly removes the retired
   system's card and pill material and lets the tables and forms be legible.
   Everything stays on the same tokens, rules, and squared corners.
   --------------------------------------------------------------------------- */

.is-neue .registry-main {
  display: block;
  margin: 0 auto;
  max-width: 1560px;
  padding: clamp(1.5rem, 1rem + 2vw, 2.5rem) var(--pad);
}

.is-neue .registry-main h1 {
  font-size: clamp(1.7rem, 1.2rem + 1.6vw, 2.4rem);
  font-weight: 600;
  letter-spacing: -0.022em;
  line-height: 1.1;
  margin: 0 0 0.4rem;
}

.is-neue .registry-main h2,
.is-neue .registry-main .h4,
.is-neue .registry-main .h5 {
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0;
}

.is-neue .registry-main .card {
  background: var(--field);
  border: 0;
  border-radius: 0;
  border-top: 2px solid var(--rule);
  box-shadow: none;
  margin: 0 0 1.5rem;
}

.is-neue .registry-main .card-header {
  background: transparent;
  border: 0;
  border-radius: 0;
  font-weight: 600;
  padding: 0.55rem 0 0.7rem;
}

.is-neue .registry-main .card-body {
  padding: 0 0 1rem;
}

.is-neue .registry-main .text-secondary,
.is-neue .registry-main .text-muted {
  color: var(--ink-muted) !important;
}

.is-neue .registry-main .small,
.is-neue .registry-main small {
  font-size: 0.82rem;
}

/* Counters read as notation: they are measurements. Targeted by their own
   class, not by .h4.mb-0, which the page title also carries. */
.is-neue .registry-main .registry-metric {
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-feature-settings: "tnum" 1;
  font-size: 1.4rem;
  font-weight: 500;
  letter-spacing: -0.03em;
}

/* Bootstrap's default code colour is a pink that belongs to no palette here. */
.is-neue .registry-main code {
  background: var(--ground);
  border-radius: 0;
  color: var(--ink);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.8rem;
  letter-spacing: -0.02em;
  overflow-wrap: anywhere;
  padding: 0.1rem 0.35rem;
  word-break: normal;
}

.is-neue .registry-main td code {
  background: transparent;
  padding: 0;
}

/* Tables. Ruled rows, no stripes, no tint, header on a 2px rule. */
.is-neue .registry-main table,
.is-neue .registry-main .table {
  --bs-table-bg: transparent;
  --bs-table-striped-bg: transparent;
  --bs-table-hover-bg: transparent;
  border-collapse: collapse;
  font-size: 0.88rem;
  margin: 0;
  width: 100%;
}

.is-neue .registry-main th {
  background: transparent !important;
  border-bottom: 2px solid var(--rule) !important;
  color: var(--ink);
  font-weight: 600;
  padding: 0.5rem 0.75rem 0.5rem 0;
  text-align: left;
  white-space: nowrap;
}

.is-neue .registry-main td {
  background: transparent !important;
  border-bottom: 1px solid var(--rule-soft) !important;
  color: var(--ink);
  padding: 0.55rem 0.75rem 0.55rem 0;
  vertical-align: top;
}

@media (hover: hover) {
  .is-neue .registry-main tbody tr:hover td {
    background: var(--ground) !important;
  }
}

.is-neue .registry-main .table-light,
.is-neue .registry-main .table-responsive {
  background: transparent;
  border-radius: 0;
}

/* Status. The retired system tinted whole rows; here status is a marked word,
   because a tinted row cannot say which cell is the problem. */
.is-neue .registry-main .badge {
  background: var(--ground) !important;
  border-radius: 0;
  color: var(--ink) !important;
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.7rem;
  font-weight: 400;
  letter-spacing: -0.02em;
  padding: 0.2rem 0.45rem;
}

.is-neue .registry-main .badge.text-bg-success,
.is-neue .registry-main .text-success {
  border-left: 3px solid var(--action);
  color: var(--ink) !important;
  padding-left: 0.45rem;
}

.is-neue .registry-main .text-warning-emphasis,
.is-neue .registry-main .text-danger {
  border-left: 3px solid var(--ndltd-gold);
  color: var(--ink) !important;
  padding-left: 0.45rem;
}

/* Forms. Labels are human text; values are the operator's data. */
.is-neue .registry-main .form-label {
  color: var(--ink);
  display: block;
  font-size: 0.86rem;
  font-weight: 500;
  letter-spacing: -0.01em;
  margin-bottom: 0.3rem;
}

.is-neue .registry-main .form-control,
.is-neue .registry-main .form-select {
  background-color: var(--ground);
  border: 0;
  border-bottom: 1px solid var(--rule);
  border-radius: 0;
  box-shadow: none;
  color: var(--ink);
  font-family: Archivo, system-ui, sans-serif;
  font-size: 0.94rem;
  min-height: 44px;
  padding: 0 0.7rem;
}

.is-neue .registry-main .form-control.font-monospace {
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.82rem;
  letter-spacing: -0.02em;
}

.is-neue .registry-main .form-control:focus,
.is-neue .registry-main .form-select:focus {
  background-color: var(--field);
  border-bottom-color: var(--link);
  box-shadow: none;
  outline: 3px solid var(--link);
  outline-offset: 2px;
}

.is-neue .registry-main .form-text,
.is-neue .registry-main .form-label + .form-text {
  color: var(--ink-muted);
  font-size: 0.78rem;
  margin-top: 0.3rem;
}

.is-neue .registry-main textarea.form-control {
  min-height: 6rem;
  padding: 0.6rem 0.7rem;
}

/* Buttons. One filled action per form; everything else is a ruled control. */
.is-neue .registry-main .btn {
  border-radius: 0;
  box-shadow: none;
  font-family: Archivo, system-ui, sans-serif;
  font-size: 0.86rem;
  font-weight: 500;
  letter-spacing: -0.01em;
  min-height: 44px;
  padding: 0.5rem 0.9rem;
}

.is-neue .registry-main .btn-primary {
  background: var(--action);
  border: 0;
  border-bottom: 3px solid var(--ndltd-gold);
  color: var(--knock);
  font-weight: 600;
}

.is-neue .registry-main .btn-outline-secondary,
.is-neue .registry-main .btn-secondary {
  background: var(--ground);
  border: 0;
  color: var(--ink);
}

.is-neue .registry-main .btn-sm {
  font-size: 0.78rem;
  min-height: 36px;
  padding: 0.3rem 0.6rem;
}

@media (pointer: coarse) {
  .is-neue .registry-main .btn-sm {
    min-height: 44px;
  }
}

@media (hover: hover) {
  .is-neue .registry-main .btn-primary:hover {
    background: var(--action-press);
    color: var(--knock);
  }

  .is-neue .registry-main .btn-outline-secondary:hover,
  .is-neue .registry-main .btn-secondary:hover {
    background: var(--ink);
    color: var(--knock);
  }
}

.is-neue .registry-main a {
  color: var(--link);
}

.is-neue .registry-main .page-link {
  background: var(--ground);
  border: 0;
  border-radius: 0;
  color: var(--ink);
  font-family: "Azeret Mono", ui-monospace, monospace;
  font-size: 0.72rem;
  min-height: 44px;
  min-width: 44px;
}

.is-neue .registry-main .page-item.active .page-link {
  background: var(--action);
  color: var(--knock);
}

.is-neue .registry-main .alert {
  background: transparent;
  border: 0;
  border-left: 3px solid var(--action);
  border-radius: 0;
  color: var(--ink);
  padding: 0.2rem 0 0.2rem 1rem;
}

/* Card headers and footers keep Bootstrap's cap background and borders unless
   named; a footer strip reads as the bottom of a box this system does not have. */
.is-neue .registry-main .card-footer {
  background: transparent;
  border: 0;
  border-top: 1px solid var(--rule-soft);
  border-radius: 0;
  padding: 0.75rem 0 0;
}

.is-neue .registry-main .card {
  border-bottom: 0;
  border-left: 0;
  border-right: 0;
}

.is-neue .registry-main .table-responsive {
  border: 0;
}

/* The registry has no white field of its own, so its ground-filled inputs sat
   on the ground-coloured page and stopped reading as inputs. The same failure
   the search field had. The page takes the white field; the inputs keep the
   fill that distinguishes them from it. */
body.is-neue:has(.registry-main),
body.is-neue:has(.registry-main).bg-light {
  background: var(--field) !important;
}
