/* ==========================================================================
   UNDERVISION — field-service design system
   Direction: the technician's bench and the work order they leave behind.
   ESD-mat teal, ground-strap yellow, IBM Plex (Sans / Condensed / Mono).
   Data is set in mono because on this site the data is the product:
   ticket numbers, transit clocks, work clocks.
   ========================================================================== */

:root {
  /* Surfaces — cool bench neutrals */
  --uv-bench:        #EDF1F0;
  --uv-bench-sunk:   #E3E9E8;
  --uv-paper:        #FFFFFF;
  --uv-line:         #D2DCDD;
  --uv-line-soft:    #E6ECEC;

  /* Chrome — ESD mat */
  --uv-slate-900:    #0E2229;
  --uv-slate-800:    #14313A;
  --uv-slate-700:    #1D4552;
  --uv-slate-600:    #2C5C6B;

  /* Accents */
  --uv-strap:        #F2B417;   /* ground-strap yellow — primary accent */
  --uv-strap-deep:   #C08D08;
  --uv-copper:       #C4703A;
  --uv-signal:       #2E9469;
  --uv-alert:        #C4453C;
  --uv-transit:      #2C7DA0;

  /* Ink */
  --uv-ink:          #0F1A1D;
  --uv-ink-2:        #3F5459;
  --uv-ink-3:        #6B8085;
  --uv-on-dark:      #E9F1F1;
  --uv-on-dark-2:    #9FB8BC;

  /* Type */
  --uv-sans:  "IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --uv-cond:  "IBM Plex Sans Condensed", "IBM Plex Sans", ui-sans-serif, system-ui, sans-serif;
  --uv-mono:  "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  /* Space + shape */
  --uv-r:     4px;          /* the whole system is square-ish: bench equipment, not app store */
  --uv-r-lg:  6px;
  --uv-shadow:      0 1px 2px rgba(14,34,41,.06), 0 2px 8px rgba(14,34,41,.05);
  --uv-shadow-lift: 0 2px 4px rgba(14,34,41,.08), 0 10px 24px rgba(14,34,41,.10);
  --uv-nav-h: 68px;

  /* ------------------------------------------------------------------
     Bootstrap theme remap.

     uv.css used to restyle Bootstrap component by component, which left
     every *utility* class painting stock Bootstrap colours: `text-primary`
     rendered #0d6efd (a blue that appears nowhere in this brand) 22 times,
     `text-success` rendered #198754 35 times, and `.display-*` fell back to
     Bootstrap's font stack, bypassing the Plex Condensed scale entirely.

     Reassigning the variables fixes all of that at the source, so a stray
     Bootstrap class can no longer reintroduce a foreign colour.
     ------------------------------------------------------------------ */

  /* Theme colours */
  --bs-primary:            var(--uv-slate-700);
  --bs-primary-rgb:        29, 69, 82;
  --bs-secondary:          var(--uv-ink-3);
  --bs-secondary-rgb:      107, 128, 133;
  --bs-success:            var(--uv-signal);
  --bs-success-rgb:        46, 148, 105;
  --bs-danger:             var(--uv-alert);
  --bs-danger-rgb:         196, 69, 60;
  --bs-warning:            var(--uv-strap);
  --bs-warning-rgb:        242, 180, 23;
  --bs-info:               var(--uv-transit);
  --bs-info-rgb:           44, 125, 160;
  --bs-light:              var(--uv-bench);
  --bs-light-rgb:          237, 241, 240;
  --bs-dark:               var(--uv-slate-900);
  --bs-dark-rgb:           14, 34, 41;

  /* Text utilities (.text-primary, .text-muted, ...) */
  --bs-primary-text-emphasis:   var(--uv-slate-700);
  --bs-secondary-text-emphasis: var(--uv-ink-2);
  --bs-success-text-emphasis:   #1F6B4B;
  --bs-danger-text-emphasis:    #93332C;
  --bs-warning-text-emphasis:   var(--uv-strap-deep);
  --bs-info-text-emphasis:      #1F5B75;
  --bs-secondary-color:         var(--uv-ink-2);   /* .text-muted, 44 uses */
  --bs-tertiary-color:          var(--uv-ink-3);

  /* Subtle fills used by .alert-*, .bg-*-subtle */
  --bs-primary-bg-subtle:   #E7EEF0;
  --bs-secondary-bg-subtle: var(--uv-bench-sunk);
  --bs-success-bg-subtle:   #E4F1EB;
  --bs-danger-bg-subtle:    #F7E7E6;
  --bs-warning-bg-subtle:   #FDF3DA;
  --bs-info-bg-subtle:      #E4EFF4;
  --bs-primary-border-subtle:   #C7D6DA;
  --bs-secondary-border-subtle: var(--uv-line);
  --bs-success-border-subtle:   #BFE0D0;
  --bs-danger-border-subtle:    #EFC7C4;
  --bs-warning-border-subtle:   #F6DFA4;
  --bs-info-border-subtle:      #C4DCE7;

  /* Body + surfaces */
  --bs-body-bg:        var(--uv-bench);
  --bs-body-color:     var(--uv-ink);
  --bs-body-color-rgb: 15, 26, 29;
  --bs-emphasis-color: var(--uv-ink);
  --bs-secondary-bg:   var(--uv-bench-sunk);
  --bs-tertiary-bg:    var(--uv-bench);

  /* Type — so .display-* and .lead inherit the Plex scale */
  --bs-body-font-family:    var(--uv-sans);
  --bs-body-font-size:      15px;
  --bs-body-line-height:    1.6;
  --bs-font-monospace:      var(--uv-mono);
  --bs-heading-font-family: var(--uv-cond);

  /* Borders + radii — the system is square-ish, not app-store rounded */
  --bs-border-color:            var(--uv-line);
  --bs-border-color-translucent: var(--uv-line);
  --bs-border-radius:      var(--uv-r);
  --bs-border-radius-sm:   2px;
  --bs-border-radius-lg:   var(--uv-r-lg);
  --bs-border-radius-xl:   var(--uv-r-lg);
  --bs-border-radius-2xl:  var(--uv-r-lg);
  --bs-border-radius-pill: var(--uv-r-lg);   /* no pills in a field-service system */

  /* Links + focus */
  --bs-link-color:       var(--uv-slate-600);
  --bs-link-hover-color: var(--uv-copper);
  --bs-link-color-rgb:   44, 92, 107;
  --bs-focus-ring-color: rgba(242,180,23,.45);
}

/* .display-1..6 must use the condensed display face, not Bootstrap's stack. */
.display-1, .display-2, .display-3,
.display-4, .display-5, .display-6 {
  font-family: var(--uv-cond);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.08;
}

/* ---------- Base ---------- */
* { box-sizing: border-box; }

body {
  background: var(--uv-bench);
  color: var(--uv-ink);
  font-family: var(--uv-sans);
  font-size: 15px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  padding-top: 0;
}
/* the old full-bleed code.png wash is gone: 1.9MB of decoration on every view */
body::before { content: none !important; }

::selection { background: var(--uv-strap); color: var(--uv-slate-900); }

a { color: var(--uv-slate-600); text-decoration: none; border-bottom: 1px solid rgba(44,92,107,.28); transition: color .15s, border-color .15s; }
a:hover { color: var(--uv-copper); border-bottom-color: var(--uv-copper); }
a.btn, a.uv-plain, .navbar a, .dropdown-item, .nav-link-modern, footer a, .list-group-item a, a.card, .card a.stretched-link { border-bottom: none; }

:focus-visible {
  outline: 2px solid var(--uv-strap);
  outline-offset: 2px;
  border-radius: 2px;
}

/* ---------- Typography ---------- */
h1, h2, h3, h4, h5, h6 {
  font-family: var(--uv-cond);
  color: var(--uv-ink);
  font-weight: 600;
  letter-spacing: -0.005em;
  line-height: 1.18;
  margin: 0 0 .6em;
}
h1 { font-size: clamp(1.9rem, 1.3rem + 2.4vw, 2.85rem); font-weight: 700; letter-spacing: -0.015em; }
h2 { font-size: clamp(1.5rem, 1.15rem + 1.5vw, 2.05rem); font-weight: 700; }
h3 { font-size: 1.32rem; }
h4 { font-size: 1.12rem; }
h5 { font-size: 1rem; }
h6 { font-size: .9rem; }

p { margin: 0 0 1rem; color: var(--uv-ink-2); }
p.lead, .lead { font-size: 1.12rem; line-height: 1.62; color: var(--uv-ink-2); }
strong, b { font-weight: 600; color: var(--uv-ink); }
hr { border: 0; border-top: 1px solid var(--uv-line); opacity: 1; margin: 2rem 0; }
small, .small { font-size: .85rem; }

/* The label voice of the whole site: mono, uppercase, tracked out.
   Used for eyebrows, field labels, table heads, meta. */
.uv-label, .uv-eyebrow {
  font-family: var(--uv-mono);
  font-size: .68rem;
  font-weight: 500;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--uv-ink-3);
}
.uv-eyebrow { display: inline-flex; align-items: center; gap: .5rem; margin-bottom: .75rem; color: var(--uv-slate-600); }
.uv-eyebrow::before { content: ""; width: 18px; height: 2px; background: var(--uv-strap); }
.uv-mono { font-family: var(--uv-mono); font-variant-numeric: tabular-nums; }

/* Section heading with the strap rule under it (replaces the old gradient underline) */
.section-title {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: clamp(1.45rem, 1.1rem + 1.4vw, 1.95rem);
  color: var(--uv-ink);
  margin-bottom: 1.5rem;
  padding-bottom: .65rem;
  position: relative;
}
.section-title::after {
  content: ""; position: absolute; left: 0; bottom: 0;
  width: 44px; height: 3px; background: var(--uv-strap);
}
.section-title.text-center::after { left: 50%; transform: translateX(-50%); }
.section-divider { height: 1px; background: var(--uv-line); border: 0; margin: 2.5rem 0; }

/* ---------- Navbar ---------- */
.navbar-spacer { height: var(--uv-nav-h); }
/* When the page opens on a full-bleed hero, the hero absorbs the navbar offset
   itself so there is no dead band between chrome and content. */
/* Any full-bleed page head tucks under the fixed navbar. This used to name
   .hero-section only, so index.php looked right while services.php and
   about.php (which use .about-hero) kept a dead 68px band below the navbar. */
body:has(.uv-pagehead) .navbar-spacer,
body:has(.hero-section) .navbar-spacer,
body:has(.uv-auth)      .navbar-spacer,
body:has(.about-hero)   .navbar-spacer { display: none; }

body:has(.uv-pagehead) .uv-pagehead,
body:has(.hero-section) .hero-section,
body:has(.about-hero)   .about-hero {
  padding-top: calc(var(--uv-nav-h) + clamp(2.5rem, 1.6rem + 4vw, 4.5rem));
}

.navbar-modern {
  background: var(--uv-slate-900);
  border-bottom: 1px solid rgba(255,255,255,.06);
  box-shadow: none;
  backdrop-filter: none;
  padding: 0;
  min-height: var(--uv-nav-h);
  position: relative;
}
/* one hairline of strap yellow across the top edge — the grounded indicator */
.navbar-modern::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 2px;
  background: linear-gradient(90deg, var(--uv-strap) 0 22%, transparent 22%);
}
.navbar-modern::after { content: none; }         /* kill the 711KB skyline wash */
.navbar-modern > * { position: relative; z-index: 1; }

.navbar-modern .container-fluid { min-height: var(--uv-nav-h); gap: .5rem; }

.navbar-modern .navbar-brand { display: flex; align-items: center; gap: .6rem; padding: 0; margin: 0; }
.navbar-modern .site-logo { height: 30px; width: auto; display: block; }
.navbar-modern .brand-text {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: 1.16rem;
  letter-spacing: .17em;
  color: #fff;
  text-transform: uppercase;
}
.navbar-modern .navbar-brand:hover { transform: none; }
.navbar-modern .navbar-brand:hover .brand-text { color: var(--uv-strap); }

.nav-link-modern {
  display: inline-flex; align-items: center;
  font-family: var(--uv-cond);
  font-size: .95rem;
  font-weight: 500;
  letter-spacing: .02em;
  color: var(--uv-on-dark-2);
  padding: .55rem .85rem;
  border-radius: var(--uv-r);
  transition: color .15s, background-color .15s;
  white-space: nowrap;
}
.nav-link-modern:hover, .nav-link-modern:focus-visible { color: #fff; background: rgba(255,255,255,.06); }
.nav-link-modern.is-active { color: var(--uv-slate-900); background: var(--uv-strap); font-weight: 600; }
.nav-link-modern i { opacity: .8; }

/* Search — a bench readout, not a pill */
.navbar-modern .search-form { margin: 0; }
.navbar-modern .search-wrapper { position: relative; display: flex; align-items: center; }
.navbar-modern .search-icon { position: absolute; left: .65rem; z-index: 2; color: var(--uv-on-dark-2); font-size: .85rem; pointer-events: none; }
.navbar-modern .search-input {
  width: 190px;
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.12);
  color: #fff;
  font-family: var(--uv-mono);
  font-size: .8rem;
  border-radius: var(--uv-r);
  padding: .42rem .6rem .42rem 2rem;
}
.navbar-modern .search-input::placeholder { color: var(--uv-on-dark-2); }
.navbar-modern .search-input:focus {
  background: rgba(255,255,255,.10);
  border-color: var(--uv-strap);
  color: #fff;
  box-shadow: none;
  outline: none;
  width: 230px;
}
.navbar-toggler { border-color: rgba(255,255,255,.18); padding: .35rem .55rem; }
.navbar-toggler:focus { box-shadow: none; outline: 2px solid var(--uv-strap); }
.navbar-toggler-icon {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23E9F1F1' stroke-linecap='round' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}
.navbar-modern .dropdown-menu {
  background: var(--uv-slate-800);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: var(--uv-r);
  padding: .35rem;
}
.navbar-modern .dropdown-item { color: var(--uv-on-dark); border-radius: 3px; font-size: .9rem; padding: .5rem .7rem; }
.navbar-modern .dropdown-item:hover { background: rgba(255,255,255,.08); color: #fff; }
.navbar-modern .dropdown-divider { border-color: rgba(255,255,255,.12); }

/* ---------- Layout shells ----------
   The old shell nested a white card inside a dark gradient slab. Now the page
   itself is the bench and content sits on plain paper with a hairline. */
.content-wrap { min-height: 60vh; }

.main-content-area {
  width: 100%;
  max-width: 1180px;
  margin: 2.25rem auto 3rem;
  padding: 0 1.25rem;
  background: none;
  box-shadow: none;
  border-radius: 0;
  overflow: visible;
}
.main-content-area::before { content: none; }

.inner-content-box {
  background: var(--uv-paper);
  border: 1px solid var(--uv-line);
  border-radius: var(--uv-r-lg);
  box-shadow: var(--uv-shadow);
  padding: 2.5rem;
  transition: none;
}
.inner-content-box:hover { transform: none; box-shadow: var(--uv-shadow); }
.uv-narrow { max-width: 760px; }

@media (max-width: 767.98px) {
  .main-content-area { margin: 1.25rem auto 2rem; padding: 0 .85rem; }
  .inner-content-box { padding: 1.35rem; }
}

/* ---------- Buttons ---------- */
.btn {
  font-family: var(--uv-cond);
  font-weight: 600;
  font-size: .95rem;
  letter-spacing: .015em;
  border-radius: var(--uv-r);
  padding: .55rem 1.15rem;
  border-width: 1px;
  transition: background-color .15s, border-color .15s, color .15s;
}
.btn:focus-visible { outline: 2px solid var(--uv-strap); outline-offset: 2px; box-shadow: none; }

.btn-primary, .btn-hero-primary {
  background: var(--uv-slate-800); border-color: var(--uv-slate-800); color: #fff;
}
.btn-primary:hover, .btn-hero-primary:hover { background: var(--uv-slate-900); border-color: var(--uv-slate-900); color: #fff; }

.btn-warning, .btn-strap {
  background: var(--uv-strap); border-color: var(--uv-strap); color: var(--uv-slate-900);
}
.btn-warning:hover, .btn-strap:hover { background: var(--uv-strap-deep); border-color: var(--uv-strap-deep); color: #fff; }

.btn-outline-primary {
  color: var(--uv-slate-700); border-color: var(--uv-line); background: var(--uv-paper);
}
.btn-outline-primary:hover { background: var(--uv-slate-800); border-color: var(--uv-slate-800); color: #fff; }

.btn-secondary { background: var(--uv-ink-3); border-color: var(--uv-ink-3); color: #fff; }
.btn-secondary:hover { background: var(--uv-ink-2); border-color: var(--uv-ink-2); }
.btn-success { background: var(--uv-signal); border-color: var(--uv-signal); }
.btn-success:hover { background: #247753; border-color: #247753; }
.btn-danger { background: var(--uv-alert); border-color: var(--uv-alert); }
.btn-danger:hover { background: #a83831; border-color: #a83831; }
.btn-outline-secondary { color: var(--uv-ink-2); border-color: var(--uv-line); }
.btn-outline-secondary:hover { background: var(--uv-bench-sunk); color: var(--uv-ink); border-color: var(--uv-line); }
.btn-outline-danger { color: var(--uv-alert); border-color: rgba(196,69,60,.35); }
.btn-outline-danger:hover { background: var(--uv-alert); border-color: var(--uv-alert); color: #fff; }
.btn-lg { padding: .75rem 1.6rem; font-size: 1.05rem; }
.btn-sm { padding: .35rem .75rem; font-size: .85rem; }

/* Dead admin style kept from the old sheet, now consistent */
.btn-admin { background: var(--uv-slate-700); border-color: var(--uv-slate-700); color: #fff; }

/* ---------- Cards, forms, tables, alerts ---------- */
.card {
  background: var(--uv-paper);
  border: 1px solid var(--uv-line);
  border-radius: var(--uv-r-lg);
  box-shadow: none;
}
.card-header {
  background: var(--uv-bench-sunk);
  border-bottom: 1px solid var(--uv-line);
  font-family: var(--uv-cond);
  font-weight: 600;
  color: var(--uv-ink);
  padding: .8rem 1.1rem;
}
.card-header h1, .card-header h2, .card-header h3, .card-header h4, .card-header h5, .card-header h6 { margin: 0; }
.card-body { padding: 1.25rem; }
.card-footer { background: var(--uv-bench-sunk); border-top: 1px solid var(--uv-line); }

.form-label {
  font-family: var(--uv-mono);
  font-size: .68rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--uv-ink-3);
  font-weight: 500;
  margin-bottom: .35rem;
}
.form-control, .form-select {
  border: 1px solid var(--uv-line);
  border-radius: var(--uv-r);
  padding: .55rem .7rem;
  font-size: .95rem;
  color: var(--uv-ink);
  background-color: var(--uv-paper);
}
.form-control:focus, .form-select:focus {
  border-color: var(--uv-slate-600);
  box-shadow: 0 0 0 3px rgba(44,92,107,.12);
}
.form-control::placeholder { color: #9AACB0; }
.form-control:disabled, .form-control[readonly] { background: var(--uv-bench-sunk); color: var(--uv-ink-3); }
.form-text { color: var(--uv-ink-3); font-size: .82rem; }
.input-group-text { background: var(--uv-bench-sunk); border-color: var(--uv-line); color: var(--uv-ink-2); font-family: var(--uv-mono); }
textarea.form-control { line-height: 1.55; }

.table { color: var(--uv-ink); margin-bottom: 0; }
.table > thead > tr > th {
  font-family: var(--uv-mono);
  font-size: .68rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--uv-ink-3);
  background: var(--uv-bench-sunk);
  border-bottom: 1px solid var(--uv-line);
  padding: .7rem .8rem;
  white-space: nowrap;
}
.table > tbody > tr > td { padding: .75rem .8rem; border-bottom: 1px solid var(--uv-line-soft); vertical-align: middle; }
.table-hover > tbody > tr:hover > td { background: var(--uv-bench); }
.table-responsive { border-radius: var(--uv-r); }

.alert { border: 1px solid transparent; border-left-width: 3px; border-radius: var(--uv-r); font-size: .93rem; padding: .8rem 1rem; }
.alert-success { background: #E8F5EF; border-color: var(--uv-signal); color: #1C5F44; }
.alert-danger  { background: #FBECEB; border-color: var(--uv-alert); color: #8E2F29; }
.alert-warning { background: #FDF4DE; border-color: var(--uv-strap); color: #7A5A05; }
.alert-info    { background: #E8F0F4; border-color: var(--uv-transit); color: #1F5A73; }

.badge { font-family: var(--uv-mono); font-weight: 500; letter-spacing: .06em; border-radius: 3px; padding: .32em .55em; font-size: .72rem; }

.list-group-item { border-color: var(--uv-line-soft); padding: .85rem 1rem; }
.modal-content { border: 1px solid var(--uv-line); border-radius: var(--uv-r-lg); }
.modal-header { border-bottom: 1px solid var(--uv-line); background: var(--uv-bench-sunk); }
.modal-footer { border-top: 1px solid var(--uv-line); }
.breadcrumb { font-size: .85rem; }
.breadcrumb-item + .breadcrumb-item::before { content: "/"; color: var(--uv-ink-3); }

/* ---------- Status chips — one vocabulary everywhere ---------- */
.uv-chip {
  display: inline-flex; align-items: center; gap: .4rem;
  font-family: var(--uv-mono);
  font-size: .7rem;
  font-weight: 500;
  letter-spacing: .1em;
  text-transform: uppercase;
  padding: .28rem .55rem;
  border-radius: 3px;
  border: 1px solid transparent;
  white-space: nowrap;
}
.uv-chip::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.uv-chip-pending     { background: #FDF4DE; color: #7A5A05; border-color: rgba(242,180,23,.35); }
.uv-chip-confirmed   { background: #E8F0F4; color: #1F5A73; border-color: rgba(44,125,160,.28); }
.uv-chip-in-transit  { background: #E4EFF5; color: #1C5F7E; border-color: rgba(44,125,160,.4); }
.uv-chip-arrived     { background: #E4EFF5; color: #1C5F7E; border-color: rgba(44,125,160,.4); }
.uv-chip-in-progress { background: #FBEEE4; color: #8A4A1D; border-color: rgba(196,112,58,.35); }
.uv-chip-completed   { background: #E8F5EF; color: #1C5F44; border-color: rgba(46,148,105,.35); }
.uv-chip-cancelled   { background: #FBECEB; color: #8E2F29; border-color: rgba(196,69,60,.3); }
.uv-chip-archived    { background: var(--uv-bench-sunk); color: var(--uv-ink-3); border-color: var(--uv-line); }

/* ---------- SIGNATURE: the dispatch rail ----------
   The one thing this business does that a shop does not: it drives to you and
   runs a clock while it does. The rail is that clock, and it is the same
   component for the customer, the public tracker and the admin. */
.uv-rail { margin: 0; padding: 0; list-style: none; position: relative; }
.uv-rail::before {
  content: ""; position: absolute; left: 11px; top: 12px; bottom: 12px;
  width: 2px; background: var(--uv-line);
}
.uv-rail-step { position: relative; padding: 0 0 1.35rem 2.4rem; }
.uv-rail-step:last-child { padding-bottom: 0; }
.uv-rail-dot {
  position: absolute; left: 4px; top: 3px;
  width: 16px; height: 16px; border-radius: 50%;
  background: var(--uv-paper);
  border: 2px solid var(--uv-line);
  z-index: 1;
}
.uv-rail-name { font-family: var(--uv-cond); font-weight: 600; font-size: 1rem; color: var(--uv-ink-3); line-height: 1.25; }
.uv-rail-time { font-family: var(--uv-mono); font-size: .74rem; color: var(--uv-ink-3); font-variant-numeric: tabular-nums; }
.uv-rail-dur {
  display: inline-block; margin-top: .2rem;
  font-family: var(--uv-mono); font-size: .72rem; letter-spacing: .04em;
  color: var(--uv-slate-700); background: var(--uv-bench-sunk);
  border: 1px solid var(--uv-line); border-radius: 3px; padding: .1rem .4rem;
}

.uv-rail-step.is-done .uv-rail-dot { background: var(--uv-signal); border-color: var(--uv-signal); }
.uv-rail-step.is-done .uv-rail-name { color: var(--uv-ink); }
.uv-rail-step.is-current .uv-rail-dot { background: var(--uv-strap); border-color: var(--uv-strap); box-shadow: 0 0 0 4px rgba(242,180,23,.22); }
.uv-rail-step.is-current .uv-rail-name { color: var(--uv-ink); font-weight: 700; }
.uv-rail-step.is-current .uv-rail-time { color: var(--uv-slate-700); }

/* Horizontal variant for wide screens */
@media (min-width: 768px) {
  .uv-rail-h { display: flex; gap: 0; }
  .uv-rail-h::before { left: 12px; right: 12px; top: 10px; bottom: auto; width: auto; height: 2px; }
  .uv-rail-h .uv-rail-step { flex: 1; padding: 2.1rem .5rem 0 0; }
  .uv-rail-h .uv-rail-dot { left: 0; top: 2px; }
}

/* ---------- Work-order chrome ---------- */
.uv-workorder {
  background: var(--uv-paper);
  border: 1px solid var(--uv-line);
  border-radius: var(--uv-r-lg);
  box-shadow: var(--uv-shadow);
  overflow: hidden;
}
.uv-workorder-head {
  display: flex; flex-wrap: wrap; align-items: center; gap: .75rem 1.25rem;
  padding: 1rem 1.25rem;
  background: var(--uv-slate-900);
  color: #fff;
}
.uv-workorder-no {
  font-family: var(--uv-mono);
  font-size: 1.15rem;
  font-weight: 500;
  letter-spacing: .06em;
  color: var(--uv-strap);
}
.uv-workorder-head .uv-label { color: var(--uv-on-dark-2); }
.uv-tear { border: 0; border-top: 1px dashed var(--uv-line); margin: 0; }

/* Field list: mono label over sans value, the work-order reading order */
.uv-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 1.1rem 1.5rem; }
.uv-field { min-width: 0; }
.uv-field > .uv-label { display: block; margin-bottom: .15rem; }
.uv-field-value { font-size: .98rem; color: var(--uv-ink); overflow-wrap: anywhere; }
.uv-field-value.is-empty { color: var(--uv-ink-3); font-style: italic; }

/* Disclosure: the "add that stuff, but not by default" pattern */
.uv-disclosure { border-top: 1px solid var(--uv-line-soft); }
.uv-disclosure-btn {
  display: flex; align-items: center; gap: .55rem;
  width: 100%; text-align: left;
  background: none; border: 0;
  padding: .8rem 1.25rem;
  font-family: var(--uv-cond); font-weight: 600; font-size: .95rem;
  color: var(--uv-slate-700);
  cursor: pointer;
}
.uv-disclosure-btn:hover { background: var(--uv-bench); color: var(--uv-ink); }
.uv-disclosure-btn .bi-chevron-right { transition: transform .18s ease; font-size: .8rem; }
.uv-disclosure-btn[aria-expanded="true"] .bi-chevron-right { transform: rotate(90deg); }
.uv-disclosure-body { padding: 0 1.25rem 1.25rem; }

/* Message thread */
.uv-thread { display: flex; flex-direction: column; gap: .85rem; }
.uv-msg { border: 1px solid var(--uv-line); border-radius: var(--uv-r); padding: .7rem .9rem; background: var(--uv-paper); }
.uv-msg-admin { background: #F3F7F8; border-color: #D6E3E6; }
.uv-msg-head { display: flex; justify-content: space-between; gap: 1rem; margin-bottom: .3rem; }
.uv-msg-who { font-family: var(--uv-cond); font-weight: 600; font-size: .9rem; color: var(--uv-ink); }
.uv-msg-when { font-family: var(--uv-mono); font-size: .7rem; color: var(--uv-ink-3); }
.uv-msg-body { font-size: .94rem; color: var(--uv-ink-2); white-space: pre-wrap; margin: 0; }

/* ---------- Hero ---------- */
.hero-section {
  background: var(--uv-slate-900);
  color: #fff;
  padding: clamp(3rem, 2rem + 6vw, 5.5rem) 0 clamp(2.5rem, 2rem + 4vw, 4rem);
  position: relative;
  overflow: hidden;
  border-bottom: 2px solid var(--uv-strap);
}
/* faint bench grid, drawn not downloaded */
.hero-section::before {
  content: ""; position: absolute; inset: 0;
  background-image: linear-gradient(rgba(255,255,255,.035) 1px, transparent 1px),
                    linear-gradient(90deg, rgba(255,255,255,.035) 1px, transparent 1px);
  background-size: 32px 32px;
  pointer-events: none;
}
.hero-content { position: relative; z-index: 1; max-width: 1180px; margin: 0 auto; padding: 0 1.25rem; }
.hero-title {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: clamp(2.1rem, 1.3rem + 3.6vw, 3.6rem);
  line-height: 1.06;
  letter-spacing: -0.02em;
  color: #fff;
  margin-bottom: .9rem;
  max-width: 18ch;
}
.hero-title em { font-style: normal; color: var(--uv-strap); }
.hero-subtitle {
  font-size: clamp(1rem, .95rem + .3vw, 1.15rem);
  color: var(--uv-on-dark-2);
  max-width: 56ch;
  margin-bottom: 1.75rem;
}
.hero-actions, .hero-buttons { display: flex; flex-wrap: wrap; gap: .75rem; }
.btn-hero, .btn-hero-primary, .btn-hero-secondary {
  font-family: var(--uv-cond); font-weight: 600; font-size: 1rem;
  padding: .7rem 1.4rem; border-radius: var(--uv-r); border: 1px solid transparent;
  display: inline-flex; align-items: center; gap: .5rem;
}
.btn-hero-primary { background: var(--uv-strap); color: var(--uv-slate-900); border-color: var(--uv-strap); }
.btn-hero-primary:hover { background: #FFC533; color: var(--uv-slate-900); }
.btn-hero-secondary { background: transparent; color: #fff; border-color: rgba(255,255,255,.35); }
.btn-hero-secondary:hover { background: rgba(255,255,255,.10); color: #fff; border-color: rgba(255,255,255,.6); }

/* ---------- Marketing blocks ---------- */
.features-section, .projects-preview-section, .articles-preview-section { padding: 2.5rem 0; }

.feature-card, .feature-card-large, .project-preview-card, .article-card {
  background: var(--uv-paper);
  border: 1px solid var(--uv-line);
  border-radius: var(--uv-r-lg);
  padding: 1.5rem;
  height: 100%;
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
.feature-card:hover, .feature-card-large:hover, .project-preview-card:hover, .article-card:hover {
  border-color: var(--uv-slate-600);
  box-shadow: var(--uv-shadow-lift);
  transform: translateY(-2px);
}
.feature-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 42px; height: 42px;
  border-radius: var(--uv-r);
  background: var(--uv-bench-sunk);
  color: var(--uv-slate-700);
  font-size: 1.25rem;
  margin-bottom: .9rem;
  border: 1px solid var(--uv-line);
}
.feature-title { font-family: var(--uv-cond); font-weight: 600; font-size: 1.12rem; color: var(--uv-ink); margin-bottom: .4rem; }
.feature-description { color: var(--uv-ink-2); font-size: .94rem; margin: 0; }

.project-preview-card { padding: 0; overflow: hidden; }
.project-preview-img { width: 100%; height: 168px; object-fit: cover; display: block; border-bottom: 1px solid var(--uv-line); }
.project-preview-content { padding: 1.1rem 1.25rem; }

.article-card { display: flex; flex-direction: column; }
.article-date { font-family: var(--uv-mono); font-size: .7rem; letter-spacing: .1em; text-transform: uppercase; color: var(--uv-ink-3); margin-bottom: .4rem; }
.article-title { font-family: var(--uv-cond); font-weight: 600; font-size: 1.08rem; margin-bottom: .4rem; }
.article-excerpt { color: var(--uv-ink-2); font-size: .92rem; flex: 1; }
.article-link { font-family: var(--uv-cond); font-weight: 600; color: var(--uv-slate-700); }

.cta-section {
  background: var(--uv-slate-800);
  color: #fff;
  border-radius: var(--uv-r-lg);
  padding: 2.25rem;
  text-align: center;
  border-left: 3px solid var(--uv-strap);
}
.cta-title { font-family: var(--uv-cond); font-weight: 700; color: #fff; font-size: 1.6rem; margin-bottom: .5rem; }
.cta-description { color: var(--uv-on-dark-2); margin-bottom: 1.25rem; }

/* Stat tiles — numbers in mono because they are readings */
.dashboard-stat-card {
  background: var(--uv-paper);
  border: 1px solid var(--uv-line);
  border-left: 3px solid var(--uv-slate-600);
  border-radius: var(--uv-r);
  padding: 1.1rem 1.25rem;
  height: 100%;
}
.stat-icon { color: var(--uv-slate-600); font-size: 1.2rem; margin-bottom: .35rem; }
.stat-number { font-family: var(--uv-mono); font-size: 1.85rem; font-weight: 600; color: var(--uv-ink); line-height: 1; font-variant-numeric: tabular-nums; }
.stat-label { font-family: var(--uv-mono); font-size: .68rem; letter-spacing: .12em; text-transform: uppercase; color: var(--uv-ink-3); margin-top: .3rem; }
.dashboard-stat-card.is-pending { border-left-color: var(--uv-strap); }
.dashboard-stat-card.is-active  { border-left-color: var(--uv-transit); }
.dashboard-stat-card.is-done    { border-left-color: var(--uv-signal); }

.form-card { background: var(--uv-paper); border: 1px solid var(--uv-line); border-radius: var(--uv-r-lg); padding: 1.75rem; box-shadow: var(--uv-shadow); }
.downloads-list .list-group-item { border-color: var(--uv-line-soft); }

/* Empty states are invitations, not apologies */
.uv-empty { text-align: center; padding: 2.5rem 1rem; color: var(--uv-ink-3); }
.uv-empty i { font-size: 1.8rem; color: var(--uv-line); display: block; margin-bottom: .6rem; }
.uv-empty p { color: var(--uv-ink-3); margin-bottom: 1rem; }

/* ---------- Footer ---------- */
footer {
  background: var(--uv-slate-900);
  color: var(--uv-on-dark-2);
  padding: 2.25rem 0 1.75rem;
  margin-top: 3rem;
  border-top: 2px solid var(--uv-strap);
  font-size: .88rem;
}
footer p { color: var(--uv-on-dark-2); margin-bottom: .35rem; }
footer a { color: var(--uv-on-dark); border-bottom: 1px solid rgba(233,241,241,.25); }
footer a:hover { color: var(--uv-strap); border-bottom-color: var(--uv-strap); }
.footer-links { font-family: var(--uv-mono); font-size: .78rem; letter-spacing: .04em; }

/* ---------- Utilities ---------- */
.uv-stack-sm > * + * { margin-top: .5rem; }
.uv-stack > * + * { margin-top: 1rem; }
.uv-muted { color: var(--uv-ink-3); }
.uv-hairline { border-top: 1px solid var(--uv-line); }

/* ---------- Motion / print ---------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; }
  .feature-card:hover, .article-card:hover, .project-preview-card:hover { transform: none; }
}
@media print {
  .navbar-modern, .navbar-spacer, footer, .uv-disclosure, .btn { display: none !important; }
  body { background: #fff; }
  .inner-content-box, .uv-workorder, .card { border: 1px solid #999; box-shadow: none; }
}

/* ---------- Dispatch rail on dark (hero) ---------- */
.uv-hero-rail {
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.10);
  border-left: 3px solid var(--uv-strap);
  border-radius: var(--uv-r-lg);
  padding: 1.25rem 1.35rem;
}
.uv-rail-dark::before { background: rgba(255,255,255,.14); }
.uv-rail-dark .uv-rail-dot { background: var(--uv-slate-900); border-color: rgba(255,255,255,.28); }
.uv-rail-dark .uv-rail-name { color: var(--uv-on-dark-2); display: block; }
.uv-rail-dark .uv-rail-time { color: rgba(159,184,188,.7); display: block; }
.uv-rail-dark .uv-rail-step.is-done .uv-rail-dot { background: var(--uv-signal); border-color: var(--uv-signal); }
.uv-rail-dark .uv-rail-step.is-done .uv-rail-name { color: var(--uv-on-dark); }
.uv-rail-dark .uv-rail-step.is-current .uv-rail-dot { background: var(--uv-strap); border-color: var(--uv-strap); box-shadow: 0 0 0 4px rgba(242,180,23,.18); }
.uv-rail-dark .uv-rail-step.is-current .uv-rail-name { color: #fff; }
.uv-rail-dark .uv-rail-step.is-current .uv-rail-time { color: var(--uv-strap); }
.uv-rail-step .uv-rail-name, .uv-rail-step .uv-rail-time { display: block; }

/* ---------- Help-center article body ---------- */
.uv-article { font-size: 1rem; line-height: 1.72; color: var(--uv-ink-2); }
.uv-article > *:first-child { margin-top: 0; }
.uv-article h2 { font-size: 1.35rem; margin: 2rem 0 .6rem; }
.uv-article h3 { font-size: 1.1rem; margin: 1.6rem 0 .5rem; }
.uv-article p { margin-bottom: 1rem; }
.uv-article ul, .uv-article ol { margin: 0 0 1.15rem 1.15rem; padding: 0; }
.uv-article li { margin-bottom: .4rem; }
.uv-article code {
  font-family: var(--uv-mono); font-size: .88em;
  background: var(--uv-bench-sunk); border: 1px solid var(--uv-line);
  border-radius: 3px; padding: .08em .35em; color: var(--uv-ink);
}
.uv-article pre {
  background: var(--uv-slate-900); color: var(--uv-on-dark);
  padding: 1rem; border-radius: var(--uv-r); overflow-x: auto;
  font-family: var(--uv-mono); font-size: .85rem; margin-bottom: 1.15rem;
}
.uv-article pre code { background: none; border: 0; color: inherit; padding: 0; }
.uv-article blockquote {
  margin: 0 0 1.15rem; padding: .1rem 0 .1rem 1rem;
  border-left: 3px solid var(--uv-strap); color: var(--uv-ink-2);
}
.uv-article table { width: 100%; margin-bottom: 1.15rem; border: 1px solid var(--uv-line); }
.uv-article th, .uv-article td { padding: .55rem .7rem; border-bottom: 1px solid var(--uv-line-soft); text-align: left; }
.uv-article th { font-family: var(--uv-mono); font-size: .7rem; letter-spacing: .1em; text-transform: uppercase; background: var(--uv-bench-sunk); color: var(--uv-ink-3); }
.uv-article img { max-width: 100%; height: auto; border: 1px solid var(--uv-line); border-radius: var(--uv-r); }
a.article-card:hover .article-title, a.feature-card:hover .feature-title { color: var(--uv-slate-700); }


/* ==================================================================
   On-dark surfaces
   ------------------------------------------------------------------
   uv.css sets `h1..h6 { color: var(--uv-ink) }` and
   `p, .lead { color: var(--uv-ink-2) }` at element level. Those beat an
   inherited `color: white` on a dark container, so every dark section was
   rendering near-black text on a dark background — services.php's hero was
   unreadable and about.php's had the same latent bug.

   Anything dark opts into this scope instead of re-declaring colours.
   ================================================================== */
.uv-dark,
.uv-pagehead,
.about-hero,
.hero-section {
  color: var(--uv-on-dark);
}

.uv-dark h1, .uv-dark h2, .uv-dark h3, .uv-dark h4, .uv-dark h5, .uv-dark h6,
.uv-pagehead h1, .uv-pagehead h2, .uv-pagehead h3,
.about-hero h1, .about-hero h2, .about-hero h3,
.hero-section h1, .hero-section h2, .hero-section h3 {
  color: #fff;
}

.uv-dark p, .uv-dark .lead, .uv-dark li,
.uv-pagehead p, .uv-pagehead .lead,
.about-hero p, .about-hero .lead,
.hero-section p, .hero-section .lead {
  color: var(--uv-on-dark-2);
}

.uv-dark strong, .uv-dark b,
.uv-pagehead strong, .about-hero strong { color: #fff; }

.uv-dark a:not(.btn),
.uv-pagehead a:not(.btn),
.about-hero a:not(.btn) {
  color: var(--uv-strap);
  border-bottom-color: rgba(242,180,23,.4);
}
.uv-dark a:not(.btn):hover,
.uv-pagehead a:not(.btn):hover,
.about-hero a:not(.btn):hover { color: #FFC533; border-bottom-color: #FFC533; }

.uv-dark .uv-label, .uv-dark .uv-eyebrow,
.uv-pagehead .uv-label, .uv-pagehead .uv-eyebrow,
.about-hero .uv-label, .about-hero .uv-eyebrow { color: var(--uv-on-dark-2); }

.uv-dark hr, .uv-pagehead hr { border-top-color: rgba(255,255,255,.12); }

/* ------------------------------------------------------------------
   Page head — the full-bleed slate band under the navbar.
   Replaces the `.about-hero` block that was duplicated verbatim inside
   services.php and about.php's <style> tags.
   ------------------------------------------------------------------ */
.uv-pagehead,
.about-hero {
  background: var(--uv-slate-900);
  border-bottom: 2px solid var(--uv-strap);
  padding-bottom: clamp(2.25rem, 1.6rem + 3vw, 3.5rem);
  margin-bottom: clamp(2rem, 1.4rem + 2.5vw, 3rem);
  position: relative;
  overflow: hidden;
  text-align: left;
}

/* Same faint bench grid as the homepage hero, so the two read as one system. */
.uv-pagehead::before,
.about-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,.028) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.028) 1px, transparent 1px);
  background-size: 32px 32px;
  pointer-events: none;
}
.uv-pagehead > *,
.about-hero > * { position: relative; }

.uv-pagehead h1,
.about-hero h1 {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: clamp(1.9rem, 1.25rem + 2.6vw, 3rem);
  line-height: 1.06;
  letter-spacing: -0.02em;
  max-width: 20ch;
  margin-bottom: .5rem;
}

.uv-pagehead .lead,
.about-hero .lead { max-width: 62ch; margin-bottom: 0; }

/* ------------------------------------------------------------------
   Credential chip — sits in the page head.
   Was a 50px white pill with a drop shadow, which is app-store styling in
   a system whose whole point is 4px corners and hairlines.
   ------------------------------------------------------------------ */
.cert-badge {
  display: inline-flex;
  align-items: center;
  gap: .55rem;
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.16);
  color: var(--uv-on-dark);
  padding: .5rem .85rem;
  border-radius: var(--uv-r);
  font-family: var(--uv-mono);
  font-size: .72rem;
  font-weight: 500;
  letter-spacing: .08em;
  text-transform: uppercase;
  margin: 0;
  box-shadow: none;
}
.cert-badge i { color: var(--uv-strap); margin: 0; font-size: .95rem; }

/* ------------------------------------------------------------------
   Closing band — the last thing before the footer.
   Full-bleed slate so the page ends on the same surface it opened on.
   ------------------------------------------------------------------ */
.uv-closer {
  background: var(--uv-slate-900);
  border-top: 2px solid var(--uv-strap);
  padding: clamp(2.5rem, 1.8rem + 3vw, 4rem) 1.25rem;
  margin-top: clamp(2.5rem, 2rem + 2vw, 4rem);
}
.uv-closer-inner {
  max-width: 1180px;
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
  gap: 2rem;
  align-items: center;
  justify-content: space-between;
}
.uv-closer-title {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: clamp(1.5rem, 1.15rem + 1.5vw, 2.1rem);
  line-height: 1.12;
  letter-spacing: -0.015em;
  max-width: 24ch;
  margin: 0 0 .6rem;
}
.uv-closer-copy { max-width: 54ch; margin: 0; }
.uv-closer-actions { display: flex; flex-wrap: wrap; gap: .75rem; }

@media (max-width: 575.98px) {
  .uv-closer-actions { width: 100%; }
  .uv-closer-actions .btn { flex: 1 1 100%; justify-content: center; }
}

/* When a page ends on the dark closing band, the footer's 3rem margin-top left a
   pale strip between two dark surfaces. Butt them together instead. */
.uv-closer + footer,
.uv-dark:last-child + footer {
  margin-top: 0;
  border-top: 0;
}
.uv-closer { margin-bottom: 0; }

/* The service-area row left a tall column of empty white when the copy ran
   shorter than the map. Let the columns size to their content. */
.uv-service-area { align-items: start; }

/* ------------------------------------------------------------------
   Issued ticket — the payoff after a guest files a request.
   The number is the product, so it is set in mono at size.
   ------------------------------------------------------------------ */
.uv-ticket-issued {
  display: flex;
  flex-direction: column;
  gap: .35rem;
  background: var(--uv-slate-900);
  border-left: 3px solid var(--uv-strap);
  border-radius: var(--uv-r);
  padding: 1.25rem 1.5rem;
  margin: 1.5rem 0;
}
.uv-ticket-issued .uv-label { color: var(--uv-on-dark-2); }
.uv-ticket-no {
  font-family: var(--uv-mono);
  font-variant-numeric: tabular-nums;
  font-size: clamp(1.75rem, 1.3rem + 2vw, 2.5rem);
  font-weight: 500;
  line-height: 1;
  color: var(--uv-strap);
}

/* ==================================================================
   Auth layout — sign in / register
   Two columns that fill the viewport: the form on paper, the reason you
   may not need it on the bench surface. Replaces a narrow card floating
   in a tall empty white panel.
   ================================================================== */
.uv-auth {
  padding-top: var(--uv-nav-h);
  display: grid;
  grid-template-columns: 1fr 1fr;
  min-height: calc(100vh - var(--uv-nav-h));
  align-items: stretch;
}
.uv-auth-form  { background: var(--uv-paper); display: flex; align-items: center; }
.uv-auth-aside { background: var(--uv-slate-900); display: flex; align-items: center; position: relative; overflow: hidden; }

/* same bench grid as the hero, so auth belongs to the same system */
.uv-auth-aside::before {
  content: "";
  position: absolute; inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,.028) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.028) 1px, transparent 1px);
  background-size: 32px 32px;
  pointer-events: none;
}
.uv-auth-aside > * { position: relative; }

.uv-auth-inner {
  width: 100%;
  max-width: 26rem;
  margin: 0 auto;
  padding: clamp(2.5rem, 2rem + 3vw, 4.5rem) 1.75rem;
}
.uv-auth-aside-title {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: clamp(1.4rem, 1.1rem + 1.3vw, 1.95rem);
  line-height: 1.14;
  letter-spacing: -0.015em;
  max-width: 20ch;
  margin: 0 0 .75rem;
}

/* Stack on small screens, and don't force a full-height empty panel there. */
@media (max-width: 991.98px) {
  .uv-auth { grid-template-columns: 1fr; min-height: 0; }
  .uv-auth-aside { order: 2; }
  .uv-auth-inner { max-width: 34rem; }
}

/* ------------------------------------------------------------------
   Services page components.
   These lived as seven identical inline gradients and a 99-line <style>
   block inside services.php; they belong to the system, not the page.
   ------------------------------------------------------------------ */

/* Card headers on the pricing / service grids. Flat slate, not a gradient —
   gradients were the retired palette's signature, not this one's. */
.card-header {
  background: var(--uv-slate-900);
  color: var(--uv-on-dark);
  border-bottom: 2px solid var(--uv-strap);
}
.card-header h1, .card-header h2, .card-header h3,
.card-header h4, .card-header h5, .card-header h6 { color: #fff; margin-bottom: 0; }
.card-header p, .card-header .lead { color: var(--uv-on-dark-2); }
.card-header .text-muted { color: var(--uv-on-dark-2) !important; }

/* Explanatory panel — replaces the washed teal gradient boxes. */
.uv-note {
  background: var(--uv-bench-sunk);
  border-left: 3px solid var(--uv-transit);
  border-radius: var(--uv-r);
  padding: 1.25rem 1.5rem;
}

/* Platform logos: 120px is a billboard. Bring them to a readable icon size. */
.uv-platform-logo { font-size: 2.75rem; line-height: 1; display: block; }

/* Service / qualification icons — the page set these inline at 3rem. */
.service-icon, .qualification-item > i, .feature-icon-lg {
  font-size: 1.75rem;
  color: var(--uv-slate-600);
  line-height: 1;
}

/* Platform logos — mixed Bootstrap Icons (<i>) and inline <svg>, so size both.
   These were set to 120px, which read as a billboard rather than a support list. */
.platform-item { text-align: center; }
.platform-logo {
  display: inline-block;
  width: 2.5rem;
  height: 2.5rem;
  font-size: 2.5rem;
  line-height: 1;
  margin: 0 0 .6rem;
  object-fit: contain;
  /* No grayscale: the inline Tux and Apple SVGs are light-coloured and vanish
     under it, while the icon-font logos survive. Uniform opacity instead. */
  opacity: .8;
  transition: opacity .15s;
}
.platform-logo:hover { opacity: 1; transform: none; }
i.platform-logo { width: auto; height: auto; }
.platform-item p, .platform-item div { font-family: var(--uv-mono); font-size: .72rem;
  letter-spacing: .1em; text-transform: uppercase; color: var(--uv-ink-3); margin: 0; }

/* ------------------------------------------------------------------
   About page components (moved out of about.php's <style> block).
   ------------------------------------------------------------------ */
.about-section { padding: clamp(2rem, 1.5rem + 2vw, 3rem) 0; }

.about-photo {
  width: 100%;
  height: 300px;
  object-fit: cover;
  border-radius: var(--uv-r);
  border: 1px solid var(--uv-line);
  box-shadow: var(--uv-shadow);
}

/* Stat tiles. The page set `color: white` on the container, but uv.css colours
   .stat-number / .stat-label at class level, which won — dark ink on a dark
   tile. Colour the descendants explicitly instead of relying on inheritance. */
.stat-box {
  background: var(--uv-slate-800);
  border-left: 3px solid var(--uv-strap);
  border-radius: var(--uv-r);
  padding: 1.5rem;
  margin-bottom: 1rem;
  text-align: left;
}
.stat-box .stat-number {
  font-family: var(--uv-mono);
  font-variant-numeric: tabular-nums;
  font-size: clamp(1.75rem, 1.4rem + 1.6vw, 2.5rem);
  font-weight: 500;
  line-height: 1;
  color: var(--uv-strap);
  margin-bottom: .35rem;
}
.stat-box .stat-label {
  font-family: var(--uv-mono);
  font-size: .7rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  opacity: 1;
  color: var(--uv-on-dark-2);
}
.stat-box i { color: var(--uv-on-dark-2); }

.portfolio-card { height: 100%; }

/* ------------------------------------------------------------------
   Shop / store product cards (moved out of shop.php and store.php).
   The pages used a translate+drop-shadow hover from the retired palette;
   the system lifts with its own shadow token and keeps its hairline.
   ------------------------------------------------------------------ */
.product-card, .service-card { height: 100%; transition: box-shadow .15s, border-color .15s; }
.product-card:hover, .service-card:hover {
  box-shadow: var(--uv-shadow-lift);
  border-color: var(--uv-slate-600);
  transform: none;
}

/* Product imagery: aspect-ratio instead of a hard pixel height, so the grid
   holds its shape at any column count. */
.uv-product-media {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  background: var(--uv-bench-sunk);
  border-bottom: 1px solid var(--uv-line);
}
.uv-product-media--sm { aspect-ratio: 1 / 1; }
.uv-product-media--empty { display: flex; align-items: center; justify-content: center; }

.uv-placeholder-icon { font-size: 1.75rem; color: var(--uv-ink-3); opacity: .5; line-height: 1; }

/* Small metadata (SKU, category) and tightened body text in dense grids. */
.uv-meta {
  font-family: var(--uv-mono);
  font-size: .68rem;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uv-ink-3);
}
.uv-tight { font-size: .92rem; line-height: 1.5; }

/* Prices are data: mono, tabular, so columns line up down the grid. */
.product-card .price, .service-card .price,
.product-card .h5, .product-card .fw-bold {
  font-family: var(--uv-mono);
  font-variant-numeric: tabular-nums;
}

/* ==================================================================
   Hero work order — the signature element.
   White paper laid on the dark ESD-mat hero: the artifact the business
   leaves behind, shown rather than described. High contrast against the
   slate is the point.
   ================================================================== */
.uv-wo-sample {
  background: var(--uv-paper);
  border-radius: var(--uv-r);
  box-shadow: 0 18px 40px rgba(0,0,0,.35), 0 2px 0 rgba(255,255,255,.05);
  margin: 0;
  overflow: hidden;
  /* a shade off-square: paper set down on a bench, not a UI panel */
  transform: rotate(-.4deg);
}

.uv-wo-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  background: var(--uv-slate-900);
  padding: .85rem 1.25rem;
}
.uv-wo-label {
  font-family: var(--uv-mono);
  font-size: .68rem;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--uv-on-dark-2);
}
.uv-wo-no {
  font-family: var(--uv-mono);
  font-variant-numeric: tabular-nums;
  font-size: 1.15rem;
  font-weight: 500;
  color: var(--uv-strap);
}

/* Perforation, drawn rather than imaged. */
.uv-wo-tear {
  height: 8px;
  background:
    radial-gradient(circle at 6px -2px, transparent 5px, var(--uv-paper) 5px) 0 0 / 12px 8px repeat-x;
  background-color: var(--uv-slate-900);
}

.uv-wo-fields { margin: 0; padding: .5rem 1.25rem; }
.uv-wo-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  padding: .55rem 0;
  border-bottom: 1px dashed var(--uv-line);
}
.uv-wo-row:last-child { border-bottom: 0; }
.uv-wo-row dt {
  font-family: var(--uv-mono);
  font-size: .68rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--uv-ink-3);
  font-weight: 400;
}
.uv-wo-row dd {
  margin: 0;
  font-variant-numeric: tabular-nums;
  color: var(--uv-ink);
  display: flex;
  align-items: center;
  gap: .6rem;
}
.uv-wo-row.is-pending dd { color: var(--uv-ink-3); }
.uv-wo-row.is-live dt { color: var(--uv-transit); }

.uv-wo-running {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  font-family: var(--uv-mono);
  font-size: .72rem;
  letter-spacing: .06em;
  color: var(--uv-transit);
  background: rgba(44,125,160,.10);
  border-radius: var(--uv-r);
  padding: .15rem .45rem;
}
.uv-wo-pulse {
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--uv-transit);
  animation: uv-pulse 1.8s ease-in-out infinite;
}
@keyframes uv-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: .35; transform: scale(.8); }
}

.uv-wo-total {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  padding: .85rem 1.25rem;
  background: var(--uv-bench-sunk);
  border-top: 1px solid var(--uv-line);
  font-family: var(--uv-mono);
  font-size: .74rem;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uv-ink-2);
}
.uv-wo-amount { color: var(--uv-ink); }

.uv-wo-caption {
  padding: .7rem 1.25rem .9rem;
  font-size: .74rem;
  line-height: 1.45;
  color: var(--uv-ink-3);
  background: var(--uv-paper);
  border-top: 1px solid var(--uv-line-soft);
}

@media (max-width: 991.98px) {
  .uv-wo-sample { transform: none; margin-top: 2rem; }
}

/* The pulse is decoration; the clock still reads correctly without it. */
@media (prefers-reduced-motion: reduce) {
  .uv-wo-pulse { animation: none; }
}

/* ==================================================================
   Bands — full-bleed horizontal sections.
   Replaces the single floating `.inner-content-box` on grey, which is the
   dated "content in a box" pattern and left large empty panels on short
   pages. Bands give the page a spine: dark, paper, bench, paper, dark.
   ================================================================== */
.uv-band { padding: clamp(3rem, 2.2rem + 3.5vw, 5rem) 1.25rem; }
.uv-band--paper { background: var(--uv-paper); }
.uv-band--bench {
  background: var(--uv-bench-sunk);
  border-top: 1px solid var(--uv-line);
  border-bottom: 1px solid var(--uv-line);
}
.uv-band-inner { max-width: 1180px; margin: 0 auto; }

.uv-band-head { max-width: 62ch; margin-bottom: clamp(1.75rem, 1.4rem + 1.5vw, 2.75rem); }
.uv-band-title {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: clamp(1.5rem, 1.2rem + 1.5vw, 2.15rem);
  line-height: 1.12;
  letter-spacing: -0.015em;
  margin: .35rem 0 .5rem;
}
.uv-band-lead { font-size: 1.05rem; line-height: 1.6; margin: 0; }
.uv-band-foot { margin: 2rem 0 0; font-size: .95rem; color: var(--uv-ink-2); }

/* ---------------- What we fix ---------------- */
.uv-fixgrid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: 0;
  border-top: 1px solid var(--uv-line);
}
/* Hairline dividers rather than three floating boxes: this is a spec sheet,
   not a card deck. */
.uv-fix {
  padding: 1.75rem 1.75rem 1.75rem 0;
  border-bottom: 1px solid var(--uv-line);
  border-right: 1px solid var(--uv-line);
}
.uv-fix:last-child { border-right: 0; }
.uv-fix + .uv-fix { padding-left: 1.75rem; }
.uv-fix p { margin-bottom: .75rem; }

.uv-fix-index {
  display: block;
  font-size: .75rem;
  letter-spacing: .12em;
  color: var(--uv-strap-deep);
  margin-bottom: .6rem;
}
.uv-fix-title {
  font-family: var(--uv-cond);
  font-weight: 700;
  font-size: 1.2rem;
  letter-spacing: -0.01em;
  margin: 0 0 .5rem;
}
.uv-fix-meta {
  font-size: .7rem;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uv-ink-3);
  margin: 0;
}

/* ---------------- Two clocks ---------------- */
.uv-clocks {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
  gap: 1.25rem;
}
.uv-clock {
  background: var(--uv-paper);
  border: 1px solid var(--uv-line);
  border-top: 3px solid var(--uv-transit);
  border-radius: var(--uv-r);
  padding: 1.5rem;
}
.uv-clock--total { border-top-color: var(--uv-strap); }
.uv-clock-label {
  font-size: .72rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--uv-ink-3);
  margin: 0 0 .6rem;
}
.uv-clock-desc { margin: 0; font-size: .95rem; line-height: 1.55; }

/* ---------------- Service area ---------------- */
.uv-area {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
  gap: clamp(1.75rem, 1.4rem + 2vw, 3.5rem);
  align-items: center;
}
.uv-area-copy p { margin-bottom: 0; }
.uv-area-map {
  border: 1px solid var(--uv-line);
  border-radius: var(--uv-r);
  overflow: hidden;
  /* A fixed height left a dead grey slab when the embed was slow; an aspect
     ratio keeps the slot proportional at any width. */
  aspect-ratio: 16 / 10;
  background: var(--uv-bench-sunk);
}
.uv-area-map iframe { width: 100%; height: 100%; border: 0; display: block; }

@media (max-width: 767.98px) {
  .uv-area { grid-template-columns: 1fr; }
  .uv-fix { border-right: 0; padding-left: 0 !important; padding-right: 0; }
}

/* Coverage list — the service area stated in text, so the section still reads
   if the third-party map embed renders nothing. */
.uv-area-list {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: .4rem .5rem;
  padding: 0;
  margin: 1.25rem 0 0;
}
.uv-area-list li {
  font-size: .7rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--uv-ink-2);
  background: var(--uv-bench-sunk);
  border: 1px solid var(--uv-line);
  border-radius: var(--uv-r);
  padding: .2rem .5rem;
}

/* ==================================================================
   TRON THEME  —  scoped to `body.uv-tron`
   ------------------------------------------------------------------
   The Grid: near-black, one electric cyan that does all the signalling,
   and light that comes from the edges of things rather than from a lamp.
   Amber is kept as the second faction colour, which also keeps the CTA
   continuous with the rest of the site.

   Everything is scoped, so no other page is affected.
   ================================================================== */
body.uv-tron {
  --tron-void:    #04070C;   /* the black beyond the grid   */
  --tron-deep:    #070C14;   /* panel ground                */
  --tron-panel:   #0A121C;   /* raised surface              */
  --tron-line:    #17303F;   /* structural edge, unlit      */
  --tron-cyan:    #4DE0F9;   /* the light                   */
  --tron-cyan-dim:#2A93AD;
  --tron-amber:   #F2B417;   /* second faction — the CTA    */
  --tron-ink:     #CFEAF3;   /* body text on the grid       */
  --tron-ink-dim: #7FA3B4;

  background: var(--tron-void);
  color: var(--tron-ink);
}

/* ---------- global surfaces ---------- */
body.uv-tron .navbar-modern,
body.uv-tron footer,
body.uv-tron .hero-section,
body.uv-tron .uv-closer { background: var(--tron-void); }

body.uv-tron .navbar-modern { border-bottom: 1px solid var(--tron-line); }
body.uv-tron .navbar-modern::before {
  background: linear-gradient(90deg, var(--tron-cyan) 0 22%, transparent 22%);
  box-shadow: 0 0 12px rgba(77,224,249,.7);
}
body.uv-tron .nav-link-modern { color: var(--tron-ink-dim); }
body.uv-tron .nav-link-modern:hover { color: var(--tron-cyan); }
body.uv-tron .nav-link-modern.is-active {
  background: transparent;
  color: var(--tron-cyan);
  box-shadow: inset 0 -2px 0 var(--tron-cyan), 0 0 14px rgba(77,224,249,.25);
}
body.uv-tron .brand-text { color: #fff; text-shadow: 0 0 14px rgba(77,224,249,.55); }
body.uv-tron .search-input {
  background: var(--tron-deep);
  border-color: var(--tron-line);
  color: var(--tron-ink);
}
body.uv-tron .search-input:focus {
  border-color: var(--tron-cyan);
  box-shadow: 0 0 0 1px var(--tron-cyan), 0 0 18px rgba(77,224,249,.25);
}

body.uv-tron h1, body.uv-tron h2, body.uv-tron h3,
body.uv-tron h4, body.uv-tron h5, body.uv-tron h6 { color: #EAF9FE; }
body.uv-tron p, body.uv-tron .lead, body.uv-tron li { color: var(--tron-ink-dim); }
body.uv-tron a:not(.btn) { color: var(--tron-cyan); border-bottom-color: rgba(77,224,249,.35); }
body.uv-tron a:not(.btn):hover { color: #9FF0FF; border-bottom-color: #9FF0FF; }

/* ---------- the grid floor ---------- */
/* Perspective grid receding to a horizon: the single most recognisable thing
   about this world, and it costs two gradients and a transform. */
body.uv-tron .hero-section { position: relative; overflow: hidden; border-bottom: 0; }
body.uv-tron .hero-section::before {
  content: "";
  position: absolute;
  left: -60%; right: -60%; bottom: 0;
  /* The floor occupies the lower third only. Sizing it taller pushed the lit
     part of the plane up into the headline, where it read as a smudge rather
     than a surface receding to a horizon. */
  height: 45%;
  background-image:
    linear-gradient(to right,  rgba(77,224,249,.60) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(77,224,249,.60) 1px, transparent 1px);
  background-size: 110px 110px;
  transform: perspective(420px) rotateX(74deg);
  transform-origin: bottom center;
  /* Fade hard toward the horizon. Perspective compresses the far rows into a
     few pixels, so a gentle fade leaves them stacked as one bright streak
     across the headline instead of dissolving into the void. */
  -webkit-mask-image: linear-gradient(to top, #000 0%, rgba(0,0,0,.45) 22%, transparent 52%);
          mask-image: linear-gradient(to top, #000 0%, rgba(0,0,0,.45) 22%, transparent 52%);
  pointer-events: none;
}
/* Horizon glow where the grid meets the void. */
body.uv-tron .hero-section::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 1px;
  background: var(--tron-cyan);
  box-shadow: 0 0 24px 3px rgba(77,224,249,.55);
  pointer-events: none;
}
body.uv-tron .hero-content { position: relative; z-index: 1; }

body.uv-tron .hero-title { color: #fff; text-shadow: 0 0 26px rgba(77,224,249,.45); }
body.uv-tron .hero-title em { color: var(--tron-cyan); text-shadow: 0 0 28px rgba(77,224,249,.8); }
body.uv-tron .hero-subtitle { color: var(--tron-ink-dim); }
body.uv-tron .uv-eyebrow { color: var(--tron-cyan); }
body.uv-tron .uv-eyebrow::before { background: var(--tron-cyan); box-shadow: 0 0 10px var(--tron-cyan); }

/* ---------- buttons: light, not fill ---------- */
body.uv-tron .btn-hero-primary,
body.uv-tron .btn-warning {
  background: var(--tron-amber);
  border-color: var(--tron-amber);
  color: #14100A;
  box-shadow: 0 0 22px rgba(242,180,23,.35);
}
body.uv-tron .btn-hero-primary:hover,
body.uv-tron .btn-warning:hover { box-shadow: 0 0 30px rgba(242,180,23,.6); }

body.uv-tron .btn-hero-secondary,
body.uv-tron .btn-outline-light,
body.uv-tron .btn-outline-primary {
  background: rgba(77,224,249,.05);
  border: 1px solid var(--tron-cyan-dim);
  color: var(--tron-cyan);
}
body.uv-tron .btn-hero-secondary:hover,
body.uv-tron .btn-outline-light:hover,
body.uv-tron .btn-outline-primary:hover {
  border-color: var(--tron-cyan);
  color: #EAF9FE;
  box-shadow: 0 0 20px rgba(77,224,249,.35);
}
body.uv-tron .btn-primary {
  background: transparent;
  border: 1px solid var(--tron-cyan);
  color: var(--tron-cyan);
  box-shadow: 0 0 18px rgba(77,224,249,.22);
}
body.uv-tron .btn-primary:hover { background: rgba(77,224,249,.12); color: #EAF9FE; }

/* ---------- bands ---------- */
body.uv-tron .uv-band--paper { background: var(--tron-deep); }
body.uv-tron .uv-band--bench {
  background: var(--tron-void);
  border-top: 1px solid var(--tron-line);
  border-bottom: 1px solid var(--tron-line);
  position: relative;
}
/* A light ribbon along the top edge of the darker band. */
body.uv-tron .uv-band--bench::before {
  content: "";
  position: absolute; top: -1px; left: 0; right: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--tron-cyan) 20%, var(--tron-cyan) 80%, transparent);
  box-shadow: 0 0 16px rgba(77,224,249,.5);
}
body.uv-tron .uv-band-title { color: #EAF9FE; }

/* ---------- spec sheet ---------- */
body.uv-tron .uv-fixgrid { border-top-color: var(--tron-line); }
body.uv-tron .uv-fix { border-bottom-color: var(--tron-line); border-right-color: var(--tron-line); }
body.uv-tron .uv-fix-title { color: #EAF9FE; }
body.uv-tron .uv-fix-meta { color: var(--tron-cyan-dim); }

/* ---------- clock panels ---------- */
body.uv-tron .uv-clock {
  background: var(--tron-panel);
  border: 1px solid var(--tron-line);
  border-top: 2px solid var(--tron-cyan);
  box-shadow: 0 0 26px rgba(77,224,249,.10), inset 0 1px 0 rgba(77,224,249,.12);
}
body.uv-tron .uv-clock--total { border-top-color: var(--tron-amber); box-shadow: 0 0 26px rgba(242,180,23,.12); }
body.uv-tron .uv-clock-label { color: var(--tron-cyan); }
body.uv-tron .uv-clock-desc { color: var(--tron-ink-dim); }

/* ---------- the work order, as a console readout ---------- */
/* Paper does not exist on the Grid; the ticket becomes a lit panel. */
body.uv-tron .uv-wo-sample {
  background: var(--tron-panel);
  border: 1px solid var(--tron-cyan-dim);
  box-shadow: 0 0 34px rgba(77,224,249,.22), inset 0 0 42px rgba(77,224,249,.05);
  transform: none;
}
body.uv-tron .uv-wo-head {
  background: rgba(77,224,249,.08);
  border-bottom: 1px solid var(--tron-cyan-dim);
}
body.uv-tron .uv-wo-label { color: var(--tron-cyan-dim); }
body.uv-tron .uv-wo-no { color: var(--tron-cyan); text-shadow: 0 0 16px rgba(77,224,249,.75); }
/* The perforation belongs to paper. On the Grid it is a circuit trace. */
body.uv-tron .uv-wo-tear {
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--tron-cyan) 30%, var(--tron-cyan) 70%, transparent);
  box-shadow: 0 0 12px rgba(77,224,249,.6);
}
body.uv-tron .uv-wo-row { border-bottom-style: solid; border-bottom-color: var(--tron-line); }
body.uv-tron .uv-wo-row dt { color: var(--tron-ink-dim); }
body.uv-tron .uv-wo-row dd { color: #EAF9FE; }
body.uv-tron .uv-wo-row.is-pending dd { color: #658A99; }  /* 5.1:1 on panel — the not-yet-reached rows stay legible */
body.uv-tron .uv-wo-row.is-live dt { color: var(--tron-cyan); }
body.uv-tron .uv-wo-running {
  color: var(--tron-cyan);
  background: rgba(77,224,249,.10);
  border: 1px solid rgba(77,224,249,.3);
}
body.uv-tron .uv-wo-pulse { background: var(--tron-cyan); box-shadow: 0 0 10px var(--tron-cyan); }
body.uv-tron .uv-wo-total {
  background: rgba(77,224,249,.05);
  border-top: 1px solid var(--tron-line);
  color: var(--tron-ink-dim);
}
body.uv-tron .uv-wo-amount { color: var(--tron-cyan); }
body.uv-tron .uv-wo-caption {
  background: transparent;
  border-top: 1px solid var(--tron-line);
  color: #5E7F8D;
}

/* ---------- service area ---------- */
body.uv-tron .uv-area-map { border-color: var(--tron-line); background: var(--tron-panel); }
body.uv-tron .uv-area-list li {
  background: rgba(77,224,249,.06);
  border: 1px solid var(--tron-line);
  color: var(--tron-cyan-dim);
}

/* ---------- closing band + footer ---------- */
body.uv-tron .uv-closer { border-top: 1px solid var(--tron-line); position: relative; }
body.uv-tron .uv-closer::before {
  content: "";
  position: absolute; top: -1px; left: 0; right: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--tron-amber) 30%, var(--tron-amber) 70%, transparent);
  box-shadow: 0 0 16px rgba(242,180,23,.5);
}
body.uv-tron .uv-closer-title { color: #fff; }
body.uv-tron footer { border-top: 1px solid var(--tron-line); }
body.uv-tron footer p, body.uv-tron .uv-label { color: var(--tron-ink-dim); }
body.uv-tron footer a { color: var(--tron-ink); border-bottom-color: rgba(207,234,243,.2); }
body.uv-tron footer a:hover { color: var(--tron-cyan); border-bottom-color: var(--tron-cyan); }

/* Focus stays visible against the glow. */
body.uv-tron :focus-visible { outline-color: var(--tron-cyan); }
body.uv-tron ::selection { background: var(--tron-cyan); color: var(--tron-void); }


/* The Google embed only ships a light style at this tier. Inverting and
   rotating the hue back gives a dark map without a paid styled-map key. */
body.uv-tron .uv-area-map {
  border-color: var(--tron-cyan-dim);
  box-shadow: 0 0 30px rgba(77,224,249,.15);
}
/* Applies to every Google Maps embed on the site (homepage, services,
   request-service), not just the homepage's wrapper class. */
body.uv-tron .uv-area-map iframe,
body.uv-tron iframe[src*="google.com/maps"] {
  filter: invert(1) hue-rotate(180deg) saturate(.7) brightness(.85) contrast(1.05);
  border-radius: var(--uv-r);
}


/* The perspective floor, drawn as real converging geometry.
   A rotateX()'d plane looked plausible in theory but compressed its far rows
   into a bright streak across the headline; an SVG lets the vertical lines
   actually meet at a vanishing point and the horizontal rows fall off on 1/z,
   which is what makes the surface read as a floor. */
body.uv-tron .hero-section::before {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 46%;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 420' preserveAspectRatio='none'%3E%3Cg stroke='%234DE0F9' stroke-width='1.6' fill='none' opacity='0.85'%3E%3Cline x1='-2320.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-2200.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-2080.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1960.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1840.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1720.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1600.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1480.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1360.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1240.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1120.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-1000.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-880.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-760.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-640.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-520.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-400.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-280.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-160.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='-40.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='80.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='200.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='320.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='440.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='560.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='680.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='800.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='920.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1040.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1160.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1280.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1400.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1520.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1640.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1760.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='1880.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2000.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2120.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2240.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2360.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2480.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2600.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2720.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2840.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='2960.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3080.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3200.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3320.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3440.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3560.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3680.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3800.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='3920.0' y1='420' x2='800.0' y2='0'/%3E%3Cline x1='0' y1='362.1' x2='1600' y2='362.1'/%3E%3Cline x1='0' y1='318.2' x2='1600' y2='318.2'/%3E%3Cline x1='0' y1='283.8' x2='1600' y2='283.8'/%3E%3Cline x1='0' y1='256.1' x2='1600' y2='256.1'/%3E%3Cline x1='0' y1='233.3' x2='1600' y2='233.3'/%3E%3Cline x1='0' y1='214.3' x2='1600' y2='214.3'/%3E%3Cline x1='0' y1='198.1' x2='1600' y2='198.1'/%3E%3Cline x1='0' y1='184.2' x2='1600' y2='184.2'/%3E%3Cline x1='0' y1='172.1' x2='1600' y2='172.1'/%3E%3Cline x1='0' y1='161.5' x2='1600' y2='161.5'/%3E%3Cline x1='0' y1='152.2' x2='1600' y2='152.2'/%3E%3Cline x1='0' y1='143.8' x2='1600' y2='143.8'/%3E%3Cline x1='0' y1='136.4' x2='1600' y2='136.4'/%3E%3Cline x1='0' y1='129.6' x2='1600' y2='129.6'/%3E%3Cline x1='0' y1='123.5' x2='1600' y2='123.5'/%3E%3Cline x1='0' y1='118.0' x2='1600' y2='118.0'/%3E%3Cline x1='0' y1='112.9' x2='1600' y2='112.9'/%3E%3Cline x1='0' y1='108.2' x2='1600' y2='108.2'/%3E%3Cline x1='0' y1='104.0' x2='1600' y2='104.0'/%3E%3Cline x1='0' y1='100.0' x2='1600' y2='100.0'/%3E%3Cline x1='0' y1='96.3' x2='1600' y2='96.3'/%3E%3Cline x1='0' y1='92.9' x2='1600' y2='92.9'/%3E%3Cline x1='0' y1='89.7' x2='1600' y2='89.7'/%3E%3Cline x1='0' y1='86.8' x2='1600' y2='86.8'/%3E%3Cline x1='0' y1='84.0' x2='1600' y2='84.0'/%3E%3Cline x1='0' y1='81.4' x2='1600' y2='81.4'/%3E%3Cline x1='0' y1='78.9' x2='1600' y2='78.9'/%3E%3Cline x1='0' y1='76.6' x2='1600' y2='76.6'/%3E%3Cline x1='0' y1='74.5' x2='1600' y2='74.5'/%3E%3Cline x1='0' y1='72.4' x2='1600' y2='72.4'/%3E%3Cline x1='0' y1='70.5' x2='1600' y2='70.5'/%3E%3Cline x1='0' y1='68.6' x2='1600' y2='68.6'/%3E%3Cline x1='0' y1='66.9' x2='1600' y2='66.9'/%3E%3Cline x1='0' y1='65.2' x2='1600' y2='65.2'/%3E%3Cline x1='0' y1='63.6' x2='1600' y2='63.6'/%3E%3Cline x1='0' y1='62.1' x2='1600' y2='62.1'/%3E%3Cline x1='0' y1='60.7' x2='1600' y2='60.7'/%3E%3Cline x1='0' y1='59.3' x2='1600' y2='59.3'/%3E%3Cline x1='0' y1='58.0' x2='1600' y2='58.0'/%3E%3Cline x1='0' y1='56.8' x2='1600' y2='56.8'/%3E%3Cline x1='0' y1='55.6' x2='1600' y2='55.6'/%3E%3Cline x1='0' y1='54.4' x2='1600' y2='54.4'/%3E%3Cline x1='0' y1='53.3' x2='1600' y2='53.3'/%3E%3Cline x1='0' y1='52.2' x2='1600' y2='52.2'/%3E%3Cline x1='0' y1='51.2' x2='1600' y2='51.2'/%3E%3Cline x1='0' y1='50.2' x2='1600' y2='50.2'/%3E%3Cline x1='0' y1='49.3' x2='1600' y2='49.3'/%3E%3Cline x1='0' y1='48.4' x2='1600' y2='48.4'/%3E%3Cline x1='0' y1='47.5' x2='1600' y2='47.5'/%3E%3Cline x1='0' y1='46.7' x2='1600' y2='46.7'/%3E%3Cline x1='0' y1='45.9' x2='1600' y2='45.9'/%3E%3Cline x1='0' y1='45.1' x2='1600' y2='45.1'/%3E%3Cline x1='0' y1='44.3' x2='1600' y2='44.3'/%3E%3Cline x1='0' y1='43.6' x2='1600' y2='43.6'/%3E%3Cline x1='0' y1='42.9' x2='1600' y2='42.9'/%3E%3Cline x1='0' y1='42.2' x2='1600' y2='42.2'/%3E%3Cline x1='0' y1='41.5' x2='1600' y2='41.5'/%3E%3Cline x1='0' y1='40.9' x2='1600' y2='40.9'/%3E%3Cline x1='0' y1='40.2' x2='1600' y2='40.2'/%3E%3Cline x1='0' y1='39.6' x2='1600' y2='39.6'/%3E%3Cline x1='0' y1='39.0' x2='1600' y2='39.0'/%3E%3Cline x1='0' y1='38.5' x2='1600' y2='38.5'/%3E%3Cline x1='0' y1='37.9' x2='1600' y2='37.9'/%3E%3Cline x1='0' y1='37.4' x2='1600' y2='37.4'/%3E%3Cline x1='0' y1='36.8' x2='1600' y2='36.8'/%3E%3Cline x1='0' y1='36.3' x2='1600' y2='36.3'/%3E%3Cline x1='0' y1='35.8' x2='1600' y2='35.8'/%3E%3Cline x1='0' y1='35.4' x2='1600' y2='35.4'/%3E%3Cline x1='0' y1='34.9' x2='1600' y2='34.9'/%3E%3Cline x1='0' y1='34.4' x2='1600' y2='34.4'/%3E%3Cline x1='0' y1='34.0' x2='1600' y2='34.0'/%3E%3Cline x1='0' y1='33.5' x2='1600' y2='33.5'/%3E%3Cline x1='0' y1='33.1' x2='1600' y2='33.1'/%3E%3Cline x1='0' y1='32.7' x2='1600' y2='32.7'/%3E%3Cline x1='0' y1='32.3' x2='1600' y2='32.3'/%3E%3Cline x1='0' y1='31.9' x2='1600' y2='31.9'/%3E%3Cline x1='0' y1='31.5' x2='1600' y2='31.5'/%3E%3Cline x1='0' y1='31.2' x2='1600' y2='31.2'/%3E%3Cline x1='0' y1='30.8' x2='1600' y2='30.8'/%3E%3Cline x1='0' y1='30.4' x2='1600' y2='30.4'/%3E%3Cline x1='0' y1='30.1' x2='1600' y2='30.1'/%3E%3Cline x1='0' y1='29.7' x2='1600' y2='29.7'/%3E%3Cline x1='0' y1='29.4' x2='1600' y2='29.4'/%3E%3Cline x1='0' y1='29.1' x2='1600' y2='29.1'/%3E%3Cline x1='0' y1='28.8' x2='1600' y2='28.8'/%3E%3Cline x1='0' y1='28.5' x2='1600' y2='28.5'/%3E%3Cline x1='0' y1='28.2' x2='1600' y2='28.2'/%3E%3Cline x1='0' y1='27.9' x2='1600' y2='27.9'/%3E%3Cline x1='0' y1='27.6' x2='1600' y2='27.6'/%3E%3Cline x1='0' y1='27.3' x2='1600' y2='27.3'/%3E%3Cline x1='0' y1='27.0' x2='1600' y2='27.0'/%3E%3Cline x1='0' y1='26.7' x2='1600' y2='26.7'/%3E%3Cline x1='0' y1='26.4' x2='1600' y2='26.4'/%3E%3Cline x1='0' y1='26.2' x2='1600' y2='26.2'/%3E%3Cline x1='0' y1='25.9' x2='1600' y2='25.9'/%3E%3Cline x1='0' y1='25.7' x2='1600' y2='25.7'/%3E%3Cline x1='0' y1='25.4' x2='1600' y2='25.4'/%3E%3Cline x1='0' y1='25.2' x2='1600' y2='25.2'/%3E%3Cline x1='0' y1='24.9' x2='1600' y2='24.9'/%3E%3Cline x1='0' y1='24.7' x2='1600' y2='24.7'/%3E%3Cline x1='0' y1='24.5' x2='1600' y2='24.5'/%3E%3Cline x1='0' y1='24.2' x2='1600' y2='24.2'/%3E%3Cline x1='0' y1='24.0' x2='1600' y2='24.0'/%3E%3Cline x1='0' y1='23.8' x2='1600' y2='23.8'/%3E%3Cline x1='0' y1='23.6' x2='1600' y2='23.6'/%3E%3Cline x1='0' y1='23.4' x2='1600' y2='23.4'/%3E%3Cline x1='0' y1='23.2' x2='1600' y2='23.2'/%3E%3Cline x1='0' y1='23.0' x2='1600' y2='23.0'/%3E%3Cline x1='0' y1='22.8' x2='1600' y2='22.8'/%3E%3Cline x1='0' y1='22.6' x2='1600' y2='22.6'/%3E%3Cline x1='0' y1='22.4' x2='1600' y2='22.4'/%3E%3Cline x1='0' y1='22.2' x2='1600' y2='22.2'/%3E%3Cline x1='0' y1='22.0' x2='1600' y2='22.0'/%3E%3Cline x1='0' y1='21.8' x2='1600' y2='21.8'/%3E%3Cline x1='0' y1='21.6' x2='1600' y2='21.6'/%3E%3Cline x1='0' y1='21.5' x2='1600' y2='21.5'/%3E%3Cline x1='0' y1='21.3' x2='1600' y2='21.3'/%3E%3Cline x1='0' y1='21.1' x2='1600' y2='21.1'/%3E%3Cline x1='0' y1='21.0' x2='1600' y2='21.0'/%3E%3Cline x1='0' y1='20.8' x2='1600' y2='20.8'/%3E%3Cline x1='0' y1='20.6' x2='1600' y2='20.6'/%3E%3Cline x1='0' y1='20.5' x2='1600' y2='20.5'/%3E%3Cline x1='0' y1='20.3' x2='1600' y2='20.3'/%3E%3Cline x1='0' y1='20.2' x2='1600' y2='20.2'/%3E%3Cline x1='0' y1='20.0' x2='1600' y2='20.0'/%3E%3Cline x1='0' y1='19.8' x2='1600' y2='19.8'/%3E%3Cline x1='0' y1='19.7' x2='1600' y2='19.7'/%3E%3Cline x1='0' y1='19.6' x2='1600' y2='19.6'/%3E%3Cline x1='0' y1='19.4' x2='1600' y2='19.4'/%3E%3Cline x1='0' y1='19.3' x2='1600' y2='19.3'/%3E%3Cline x1='0' y1='19.1' x2='1600' y2='19.1'/%3E%3Cline x1='0' y1='19.0' x2='1600' y2='19.0'/%3E%3Cline x1='0' y1='18.9' x2='1600' y2='18.9'/%3E%3Cline x1='0' y1='18.7' x2='1600' y2='18.7'/%3E%3Cline x1='0' y1='18.6' x2='1600' y2='18.6'/%3E%3Cline x1='0' y1='18.5' x2='1600' y2='18.5'/%3E%3Cline x1='0' y1='18.3' x2='1600' y2='18.3'/%3E%3Cline x1='0' y1='18.2' x2='1600' y2='18.2'/%3E%3Cline x1='0' y1='18.1' x2='1600' y2='18.1'/%3E%3Cline x1='0' y1='17.9' x2='1600' y2='17.9'/%3E%3Cline x1='0' y1='17.8' x2='1600' y2='17.8'/%3E%3Cline x1='0' y1='17.7' x2='1600' y2='17.7'/%3E%3Cline x1='0' y1='17.6' x2='1600' y2='17.6'/%3E%3Cline x1='0' y1='17.5' x2='1600' y2='17.5'/%3E%3Cline x1='0' y1='17.4' x2='1600' y2='17.4'/%3E%3Cline x1='0' y1='17.2' x2='1600' y2='17.2'/%3E%3Cline x1='0' y1='17.1' x2='1600' y2='17.1'/%3E%3Cline x1='0' y1='17.0' x2='1600' y2='17.0'/%3E%3Cline x1='0' y1='16.9' x2='1600' y2='16.9'/%3E%3Cline x1='0' y1='16.8' x2='1600' y2='16.8'/%3E%3Cline x1='0' y1='16.7' x2='1600' y2='16.7'/%3E%3Cline x1='0' y1='16.6' x2='1600' y2='16.6'/%3E%3Cline x1='0' y1='16.5' x2='1600' y2='16.5'/%3E%3Cline x1='0' y1='16.4' x2='1600' y2='16.4'/%3E%3Cline x1='0' y1='16.3' x2='1600' y2='16.3'/%3E%3Cline x1='0' y1='16.2' x2='1600' y2='16.2'/%3E%3Cline x1='0' y1='16.1' x2='1600' y2='16.1'/%3E%3Cline x1='0' y1='16.0' x2='1600' y2='16.0'/%3E%3Cline x1='0' y1='15.9' x2='1600' y2='15.9'/%3E%3Cline x1='0' y1='15.8' x2='1600' y2='15.8'/%3E%3Cline x1='0' y1='15.7' x2='1600' y2='15.7'/%3E%3Cline x1='0' y1='15.6' x2='1600' y2='15.6'/%3E%3Cline x1='0' y1='15.5' x2='1600' y2='15.5'/%3E%3Cline x1='0' y1='15.4' x2='1600' y2='15.4'/%3E%3Cline x1='0' y1='15.3' x2='1600' y2='15.3'/%3E%3Cline x1='0' y1='15.2' x2='1600' y2='15.2'/%3E%3Cline x1='0' y1='15.2' x2='1600' y2='15.2'/%3E%3Cline x1='0' y1='15.1' x2='1600' y2='15.1'/%3E%3Cline x1='0' y1='15.0' x2='1600' y2='15.0'/%3E%3Cline x1='0' y1='14.9' x2='1600' y2='14.9'/%3E%3Cline x1='0' y1='14.8' x2='1600' y2='14.8'/%3E%3Cline x1='0' y1='14.7' x2='1600' y2='14.7'/%3E%3Cline x1='0' y1='14.6' x2='1600' y2='14.6'/%3E%3Cline x1='0' y1='14.6' x2='1600' y2='14.6'/%3E%3Cline x1='0' y1='14.5' x2='1600' y2='14.5'/%3E%3Cline x1='0' y1='14.4' x2='1600' y2='14.4'/%3E%3Cline x1='0' y1='14.3' x2='1600' y2='14.3'/%3E%3Cline x1='0' y1='14.2' x2='1600' y2='14.2'/%3E%3Cline x1='0' y1='14.2' x2='1600' y2='14.2'/%3E%3Cline x1='0' y1='14.1' x2='1600' y2='14.1'/%3E%3Cline x1='0' y1='14.0' x2='1600' y2='14.0'/%3E%3Cline x1='0' y1='13.9' x2='1600' y2='13.9'/%3E%3Cline x1='0' y1='13.9' x2='1600' y2='13.9'/%3E%3Cline x1='0' y1='13.8' x2='1600' y2='13.8'/%3E%3Cline x1='0' y1='13.7' x2='1600' y2='13.7'/%3E%3Cline x1='0' y1='13.7' x2='1600' y2='13.7'/%3E%3Cline x1='0' y1='13.6' x2='1600' y2='13.6'/%3E%3Cline x1='0' y1='13.5' x2='1600' y2='13.5'/%3E%3Cline x1='0' y1='13.4' x2='1600' y2='13.4'/%3E%3Cline x1='0' y1='13.4' x2='1600' y2='13.4'/%3E%3Cline x1='0' y1='13.3' x2='1600' y2='13.3'/%3E%3Cline x1='0' y1='13.2' x2='1600' y2='13.2'/%3E%3Cline x1='0' y1='13.2' x2='1600' y2='13.2'/%3E%3Cline x1='0' y1='13.1' x2='1600' y2='13.1'/%3E%3Cline x1='0' y1='13.0' x2='1600' y2='13.0'/%3E%3Cline x1='0' y1='13.0' x2='1600' y2='13.0'/%3E%3Cline x1='0' y1='12.9' x2='1600' y2='12.9'/%3E%3Cline x1='0' y1='12.9' x2='1600' y2='12.9'/%3E%3Cline x1='0' y1='12.8' x2='1600' y2='12.8'/%3E%3Cline x1='0' y1='12.7' x2='1600' y2='12.7'/%3E%3Cline x1='0' y1='12.7' x2='1600' y2='12.7'/%3E%3Cline x1='0' y1='12.6' x2='1600' y2='12.6'/%3E%3Cline x1='0' y1='12.5' x2='1600' y2='12.5'/%3E%3Cline x1='0' y1='12.5' x2='1600' y2='12.5'/%3E%3Cline x1='0' y1='12.4' x2='1600' y2='12.4'/%3E%3Cline x1='0' y1='12.4' x2='1600' y2='12.4'/%3E%3Cline x1='0' y1='12.3' x2='1600' y2='12.3'/%3E%3Cline x1='0' y1='12.3' x2='1600' y2='12.3'/%3E%3Cline x1='0' y1='12.2' x2='1600' y2='12.2'/%3E%3Cline x1='0' y1='12.1' x2='1600' y2='12.1'/%3E%3Cline x1='0' y1='12.1' x2='1600' y2='12.1'/%3E%3Cline x1='0' y1='12.0' x2='1600' y2='12.0'/%3E%3Cline x1='0' y1='12.0' x2='1600' y2='12.0'/%3E%3Cline x1='0' y1='11.9' x2='1600' y2='11.9'/%3E%3Cline x1='0' y1='11.9' x2='1600' y2='11.9'/%3E%3Cline x1='0' y1='11.8' x2='1600' y2='11.8'/%3E%3Cline x1='0' y1='11.8' x2='1600' y2='11.8'/%3E%3Cline x1='0' y1='11.7' x2='1600' y2='11.7'/%3E%3Cline x1='0' y1='11.7' x2='1600' y2='11.7'/%3E%3Cline x1='0' y1='11.6' x2='1600' y2='11.6'/%3E%3Cline x1='0' y1='11.6' x2='1600' y2='11.6'/%3E%3Cline x1='0' y1='11.5' x2='1600' y2='11.5'/%3E%3Cline x1='0' y1='11.5' x2='1600' y2='11.5'/%3E%3Cline x1='0' y1='11.4' x2='1600' y2='11.4'/%3E%3Cline x1='0' y1='11.4' x2='1600' y2='11.4'/%3E%3Cline x1='0' y1='11.3' x2='1600' y2='11.3'/%3E%3Cline x1='0' y1='11.3' x2='1600' y2='11.3'/%3E%3Cline x1='0' y1='11.2' x2='1600' y2='11.2'/%3E%3Cline x1='0' y1='11.2' x2='1600' y2='11.2'/%3E%3Cline x1='0' y1='11.1' x2='1600' y2='11.1'/%3E%3Cline x1='0' y1='11.1' x2='1600' y2='11.1'/%3E%3Cline x1='0' y1='11.0' x2='1600' y2='11.0'/%3E%3Cline x1='0' y1='11.0' x2='1600' y2='11.0'/%3E%3Cline x1='0' y1='10.9' x2='1600' y2='10.9'/%3E%3Cline x1='0' y1='10.9' x2='1600' y2='10.9'/%3E%3Cline x1='0' y1='10.8' x2='1600' y2='10.8'/%3E%3Cline x1='0' y1='10.8' x2='1600' y2='10.8'/%3E%3Cline x1='0' y1='10.7' x2='1600' y2='10.7'/%3E%3Cline x1='0' y1='10.7' x2='1600' y2='10.7'/%3E%3Cline x1='0' y1='10.7' x2='1600' y2='10.7'/%3E%3Cline x1='0' y1='10.6' x2='1600' y2='10.6'/%3E%3Cline x1='0' y1='10.6' x2='1600' y2='10.6'/%3E%3Cline x1='0' y1='10.5' x2='1600' y2='10.5'/%3E%3Cline x1='0' y1='10.5' x2='1600' y2='10.5'/%3E%3Cline x1='0' y1='10.4' x2='1600' y2='10.4'/%3E%3Cline x1='0' y1='10.4' x2='1600' y2='10.4'/%3E%3Cline x1='0' y1='10.4' x2='1600' y2='10.4'/%3E%3Cline x1='0' y1='10.3' x2='1600' y2='10.3'/%3E%3Cline x1='0' y1='10.3' x2='1600' y2='10.3'/%3E%3Cline x1='0' y1='10.2' x2='1600' y2='10.2'/%3E%3Cline x1='0' y1='10.2' x2='1600' y2='10.2'/%3E%3Cline x1='0' y1='10.2' x2='1600' y2='10.2'/%3E%3Cline x1='0' y1='10.1' x2='1600' y2='10.1'/%3E%3Cline x1='0' y1='10.1' x2='1600' y2='10.1'/%3E%3Cline x1='0' y1='10.0' x2='1600' y2='10.0'/%3E%3Cline x1='0' y1='10.0' x2='1600' y2='10.0'/%3E%3Cline x1='0' y1='10.0' x2='1600' y2='10.0'/%3E%3Cline x1='0' y1='9.9' x2='1600' y2='9.9'/%3E%3Cline x1='0' y1='9.9' x2='1600' y2='9.9'/%3E%3Cline x1='0' y1='9.9' x2='1600' y2='9.9'/%3E%3Cline x1='0' y1='9.8' x2='1600' y2='9.8'/%3E%3Cline x1='0' y1='9.8' x2='1600' y2='9.8'/%3E%3Cline x1='0' y1='9.7' x2='1600' y2='9.7'/%3E%3Cline x1='0' y1='9.7' x2='1600' y2='9.7'/%3E%3Cline x1='0' y1='9.7' x2='1600' y2='9.7'/%3E%3Cline x1='0' y1='9.6' x2='1600' y2='9.6'/%3E%3Cline x1='0' y1='9.6' x2='1600' y2='9.6'/%3E%3Cline x1='0' y1='9.6' x2='1600' y2='9.6'/%3E%3Cline x1='0' y1='9.5' x2='1600' y2='9.5'/%3E%3Cline x1='0' y1='9.5' x2='1600' y2='9.5'/%3E%3Cline x1='0' y1='9.5' x2='1600' y2='9.5'/%3E%3Cline x1='0' y1='9.4' x2='1600' y2='9.4'/%3E%3Cline x1='0' y1='9.4' x2='1600' y2='9.4'/%3E%3Cline x1='0' y1='9.4' x2='1600' y2='9.4'/%3E%3Cline x1='0' y1='9.3' x2='1600' y2='9.3'/%3E%3Cline x1='0' y1='9.3' x2='1600' y2='9.3'/%3E%3Cline x1='0' y1='9.3' x2='1600' y2='9.3'/%3E%3Cline x1='0' y1='9.2' x2='1600' y2='9.2'/%3E%3Cline x1='0' y1='9.2' x2='1600' y2='9.2'/%3E%3Cline x1='0' y1='9.2' x2='1600' y2='9.2'/%3E%3Cline x1='0' y1='9.1' x2='1600' y2='9.1'/%3E%3Cline x1='0' y1='9.1' x2='1600' y2='9.1'/%3E%3Cline x1='0' y1='9.1' x2='1600' y2='9.1'/%3E%3Cline x1='0' y1='9.0' x2='1600' y2='9.0'/%3E%3Cline x1='0' y1='9.0' x2='1600' y2='9.0'/%3E%3Cline x1='0' y1='9.0' x2='1600' y2='9.0'/%3E%3Cline x1='0' y1='9.0' x2='1600' y2='9.0'/%3E%3Cline x1='0' y1='8.9' x2='1600' y2='8.9'/%3E%3Cline x1='0' y1='8.9' x2='1600' y2='8.9'/%3E%3Cline x1='0' y1='8.9' x2='1600' y2='8.9'/%3E%3Cline x1='0' y1='8.8' x2='1600' y2='8.8'/%3E%3Cline x1='0' y1='8.8' x2='1600' y2='8.8'/%3E%3Cline x1='0' y1='8.8' x2='1600' y2='8.8'/%3E%3Cline x1='0' y1='8.7' x2='1600' y2='8.7'/%3E%3Cline x1='0' y1='8.7' x2='1600' y2='8.7'/%3E%3Cline x1='0' y1='8.7' x2='1600' y2='8.7'/%3E%3Cline x1='0' y1='8.7' x2='1600' y2='8.7'/%3E%3Cline x1='0' y1='8.6' x2='1600' y2='8.6'/%3E%3Cline x1='0' y1='8.6' x2='1600' y2='8.6'/%3E%3Cline x1='0' y1='8.6' x2='1600' y2='8.6'/%3E%3Cline x1='0' y1='8.5' x2='1600' y2='8.5'/%3E%3Cline x1='0' y1='8.5' x2='1600' y2='8.5'/%3E%3Cline x1='0' y1='8.5' x2='1600' y2='8.5'/%3E%3Cline x1='0' y1='8.5' x2='1600' y2='8.5'/%3E%3Cline x1='0' y1='8.4' x2='1600' y2='8.4'/%3E%3Cline x1='0' y1='8.4' x2='1600' y2='8.4'/%3E%3Cline x1='0' y1='8.4' x2='1600' y2='8.4'/%3E%3Cline x1='0' y1='8.4' x2='1600' y2='8.4'/%3E%3Cline x1='0' y1='8.3' x2='1600' y2='8.3'/%3E%3Cline x1='0' y1='8.3' x2='1600' y2='8.3'/%3E%3Cline x1='0' y1='8.3' x2='1600' y2='8.3'/%3E%3Cline x1='0' y1='8.2' x2='1600' y2='8.2'/%3E%3Cline x1='0' y1='8.2' x2='1600' y2='8.2'/%3E%3Cline x1='0' y1='8.2' x2='1600' y2='8.2'/%3E%3Cline x1='0' y1='8.2' x2='1600' y2='8.2'/%3E%3Cline x1='0' y1='8.1' x2='1600' y2='8.1'/%3E%3Cline x1='0' y1='8.1' x2='1600' y2='8.1'/%3E%3Cline x1='0' y1='8.1' x2='1600' y2='8.1'/%3E%3Cline x1='0' y1='8.1' x2='1600' y2='8.1'/%3E%3Cline x1='0' y1='8.0' x2='1600' y2='8.0'/%3E%3Cline x1='0' y1='8.0' x2='1600' y2='8.0'/%3E%3Cline x1='0' y1='8.0' x2='1600' y2='8.0'/%3E%3Cline x1='0' y1='8.0' x2='1600' y2='8.0'/%3E%3Cline x1='0' y1='7.9' x2='1600' y2='7.9'/%3E%3Cline x1='0' y1='7.9' x2='1600' y2='7.9'/%3E%3Cline x1='0' y1='7.9' x2='1600' y2='7.9'/%3E%3Cline x1='0' y1='7.9' x2='1600' y2='7.9'/%3E%3Cline x1='0' y1='7.9' x2='1600' y2='7.9'/%3E%3Cline x1='0' y1='7.8' x2='1600' y2='7.8'/%3E%3Cline x1='0' y1='7.8' x2='1600' y2='7.8'/%3E%3Cline x1='0' y1='7.8' x2='1600' y2='7.8'/%3E%3Cline x1='0' y1='7.8' x2='1600' y2='7.8'/%3E%3Cline x1='0' y1='7.7' x2='1600' y2='7.7'/%3E%3Cline x1='0' y1='7.7' x2='1600' y2='7.7'/%3E%3Cline x1='0' y1='7.7' x2='1600' y2='7.7'/%3E%3Cline x1='0' y1='7.7' x2='1600' y2='7.7'/%3E%3Cline x1='0' y1='7.6' x2='1600' y2='7.6'/%3E%3Cline x1='0' y1='7.6' x2='1600' y2='7.6'/%3E%3Cline x1='0' y1='7.6' x2='1600' y2='7.6'/%3E%3Cline x1='0' y1='7.6' x2='1600' y2='7.6'/%3E%3Cline x1='0' y1='7.6' x2='1600' y2='7.6'/%3E%3Cline x1='0' y1='7.5' x2='1600' y2='7.5'/%3E%3Cline x1='0' y1='7.5' x2='1600' y2='7.5'/%3E%3Cline x1='0' y1='7.5' x2='1600' y2='7.5'/%3E%3Cline x1='0' y1='7.5' x2='1600' y2='7.5'/%3E%3Cline x1='0' y1='7.5' x2='1600' y2='7.5'/%3E%3Cline x1='0' y1='7.4' x2='1600' y2='7.4'/%3E%3Cline x1='0' y1='7.4' x2='1600' y2='7.4'/%3E%3Cline x1='0' y1='7.4' x2='1600' y2='7.4'/%3E%3Cline x1='0' y1='7.4' x2='1600' y2='7.4'/%3E%3Cline x1='0' y1='7.3' x2='1600' y2='7.3'/%3E%3Cline x1='0' y1='7.3' x2='1600' y2='7.3'/%3E%3Cline x1='0' y1='7.3' x2='1600' y2='7.3'/%3E%3Cline x1='0' y1='7.3' x2='1600' y2='7.3'/%3E%3Cline x1='0' y1='7.3' x2='1600' y2='7.3'/%3E%3Cline x1='0' y1='7.2' x2='1600' y2='7.2'/%3E%3Cline x1='0' y1='7.2' x2='1600' y2='7.2'/%3E%3Cline x1='0' y1='7.2' x2='1600' y2='7.2'/%3E%3Cline x1='0' y1='7.2' x2='1600' y2='7.2'/%3E%3Cline x1='0' y1='7.2' x2='1600' y2='7.2'/%3E%3Cline x1='0' y1='7.1' x2='1600' y2='7.1'/%3E%3Cline x1='0' y1='7.1' x2='1600' y2='7.1'/%3E%3Cline x1='0' y1='7.1' x2='1600' y2='7.1'/%3E%3Cline x1='0' y1='7.1' x2='1600' y2='7.1'/%3E%3Cline x1='0' y1='7.1' x2='1600' y2='7.1'/%3E%3Cline x1='0' y1='7.1' x2='1600' y2='7.1'/%3E%3Cline x1='0' y1='7.0' x2='1600' y2='7.0'/%3E%3Cline x1='0' y1='7.0' x2='1600' y2='7.0'/%3E%3Cline x1='0' y1='7.0' x2='1600' y2='7.0'/%3E%3Cline x1='0' y1='7.0' x2='1600' y2='7.0'/%3E%3Cline x1='0' y1='7.0' x2='1600' y2='7.0'/%3E%3Cline x1='0' y1='6.9' x2='1600' y2='6.9'/%3E%3Cline x1='0' y1='6.9' x2='1600' y2='6.9'/%3E%3Cline x1='0' y1='6.9' x2='1600' y2='6.9'/%3E%3Cline x1='0' y1='6.9' x2='1600' y2='6.9'/%3E%3Cline x1='0' y1='6.9' x2='1600' y2='6.9'/%3E%3Cline x1='0' y1='6.8' x2='1600' y2='6.8'/%3E%3Cline x1='0' y1='6.8' x2='1600' y2='6.8'/%3E%3Cline x1='0' y1='6.8' x2='1600' y2='6.8'/%3E%3Cline x1='0' y1='6.8' x2='1600' y2='6.8'/%3E%3Cline x1='0' y1='6.8' x2='1600' y2='6.8'/%3E%3Cline x1='0' y1='6.8' x2='1600' y2='6.8'/%3E%3Cline x1='0' y1='6.7' x2='1600' y2='6.7'/%3E%3Cline x1='0' y1='6.7' x2='1600' y2='6.7'/%3E%3Cline x1='0' y1='6.7' x2='1600' y2='6.7'/%3E%3Cline x1='0' y1='6.7' x2='1600' y2='6.7'/%3E%3Cline x1='0' y1='6.7' x2='1600' y2='6.7'/%3E%3Cline x1='0' y1='6.7' x2='1600' y2='6.7'/%3E%3Cline x1='0' y1='6.6' x2='1600' y2='6.6'/%3E%3Cline x1='0' y1='6.6' x2='1600' y2='6.6'/%3E%3Cline x1='0' y1='6.6' x2='1600' y2='6.6'/%3E%3Cline x1='0' y1='6.6' x2='1600' y2='6.6'/%3E%3Cline x1='0' y1='6.6' x2='1600' y2='6.6'/%3E%3Cline x1='0' y1='6.6' x2='1600' y2='6.6'/%3E%3Cline x1='0' y1='6.5' x2='1600' y2='6.5'/%3E%3Cline x1='0' y1='6.5' x2='1600' y2='6.5'/%3E%3Cline x1='0' y1='6.5' x2='1600' y2='6.5'/%3E%3Cline x1='0' y1='6.5' x2='1600' y2='6.5'/%3E%3Cline x1='0' y1='6.5' x2='1600' y2='6.5'/%3E%3Cline x1='0' y1='6.5' x2='1600' y2='6.5'/%3E%3Cline x1='0' y1='6.4' x2='1600' y2='6.4'/%3E%3Cline x1='0' y1='6.4' x2='1600' y2='6.4'/%3E%3Cline x1='0' y1='6.4' x2='1600' y2='6.4'/%3E%3Cline x1='0' y1='6.4' x2='1600' y2='6.4'/%3E%3Cline x1='0' y1='6.4' x2='1600' y2='6.4'/%3E%3Cline x1='0' y1='6.4' x2='1600' y2='6.4'/%3E%3Cline x1='0' y1='6.4' x2='1600' y2='6.4'/%3E%3Cline x1='0' y1='6.3' x2='1600' y2='6.3'/%3E%3Cline x1='0' y1='6.3' x2='1600' y2='6.3'/%3E%3Cline x1='0' y1='6.3' x2='1600' y2='6.3'/%3E%3Cline x1='0' y1='6.3' x2='1600' y2='6.3'/%3E%3Cline x1='0' y1='6.3' x2='1600' y2='6.3'/%3E%3Cline x1='0' y1='6.3' x2='1600' y2='6.3'/%3E%3Cline x1='0' y1='6.2' x2='1600' y2='6.2'/%3E%3Cline x1='0' y1='6.2' x2='1600' y2='6.2'/%3E%3Cline x1='0' y1='6.2' x2='1600' y2='6.2'/%3E%3Cline x1='0' y1='6.2' x2='1600' y2='6.2'/%3E%3Cline x1='0' y1='6.2' x2='1600' y2='6.2'/%3E%3Cline x1='0' y1='6.2' x2='1600' y2='6.2'/%3E%3Cline x1='0' y1='6.2' x2='1600' y2='6.2'/%3E%3Cline x1='0' y1='6.1' x2='1600' y2='6.1'/%3E%3Cline x1='0' y1='6.1' x2='1600' y2='6.1'/%3E%3Cline x1='0' y1='6.1' x2='1600' y2='6.1'/%3E%3Cline x1='0' y1='6.1' x2='1600' y2='6.1'/%3E%3Cline x1='0' y1='6.1' x2='1600' y2='6.1'/%3E%3Cline x1='0' y1='6.1' x2='1600' y2='6.1'/%3E%3Cline x1='0' y1='6.1' x2='1600' y2='6.1'/%3E%3Cline x1='0' y1='6.0' x2='1600' y2='6.0'/%3E%3Cline x1='0' y1='6.0' x2='1600' y2='6.0'/%3E%3Cline x1='0' y1='6.0' x2='1600' y2='6.0'/%3E%3Cline x1='0' y1='6.0' x2='1600' y2='6.0'/%3E%3C/g%3E%3C/svg%3E");
  background-size: 100% 100%;
  background-repeat: no-repeat;
  transform: none;
  -webkit-mask-image: linear-gradient(to top, #000 0%, rgba(0,0,0,.75) 30%, transparent 88%);
          mask-image: linear-gradient(to top, #000 0%, rgba(0,0,0,.75) 30%, transparent 88%);
  pointer-events: none;
}



/* The floor is atmosphere, not content. Rather than painting a scrim over it
   (which shows its own rectangular corners), the grid's own mask is composited
   from two gradients: one fading toward the horizon, one fading out across the
   column where the headline sits. The geometry dissolves; nothing overlaps it. */
body.uv-tron .hero-section::before {
  opacity: .7;
  -webkit-mask-image:
    linear-gradient(to top, #000 0%, rgba(0,0,0,.75) 30%, transparent 88%),
    linear-gradient(100deg, transparent 0%, rgba(0,0,0,.35) 34%, #000 62%);
          mask-image:
    linear-gradient(to top, #000 0%, rgba(0,0,0,.75) 30%, transparent 88%),
    linear-gradient(100deg, transparent 0%, rgba(0,0,0,.35) 34%, #000 62%);
  -webkit-mask-composite: source-in;
          mask-composite: intersect;
}

/* On narrow screens the copy spans the full width, so the horizontal fade that
   protects the headline on desktop has nothing to fade toward. Drop the floor
   lower and lighten it so it stays behind the content rather than through it. */
@media (max-width: 991.98px) {
  body.uv-tron .hero-section::before {
    height: 30%;
    opacity: .42;
    -webkit-mask-image: linear-gradient(to top, #000 0%, rgba(0,0,0,.6) 35%, transparent 85%);
            mask-image: linear-gradient(to top, #000 0%, rgba(0,0,0,.6) 35%, transparent 85%);
    -webkit-mask-composite: source-over;
            mask-composite: add;
  }
}

/* The pulsing transit dot is the only motion in the theme; the glow is static. */
@media (prefers-reduced-motion: reduce) {
  body.uv-tron .uv-wo-pulse { animation: none; }
}

/* ==================================================================
   TRON — the rest of the site
   ------------------------------------------------------------------
   Every surface the other pages rely on was designed for paper. On the
   Grid they become lit panels: dark ground, structural edge, cyan only
   where something is signalling.
   ================================================================== */

/* ---------- panels ---------- */
body.uv-tron .inner-content-box,
body.uv-tron .card,
body.uv-tron .form-card,
body.uv-tron .modal-content,
body.uv-tron .list-group-item,
body.uv-tron .accordion-item {
  background: var(--tron-panel);
  border: 1px solid var(--tron-line);
  color: var(--tron-ink);
  box-shadow: none;
}
body.uv-tron .inner-content-box { box-shadow: 0 0 40px rgba(77,224,249,.06); }
body.uv-tron .card-body, body.uv-tron .card-footer { background: transparent; }
body.uv-tron .card-footer { border-top: 1px solid var(--tron-line); }

/* Card headers were flat slate; on the Grid they are the lit edge of a panel. */
body.uv-tron .card-header {
  background: rgba(77,224,249,.07);
  border-bottom: 1px solid var(--tron-cyan-dim);
  color: var(--tron-ink);
}
body.uv-tron .card-header h1, body.uv-tron .card-header h2,
body.uv-tron .card-header h3, body.uv-tron .card-header h4,
body.uv-tron .card-header h5, body.uv-tron .card-header h6 { color: #EAF9FE; }
body.uv-tron .card-header p,
body.uv-tron .card-header .text-muted { color: var(--tron-ink-dim) !important; }

/* Bootstrap utilities used inline across the older pages. */
body.uv-tron .bg-light, body.uv-tron .bg-white { background: var(--tron-panel) !important; }
body.uv-tron .text-dark { color: var(--tron-ink) !important; }
body.uv-tron .text-muted { color: var(--tron-ink-dim) !important; }
body.uv-tron .border { border-color: var(--tron-line) !important; }
body.uv-tron hr { border-top-color: var(--tron-line); }

/* ---------- forms ---------- */
body.uv-tron .form-control,
body.uv-tron .form-select,
body.uv-tron .input-group-text {
  background: var(--tron-deep);
  border: 1px solid var(--tron-line);
  color: var(--tron-ink);
}
body.uv-tron .form-control::placeholder { color: #628594; }  /* 4.7:1 — placeholders here carry real hints */
body.uv-tron .form-control:focus,
body.uv-tron .form-select:focus {
  background: var(--tron-deep);
  border-color: var(--tron-cyan);
  color: #EAF9FE;
  box-shadow: 0 0 0 1px var(--tron-cyan), 0 0 18px rgba(77,224,249,.22);
}
body.uv-tron .form-label { color: var(--tron-cyan-dim); }
body.uv-tron .form-text { color: var(--tron-ink-dim); }
body.uv-tron .form-check-input {
  background-color: var(--tron-deep);
  border-color: var(--tron-line);
}
body.uv-tron .form-check-input:checked {
  background-color: var(--tron-cyan);
  border-color: var(--tron-cyan);
}
body.uv-tron .input-group-text { color: var(--tron-cyan-dim); }

/* ---------- tables ---------- */
body.uv-tron .table {
  --bs-table-bg: transparent;
  --bs-table-color: var(--tron-ink);
  --bs-table-border-color: var(--tron-line);
  --bs-table-striped-bg: rgba(77,224,249,.035);
  --bs-table-striped-color: var(--tron-ink);
  --bs-table-hover-bg: rgba(77,224,249,.07);
  --bs-table-hover-color: #EAF9FE;
  color: var(--tron-ink);
}
body.uv-tron .table > thead th {
  color: var(--tron-cyan-dim);
  border-bottom-color: var(--tron-cyan-dim);
  background: transparent;
}
body.uv-tron .table td, body.uv-tron .table th { border-color: var(--tron-line); }

/* ---------- alerts ---------- */
body.uv-tron .alert {
  background: var(--tron-panel);
  border: 1px solid var(--tron-line);
  color: var(--tron-ink);
}
body.uv-tron .alert-success { border-left: 3px solid #2FD6A0; }
body.uv-tron .alert-danger  { border-left: 3px solid #FF6B5E; }
body.uv-tron .alert-warning { border-left: 3px solid var(--tron-amber); }
body.uv-tron .alert-info    { border-left: 3px solid var(--tron-cyan); }
body.uv-tron .alert strong, body.uv-tron .alert h4, body.uv-tron .alert h5 { color: #EAF9FE; }

/* ---------- badges, chips, breadcrumbs, dropdowns ---------- */
body.uv-tron .badge { background: rgba(77,224,249,.12); color: var(--tron-cyan); }
body.uv-tron .badge.bg-success { background: rgba(47,214,160,.15) !important; color: #64E9BE; }
body.uv-tron .badge.bg-danger  { background: rgba(255,107,94,.15) !important; color: #FF9086; }
body.uv-tron .badge.bg-warning { background: rgba(242,180,23,.15) !important; color: var(--tron-amber); }
body.uv-tron .badge.bg-secondary { background: rgba(127,163,180,.15) !important; color: var(--tron-ink-dim); }

body.uv-tron .uv-chip { background: rgba(77,224,249,.08); border: 1px solid var(--tron-line); color: var(--tron-ink); }

body.uv-tron .breadcrumb { color: var(--tron-ink-dim); }
body.uv-tron .dropdown-menu {
  background: var(--tron-panel);
  border: 1px solid var(--tron-cyan-dim);
  box-shadow: 0 0 30px rgba(77,224,249,.15);
}
body.uv-tron .dropdown-item { color: var(--tron-ink); }
body.uv-tron .dropdown-item:hover { background: rgba(77,224,249,.10); color: var(--tron-cyan); }
body.uv-tron .dropdown-divider { border-top-color: var(--tron-line); }

/* ---------- prose (KB articles, CMS pages) ---------- */
body.uv-tron .uv-article { color: var(--tron-ink-dim); }
body.uv-tron .uv-article h2, body.uv-tron .uv-article h3,
body.uv-tron .uv-article h4 { color: #EAF9FE; }
body.uv-tron .uv-article code {
  background: rgba(77,224,249,.10);
  color: var(--tron-cyan);
  border: 1px solid var(--tron-line);
}
body.uv-tron .uv-article pre {
  background: var(--tron-void);
  border: 1px solid var(--tron-line);
  color: var(--tron-ink);
}
body.uv-tron .uv-article blockquote {
  border-left: 3px solid var(--tron-cyan);
  color: var(--tron-ink-dim);
}
body.uv-tron .uv-article th { color: var(--tron-cyan-dim); border-color: var(--tron-line); }
body.uv-tron .uv-article td { border-color: var(--tron-line); }
body.uv-tron .uv-article img { border: 1px solid var(--tron-line); }

/* ---------- page head (services, about) ---------- */
body.uv-tron .uv-pagehead,
body.uv-tron .about-hero {
  background: var(--tron-void);
  border-bottom: 1px solid var(--tron-line);
  position: relative;
}
/* Light ribbon along the bottom edge instead of the amber rule. */
body.uv-tron .uv-pagehead::after,
body.uv-tron .about-hero::after {
  content: "";
  position: absolute; left: 0; right: 0; bottom: -1px; height: 1px;
  background: linear-gradient(90deg, transparent, var(--tron-cyan) 15%, var(--tron-cyan) 85%, transparent);
  box-shadow: 0 0 18px rgba(77,224,249,.55);
}
body.uv-tron .uv-pagehead::before,
body.uv-tron .about-hero::before {
  background-image:
    linear-gradient(rgba(77,224,249,.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(77,224,249,.05) 1px, transparent 1px);
  background-size: 40px 40px;
}
body.uv-tron .cert-badge {
  background: rgba(77,224,249,.07);
  border: 1px solid var(--tron-cyan-dim);
  color: var(--tron-cyan);
}
body.uv-tron .cert-badge i { color: var(--tron-amber); }

/* ---------- section headings ---------- */
body.uv-tron .section-title::after { background: var(--tron-cyan); box-shadow: 0 0 10px var(--tron-cyan); }

/* ---------- auth (login / register) ---------- */
body.uv-tron .uv-auth-form { background: var(--tron-deep); }
body.uv-tron .uv-auth-aside { background: var(--tron-void); }
body.uv-tron .uv-auth-aside::before {
  background-image:
    linear-gradient(rgba(77,224,249,.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(77,224,249,.05) 1px, transparent 1px);
  background-size: 40px 40px;
}
body.uv-tron .uv-auth-aside-title { color: #EAF9FE; }
@media (max-width: 991.98px) {
  body.uv-tron .uv-auth-form { border-bottom: 1px solid var(--tron-line); }
}

/* ---------- the real work order (track-ticket, view-request) ---------- */
body.uv-tron .uv-workorder {
  background: var(--tron-panel);
  border: 1px solid var(--tron-cyan-dim);
  box-shadow: 0 0 30px rgba(77,224,249,.15);
}
body.uv-tron .uv-workorder-head {
  background: rgba(77,224,249,.08);
  border-bottom: 1px solid var(--tron-cyan-dim);
}
body.uv-tron .uv-workorder-no { color: var(--tron-cyan); text-shadow: 0 0 16px rgba(77,224,249,.7); }
body.uv-tron .uv-tear { border-color: var(--tron-line); }
body.uv-tron .uv-field-value { color: #EAF9FE; }
body.uv-tron .uv-field-value.is-empty { color: #658A99; }
body.uv-tron .uv-field { border-color: var(--tron-line); }

/* The dispatch rail on the real ticket pages. */
body.uv-tron .uv-rail-step { color: var(--tron-ink-dim); }
body.uv-tron .uv-rail-name { color: var(--tron-ink); }
body.uv-tron .uv-rail-time, body.uv-tron .uv-rail-dur { color: var(--tron-ink-dim); }
body.uv-tron .uv-rail-dot { background: var(--tron-deep); border-color: var(--tron-line); }
body.uv-tron .uv-rail-step.is-done .uv-rail-dot { background: #2FD6A0; border-color: #2FD6A0; box-shadow: 0 0 10px rgba(47,214,160,.7); }
body.uv-tron .uv-rail-step.is-current .uv-rail-dot { background: var(--tron-cyan); border-color: var(--tron-cyan); box-shadow: 0 0 12px var(--tron-cyan); }
body.uv-tron .uv-rail-step.is-current .uv-rail-name { color: var(--tron-cyan); }

body.uv-tron .uv-ticket-issued { background: var(--tron-panel); border-left-color: var(--tron-cyan); }
body.uv-tron .uv-ticket-no { color: var(--tron-cyan); text-shadow: 0 0 20px rgba(77,224,249,.7); }

body.uv-tron .uv-disclosure-btn { color: var(--tron-cyan); }
body.uv-tron .uv-msg { background: var(--tron-deep); border: 1px solid var(--tron-line); }
body.uv-tron .uv-msg-admin { background: rgba(77,224,249,.06); }

/* ---------- shop / store ---------- */
body.uv-tron .product-card, body.uv-tron .service-card { background: var(--tron-panel); border-color: var(--tron-line); }
body.uv-tron .product-card:hover, body.uv-tron .service-card:hover {
  border-color: var(--tron-cyan-dim);
  box-shadow: 0 0 26px rgba(77,224,249,.18);
}
body.uv-tron .uv-product-media { background: var(--tron-deep); border-bottom-color: var(--tron-line); }
body.uv-tron .uv-placeholder-icon { color: var(--tron-cyan-dim); }
body.uv-tron .uv-meta { color: var(--tron-cyan-dim); }

/* ---------- about stat tiles ---------- */
body.uv-tron .stat-box {
  background: var(--tron-panel);
  border: 1px solid var(--tron-line);
  border-left: 3px solid var(--tron-cyan);
}
body.uv-tron .stat-box .stat-number { color: var(--tron-cyan); text-shadow: 0 0 18px rgba(77,224,249,.5); }
body.uv-tron .stat-box .stat-label, body.uv-tron .stat-box i { color: var(--tron-ink-dim); }

/* ---------- dashboard stat cards ---------- */
body.uv-tron .dashboard-stat-card { background: var(--tron-panel); border: 1px solid var(--tron-line); }
body.uv-tron .dashboard-stat-card .stat-number { color: #EAF9FE; }
body.uv-tron .dashboard-stat-card .stat-label,
body.uv-tron .dashboard-stat-card .stat-icon { color: var(--tron-ink-dim); }
body.uv-tron .dashboard-stat-card.is-pending { border-left: 3px solid var(--tron-amber); }
body.uv-tron .dashboard-stat-card.is-active  { border-left: 3px solid var(--tron-cyan); }
body.uv-tron .dashboard-stat-card.is-done    { border-left: 3px solid #2FD6A0; }

/* ---------- misc ---------- */
body.uv-tron .uv-note { background: var(--tron-panel); border-left-color: var(--tron-cyan); }
body.uv-tron .uv-empty { color: var(--tron-ink-dim); }
body.uv-tron .qualification-item { background: var(--tron-panel); border-color: var(--tron-line); }
body.uv-tron .platform-logo { opacity: .85; filter: none; }
body.uv-tron .platform-item p, body.uv-tron .platform-item div { color: var(--tron-cyan-dim); }
body.uv-tron .platforms-section { background: var(--tron-deep); }
body.uv-tron .about-photo { border-color: var(--tron-line); }
body.uv-tron .downloads-list .list-group-item:hover { background: rgba(77,224,249,.06); }

/* services.php stat tiles — were slate-teal gradients from the old palette. */
body.uv-tron .stats-box {
  background: var(--tron-panel);
  border: 1px solid var(--tron-line);
  border-top: 2px solid var(--tron-cyan);
  border-radius: var(--uv-r);
  color: var(--tron-ink);
}
body.uv-tron .stats-number, body.uv-tron .stats-box i { color: var(--tron-cyan); }
body.uv-tron .stats-label { color: var(--tron-ink-dim); }

/* services.php service/qualification icons */
body.uv-tron .service-icon,
body.uv-tron .qualification-item > i,
body.uv-tron .feature-icon-lg { color: var(--tron-cyan); }
body.uv-tron .service-card { border-left-color: var(--tron-cyan-dim); }
body.uv-tron .feature-icon {
  background: rgba(77,224,249,.08);
  border: 1px solid var(--tron-line);
  color: var(--tron-cyan);
}
body.uv-tron .feature-title { color: #EAF9FE; }
body.uv-tron .feature-description { color: var(--tron-ink-dim); }

/* ---------- remaining paper surfaces ----------
   Swept from uv.css by listing every selector that paints --uv-paper /
   --uv-bench / #fff, rather than fixing them one screenshot at a time. */
body.uv-tron .feature-card,
body.uv-tron .feature-card-large,
body.uv-tron .project-preview-card,
body.uv-tron .article-card {
  background: var(--tron-panel);
  border: 1px solid var(--tron-line);
  color: var(--tron-ink);
}
body.uv-tron .feature-card:hover,
body.uv-tron .article-card:hover,
body.uv-tron .project-preview-card:hover {
  border-color: var(--tron-cyan-dim);
  box-shadow: 0 0 24px rgba(77,224,249,.15);
}
body.uv-tron .article-title { color: var(--tron-cyan); }
body.uv-tron .article-date { color: var(--tron-cyan-dim); }
body.uv-tron .article-excerpt { color: var(--tron-ink-dim); }
body.uv-tron .article-link { color: var(--tron-cyan); }

body.uv-tron .modal-header { background: rgba(77,224,249,.07); border-bottom-color: var(--tron-cyan-dim); }
body.uv-tron .modal-footer { border-top-color: var(--tron-line); }
body.uv-tron .btn-close { filter: invert(1) grayscale(1) brightness(2); }

body.uv-tron .form-control:disabled,
body.uv-tron .form-control[readonly] { background: var(--tron-void); color: #658A99; }

body.uv-tron .uv-rail-dur { background: rgba(77,224,249,.08); color: var(--tron-cyan); }
body.uv-tron .uv-chip-archived { background: rgba(127,163,180,.12); color: var(--tron-ink-dim); }
body.uv-tron .uv-disclosure-btn:hover { background: rgba(77,224,249,.08); }
body.uv-tron .btn-outline-secondary:hover { background: rgba(77,224,249,.10); color: var(--tron-cyan); }
body.uv-tron .table-hover > tbody > tr:hover > td { background: rgba(77,224,249,.07); color: #EAF9FE; }

/* ---------- specificity repairs ----------
   Several base rules carry more class selectors than the theme's, so they win
   and paint near-black ink on a near-black panel. These match or exceed them.
   Found by grepping uv.css for `color: var(--uv-ink*)` outside the theme rather
   than by spotting each one in a screenshot. */

/* The rail: `.uv-rail-step.is-done .uv-rail-name` is three classes deep. */
body.uv-tron .uv-rail-step .uv-rail-name { color: var(--tron-ink-dim); }
body.uv-tron .uv-rail-step.is-done .uv-rail-name { color: var(--tron-ink); }
body.uv-tron .uv-rail-step.is-current .uv-rail-name { color: var(--tron-cyan); }
body.uv-tron .uv-rail-step.is-current .uv-rail-time { color: var(--tron-cyan-dim); }
body.uv-tron .uv-rail-dark .uv-rail-name { color: var(--tron-ink-dim); }
body.uv-tron .uv-rail-dark .uv-rail-step.is-done .uv-rail-name { color: var(--tron-ink); }
body.uv-tron .uv-rail-dark .uv-rail-step.is-current .uv-rail-name { color: var(--tron-cyan); }

/* Emphasis, headings and labels inherit dark ink globally. */
body.uv-tron strong, body.uv-tron b { color: #EAF9FE; }
body.uv-tron .uv-eyebrow, body.uv-tron .uv-label { color: var(--tron-cyan); }
body.uv-tron .uv-eyebrow::before { background: var(--tron-cyan); box-shadow: 0 0 10px var(--tron-cyan); }
body.uv-tron .section-title { color: #EAF9FE; }
body.uv-tron .uv-muted { color: var(--tron-ink-dim); }

/* Buttons whose base rules set slate fills. */
body.uv-tron .btn-secondary { background: var(--tron-panel); border-color: var(--tron-line); color: var(--tron-ink); }
body.uv-tron .btn-secondary:hover { background: rgba(77,224,249,.10); border-color: var(--tron-cyan-dim); color: var(--tron-cyan); }
body.uv-tron .btn-outline-secondary { color: var(--tron-ink-dim); border-color: var(--tron-line); }
body.uv-tron .btn-primary:hover,
body.uv-tron .btn-hero-primary:hover { background: rgba(77,224,249,.14); border-color: var(--tron-cyan); color: #EAF9FE; }
body.uv-tron .btn-outline-primary:hover { background: rgba(77,224,249,.12); border-color: var(--tron-cyan); color: #EAF9FE; }
body.uv-tron .btn-success { background: rgba(47,214,160,.16); border-color: #2FD6A0; color: #64E9BE; }
body.uv-tron .btn-danger  { background: rgba(255,107,94,.16); border-color: #FF6B5E; color: #FF9086; }

/* The nav's active pill was ink-on-amber. */
body.uv-tron .nav-link-modern.is-active { color: var(--tron-cyan); background: transparent; }

/* ==================================================================
   TRON — admin panel  (body.uv-tron.uv-admin)
   ------------------------------------------------------------------
   The admin lives at /admin, aliased to private/admin. 25 of its pages
   use a shared header; 9 predate it and carry their own <head> plus the
   retired admin_style.css. These rules cover both, and override
   admin_style.css where it still loads.
   ================================================================== */

/* admin_style.css sets a light ground on body.admin-body and loads before
   uv.css on those pages; override it rather than editing nine files. */
body.uv-admin,
body.uv-admin.admin-body {
  background: var(--tron-void) !important;
  color: var(--tron-ink) !important;
  font-family: var(--uv-sans);
}

/* The standalone pages use Bootstrap's own dark navbar. */
body.uv-admin .navbar.bg-dark,
body.uv-admin .navbar-dark {
  background: var(--tron-void) !important;
  border-bottom: 1px solid var(--tron-line);
}
body.uv-admin .navbar-dark .navbar-brand,
body.uv-admin .navbar .navbar-brand { color: #fff; }
body.uv-admin .navbar-dark .nav-link { color: var(--tron-ink-dim); }
body.uv-admin .navbar-dark .nav-link:hover,
body.uv-admin .navbar-dark .nav-link.active { color: var(--tron-cyan); }

/* The red gradient "Admin Mode" badge in the shared header. */
body.uv-admin .admin-badge-modern {
  background: rgba(77,224,249,.10);
  border: 1px solid var(--tron-cyan-dim);
  color: var(--tron-cyan);
  box-shadow: 0 0 18px rgba(77,224,249,.18);
}
body.uv-admin .admin-badge-modern .logout-link-modern { color: var(--tron-cyan); }
body.uv-admin .admin-badge-modern .logout-link-modern:hover { color: #fff; }

/* admin_style.css card + stat treatments (light gradients, 1rem radius). */
body.uv-admin .admin-card,
body.uv-admin .admin-container,
body.uv-admin .content-section {
  background: var(--tron-panel) !important;
  border: 1px solid var(--tron-line) !important;
  border-radius: var(--uv-r) !important;
  box-shadow: none !important;
  color: var(--tron-ink);
}
body.uv-admin .stat-card {
  background: var(--tron-panel) !important;
  border: 1px solid var(--tron-line) !important;
  border-top: 2px solid var(--tron-cyan) !important;
  border-radius: var(--uv-r) !important;
  box-shadow: none !important;
  color: var(--tron-ink) !important;
}
body.uv-admin .stat-card .stat-number,
body.uv-admin .stat-card h2, body.uv-admin .stat-card h3 { color: var(--tron-cyan) !important; }
body.uv-admin .stat-card .stat-label,
body.uv-admin .stat-card p { color: var(--tron-ink-dim) !important; }

/* Tables carry most of the admin's information. */
body.uv-admin .table { color: var(--tron-ink); }
body.uv-admin .table > thead th {
  color: var(--tron-cyan-dim);
  background: transparent;
  border-bottom-color: var(--tron-cyan-dim);
}
body.uv-admin .table-striped > tbody > tr:nth-of-type(odd) > * {
  background: rgba(77,224,249,.035);
  color: var(--tron-ink);
}
body.uv-admin .table-light, body.uv-admin .table-light > * {
  background: rgba(77,224,249,.07) !important;
  color: var(--tron-ink) !important;
}
body.uv-admin .img-thumbnail, body.uv-admin .img-thumbnail-small {
  background: var(--tron-deep);
  border-color: var(--tron-line);
}

/* Bootstrap utilities the older pages lean on. */
body.uv-admin .bg-white, body.uv-admin .bg-light { background: var(--tron-panel) !important; }
body.uv-admin .text-dark, body.uv-admin .text-body { color: var(--tron-ink) !important; }
body.uv-admin .border-bottom, body.uv-admin .border-top,
body.uv-admin .border-start, body.uv-admin .border-end { border-color: var(--tron-line) !important; }

/* The file manager and terminal pages render fixed-width output. */
body.uv-admin pre, body.uv-admin .terminal-output, body.uv-admin code {
  background: var(--tron-void);
  border: 1px solid var(--tron-line);
  color: var(--tron-ink);
}

/* Admin dashboard tiles. The markup carried grey and green gradients from the
   retired palette as inline styles, which no stylesheet can override — they
   were removed from index.php and replaced with these. */
body.uv-admin .uv-admin-stat {
  background: var(--tron-panel);
  border: 1px solid var(--tron-line);
  border-top: 2px solid var(--tron-cyan);
  color: var(--tron-ink);
}
body.uv-admin .uv-admin-stat--money { border-top-color: #2FD6A0; }
body.uv-admin .uv-admin-stat .display-4,
body.uv-admin .uv-admin-stat h2 {
  color: var(--tron-cyan);
  font-family: var(--uv-mono);
  font-variant-numeric: tabular-nums;
  text-shadow: 0 0 18px rgba(77,224,249,.45);
}
body.uv-admin .uv-admin-stat--money .display-4,
body.uv-admin .uv-admin-stat--money h2 { color: #64E9BE; text-shadow: 0 0 18px rgba(47,214,160,.4); }
body.uv-admin .uv-admin-stat p { color: var(--tron-ink-dim); }
body.uv-admin .uv-admin-stat-icon { font-size: 1.75rem; color: var(--tron-cyan-dim); line-height: 1; }
body.uv-admin .uv-admin-stat--money .uv-admin-stat-icon { color: #2FD6A0; }

body.uv-admin .uv-accent { color: var(--tron-cyan) !important; }
body.uv-admin .uv-accent-amber { color: var(--tron-amber) !important; }

/* `.text-white` on a now-dark tile is redundant but harmless; make sure it
   never lands on a light surface. */
body.uv-admin .card.text-white { color: var(--tron-ink) !important; }

/* Donations header. Bootstrap's .bg-success carries !important, so the markup
   class was swapped rather than fought with a heavier selector. */
body.uv-admin .uv-admin-head--money {
  background: rgba(47,214,160,.10);
  border-bottom: 1px solid #2FD6A0;
  color: #64E9BE;
}
body.uv-admin .uv-admin-head--money h5 { color: #64E9BE; }

/* Any remaining Bootstrap contextual fills inside the admin. */
body.uv-admin .bg-success { background: rgba(47,214,160,.12) !important; color: #64E9BE !important; }
body.uv-admin .bg-primary { background: rgba(77,224,249,.12) !important; color: var(--tron-cyan) !important; }
body.uv-admin .bg-danger  { background: rgba(255,107,94,.12) !important; color: #FF9086 !important; }
body.uv-admin .bg-warning { background: rgba(242,180,23,.12) !important; color: var(--tron-amber) !important; }
body.uv-admin .bg-info    { background: rgba(77,224,249,.12) !important; color: var(--tron-cyan) !important; }
body.uv-admin .bg-dark, body.uv-admin .bg-secondary { background: var(--tron-panel) !important; color: var(--tron-ink) !important; }

/* .btn-light / .btn-white read as a hole punched in the panel on a dark theme. */
body.uv-tron .btn-light, body.uv-tron .btn-white {
  background: rgba(77,224,249,.10);
  border: 1px solid var(--tron-cyan-dim);
  color: var(--tron-cyan);
}
body.uv-tron .btn-light:hover, body.uv-tron .btn-white:hover {
  background: rgba(77,224,249,.18);
  border-color: var(--tron-cyan);
  color: #EAF9FE;
}
