/* 轻量全局动效：不影响消息列表轮询性能 */
.app-shell{background-size:180% 180%;animation:soft-shift 18s ease-in-out infinite}
.avatar{position:relative;overflow:hidden;border-radius:50%;transition:transform .25s ease;flex:none}.friend .avatar,.admin-user-row .avatar{border-radius:50%}.avatar img{position:relative;z-index:1;display:block;width:100%;height:100%;object-fit:cover}.avatar-letter{position:absolute;inset:0;display:grid;place-items:center;color:#8173b0;font-weight:800;background:var(--lav);z-index:0}.avatar:hover{transform:rotate(-7deg) scale(1.04)}
.friend:hover,.friend.active{transform:translateX(2px)}
.send-button{transition:transform .2s ease,background .2s ease}.send-button:hover{transform:translateY(-1px)}
@keyframes soft-shift{0%,100%{background-position:0 50%}50%{background-position:100% 50%}}
/* 公告强制阅读层 */
body.announcement-open{overflow:hidden}
body.announcement-open #app{filter:blur(9px);transform:scale(1.015);transition:filter .35s ease,transform .35s ease;pointer-events:none;user-select:none}
.announcement-backdrop{position:fixed;inset:0;z-index:20;display:grid;place-items:center;padding:20px;background:rgba(255,245,250,.35);backdrop-filter:blur(3px);animation:notice-in .35s ease}
.announcement-modal{width:min(440px,100%);padding:34px 30px 28px;text-align:center;border:1px solid rgba(255,255,255,.95);border-radius:30px;background:rgba(255,255,255,.93);box-shadow:0 28px 90px rgba(133,91,115,.25),0 0 0 8px rgba(255,218,232,.34);animation:notice-pop .55s cubic-bezier(.2,.8,.2,1)}
.announcement-modal.closing{animation:notice-out .26s ease forwards}.notice-spark{width:58px;height:58px;margin:0 auto 15px;display:grid;place-items:center;border-radius:21px;background:linear-gradient(145deg,#ffe1ed,#f7ecff);color:var(--pink-deep);font-size:29px;animation:bob 2s ease-in-out infinite}.announcement-modal h3{margin:0 0 15px;font-size:21px}.notice-copy{max-height:190px;overflow:auto;padding:15px 16px;border:1px solid #ffe3ed;border-radius:17px;background:#fff9fb;color:#6e5f6c;font-size:14px;line-height:1.85;text-align:left;white-space:pre-wrap}.notice-count{margin:17px 0 12px;color:#a397a1;font-size:12px}.notice-count b{color:var(--pink-deep);font-size:18px}.notice-confirm{width:100%;padding:13px 18px;border-radius:13px;background:var(--pink);color:#fff;font-size:14px;font-weight:700;transition:transform .2s,background .2s}.notice-confirm:not(:disabled):hover{background:var(--pink-deep);transform:translateY(-2px);box-shadow:0 8px 22px rgba(233,125,165,.28)}.notice-confirm:disabled{background:#e5dfe3;color:#fff}
@keyframes notice-in{from{opacity:0}to{opacity:1}}@keyframes notice-pop{from{opacity:0;transform:translateY(20px) scale(.94)}to{opacity:1;transform:none}}@keyframes notice-out{to{opacity:0;transform:translateY(12px) scale(.97)}}
.header-mark{width:36px;height:36px;border-radius:13px;font-size:18px;margin:0}.status-dot{animation:pulse-dot 1.8s ease-in-out infinite}.admin-console{padding:15px 20px;border-top:1px solid var(--line);background:#fffafd}.admin-console summary{cursor:pointer;color:#756877;font-size:13px}.admin-section{margin-top:15px;padding-top:13px;border-top:1px solid var(--line)}.admin-section h3{margin:0 0 10px;font-size:13px}.admin-section textarea{width:100%;min-height:76px;resize:vertical;border:1px solid var(--line);border-radius:11px;padding:10px;background:white;outline:0}.admin-section textarea:focus{border-color:#f4b2ca;box-shadow:0 0 0 4px #fff0f5}.switch-line{display:flex;align-items:center;gap:7px;margin:9px 0;color:#756877;font-size:12px}.admin-actions{display:flex;gap:7px}.admin-save,.admin-close,.danger-button{padding:8px 11px;border-radius:9px;font-size:12px}.admin-save{background:var(--pink);color:white}.admin-close{background:#f3edf1;color:#806f7c}.admin-users{display:grid;gap:7px;max-height:160px;overflow:auto}.admin-user-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px;border:1px solid #f3eaf0;border-radius:11px;background:#fff}.admin-user-row>div{display:flex;align-items:center;gap:7px;min-width:0}.admin-user-row .avatar{width:28px;height:28px;border-radius:9px;font-size:12px}.admin-user-row b,.admin-user-row small{display:block}.admin-user-row b{font-size:12px}.admin-user-row small{margin-top:2px;color:var(--muted);font-size:10px}.admin-user-row em{font-style:normal;color:#9c8bb5;font-size:11px}.danger-button{background:#fff0f3;color:#c56584}.admin-empty{color:var(--muted);font-size:12px}
@keyframes pulse-dot{50%{box-shadow:0 0 0 5px rgba(121,213,173,.12)}}
.setup-page{min-height:100vh;display:grid;place-items:center;padding:20px}.setup-card{width:min(440px,100%);padding:36px 30px;text-align:center;border:1px solid var(--line);border-radius:28px;background:#fff;box-shadow:var(--shadow);animation:notice-pop .55s cubic-bezier(.2,.8,.2,1)}.setup-card h1{margin:9px 0 17px;font-size:27px}.setup-copy,.setup-tip{color:var(--muted);font-size:13px;line-height:1.75}.setup-form{display:grid;gap:13px;text-align:left;margin-top:22px}.setup-form label{display:grid;gap:7px;color:#716672;font-size:13px}.setup-form input{padding:12px;border:1px solid var(--line);border-radius:12px;outline:0}.setup-form input:focus{border-color:#f4b2ca;box-shadow:0 0 0 4px #fff0f5}.setup-ok,.setup-error{margin-top:16px;padding:11px 13px;border-radius:12px;font-size:13px;line-height:1.6}.setup-ok{background:#effaf5;color:#558a73}.setup-error{background:#fff0f3;color:#ba5f7c}.setup-link{display:inline-block;margin-top:16px;color:var(--pink-deep);text-decoration:none;font-size:13px}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
@media(max-width:820px){.main-panel{overflow-y:auto}.messages{min-height:180px}.composer{position:sticky;bottom:0;z-index:4;padding-bottom:calc(13px + env(safe-area-inset-bottom));box-shadow:0 -8px 22px rgba(118,91,113,.06)}.admin-console{max-height:48vh;overflow:auto}.announcement-modal{padding:28px 20px 22px}.notice-copy{max-height:35vh}.setup-card{padding:30px 22px}}
