/* v422 — Route-aware startup curtain. This is not a global scroll lock:
   it removes itself after essential artwork is painted, or on timeout. */
html body #odBootScreen{
  display:none;
  position:fixed;
  inset:0;
  z-index:2147483646;
  box-sizing:border-box;
  padding:24px;
  background:#09090c;
  color:#edf0f0;
  font-family:'Space Grotesk',system-ui,sans-serif;
  pointer-events:none;
  opacity:0;
  visibility:hidden;
  place-items:center;
  transition:opacity 260ms ease,visibility 260ms ease;
}
html.od-boot-pending body #odBootScreen{
  display:grid;
  opacity:1;
  visibility:visible;
  pointer-events:auto;
}
html body #odBootScreen .od-boot-content{
  width:min(270px,80vw);
  display:flex;
  flex-direction:column;
  gap:13px;
  text-align:center;
  align-items:center;
}
html body #odBootScreen .od-boot-name{
  margin:0;
  font-size:clamp(24px,4vw,38px);
  line-height:1;
  letter-spacing:.13em;
  font-weight:800;
}
html body #odBootScreen .od-boot-description{
  font:500 10px/1.4 'Space Grotesk',system-ui,sans-serif;
  letter-spacing:.18em;
  color:#bdc6cc;
}
html body #odBootScreen .od-boot-track{
  position:relative;
  width:100%;
  height:2px;
  overflow:hidden;
  background:rgba(209,255,0,.18);
}
html body #odBootScreen .od-boot-track::after{
  content:"";
  display:block;
  height:100%;
  width:38%;
  background:#d1ff00;
  transform:translateX(-110%);
  animation:od-boot-move 1.25s ease-in-out infinite alternate;
}
@keyframes od-boot-move{
  to{transform:translateX(275%)}
}
@media(prefers-reduced-motion:reduce){
  html body #odBootScreen .od-boot-track::after{animation:none;transform:none;width:100%}
}
/* No background/mask rules here. The Art 2D top bar's approved fade
   remains exclusively in work-background-contrast-v411.css. */
