/* ===== 恋爱小家 · 全站样式 ===== */
:root{
  --pink:#ff8fab;
  --pink2:#ff6f91;
  --purple:#c77dff;
  --ink:#4a3440;
  --muted:#9b8790;
  --card:rgba(255,255,255,.92);
  --line:#ffe1ea;
  --ok:#3ecf8e;
  --bad:#e14b5a;

  /* 圆角与阴影体系，全站统一 */
  --r-sm:12px;
  --r-md:16px;
  --r-lg:22px;
  --r-xl:28px;
  --sh-sm:0 2px 8px rgba(255,143,171,.10);
  --sh-md:0 8px 22px rgba(255,143,171,.14);
  --sh-lg:0 14px 34px rgba(255,111,145,.20);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  color:var(--ink);line-height:1.68;font-size:15px;-webkit-font-smoothing:antialiased;
  background:
    radial-gradient(900px 500px at 10% -10%, #ffe3ef 0%, transparent 60%),
    radial-gradient(800px 500px at 100% 0%, #f3e8ff 0%, transparent 55%),
    linear-gradient(180deg,#fff7fa 0%,#fffdfd 100%);
  background-attachment:fixed;min-height:100vh;
}
a{color:inherit;text-decoration:none}
h1,h2,h3,p,ul{margin:0}
ul{list-style:none;padding:0}
img{max-width:100%}
code{background:#fff0f5;padding:1px 6px;border-radius:6px;font-size:12px;color:var(--pink2)}
.muted{color:var(--muted)}
.small{font-size:12px}
.center{text-align:center}
.pink{color:var(--pink2)}
.empty{color:var(--muted);font-size:13.5px;text-align:center;padding:22px 8px;line-height:1.7}
.big-emoji{font-size:56px;line-height:1;margin-bottom:6px}

/* ---------- 容器 ---------- */
.app{max-width:640px;margin:0 auto;padding:0 14px 104px}
.wrap{max-width:640px;margin:0 auto;padding:22px 14px 64px}
.wrap.narrow{max-width:420px;padding-top:8vh}
.page{padding-bottom:8px}

/* ---------- 顶栏 ---------- */
.topbar{
  position:sticky;top:0;z-index:30;display:flex;align-items:center;justify-content:space-between;
  gap:10px;padding:12px 4px 12px;backdrop-filter:blur(16px);
  background:linear-gradient(180deg,rgba(255,247,250,.98),rgba(255,247,250,.72));
}
.brand{display:flex;align-items:center;gap:10px;min-width:0}
.brand .logo{
  font-size:26px;animation:beat 1.6s infinite;flex:none;
  width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,#fff0f5,#f6ecff);box-shadow:var(--sh-sm);
}
@keyframes beat{0%,60%,100%{transform:scale(1)}30%{transform:scale(1.18)}}
.brand h1{font-size:18px;letter-spacing:1px;font-weight:700}
.brand .sub{font-size:11px;color:var(--muted);line-height:1.3}
.me{display:flex;align-items:center;gap:7px;font-size:13px;min-width:0}
.me .nick{max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.me .pair{
  background:linear-gradient(135deg,#fff0f5,#f6ecff);border:1px solid var(--line);
  border-radius:20px;padding:4px 11px;color:var(--pink2);white-space:nowrap;font-size:12px;font-weight:600;
}

/* ---------- 头像 ---------- */
.avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;border:2px solid #fff;box-shadow:0 3px 10px rgba(255,111,145,.28);background:#fff}
.avatar.sm{width:30px;height:30px}
.avatar.lg{width:56px;height:56px}
.avatar.xl{width:84px;height:84px;border-width:3px}

/* ---------- 卡片 ---------- */
.card{
  background:var(--card);border:1px solid #ffeaf1;border-radius:var(--r-lg);padding:18px;margin:14px 0;
  box-shadow:var(--sh-md);backdrop-filter:blur(10px);
}
.card h2{font-size:19px;margin-bottom:8px;letter-spacing:.3px}
.sec-title{
  font-size:15px;font-weight:700;margin-bottom:12px;
  display:flex;align-items:center;justify-content:space-between;gap:8px;letter-spacing:.3px;
}
.sec-title .more{font-size:12px;color:var(--muted);font-weight:400}
.sec-title button.more{
  border:none;background:#fff0f5;color:var(--pink2);font-family:inherit;
  border-radius:20px;padding:4px 12px;cursor:pointer;
}
.sec-title button.more:active{transform:scale(.94)}

/* ---------- 按钮 ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:7px;
  border:none;cursor:pointer;font-size:15px;font-weight:600;font-family:inherit;
  color:#fff;padding:12px 26px;border-radius:30px;letter-spacing:.5px;
  background:linear-gradient(135deg,#ffa8c0 0%,#fb7fa4 52%,#f26d97 100%);
  box-shadow:0 6px 18px rgba(242,109,151,.28),inset 0 1px 0 rgba(255,255,255,.45);
  transition:transform .16s cubic-bezier(.34,1.56,.64,1),box-shadow .16s;
}
.btn:hover{box-shadow:0 9px 24px rgba(242,109,151,.34),inset 0 1px 0 rgba(255,255,255,.5)}
.btn:active{transform:scale(.965);box-shadow:0 3px 10px rgba(242,109,151,.22)}
.btn:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}
.btn svg{display:block;flex:none}
.btn.ghost{
  background:#fff;color:#e0578a;border:1.5px solid #ffc0d3;
  box-shadow:0 2px 8px rgba(255,143,171,.10);
}
.btn.ghost:hover{background:#fff7fa;border-color:var(--pink2)}
.btn.ghost:active{background:#ffeff4}
.btn.danger{background:#fff;color:#d9414f;border:1.5px solid #f6c6cb;box-shadow:0 2px 8px rgba(217,65,79,.08)}
.btn.danger:hover{background:#fff5f6;border-color:#eb9aa2}
.btn.tiny{padding:7px 14px;font-size:12.5px;border-radius:18px;box-shadow:0 2px 7px rgba(242,109,151,.18)}
.btn.small{padding:9px 18px;font-size:13.5px;border-radius:22px;box-shadow:0 4px 12px rgba(242,109,151,.22)}
.btn.tiny.btn.ghost,.btn.small.btn.ghost,.btn.tiny.btn.danger,.btn.small.btn.danger{box-shadow:none}
.btn.small{padding:9px 16px;font-size:13px;border-radius:22px}
.btn.tiny{padding:6px 13px;font-size:12px;border-radius:18px;box-shadow:none}
.btn.block{display:flex;width:100%;text-align:center}
.btn-row{display:flex;gap:12px;justify-content:center;margin-top:16px;flex-wrap:wrap}
.btn-row .btn{flex:1;max-width:180px}
.link-btn{border:none;background:none;color:var(--muted);font-size:13px;cursor:pointer;font-family:inherit;text-decoration:underline}
.link-btn.danger{color:var(--bad)}

/* ---------- 表单 ---------- */
.form{margin-top:6px}
.form label{display:block;font-size:13px;color:var(--muted);margin:14px 0 6px;letter-spacing:.3px}
.form input,.form textarea,.form select{
  width:100%;border:1px solid var(--line);background:#fff;border-radius:var(--r-md);
  padding:12px 15px;font-size:15.5px;color:var(--ink);outline:none;font-family:inherit;display:block;
}
.form input:focus,.form textarea:focus,.form select:focus{border-color:var(--pink);box-shadow:0 0 0 3px rgba(255,143,171,.16)}
.form textarea{min-height:88px;resize:vertical}
.form .btn{margin-top:16px}
.form-row{display:flex;gap:8px;align-items:center;margin:10px 0}
.form-row input,.form-row select{flex:1;min-width:0;border:1px solid var(--line);background:#fff;border-radius:12px;padding:10px 12px;font-size:14px;font-family:inherit}
.form-row .btn{flex:none;margin:0}
.code-input{text-align:center;letter-spacing:8px;font-size:20px!important;font-weight:700}
.inline-form{display:inline-flex;gap:6px;align-items:center;margin:4px 0}
.inline-form input,.inline-form select{border:1px solid var(--line);background:#fff;border-radius:10px;padding:5px 8px;font-size:13px;font-family:inherit;max-width:160px}
.chk{display:flex;align-items:center;gap:8px;font-size:14px;margin-top:14px}
.chk input{width:16px;height:16px}
.field{margin:12px 0}
.field label{display:block;font-size:13px;color:var(--muted);margin-bottom:6px}
.field input,.field textarea,.field select{width:100%;border:1px solid var(--line);background:#fff;border-radius:14px;padding:12px 14px;font-size:15px;color:var(--ink);outline:none;font-family:inherit}

/* ---------- 提示 ---------- */
.flash,.alert{margin:10px 0;padding:12px 15px;border-radius:var(--r-md);font-size:14px;background:#fff;border:1px solid var(--line);line-height:1.6}
.alert.bad{background:#fff0f1;color:var(--bad);border-color:#ffd0d5}
.alert.ok{background:#eafaf1;color:#1f9d63;border-color:#c6f0da}
.flash.info{background:#fff5f8;color:var(--pink2)}
.flash.ok{background:#eafaf1;color:#1f9d63;border-color:#c6f0da}
.flash.bad,.flash.err{background:#fff0f1;color:var(--bad);border-color:#ffd0d5}
.tip{font-size:12px;color:var(--muted);line-height:1.8;margin-top:14px}
.tag{display:inline-block;padding:2px 10px;border-radius:20px;background:#f0f0f2;font-size:11.5px;color:#666}
.tag.ok{background:#e8f8ee;color:#2b9e5f}
.tag.bad{background:#ffeaea;color:var(--bad)}
.badge{display:inline-block;font-size:11px;padding:2px 9px;border-radius:20px;background:#fff0f5;color:var(--pink2);border:1px solid var(--line)}

/* ---------- 首页小家卡 ---------- */
.love-card{text-align:center;padding:24px 16px 20px}
.pair-avatars{display:flex;align-items:center;justify-content:center;gap:14px;margin-bottom:10px}
.link-heart{font-size:22px;animation:beat 1.6s infinite}
.invite-box{
  margin:14px auto 0;padding:10px 12px;border:1px dashed var(--pink);border-radius:16px;
  background:linear-gradient(135deg,#fff0f5,#f6ecff);font-size:13px;color:var(--muted);
  display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;
}
.invite-box .code,.code{
  font-size:22px;letter-spacing:5px;font-weight:800;color:var(--pink2);letter-spacing:6px;
}
.hero{
  position:relative;overflow:hidden;border-radius:var(--r-xl);padding:24px;color:#fff;margin:8px 0 14px;
  background:linear-gradient(135deg,#ff9ebb 0%,#ff6f91 45%,#c77dff 100%);
  box-shadow:var(--sh-lg);
}
.hero .days{font-size:48px;font-weight:800;line-height:1.1;margin:6px 0}

/* ---------- 统计 ---------- */
.grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px}
.stat-row,.grid-2{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;text-align:center}
.grid-2{grid-template-columns:1fr 1fr;text-align:left;gap:14px}
.stat{background:#fff;border-radius:14px;padding:14px;text-align:center;box-shadow:0 2px 10px rgba(0,0,0,.04)}
.stat b,.stat-row b{display:block;font-size:22px;color:var(--pink2)}
.stat span,.stat-row span{font-size:12px;color:var(--muted)}

/* ---------- 打卡 ---------- */
.checkin-row{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.checkin{
  border:1px solid var(--line);background:#fff;border-radius:16px;padding:12px 4px;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;gap:2px;font-family:inherit;transition:.2s;
}
.checkin .ico{font-size:22px}
.checkin .label{font-size:12px;font-weight:600}
.checkin .who{font-size:10px;color:var(--muted)}
.checkin.on{background:linear-gradient(135deg,#ffe3ef,#fff0f8);border-color:var(--pink);transform:translateY(-2px)}
.checkin:active{transform:scale(.95)}
/* 已达每日上限：置灰不可点，但仍能看到已完成的状态 */
.checkin.full{
  cursor:not-allowed;opacity:.72;transform:none;
  background:linear-gradient(135deg,#ffe3ef,#fff0f8);border-color:var(--pink);
}
.checkin.full:active{transform:none}
.checkin:disabled{cursor:not-allowed}
/* 次数进度更醒目一点 */
.checkin.on .who{color:var(--pink2);font-weight:600}

/* ---------- 心愿 ---------- */
.progress-line{height:8px;border-radius:8px;background:#ffe9f0;overflow:hidden;margin:4px 0 8px}
.progress-line .bar{height:100%;background:linear-gradient(90deg,var(--pink),var(--purple));transition:width .4s}
.wish-list li{display:flex;align-items:flex-start;gap:10px;padding:11px 0;border-bottom:1px dashed var(--line)}
.wish-list li:last-child{border-bottom:none}
.wish-main{flex:1;min-width:0}
.wish-title{font-size:15px;font-weight:600;word-break:break-word}
.wish-note{font-size:13px;color:var(--muted);word-break:break-word}
.wish-list li.done .wish-title{text-decoration:line-through;color:var(--muted)}
.check{
  width:24px;height:24px;flex:none;border-radius:50%;border:2px solid var(--pink);background:#fff;
  color:#fff;font-size:13px;line-height:1;cursor:pointer;margin-top:2px;font-family:inherit;padding:0;
}
.wish-list li.done .check{background:var(--ok);border-color:var(--ok)}
.del{border:none;background:none;color:#d9c3ca;cursor:pointer;font-size:12px;flex:none;font-family:inherit}
.del:hover{color:var(--bad)}

/* ---------- 留言 ---------- */
.msg{display:flex;gap:10px;align-items:flex-start}
.msg-list li{display:flex;gap:10px;align-items:flex-start;padding:10px 0}
.msg-list li.mine{flex-direction:row-reverse;text-align:right}
.msg-list li.mine .bubble{background:linear-gradient(135deg,var(--pink),var(--pink2));color:#fff}
.msg-list li.mine .bubble .muted{color:rgba(255,255,255,.85)}
.bubble{background:#fff;border:1px solid var(--line);border-radius:16px;padding:10px 14px;max-width:78%}
.bubble p{font-size:14px;word-break:break-word;text-align:left}
.msg-list li.mine .del{order:-1}

/* ---------- 相册 ---------- */
.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
.cell{margin:0;border-radius:16px;overflow:hidden;background:#fff;border:1px solid var(--line)}
.cell img{width:100%;height:150px;object-fit:cover;display:block}
.cell figcaption{font-size:12px;padding:7px 9px;display:flex;justify-content:space-between;gap:6px;align-items:center}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.chip{background:#fff0f5;border:1px solid var(--line);border-radius:20px;padding:3px 10px;font-size:12px;color:var(--pink2)}

/* ---------- 纪念日 / 动态 ---------- */
.anni-list li{display:flex;align-items:center;justify-content:space-between;padding:11px 0;border-bottom:1px dashed var(--line)}
.anni-list li:last-child{border-bottom:none}
.anni-left{flex:1;min-width:0}
.anni-title{font-size:15px;font-weight:600}
.event-list li{font-size:13.5px;padding:9px 0;border-bottom:1px dashed var(--line);color:#6b5460;line-height:1.6}
.event-list li:last-child{border-bottom:none}

/* ---------- 步骤 ---------- */
.steps{counter-reset:s;margin:10px 0 0;padding:0}
.steps li{counter-increment:s;position:relative;padding-left:34px;margin:12px 0;font-size:14px}
.steps li:before{
  content:counter(s);position:absolute;left:0;top:0;width:24px;height:24px;border-radius:50%;
  background:var(--pink);color:#fff;font-size:13px;display:flex;align-items:center;justify-content:center;font-weight:700;
}

/* ---------- 底部导航 ---------- */
.tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:40;display:flex;
  background:rgba(255,255,255,.96);backdrop-filter:blur(18px);border-top:1px solid var(--line);
  padding:7px 2px calc(7px + env(safe-area-inset-bottom));
  box-shadow:0 -4px 18px rgba(255,143,171,.10);
}
.tabbar a{
  flex:1;text-align:center;font-size:11px;color:var(--muted);padding:4px 0 3px;
  transition:color .18s;letter-spacing:0;position:relative;
}
.tabbar a span{display:block;font-size:19px;margin-bottom:3px;transition:transform .2s;line-height:1.1}
.tabbar a:active{opacity:.6}
.tabbar a.on{color:var(--pink2);font-weight:700}
.tabbar a.on span{transform:translateY(-3px) scale(1.18)}
.tabbar a.on:after{
  content:'';position:absolute;left:50%;transform:translateX(-50%);
  bottom:-2px;width:18px;height:3px;border-radius:3px;
  background:linear-gradient(90deg,var(--pink),var(--pink2));
}

/* 首页聊天入口 */
.chat-entry{
  display:flex;align-items:center;gap:10px;width:100%;font-weight:400;
}
.chat-entry-ico{font-size:22px;flex:none}
.chat-entry-main{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.35}
.chat-entry-main b{font-size:15px;font-weight:600}
.chat-entry-main .small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-entry .dot{position:static;flex:none;margin:0}
.chat-entry-go{flex:none;color:var(--muted);font-size:18px}

/* ---------- 聊天 ---------- */
.chat-page{
  display:flex;flex-direction:column;
  height:calc(100vh - 178px);min-height:300px;
}
@supports (height:100dvh){ .chat-page{height:calc(100dvh - 178px)} }

.chat-header{
  display:flex;align-items:center;gap:10px;flex:none;
  padding:10px 14px;margin:8px 0 10px;border-radius:18px;
  background:rgba(255,255,255,.92);border:1px solid #ffeaf1;
  box-shadow:0 6px 18px rgba(255,143,171,.12);backdrop-filter:blur(8px);
}
.chat-peer{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.3}
.chat-peer b{font-size:15px}
.chat-back{font-size:13px;color:var(--pink2);flex:none}

.chat-scroll{
  flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;
  padding:4px 2px 10px;
}
.chat-empty{text-align:center;padding:46px 16px;color:var(--muted)}
.chat-empty p{margin:3px 0;font-size:13.5px}

/* 空状态 / 标题插图：替换原来的大 emoji，视觉更精致 */
.empty-art{
  width:132px;height:132px;margin:0 auto 14px;display:flex;
  align-items:center;justify-content:center;
}
.empty-art img{
  width:100%;height:100%;object-fit:contain;
  filter:drop-shadow(0 8px 18px rgba(255,143,171,.22));
  animation:floatArt 3.6s ease-in-out infinite;
}
@keyframes floatArt{
  0%,100%{transform:translateY(0)}
  50%{transform:translateY(-7px)}
}
@media (prefers-reduced-motion:reduce){
  .empty-art img{animation:none}
}
/* 列表里的空状态用小号插图，不抢戏 */
.empty-art.small-art{width:96px;height:96px;margin:0 auto 10px}
.empty .empty-art.small-art img{animation:none}

.chat-day{text-align:center;margin:12px 0 8px}
.chat-day{display:block;font-size:11px;color:var(--muted);
  background:rgba(255,255,255,.82);border-radius:20px;padding:3px 14px;width:fit-content;
  margin:14px auto 8px;box-shadow:var(--sh-sm)}

.chat-row{display:flex;gap:8px;align-items:flex-start;margin:10px 0}
.chat-row.mine{flex-direction:row-reverse}
.chat-avatar{width:34px;height:34px;flex:none}
.chat-body{max-width:74%;min-width:0;display:flex;flex-direction:column;gap:4px}
.chat-row.mine .chat-body{align-items:flex-end}

.chat-bubble{
  background:#fff;border:1px solid var(--line);border-radius:18px 18px 18px 6px;
  padding:10px 14px;box-shadow:var(--sh-sm);word-break:break-word;
}
.chat-row.mine .chat-bubble{
  background:linear-gradient(135deg,#ff9ebb 0%,var(--pink2) 55%,#f95f9e 100%);
  color:#fff;border-color:transparent;
  border-radius:18px 18px 6px 18px;
  box-shadow:0 4px 14px rgba(255,111,145,.28);
}
.chat-bubble p{font-size:15.5px;line-height:1.6;text-align:left;white-space:pre-wrap;word-break:break-word}
.chat-img{max-width:170px;border-radius:14px;display:block;cursor:zoom-in}

.chat-meta{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--muted);padding:0 3px}
.chat-recall{
  border:none;background:none;color:var(--pink2);font-size:11px;cursor:pointer;
  font-family:inherit;padding:0;text-decoration:underline;
}
.chat-read{font-size:11px}
.chat-read.unread{color:var(--muted)}

.chat-recalled{
  font-size:12px;color:var(--muted);background:rgba(255,255,255,.75);
  border-radius:14px;padding:5px 12px;text-align:center;
}
.chat-redo{border:none;background:none;color:var(--pink2);font-size:12px;cursor:pointer;font-family:inherit;text-decoration:underline;padding:0}

.chat-input-bar{
  flex:none;background:rgba(255,255,255,.97);border:1px solid #ffeaf1;border-radius:var(--r-lg);
  padding:8px 8px;box-shadow:0 -4px 18px rgba(255,143,171,.12);backdrop-filter:blur(12px);
}
.chat-input-row{display:flex;align-items:center;gap:7px}
.chat-input-row textarea{
  flex:1;min-width:0;border:1px solid var(--line);border-radius:20px;background:#fff;
  padding:9px 14px;font-size:15px;font-family:inherit;color:var(--ink);
  resize:none;outline:none;max-height:100px;line-height:1.55;height:38px;
}
.chat-input-row textarea:focus{border-color:var(--pink);box-shadow:0 0 0 3px rgba(255,143,171,.16)}

/* 圆形图标按钮：统一粉色系，靠明度与图标区分功能，省出输入框空间 */
.round-btn{
  flex:none;width:40px;height:40px;border-radius:50%;border:none;cursor:pointer;
  display:flex;align-items:center;justify-content:center;font-family:inherit;
  color:#c2557d;background:linear-gradient(145deg,#fff6f9 0%,#ffe6ef 100%);
  box-shadow:0 2px 8px rgba(242,109,151,.14),inset 0 1px 0 rgba(255,255,255,.9);
  transition:transform .16s cubic-bezier(.34,1.56,.64,1),box-shadow .16s;
  padding:0;
}
.round-btn svg{display:block;width:21px;height:21px}
.round-btn:hover{box-shadow:0 4px 12px rgba(242,109,151,.22),inset 0 1px 0 rgba(255,255,255,.9)}
.round-btn:active{transform:scale(.9);box-shadow:0 1px 4px rgba(242,109,151,.18)}
/* 主操作（发送）用实心粉，突出最重要的那一个 */
.round-btn.primary{
  color:#fff;background:linear-gradient(135deg,#ffa8c0 0%,#fb7fa4 55%,#f26d97 100%);
  box-shadow:0 5px 14px rgba(242,109,151,.30),inset 0 1px 0 rgba(255,255,255,.42);
}
.round-btn.primary:hover{box-shadow:0 8px 20px rgba(242,109,151,.36),inset 0 1px 0 rgba(255,255,255,.45)}
.round-btn.primary:active{transform:scale(.9)}
/* 语音按钮按住时的视觉反馈 */
.round-btn.recording{
  background:linear-gradient(135deg,#ffb3c6,#f26d97);color:#fff;
  box-shadow:0 0 0 6px rgba(242,109,151,.18),0 5px 14px rgba(242,109,151,.3);
}
.icon-btn{
  flex:none;width:36px;height:36px;border-radius:50%;border:1px solid var(--line);background:#fff;
  font-size:18px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;
}
.icon-btn:active{transform:scale(.92)}
.send-btn{
  flex:none;display:inline-flex;align-items:center;gap:5px;
  border:none;border-radius:22px;padding:10px 18px;font-size:14.5px;font-weight:600;
  font-family:inherit;color:#fff;cursor:pointer;letter-spacing:.5px;
  background:linear-gradient(135deg,#ffa8c0 0%,#fb7fa4 55%,#f26d97 100%);
  box-shadow:0 5px 14px rgba(242,109,151,.30),inset 0 1px 0 rgba(255,255,255,.42);
  transition:transform .16s cubic-bezier(.34,1.56,.64,1),box-shadow .16s;
}
.send-btn svg{display:block;width:16px;height:16px}
.send-btn:hover{box-shadow:0 8px 20px rgba(242,109,151,.36)}
.send-btn:active{transform:scale(.95)}
.send-btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}

/* icon-btn：通用小图标按钮，风格与 round-btn 一致 */
.icon-btn{
  flex:none;width:38px;height:38px;border-radius:50%;border:none;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  font-family:inherit;color:#c2557d;
  background:linear-gradient(145deg,#fff6f9 0%,#ffe6ef 100%);
  box-shadow:0 2px 8px rgba(242,109,151,.14),inset 0 1px 0 rgba(255,255,255,.9);
  transition:transform .16s;
}
.icon-btn svg{display:block;width:20px;height:20px}
.icon-btn:active{transform:scale(.9)}

.chat-emoji-panel{
  display:grid;grid-template-columns:repeat(8,1fr);gap:2px;
  max-height:150px;overflow-y:auto;padding:6px 2px 10px;border-bottom:1px dashed var(--line);margin-bottom:6px;
}
.emoji{
  border:none;background:none;font-size:21px;cursor:pointer;padding:5px 0;border-radius:10px;line-height:1;
}
.emoji:active{background:#ffe9f0;transform:scale(.9)}
.emoji-strip{
  display:flex;flex-wrap:wrap;gap:2px;margin:8px 0 2px;
  padding:6px 4px;background:#fffafb;border:1px dashed var(--line);border-radius:14px;
}
.emoji-strip .emoji{width:32px;height:32px;font-size:19px}

/* 图片查看 */
.lightbox{
  position:fixed;inset:0;z-index:100;background:rgba(30,20,26,.92);
  display:flex;align-items:center;justify-content:center;
}
.lightbox[hidden]{display:none}
.lightbox img{max-width:92%;max-height:86%;border-radius:12px}
.lightbox-close{
  position:absolute;top:18px;right:18px;width:38px;height:38px;border-radius:50%;
  border:none;background:rgba(255,255,255,.18);color:#fff;font-size:24px;cursor:pointer;
}

/* 导航未读红点 */
.tab-chat span{position:relative}
.tab-chat .dot{
  position:absolute;top:-2px;right:50%;margin-right:-22px;
  min-width:16px;height:16px;line-height:16px;padding:0 4px;border-radius:9px;
  background:#ff3b52;color:#fff;font-size:10px;font-style:normal;font-weight:700;text-align:center;
  box-shadow:0 0 0 2px rgba(255,255,255,.9);
}

/* ---------- 情侣广场 ---------- */
.plaza-hero{display:flex;align-items:center;gap:12px;margin:8px 0 12px}
.plaza-hero-emoji{font-size:34px;flex:none}
.plaza-hero-main{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.35}
.plaza-hero-main b{font-size:16px}
.plaza-hero .badge{flex:none}

.plaza-form{display:flex;flex-direction:column;gap:8px}
.plaza-form textarea{
  width:100%;border:1px solid var(--line);border-radius:16px;background:#fff;
  padding:11px 13px;font-size:15px;font-family:inherit;color:var(--ink);
  resize:none;outline:none;min-height:76px;max-height:140px;line-height:1.55;
}
.plaza-form textarea:focus{border-color:var(--pink);box-shadow:0 0 0 3px rgba(255,143,171,.14)}
.plaza-send-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px}
.plaza-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.plaza-tip{font-size:11px;margin-top:8px;text-align:left}
/* 图片 / 视频选择按钮：图标 + 文字 + 不同配色，一眼可分 */
.pick-btn{
  flex:none;display:inline-flex;align-items:center;gap:5px;cursor:pointer;
  padding:7px 13px;border-radius:20px;font-size:13px;font-weight:600;
  border:1px solid transparent;transition:transform .15s;user-select:none;
}
.pick-btn:active{transform:scale(.94)}
.pick-ico{font-size:16px;line-height:1}
.pick-text{font-size:13px}
.pick-btn.photo{
  background:linear-gradient(135deg,#fff0f5,#ffe3ef);
  color:var(--pink2);border-color:#ffc9dc;
}
.pick-btn.video{
  background:linear-gradient(135deg,#f3e8ff,#e6dbff);
  color:#7b4bc4;border-color:#d9c7f5;
}
.pick-btn.voice{
  background:linear-gradient(135deg,#e6f7ff,#d6efff);
  color:#1a7fb5;border-color:#b8e2f7;
}

.plaza-tip{flex:1;min-width:100px;font-size:11px}
.plaza-reply-hint{
  display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);
  background:#fff5f8;border:1px dashed var(--line);border-radius:12px;padding:6px 10px;
}
.plaza-reply-hint button{
  border:none;background:none;color:var(--pink2);font-size:12px;cursor:pointer;
  font-family:inherit;text-decoration:underline;padding:0;
}

.plaza-list{display:flex;flex-direction:column;gap:2px}
.plaza-item{
  padding:14px 0;border-bottom:1px dashed var(--line);
}
.plaza-item:last-child{border-bottom:none}
.plaza-head{display:flex;align-items:center;gap:9px;margin-bottom:8px}
.plaza-head .avatar{width:36px;height:36px}
.plaza-who{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.3}
.plaza-couple{font-size:14px;font-weight:700;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.plaza-user{font-size:11px;color:var(--pink2)}
.plaza-time{font-size:11px;color:var(--muted);flex:none}

.plaza-quote{
  font-size:12px;color:var(--muted);background:#fff7fa;border-left:3px solid var(--pink);
  border-radius:0 10px 10px 0;padding:6px 10px;margin-bottom:8px;word-break:break-word;
}
.plaza-body{font-size:15px;line-height:1.6;word-break:break-word}
.plaza-body p{white-space:pre-wrap}
.plaza-img{max-width:100%;max-height:320px;border-radius:14px;display:block;margin-top:6px;cursor:zoom-in}
.plaza-video{width:100%;max-height:320px;border-radius:14px;display:block;margin-top:6px;background:#000}

.plaza-ops{display:flex;align-items:center;gap:14px;margin-top:9px;padding-left:2px}
.plaza-ops button{
  border:none;background:none;font-family:inherit;font-size:12px;color:var(--muted);
  cursor:pointer;padding:0;display:flex;align-items:center;gap:4px;
}
.plaza-ops button:active{opacity:.6}
.plaza-like .heart{font-size:15px;line-height:1}
.plaza-like.on{color:var(--pink2);font-weight:700}
.plaza-like.on .heart{animation:beat .5s}
.plaza-del{margin-left:auto}

/* ---------- 语音通话 ---------- */
.call-hero{text-align:center;padding:6px 0 14px}
.call-hero-emoji{font-size:46px;line-height:1;margin-bottom:6px}
.call-hero b{display:block;font-size:17px;margin-bottom:4px}
.call-hero span{display:block}

.call-tabs{display:flex;gap:8px;margin-bottom:14px}
.call-tab{
  flex:1;border:1px solid var(--line);background:#fff;border-radius:14px;padding:9px 0;
  font-size:14px;font-family:inherit;color:var(--muted);cursor:pointer;
}
.call-tab.on{background:linear-gradient(135deg,var(--pink),var(--pink2));color:#fff;border-color:transparent;font-weight:600}

.call-code-box{text-align:center;margin-top:14px;padding:14px;border:1px dashed var(--pink);border-radius:18px;background:linear-gradient(135deg,#fff0f5,#f6ecff)}
.call-code{
  font-size:34px;letter-spacing:8px;font-weight:800;color:var(--pink2);margin:8px 0 12px;
}
.call-code-box .btn-row{margin-top:6px}

.call-peer{text-align:center;padding:20px 6px 10px}
.call-avatar-wrap{
  position:relative;width:96px;height:96px;margin:0 auto 12px;border-radius:50%;
  background:linear-gradient(135deg,var(--pink),var(--purple));
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 10px 26px rgba(255,111,145,.32);
}
.call-avatar-emoji{font-size:44px}
.call-ring{
  position:absolute;inset:-8px;border-radius:50%;border:3px solid var(--pink);
  animation:callring 1.6s ease-out infinite;
}
@keyframes callring{
  0%{transform:scale(.9);opacity:.9}
  100%{transform:scale(1.35);opacity:0}
}
.call-peer b{display:block;font-size:18px;margin-bottom:3px}
.call-timer{display:block;margin-top:8px;font-size:15px;color:var(--pink2);font-weight:700;letter-spacing:1px}

.call-controls{display:flex;justify-content:center;gap:26px;padding:16px 0 6px}
.ctrl-btn{
  width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;font-size:22px;
  background:#fff;box-shadow:0 6px 16px rgba(0,0,0,.08);font-family:inherit;
}
.ctrl-btn:active{transform:scale(.92)}
.ctrl-btn.off{background:#f0f0f2}
.ctrl-btn.hangup{background:linear-gradient(135deg,#ff6b7f,#e14b5a);color:#fff;font-size:24px;box-shadow:0 6px 18px rgba(225,75,90,.35)}

/* ---------- 语音消息 ---------- */
.voice-msg{
  display:inline-flex;align-items:center;gap:9px;cursor:pointer;
  padding:9px 15px;border-radius:22px;min-width:124px;max-width:230px;
  background:#fff;border:1px solid var(--line);user-select:none;
  transition:background .18s;box-shadow:var(--sh-sm);
}
.voice-msg:active{background:#fff5f8}
.voice-msg.mine{background:rgba(255,255,255,.22);border-color:rgba(255,255,255,.45)}
.voice-ico{font-size:15px;flex:none;line-height:1}
.voice-wave{display:flex;align-items:center;gap:2px;flex:1;height:18px;overflow:hidden}
.voice-wave i{
  display:block;width:2px;height:5px;border-radius:2px;background:#ffb3c8;opacity:.75;
  transition:height .2s;
}
.voice-msg.mine .voice-wave i{background:rgba(255,255,255,.85)}
.voice-msg.playing .voice-wave i{animation:wave 1s ease-in-out infinite}
.voice-wave i:nth-child(2){height:9px}
.voice-wave i:nth-child(3){height:14px}
.voice-wave i:nth-child(4){height:8px}
.voice-wave i:nth-child(5){height:16px}
.voice-wave i:nth-child(6){height:11px}
.voice-wave i:nth-child(7){height:6px}
.voice-wave i:nth-child(8){height:15px}
.voice-wave i:nth-child(9){height:9px}
.voice-wave i:nth-child(10){height:12px}
.voice-wave i:nth-child(11){height:7px}
.voice-wave i:nth-child(12){height:14px}
.voice-wave i:nth-child(13){height:10px}
.voice-wave i:nth-child(14){height:6px}
.voice-wave i:nth-child(15){height:11px}
.voice-wave i:nth-child(2){animation-delay:.08s}
.voice-wave i:nth-child(3){animation-delay:.16s}
.voice-wave i:nth-child(4){animation-delay:.24s}
.voice-wave i:nth-child(5){animation-delay:.32s}
.voice-wave i:nth-child(6){animation-delay:.4s}
.voice-wave i:nth-child(7){animation-delay:.48s}
.voice-wave i:nth-child(8){animation-delay:.56s}
@keyframes wave{
  0%,100%{transform:scaleY(1)}
  50%{transform:scaleY(1.9)}
}
.voice-sec{font-size:12px;flex:none;color:var(--muted)}
.voice-msg.mine .voice-sec{color:rgba(255,255,255,.9)}

/* 录音层 */
.rec-layer{
  position:fixed;inset:0;z-index:90;display:flex;align-items:center;justify-content:center;
  background:rgba(40,26,34,.45);backdrop-filter:blur(2px);
}
.rec-layer[hidden]{display:none}
.rec-box{
  background:#fff;border-radius:22px;padding:26px 34px;text-align:center;
  box-shadow:0 16px 44px rgba(0,0,0,.24);min-width:170px;
}
.rec-mic{font-size:44px;line-height:1;margin-bottom:8px;animation:pulseMic 1.1s ease-in-out infinite}
@keyframes pulseMic{0%,100%{transform:scale(1)}50%{transform:scale(1.18)}}
.rec-time{font-size:26px;font-weight:800;color:var(--pink2);letter-spacing:1px}
.rec-hint{font-size:12px;color:var(--muted);margin-top:6px}
.rec-layer.cancel .rec-box{background:#fff0f0}
.rec-layer.cancel .rec-mic{animation:none;transform:scale(.9)}
.rec-layer.cancel .rec-hint{color:#e14b5a;font-weight:700}

/* ---------- 表情包面板 ---------- */
.emoji-mask{position:fixed;inset:0;z-index:70;background:rgba(40,26,34,.35)}
.emoji-mask[hidden]{display:none}
.emoji-mask.open{display:block}

.emoji-sheet{
  position:fixed;left:0;right:0;bottom:0;z-index:80;
  background:#fff;border-radius:20px 20px 0 0;
  box-shadow:0 -8px 32px rgba(0,0,0,.18);
  max-height:58vh;display:flex;flex-direction:column;
  padding-bottom:env(safe-area-inset-bottom);
  animation:sheetUp .22s ease;
}
.emoji-sheet[hidden]{display:none}
.emoji-sheet.open{display:flex}
@keyframes sheetUp{from{transform:translateY(100%)}to{transform:translateY(0)}}

.emoji-sheet-bar{
  display:flex;align-items:center;justify-content:space-between;
  padding:11px 16px 7px;border-bottom:1px solid var(--line);flex:none;
}
.emoji-sheet-title{font-size:14px;font-weight:700}
.emoji-sheet-close{
  border:none;background:none;color:var(--pink2);font-size:13px;
  font-family:inherit;cursor:pointer;padding:0;
}

.emoji-tabs{
  display:flex;gap:6px;overflow-x:auto;flex:none;
  padding:9px 12px;border-bottom:1px dashed var(--line);
  -webkit-overflow-scrolling:touch;
}
.emoji-tabs::-webkit-scrollbar{display:none}
.emoji-tab{
  flex:none;border:1px solid var(--line);background:#fff;border-radius:16px;
  padding:5px 13px;font-size:13px;font-family:inherit;color:var(--muted);cursor:pointer;
}
.emoji-tab.on{background:linear-gradient(135deg,var(--pink),var(--pink2));color:#fff;border-color:transparent;font-weight:600}

.emoji-pages{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch}
.emoji-page{display:none;grid-template-columns:repeat(8,1fr);gap:2px;padding:10px 8px 18px}
.emoji-page.on{display:grid}
.emoji-page .emoji{
  border:none;background:none;font-size:24px;cursor:pointer;padding:6px 0;
  border-radius:10px;line-height:1;
}
.emoji-page .emoji:active{background:#ffe9f0;transform:scale(.88)}
@media (max-width:360px){
  .emoji-page{grid-template-columns:repeat(6,1fr)}
  .emoji-page .emoji{font-size:22px}
}

/* 语音播放失败兜底 */
.voice-fallback{
  display:inline-block;margin-left:8px;font-size:12px;color:var(--pink2);
  text-decoration:underline;
}

/* ---------- toast ---------- */
.toast{
  position:fixed;left:50%;bottom:88px;transform:translate(-50%,20px);opacity:0;pointer-events:none;
  background:rgba(74,52,64,.94);color:#fff;padding:10px 18px;border-radius:22px;font-size:13px;
  transition:.28s;z-index:60;max-width:80%;text-align:center;
}
.toast.show{opacity:1;transform:translate(-50%,0)}

.pulse{animation:pulse .8s ease}
@keyframes pulse{0%{background:#fff6f9}50%{background:#ffe6ef}100%{background:transparent}}

/* ---------- 表格（后台通用） ---------- */
.table{width:100%;border-collapse:collapse;font-size:13px}
.table th,.table td{padding:8px 6px;border-bottom:1px solid #f0f0f2;text-align:left;vertical-align:middle}
.table th{color:#888;font-weight:500}
table.mini{width:100%;border-collapse:collapse;font-size:13px}
table.mini th,table.mini td{padding:8px 6px;border-bottom:1px solid var(--line);text-align:left}
.scroll{overflow-x:auto}

@media (max-width:520px){
  .grid-4{grid-template-columns:repeat(2,1fr)}
  .grid-2{grid-template-columns:1fr}
  .pair-avatars{gap:10px}
}

@media (max-width:360px){
  .tabbar a{font-size:10px}
  .tabbar a span{font-size:18px}
  .app{padding:0 10px 96px}
}


/* ---------- 后台登录页 ---------- */
.admin-login-wrap{
  max-width:400px;margin:6vh auto 0;padding:0 14px;
}
.admin-login-card{
  background:var(--card);border:1px solid #ffeaf1;border-radius:var(--r-xl);
  padding:28px 24px;box-shadow:var(--sh-lg);backdrop-filter:blur(10px);
}
.admin-login-head{text-align:center;margin-bottom:22px}
.admin-login-logo{
  width:64px;height:64px;margin:0 auto 12px;border-radius:50%;
  background:linear-gradient(135deg,#fff0f5,#f6ecff);
  display:flex;align-items:center;justify-content:center;
  box-shadow:var(--sh-md);font-size:30px;
}
.admin-login-head h1{font-size:20px;letter-spacing:1px;margin-bottom:4px}
.admin-login-tip{
  margin-top:18px;font-size:12px;color:var(--muted);text-align:center;line-height:1.7;
}
