   BUBBLES: decorative floating ambience (Admin > Site)
   Server-rendered spans, no JS. Sits behind content (z:-1),
   above the paper background. Density set by intensity %.
   ═══════════════════════════════════════════════════════ */
.bubbles {
  position: fixed;
  inset: 0;
  z-index: -1;
  overflow: hidden;
  pointer-events: none;
}
.bubble {
  position: absolute;
  bottom: -80px;
  left: var(--x, 50%);
  width: var(--s, 32px);
  height: var(--s, 32px);
  border-radius: 50%;
  opacity: 0;
  background: radial-gradient(circle at 32% 28%,
              color-mix(in srgb, var(--on-accent) 55%, transparent),
              hsl(var(--h, 200) 90% 62% / 0.55) 68%,
              transparent 72%);
  border: 1px solid hsl(var(--h, 200) 85% 55% / 0.45);
  animation: tt-bubble-rise var(--t, 18s) linear var(--d, 0s) infinite;
  will-change: transform, opacity;
}
@keyframes tt-bubble-rise {
  0%   { transform: translateY(0) translateX(0) scale(0.85); opacity: 0; }
  12%  { opacity: 0.55; }
  50%  { transform: translateY(-55vh) translateX(18px) scale(1); }
  88%  { opacity: 0.35; }
  100% { transform: translateY(-112vh) translateX(-12px) scale(1.08); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .bubbles { display: none; }
}
