/* Cleaning Effects – Wischer-Moment */
/* Wipe overlay */
#cwm-wipe {
  position: fixed; inset: 0; pointer-events: none; z-index: 99999;
  background: linear-gradient( to right,
    rgba(255,255,255,0) 0%,
    rgba(255,255,255,.85) 20%,
    rgba(255,255,255,.95) 50%,
    rgba(255,255,255,.85) 80%,
    rgba(255,255,255,0) 100%);
  transform: translateX(-100%);
  filter: drop-shadow(0 0 24px rgba(0,0,0,.15));
}
#cwm-wipe.is-anim {
  transition: transform var(--cwm-wipe-duration, 900ms) ease-in-out;
  transform: translateX(100%);
}
@media (prefers-reduced-motion: reduce) {
  #cwm-wipe.is-anim { transition: none !important; transform: translateX(0) !important; }
}

/* Bubbles */
.cwm-bub-host { position: relative; }
.cwm-bubble {
  position: absolute; bottom: 0; left: 0;
  width: .5rem; height: .5rem; border-radius: 50%;
  pointer-events: none;
  opacity: 0; transform: translateY(0) scale(.8);
  box-shadow: 0 0 8px rgba(255,255,255,.75) inset, 0 0 4px rgba(0,0,0,.1);
  animation: cwmBubble 900ms ease-out forwards;
  will-change: transform, opacity;
}
@keyframes cwmBubble {
  0%   { opacity: 0; transform: translateY(0)    scale(.8); }
  15%  { opacity: 1; }
  100% { opacity: 0; transform: translateY(-24px) scale(1.1); }
}
