/* ==========================================================================
   后台通用样式（登录页 / 账号管理）
========================================================================== */
*{margin:0;padding:0;box-sizing:border-box}
body{background:var(--bg,#0b0b10);color:var(--fg,#e8e8f0);
  font-family:"PingFang SC","Microsoft YaHei","Hiragino Sans GB",sans-serif;
  font-size:14px;line-height:1.6}
a{color:var(--accent2,#ff87b0);text-decoration:none}
a:hover{color:#ffb0c4}

/* ---------------- 登录页 ---------------- */
.login-body{min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 50% 30%,#1c1018,#06050a 70%);padding:20px}
.login-card{width:100%;max-width:380px;background:linear-gradient(180deg,var(--panel1,#1a0a14),var(--inpBg,#120810));
  border:1px solid var(--panelLine,#3a1a2c);border-radius:18px;padding:30px 26px;
  box-shadow:0 20px 60px rgba(0,0,0,.6)}
.login-logo{font-size:42px;text-align:center;margin-bottom:6px}
.login-card h1{font-size:19px;text-align:center;letter-spacing:1px;
  background:linear-gradient(90deg,#FFE9C0,#ff7820);-webkit-background-clip:text;
  background-clip:text;color:transparent}
.login-sub{font-size:12px;color:var(--muted,#8c7c88);text-align:center;margin-bottom:20px}
.login-card label{display:block;font-size:12px;color:var(--label,#bda8b4);margin:12px 0 5px}
.login-card input{width:100%;padding:11px 12px;border-radius:9px;
  border:1px solid var(--inpLine,#3e2638);background:var(--inpBg,#120810);color:var(--inpFg,#eaeaf5);font-size:14px;outline:none}
.login-card input:focus{border-color:var(--accent,#ff6096)}
.login-card button{margin-top:20px}
.login-hint{margin-top:5px;font-size:11px;color:var(--tip,#7c6a74);text-align:left;line-height:1.5}
.login-tip{margin-top:18px;font-size:11px;color:var(--tip,#7c6a74);text-align:center;line-height:1.8}
.login-tip code{background:#241018;padding:1px 5px;border-radius:4px;color:var(--gt,#c98fa8)}
.alert{padding:9px 12px;border-radius:8px;font-size:12px;margin-bottom:14px}
.alert.err{background:#2a1018;border:1px solid #6a2038;color:#ff9ab0}
.alert.ok{background:#0f1a10;border:1px solid #2a6a38;color:#8fd89a}
button{width:100%;padding:10px;border-radius:10px;border:none;cursor:pointer;
  font-size:14px;font-family:inherit;background:var(--btnBg,#2a1a26);
  /* ★ 字色必须跟着主题走 ★
     以前写死 color:#dcdcf0（浅灰白）。深色主题下没问题，
     但切到「明亮 / 米黄 / 薄荷」时按钮底变成浅色（--btnBg #efe9f4），
     浅底配浅字 —— 「取消」两个字几乎看不见。
     改用 --btnFg（每个主题都定义了配套字色）。 */
  color:var(--btnFg,#dcdcf0);transition:.15s}
button:hover{background:var(--btnHover,#3a2434)}
button.pri{background:linear-gradient(135deg,var(--accent2,#ff87b0),#d4205a);color:#fff;font-weight:700}
button.pri:hover{filter:brightness(1.08)}

/* ---------------- 顶栏 ---------------- */
.topbar{display:flex;align-items:center;gap:16px;padding:0 20px;height:56px;
  background:linear-gradient(90deg,#1e0c18,#170a12);border-bottom:1px solid var(--panelLine,#3a1a2c);
  position:sticky;top:0;z-index:50}
.topbar .brand{font-weight:700;letter-spacing:1px;font-size:15px;
  background:linear-gradient(90deg,#FFE9C0,#ff7820);-webkit-background-clip:text;
  background-clip:text;color:transparent;white-space:nowrap}
.topbar .brand span{font-size:11px;color:var(--muted,#8c7c88);-webkit-text-fill-color:var(--muted,#8c7c88);
  background:none;font-weight:400}
.topbar nav{display:flex;gap:6px;margin-left:auto;flex-wrap:wrap}
.topbar nav a{padding:8px 12px;border-radius:9px;font-size:13px;color:#c8a8b6;
  background:var(--btnBg,#2a1a26);border:1px solid var(--inpLine,#3e2638);white-space:nowrap;line-height:1.2}
.topbar nav a:hover{background:#3a2434;color:#ffd0de}
.topbar nav a.on{background:linear-gradient(135deg,var(--accent2,#ff87b0),#d4205a);color:#fff;
  border-color:#d4205a;font-weight:700}
.topbar nav a.out{color:#ff9ab0}
.topbar .who{font-size:12px;color:var(--muted,#8c7c88);white-space:nowrap}

/* ---------------- 内容 ---------------- */
.wrap{max-width:1500px;margin:0 auto;padding:20px 16px 60px}
/* 只有「主播列表」这一张表列多，单独给它更宽的容器；
   其余卡片保持较窄的阅读宽度（一行太长反而难读）。 */
.wrap.wide{max-width:1720px}
/* 主播列表有 13 列，卡片放宽到 1720 仍可能要横向滚。
   给「有效期 / 权限」这两组按钮限制宽度强制换行，
   表格总宽能从 ~1590 压到 1330 以内，常见桌面宽度下不用滚。 */
/* :not(.lcards) —— 卡片里有效期字段有整行空间，续费按钮不该被压成 132px 竖排 */
.card.wide .tbl:not(.lcards) .exp-btns{max-width:132px}
/* :not(.lcards) —— 卡片化后的表操作列要占满整行横排按钮，不能再限 150px */
.card.wide .tbl:not(.lcards) .ops{white-space:normal;max-width:150px}
.card.wide .chip{padding:3px 6px;font-size:10px;margin:2px 2px 2px 0}
.card{background:linear-gradient(180deg,#170c14,var(--inpBg,#120810));border:1px solid #36203a;
  border-radius:14px;padding:18px;margin-bottom:16px}
.card h2{font-size:15px;color:#ffd0de;margin-bottom:14px;display:flex;align-items:center;gap:8px}
.card h2 .count{font-size:12px;background:#7a1f3d;color:#fff;padding:1px 9px;
  border-radius:20px;font-weight:400}

.grid-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
.grid-form .full{grid-column:1/-1}
.grid-form .full button{max-width:220px}
/* 同一个表单里，有的字段带说明文字（标签两行高）、有的不带（一行高），
   并排摆放时输入框就高低不齐 —— 实测「名称/称呼」比旁边矮 18px。
   给标签一个统一的最小高度，把所有输入框顶到同一条水平线上。 */
.grid-form label{display:block;font-size:12px;color:var(--label,#bda8b4);margin-bottom:4px;min-height:36px}
.grid-form .mini{display:block;font-size:11px;color:var(--tip,#7c6a74)}
.grid-form input,.grid-form select,.grid-form textarea{width:100%;padding:9px 10px;border-radius:8px;
  border:1px solid var(--inpLine,#3e2638);background:var(--inpBg,#120810);color:var(--inpFg,#eaeaf5);font-size:14px;outline:none}
.grid-form input:focus,.grid-form select:focus,.grid-form textarea:focus{border-color:var(--accent,#ff6096)}
/* 多行文本：等宽字体方便对齐「|」和「==」分隔的行 */
.grid-form textarea{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;
  line-height:1.7;resize:vertical;min-height:76px}

.msg{margin-top:10px;font-size:12px;min-height:18px}
.msg.ok{color:#8fd89a}
.msg.err{color:#ff9ab0}

/* ---------------- 表格 ---------------- */
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.scroll-hint{display:none;font-size:11px;color:var(--tip,#7c6a74);margin:0 0 8px}
.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:13px;min-width:820px}
color:var(--gt,#c98fa8);font-weight:600;font-size:12px;
  border-bottom:1px solid var(--panelLine,#3a1a2c);white-space:nowrap}
.tbl td{padding:8px 9px;border-bottom:1px solid #241018;vertical-align:middle}
.tbl tr:hover td{background:#180d15}
.tbl .empty{text-align:center;color:var(--tip,#7c6a74);padding:26px}
.tbl .nn{color:#ffd0de;font-weight:600}
.tbl .uu{font-size:11px;color:var(--muted,#8c7c88)}
.tbl .link{color:#8fd0ff}
.tbl .ver{color:var(--gt,#c98fa8)}
.tbl .bad{color:#ff9ab0}
.tbl .exp .exp-btns{margin-top:5px;display:flex;flex-wrap:wrap;gap:4px}
.tbl .ops{white-space:nowrap}
.chip{display:inline-block;padding:4px 9px;border-radius:6px;font-size:11px;
  background:var(--btnBg,#2a1a26);color:#c8a8b6;border:1px solid var(--inpLine,#3e2638);cursor:pointer;
  margin:2px 3px 2px 0;font-family:inherit}
.chip:hover{background:#7a1f3d;color:#fff}
.chip.bad:hover{background:#8a1028}
.mini-btn{padding:3px 7px;font-size:10px;border-radius:5px;background:var(--btnBg,#2a1a26);
  color:#a8909c;border:1px solid var(--inpLine,#3e2638);cursor:pointer;font-family:inherit;margin-left:4px}
.mini-btn:hover{background:#7a1f3d;color:#fff}
.tag{display:inline-block;padding:2px 8px;border-radius:20px;font-size:11px}
.tag.on{background:#0f2a14;color:#8fd89a;border:1px solid #2a6a38}
.tag.off{background:#2a1018;color:#ff9ab0;border:1px solid #6a2038}


/* 全站功能开关：状态列按钮 */
.chip.mf{padding:6px 12px;font-size:12px}
.chip.mf.bad{background:#2a1018;border-color:#6a2038;color:#ff9ab0}
.tbl th .mini{color:var(--muted,#8c7c88);font-size:10px;font-weight:400;letter-spacing:0}
.tbl td .uu{font-size:11px;color:var(--muted,#8c7c88);line-height:1.5}
.tbl td{font-size:12px}
/* ---------------- 日志 ---------------- */
.logs{max-height:300px;overflow-y:auto;font-size:12px}
.log-row{display:flex;gap:10px;padding:6px 4px;border-bottom:1px solid #1e0e18;
  align-items:baseline;flex-wrap:wrap}
.log-row .t{color:var(--tip,#7c6a74);white-space:nowrap}
.log-row .u{color:#ffd0de;min-width:80px}
.log-row .a{color:var(--gt,#c98fa8);min-width:90px}
.log-row .d{color:#9a8a94;flex:1;min-width:140px}
.empty{color:var(--tip,#7c6a74);font-size:13px;padding:12px}

@media(max-width:720px){
  .topbar{height:auto;padding:10px 12px;flex-direction:column;align-items:stretch;gap:9px}
  .topbar .brand{font-size:14px;text-align:center}
  .topbar nav{margin-left:0;justify-content:space-between;gap:6px}
  .topbar nav a{flex:1 1 0;min-width:0;text-align:center;padding:9px 4px;font-size:12px;
    overflow:hidden;text-overflow:ellipsis}
  .wrap{padding:14px 10px 50px}
  .grid-form{grid-template-columns:1fr}
  .scroll-hint{display:block}
  .card{padding:14px}
  .card h2{font-size:14px}
  .tbl{min-width:760px}
}

/* 风格切换按钮条（账号管理页 / 编辑页共用） */
.themesel{display:flex;flex-wrap:wrap;gap:7px;margin:8px 0 2px}
.themesel button{width:auto;flex:1 1 auto;min-width:96px;padding:9px 8px;font-size:12px;
  border-radius:10px;border:1px solid var(--inpLine,#3e2638);
  background:var(--btnBg,#2a1a26);color:var(--btnFg,#dcdcf0);cursor:pointer}
.themesel button:hover{filter:brightness(1.12)}
.themesel button.on{border:2px solid var(--accent,#ff6096);color:#fff;font-weight:700;
  background:linear-gradient(135deg,var(--accent2,#ff87b0),var(--accent3,#d4205a))}

/* 主播列表：窄屏下整张表改成卡片式，不再靠左右滑动才能看全 */
@media (max-width: 900px){
  /* 关键：基础规则里有 min-width:900px，720px 媒体查询里又改成 760px，
     卡片化时必须把它清零 —— 否则表格仍然 760px 宽，
     在 390 的手机上直接横向溢出（实测 TABLE/TBODY/TR/TD 全部超框）。 */
  .tbl, .tbl thead, .tbl tbody, .tbl tr, .tbl td{display:block;width:100%;min-width:0}
  .tbl thead{display:none}
  .tbl tr{border:1px solid var(--inpLine,#3e2638);border-radius:10px;
    padding:10px;margin:0 0 10px;background:rgba(255,255,255,.02)}
  .tbl td{border:0;padding:5px 8px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .tbl td::before{content:attr(data-l);flex:0 0 92px;color:var(--muted,#a08);font-size:11px}
  .tbl td.nn-cell .nn{font-weight:700}
  .tbl .exp-btns{gap:4px;flex-wrap:wrap}
  .tbl .ops{gap:6px}
  .scroll-hint{display:none}
}
.tbl .pin-tip{letter-spacing:2px;color:var(--muted,#a08)}
/* 管理后台：卡片间距与标题更清爽 */
.card{padding:14px 16px}
.card > h2{margin:0 0 10px;font-size:16px;display:flex;align-items:center;gap:8px}
.grid-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}
.grid-form .full{grid-column:1/-1}


/* 管理后台排版：卡片留白、标题层级、表单网格更整齐 */
.card{padding:14px 16px;margin-bottom:14px;border-radius:12px}
.card > h2{margin:0 0 10px;font-size:16px;display:flex;align-items:center;gap:8px}
.card > h2 .count{margin-left:auto}
.grid-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px}
.grid-form .full{grid-column:1/-1}

/* 管理后台排版优化：
   ① 表头吸顶 —— 主播多了往下翻时仍知道每列是什么
   ② 操作列吸右 —— 横向滚动时「代管设置 / 改密码 / 删除」始终可点
   ③ 斑马纹 + 行悬停 —— 宽表格不容易看串行
   ④ 列数从 15 压到 13（版本 / 更新 / 登录 合并成「动态」） */
.tbl th{position:sticky;top:0;z-index:3;background:var(--panel1,#1a0a14)}
.tbl tbody tr:nth-child(even) td{background:rgba(255,255,255,.025)}
.tbl tbody tr:hover td{background:rgba(255,150,190,.07)}
.tbl td.ops,.tbl th:last-child{position:sticky;right:0;z-index:2;
  background:var(--panel1,#1a0a14);box-shadow:-6px 0 10px rgba(0,0,0,.35)}
.tbl tbody tr:nth-child(even) td.ops{background:#1d0d17}
.tbl tbody tr:hover td.ops{background:#241020}
.tbl .ver-t{font-size:11px;padding:1px 6px;border-radius:8px;
  border:1px solid var(--inpLine,#3e2638);color:var(--gt,#c98fa8)}
.tbl td .mini{display:block;font-size:10px;color:var(--muted,#8c7c88);line-height:1.35}
@media (max-width:900px){
  /* 卡片模式下不需要吸顶 / 吸右 */
  .tbl th,.tbl td.ops,.tbl th:last-child{position:static;box-shadow:none;background:transparent}
  .tbl tbody tr:nth-child(even) td{background:transparent}
}

/* ==========================================================================
   主播列表：筛选 + 代理行标色
   —— 方案 B 之后，代理和主播混在同一张表里，必须能一眼区分
========================================================================== */
.hfilter{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin:0 0 10px}
.hf-chip{
  padding:5px 12px;border-radius:20px;font-size:12px;cursor:pointer;
  border:1px solid var(--inpLine,#3e2638);
  background:var(--inpBg,#120810);color:var(--gt,#c98fa8);
  transition:background .15s,color .15s,border-color .15s;white-space:nowrap;
}
.hf-chip:hover{border-color:#7a1f3d;color:#ffd0de}
.hf-chip.on{background:#7a1f3d;color:#fff;border-color:#7a1f3d;font-weight:600}
.hf-chip.agent.on{background:#2b6cb0;border-color:#2b6cb0}
.hf-chip.soon.on {background:#b7791f;border-color:#b7791f}
.hf-chip.over.on {background:#c53030;border-color:#c53030}
/* 查找框：跟随主题，不写死深色 */
.hf-search{display:inline-flex;align-items:center;gap:4px;margin-left:auto}
.hf-search input{
  width:210px;max-width:52vw;padding:5px 10px;font-size:12px;
  border-radius:20px;border:1px solid var(--inpLine,#3e2638);
  background:var(--inpBg,#120810);color:var(--tx,#ffd9e6);outline:none;
}
.hf-search input:focus{border-color:#7a1f3d}
.hf-search button{
  padding:5px 9px;border-radius:50%;cursor:pointer;font-size:11px;
  border:1px solid var(--inpLine,#3e2638);
  background:var(--inpBg,#120810);color:var(--gt,#c98fa8);
}
@media (max-width:640px){ .hf-search{margin-left:0;width:100%} .hf-search input{width:100%;max-width:none} }

/* 代理行：左侧一道蓝条 + 淡蓝底，跟主播明显区分 */
.tbl tbody tr.is-agent td{border-bottom-color:rgba(43,108,176,.35)}
.tbl tbody tr.is-agent td:first-child{
  box-shadow:inset 3px 0 0 #2b6cb0;
}
.tbl tbody tr.is-agent .nn-cell .nn{color:#9ec5f0}
.badge-agent{
  display:inline-block;margin-left:6px;padding:1px 7px;border-radius:9px;
  font-size:10px;font-weight:600;letter-spacing:0;
  background:rgba(43,108,176,.22);color:#9ec5f0;
  border:1px solid rgba(43,108,176,.55);vertical-align:middle;
}
/* 已过期行：整行压暗 */
.tbl tbody tr.is-over td{opacity:.62}
.tbl tbody tr.hrow.hide{display:none}

/* 时效卡表格：卡名称列不再撑爆
   根因：<input style="width:100%"> 有浏览器默认最小宽度（约 170px），
   表格没有 table-layout:fixed 时压不住，把操作列挤出可视区。 */
#pl_tbl{table-layout:fixed}
#pl_tbl td,#pl_tbl th{overflow:hidden}
#pl_tbl td:first-child{width:auto}
#pl_tbl input[type=text],#pl_tbl input[type=number]{
  min-width:0;max-width:100%;box-sizing:border-box;
}

/* 代卖表格：9 列太挤，加内边距 + 操作按钮允许换行 */
#tbl_agent td{padding:9px 10px;vertical-align:top;line-height:1.5}
#tbl_agent .op{white-space:normal;min-width:150px}
#tbl_agent .op .chip{margin:2px 3px 2px 0}
#tbl_agent .agc{line-height:1.7}

/* ---------------- 创作广场审核列表（两栏排版） ----------------
   以前：标题 + 三个按钮挤在同一行，画面文字再换行显示，
   电脑上留一大片空白，按钮却摊成一条长行。
   现在：左边作品信息 + 画面文字，右边一列按钮；窄屏自动堆叠。 */
.plz-row{display:flex;gap:12px;align-items:flex-start;padding:10px 0;
  border-bottom:1px solid var(--grpLine,#2a1622)}
.plz-row.pend{background:rgba(255,176,90,.05)}
.plz-main{flex:1 1 auto;min-width:0}
.plz-title{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}
.plz-title b{font-size:13px;color:#ffb3d1;word-break:break-all}
.plz-tag{display:inline-block;padding:1px 8px;border-radius:20px;font-size:10px;font-weight:600;
  background:rgba(255,176,90,.16);color:#ffcf6b;border:1px solid rgba(255,176,90,.45)}
.plz-tag.ok{background:rgba(143,216,154,.14);color:#8fd89a;border-color:rgba(143,216,154,.45)}
.plz-txt{display:flex;flex-wrap:wrap;gap:2px 14px;font-size:12px;line-height:1.7;color:#c8a8b8}
.plz-txt.none{color:#8a7080}
.plz-txt span{max-width:100%;word-break:break-all}
.plz-acts{flex:0 0 auto;display:flex;flex-direction:column;gap:4px;align-items:stretch;min-width:96px}
.plz-acts .chip{margin:0;text-align:center;text-decoration:none;white-space:nowrap}
.plz-acts .mini{text-align:center;font-size:10px}
.chip.ok{background:rgba(143,216,154,.14);color:#8fd89a;border-color:rgba(143,216,154,.45)}
.chip.ok:hover{background:#1f6b32;color:#fff}
@media(max-width:640px){
  .plz-row{flex-direction:column;gap:8px}
  .plz-acts{flex-direction:row;flex-wrap:wrap;width:100%;min-width:0}
  .plz-acts .chip{flex:0 0 auto}
}

/* 代卖表格（9 列）在手机上放不下 —— 实测 390 宽下整张表 531px，
   把页面横向撑出 168px。主播列表 .tbl 已有卡片化处理，
   .tb 没有，所以这里让表格自己横向滚动，页面不再被撑宽。 */
@media(max-width:900px){
  .tb{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%}
  .tb thead,.tb tbody{display:table;width:100%;min-width:660px}
}

/* ★ 进货弹窗：必须是不透明的卡片，不能跟着遮罩一起半透明 ★
   以前 #ask_box 只写了定位，没有背景色 —— 弹窗本体是全透明的，
   透过它看到的是半透明黑遮罩，标题和输入框糊在一起根本看不清版面。
   这里给它跟 .elemedit 一致的卡片外观，并让里面的输入控件跟随主题，
   否则浏览器默认的白底黑字在深色面板上会刺眼，在浅色主题下又会没边框。 */
#ask_box{background:var(--cardBg,#1c0c16);color:var(--fg,#e8e8f0);
  border:1px solid var(--cardLine,#6a2a48);border-radius:14px;
  box-shadow:0 14px 44px rgba(0,0,0,.7)}
#ask_box h3{color:var(--fg,#e8e8f0)}
#ask_box input,#ask_box select{
  background:var(--inpBg,#120810);color:var(--inpFg,#eaeaf5);
  border:1px solid var(--inpLine,#3e2638);border-radius:8px;
  padding:8px 10px;font-size:13px;font-family:inherit;outline:none}
#ask_box input:focus,#ask_box select:focus{border-color:var(--accent,#ff6096)}
#ask_box label{color:var(--label,#bda8b4)}
#ask_mask{background:rgba(0,0,0,.62)}

/* 日志里的 SQL 摘要：弱色等宽，跟人话区分开，方便扫读 */
.log-row .sql{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:5px;
  font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;line-height:1.6;
  word-break:break-all;background:rgba(128,128,128,.14);color:var(--muted,#8c7c88)}

/* ---------------- 代卖明细弹窗里的表格 ----------------
   以前没有表头、也没定列宽，几列内容长短不一就挤成一团。
   这里固定布局 + 给足内边距 + 隔行底色，扫一眼就能对上号。 */
.agd-tb{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed;font-size:12px}
.agd-tb th{padding:7px 10px;text-align:left;font-size:11px;font-weight:600;letter-spacing:0;
  color:var(--muted,#8c7c88);background:var(--btnBg,#2a1a26);
  border-bottom:1px solid var(--inpLine,#3e2638);white-space:nowrap}
.agd-tb td{padding:9px 10px;border-bottom:1px solid var(--cardLine,#241018);
  vertical-align:top;line-height:1.6;word-break:break-word}
.agd-tb tbody tr:nth-child(even) td{background:rgba(255,255,255,.025)}
.agd-tb tbody tr:last-child td{border-bottom:0}

/* ==========================================================================
   侧边栏式后台布局（桌面固定导航 / 平板手机折叠抽屉）
   —— 所有颜色都走主题变量，不写死深色：
      以前「个人中心」写死 #1a0d16 深底 + 主题字色，切到明亮/米黄时变成
      深底配深字，用户反馈"背景色和文字内容色很接近，看不清"。
========================================================================== */
.lc-shell{display:flex;align-items:flex-start;gap:0}

/* ---------- 侧边栏本体 ---------- */
.lcside{
  flex:0 0 232px;width:232px;
  position:sticky;top:56px;
  height:calc(100vh - 56px);
  overflow-y:auto;overscroll-behavior:contain;
  background:var(--panel1,#1a0a14);
  border-right:1px solid var(--panelLine,#3a1a2c);
  padding:14px 10px 20px;
  z-index:40;
}
.lcside::-webkit-scrollbar{width:6px}
.lcside::-webkit-scrollbar-thumb{background:var(--inpLine,#3e2638);border-radius:3px}

.lcside-hd{display:flex;align-items:center;gap:8px;margin-bottom:12px;padding:0 4px}
.lcside-role{display:flex;align-items:center;gap:9px;min-width:0;flex:1}
.lcside-avatar{
  width:34px;height:34px;flex:0 0 34px;border-radius:10px;
  display:flex;align-items:center;justify-content:center;font-size:17px;
  background:linear-gradient(135deg,var(--accent2,#ff87b0),#d4205a);
}
.lcside-who{min-width:0}
.lcside-who b{display:block;font-size:13px;color:var(--fg,#e8e8f0);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lcside-who i{display:block;font-size:11px;font-style:normal;color:var(--muted,#8c7c88)}
/* 桌面端侧边栏是常驻的（position:sticky），没有「抽屉」可收起，
   点这个 ✕ 什么都不会发生 —— 用户反馈「点了没效果」。
   所以它只在窄屏抽屉模式里出现。 */
.lcside-x{
  display:none;
  width:auto;padding:5px 8px;border-radius:8px;font-size:13px;line-height:1;
  background:var(--btnBg,#2a1a26);color:var(--btnFg,#dcdcf0);
  border:1px solid var(--inpLine,#3e2638);
}
.lcside-x:hover{background:var(--btnHover,#3a2434)}

.lcside-nav{display:flex;flex-direction:column;gap:3px}
.lcside-nav .lc-grp{
  font-size:11px;color:var(--muted,#8c7c88);letter-spacing:1px;
  padding:12px 10px 5px;font-weight:600;
}
.lcside-nav a{
  display:flex;align-items:center;gap:8px;
  padding:8px 10px;border-radius:10px;font-size:13px;line-height:1.35;
  color:var(--gt,#c98fa8);border:1px solid transparent;
  transition:background .15s,color .15s,border-color .15s;
}
.lcside-nav a:hover{background:var(--btnBg,#2a1a26);color:var(--fg,#e8e8f0)}
.lcside-nav a.on{
  background:linear-gradient(135deg,var(--accent2,#ff87b0),#d4205a);
  color:#fff;font-weight:600;border-color:#d4205a;
}
.lcside-nav a .ic{flex:0 0 18px;text-align:center;font-size:14px}
.lcside-nav a .tx{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lcside-nav a .bd{
  flex:0 0 auto;font-size:11px;padding:0 6px;border-radius:9px;
  background:var(--btnBg,#2a1a26);color:var(--gt,#c98fa8);
}
.lcside-nav a.on .bd{background:rgba(255,255,255,.22);color:#fff}
.lcside-ft{margin-top:14px;padding:8px 10px 0;border-top:1px solid var(--panelLine,#3a1a2c);
  font-size:11px;color:var(--muted,#8c7c88);line-height:1.5}

/* ---------- 内容区 ---------- */
.lc-shell > .wrap{flex:1;min-width:0;max-width:none}

/* ---------- 汉堡按钮 / 遮罩（只在窄屏出现） ---------- */
.lc-burger{display:none;width:auto;padding:6px 10px;font-size:16px;line-height:1;
  background:var(--btnBg,#2a1a26);color:var(--btnFg,#dcdcf0);
  border:1px solid var(--inpLine,#3e2638);border-radius:9px}
.lc-burger:hover{background:var(--btnHover,#3a2434)}
.lcside-mask{display:none}

/* ---------- 分区切换：只显示当前卡片 ---------- */
.lc-sec-only .card{display:none}
.lc-sec-only .card.lc-cur{display:block;animation:lcfade .18s ease}
@keyframes lcfade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* ---------- 平板 / 手机：抽屉 ---------- */
@media(max-width:900px){
  .lc-burger{display:block}
  .lcside{
    position:fixed;top:56px;left:0;width:252px;flex:none;
    height:calc(100vh - 56px);
    transform:translateX(-105%);transition:transform .22s ease;
    box-shadow:0 0 40px rgba(0,0,0,.5);border-right:1px solid var(--panelLine,#3a1a2c);
  }
  .lcside.on{transform:none}
  /* 窄屏才是抽屉，✕ 用来关闭它（桌面端侧边栏常驻，没有可收起的抽屉） */
  .lcside-x{display:block}
  .lcside-mask{
    display:block;position:fixed;inset:56px 0 0;background:rgba(0,0,0,.45);
    opacity:0;pointer-events:none;transition:opacity .22s ease;z-index:35;
  }
  .lcside-mask.on{opacity:1;pointer-events:auto}
  .lc-shell > .wrap{padding:16px 12px 60px}
}
@media(max-width:640px){
  .lcside{width:86vw;max-width:300px}
  .topbar{padding:0 12px;gap:8px}
  .topbar .who{display:none}
}

/* ==========================================================================
   主播列表 / 代卖账号：宽表格 → 卡片网格
   --------------------------------------------------------------------------
   为什么改：管理员看主播表是 12 列，宽到必须横向拖动才能看全，
   列一多每格就被挤成一小条，按钮堆在一起。代卖表 10 列同样挤。
   卡片化后桌面能并排 2~3 个，信息分区、按钮成组，手机上也不再溢出。

   ★ 只改 CSS，不动 HTML 结构 ★
   admin.js 里大量用到 closest('tr[data-id]') 取行，
   如果把 <tr> 换成 <div>，所有行内操作（改密码/续费/删除）会全部失效。
   所以这里保留 table/tr/td，只用 display 重排 —— JS 一行都不用改。
   表头隐藏后，靠 td 上的 data-l 属性在每格上方显示字段名。
   ========================================================================== */
table.lcards{display:block;width:100%;min-width:0;overflow:visible;
  border-collapse:separate;border-spacing:0}
table.lcards thead{display:none}
table.lcards tbody{
  display:grid;gap:12px;min-width:0;
  grid-template-columns:repeat(auto-fill,minmax(min(430px,100%),1fr));
}
table.lcards tbody tr{
  display:flex;flex-wrap:wrap;align-items:flex-start;gap:9px 10px;
  padding:12px 13px 11px;
  background:var(--grpBg,#180c14);
  border:1px solid var(--grpLine,#36203a);
  border-radius:12px;
}
table.lcards tbody tr:hover{background:var(--btnHover,#3a2434)}
/* 已过期的号：边框染红，扫一眼就知道哪些要催续费 */
table.lcards tbody tr.is-over{border-color:#8a2a44}
table.lcards tbody tr.is-agent{box-shadow:inset 3px 0 0 var(--accent2,#ff87b0)}

/* td → 卡片里的「字段块」 */
table.lcards tbody td{
  display:block;flex:1 1 190px;min-width:0;
  padding:0;border-bottom:0;font-size:12px;vertical-align:top;
  background:transparent !important;
}
/* 字段名：thead 隐藏了，用它告诉用户这格是什么 */
table.lcards tbody td[data-l]::before{
  content:attr(data-l);display:block;
  font-size:10px;font-weight:400;letter-spacing:.5px;
  color:var(--muted,#8c7c88);margin:0 0 3px;
}
/* 名字和操作区不需要再重复一次字段名 */
table.lcards tbody td.nn-cell::before,
table.lcards tbody td.nn::before,
table.lcards tbody td.ops::before,
table.lcards tbody td.op::before{display:none}

/* 卡片头：名字 + 账号，独占一行。
   ★ 代卖表的名字格用的是 .nn，主播表用 .nn-cell —— 两个都要匹配，
     漏了 .nn 的话代卖昵称会跟「状态」「卡余额」挤在同一行。 */
table.lcards tbody td.nn-cell,
table.lcards tbody td.nn{
  order:0;flex:1 1 calc(100% - 76px);
  padding-bottom:9px;margin-bottom:1px;
  border-bottom:1px dashed var(--grpLine,#36203a);
}
/* ID：以前排在卡片最底部，被挤成一个只有 31px 宽的孤零零窄格，
   还紧贴操作区上方那条虚线分隔线 —— 看着就像线把「ID」和号码压住了。
   现在挪到卡片头、跟昵称同一行靠右显示成「ID 5」。
   昵称右半边本来就是空的，让出这点宽度不影响排版。 */
table.lcards tbody td[data-l="ID"]{
  order:1;flex:0 0 auto;opacity:.8;
  padding-bottom:9px;border-bottom:1px dashed var(--grpLine,#36203a);
}
table.lcards tbody td[data-l="ID"]::before{display:inline;margin:0 4px 0 0}
table.lcards tbody td.nn-cell .nn{font-size:15px}
table.lcards tbody td.nn-cell .uu{margin-top:2px}

/* 卡片底：操作按钮独占一行，成组排列 */
table.lcards tbody td.ops,
table.lcards tbody td.op{
  order:99;flex:0 0 100%;white-space:normal;
  /* 旧表格规则 .card.wide .tbl .ops{max-width:150px} 特异性比这里高，
     不显式解除的话操作列永远只有 150px，按钮被迫堆成竖条。 */
  max-width:none;
  position:static !important;box-shadow:none !important;
  padding-top:10px;margin-top:1px;
  border-top:1px dashed var(--grpLine,#36203a);
  display:flex;flex-wrap:wrap;gap:6px;
}
table.lcards tbody td.ops .chip,
table.lcards tbody td.op .chip{margin:0}
/* 全局 button{width:100%} 会把卡片里每个按钮撑满整行，
   于是「改房间名 / 改标识 / 改密码 / 删除」被压成一列竖条（实测高 181px）。
   卡片里按钮是并排的 chip，宽度应随文字走。 */
table.lcards tbody .chip{width:auto;flex:0 0 auto;white-space:nowrap}
table.lcards tbody .exp-btns .chip{width:auto;flex:0 0 auto}
table.lcards tbody .exp-btns{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px}

/* ── 操作按钮按用途分开，避免一串同色按钮看错按错 ──
   ① 进画面的（代管设置 / 快捷改名 / 接口）：主色描边，最常用，放最前
   ② 改资料的（改房间名 / 改标识 / 改密码）：保持默认弱化样式
   ③ 删除：推到最右单独隔开并染红，手滑点到的代价最大 */
table.lcards tbody td.ops a.chip{
  font-weight:600;
  border-color:var(--accent2,#ff87b0);color:var(--accent2,#ff87b0);
  background:transparent}
table.lcards tbody td.ops a.chip:hover{
  background:var(--accent2,#ff87b0);color:#fff}
table.lcards tbody td.ops .chip.del{
  margin-left:auto;
  background:#2a1018;border-color:#8a1028;color:#ff9ab0;font-weight:600}
table.lcards tbody td.ops .chip.del:hover{background:#8a1028;color:#fff}
/* 窄屏按钮会换行，「推到最右」会让它孤零零吊在一行右侧，改回顺排 */
@media(max-width:520px){
  table.lcards tbody td.ops .chip.del{margin-left:0}
}

/* 字段顺序：把常用的往前排，不常用的沉到底部 */
table.lcards tbody td[data-l="状态"]      {order:2;flex:0 1 auto}
table.lcards tbody td[data-l="有效期"]    {order:3;flex:2 1 250px}
table.lcards tbody td[data-l="卡余额"]    {order:3;flex:2 1 220px}
table.lcards tbody td[data-l="展示链接"]  {order:4}
table.lcards tbody td[data-l="欠款"]      {order:4}
table.lcards tbody td[data-l="账上余额"]  {order:5}
table.lcards tbody td[data-l="归属"]      {order:5}
table.lcards tbody td[data-l="开号 / 有效"]{order:6}
table.lcards tbody td[data-l="取回密码"]  {order:6}
table.lcards tbody td[data-l="动态"]      {order:7}
table.lcards tbody td[data-l="存图/GIF"]  {order:8}
table.lcards tbody td[data-l="存方案"]    {order:9}
table.lcards tbody td[data-l="口令"]      {order:10}
table.lcards tbody td[data-l="账号"]      {order:11}
table.lcards tbody td[data-l="备注"]      {order:12}
/* ID 的规则已移到上面「卡片头」处（跟昵称同行），这里不再重复定义，
   否则后面这条会把 order 覆盖回卡片最底部。 */

/* 链接和按钮在窄卡片里要能折行，不然会顶破卡片 */
table.lcards tbody td[data-l="展示链接"] .link{
  display:inline-block;max-width:100%;overflow-wrap:anywhere;
}
table.lcards tbody input.agnote{max-width:100%}

/* 空态：没有数据时那一格要占满整行，不要变成一个空卡片 */
table.lcards tbody tr:not([data-id]){
  display:block;grid-column:1/-1;
  background:transparent;border:0;padding:0;
}
table.lcards tbody tr:not([data-id]):hover{background:transparent}
/* 卡片化后不再需要「可左右滑动」提示 */
table.lcards + .scroll-hint,.scroll-hint:has(+ .table-scroll .lcards){display:none}
.table-scroll:has(> .lcards){overflow:visible}

/* 手机：卡片内字段改成单列，避免两个字段挤在一行看不清 */
@media(max-width:520px){
  table.lcards tbody td,
  table.lcards tbody td[data-l="有效期"],
  table.lcards tbody td[data-l="卡余额"]{flex:1 1 100%}
}

/* 时效卡表：td 里是 width:100% 的输入框，表格的自动布局会被输入框的
   默认最小宽度撑开（实测 1136 的卡片里表宽到 1474，右侧「删除」被挤出屏幕）。
   改成固定布局后列宽听表头的，输入框跟着收，页面不再横向溢出。 */
#pl_tbl{table-layout:fixed}
#pl_tbl input[type="text"],#pl_tbl input[type="number"]{
  min-width:0;max-width:100%;box-sizing:border-box}
/* 注意：不要给 #pl_tbl td 加 overflow:hidden —— 操作列一窄，
   「保存 / 删除」会被裁掉一半，按钮看着像缺了一块。 */

#pl_tbl input[type="text"],#pl_tbl input[type="number"]{
  min-width:0;max-width:100%;box-sizing:border-box}
/* 注意：不要给 #pl_tbl td 加 overflow:hidden —— 操作列一窄，
   「保存 / 删除」会被裁掉一半，按钮看着像缺了一块。 */
