/* #150: short, purely presentational confirmations for authoritative QGo states.
 * No rule state, clock, or pointer target depends on these effects. */
.qgo-confirmed-move,
.qgo-confirmed-measurement { pointer-events: none; }

/* Static, confirmed common-placement marker. It is a protocol fact for the
 * current accepted double/triple move, never an entanglement claim. Keyboard
 * focus and a deliberate tap expose the same emphasis without motion. */
.qgo-common-origin { opacity: 0; pointer-events: none; }
.qgo-common-origin-link,
.qgo-common-origin-ring { opacity: .62; }
.qgo-origin-visible .qgo-common-origin,
.qgo-board-column:has(.qgo-origin-toggle:hover) .qgo-common-origin,
.qgo-board-column:has(.qgo-origin-toggle:focus-visible) .qgo-common-origin { opacity: 1; }
.qgo-origin-visible .qgo-common-origin-link,
.qgo-board-column:has(.qgo-origin-toggle:hover) .qgo-common-origin-link,
.qgo-board-column:has(.qgo-origin-toggle:focus-visible) .qgo-common-origin-link { opacity: 1; stroke-width: .6; }
.qgo-origin-visible .qgo-common-origin-ring,
.qgo-board-column:has(.qgo-origin-toggle:hover) .qgo-common-origin-ring,
.qgo-board-column:has(.qgo-origin-toggle:focus-visible) .qgo-common-origin-ring { opacity: 1; stroke-width: .55; }

.qgo-confirmed-move .qgo-move-origin-link {
  stroke-dasharray: 1000;
  stroke-dashoffset: 1000;
  opacity: .9;
}

.qgo-confirmed-move .qgo-move-origin-ring {
  transform-box: fill-box;
  transform-origin: center;
}

.qgo-confirmed-move.qgo-motion-phase-a .qgo-move-origin-link {
  animation: qgo-origin-link-a 360ms cubic-bezier(.2,.7,.25,1) both;
}
.qgo-confirmed-move.qgo-motion-phase-b .qgo-move-origin-link {
  animation: qgo-origin-link-b 360ms cubic-bezier(.2,.7,.25,1) both;
}
.qgo-confirmed-move.qgo-motion-phase-a .qgo-move-origin-ring {
  animation: qgo-origin-ring-a 380ms cubic-bezier(.18,.75,.25,1) both;
}
.qgo-confirmed-move.qgo-motion-phase-b .qgo-move-origin-ring {
  animation: qgo-origin-ring-b 380ms cubic-bezier(.18,.75,.25,1) both;
}
.qgo-confirmed-measurement.qgo-motion-phase-a {
  animation: qgo-measurement-result-a 420ms cubic-bezier(.2,.72,.3,1) both;
}
.qgo-confirmed-measurement.qgo-motion-phase-b {
  animation: qgo-measurement-result-b 420ms cubic-bezier(.2,.72,.3,1) both;
}

@keyframes qgo-origin-link-a {
  from { stroke-dashoffset: 1000; opacity: .15; }
  to { stroke-dashoffset: 0; opacity: .9; }
}
@keyframes qgo-origin-link-b {
  from { stroke-dashoffset: 1000; opacity: .15; }
  to { stroke-dashoffset: 0; opacity: .9; }
}

@keyframes qgo-origin-ring-a {
  from { transform: scale(.45); opacity: 0; }
  58% { transform: scale(1.14); opacity: 1; }
  to { transform: scale(1); opacity: .92; }
}
@keyframes qgo-origin-ring-b {
  from { transform: scale(.45); opacity: 0; }
  58% { transform: scale(1.14); opacity: 1; }
  to { transform: scale(1); opacity: .92; }
}

@keyframes qgo-measurement-result-a {
  from { transform: scale(.68); opacity: 0; }
  56% { transform: scale(1.08); opacity: 1; }
  to { transform: scale(1); opacity: 1; }
}
@keyframes qgo-measurement-result-b {
  from { transform: scale(.68); opacity: 0; }
  56% { transform: scale(1.08); opacity: 1; }
  to { transform: scale(1); opacity: 1; }
}

/* Retained as explicit phase-specific names: changing an SVG id alone can leave
 * a browser's CSS animation running on the recycled DOM node. */
.qgo-confirmed-measurement {
  transform-box: fill-box;
  transform-origin: center;
}

/* The existing "einfache Grafik" setting supplies an in-app low-motion path;
 * this covers every platform's system-wide motion preference as well. */
@media (prefers-reduced-motion: reduce) {
  .qgo-confirmed-move .qgo-move-origin-link,
  .qgo-confirmed-move .qgo-move-origin-ring,
  .qgo-confirmed-measurement { animation: none; }
  .qgo-confirmed-move,
  .qgo-confirmed-measurement { display: none; }
}
