/* admin.css — 商城后台（平面风格，无渐变无阴影堆砌） */
/* [hidden] 必须压过任何 display 规则：.mask/.toast 一旦写了 display/position，
   光靠 HTML 的 hidden 属性根本藏不住（Edge 真渲染实测：一进后台就杵着一个空白弹框） */
[hidden]{display:none !important}
*{box-sizing:border-box}
body{margin:0;font:14px/1.6 "Microsoft YaHei",system-ui,sans-serif;color:#1f2329;background:#f5f6f8}
h1{font-size:20px;margin:0}h2{font-size:18px;margin:0 0 8px}h3{font-size:16px;margin:0 0 10px}
code{background:#eef0f3;padding:1px 5px;border-radius:3px;font-size:12px}
a{color:#1a6feb;text-decoration:none}
.btn{border:1px solid #d6d9de;background:#fff;color:#1f2329;padding:6px 14px;border-radius:4px;cursor:pointer;font-size:13px}
.btn:hover{border-color:#1a6feb;color:#1a6feb}
.btn.pri{background:#1a6feb;border-color:#1a6feb;color:#fff}
.btn.pri:hover{background:#1557c4;color:#fff}
.btn.danger{color:#d33;border-color:#e8b6b6}
.btn.sm{padding:3px 9px;font-size:12px}
.btn:disabled{opacity:.5;cursor:not-allowed}
input,select,textarea{border:1px solid #d6d9de;border-radius:4px;padding:6px 8px;font-size:13px;font-family:inherit;background:#fff;color:#1f2329}
input:focus,textarea:focus,select:focus{outline:none;border-color:#1a6feb}
label{display:block;margin:10px 0 4px;font-weight:600}
.tip{color:#6b7280;font-size:12px;font-weight:400}

.login{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#eef0f3;z-index:50}
.login .card{width:360px;background:#fff;border:1px solid #e2e5ea;border-radius:8px;padding:22px}
.login input{width:100%;margin-top:4px}
.login .btn{width:100%;margin-top:16px}
.msg{margin-top:10px;font-size:13px;min-height:20px;color:#d33;white-space:pre-wrap}
.msg.ok{color:#1a7f37}

.app{display:flex;min-height:100vh}
.side{width:184px;background:#20242b;color:#c9ced6;display:flex;flex-direction:column;flex:0 0 184px}
.brand{padding:16px 18px;font-size:15px;color:#fff;border-bottom:1px solid #2c3138}
.brand span{margin-left:4px;font-size:12px;color:#8b939f}
#nav{flex:1;padding:8px 0}
#nav a{display:block;padding:9px 18px;color:#c9ced6;font-size:13px;cursor:pointer;border-left:3px solid transparent}
#nav a:hover{background:#262b33;color:#fff}
#nav a.on{background:#262b33;color:#fff;border-left-color:#1a6feb}
#nav a b{float:right;font-weight:400;font-size:12px;color:#ff9a3d}
.side-foot{padding:12px 18px;border-top:1px solid #2c3138}
.side-foot .who{font-size:12px;color:#8b939f;margin-bottom:8px}
.side-foot .btn{display:block;width:100%;margin-top:6px;background:#262b33;border-color:#3a4048;color:#c9ced6}
main{flex:1;min-width:0;display:flex;flex-direction:column}
.top{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;background:#fff;border-bottom:1px solid #e2e5ea}
.top-act{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.pg{padding:18px 20px;flex:1}

.bar{display:flex;gap:8px;align-items:center;margin-bottom:14px;flex-wrap:wrap}
.bar input,.bar select{min-width:0}
table{width:100%;border-collapse:collapse;background:#fff;font-size:13px}
th,td{padding:9px 10px;border-bottom:1px solid #eceef1;text-align:left;vertical-align:middle}
th{background:#fafbfc;font-weight:600;color:#4b525c;white-space:nowrap}
tbody tr:hover{background:#fafcff}
td.num{text-align:right;font-variant-numeric:tabular-nums}
td.act{white-space:nowrap}
.thumb{width:56px;height:56px;object-fit:cover;background:#f0f1f3;border-radius:4px;display:block}
.empty{padding:36px;text-align:center;color:#8b939f;background:#fff;border:1px dashed #dcdfe4;border-radius:6px}
.card2{background:#fff;border:1px solid #e2e5ea;border-radius:6px;padding:16px;margin-bottom:14px}
.row{display:flex;gap:12px;flex-wrap:wrap}
.row>div{flex:1;min-width:180px}
.row input,.row textarea,.row select{width:100%}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.kv{display:flex;gap:8px;align-items:center;margin:8px 0}
.kv span{color:#4b525c;min-width:112px}
.pill{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;background:#eef0f3;color:#4b525c}
.pill.g{background:#e6f4ea;color:#1a7f37}.pill.r{background:#fdecec;color:#c0392b}
.pill.b{background:#e8f0fe;color:#1a6feb}.pill.o{background:#fff3e0;color:#b25e00}
.pill.top{background:#f6e7ff;color:#7a3ec8}.pill.n{background:#e6f7f4;color:#0f8a7a}
/* 就地编辑的数字/日期：看着就是"能点"的（虚线下划线＋手型），但不做整块按钮那么大，
   一屏 24 行每行两颗大按钮会把表格挤到横向滚动，反倒看不清权重。 */
.wt,.dt{display:inline-block;min-width:34px;padding:2px 6px;border:1px dashed #c6ccd4;border-radius:4px;
  cursor:pointer;font-variant-numeric:tabular-nums;color:#1f2937;background:#fbfcfe}
.wt:hover,.dt:hover,.wt:focus,.dt:focus{border-color:#1a6feb;border-bottom-style:solid;outline:none;background:#fff}
.wt.busy{opacity:.45;cursor:progress}
.dt.none{color:#b25e00;border-color:#f0c48a}
.wt-in{width:70px;padding:2px 6px;border:1px solid #1a6feb;border-radius:4px;font:inherit;text-align:right}
.tabs{display:flex;gap:6px;margin-bottom:12px;border-bottom:1px solid #e2e5ea}
.tabs a{padding:7px 12px;cursor:pointer;color:#4b525c;border-bottom:2px solid transparent;font-size:13px}
.tabs a.on{color:#1a6feb;border-bottom-color:#1a6feb}
.mask{position:fixed;inset:0;background:rgba(20,24,32,.42);display:flex;align-items:center;justify-content:center;z-index:100}
/* 报错层压在表单弹层(100)之上、toast(200)之下：报错时底下那张表单仍在原位，填过的内容一个字都不丢 */
.emask{z-index:150}
.dlg{width:560px;max-width:94vw;max-height:88vh;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:hidden}
.dlg h3{padding:14px 18px;margin:0;border-bottom:1px solid #eceef1}
#dlg-body{padding:16px 18px;overflow:auto}
.dlg-foot{padding:12px 18px;border-top:1px solid #eceef1;display:flex;justify-content:flex-end;gap:8px}
.toast{position:fixed;top:18px;right:18px;background:#20242b;color:#fff;padding:10px 16px;border-radius:4px;z-index:200;font-size:13px;max-width:420px;white-space:pre-wrap}
.toast.err{background:#c0392b}
/* 装修：组件卡片列表 */
.blk{border:1px solid #e2e5ea;border-radius:6px;margin-bottom:10px;background:#fff}
.blk.off{opacity:.55}
.blk-h{display:flex;align-items:center;gap:10px;padding:9px 12px;background:#fafbfc;border-bottom:1px solid #eceef1}
.blk-h b{font-size:13px}
.blk-h .sp{flex:1}
.blk-b{padding:12px}
.bx{border:1px dashed #d6d9de;border-radius:4px;padding:8px;margin:6px 0}
.iw{width:72px;height:72px;object-fit:cover;border-radius:4px;background:#f0f1f3}
.uplist{font-size:12px;max-height:180px;overflow:auto;border:1px solid #eceef1;border-radius:4px;padding:8px;margin-top:8px}
.uplist div{padding:1px 0}
.ok{color:#1a7f37}.bad{color:#c0392b}.warn{color:#b25e00}
.qr{border:1px solid #e2e5ea;padding:6px;background:#fff;border-radius:4px}
.stat{display:flex;gap:18px;flex-wrap:wrap;margin-bottom:14px}
.stat .s{background:#fff;border:1px solid #e2e5ea;border-radius:6px;padding:10px 14px;min-width:130px}
.stat .s b{display:block;font-size:20px;font-variant-numeric:tabular-nums}
.stat .s span{font-size:12px;color:#6b7280}
/* ——— 底部菜单编辑器 ——— */
.tb-pre-wrap{background:#f2f4f7;border:1px solid #e2e5ea;border-radius:8px;padding:10px;margin:10px 0}
.tb-pre .tip{margin:0 0 6px}
.tb-bar{max-width:375px;margin:0 auto;background:#fff;border:1px solid #e2e5ea;border-radius:8px;display:flex;overflow:hidden}
.tb-bar .t{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 0;font-size:11px;color:#6b7280;position:relative;min-width:0}
.tb-bar .t.on{color:#1a6feb}
.tb-bar .t img{width:22px;height:22px;display:block}
.tb-bar .t span{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.tb-bar .t .n{position:absolute;top:2px;left:calc(50% + 4px);min-width:15px;height:15px;line-height:15px;padding:0 4px;border-radius:8px;background:#d0342c;color:#fff;font-size:10px;text-align:center}
.tb-ico{display:flex;flex-direction:column;align-items:center;gap:2px}
.tb-ico img{width:30px;height:30px;object-fit:contain;background:#f5f6f7;border:1px solid #eceef1;border-radius:5px}
#tb-list td .tip{margin-top:3px;line-height:1.5}
/* ——— 商品分类：左侧树 + 右侧该分类内容 ——— */
.ct-wrap{display:flex;gap:12px;align-items:flex-start}
.ct-side{flex:0 0 250px;max-width:250px;background:#fff;border:1px solid #e2e5ea;border-radius:8px;padding:8px;position:sticky;top:8px;max-height:74vh;overflow:auto}
.ct-search{margin-bottom:6px}
.ct-search input{width:100%}
.ct-node{display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:5px;cursor:pointer;font-size:13px;user-select:none}
.ct-node:hover{background:#f2f6ff}
.ct-node.on{background:#e8f0ff;box-shadow:inset 2px 0 0 #1a6feb}
.ct-node.lv1 b{font-weight:600}
.ct-node.lv2{margin-left:18px;font-size:12.5px;color:#3f4650}
.ct-node .ct-nm{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
/* 「已对客户隐藏」状态必须在树上看得见：藏起来的那一支前台不再出现，
   如果树上没有任何标记，商家只会以为"这个分类怎么点进去没货"，或下次误删它。 */
.ct-node .ct-tag{flex:0 0 auto;font-size:10.5px;color:#8a5a00;background:#fff3d6;border:1px solid #f0d08a;border-radius:3px;padding:1px 5px;margin-left:6px}
.ct-node .ct-hideb{flex:0 0 auto;margin-left:6px}
.ct-node.hid .ct-nm,.ct-node.hid > b{color:#a8b0ba}
.ct-node b{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400}
.ct-n{margin-left:auto;font-size:11px;color:#6b7280;background:#f2f4f7;border-radius:9px;padding:0 6px;min-width:22px;text-align:center;font-variant-numeric:tabular-nums}
.ct-node.on .ct-n{background:#d7e6ff;color:#1a6feb}
.ct-caret{width:14px;text-align:center;color:#98a1ad;cursor:pointer;font-size:11px;flex:0 0 14px}
.ct-caret.op{transform:rotate(90deg)}
.ct-dot{width:7px;height:7px;border-radius:50%;background:#c9d1da;flex:0 0 7px}
.ct-dot.all{background:#1a6feb}
.ct-node.all .ct-n{background:#eef1f5;color:#4b525c}
.ct-warn{margin:8px 0 0;font-size:11.5px;color:#8a5a00;background:#fff7e6;border:1px solid #f0d08a;border-radius:5px;padding:6px}
.ct-main{flex:1;min-width:0}
.ct-stat{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.ct-stat .s{background:#fafbfc;border:1px solid #eceef1;border-radius:6px;padding:6px 10px;min-width:104px}
.ct-stat .s b{display:block;font-size:18px;font-variant-numeric:tabular-nums}
.ct-stat .s span,.ct-stat .s{font-size:12px;color:#6b7280}
/* 分类图片区块：预览用 contain 不用 cover——品牌 logo 被裁掉一半比不显示还糟，
   而且商家传完就在后台这块看效果，这里看到什么客户侧就该是什么。 */
.ct-icon{display:flex;align-items:center;gap:12px;margin-top:10px;padding-top:10px;border-top:1px dashed #eceef1;flex-wrap:wrap}
.ct-icon-pv{flex:0 0 auto;width:88px;height:88px;border:1px solid #e2e5ea;border-radius:8px;background:#fcfcfd;display:flex;align-items:center;justify-content:center;overflow:hidden;text-align:center;padding:6px}
.ct-icon-pv img{max-width:100%;max-height:100%;object-fit:contain;display:block}
.ct-icon-pv .tip{font-size:11.5px;color:#a8b0ba;line-height:1.4}
.ct-icon .row{flex:1;min-width:260px}
.ct-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:8px;margin-top:10px}
.ct-tile{border:1px solid #e2e5ea;border-radius:6px;padding:8px 10px;background:#fff;cursor:pointer;display:flex;flex-direction:column;gap:2px}
.ct-tile:hover{border-color:#1a6feb}
.ct-tile span{font-size:11.5px;color:#6b7280}

/* ——— 首页装修画布（可拖拽所见即所得）——— */
.dx-wrap{display:flex;gap:12px;align-items:flex-start;margin-top:10px}
.dx-pal{flex:0 0 176px;background:#fff;border:1px solid #e2e5ea;border-radius:8px;padding:10px}
.dx-pal h4{margin:0 0 4px;font-size:13px}
.dx-pal .tip{margin:0 0 8px}
.dx-pi{border:1px solid #e2e5ea;border-radius:6px;padding:7px 8px;margin-bottom:7px;background:#fafbfc;cursor:grab;touch-action:none;user-select:none}
.dx-pi:hover{border-color:#2f6fe4;background:#f2f6ff}
.dx-pi .dx-grip{color:#98a1ad;margin-right:4px}
.dx-pn{font-weight:600;font-size:12.5px}
.dx-pt{display:block;font-size:11px;color:#6b7280;margin:2px 0 0 16px}
.dx-stage{flex:0 0 auto}
.dx-phone{width:375px;border:1px solid #cfd4dc;border-radius:14px;background:#f5f6f7;overflow:hidden}
.dx-bar{background:#20242b;color:#fff;font-size:11.5px;padding:5px 10px;text-align:center}
.dx-body{min-height:300px;max-height:62vh;overflow:auto;padding:8px}
.dx-blk{position:relative;background:#fff;border:1px solid #e2e5ea;border-radius:8px;margin-bottom:8px}
.dx-blk:hover{border-color:#b9c2cf}
.dx-blk.sel{border-color:#2f6fe4;outline:1px solid #2f6fe4}
.dx-blk.off{opacity:.55}
.dx-blk.dragging{opacity:.3}
.dx-tools{display:flex;align-items:center;gap:5px;padding:4px 7px;background:#f2f4f7;border-bottom:1px solid #e6e9ee;font-size:12px;border-radius:7px 7px 0 0}
.dx-grip{cursor:grab;touch-action:none;user-select:none;color:#7b8593}
.dx-name{font-weight:600}
.dx-tools .sp{flex:1}
.btn.xs{padding:1px 7px;font-size:11.5px;line-height:1.5}
.dx-pv{padding:8px}
.dx-line{height:3px;background:#2f6fe4;border-radius:2px;margin:4px 2px}
.dx-ghost{position:fixed;z-index:300;transform:translate(-8px,-16px);background:#20242b;color:#fff;padding:5px 10px;border-radius:6px;font-size:12px;pointer-events:none;opacity:.9}
body.dx-dragging{cursor:grabbing;user-select:none}
.dx-empty{color:#98a1ad;font-size:12.5px;line-height:1.8;text-align:center;padding:36px 14px;border:1px dashed #cfd4dc;border-radius:8px;background:#fff}
.dx-prop{flex:1 1 300px;min-width:270px;max-width:460px;background:#fff;border:1px solid #e2e5ea;border-radius:8px;padding:10px;align-self:flex-start;position:sticky;top:8px}
.dx-prop h4{margin:0 0 6px;font-size:13.5px;display:flex;align-items:center;gap:8px}
.dx-prop h4 .sp{flex:1}
.dx-onlab{display:flex;gap:4px;align-items:center;font-weight:400;font-size:12px}
.dx-onlab input{width:auto}
.dx-mini{display:flex;gap:6px;margin:6px 0 8px}
.dx-prop-empty{color:#98a1ad;font-size:12px;line-height:1.9;padding:14px 4px}
.dx-pbox .tip{margin:4px 0}
/* 预览块：口径照着 h5 那套真样式缩，比例近似就行，不做像素级复刻 */
.pv-banner{position:relative;background:#eef0f3;border-radius:6px;overflow:hidden}
.pv-banner img{width:100%;height:100%;object-fit:cover;display:block}
.pv-dots{position:absolute;right:6px;bottom:6px;background:rgba(32,36,43,.72);color:#fff;font-size:11px;padding:1px 6px;border-radius:8px}
.pv-none{display:flex;align-items:center;justify-content:center;min-height:56px;height:100%;color:#98a1ad;font-size:12px;padding:10px;text-align:center;line-height:1.6}
.pv-nav{display:grid;gap:8px;text-align:center}
.pv-nv i{display:block;width:42px;height:42px;margin:0 auto;border-radius:50%;background:#eef0f3;overflow:hidden;font-style:normal;color:#98a1ad;font-size:14px;line-height:42px}
.pv-nv i img{width:100%;height:100%;object-fit:cover}
.pv-nv em{display:block;font-style:normal;font-size:11px;color:#4b5563;margin-top:3px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.pv-floor h5{margin:0 0 6px;font-size:14px}
.pv-floor .pv-row{display:grid;gap:6px}
.pv-floor.g2 .pv-row{grid-template-columns:1fr 1fr}
.pv-floor.big .pv-row{grid-template-columns:1fr}
.pv-floor.hsc .pv-row{display:flex;overflow:auto}
.pv-floor.hsc .pv-g{flex:0 0 46%}
.pv-g{border:1px solid #eef0f3;border-radius:6px;overflow:hidden;background:#fff}
.pv-g .im{aspect-ratio:1/1;background:#f0f1f1;display:flex;align-items:center;justify-content:center;font-size:11px;color:#aab}
.pv-g .im img{width:100%;height:100%;object-fit:cover}
.pv-g b{display:block;font-size:12px;font-weight:400;padding:4px 6px 0;line-height:1.3;height:2.6em;overflow:hidden}
.pv-g em{display:block;font-style:normal;color:#d0342c;font-size:12px;padding:0 6px 6px}
.pv-cat{display:grid;gap:6px}
.pv-cw{display:flex;align-items:center;gap:6px;border:1px solid #eef0f3;border-radius:6px;padding:5px 6px;background:#fafbfc}
.pv-cw img{width:24px;height:24px;border-radius:4px;object-fit:cover}
.pv-cw .noimg{width:24px;height:24px;border-radius:4px;background:#eef0f3;display:inline-flex;align-items:center;justify-content:center;font-size:10px;color:#98a1ad;font-weight:400}
.pv-cw em{font-style:normal;font-size:12px}
.pv-notice{display:flex;gap:6px;align-items:center;background:#fff7e6;border:1px solid #f0d08a;border-radius:6px;padding:6px 8px;font-size:12px}
.pv-notice span{background:#f0a020;color:#fff;border-radius:3px;padding:0 5px;font-size:11px;flex:0 0 auto}
.pv-lead{display:flex;align-items:center;gap:8px;background:#eef4ff;border:1px solid #cddcff;border-radius:6px;padding:8px}
.pv-lead b{flex:1;font-size:13px}
.pv-lead em{font-style:normal;color:#6b7280;font-size:12px}
.pv-lead span{background:#2f6fe4;color:#fff;border-radius:4px;padding:3px 10px;font-size:12px;flex:0 0 auto}
