:root{
  --bg:#f2f3f5;
  --panel:#ffffff;
  --line:#e6e8eb;
  --ink:#1a1d21;
  --ink-2:#6b7280;
  --ink-3:#9aa1ac;
  --brand:#4a7cf7;
  --brand-2:#6d94ff;
  --me-bubble:linear-gradient(135deg,#5b86f8,#4a7cf7);
  --danger:#e5484d;
  --radius:18px;
  --safe-t:env(safe-area-inset-top,0px);
  --safe-b:env(safe-area-inset-bottom,0px);
  --bar-h:52px;
}

*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%;margin:0}
body{
  background:var(--bg);color:var(--ink);
  font:15px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  overscroll-behavior:none;
  -webkit-font-smoothing:antialiased;
}
button{font:inherit;color:inherit;background:none;border:none;cursor:pointer;padding:0}
.hidden{display:none !important}
.hidden-file{display:none}

.view{position:fixed;top:0;left:0;right:0;height:var(--vvh,100%);display:flex;flex-direction:column}

/* ================= 登录 ================= */
#login{background:linear-gradient(170deg,#eef2ff 0%,#f7f8fa 46%,#f2f3f5 100%);align-items:center;justify-content:center}
.login-wrap{width:100%;max-width:360px;padding:28px 26px calc(28px + var(--safe-b))}
.login-head{text-align:center;margin-bottom:30px}
.login-logo{font-size:46px;line-height:1;margin-bottom:12px}
.login-head h1{margin:0 0 6px;font-size:25px;letter-spacing:1px;font-weight:650}
.login-head p{margin:0;color:var(--ink-3);font-size:13px}

.who{display:flex;gap:12px;margin-bottom:18px}
.who-card{
  flex:1;background:var(--panel);border:1.5px solid var(--line);border-radius:16px;
  padding:16px 8px 13px;text-align:center;transition:.18s;
}
.who-card.on{border-color:var(--brand);background:#f4f7ff;box-shadow:0 4px 14px rgba(74,124,247,.13)}
.who-card .w-avatar{font-size:30px;line-height:1;margin-bottom:7px}
.who-card .w-name{font-size:14px;font-weight:550}
.who-card .w-sub{font-size:11px;color:var(--ink-3);margin-top:3px}

.field{position:relative;margin-bottom:16px}
.field input{
  width:100%;height:48px;padding:0 46px 0 16px;font-size:15px;
  background:var(--panel);border:1.5px solid var(--line);border-radius:14px;outline:none;transition:.15s;
}
.field input:focus{border-color:var(--brand)}
.eye{position:absolute;right:6px;top:6px;width:36px;height:36px;font-size:16px;opacity:.5;border-radius:10px}

.btn-primary{
  width:100%;height:48px;border-radius:14px;color:#fff;font-size:16px;font-weight:600;letter-spacing:2px;
  background:linear-gradient(135deg,#6d94ff,#4a7cf7);box-shadow:0 6px 18px rgba(74,124,247,.28);transition:.15s;
}
.btn-primary:active{transform:translateY(1px);box-shadow:0 3px 10px rgba(74,124,247,.24)}
.btn-primary:disabled{opacity:.55}
.login-err{min-height:20px;margin:12px 0 0;text-align:center;font-size:13px;color:var(--danger)}

/* ================= 顶栏 ================= */
#topbar{
  flex:0 0 auto;padding-top:var(--safe-t);
  background:rgba(255,255,255,.9);backdrop-filter:saturate(180%) blur(14px);
  border-bottom:1px solid var(--line);
  display:flex;align-items:center;justify-content:space-between;height:calc(var(--bar-h) + var(--safe-t));
  padding-left:14px;padding-right:8px;position:relative;z-index:20;
}
.peer{display:flex;align-items:center;gap:10px;min-width:0}
.peer-avatar{
  width:36px;height:36px;border-radius:50%;display:grid;place-items:center;font-size:19px;
  background:linear-gradient(135deg,#eaf0ff,#dfe8ff);
}
.peer-meta{min-width:0}
.peer-name{font-size:16px;font-weight:600;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.peer-state{font-size:11.5px;color:var(--ink-3);line-height:1.3}
.peer-state.online{color:#22a06b}
.peer-state.typing{color:var(--brand)}
.top-actions{display:flex;align-items:center;gap:2px}
.icon-btn{width:38px;height:38px;border-radius:12px;font-size:19px;color:var(--ink-2);display:grid;place-items:center}
.icon-btn:active{background:#eceef1}
.icon-btn.round{
  flex:0 0 auto;width:34px;height:34px;border-radius:50%;font-size:21px;
  background:var(--panel);border:1px solid var(--line);color:var(--ink-2);
}

.net-bar{
  flex:0 0 auto;background:#fff4e5;color:#a2600a;font-size:12.5px;text-align:center;
  padding:5px 12px;border-bottom:1px solid #f6e3c8;
}

/* ================= 消息列表 ================= */
.list{
  flex:1 1 auto;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;
  padding:12px 12px 8px;display:flex;flex-direction:column;
}
.list::-webkit-scrollbar{width:0}
.load-more{text-align:center;padding:6px 0 2px}
.load-more span{font-size:12px;color:var(--ink-3);padding:5px 12px;border-radius:20px;background:rgba(0,0,0,.04)}
.load-more.none span{opacity:0}

.empty{text-align:center;padding:70px 20px;color:var(--ink-3)}
.empty-icon{font-size:40px;margin-bottom:12px;opacity:.7}
.empty p{margin:0;font-size:13px;line-height:1.8}

#msgs{display:flex;flex-direction:column;gap:2px}

.day{text-align:center;margin:14px 0 8px}
.day span{font-size:11.5px;color:var(--ink-3);background:rgba(0,0,0,.05);padding:3px 11px;border-radius:20px}

.row{display:flex;align-items:flex-end;gap:8px;margin-bottom:2px}
.row.me{flex-direction:row-reverse}
.row.cont{margin-top:-2px}

.ava{
  flex:0 0 auto;width:32px;height:32px;border-radius:50%;display:grid;place-items:center;font-size:16px;
  background:var(--panel);border:1px solid var(--line);margin-bottom:18px;
}
.row.cont .ava{visibility:hidden;margin-bottom:0}

.stack{display:flex;flex-direction:column;max-width:74%;min-width:0}
.row.me .stack{align-items:flex-end}

.bub{
  position:relative;padding:9px 13px;border-radius:var(--radius);font-size:15px;line-height:1.55;
  word-break:break-word;white-space:pre-wrap;overflow-wrap:anywhere;
  background:var(--panel);border:1px solid rgba(0,0,0,.04);
  box-shadow:0 1px 2px rgba(16,24,40,.05);
}
.row.me .bub{
  background:var(--me-bubble);color:#fff;border:none;box-shadow:0 2px 8px rgba(74,124,247,.22);
}
.bub.tail-tl{border-bottom-left-radius:6px}
.bub.tail-tr{border-bottom-right-radius:6px}
.bub.pending{opacity:.62}

.bub.img{padding:3px;overflow:hidden;background:var(--panel)}
.bub.img img{display:block;width:100%;max-width:210px;border-radius:15px;cursor:zoom-in}
.row.me .bub.img{background:var(--me-bubble)}
.row.me .bub.img img{border-radius:15px}
.img-meta{position:absolute;left:0;right:0;bottom:0;padding:14px 10px 6px;font-size:11px;color:#fff;
  background:linear-gradient(transparent,rgba(0,0,0,.45));border-radius:0 0 14px 14px;text-align:right}

.bub.voice{display:flex;align-items:center;gap:9px;min-width:96px;padding:9px 13px}
.bub.voice .play{
  flex:0 0 auto;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-size:12px;
  background:rgba(0,0,0,.06);
}
.row.me .bub.voice .play{background:rgba(255,255,255,.22)}
.bub.voice .wave{flex:1 1 auto;display:flex;align-items:center;gap:2px;height:18px}
.bub.voice .wave i{display:block;width:2.5px;border-radius:2px;background:var(--ink-3);opacity:.55}
.row.me .bub.voice .wave i{background:#fff;opacity:.75}
.bub.voice .wave.playing i{animation:wv .9s ease-in-out infinite}
.bub.voice .wave i:nth-child(2){animation-delay:.1s}
.bub.voice .wave i:nth-child(3){animation-delay:.2s}
.bub.voice .wave i:nth-child(4){animation-delay:.3s}
.bub.voice .wave i:nth-child(5){animation-delay:.15s}
.bub.voice .wave i:nth-child(6){animation-delay:.05s}
.bub.voice .wave i:nth-child(7){animation-delay:.25s}
@keyframes wv{0%,100%{height:6px}50%{height:16px}}
.bub.voice .dur{flex:0 0 auto;font-size:12px;opacity:.7;font-variant-numeric:tabular-nums}

/* 视频气泡 */
.bub.video{padding:3px;position:relative;overflow:hidden}
.bub.video video{display:block;width:100%;max-width:220px;max-height:280px;border-radius:15px;background:#000;object-fit:cover}
.bub.video .v-play{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:44px;height:44px;border-radius:50%;background:rgba(0,0,0,.45);
  display:grid;place-items:center;font-size:17px;color:#fff;pointer-events:none;
  backdrop-filter:blur(2px);
}
.v-meta{
  position:absolute;left:0;right:0;bottom:0;padding:16px 9px 6px;font-size:11px;color:#fff;
  background:linear-gradient(transparent,rgba(0,0,0,.5));border-radius:0 0 14px 14px;text-align:right;
  pointer-events:none;
}
.v-close{position:absolute;right:14px;top:calc(14px + var(--safe-t));width:38px;height:38px;border-radius:50%;
  background:rgba(255,255,255,.18);color:#fff;font-size:17px}
#videoViewer video{width:100%;max-height:100%}

/* 上传进度 */
.up-box{
  position:fixed;left:50%;bottom:calc(96px + var(--safe-b));transform:translateX(-50%);z-index:85;
  width:220px;padding:13px 15px;border-radius:14px;background:rgba(28,30,34,.92);color:#fff;
  box-shadow:0 10px 30px rgba(0,0,0,.28);text-align:center;
}
.up-text{font-size:13px;margin-bottom:9px;font-variant-numeric:tabular-nums}
.up-bar{height:4px;border-radius:3px;background:rgba(255,255,255,.2);overflow:hidden}
.up-bar i{display:block;height:100%;width:0;border-radius:3px;background:linear-gradient(90deg,#6d94ff,#4a7cf7);transition:width .2s}
.up-cancel{margin-top:10px;font-size:12.5px;color:rgba(255,255,255,.65)}

.meta{font-size:11px;color:var(--ink-3);margin:3px 4px 0;display:flex;gap:5px;align-items:center}
.row.me .meta{flex-direction:row-reverse}
.meta .read{color:var(--brand)}

.sys{text-align:center;font-size:11.5px;color:var(--ink-3);margin:10px 0;line-height:1.6}
.sys .reundo{color:var(--brand);margin-left:6px}

/* ================= 输入栏 ================= */
#composer{
  flex:0 0 auto;display:flex;align-items:flex-end;gap:8px;padding:8px 10px calc(6px + var(--padb,0px));
  background:rgba(255,255,255,.94);backdrop-filter:blur(12px);border-top:1px solid var(--line);
  position:relative;z-index:20;
}
.input-box{
  flex:1 1 auto;min-width:0;background:#fff;border:1px solid var(--line);border-radius:19px;
  padding:0 4px;display:flex;align-items:flex-end;min-height:38px;
}
#textInput{
  flex:1 1 auto;border:none;outline:none;background:none;resize:none;font:inherit;line-height:1.4;
  max-height:96px;padding:9px 8px;overflow-y:auto;
}
.voice-btn{
  flex:1 1 auto;height:38px;border-radius:19px;font-size:14px;color:var(--ink-2);letter-spacing:.5px;
  display:none;align-items:center;justify-content:center;user-select:none;-webkit-user-select:none;
}
.voice-mode #textInput{display:none}
.voice-mode .voice-btn{display:flex}
.voice-mode.recording .voice-btn{background:#eceef1;color:var(--ink)}

.send-btn{
  flex:0 0 auto;height:38px;padding:0 17px;border-radius:19px;color:#fff;font-size:14.5px;font-weight:600;
  background:linear-gradient(135deg,#6d94ff,#4a7cf7);box-shadow:0 3px 10px rgba(74,124,247,.25);
}
.send-btn:active{transform:translateY(1px)}

/* 扩展面板：四个功能并排一行 */
.panel{
  flex:0 0 auto;display:flex;justify-content:space-around;align-items:flex-start;
  gap:6px;padding:12px 14px calc(10px + var(--safe-b));
  background:#fff;border-top:1px solid var(--line);
}
.panel-item{display:flex;flex-direction:column;align-items:center;gap:5px;font-size:11.5px;color:var(--ink-2);width:64px}
.pi-icon{
  width:46px;height:46px;border-radius:14px;background:#f4f5f7;display:grid;place-items:center;font-size:22px;
}
.panel-item:active .pi-icon{background:#e9ebef}
/* 面板展开时，输入栏底部不再需要留白（底部留白由面板自己负责） */
#chat:has(.panel:not(.hidden)) #composer{padding-bottom:6px}

/* 录音浮层 */
.rec-mask{position:fixed;inset:0;background:rgba(0,0,0,.35);display:grid;place-items:center;z-index:60}
.rec-card{
  width:150px;padding:22px 16px;border-radius:18px;background:rgba(255,255,255,.97);text-align:center;
  box-shadow:0 12px 40px rgba(0,0,0,.22);
}
.rec-dot{width:12px;height:12px;border-radius:50%;background:var(--danger);margin:0 auto 12px;animation:pulse 1s infinite}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.8)}}
.rec-time{font-size:26px;font-weight:600;font-variant-numeric:tabular-nums}
.rec-tip{font-size:12px;color:var(--ink-3);margin-top:6px}

/* 图片查看 */
.viewer{position:fixed;inset:0;background:#000;display:grid;place-items:center;z-index:80}
.viewer img{max-width:100%;max-height:100%;object-fit:contain}

/* 菜单 */
.ctx,.top-menu{
  position:fixed;z-index:70;background:#fff;border-radius:14px;box-shadow:0 10px 34px rgba(16,24,40,.2);
  overflow:hidden;min-width:120px;
}
.ctx button,.top-menu button{
  display:block;width:100%;padding:13px 18px;text-align:left;font-size:15px;
}
.ctx button:active,.top-menu button:active{background:#f2f3f5}
.top-menu{top:calc(var(--bar-h) + var(--safe-t) + 6px);right:10px;min-width:150px}
.top-menu .danger{color:var(--danger)}

.toast{
  position:fixed;left:50%;transform:translateX(-50%);bottom:calc(88px + var(--safe-b));z-index:90;
  background:rgba(0,0,0,.8);color:#fff;font-size:13.5px;padding:9px 17px;border-radius:20px;max-width:80%;
  text-align:center;animation:fadein .18s;
}
@keyframes fadein{from{opacity:0;transform:translate(-50%,6px)}to{opacity:1;transform:translate(-50%,0)}}

@media (prefers-color-scheme:dark){
  :root{
    --bg:#15171a;--panel:#212429;--line:#2e3238;--ink:#e8eaed;--ink-2:#9aa1ac;--ink-3:#6e747d;
  }
  #login{background:linear-gradient(170deg,#1b2130 0%,#17191d 46%,#15171a 100%)}
  .who-card.on{background:#222a3d}
  #topbar,#composer,.panel{background:rgba(33,36,41,.94)}
  .input-box{background:#2a2e34;border-color:#33383f}
  .pi-icon{background:#2a2e34}
  .bub{box-shadow:none}
  .icon-btn:active,.ctx button:active,.top-menu button:active{background:#2a2e34}
  .load-more span{background:rgba(255,255,255,.07)}
  .day span{background:rgba(255,255,255,.07)}
}

/* ============ 计算器伪装页（保持浅色，跟系统计算器一致） ============ */
#calc{
  background:#f7f8fa;
  display:flex;flex-direction:column;
  padding:calc(env(safe-area-inset-top) + 8px) 14px calc(env(safe-area-inset-bottom) + 10px);
  user-select:none;-webkit-user-select:none;
}
.calc-top{display:flex;justify-content:space-between;padding:6px 10px;color:#b9bec6;font-size:20px}
.calc-display{
  flex:1;min-height:120px;
  display:flex;align-items:flex-end;justify-content:flex-end;
  padding:0 18px 18px;
  font-size:52px;font-weight:400;color:#333;
  font-variant-numeric:tabular-nums;letter-spacing:1px;
  overflow:hidden;
}
.calc-display.err{color:#f0484f}
.calc-display.shake{animation:calcshake .3s}
@keyframes calcshake{0%,100%{transform:translateX(0)}25%{transform:translateX(-8px)}75%{transform:translateX(8px)}}
.calc-pad{
  display:grid;grid-template-columns:repeat(4,1fr);
  gap:max(12px,2.6vw);
  max-width:460px;width:100%;margin:0 auto;
}
.ck{
  aspect-ratio:1;border:none;border-radius:50%;
  background:#fff;color:#333;
  font-size:24px;font-weight:500;font-family:inherit;
  box-shadow:0 1px 4px rgba(0,0,0,.07);
  display:flex;align-items:center;justify-content:center;
  cursor:pointer;transition:transform .06s, box-shadow .06s;
  padding:0;
}
.ck:active{transform:scale(.92);box-shadow:0 0 1px rgba(0,0,0,.15)}
.ck.red{color:#f0484f}
.ck.gray{background:#e9eaee;color:#333}
.ck.eq{background:#22b662;color:#fff;font-size:28px}
.ck.eq.danger{background:#f0484f}
.ck:disabled{opacity:.55}
