/* ============================================================
   Cold-boot loading veil — full-screen obsidian cover with the wireframe
   pokeball (app/views/boot-veil.js). Shown only when the authed shell mounts
   with an empty inventory store; fades out (200ms) the instant the first load
   settles. z 2500: above the shell/dock (35) and modals (1000), below nothing
   that matters during boot (the inspector's 2000 can't be open yet).
   ============================================================ */
.v9-bootveil {
  position: fixed; inset: 0; z-index: 2500;
  display: grid; place-items: center;
  background: var(--v9-bg, #0B0B0D);
  transition: opacity 200ms ease;
}
.v9-bootveil.is-done { opacity: 0; pointer-events: none; }
.v9-bootveil-inner { display: grid; place-items: center; gap: 18px; }
.v9-bootveil svg { display: block; }
.v9-bootveil-label {
  font: 500 10px/1 var(--v9-font-mono, ui-monospace, monospace);
  letter-spacing: 0.22em;
  color: var(--v9-text-faint, #6E6E76);
}

/* motion: whole mark drifts slowly, the accent arc orbits faster, the button
   pulses. transform-box: view-box → rotate around the SVG's own center. */
.v9-bootveil .bv-spin,
.v9-bootveil .bv-orbit { transform-box: view-box; transform-origin: 50% 50%; }
.v9-bootveil .bv-spin  { animation: v9-bv-spin 7s linear infinite; }
.v9-bootveil .bv-orbit { animation: v9-bv-spin 1.9s linear infinite; }
.v9-bootveil .bv-pulse { animation: v9-bv-pulse 1.6s ease-in-out infinite; }
@keyframes v9-bv-spin { to { transform: rotate(360deg); } }
@keyframes v9-bv-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }

@media (prefers-reduced-motion: reduce) {
  .v9-bootveil .bv-spin,
  .v9-bootveil .bv-orbit,
  .v9-bootveil .bv-pulse { animation: none; }
}
