/* [MARQUEE] 2026-10-23: lobby announcement marquee — ONE scrolling string.
   All active admin lines (ym_manage.marquee, status=0; content source
   unchanged) are server-rendered as items of a single track.
   clarims-marquee.js clones the items once so the track holds two identical
   halves and this CSS animation (translateX -50%, linear, infinite) loops
   seamlessly — the same motion pattern as the winners strip and the
   cx-dynamicScrollLeft keyframes in clarims-ux.css.
   The second mechanism that used to coexist here (a vertical Swiper cycling
   per-line slides, each carrying its own horizontal ticker) is removed.
   Colours come only from --theme-* variables. */
.cx-marquee{overflow:hidden;width:100%;height:.35rem;display:flex;align-items:center;}
.cx-marquee-track{display:flex;width:max-content;white-space:nowrap;animation-name:cx-marquee-scroll;animation-timing-function:linear;animation-iteration-count:infinite;animation-duration:30s;}
.cx-marquee-track.cx-paused{animation-play-state:paused;}
.cx-marquee:hover .cx-marquee-track{animation-play-state:paused;}
.cx-marquee-item{color:var(--theme-primary-color);padding-right:.9rem;white-space:nowrap;}
@keyframes cx-marquee-scroll{from{transform:translateX(0);}to{transform:translateX(-50%);}}
/* Envelope (message) link beside the marquee + real unread badge.
   The badge element is server-rendered only for a logged-in user whose
   UserMessageModel::unreadCount() is above zero, so guests and a zero
   count show no badge at all. */
.cx-msg-link{position:relative;display:flex;align-items:center;flex:none;text-decoration:none;cursor:pointer;}
.cx-msg-badge{position:absolute;top:-.06rem;right:-.08rem;min-width:.32rem;height:.32rem;line-height:.32rem;padding:0 .07rem;border-radius:.16rem;background:var(--theme-secondary-color-error);color:var(--theme-primary-font-color);font-size:.2rem;text-align:center;box-sizing:border-box;z-index:2;}
