:root{
  /* 에듀톡 고유 브랜드: 밝은 스카이 블루 */
  --brand:#3F9BFF;--brand-strong:#2472CE;--brand-soft:#EAF4FF;--brand-line:#B7DBFF;
  --accent:#38BDF8;--accent-soft:#EAF4FF;
  --blue:var(--brand);--blue-soft:var(--brand-soft);
  --text:#151A24;--sub:#5B6472;--muted:#8B93A1;
  --bg:#F6F7FB;--surface:#fff;--line:#E6E8F0;--danger:#E5484D;--danger-soft:#FFF0F1;
  --green:#10B981;--composer:84px;--sidebar:286px;--mpanel:320px;
  --hover:#F1F2F8;--chip:#F1F2F7
}
*{box-sizing:border-box;font-family:Pretendard,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;-webkit-font-smoothing:antialiased}
html,body,#app{margin:0;width:100%;height:100%;overflow:hidden;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{background:var(--bg);color:var(--text)}button,input,textarea,select{font:inherit}button{border:0;background:none;color:inherit;cursor:pointer}input,textarea{color:var(--text)}
body.font-sm{font-size:14px}body.font-lg{font-size:17px}body.font-xl{font-size:19px}
.boot{height:100%;display:grid;place-items:center;align-content:center;text-align:center;gap:16px;color:var(--sub);padding:24px}.boot>div{display:flex;flex-direction:column;gap:5px;min-width:0}.boot strong{font-size:20px;color:var(--text);white-space:nowrap}.boot span{font-size:13px;white-space:nowrap}.boot-bar{width:150px;height:4px;border-radius:99px;background:var(--line);overflow:hidden;margin:0 auto}.boot-bar i{display:block;width:40%;height:100%;border-radius:99px;background:var(--blue);animation:bootSlide 1.05s ease-in-out infinite}@keyframes bootSlide{0%{transform:translateX(-110%)}100%{transform:translateX(260%)}}.boot-mark{width:46px;height:46px;border-radius:15px;background:linear-gradient(145deg,var(--brand) 0%,var(--brand-strong) 100%);color:#fff;display:flex;align-items:center;justify-content:center;line-height:1;padding-top:2px;font-weight:800;font-size:20px;box-shadow:0 10px 22px rgba(63,155,255,.32)}
.app{width:100%;height:100%;display:flex;overflow:hidden;background:var(--bg)}
.sidebar{width:var(--sidebar);flex:0 0 var(--sidebar);height:100%;background:#fff;border-right:1px solid var(--line);display:flex;flex-direction:column;z-index:50}.side-top{height:76px;display:flex;align-items:center;justify-content:space-between;padding:0 16px 0 18px;border-bottom:1px solid var(--line)}.brand{display:flex;align-items:center;gap:10px;font-size:20px;font-weight:750;letter-spacing:-.5px}.brand-mark{width:38px;height:38px;border-radius:12px;background:linear-gradient(145deg,var(--brand) 0%,var(--brand-strong) 100%);color:#fff;display:flex;align-items:center;justify-content:center;line-height:1;padding-top:2px;font-weight:800}.icon-btn{width:38px;height:38px;border-radius:50%;background:transparent;display:grid;place-items:center;color:var(--sub);transition:background .18s,color .18s,transform .18s}.icon-btn:hover{background:var(--hover);color:var(--text)}.icon-btn:active{transform:scale(.94)}
.profile-card{margin:0;padding:13px 16px 14px;border:0;border-bottom:1px solid var(--line);border-radius:0;text-align:left;background:transparent;transition:background .18s}.profile-card:hover{background:var(--hover)}.profile-row{display:flex;align-items:center;gap:11px}.avatar{width:38px;height:38px;border-radius:50%;background:var(--chip);color:var(--sub);display:grid;place-items:center;font-weight:650;overflow:hidden;flex:0 0 auto}.avatar img{width:100%;height:100%;object-fit:cover}.avatar.large{width:44px;height:44px}.avatar-dot{position:relative}.avatar-dot:after{content:"";position:absolute;right:0;bottom:0;width:10px;height:10px;border-radius:50%;background:var(--green);border:2px solid var(--surface)}.grow{flex:1;min-width:0}.profile-name{font-size:15px;font-weight:680;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.profile-meta{font-size:12px;color:var(--sub);margin-top:4px}
.side-body{flex:1;min-height:0;overflow:auto;padding:12px}.side-section{margin-bottom:18px}.side-title{display:flex;justify-content:space-between;align-items:center;color:var(--muted);font-size:11.5px;font-weight:700;letter-spacing:.02em;padding:0 8px 8px}.text-btn{font-size:13px;color:var(--brand);font-weight:650}.room{position:relative;width:100%;display:flex;gap:10px;align-items:center;padding:9px 10px;border-radius:12px;text-align:left;transition:background .18s}.room:hover{background:var(--hover)}.room.active{background:var(--brand-soft)}.room.has-unread:before{content:"";position:absolute;left:1px;top:50%;transform:translateY(-50%);width:3px;height:17px;border-radius:3px;background:var(--brand)}.room-icon{width:34px;height:34px;border-radius:50%;background:var(--chip);display:grid;place-items:center;color:var(--sub);flex:0 0 auto;font-size:15px}.room.active .room-icon{background:var(--surface);color:var(--brand)}.room-main{min-width:0}.room-name{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.room-sub{font-size:11px;color:var(--muted);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.room-right{display:flex;align-items:center;gap:7px;margin-left:auto}.unread{min-width:0;height:20px;padding:0 7px;border-radius:7px;background:var(--brand-soft);border:1px solid var(--brand-line);color:var(--brand-strong);display:grid;place-items:center;font-size:10.5px;font-weight:750}.side-bottom{border-top:1px solid var(--line);padding:12px}.row{display:flex;gap:8px}.soft-btn{flex:1;height:42px;background:var(--chip);border-radius:12px;font-size:14px;font-weight:620;transition:background .18s,transform .18s}.soft-btn:hover{background:var(--hover)}.soft-btn:active{transform:scale(.98)}
.main{flex:1;min-width:0;height:100%;overflow:hidden;position:relative;display:flex;flex-direction:column}.chat{width:100%;flex:1;min-height:0;display:flex;flex-direction:column;position:relative}.chat-head{height:74px;flex:0 0 74px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 24px;position:relative;z-index:30}.chat-title{font-size:19px;font-weight:720;letter-spacing:-.35px}.chat-desc{font-size:13px;color:var(--sub);margin-top:3px}.head-actions{display:flex;gap:8px;align-items:center}.head-chip{padding:8px 11px;background:#f6f7f8;border-radius:12px;font-size:12px;color:var(--sub)}
.messages-wrap{flex:1;min-height:0;position:relative;background:#FAFAFD}.messages{position:absolute;inset:0;overflow:auto;padding:24px 30px calc(var(--composer) + 26px);overscroll-behavior:contain;scroll-behavior:auto}.message-block{max-width:900px;margin:0 auto 16px}.day-sep{display:flex;align-items:center;gap:12px;color:var(--muted);font-size:12px;margin:2px 0 18px}.day-sep:before,.day-sep:after{content:"";height:1px;background:var(--line);flex:1}.message-row{display:flex;gap:10px;align-items:flex-end;margin:0 0 12px}.message-row.mine{justify-content:flex-end}.message-row.hidden-message{display:none}.message-content{max-width:min(74%,760px)}.message-author{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--sub);margin:0 0 5px}.message-row.mine .message-author{justify-content:flex-end}.bubble{padding:11px 14px;border-radius:16px;background:var(--chip);border:0;font-size:15px;line-height:1.52;white-space:pre-wrap;word-break:break-word}.mine .bubble{background:linear-gradient(140deg,var(--brand) 0%,var(--brand-strong) 100%);border:0;color:#fff;border-bottom-right-radius:6px}.message-row:not(.mine) .bubble{border-bottom-left-radius:6px}.message-tools{display:flex;gap:8px;justify-content:flex-start;margin-top:4px;opacity:0;transition:opacity .16s}.message-row:hover .message-tools,.message-tools:focus-within{opacity:1}.mine .message-tools{justify-content:flex-end}.message-tools button{font-size:11px;color:var(--sub)}.message-tools button:hover{color:var(--text)}
.composer{position:absolute;left:0;right:0;bottom:0;z-index:60;padding:12px 20px calc(12px + env(safe-area-inset-bottom));background:linear-gradient(to top,rgba(251,252,253,.99) 72%,rgba(251,252,253,0));pointer-events:none}.composer-inner{width:min(980px,100%);margin:0 auto;min-height:56px;background:#fff;border:1px solid var(--line);border-radius:18px;box-shadow:0 8px 26px rgba(25,31,40,.09);display:flex;align-items:flex-end;gap:8px;padding:6px 6px 6px 12px;pointer-events:auto}.composer-inner.centered{align-items:center;justify-content:center;padding:0 16px;color:var(--sub);font-size:13px;line-height:1.5;text-align:center}.composer .icon-btn{width:44px;height:44px;flex:0 0 44px;border-radius:50%;font-size:17px;background:var(--chip)}.composer .icon-btn:hover{background:var(--hover)}.composer textarea{flex:1;min-width:0;min-height:44px;max-height:120px;resize:none;outline:none;border:0;padding:11px 2px;font-size:15px;line-height:1.45;background:transparent}.send{width:44px;height:44px;border-radius:50%;background:linear-gradient(140deg,var(--brand) 0%,var(--brand-strong) 100%);color:#fff;display:grid;place-items:center;flex:0 0 auto;transition:transform .16s,filter .16s}.send:hover{filter:brightness(1.06)}.send:active{transform:scale(.95)}.composer-note{text-align:center;position:absolute;left:0;right:0;top:-22px;color:var(--muted);font-size:12px;pointer-events:none}
.new-banner{position:absolute;z-index:80;top:12px;left:50%;width:min(640px,calc(100% - 36px));padding:12px 16px;border-radius:16px;background:#191f28;color:#fff;box-shadow:0 15px 36px rgba(25,31,40,.2);transform:translate(-50%,-130%);opacity:0;pointer-events:none;transition:transform .46s cubic-bezier(.2,.8,.2,1),opacity .24s ease}.new-banner.show{transform:translate(-50%,0);opacity:1;pointer-events:auto}.new-banner .title{font-size:13px;font-weight:650}.new-banner .text{font-size:12px;margin-top:4px;opacity:.82;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.new-banner .progress{height:2px;background:rgba(255,255,255,.18);margin-top:10px;border-radius:2px;overflow:hidden}.new-banner .progress i{display:block;height:100%;width:100%;background:#fff;transform-origin:left;transition:transform 5s linear}.new-banner.show .progress i{transform:scaleX(0)}
.new-banner .banner-row{display:flex;align-items:flex-start;gap:10px}.new-banner .banner-main{flex:1;min-width:0}.banner-x{flex:0 0 auto;width:26px;height:26px;border-radius:50%;background:rgba(255,255,255,.16);color:#fff;display:grid;place-items:center;font-size:11px;line-height:1;transition:background .18s ease,transform .18s ease}.banner-x:hover{background:rgba(255,255,255,.3)}.banner-x:active{transform:scale(.86)}.new-banner.closing{transform:translate(-50%,0) scale(.94);opacity:0;transition:transform .26s ease,opacity .22s ease}
.empty-chat{height:100%;display:grid;place-items:center;text-align:center;color:var(--sub);padding:40px}.empty-chat h2{margin:0 0 8px;color:var(--text);font-size:23px}.empty-chat p{margin:0;font-size:14px}
.auth{height:100%;overflow:auto;display:flex;padding:22px;background:radial-gradient(58% 60% at 6% 0%,rgba(63,155,255,.22) 0%,transparent 62%),radial-gradient(52% 58% at 99% 100%,rgba(56,189,248,.20) 0%,transparent 62%),radial-gradient(42% 48% at 86% 4%,rgba(124,92,255,.13) 0%,transparent 64%),linear-gradient(158deg,#F8FBFF 0%,#EEF4FD 46%,#F6FAFF 100%)}.auth-shell{margin:auto;width:min(1020px,100%);height:min(700px,calc(100dvh - 44px));display:grid;grid-template-columns:minmax(0,1.02fr) minmax(0,1fr);background:var(--surface);border:1px solid var(--line);border-radius:28px;overflow:hidden;box-shadow:0 30px 80px rgba(25,31,40,.14)}.auth-hero{position:relative;overflow:hidden;padding:34px 32px;color:#fff;background:linear-gradient(152deg,#5FB0F7 0%,#2E8FE6 46%,#0F4A80 100%);display:flex;flex-direction:column;gap:20px}.auth-hero-top{display:flex;align-items:center;gap:10px;font-size:19px;font-weight:750;position:relative;z-index:1}.auth-hero-top .brand-mark{width:36px;height:36px;border-radius:12px;background:rgba(255,255,255,.22);box-shadow:none}.auth-hero-body{position:relative;z-index:1;margin-top:auto}.auth-hero-body h2{margin:0 0 12px;font-size:29px;line-height:1.36;letter-spacing:-.8px}.auth-hero-body p{margin:0;font-size:14.5px;line-height:1.65;color:rgba(255,255,255,.88)}.auth-hero-body b{color:#fff}.auth-points{list-style:none;margin:20px 0 0;padding:0;display:grid;gap:9px;position:relative;z-index:1}.auth-points li{display:flex;gap:9px;align-items:center;font-size:13.5px;color:rgba(255,255,255,.95);background:rgba(255,255,255,.14);padding:10px 13px;border-radius:13px}.auth-hero-foot{position:relative;z-index:1;margin-top:auto;padding-top:18px;font-size:12px;color:rgba(255,255,255,.72)}.auth-blob{position:absolute;border-radius:50%;filter:blur(30px);opacity:.5;pointer-events:none}.auth-blob.b1{width:230px;height:230px;right:-70px;top:-50px;background:#A5D9FF}.auth-blob.b2{width:180px;height:180px;left:-50px;bottom:70px;background:#4FA6F0}.auth-blob.b3{width:130px;height:130px;right:34px;bottom:-36px;background:#7FE3DC}.roll{display:inline-flex;align-items:flex-start;justify-content:center;overflow:hidden;vertical-align:bottom;background:rgba(255,255,255,.17);border-radius:999px;padding:0 16px;height:1.42em}.roll-track{display:block;transition:transform .62s cubic-bezier(.22,.8,.2,1)}.roll-track i{display:block;height:1.42em;line-height:1.42em;font-style:normal;white-space:nowrap}.auth-card{padding:30px 32px;display:flex;flex-direction:column;overflow:auto;overscroll-behavior:contain}.auth-card-inner{margin:auto 0;width:100%}.auth-title{font-size:27px;line-height:1.25;letter-spacing:-.7px;margin:0}.auth-desc{margin:9px 0 24px;color:var(--sub);font-size:13.5px}.form-error{margin:0 0 14px;padding:11px 13px;border-radius:12px;background:var(--danger-soft);color:var(--danger);font-size:13px;line-height:1.55;word-break:break-word}.form-error.hidden{display:none}.field{margin-bottom:14px}.field label{display:block;font-size:13px;color:var(--sub);margin-bottom:7px}.input{width:100%;height:50px;border:1px solid var(--line);border-radius:14px;background:#fff;padding:0 14px;outline:none;font-size:15px;transition:border .16s,box-shadow .16s}.input:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(63,155,255,.20)}textarea.input{height:auto;min-height:110px;padding:13px;resize:vertical}.primary,.secondary{width:100%;height:50px;border-radius:13px;font-weight:660}.primary{background:linear-gradient(140deg,var(--brand) 0%,var(--brand-strong) 100%);color:#fff;margin-top:7px}.secondary{background:var(--chip);margin-top:10px;color:var(--text)}.auth-foot{display:flex;justify-content:space-between;margin-top:16px}.auth-foot .text-btn{color:var(--sub);font-weight:560}
.overlay{position:fixed;inset:0;background:rgba(12,16,22,.36);backdrop-filter:blur(0px);-webkit-backdrop-filter:blur(0px);z-index:300;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .22s ease,backdrop-filter .26s ease,-webkit-backdrop-filter .26s ease}.overlay.show{opacity:1;pointer-events:auto;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.overlay.closing{opacity:0;pointer-events:none;backdrop-filter:blur(0px);-webkit-backdrop-filter:blur(0px)}.modal{position:relative;width:min(620px,calc(100vw - 28px));max-height:min(820px,calc(100dvh - 30px));overflow:auto;background:#fff;border-radius:22px;padding:24px;box-shadow:0 30px 90px rgba(0,0,0,.2);transition:transform .24s cubic-bezier(.2,.8,.2,1),opacity .2s ease}.overlay.show .modal{animation:modalIn .3s cubic-bezier(.2,.8,.2,1)}.overlay.closing .modal{opacity:0;transform:translateY(10px) scale(.985)}@keyframes modalIn{from{opacity:0;transform:translateY(16px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}.modal.small{width:min(450px,calc(100vw - 28px))}.modal h2{margin:0 0 8px;font-size:22px;letter-spacing:-.5px;padding-right:34px}.modal-close{position:absolute;top:14px;right:14px;width:34px;height:34px;border-radius:50%;background:transparent;color:var(--sub);display:grid;place-items:center;font-size:13px;line-height:1;z-index:2;transition:background .18s,transform .18s}.modal-close:hover{background:var(--hover);color:var(--text)}.modal-close:active{transform:scale(.94)}.desc{color:var(--sub);font-size:14px;line-height:1.6;margin:0 0 20px}.modal-actions{display:flex;gap:10px;margin-top:22px}.modal-actions>*{flex:1;height:46px;border-radius:13px}.cancel{background:var(--chip)}.confirm{background:var(--brand);color:#fff}.danger-btn{background:var(--danger-soft);color:var(--danger);font-weight:650}
.custom-select{position:relative}.select-button{width:100%;height:50px;border:1px solid var(--line);border-radius:14px;background:#fff;padding:0 14px;display:flex;align-items:center;justify-content:space-between;outline:none}.select-menu{position:fixed;z-index:1000;min-width:180px;max-width:calc(100vw - 24px);background:#fff;border:1px solid var(--line);border-radius:16px;padding:6px;box-shadow:0 20px 45px rgba(25,31,40,.16);opacity:0;transform-origin:top left;transform:translateY(-6px) scale(.985);pointer-events:none;transition:opacity .18s ease,transform .22s cubic-bezier(.2,.8,.2,1);max-height:min(300px,44dvh);overflow:auto}.select-menu.open{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}.select-menu.drop-up{transform-origin:bottom left;transform:translateY(6px) scale(.985)}.select-menu.drop-up.open{transform:translateY(0) scale(1)}.select-option{width:100%;text-align:left;padding:11px 12px;border-radius:11px;font-size:14px}.select-option:hover,.select-option.active{background:var(--blue-soft);color:var(--blue)}
.tabs{display:flex;gap:6px;background:var(--chip);padding:4px;border-radius:12px;margin-bottom:18px}.modal>.tabs{margin-right:40px}.tab{height:38px;flex:1;border-radius:9px;color:var(--sub);font-size:13px;font-weight:620}.tab.active{background:var(--surface);color:var(--text);box-shadow:0 2px 8px rgba(25,31,40,.06)}.settings-list{display:grid;gap:10px}.setting-row{display:flex;align-items:center;justify-content:space-between;padding:14px 0;border-bottom:1px solid var(--line)}.setting-row:last-child{border-bottom:0}.setting-label strong{display:block;font-size:15px}.setting-label span{display:block;font-size:12px;color:var(--sub);margin-top:4px}.choice-row{display:flex;gap:6px}.choice{padding:8px 10px;border-radius:9px;background:var(--chip);font-size:12px}.choice.active{background:var(--brand-soft);color:var(--brand);font-weight:650}.check-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.check-chip{height:40px;border:1px solid var(--line);border-radius:12px;background:var(--surface);color:var(--sub);font-size:13px}.check-chip.on{border-color:var(--brand-line);background:var(--brand-soft);color:var(--brand);font-weight:650}.list{display:flex;flex-direction:column;gap:8px}.list-item{display:flex;align-items:center;gap:10px;padding:11px 12px;border:1px solid var(--line);border-radius:14px;background:var(--surface);text-align:left}.list-item .meta{font-size:12px;color:var(--sub);margin-top:3px}.empty-side{padding:24px 12px;color:var(--muted);font-size:13px;text-align:center}
.drawer{position:fixed;inset:0;pointer-events:none;z-index:250}.drawer-back{position:absolute;inset:0;background:rgba(0,0,0,.26);opacity:0;transition:opacity .22s}.drawer-panel{position:absolute;left:0;top:0;bottom:0;width:min(320px,88vw);background:#fff;transform:translateX(-100%);transition:transform .28s cubic-bezier(.2,.8,.2,1);display:flex;flex-direction:column;box-shadow:10px 0 35px rgba(0,0,0,.08)}.drawer.open{pointer-events:auto}.drawer.open .drawer-back{opacity:1}.drawer.open .drawer-panel{transform:none}
.modal-scroll{max-height:54dvh;overflow:auto}.muted{color:var(--muted)}.mini{font-size:12px}.divider{height:1px;background:var(--line);margin:16px 0}.right{margin-left:auto}.hidden{display:none!important}.status-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--green);margin-right:5px}
@media(max-width:820px){:root{--composer:80px}.sidebar{display:none}.chat-head{padding:0 16px;height:66px;flex-basis:66px}.messages{padding:20px 14px calc(var(--composer) + 20px)}.message-content{max-width:84%}.composer{padding:10px 10px calc(10px + env(safe-area-inset-bottom));z-index:240}.new-banner{width:calc(100% - 24px);top:8px}.modal{padding:20px}.check-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:520px){.auth-card{padding:24px;border-radius:20px}.auth-title{font-size:26px}.message .bubble{font-size:15px}.message-tools{opacity:1}.side-top{height:68px}.select-menu{max-height:42dvh}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}}
.mobile-only{display:none}
.global-banner{position:absolute;z-index:120;top:14px;left:50%;transform:translate(-50%,-130%);}
.global-banner.show{transform:translate(-50%,0)}
@media(max-width:820px){.mobile-only{display:grid}.global-banner{width:calc(100% - 24px);top:8px}}

.font-sm .chat-title,.font-sm .bubble,.font-sm .composer textarea{font-size:13px}.font-lg .chat-title,.font-lg .bubble,.font-lg .composer textarea{font-size:17px}.font-xl .chat-title,.font-xl .bubble,.font-xl .composer textarea{font-size:19px}.font-lg .room-name,.font-xl .room-name{font-size:16px}.font-xl .room-name{font-size:17px}

/* 사이트 공지 배너 */
.site-banner{flex:0 0 auto;padding:11px 20px;background:var(--blue-soft);color:var(--blue);font-size:14px;line-height:1.55;border-bottom:1px solid var(--line);z-index:40;position:relative}
.site-banner.hidden{display:none}
.site-banner-inner{width:min(980px,100%);margin:0 auto;word-break:break-word}
.site-banner a,.site-banner .site-banner-link{color:inherit;text-decoration:underline;font-weight:650;background:none;cursor:pointer}
.site-banner .site-banner-link{margin-left:8px}

/* 관리자 페이지 */
.admin-page{width:100%;height:100%;display:flex;flex-direction:column;background:var(--bg)}
.admin-head{height:64px;flex:0 0 64px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px;padding:0 16px;position:relative;z-index:20}
.admin-head .icon-btn{flex:0 0 38px}
.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* 관리자: 안내 페이지 편집 */
.page-edit{border:1px solid var(--line);border-radius:16px;padding:16px;margin:0 0 14px;background:var(--bg)}
.page-edit-head{display:flex;align-items:center;gap:10px;margin:0 0 12px}
.page-edit-head strong{font-size:15px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.page-btn-list{display:grid;gap:8px;margin-top:12px}
.page-btn-row{display:flex;gap:8px}
.page-btn-row .input{flex:1;min-width:0;height:44px}
/* 회원 탈퇴 안내 */
.danger-box{border:1px solid var(--danger-soft);background:var(--danger-soft);border-radius:14px;padding:14px 16px}
.danger-box p{margin:0 0 7px;font-size:13px;line-height:1.6;color:var(--text)}
.danger-box p:last-child{margin-bottom:0}
.danger-box b{color:var(--danger)}
/* 신고 관리: 신고 시점 대화 스냅샷 */
.report-detail{background:var(--chip);border-radius:12px;padding:12px 14px;font-size:13.5px;line-height:1.65;color:var(--text);white-space:pre-wrap;word-break:break-word}
.snap-list{max-height:min(42dvh,380px);overflow:auto;border:1px solid var(--line);border-radius:14px;padding:8px;background:var(--bg);overscroll-behavior:contain}
.snap-row{padding:8px 10px;border-radius:11px;margin-bottom:6px;background:var(--surface);border:1px solid var(--line)}
.snap-row:last-child{margin-bottom:0}
.snap-row.hit{border-color:var(--danger);background:var(--danger-soft)}
.snap-head{font-size:11.5px;color:var(--sub);margin-bottom:3px}
.snap-text{font-size:13.5px;line-height:1.55;color:var(--text);white-space:pre-wrap;word-break:break-word}
.admin-title{font-size:18px;font-weight:730;letter-spacing:-.3px}
.admin-sub{font-size:12px;color:var(--sub);margin-top:2px}
.admin-body{flex:1;min-height:0;overflow:auto;padding:18px}
.admin-wrap{width:min(1000px,100%);margin:0 auto}
.admin-tabs{display:flex;gap:6px;background:#f1f3f5;padding:4px;border-radius:13px;margin-bottom:18px;overflow-x:auto;scrollbar-width:none}
.admin-tabs::-webkit-scrollbar{display:none}
.admin-tabs .tab{flex:0 0 auto;padding:0 15px;white-space:nowrap}
.admin-card{background:#fff;border:1px solid var(--line);border-radius:18px;padding:18px;margin-bottom:16px}
.admin-card>h3{margin:0 0 4px;font-size:16px}
.admin-toolbar{display:flex;gap:8px;align-items:center;margin-bottom:12px;flex-wrap:wrap}
.admin-toolbar .input{flex:1;min-width:160px;height:44px}
.admin-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}
.admin-meta{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.admin-chip{padding:3px 8px;border-radius:8px;background:#f2f4f6;color:var(--sub);font-size:11px}
.admin-chip.warn{background:var(--danger-soft);color:var(--danger)}
.list-item.tappable{transition:background .16s,border-color .16s,transform .16s}
.list-item.tappable:hover{background:#fbfcfe;border-color:#dbe1e8}
.list-item.tappable:active{transform:scale(.995)}

/* 서식 편집기 */
.rich-toolbar{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.re-btn{width:34px;height:32px;border-radius:9px;background:#f2f4f6;display:grid;place-items:center;font-size:13px;color:var(--text)}
.re-btn:hover{background:#e9ecf0}
.re-color{width:34px;height:32px;border-radius:9px;background:#f2f4f6;display:grid;place-items:center;overflow:hidden}
.re-color input{width:46px;height:46px;border:0;background:none;padding:0;cursor:pointer}
.rich-editor{min-height:84px;border:1px solid var(--line);border-radius:14px;padding:12px 14px;font-size:15px;line-height:1.6;outline:none;background:#fff;word-break:break-word}
.rich-editor:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(63,155,255,.20)}
.rich-editor:empty:before{content:attr(data-placeholder);color:var(--muted)}
.preview-banner{margin-top:10px;border:1px dashed var(--line);border-radius:14px;padding:12px 14px;min-height:46px;background:var(--blue-soft);word-break:break-word}
.preview-label{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--sub);margin:14px 0 6px}
.live-badge{padding:3px 9px;border-radius:9px;background:#f2f4f6;color:var(--sub);font-size:11px;font-weight:650}
.live-badge.on{background:var(--blue-soft);color:var(--blue)}
.seg{display:flex;gap:4px;background:#f1f3f5;padding:4px;border-radius:11px}
.seg-btn{flex:1;height:32px;border-radius:8px;font-size:12px;color:var(--sub)}
.seg-btn.active{background:#fff;color:var(--text);font-weight:650;box-shadow:0 1px 4px rgba(25,31,40,.08)}

/* 프로필 꾸미기 */
.avatar-opt{width:40px;height:40px;border-radius:50%;background:var(--chip);display:grid;place-items:center;font-size:19px;border:2px solid transparent;transition:border-color .16s,background .16s}
.avatar-opt.on{border-color:var(--blue);background:var(--blue-soft)}
.color-opt{width:30px;height:30px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px var(--line);transition:box-shadow .16s,transform .16s}
.color-opt.on{box-shadow:0 0 0 2px var(--blue)}
.color-opt:active{transform:scale(.94)}
.bio-text{color:var(--sub);font-size:14px;line-height:1.65;white-space:pre-wrap;word-break:break-word;margin:0}
.user-head{display:flex;gap:14px;align-items:center;margin-bottom:14px}
.user-head .avatar{width:56px;height:56px;font-size:22px}
.consent{display:flex;gap:9px;align-items:flex-start;padding:12px 13px;border:1px solid var(--line);border-radius:14px;background:#fbfcfe;font-size:12.5px;color:var(--sub);line-height:1.55;margin-bottom:14px}
.consent input{margin:2px 0 0;flex:0 0 auto;width:16px;height:16px}
.consent b{color:var(--text)}

/* 신고 대상 이동 강조 */
@keyframes flashMsg{0%,60%{background:rgba(63,155,255,.20)}100%{background:transparent}}
.message-row.flash{border-radius:14px;animation:flashMsg 1.8s ease}
.message-author .author-btn{font:inherit;color:var(--sub);font-weight:650}
.message-author .author-btn:hover{color:var(--blue)}

@media(max-width:820px){
  .admin-body{padding:14px}
  .admin-head{height:58px;flex-basis:58px}
  .admin-card{padding:15px;border-radius:16px}
  .site-banner{padding:10px 14px;font-size:13px}
}

/* 토스트 */
.toast{position:fixed;left:50%;bottom:28px;transform:translate(-50%,26px);z-index:900;max-width:min(560px,calc(100vw - 32px));padding:13px 18px;border-radius:14px;background:#191f28;color:#fff;font-size:14px;line-height:1.5;text-align:center;box-shadow:0 14px 36px rgba(25,31,40,.28);opacity:0;pointer-events:none;transition:opacity .22s ease,transform .28s cubic-bezier(.2,.8,.2,1)}
.toast.show{opacity:1;transform:translate(-50%,0)}

/* 회원가입/로그인 화면 반응형 */
@media(max-width:880px){
  .auth{padding:0;overflow:auto}
  .auth-shell{grid-template-columns:1fr;height:auto;min-height:100%;border:0;border-radius:0;box-shadow:none;margin:0}
  .auth-hero{padding:26px 22px 24px;gap:0;border-radius:0}
  .auth-hero-body{margin-top:14px}
  .auth-hero-body h2{font-size:22px;margin-bottom:8px}
  .auth-hero-body p{font-size:13px}
  .auth-points,.auth-hero-foot{display:none}
  .auth-card{padding:24px 20px calc(32px + env(safe-area-inset-bottom));overflow:visible}
  .auth-title{font-size:23px}
  .auth-desc{margin-bottom:18px}
}

/* 사이드바 폭 조절 */
.sb-resizer{flex:0 0 5px;width:5px;cursor:col-resize;position:relative;z-index:60}
.sb-resizer:after{content:"";position:absolute;left:2px;top:0;bottom:0;width:1px;background:var(--line);transition:background .16s,width .16s}
.sb-resizer:hover:after,.sb-resizer.dragging:after{background:var(--blue);width:2px}
body.resizing{cursor:col-resize;user-select:none}
body.resizing *{cursor:col-resize!important;user-select:none!important}
@media(max-width:820px){.sb-resizer{display:none}}

/* 새 메시지 말풍선 등장 모션은 Web Animations API로 처리 (app.js) */

/* 비밀번호 찾기 안내 문구 */
.reset-msg{margin:12px 0 0;font-size:12.5px;line-height:1.6;color:var(--sub);word-break:break-word}
.reset-msg.warn{color:var(--danger)}
.reset-msg.ok{color:var(--green)}
.reset-msg:empty{display:none}

/* 알림 설정 */
.notify-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.sound-list{display:grid;gap:6px;max-height:200px;overflow:auto;padding:2px}
.sound-item{display:flex;align-items:center;gap:8px;padding:9px 11px;border:1px solid var(--line);border-radius:12px;background:var(--surface);text-align:left}
.sound-item.on{border-color:var(--blue);background:var(--blue-soft)}
.sound-item .grow{min-width:0}
.sound-item .title{font-size:13.5px}
.perm-badge{padding:3px 9px;border-radius:9px;font-size:11px;font-weight:650;background:#f2f4f6;color:var(--sub)}
.perm-badge.on{background:var(--blue-soft);color:var(--blue)}
.perm-badge.warn{background:var(--danger-soft);color:var(--danger)}

/* 삭제된 메시지 표시 */
.message-row.center{justify-content:center}
.deleted-pill{display:inline-block;padding:8px 15px;border-radius:999px;border:1px dashed var(--line);background:#f2f4f6;color:var(--muted);font-size:13px}

/* 다크 모드 */
html.dark{
  color-scheme:dark;
  --brand:#72BBFF;--brand-strong:#9DD2FF;--brand-soft:#132C44;--brand-line:#2F5F8C;
  --accent:#63CDFF;--accent-soft:#132C44;
  --blue:var(--brand);--blue-soft:var(--brand-soft);
  --text:#EDEFF6;--sub:#A3AABC;--muted:#7C8496;
  --bg:#101119;--surface:#1A1B26;--line:#2A2C3D;--danger:#FF6B6B;--danger-soft:#3A2124;--green:#34D399;
  --dark-soft:#141520;--dark-chip:#24263A;--dark-chip-hover:#2F3149;--dark-hover:#1D1F2E;
  --hover:#22243A;--chip:#24263A
}
html.dark .sidebar,html.dark .profile-card,html.dark .chat-head,html.dark .bubble,html.dark .composer-inner,html.dark .modal,html.dark .input,html.dark textarea.input,html.dark .select-button,html.dark .select-menu,html.dark .list-item,html.dark .drawer-panel,html.dark .admin-head,html.dark .admin-card,html.dark .rich-editor,html.dark .check-chip,html.dark .auth-card,html.dark .auth-shell{background:var(--surface)}
html.dark .messages-wrap{background:var(--dark-soft)}
html.dark .composer{background:linear-gradient(to top,rgba(24,27,31,.99) 72%,rgba(24,27,31,0))}
html.dark .composer-inner,html.dark .modal{box-shadow:0 8px 30px rgba(0,0,0,.45)}
html.dark .modal{box-shadow:0 30px 90px rgba(0,0,0,.6)}
html.dark .icon-btn,html.dark .soft-btn,html.dark .modal-close,html.dark .re-btn,html.dark .re-color,html.dark .choice,html.dark .cancel,html.dark .avatar,html.dark .room-icon,html.dark .avatar-opt,html.dark .tabs,html.dark .admin-tabs,html.dark .seg,html.dark .secondary{background:var(--dark-chip)}
html.dark .icon-btn{color:var(--sub)}
html.dark .primary{background:#2E86D6}html.dark .primary:hover{background:#3E95DF}
/* 다크모드: 흰 글자가 올라가는 브랜드 채움은 한 단계 진하게 (본문 대비 확보) */
html.dark .brand-mark,html.dark .boot-mark,html.dark .send,html.dark .mine .bubble,html.dark .message-row.mine.report-target .bubble{background:linear-gradient(140deg,#2E86D6 0%,#17538F 100%)}
html.dark .icon-btn:hover,html.dark .soft-btn:hover,html.dark .modal-close:hover{background:var(--dark-chip-hover)}
html.dark .room:hover,html.dark .profile-card:hover{background:var(--dark-hover);border-color:#333a42}
html.dark .room.active{background:var(--blue-soft)}
html.dark .room.active .room-icon{background:#17456B;color:var(--brand)}
html.dark .room-icon{color:var(--sub)}
html.dark .tab.active,html.dark .seg-btn.active{background:#2f343b;box-shadow:none}
html.dark .list-item.tappable:hover{background:#252a31;border-color:#333a42}
html.dark .side-top,html.dark .side-bottom{border-color:var(--line)}
html.dark .consent{background:#1b1f24;border-color:var(--line)}
html.dark .drawer-back{background:rgba(0,0,0,.55)}
html.dark .new-banner{background:#2b3138;box-shadow:0 15px 36px rgba(0,0,0,.5)}
html.dark .overlay{background:rgba(0,0,0,.55)}
html.dark .site-banner{border-bottom-color:var(--line)}
html.dark .preview-banner{border-color:#39404a}
html.dark .settings-list,html.dark .setting-row{border-color:var(--line)}
html.dark .avatar img{filter:brightness(.95)}
html.dark .auth{background:radial-gradient(58% 60% at 6% 0%,rgba(63,155,255,.24) 0%,transparent 62%),radial-gradient(52% 58% at 99% 100%,rgba(56,189,248,.16) 0%,transparent 62%),radial-gradient(42% 48% at 86% 4%,rgba(124,92,255,.18) 0%,transparent 64%),linear-gradient(158deg,#0B1119 0%,#0E2033 46%,#090D14 100%)}
html.dark .auth-shell{border-color:var(--line);box-shadow:0 30px 80px rgba(0,0,0,.55)}
html.dark .toast{background:#2f343b;color:#fff}
html.dark .deleted-pill{background:var(--dark-chip);border-color:var(--line)}
html.dark .boot-bar{background:var(--dark-chip)}

/* ---------- 목록 탭(카테고리) + 끌어서 옮기기 ---------- */
.room-group{margin-bottom:12px;border-radius:14px;padding:2px 0;transition:background .16s ease,box-shadow .16s ease}
.room-group>.side-title{padding:0 8px 8px}
.room-group .group-count{margin-left:auto;font-size:11px;font-weight:700;color:var(--muted);background:#f2f4f6;border-radius:999px;min-width:20px;padding:1px 7px;text-align:center}
.room-group.empty{display:none}
body.room-dragging .room-group.empty{display:block}
body.room-dragging .room-group{background:rgba(63,155,255,.08)}
.room-group .group-drop-hint{margin:2px 8px 8px;padding:12px;border:1.5px dashed var(--line);border-radius:12px;font-size:12px;color:var(--muted);text-align:center}
body.room-dragging .room-group.drop-over{background:var(--blue-soft);box-shadow:inset 0 0 0 2px var(--blue)}
body.room-dragging .room-group.drop-over .group-count{background:var(--blue);color:#fff}
.room.drag-src{opacity:.32}
.room-drag-clone{position:fixed;z-index:9999;pointer-events:none;margin:0;background:#fff;border-radius:14px;transform:rotate(-1.5deg) scale(1.03);box-shadow:0 18px 40px rgba(15,23,42,.28)}
.group-row-btns{display:flex;gap:6px;flex:0 0 auto;margin-left:10px}.group-row-btns .soft-btn{flex:0 0 auto;min-width:38px;padding:0 10px;height:34px}
.group-row-btns .soft-btn:disabled{opacity:.35;cursor:default}
body.room-dragging{cursor:grabbing;user-select:none;-webkit-user-select:none}
html.dark .room-group .group-count{background:var(--dark-chip)}
html.dark body.room-dragging .room-group{background:rgba(114,187,255,.14)}
html.dark body.room-dragging .room-group.drop-over{background:#17456B}
html.dark .room-drag-clone{background:#22262c}

/* ---------- 초대 코드 ---------- */
.code-row{display:flex;align-items:center;gap:10px;padding:12px 14px;border:1px solid var(--line);border-radius:14px;background:#f8fafc}
.code-row .grow{flex:1;min-width:0}
.code-label{font-size:12px;color:var(--sub);margin-bottom:5px}
.code-value,.code-chip{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-weight:750;letter-spacing:2.5px;color:var(--text)}
.code-value{font-size:19px}
.code-chip{font-size:14px;background:#f2f4f6;border-radius:10px;padding:7px 12px;letter-spacing:2px}
.code-input{letter-spacing:3px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-weight:700;text-transform:uppercase}
.code-box{margin:0 0 4px;padding:16px;border-radius:14px;background:#f2f4f6;text-align:center;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:26px;font-weight:800;letter-spacing:6px;color:var(--text);user-select:all;-webkit-user-select:all}
html.dark .code-row{background:#1b1f24;border-color:var(--line)}
html.dark .code-chip,html.dark .code-box{background:var(--dark-chip)}

/* ---------- 고정 알림 (초대 거절 등 · X로만 닫힘) ---------- */
.sticky-root{position:fixed;left:50%;bottom:92px;transform:translateX(-50%);z-index:880;display:flex;flex-direction:column;gap:10px;align-items:center;pointer-events:none;width:min(420px,calc(100vw - 32px))}
.sticky-card{pointer-events:auto;display:flex;align-items:flex-start;gap:12px;width:100%;padding:14px 14px 14px 16px;border-radius:16px;background:#191f28;color:#fff;box-shadow:0 18px 42px rgba(25,31,40,.28);opacity:0;transform:translateY(18px) scale(.97);transition:transform .28s cubic-bezier(.2,.8,.2,1),opacity .22s ease}
.sticky-card.show{opacity:1;transform:translateY(0) scale(1)}
.sticky-card.closing{opacity:0;transform:translateY(10px) scale(.96);transition:transform .24s ease,opacity .2s ease}
.sticky-card .grow{flex:1;min-width:0}
.sticky-card .title{font-size:13.5px;font-weight:700}
.sticky-card .text{font-size:12px;margin-top:4px;opacity:.85;line-height:1.5;word-break:break-word}
html.dark .sticky-card{background:#2f343b}
.sticky-card .sticky-actions{margin-top:12px}
.sticky-btns{display:flex;gap:12px;align-items:center}
.sticky-btn{margin:0;width:auto;flex:0 0 auto;white-space:nowrap;height:34px;padding:0 16px;border-radius:11px;font-size:13px;font-weight:650;transition:background .16s ease,transform .16s ease,filter .16s ease}
.sticky-btn.primary{background:var(--blue);color:#fff}
.sticky-btn.primary:hover{filter:brightness(1.07)}
.sticky-btn.ghost{background:rgba(255,255,255,.14);color:#fff}
.sticky-btn.ghost:hover{background:rgba(255,255,255,.24)}
.sticky-btn:active{transform:scale(.96)}
.sticky-check{display:flex;align-items:center;gap:7px;margin-top:11px;font-size:12px;color:rgba(255,255,255,.82);cursor:pointer;user-select:none}
.sticky-check input{width:15px;height:15px;margin:0;accent-color:var(--blue);cursor:pointer}
html.dark .sticky-btn.ghost{background:rgba(255,255,255,.12)}
.pair-btns{display:flex;gap:14px;flex:0 0 auto;align-items:center}

/* ---------- 공유 범위 표시(다른 학교 / 다른 학급) ---------- */
.share-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-left:6px;vertical-align:middle;transform:translateY(-1px);box-shadow:0 0 0 2px #fff}
.share-dot.cross-school{background:#f5b400}
.share-dot.cross-class{background:#12b980}
.share-pill{display:inline-flex;align-items:center;gap:5px;margin-left:8px;padding:3px 10px;border-radius:999px;font-size:11px;font-weight:700;vertical-align:middle;white-space:nowrap}
.share-pill.cross-school{background:#fff3cd;color:#8a6100}
.share-pill.cross-class{background:#dcf6e8;color:#0b6b42}
.icon-count{font-size:10px;font-weight:750;margin-left:1px;color:var(--sub)}
.icon-btn.icon-count-btn{display:flex;align-items:center;justify-content:center;gap:1px;padding:0 4px;font-size:14px}
.icon-btn.icon-count-btn .icon-count{margin-left:0}

/* ---------- 메시지 골라서 한 번에 삭제 ---------- */
.select-bar{display:flex;align-items:center;gap:8px;padding:9px 16px;background:var(--brand-soft);border-bottom:1px solid var(--line);flex:0 0 auto}
.select-bar .grow{flex:1;min-width:0;font-size:13px;font-weight:650;color:var(--brand-strong)}
.select-bar .soft-btn{flex:0 0 auto;height:34px;padding:0 12px;font-size:13px;border-radius:13px}
.msg-pick{flex:0 0 auto;width:22px;height:22px;border-radius:50%;border:1.5px solid var(--line);background:#fff;color:transparent;font-size:11px;line-height:1;display:grid;place-items:center;align-self:center;transition:background .15s ease,border-color .15s ease,color .15s ease}
.msg-pick.on{background:var(--blue);border-color:var(--blue);color:#fff}
.msg-pick.blank{border-color:transparent;background:transparent}

/* ---------- 이용 정지 안내 / 이의 제기 ---------- */
.suspend-box{margin-top:4px;padding:16px;border-radius:16px;background:var(--danger-soft);border:1px solid #ffd7da}
.suspend-label{font-size:12px;font-weight:750;color:var(--danger);margin-bottom:6px}
.suspend-text{font-size:14.5px;line-height:1.65;color:var(--text);white-space:pre-wrap;word-break:break-word}
.suspend-meta{margin-top:10px;font-size:12px;color:var(--sub)}
.admin-btns{display:flex;gap:8px;margin-top:12px}
.admin-btns .soft-btn{flex:1;height:38px;font-size:13px;border-radius:13px}
.appeal-text{margin-top:8px;padding:10px 12px;border-radius:12px;background:#f7f8fa;border:1px solid var(--line);font-size:13px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.appeal-btns{display:flex;gap:8px;flex:0 0 auto;margin-left:10px}
html.dark .share-dot{box-shadow:0 0 0 2px #16191d}
html.dark .share-pill.cross-school{background:#4a3c12;color:#ffd873}
html.dark .share-pill.cross-class{background:#123a2a;color:#7ee2b3}
html.dark .select-bar{background:var(--brand-soft);border-color:var(--line)}
html.dark .msg-pick{background:var(--dark-chip);border-color:var(--line)}
html.dark .suspend-box{background:#3a2224;border-color:#5a2f33}
html.dark .appeal-text{background:#1b1f24;border-color:var(--line)}

/* ---------- 좁은 화면에서 채팅방 목록 열기 ---------- */
.drawer-fab{display:none}
@media(max-width:820px){
  .drawer-fab{display:inline-flex;position:fixed;top:calc(10px + env(safe-area-inset-top));left:12px;z-index:230;align-items:center;gap:7px;height:42px;padding:0 16px;border-radius:14px;background:#fff;border:1px solid var(--line);box-shadow:0 8px 24px rgba(25,31,40,.12);font-size:13.5px;font-weight:650;color:var(--text)}
  .drawer-fab span{font-size:16px;line-height:1}
  .drawer-fab:active{transform:scale(.97)}
}
html.dark .drawer-fab{background:var(--surface);border-color:var(--line);box-shadow:0 8px 24px rgba(0,0,0,.45)}

/* ---------- 채팅 잠금 안내 (타임아웃 · 채팅 정지 · 도배 제한 · 경고) ---------- */
.compose-lock{flex-direction:column;align-items:center;gap:4px;padding:14px 16px;text-align:center;color:var(--sub)}
.compose-lock b{color:var(--danger);font-variant-numeric:tabular-nums}
.compose-lock .lock-reason{font-size:11.5px;color:var(--muted)}
.warn-pill{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;background:var(--danger-soft);color:var(--danger);font-size:11px;font-weight:700}

/* ---------- 파일 · 사진 전송 ---------- */
.attach-img{display:block;max-width:min(300px,68vw);max-height:320px;border-radius:12px;cursor:zoom-in}
.bubble .attach-img+.attach-text{margin-top:8px}
.attach-text{white-space:pre-wrap;word-break:break-word}
.attach-card{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:12px;background:rgba(0,0,0,.05);min-width:180px;text-align:left}
.mine .attach-card{background:rgba(255,255,255,.16)}
.attach-card .attach-ico{flex:0 0 auto;width:34px;height:34px;border-radius:10px;background:rgba(0,0,0,.06);display:grid;place-items:center;font-size:16px}
.mine .attach-card .attach-ico{background:rgba(255,255,255,.2)}
.attach-card .attach-name{font-size:13px;font-weight:650;word-break:break-all;line-height:1.35}
.attach-card .attach-size{font-size:11px;color:var(--muted)}
.mine .attach-card .attach-size{color:rgba(255,255,255,.75)}
.attach-view{display:block;width:100%;max-height:70dvh;object-fit:contain;border-radius:14px;margin-top:6px}
.composer-progress{position:absolute;left:0;right:0;bottom:0;height:3px;background:transparent}
.attach-hint{position:absolute;left:50%;transform:translateX(-50%);top:-26px;padding:4px 12px;border-radius:999px;background:#191f28;color:#fff;font-size:11.5px;white-space:nowrap}

/* ---------- 관리자 · 채팅 관리 ---------- */
.word-box{width:100%;min-height:92px;resize:vertical;font-family:inherit}
.word-preview{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.word-chip{padding:4px 10px;border-radius:999px;background:#f2f4f6;color:var(--sub);font-size:12px}
.word-chip.block{background:var(--danger-soft);color:var(--danger)}
.word-chip.warn{background:#fff3cd;color:#8a6100}
.timeout-chip{padding:3px 8px;border-radius:8px;background:var(--danger-soft);color:var(--danger);font-size:11px}
html.dark .word-chip{background:var(--dark-chip);color:var(--muted)}
html.dark .word-chip.warn{background:#4a3c12;color:#ffd873}

/* ---------- 채팅 헤더 버튼 (넓은 화면) ---------- */
.wide-only{display:flex}
.narrow-only{display:none!important}
.head-btn{display:inline-flex;align-items:center;gap:7px;height:36px;padding:0 12px;border-radius:999px;background:transparent;border:1px solid transparent;color:var(--sub);font-size:13.5px;font-weight:620;transition:background .18s,color .18s,transform .18s;white-space:nowrap}
.head-btn:hover{background:var(--hover);color:var(--text)}
.head-btn:active{transform:scale(.97)}
.head-btn .hb-ico{font-size:15px;line-height:1}
.head-btn .hb-label{font-size:13.5px}
.head-btn .hb-count{padding:1px 7px;border-radius:999px;background:var(--chip);color:var(--sub);font-size:11.5px;font-weight:750}
.head-btn .hb-plus{color:var(--brand);font-weight:800;font-size:12px}
html.dark .head-btn{background:transparent;color:var(--sub)}
html.dark .head-btn:hover{background:var(--dark-chip)}
html.dark .head-btn .hb-count{background:var(--dark-chip)}
.manage-btn{width:100%;margin-bottom:8px;display:flex;align-items:center;justify-content:center;gap:7px;background:var(--blue-soft)!important;color:var(--blue)!important;font-weight:700}
html.dark .manage-btn{background:var(--brand-soft)!important;color:var(--brand)!important}

/* ---------- 채팅방 검색 ---------- */
.search-inner{gap:6px;padding:6px 8px 6px 14px}
.search-ico{font-size:15px;color:var(--sub)}
.search-input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:15px;padding:11px 2px;color:var(--text)}
.search-count{font-size:12px;color:var(--sub);font-weight:650;white-space:nowrap;font-variant-numeric:tabular-nums}
.icon-btn.sm{width:38px;height:38px;flex:0 0 38px;border-radius:50%;font-size:12px}
.message-row.msg-hit .bubble{box-shadow:0 0 0 3px rgba(245,180,0,.4)}
.message-row.msg-hit-current .bubble{box-shadow:0 0 0 3px var(--blue)}

/* ---------- 참여자 패널 (채팅창을 밀고 들어온다) ---------- */
.chat-body{flex:1;min-height:0;display:flex}
.chat-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;position:relative}
.member-panel{flex:0 0 auto;width:0;overflow:hidden;background:#fff;border-left:0 solid var(--line);transition:width .28s cubic-bezier(.2,.8,.2,1),border-left-width .28s;display:flex}
.member-panel.open{width:var(--mpanel);border-left-width:1px}
.member-panel-inner{width:var(--mpanel);flex:0 0 var(--mpanel);display:flex;flex-direction:column;min-height:0;opacity:0;transform:translateX(14px);transition:opacity .22s ease,transform .3s cubic-bezier(.2,.8,.2,1)}
.member-panel.open .member-panel-inner{opacity:1;transform:none}
.mp-resizer{flex:0 0 7px;width:7px;cursor:col-resize;position:relative;z-index:5;display:none}
.chat-body.panel-open .mp-resizer{display:block}
.mp-resizer:after{content:"";position:absolute;left:3px;top:0;bottom:0;width:1px;background:var(--line);transition:background .16s,width .16s}
.mp-resizer:hover:after,.mp-resizer.dragging:after{background:var(--brand);width:2px}
body.resizing-panel{cursor:col-resize;user-select:none}
body.resizing-panel *{cursor:col-resize!important;user-select:none!important}
.member-panel-head{height:64px;flex:0 0 64px;display:flex;align-items:center;justify-content:space-between;padding:0 14px 0 18px;border-bottom:1px solid var(--line)}
.member-panel-head strong{font-size:15px}
.member-list{flex:1;min-height:0;overflow:auto;padding:12px;display:flex;flex-direction:column;gap:8px}
html.dark .member-panel{background:var(--surface)}

/* ---------- 말풍선 메뉴 / 공감 ---------- */
.float-menu{position:fixed;z-index:800;min-width:170px;padding:6px;border-radius:14px;background:#fff;border:1px solid var(--line);box-shadow:0 16px 40px rgba(25,31,40,.18);opacity:0;transform:translateY(6px) scale(.98);transition:opacity .14s,transform .16s}
.float-menu.open{opacity:1;transform:none}
.float-menu.closing{opacity:0;transform:translateY(6px) scale(.98);pointer-events:none}
.float-menu .float-title{padding:6px 10px 8px;font-size:11.5px;color:var(--muted);border-bottom:1px solid var(--line);margin-bottom:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:230px}
.float-menu button{display:block;width:100%;text-align:left;padding:9px 10px;border-radius:9px;font-size:13.5px;color:var(--text)}
.float-menu button:hover{background:#f2f4f6}
.float-menu button.danger{color:var(--danger)}
.float-menu .rx-picker{display:flex;gap:3px;padding:2px}
.float-menu .rx-picker button{width:38px;height:38px;display:grid;place-items:center;font-size:19px;padding:0;text-align:center}
html.dark .float-menu{background:var(--surface);border-color:var(--line)}
html.dark .float-menu button:hover{background:var(--dark-chip)}
html.dark .float-menu .float-title{border-color:var(--line)}
.rx-row{display:flex;flex-wrap:wrap;gap:5px;margin-top:6px}
.message-row.mine .rx-row{justify-content:flex-end}
.rx-chip{display:inline-flex;align-items:center;gap:4px;height:26px;padding:0 9px;border-radius:999px;background:#f2f4f6;border:1px solid var(--line);font-size:13px}
.rx-chip .rx-n{font-size:11px;font-weight:750;color:var(--sub)}
.rx-chip.mine{background:var(--brand-soft);border-color:var(--brand-line)}
.rx-chip.mine .rx-n{color:var(--blue)}
.rx-add{height:26px;padding:0 8px;border-radius:999px;background:#f2f4f6;border:1px solid var(--line);font-size:12px;color:var(--sub);display:inline-flex;align-items:center}
.rx-add span{font-size:10px;margin-left:1px}
.rx-add:hover{background:#e9ecf0}
html.dark .rx-chip,html.dark .rx-add{background:var(--dark-chip);border-color:var(--line)}
html.dark .rx-chip.mine{background:var(--brand-soft);border-color:var(--brand-line)}

/* ---------- 여기까지 읽었어요 ---------- */
.read-divider{display:flex;align-items:center;gap:10px;margin:16px 0 10px;color:var(--blue);font-size:11.5px;font-weight:700}
.read-divider:before,.read-divider:after{content:"";height:1px;flex:1;background:currentColor;opacity:.35}

/* ---------- 신고된 메시지 강조 ---------- */
.message-row.report-target{border-radius:14px;animation:flashMsg 1.8s ease}
.message-row.report-target .bubble{box-shadow:0 0 0 3px var(--danger);background:#fff5f5}
.message-row.mine.report-target .bubble{background:var(--blue)}
.report-badge{margin-left:6px;padding:2px 7px;border-radius:999px;background:var(--danger-soft);color:var(--danger);font-size:10.5px;font-weight:750}
html.dark .message-row.report-target .bubble{background:#3a2224}

/* ---------- 접속 상태 점 ---------- */
.avatar{position:relative}
.presence-dot{position:absolute;right:1px;bottom:1px;width:10px;height:10px;border-radius:50%;border:1.5px solid #fff;background:#b0b8c1;z-index:2}
.presence-dot.online{background:#12b980}
.presence-dot.away{background:#f5b400}
.presence-dot.offline{background:#b0b8c1}
html.dark .presence-dot{border-color:#16191d}

/* ---------- 프로필 사진 ---------- */
.photo-row{display:flex;gap:12px;align-items:center}
.photo-preview{width:78px;height:78px;flex:0 0 78px;border-radius:50%;overflow:hidden;background:#eef2f6;display:grid;place-items:center;color:var(--muted);font-size:11px;text-align:center}
.photo-preview img{width:100%;height:100%;object-fit:cover}
.avatar-pick{display:flex;flex-wrap:wrap;gap:8px}

/* ---------- 좁은 화면 (모바일) ---------- */
@media(max-width:820px){
  .wide-only{display:none!important}
  .narrow-only{display:grid!important}
  .chat-head{gap:8px;padding:0 12px}
  .chat-head-left{flex:1;min-width:0}
  .chat-title{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .chat-desc{display:none}
  /* 좁은 화면에서는 참여자 패널 폭을 화면에 맞춰 제한한다 */
  .member-panel.open{width:min(var(--mpanel),72vw)}
  .member-panel-inner{width:min(var(--mpanel),72vw);flex:0 0 min(var(--mpanel),72vw)}
}
@media(hover:none){
  .messages{-webkit-touch-callout:none}
  .bubble{user-select:none;-webkit-user-select:none}
}

/* ---------- 프로필 사진 위 접속 상태 점 (동그라미에 살짝 얹힘) ---------- */
.avatar{overflow:visible}
.avatar-face{width:100%;height:100%;border-radius:50%;overflow:hidden;display:grid;place-items:center;background:inherit;color:inherit;font-size:inherit;font-weight:650}
.presence-dot{right:-2px;bottom:-2px;width:11px;height:11px;border:2px solid #fff;box-shadow:0 0 0 1px rgba(25,31,40,.06)}
.avatar.large .presence-dot{width:13px;height:13px;right:-1px;bottom:-1px}

/* ---------- 채팅 목록 · 탭 ---------- */
.side-title-btns{display:flex;gap:10px;align-items:center}
.cat-caret{display:inline-block;transition:transform .22s ease;font-size:10px;color:var(--muted);margin-right:2px}
.room-group.collapsed .cat-caret{transform:rotate(-90deg)}
.side-title[data-action]{cursor:pointer;user-select:none}
.room-list-body{display:grid;grid-template-rows:1fr;transition:grid-template-rows .28s cubic-bezier(.2,.8,.2,1)}
.room-list-body>.rl-inner{overflow:hidden;min-height:0}
.room-group.collapsed .room-list-body{grid-template-rows:0fr}
body.cat-dragging .room-group.empty{display:block}
.room-group.cat-lift>.side-title{background:var(--blue-soft);border-radius:11px;color:var(--blue)}
html.dark .room-group.cat-lift>.side-title{background:var(--brand-soft);color:var(--brand)}
.pin-mark{font-size:10px;margin-right:4px;vertical-align:1px}
.room-icon-img{width:100%;height:100%;object-fit:cover;border-radius:11px;display:block}
.room-icon-inline{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;font-size:14px;vertical-align:middle}
.room-icon-inline img{width:100%;height:100%;object-fit:cover;border-radius:7px}
.cm-check{flex:0 0 auto;display:grid;place-items:center;width:24px}
.cm-check input{width:17px;height:17px;accent-color:var(--blue);cursor:pointer}

/* ---------- 채팅방 만들기 2단계 ---------- */
.room-pane{position:relative}
.room-pane.pane-in-right{animation:paneInRight .34s cubic-bezier(.2,.8,.2,1)}
.room-pane.pane-in-left{animation:paneInLeft .34s cubic-bezier(.2,.8,.2,1)}
@keyframes paneInRight{from{opacity:0;transform:translateX(64px)}to{opacity:1;transform:none}}
@keyframes paneInLeft{from{opacity:0;transform:translateX(-64px)}to{opacity:1;transform:none}}
.share-choices{display:flex;flex-direction:column;gap:8px}
.share-choice{display:flex;align-items:center;gap:11px;padding:12px 13px;border:1px solid var(--line);border-radius:14px;background:#fff;text-align:left;transition:border-color .16s,background .16s,transform .16s}
.share-choice:hover{background:#fbfcfe;border-color:#dbe1e8}
.share-choice:active{transform:scale(.995)}
.share-choice.on{border-color:var(--brand-line);background:var(--brand-soft)}
.share-choice .sc-ico{font-size:19px}
.share-choice .sc-title{display:block;font-size:14.5px;font-weight:650;color:var(--text)}
.share-choice .sc-sub{display:block;font-size:12px;color:var(--sub);margin-top:3px}
html.dark .share-choice{background:var(--surface);border-color:var(--line)}
html.dark .share-choice.on{background:var(--brand-soft);border-color:var(--brand-line)}

/* 로그인 화면 배경: 은은한 오로라 + 아래로 사라지는 도트 그리드 (반복 벽지 느낌 없이) */
.auth{position:relative}
.auth:before{content:"";position:absolute;inset:0;pointer-events:none;background-image:radial-gradient(rgba(63,155,255,.20) 1px,transparent 1px);background-size:22px 22px;-webkit-mask-image:radial-gradient(80% 64% at 50% 0%,#000 0%,transparent 74%);mask-image:radial-gradient(80% 64% at 50% 0%,#000 0%,transparent 74%)}
.auth:after{content:"";position:absolute;left:50%;top:50%;width:min(1240px,132vw);height:min(920px,132vh);transform:translate(-50%,-50%);pointer-events:none;background:radial-gradient(closest-side,rgba(255,255,255,.78),rgba(255,255,255,0) 74%)}
.auth-shell{position:relative;z-index:1}
html.dark .auth:before{background-image:radial-gradient(rgba(114,187,255,.18) 1px,transparent 1px)}
html.dark .auth:after{background:radial-gradient(closest-side,rgba(120,190,255,.10),rgba(120,190,255,0) 74%)}

/* ---------- 로그인 / 회원가입 전환 모션 ---------- */
/* 좁은 화면 전용: 네 문구가 페이드로 바뀌고 알약 폭도 글자에 맞춰 부드럽게 늘어난다 */
.auth-hero-mobile{display:none;width:max-content;max-width:100%;align-items:center;gap:8px;margin-top:14px;font-size:13px;color:#fff;font-weight:650;background:rgba(8,42,74,.32);border:1px solid rgba(255,255,255,.28);padding:8px 14px;border-radius:999px;overflow:hidden;transition:width .34s cubic-bezier(.22,1,.36,1)}
.auth-hero-mobile:before{content:"";width:6px;height:6px;flex:0 0 6px;border-radius:50%;background:#8FE3F5;box-shadow:0 0 0 3px rgba(143,227,245,.28)}
.auth-hero-mobile span{display:inline-block;flex:0 0 auto;white-space:nowrap;transition:opacity .26s ease,transform .26s ease}
.auth-hero-mobile span.out{opacity:0;transform:translateY(5px)}
.auth-points .pt-ico{flex:0 0 auto;font-size:14px;line-height:1}
/* 로그인 화면 안내 링크 (개인정보 처리방침 · 문의하기 · 학교 등록) */
.auth-links{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.auth-link{font-size:12px;color:#fff;font-weight:600;text-decoration:underline;text-underline-offset:3px;transition:color .16s}
.auth-link:hover{color:#fff}
.auth-sep{font-size:12px;color:rgba(255,255,255,.5)}
.card-links{display:none;margin-top:18px;justify-content:center}
.card-links .auth-link{color:var(--sub)}
.card-links .auth-link:hover{color:var(--brand)}
.card-links .auth-sep{color:var(--muted)}
/* 안내 페이지 본문 */
.auth-page-body{margin:14px 0 0;font-size:14px;line-height:1.75;color:var(--sub);max-height:min(46dvh,420px);overflow:auto;overscroll-behavior:contain}
.auth-page-body p{margin:0 0 12px}
.auth-page-body b{color:var(--text)}
.auth-page-btns{display:grid;gap:8px;margin-top:18px}
.auth-page-btns .soft-btn{height:46px}

/* ---------- 부팅 → 로그인 화면 전환 ---------- */
/* 로딩바와 문구가 살짝 사라진 뒤 로그인 화면이 열린다 */
.boot.leaving .boot-bar,.boot.leaving strong,.boot.leaving span{opacity:0;transition:opacity .2s ease}
/* 로그인 화면 등장: 왼쪽은 페이드 인, 오른쪽은 아래에서 스르륵 */
.auth-shell.enter .auth-hero{animation:authFadeIn .6s ease both}
.auth-shell.enter .auth-card{animation:authRiseIn .66s cubic-bezier(.2,.8,.2,1) .1s both}
@keyframes authFadeIn{from{opacity:0}to{opacity:1}}
@keyframes authRiseIn{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
  .auth-shell.enter .auth-hero,.auth-shell.enter .auth-card{animation:none}
}
.back-btn{width:38px;height:38px;border-radius:50%;background:transparent;color:var(--text);font-size:17px;display:grid;place-items:center;margin-bottom:12px;transition:background .16s,transform .16s}
.back-btn:hover{background:var(--hover)}
.back-btn:active{transform:scale(.95)}
.auth-anim-left{animation:authInLeft .32s cubic-bezier(.2,.8,.2,1)}
.auth-anim-right{animation:authInRight .32s cubic-bezier(.2,.8,.2,1)}
@keyframes authInLeft{from{opacity:0;transform:translateX(52px)}to{opacity:1;transform:none}}
@keyframes authInRight{from{opacity:0;transform:translateX(-52px)}to{opacity:1;transform:none}}
html.dark .back-btn{background:transparent}
html.dark .back-btn:hover{background:var(--dark-chip)}

/* ---------- Google 로그인 버튼 (공식 가이드라인) ---------- */
.google-btn{width:100%;height:48px;margin-top:10px;display:flex;align-items:center;justify-content:center;gap:10px;background:#fff;border:1px solid #747775;border-radius:8px;color:#1f1e1e;font-family:Roboto,"Helvetica Neue",Arial,system-ui,sans-serif;font-size:14px;font-weight:500;letter-spacing:.01em;transition:background .16s ease,box-shadow .16s ease,border-color .16s ease}
.google-btn:hover{background:#F8FAFD;box-shadow:0 1px 2px rgba(60,64,67,.3),0 1px 3px 1px rgba(60,64,67,.15)}
.google-btn:active{background:#F1F3F4}
.google-btn svg{width:18px;height:18px;flex:0 0 18px;display:block}
.google-btn span{white-space:nowrap}
html.dark .google-btn{background:#131314;border-color:#8E918F;color:#E3E3E3}
html.dark .google-btn:hover{background:#1F1F20;box-shadow:0 1px 2px rgba(0,0,0,.5)}
html.dark .google-btn:active{background:#2A2A2B}
@media(max-width:880px){
  .auth{padding:0;overflow:hidden}
  .auth-shell{grid-template-columns:1fr;grid-template-rows:auto minmax(0,1fr);height:100dvh;min-height:0;margin:0;border:0;border-radius:0;box-shadow:none}
  .auth-hero{padding:18px 20px 16px;gap:10px;border-radius:0}
  .auth-hero-body{margin-top:6px}
  .auth-hero-body h2{font-size:18px;line-height:1.5;margin-bottom:4px}
  .auth-hero-body>p{display:none}
  .auth-points,.auth-hero-foot{display:none}
  .auth-hero-mobile{display:flex;font-size:12.5px;margin-top:10px;padding:7px 13px}
  .card-links{display:flex}
  .auth-card{padding:16px 20px calc(24px + env(safe-area-inset-bottom));overflow:auto;overscroll-behavior:contain}
  .auth-card-inner{margin:0;width:100%}
  .auth-title{font-size:22px}
  .auth-desc{margin:7px 0 16px}
}
