*{box-sizing:border-box;margin:0;padding:0}
body{font:14px/1.5 -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;color:#1f2329;background:#f5f6f8}
a{color:#3370ff;text-decoration:none}
button,input,select{font:inherit}
.btn{display:inline-flex;align-items:center;gap:4px;height:32px;padding:0 14px;border:1px solid #d0d3d6;border-radius:6px;background:#fff;color:#1f2329;cursor:pointer;white-space:nowrap}
.btn:hover{border-color:#3370ff;color:#3370ff}
.btn.primary{background:#3370ff;border-color:#3370ff;color:#fff}
.btn.primary:hover{background:#2b5fd9}
.btn.danger:hover{border-color:#f54a45;color:#f54a45}
.btn.sm{height:26px;padding:0 10px;font-size:13px}
.btn:disabled{opacity:.5;cursor:not-allowed}
input[type=text],input[type=password],input[type=number],input[type=url],select{height:32px;padding:0 10px;border:1px solid #d0d3d6;border-radius:6px;background:#fff;width:100%}
input:focus,select:focus{outline:none;border-color:#3370ff}
input[type=color]{width:40px;height:32px;border:1px solid #d0d3d6;border-radius:6px;padding:2px;background:#fff}

/* 布局 */
.layout{display:flex;min-height:100vh}
.side{width:200px;background:#1f2329;color:#c9cdd4;flex-shrink:0;display:flex;flex-direction:column}
.side .logo{padding:20px 20px 24px;font-size:16px;font-weight:600;color:#fff}
.side nav a{display:block;padding:10px 20px;color:#c9cdd4}
.side nav a.on,.side nav a:hover{background:#2e3238;color:#fff}
.side .foot{margin-top:auto;padding:16px 20px;font-size:12px}
.side .foot a{color:#8f959e}
.main{flex:1;min-width:0;padding:24px 28px}
.head{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px;gap:12px}
.head h1{font-size:20px;font-weight:600}
.card{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 2px rgba(0,0,0,.04)}
.muted{color:#8f959e;font-size:12px}
.empty{padding:40px;text-align:center;color:#8f959e}

/* 登录 */
.login{display:flex;align-items:center;justify-content:center;min-height:100vh;background:linear-gradient(135deg,#fde2ef,#dfe8ff)}
.login .card{width:360px;padding:32px}
.login h1{font-size:20px;margin-bottom:4px}
.login .muted{margin-bottom:24px}
.login label{display:block;margin-bottom:14px}
.login label span{display:block;margin-bottom:6px;color:#646a73}
.login .btn{width:100%;justify-content:center;height:38px;margin-top:6px}
.login .err{color:#f54a45;min-height:20px;margin-top:10px}
.login .feishu{width:100%;justify-content:center;height:40px;margin-top:8px}
.side .me{display:flex;align-items:center;gap:8px;margin-bottom:10px;color:#fff;font-size:13px}
.side .me img{width:24px;height:24px;border-radius:50%}
.user{display:flex;align-items:center;gap:10px}
.user img,.user .ava{width:32px;height:32px;border-radius:50%;background:#e1eaff;flex-shrink:0}
.perms{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:13px}
td select{width:auto}

/* 表格 */
table{width:100%;border-collapse:collapse}
th,td{padding:11px 12px;text-align:left;border-bottom:1px solid #eff0f1;vertical-align:middle}
th{background:#f8f9fa;color:#646a73;font-weight:500;font-size:13px}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
tr:hover td{background:#fafbfc}
.thumb{width:44px;height:78px;object-fit:cover;object-position:top;border-radius:4px;background:#f0f1f2;display:block}
.tag{display:inline-block;padding:0 8px;border-radius:4px;font-size:12px;line-height:20px}
.tag.jump{background:#e1eaff;color:#245bdb}
.tag.addFan{background:#fde2ef;color:#c4306b}
.ops{display:flex;gap:6px;flex-wrap:wrap}
.link{font-family:ui-monospace,Menlo,monospace;font-size:12px;color:#646a73;word-break:break-all}

/* 编辑器 */
.editor{display:flex;gap:24px;align-items:flex-start}
.phone{width:375px;flex-shrink:0;position:sticky;top:24px}
.phone .frame{border:10px solid #1f2329;border-radius:36px;overflow:hidden;background:#000;box-shadow:0 8px 24px rgba(0,0,0,.15)}
.phone .screen{height:667px;overflow-y:auto;overflow-x:hidden}
.phone .tip{text-align:center;margin-top:10px}
.pv{position:relative}
.pv .bg{display:block;width:100%;height:auto;pointer-events:none;user-select:none}
.pv .fl{position:absolute;cursor:move;user-select:none;touch-action:none;outline:1px dashed rgba(51,112,255,.6)}
.pv .fl.sel{outline:2px solid #3370ff}
.pv .fl img{display:block;width:100%;height:auto;pointer-events:none}
.pv .fl.qr{aspect-ratio:1/1;background:#fff}
.pv .fl.qr img{height:100%;object-fit:contain}
.pv .fl.qr .ph{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;border:2px dashed #e7a3ad;color:#c77;font-size:12px}
.pv .noimg{padding:120px 20px;text-align:center;color:#8f959e;background:#fff}
.ql-breath{animation:ql-breath 1.2s ease-in-out infinite}
@keyframes ql-breath{0%,100%{transform:scale(1)}50%{transform:scale(.92)}}

.form{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}
.form .card h3{font-size:15px;margin-bottom:14px;display:flex;align-items:center;justify-content:space-between}
.row{display:flex;gap:12px;margin-bottom:12px;align-items:center}
.row:last-child{margin-bottom:0}
.row>label{width:96px;flex-shrink:0;color:#646a73}
.row>.ctl{flex:1;min-width:0;display:flex;gap:8px;align-items:center}
.row .hint{font-size:12px;color:#8f959e;margin-top:4px}
.imglist{display:flex;gap:10px;flex-wrap:wrap}
.imgitem{position:relative;width:72px}
.imgitem img{width:72px;height:128px;object-fit:cover;object-position:top;border-radius:4px;border:1px solid #eff0f1;display:block}
.imgitem .x{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#f54a45;color:#fff;border:0;cursor:pointer;font-size:12px;line-height:20px}
.imgitem .mv{display:flex;justify-content:center;gap:4px;margin-top:4px}
.imgitem .mv button{border:0;background:#f0f1f2;border-radius:3px;width:22px;cursor:pointer}
.upbox{width:72px;height:128px;border:1px dashed #c9cdd4;border-radius:4px;display:flex;align-items:center;justify-content:center;color:#8f959e;cursor:pointer;text-align:center;font-size:12px}
.upbox:hover{border-color:#3370ff;color:#3370ff}
.pos{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;width:100%}
.pos label{font-size:12px;color:#8f959e}
.switch{display:inline-flex;align-items:center;gap:6px;cursor:pointer}
.savebar{position:sticky;bottom:0;background:#fff;padding:12px 20px;border-radius:8px;display:flex;gap:10px;justify-content:flex-end;box-shadow:0 -2px 8px rgba(0,0,0,.05)}

.filters{display:flex;gap:10px;margin-bottom:16px;align-items:center}
.filters select{width:auto;min-width:160px}
.sum{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin-bottom:16px}
.sum .card{padding:16px}
.sum b{display:block;font-size:24px;font-weight:600;margin-top:4px;font-variant-numeric:tabular-nums}

#toast{position:fixed;top:20px;left:50%;transform:translateX(-50%);z-index:99;pointer-events:none}
#toast div{background:#1f2329;color:#fff;padding:8px 18px;border-radius:6px;margin-bottom:8px;box-shadow:0 4px 12px rgba(0,0,0,.15)}
#toast div.err{background:#f54a45}

.tip{margin-bottom:14px;font-size:13px;line-height:1.8}
.tip code{word-break:break-all;background:#f2f3f5;padding:2px 6px;border-radius:4px}
