/* 物流管理系统 - 样式 */
:root{
  --bg:#f4f3ee; --panel:#ffffff; --panel-2:#fbfaf6;
  --ink:#171c1f; --ink-2:#3d484d; --muted:#7d868b;
  --line:#e6e3db; --line-2:#efece4;
  --accent:#0f766e; --accent-2:#0d9488; --accent-soft:#e7f4f1;
  --warn:#b45309; --warn-soft:#fdf2e3;
  --ok:#15803d; --ok-soft:#e9f5ec;
  --danger:#b42318; --danger-soft:#fdf0ee;
  --info:#1d4ed8; --info-soft:#e8eefb;
  --radius:12px;
  --shadow:0 1px 2px rgba(23,28,31,.05), 0 10px 26px -14px rgba(23,28,31,.18);
  --mono:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;
}
*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0; background:var(--bg); color:var(--ink);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  font-size:14px; line-height:1.5; -webkit-font-smoothing:antialiased; overflow:hidden;
}
button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}
button{cursor:pointer;border:none;background:none}
.mono{font-family:var(--mono)}
.hidden{display:none !important}
.muted{color:var(--muted)}
.grow{flex:1}

/* ---------- 按钮 / 输入 ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:36px;padding:0 14px;border-radius:10px;font-size:13.5px;font-weight:560;
  transition:background .15s,border-color .15s,transform .06s;white-space:nowrap;
}
.btn:active{transform:translateY(1px)}
.btn.primary{background:var(--accent);color:#fff;box-shadow:0 8px 18px -12px rgba(15,118,110,.9)}
.btn.primary:hover{background:#0c6b63}
.btn.ghost{border:1px solid var(--line);background:var(--panel);color:var(--ink-2)}
.btn.ghost:hover{border-color:#d8d4c9;background:var(--panel-2)}
.btn.soft{background:var(--accent-soft);color:var(--accent)}
.btn.soft:hover{background:#dcf0ec}
.btn.danger{color:var(--danger);border:1px solid #f0d6d3;background:#fff}
.btn.danger:hover{background:var(--danger-soft)}
.btn.block{width:100%}
.btn.sm{height:29px;padding:0 10px;font-size:12.5px;border-radius:8px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.input{
  border:1.5px solid var(--line);border-radius:10px;background:var(--panel);
  padding:9px 12px;outline:none;transition:border-color .15s,box-shadow .15s;height:36px;
}
.input:focus{border-color:var(--accent-2);box-shadow:0 0 0 3px rgba(13,148,136,.13)}
textarea.input{height:auto;min-height:70px;resize:vertical;line-height:1.6}
.sel{padding-right:28px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%237d868b' stroke-width='1.6' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;appearance:none;-webkit-appearance:none}
input:disabled,select:disabled{background:var(--panel-2);color:var(--muted)}
.field{margin-bottom:13px}
.field label{display:block;font-size:12.5px;font-weight:600;color:var(--ink-2);margin-bottom:6px}
.field .input{width:100%}
.req::after{content:" *";color:var(--danger)}
.grid2{display:grid;grid-template-columns:repeat(2,1fr);gap:0 22px}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:0 22px}

/* ---------- 品牌标记 ---------- */
.brand-mark{
  width:38px;height:38px;border-radius:11px;flex:0 0 auto;
  background:linear-gradient(150deg,var(--accent-2),var(--accent));
  display:grid;place-items:center;color:#fff;
  box-shadow:0 6px 14px -8px rgba(15,118,110,.9);
}

/* ---------- 登录页 ---------- */
.login-bg{
  height:100%;display:grid;place-items:center;padding:24px;
  background:
    radial-gradient(900px 500px at 85% -10%, rgba(13,148,136,.14), transparent 60%),
    radial-gradient(700px 400px at -10% 110%, rgba(29,78,216,.08), transparent 55%),
    var(--bg);
}
.login-card{
  width:400px;max-width:100%;background:var(--panel);border:1px solid var(--line);
  border-radius:18px;box-shadow:var(--shadow);padding:30px 30px 22px;
}
.login-brand{display:flex;gap:13px;align-items:center;margin-bottom:24px}
.login-title{font-size:18px;font-weight:700;letter-spacing:-.01em}
.login-sub{font-size:12px;color:var(--muted);margin-top:2px}
.login-err{
  background:var(--danger-soft);border:1px solid #f0d6d3;color:var(--danger);
  border-radius:9px;padding:9px 12px;font-size:12.5px;margin-bottom:13px;
}
.login-btn{height:42px;font-size:15px;letter-spacing:.35em;text-indent:.35em}
.login-foot{margin-top:16px;text-align:center;font-size:11.5px;color:var(--muted)}

/* ---------- 布局 ---------- */
.app{display:flex;height:100%}
.sidebar{
  width:236px;flex:0 0 236px;background:var(--panel);border-right:1px solid var(--line);
  display:flex;flex-direction:column;height:100%;
}
.side-brand{display:flex;gap:10px;align-items:center;padding:18px 16px 14px}
.side-name{font-size:14.5px;font-weight:700;letter-spacing:-.01em}
.side-sub{font-size:11px;color:var(--muted);margin-top:1px}
.side-menu{flex:1;overflow-y:auto;list-style:none;margin:0;padding:2px 10px}
.side-menu a{
  display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;
  color:var(--ink-2);text-decoration:none;font-size:13.5px;font-weight:560;margin-bottom:2px;
  transition:background .15s,color .15s;
}
.side-menu a:hover{background:var(--panel-2)}
.side-menu a.active{background:var(--accent-soft);color:var(--accent)}
.side-menu a.active .mi{color:var(--accent)}
.mi{width:20px;text-align:center;font-size:15px;opacity:.85}
.side-menu .cnt{margin-left:auto;font-size:11px;background:var(--warn-soft);color:var(--warn);border-radius:6px;padding:1px 7px;font-weight:650}
.side-foot{border-top:1px solid var(--line-2);padding:12px 14px 14px}
.side-user{display:flex;gap:10px;align-items:center;margin-bottom:10px}
.avatar{
  width:36px;height:36px;border-radius:50%;flex:0 0 auto;
  background:linear-gradient(150deg,#5e17eb,#8b5cf6);color:#fff;
  display:grid;place-items:center;font-size:14px;font-weight:650;
}
.side-user-name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.side-user-role{font-size:11px;color:var(--muted)}

.main{flex:1;min-width:0;height:100%;display:flex;flex-direction:column}
.topbar{
  flex:0 0 auto;background:var(--bg);padding:16px 26px 10px;
  border-bottom:1px solid var(--line-2);
}
.page-title{font-size:19px;font-weight:700;letter-spacing:-.01em}
.page-sub{font-size:12px;color:var(--muted);margin-top:2px}
.main-scroll{flex:1;min-height:0;overflow-y:auto;padding:18px 26px 40px}
#main{max-width:1240px;margin:0 auto}

/* ---------- 卡片 ---------- */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;margin-bottom:16px}
.card h3{margin:0 0 14px;font-size:14.5px;font-weight:650;display:flex;align-items:center;gap:8px}
.card h3 .sub{font-weight:400;font-size:12px;color:var(--muted)}
.form-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}

/* ---------- 工具条 ---------- */
.toolbar{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px;align-items:center}
.toolbar .input{min-width:0}
.toolbar .sel{width:auto}
.statbar{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.stat{
  background:var(--panel);border:1px solid var(--line);border-radius:10px;
  padding:8px 14px;font-size:12.5px;color:var(--muted);
}
.stat b{font-size:16px;color:var(--ink);margin-left:6px;font-family:var(--mono)}
.stat.hl b{color:var(--accent)}

/* ---------- 表格 ---------- */
.table-wrap{overflow-x:auto}
.tbl{width:100%;border-collapse:collapse;font-size:13px}
.tbl th{
  text-align:left;font-size:11.5px;font-weight:650;color:var(--muted);
  letter-spacing:.05em;padding:9px 10px;border-bottom:1.5px solid var(--line);
  white-space:nowrap;background:var(--panel-2);position:sticky;top:0;z-index:1;
}
.tbl td{padding:9px 10px;border-bottom:1px solid var(--line-2);vertical-align:middle;white-space:nowrap}
.tbl tbody tr{cursor:pointer;transition:background .12s}
.tbl tbody tr:hover{background:var(--panel-2)}
.tbl .td-loading{text-align:center;color:var(--muted);padding:30px}
.tbl .empty{text-align:center;color:var(--muted);padding:34px;cursor:default}
.link-ish{color:var(--accent);font-weight:650}
.money{font-family:var(--mono)}
.tag{
  display:inline-block;font-size:11px;font-weight:600;padding:2px 8px;border-radius:6px;
  background:#eef0f0;color:#6b7479;white-space:nowrap;
}
.tag.ok{background:var(--ok-soft);color:var(--ok)}
.tag.warn{background:var(--warn-soft);color:var(--warn)}
.tag.gray{background:#eef0f0;color:#6b7479}
.tag.info{background:var(--info-soft);color:var(--info)}
.tag.danger{background:var(--danger-soft);color:var(--danger)}
.pager{display:flex;align-items:center;gap:10px;justify-content:flex-end;padding-top:12px;font-size:12.5px;color:var(--muted)}
/* 宽表格（订单列表） */
.tbl.compact{font-size:12.5px}
.tbl.compact th{padding:8px 7px}
.tbl.compact td{padding:7px}
.tbl.compact .mono{font-size:12px}
.tbl.compact .btn.sm{height:26px;padding:0 8px;font-size:11.5px}

/* ---------- 扫码 ---------- */
.scan-wrap{max-width:720px;margin:4vh auto 0}
.scan-card{text-align:center;padding:34px 26px}
.scan-icon{
  width:64px;height:64px;margin:0 auto 16px;border-radius:18px;
  background:var(--accent-soft);color:var(--accent);font-size:30px;font-weight:700;
  display:grid;place-items:center;
}
.scan-card h2{margin:0 0 8px;font-size:19px;letter-spacing:-.01em}
.scan-card p{margin:0 auto 18px;max-width:480px;font-size:12.5px;color:var(--muted)}
.scan-input{
  width:100%;height:54px;font-size:20px;font-family:var(--mono);text-align:center;
  letter-spacing:.06em;border:2px solid var(--line);border-radius:14px;outline:none;
  transition:border-color .15s,box-shadow .15s;
}
.scan-input:focus{border-color:var(--accent-2);box-shadow:0 0 0 4px rgba(13,148,136,.15)}
.scan-msg{margin-top:16px;font-size:13.5px;min-height:22px}
.scan-actions{display:flex;gap:10px;justify-content:center;margin-top:16px;flex-wrap:wrap}
.cam-region{margin:16px auto 0;max-width:420px;width:100%;border-radius:12px;overflow:hidden;border:1px solid var(--line);background:#0b0e10;min-height:240px}
.cam-region video{width:100%;display:block;object-fit:cover}
.cam-region img{width:100%;display:block}
.cam-tip{margin:10px auto 0;max-width:420px;font-size:12px;color:var(--muted);text-align:center}
.cam-tip b{color:var(--ink-2)}
.scan-msg.ok{color:var(--ok)}
.scan-msg.new{color:var(--info)}
.scan-msg.err{color:var(--danger)}
.scan-log{max-height:300px;overflow-y:auto}
.scan-log-item{display:flex;gap:12px;align-items:center;padding:9px 4px;border-bottom:1px solid var(--line-2);font-size:12.5px}
.scan-log-item:last-child{border-bottom:none}
.scan-log-item .t{color:var(--muted);font-size:11.5px;flex:0 0 auto}
.scan-log-item .c{font-family:var(--mono);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.scan-log-item .r{flex:0 0 auto}

/* ---------- 订单详情 ---------- */
.order-head{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;margin-bottom:14px}
.oh-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.oh-intl{font-family:var(--mono);font-size:22px;font-weight:700;letter-spacing:.02em}
.oh-dom{font-size:12.5px;color:var(--muted);font-family:var(--mono)}
.oh-badges{display:flex;gap:7px;flex-wrap:wrap;align-items:center}
.oh-spacer{flex:1}
.oh-actions{display:flex;gap:8px;flex-wrap:wrap}
.tabs{display:flex;gap:4px;border-bottom:1.5px solid var(--line);margin-bottom:16px;flex-wrap:wrap}
.tab{
  padding:9px 16px 10px;font-size:13.5px;font-weight:560;color:var(--muted);
  border-bottom:2.5px solid transparent;margin-bottom:-1.5px;transition:color .15s;
}
.tab:hover{color:var(--ink-2)}
.tab.active{color:var(--accent);border-bottom-color:var(--accent)}
.oh-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px 14px;margin-top:12px}
.kv{font-size:12.5px}
.kv .k{color:var(--muted);font-size:11.5px;margin-bottom:1px}
.kv .v{font-weight:550}

/* 尺寸表格输入 */
.pieces-tbl td{padding:5px 6px}
.piece-input{
  width:78px;height:32px;font-family:var(--mono);text-align:right;
  border:1.5px solid var(--line);border-radius:8px;padding:4px 8px;outline:none;
}
.piece-input:focus{border-color:var(--accent-2)}
.volw{color:var(--muted);font-family:var(--mono)}
.totals{margin-top:12px;padding:10px 14px;background:var(--panel-2);border-radius:10px;font-size:12.5px;color:var(--muted);line-height:1.9}
.totals b{color:var(--ink);font-family:var(--mono);margin-left:4px}
.divisor-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:14px;padding:10px 14px;background:var(--panel-2);border-radius:10px}
.divisor-row .dl{font-size:12.5px;font-weight:600;color:var(--ink-2)}
.divisor-row .dl-sub{font-size:12px;color:var(--muted)}
.divisor-row .radio{display:inline-flex;align-items:center;gap:6px;font-size:13px;cursor:pointer}
.divisor-row .radio input{width:16px;height:16px;accent-color:var(--accent)}
.fee-tbl td{padding:5px 6px}
.fee-tbl .input{height:32px;padding:4px 8px}
.fee-tbl .sel{width:auto;min-width:110px}
.money.pos{color:var(--ok)}
.money.neg{color:var(--danger)}
.api-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.api-url{flex:1;min-width:240px;display:block;padding:9px 12px;background:var(--panel-2);border:1px solid var(--line);border-radius:9px;font-family:var(--mono);font-size:12.5px;color:var(--ink-2);overflow-x:auto;white-space:nowrap}
.api-sample{margin:12px 0 0;padding:12px 14px;background:var(--panel-2);border:1px solid var(--line);border-radius:9px;font-family:var(--mono);font-size:11.5px;color:var(--muted);white-space:pre-wrap;line-height:1.7}

/* 轨迹时间线 */
.timeline{list-style:none;margin:0;padding:0}
.timeline li{position:relative;padding:0 0 18px 26px}
.timeline li::before{
  content:"";position:absolute;left:6px;top:6px;width:9px;height:9px;border-radius:50%;
  background:var(--accent-2);box-shadow:0 0 0 3px var(--accent-soft);
}
.timeline li::after{content:"";position:absolute;left:10px;top:18px;bottom:0;width:1.5px;background:var(--line)}
.timeline li:last-child::after{display:none}
.tl-node{font-weight:650;font-size:13.5px}
.tl-node .tag{margin-left:8px}
.tl-time{font-size:11.5px;color:var(--muted);font-family:var(--mono);margin:2px 0}
.tl-note{font-size:12.5px;color:var(--ink-2)}
.track-form{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;margin-bottom:18px}
.track-form .field{margin:0;flex:1;min-width:160px}

/* ---------- 面单 ---------- */
.label-wrap{display:flex;gap:18px;flex-wrap:wrap;align-items:flex-start}
.label-card{
  width:420px;background:#fff;border:2px solid #111;border-radius:4px;
  padding:14px 16px;font-family:inherit;
}
.lb-top{display:flex;justify-content:space-between;align-items:center;border-bottom:2px solid #111;padding-bottom:8px;margin-bottom:10px}
.lb-title{font-size:16px;font-weight:800;letter-spacing:.1em}
.lb-date{font-size:11px;color:#333;font-family:var(--mono)}
.lb-barcode{margin:6px 0 10px;text-align:center}
.lb-barcode svg{max-width:100%}
.lb-no{font-family:var(--mono);font-size:17px;font-weight:700;letter-spacing:.06em;text-align:center;margin-bottom:10px}
.lb-section{border:1.5px solid #111;border-radius:3px;margin-bottom:8px;padding:8px 10px}
.lb-label{font-size:10px;color:#555;letter-spacing:.15em;margin-bottom:3px;font-weight:700}
.lb-rows{font-size:12.5px;line-height:1.55}
.lb-meta{display:flex;gap:8px}
.lb-meta .lb-section{flex:1}
.lb-meta b{font-family:var(--mono)}
.label-actions{display:flex;flex-direction:column;gap:10px;min-width:180px}
.label-tips{font-size:12px;color:var(--muted);line-height:1.6;max-width:200px}

/* ---------- toast / modal ---------- */
#toast{
  position:fixed;left:50%;bottom:34px;transform:translateX(-50%);
  background:var(--ink);color:#fff;border-radius:10px;padding:10px 18px;
  font-size:13px;box-shadow:0 10px 30px -10px rgba(0,0,0,.5);z-index:300;
  max-width:80vw;animation:toastIn .2s ease;
}
#toast.err{background:var(--danger)}
@keyframes toastIn{from{opacity:0;transform:translate(-50%,8px)}to{opacity:1;transform:translate(-50%,0)}}
#modalMask{
  position:fixed;inset:0;background:rgba(23,28,31,.42);z-index:200;
  display:grid;place-items:center;padding:20px;
}
.modal{width:420px;max-width:100%;background:var(--panel);border-radius:14px;box-shadow:var(--shadow);padding:20px 20px 16px}
.modal h3{margin:0 0 10px;font-size:15.5px}
.modal-body{font-size:13.5px;color:var(--ink-2);margin-bottom:16px;word-break:break-all}
.modal-body .field{margin-bottom:11px}
.modal-body .input{width:100%}
.modal-foot{display:flex;justify-content:flex-end;gap:10px}

/* ---------- 打印（仅面单） ---------- */
@media print{
  body{overflow:visible;background:#fff}
  body .app, body #loginView, body #toast, body #modalMask{display:none !important}
  body.printing .app{display:flex !important}
  body.printing .sidebar, body.printing .topbar,
  body.printing .order-head, body.printing .tabs,
  body.printing .label-actions, body.printing .main-scroll > *{display:none !important}
  body.printing .main-scroll{overflow:visible;padding:0}
  body.printing #main{max-width:none}
  body.printing .label-wrap{display:block}
  body.printing .label-card{width:100%;border-width:1.5px}
}

/* ---------- 响应式 ---------- */
@media (max-width:900px){
  .app{flex-direction:column}
  .sidebar{width:100%;flex:none;height:auto;border-right:none;border-bottom:1px solid var(--line)}
  .side-brand{padding:12px 14px 8px}
  .side-menu{display:flex;overflow-x:auto;padding:0 8px 6px}
  .side-menu a{white-space:nowrap;margin-bottom:0;margin-right:2px}
  .side-foot{display:none}
  .main-scroll{padding:12px 12px 30px}
  .topbar{padding:12px 14px 8px}
  .grid2,.grid3{grid-template-columns:1fr}
  .oh-grid{grid-template-columns:repeat(2,1fr)}
  .toolbar .input,.toolbar .sel{width:100%}
}
