/* Current: a brief travelling highlight, like light finding the edge of a fitting. */
.text-link,
.header nav > a:not(.nav-cta),
.service-overview a.service-link {
  --edge-light: #dcf579;
  --edge-highlight: #ffffe3;
  --edge-glow: rgb(220 245 121 / 28%);
  position: relative;
}

/* On paper, a dark olive edge stays legible; the highlight is intentionally quieter. */
.text-link.dark,
.service-overview a.service-link {
  --edge-light: #536b29;
  --edge-highlight: #92a94b;
  --edge-glow: rgb(83 107 41 / 16%);
}

.text-link::after,
.header nav > a:not(.nav-cta)::after,
.service-overview a.service-link::after {
  content: "";
  position: absolute;
  inset: auto 0 -1px;
  width: 100%;
  height: 1px;
  pointer-events: none;
  background-color: var(--edge-light);
  background-image: linear-gradient(
    100deg,
    transparent 35%,
    var(--edge-highlight) 48%,
    var(--edge-highlight) 51%,
    transparent 64%
  );
  background-size: 280% 100%;
  background-position: 100% 0;
  box-shadow: 0 0 5px var(--edge-glow);
  opacity: 0;
  transform: scaleX(.82);
  transform-origin: left;
  transition: opacity .2s ease, transform .3s ease;
}

.header nav > a:not(.nav-cta)::after {
  bottom: 5px;
}

.text-link:is(:focus-visible, :active)::after,
.header nav > a:not(.nav-cta):is(:focus-visible, :active)::after,
.service-overview a.service-link:is(:focus-visible, :active)::after {
  opacity: 1;
  transform: scaleX(1);
  animation: current-edge-light .75s cubic-bezier(.2, .6, .3, 1) both;
}

@media (hover: hover) {
  .text-link:hover::after,
  .header nav > a:not(.nav-cta):hover::after,
  .service-overview a.service-link:hover::after {
    opacity: 1;
    transform: scaleX(1);
    animation: current-edge-light .75s cubic-bezier(.2, .6, .3, 1) both;
  }
}

@keyframes current-edge-light {
  from { background-position: 100% 0; }
  to { background-position: 0 0; }
}

/* Keep the selected scene's existing border and text state, with a small light spill. */
.scene-choice[aria-pressed="true"] {
  box-shadow: 0 4px 8px -7px rgb(220 245 121 / 45%);
}

@media (prefers-reduced-motion: reduce) {
  .text-link::after,
  .header nav > a:not(.nav-cta)::after,
  .service-overview a.service-link::after {
    /* Override every interaction state without relying on the site's global reset. */
    animation: none !important;
    transition: none !important;
    background-image: none;
    transform: none !important;
  }
}
