:root{color-scheme:light;--ink:#17202a;--muted:#64727f;--line:#dce2e7;--bg:#f3f6f8;--panel:#fff;--brand:#087f5b;--brand2:#075985;--danger:#c2413b;--warning:#b7791f;--sidebar:220px;--topbar:64px}*{box-sizing:border-box}html,body{min-height:100%}body{margin:0;overflow:hidden;background:var(--bg);color:var(--ink);font:14px/1.5 system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;letter-spacing:0}a{color:inherit;text-decoration:none}button,input,select,textarea{max-width:100%;font:inherit}.shell{min-height:100vh;min-height:100dvh}.sidebar{position:fixed;inset:0 auto 0 0;z-index:20;width:var(--sidebar);overflow-y:auto;background:#16232b;color:#eaf0f3;padding:22px 16px}.brand{margin:0 8px 24px;overflow-wrap:anywhere;font-size:19px;font-weight:750}.nav a{display:flex;padding:10px 12px;margin:3px 0;border-radius:6px;color:#becbd2}.nav a:hover,.nav a.active{background:#263943;color:#fff}.main{height:100vh;height:100dvh;min-width:0;margin-left:var(--sidebar);overflow:hidden}.topbar{height:var(--topbar);padding:0 28px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:16px}.content{width:100%;height:calc(100vh - var(--topbar));height:calc(100dvh - var(--topbar));overflow-y:auto;overflow-x:hidden;touch-action:pan-y;-webkit-overflow-scrolling:touch;padding:24px 28px max(24px,env(safe-area-inset-bottom));scrollbar-gutter:stable}.title{min-width:0;margin:0 0 18px;overflow-wrap:anywhere;font-size:22px}.stats{display:grid;grid-template-columns:repeat(6,minmax(120px,1fr));gap:12px;margin-bottom:20px}.stat,.panel{min-width:0;background:var(--panel);border:1px solid var(--line);border-radius:7px}.stat{padding:16px;overflow:hidden}.stat strong{display:block;margin-top:5px;overflow-wrap:anywhere;font-size:25px}.muted{color:var(--muted)}.panel{padding:18px;margin-bottom:18px}.panel-head{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap;margin-bottom:14px}.panel-head>.title{flex:1 1 340px;margin-bottom:0}.panel-head>.actions,.panel-head>form{min-width:0}.panel h2{margin:0;font-size:16px}.account-search{width:220px;min-width:0}
.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.field{min-width:0}.field label{display:block;margin-bottom:5px;font-weight:650}.input{width:100%;min-width:0;padding:9px 10px;border:1px solid #bdc8cf;border-radius:5px;background:#fff}.account-batch-controls{display:flex;flex-wrap:wrap;gap:14px;margin-bottom:14px}.account-batch-controls .field{flex:0 1 200px;min-width:150px}.account-batch-phones textarea.input{min-height:110px;height:110px}.pool-assign-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:6px 14px;max-height:220px;overflow-y:auto;padding:8px;border:1px solid var(--line);border-radius:5px;background:#fff}.pool-assign-list label{display:flex;align-items:center;gap:6px;font-size:13px}.account-list td{vertical-align:middle}.account-list .payment-method-edit{display:flex;gap:6px;align-items:center}.account-list .payment-method-edit .input{width:96px;min-width:96px;padding:7px 8px}.account-list .payment-method-edit .btn{min-height:34px;padding:6px 10px;white-space:nowrap}.account-list .password-edit{min-width:150px}.account-list .password-edit .input{min-width:0}.account-list .phone-edit{display:flex;gap:6px;align-items:center;min-width:200px}.account-list .phone-edit .input{width:150px;min-width:150px;padding:7px 8px}.account-list .phone-edit .btn{min-height:34px;padding:6px 10px;white-space:nowrap}.account-list .account-rebind-form{display:flex;gap:6px;align-items:center}.account-list .account-rebind-form .input{width:130px;min-width:130px;padding:7px 8px}.account-list .account-rebind-form .btn{min-height:34px;padding:6px 10px;white-space:nowrap}.input:focus{outline:2px solid #b8e1d3;border-color:var(--brand)}textarea.input{min-height:190px;resize:vertical}.btn{display:inline-flex;min-height:38px;align-items:center;justify-content:center;border:0;border-radius:5px;padding:9px 13px;cursor:pointer;background:#e5eaed;color:#22313a;text-align:center}.btn[hidden]{display:none}.btn-primary{background:var(--brand);color:#fff}.btn-danger{background:var(--danger);color:#fff}.actions{display:flex;min-width:0;gap:8px;align-items:center;flex-wrap:wrap}.actions form{min-width:0}.actions .input{width:auto;min-width:110px}.table-wrap{width:100%;max-width:100%;overflow-x:auto;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y;border-radius:5px}.task-overview-head{gap:10px;margin-bottom:12px;justify-content:flex-start}.task-overview-head h2{flex:0 0 auto}.task-overview-head .task-overview-actions{margin-left:0;justify-content:flex-start;flex:0 1 auto}.task-overview-actions form,.task-overview-actions>a,.task-overview-actions>label{min-width:0}.task-overview-scroll{height:auto;min-height:0;max-height:none;overflow-x:auto;overflow-y:visible;overscroll-behavior:auto;touch-action:auto;-webkit-overflow-scrolling:touch}.task-overview-scroll table{min-width:max-content}.table-wrap:focus{outline:2px solid #b8e1d3}.list-flow{overflow-x:auto;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y}.page-list{overflow-x:auto;overflow-y:visible;overscroll-behavior:auto;touch-action:auto}.company-list{max-height:none;overflow-y:visible;touch-action:auto}.company-list table{min-width:max-content}.list-flow table{min-width:max-content}.list-flow tbody{display:table-row-group}.list-flow thead{display:table-header-group}.list-flow tr{display:table-row}th,td{text-align:left;padding:10px;border-bottom:1px solid #e7ecef;vertical-align:top}th{position:relative;font-size:12px;text-transform:uppercase;color:var(--muted);background:#f8fafb}.link-cell{display:block;max-width:360px;overflow:hidden;text-overflow:ellipsis}.wrap-cell,.event span,.event small,.flash,.panel p{overflow-wrap:anywhere}.badge{display:inline-block;max-width:100%;border-radius:999px;padding:3px 8px;overflow:hidden;text-overflow:ellipsis;font-size:12px;background:#e7ecef}.badge-completed{background:#d9f3e7;color:#08633f}.badge-running,.badge-leased{background:#dceef8;color:#075985}.badge-failed{background:#fae2df;color:#9b2c27}.badge-needs_review{background:#fff0c7;color:#855a00}.badge-queued{background:#edf0f2}.progress{height:8px;background:#e5eaed;border-radius:4px;overflow:hidden}.progress i{display:block;height:100%;background:var(--brand)}.flash{padding:10px 12px;border-radius:5px;margin-bottom:14px;background:#dceef8}.flash-error{background:#fae2df;color:#8e2824}.auth{min-height:100vh;min-height:100dvh;display:grid;place-items:center;padding:24px;overflow:auto}.auth-box{width:min(440px,100%);background:#fff;border:1px solid var(--line);border-radius:8px;padding:28px}.auth-box h1{margin:0 0 5px}.token{max-width:100%;padding:12px;background:#15242c;color:#e9f6f1;border-radius:5px;overflow-wrap:anywhere;font-family:ui-monospace,monospace}.timeline{border-left:2px solid var(--line);margin-left:6px;padding-left:18px}.event{min-width:0;margin-bottom:15px}.event strong,.event span,.event small{display:block}.screenshot-actions{align-items:flex-start;min-width:160px}.password-edit{display:flex;align-items:center;gap:4px;min-width:190px}.password-edit .input{min-width:0}.pool-modal,.account-modal{display:none;position:fixed;inset:0;z-index:1000;padding:clamp(8px,4vh,40px) 16px}.account-modal{z-index:1100}.pool-modal.is-open,.account-modal.is-open{display:grid;place-items:center}.pool-modal-backdrop,.account-modal-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.58)}.pool-modal-dialog,.account-modal-dialog{position:relative;width:min(1100px,100%);max-height:92vh;max-height:92dvh;overflow:auto;padding:18px;background:var(--panel);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,.25)}.account-modal-dialog{width:min(1400px,100%)}body.modal-open{overflow:hidden}.pool-modal-dialog .table-wrap,.account-modal-dialog .table-wrap{max-height:72vh;max-height:72dvh;overflow:auto}.screenshot-preview-modal{display:none;position:fixed;inset:0;z-index:1200;padding:clamp(8px,4vh,40px) 16px}.screenshot-preview-modal.is-open{display:grid;place-items:center}.screenshot-preview-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.72)}.screenshot-preview-dialog{position:relative;width:min(1400px,100%);height:min(92vh,92dvh);background:var(--panel);border-radius:8px;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.28)}.screenshot-preview-frame{width:100%;height:calc(100% - 64px);border:0;background:#fff}.screenshot-preview-dialog .panel-head{margin:0;padding:14px 16px;border-bottom:1px solid var(--line)}@media(max-width:520px){.screenshot-preview-modal{padding:0}.screenshot-preview-dialog{width:100%;height:100vh;height:100dvh;border-radius:0}.screenshot-preview-frame{height:calc(100% - 60px)}.screenshot-preview-dialog .panel-head{padding:12px}}.screenshot-gallery-head{display:flex;align-items:center;justify-content:space-between;gap:12px;max-width:1400px;margin:0 auto 14px}.screenshot-gallery-head h1{margin:0;font-size:20px}.screenshot-track{display:flex;gap:16px;max-width:1400px;margin:auto;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;touch-action:pan-x}.screenshot-slide{flex:0 0 100%;height:calc(100dvh - 110px);min-height:400px;margin:0;display:flex;flex-direction:column;align-items:center;justify-content:center;scroll-snap-align:center;background:#15242c;border-radius:8px;overflow:hidden}.screenshot-slide img{width:100%;height:calc(100% - 54px);object-fit:contain}.screenshot-slide figcaption{width:100%;min-height:54px;padding:10px 14px;display:flex;align-items:center;justify-content:center;gap:12px;background:#fff;color:var(--ink)}@media(max-width:520px){.screenshot-gallery{padding:10px}.screenshot-gallery-head{display:block}.screenshot-gallery-head .actions{margin-top:8px}.screenshot-slide{height:calc(100dvh - 112px);min-height:300px}.screenshot-slide figcaption{font-size:12px;padding:8px}.screenshot-slide figcaption .btn{min-height:32px;padding:6px 9px}}.debug-details pre{max-width:100%;max-height:320px;margin:8px 0 0;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}.debug-modal-dialog{width:min(900px,100%)}.debug-meta{display:grid;gap:5px;margin-bottom:12px;overflow-wrap:anywhere}.debug-modal-json{max-width:100%;max-height:56vh;max-height:56dvh;margin:0;padding:12px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;background:#15242c;color:#e9f6f1;border-radius:6px;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.55;-webkit-user-select:text;user-select:text}.swipe-step{padding:14px 0;border-top:1px solid var(--line)}.swipe-step:first-child{border-top:0}.swipe-step-title{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}.swipe-step-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.nav-toggle{display:none;flex:0 0 auto;width:40px;height:40px;align-items:center;justify-content:center;border:0;border-radius:8px;background:transparent;color:var(--ink);font-size:22px;line-height:1;cursor:pointer}.nav-backdrop{display:none}
@media(max-width:1100px){.stats{grid-template-columns:repeat(3,minmax(130px,1fr))}}
@media(max-width:900px){:root{--topbar:calc(52px + env(safe-area-inset-top,0px))}.shell{display:block}.nav-toggle{display:inline-flex}.sidebar{inset:0 auto 0 0;width:min(282px,84vw);height:auto;z-index:40;padding:calc(12px + env(safe-area-inset-top,0px)) 14px calc(12px + env(safe-area-inset-bottom,0px));overflow-y:auto;overflow-x:hidden;box-shadow:none;transform:translateX(-105%);transition:transform .22s ease}body.nav-open .sidebar{transform:translateX(0);box-shadow:0 0 28px rgba(0,0,0,.38)}.brand{display:block;margin:0 6px 18px;font-size:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav{display:block;height:auto;gap:0;align-items:stretch;overflow:visible}.nav a{display:flex;align-items:center;justify-content:flex-start;height:46px;margin:3px 0;padding:0 14px;white-space:nowrap;font-size:15px}.nav-backdrop{display:block;position:fixed;inset:0;z-index:35;background:rgba(15,23,42,.5);opacity:0;pointer-events:none;transition:opacity .22s ease}body.nav-open .nav-backdrop{opacity:1;pointer-events:auto}.main{height:100vh;height:100dvh;margin-left:0;padding:0}.topbar{height:var(--topbar);padding:env(safe-area-inset-top,0px) 12px 0}.topbar .muted{max-width:56vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content{height:calc(100vh - var(--topbar));height:calc(100dvh - var(--topbar));padding:16px 14px 16px}a,button,input,select,textarea{-webkit-tap-highlight-color:transparent}.table-wrap th{position:sticky;top:0;z-index:3}th,td{padding:8px 9px}.table-wrap .actions{gap:6px}.table-wrap .actions .input{width:auto;min-width:0}.panel.table-wrap{height:auto;max-height:calc(100dvh - var(--topbar) - 24px);min-height:200px;overflow-x:auto;overflow-y:auto}.company-list.panel.table-wrap{height:auto;min-height:0;max-height:none;overflow-x:auto;overflow-y:visible;overscroll-behavior:auto;touch-action:auto}.account-batch-controls .field{flex:1 1 100%}.account-batch-phones textarea.input{height:110px}.stats{grid-template-columns:repeat(2,minmax(0,1fr))}.grid{grid-template-columns:1fr}.panel-head{align-items:flex-start}.panel-head>.title{flex-basis:100%}.actions{align-items:stretch}.actions .input{width:100%}.swipe-step-fields{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:520px){.content{padding-left:12px;padding-right:12px}.title{font-size:19px;margin-bottom:14px}.panel,.stat{padding:14px}.stat strong{font-size:20px}.stats{grid-template-columns:1fr}.btn{min-height:40px}.table-wrap .btn{min-height:34px;padding:6px 10px;font-size:13px}.topbar{padding-left:12px;padding-right:12px}.panel-head{display:block}.panel-head>.actions,.panel-head>form{margin-top:10px}.page-actions,.filter-actions,.create-actions{display:grid;width:100%;grid-template-columns:1fr}.page-actions>*,.filter-actions>*,.create-actions>*{width:100%;min-width:0}.link-cell{max-width:230px}.table-wrap{margin-right:-2px}.panel.table-wrap{height:auto;max-height:calc(100dvh - var(--topbar) - 20px);min-height:180px;overflow-x:auto;overflow-y:auto}.table-wrap:after{content:"← 左右滑动查看完整列表";position:sticky;left:0;display:block;width:max-content;padding:5px 2px 0;color:var(--muted);font-size:11px}.pool-modal,.account-modal{padding:0}.pool-modal-dialog,.account-modal-dialog{width:100%;height:100vh;height:100dvh;max-height:none;border-radius:0;padding:12px}.pool-modal-dialog .table-wrap,.account-modal-dialog .table-wrap{max-height:calc(100vh - 84px);max-height:calc(100dvh - 84px)}.swipe-step-fields{grid-template-columns:1fr}.auth{align-items:start;padding:16px}.auth-box{margin-top:max(4vh,env(safe-area-inset-top));padding:22px 18px}}
.dashboard-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}
@media(max-width:900px){.dashboard-pair{grid-template-columns:1fr}}
.dashboard-pair{margin-bottom:18px}.dash-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:12px;margin-bottom:20px}.dash-stats .stat{padding:14px}.dash-stats .stat strong{font-size:21px;margin-top:3px}.dash-stats .stat small{display:block;margin-top:3px;font-size:12px}.pool-chips{display:flex;flex-wrap:wrap;gap:8px}.pool-chip{display:inline-flex;align-items:center;gap:8px;min-width:0;background:#f3f6f8;border:1px solid var(--line);border-radius:6px;padding:7px 12px}.pool-chip strong{font-size:15px;color:var(--brand)}.app-stat{display:flex;flex-direction:column;gap:6px;padding:14px 16px}.app-stat strong{font-size:16px;margin-top:0}.app-stat .muted{display:block;font-size:12.5px}.app-stat-head{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}.app-stat-head .badge{flex:0 0 auto}.app-stat .progress{margin-top:2px}
@media(max-width:520px){.dash-stats{grid-template-columns:repeat(2,minmax(0,1fr))}}
.topbar-left{display:flex;align-items:center;gap:10px;min-width:0}.topbar-right{display:flex;align-items:center;gap:8px;flex:0 0 auto}
/* 移动端（窄屏 ≤900px）：表格**和 PC 一样——一行就是一条记录，所有列横着排**，
   屏幕放不下时在表格容器里左右滑动看完整列（不再是每行把字段竖着堆起来的卡片）。
   app.js 仍会把表头文字写进 td 的 data-label（无障碍/调试用途），这里不再显示成竖排标签。
   手机端**不做任何吸顶/吸左**：安卓 WebView 对 sticky 支持不稳，会出现残影和半截文字
   （首列只有 38px 时旁边列被裁成"平/4/02"那种碎字），所以表头和首列都老实跟着滚。 */
/* 关键：overscroll-behavior 必须是 auto。写成 contain 会在**触摸**手势里把滚动链
   截断在表格容器上——短表格容器自己纵向没得滚，手指上滑就完全没反应（页面也滑不动）；
   滚轮走另一套判断，所以电脑上测不出来。auto 才能在容器滚到头/没得滚时继续滚页面。 */
body.cards-mode .table-wrap{overflow-x:auto;overflow-y:auto;overscroll-behavior:auto;touch-action:auto;-webkit-overflow-scrolling:touch;border-radius:0}
body.cards-mode .table-wrap table{min-width:max-content}
body.cards-mode .table-wrap td::before{content:none}
/* 单个格子宽度上限：列内容自适应，但别让「操作」「消息」这类超宽列把整表撑到几千像素
   （超出部分在格内换行，内容不丢），这样一行一条时左右少滑几屏。 */
body.cards-mode .table-wrap th,body.cards-mode .table-wrap td{max-width:min(78vw,340px)}
/* 「操作」这类放表单/按钮的格子不设上限：按钮被挤到 340px 里会叠成好几行，
   整行高度飙到两百多像素就不再是"一行一条"了；让它自然变宽、左右滑动看。 */
body.cards-mode .table-wrap th:has(form),body.cards-mode .table-wrap td:has(form),body.cards-mode .table-wrap th:has(.actions),body.cards-mode .table-wrap td:has(.actions){max-width:none}
body.cards-mode .table-wrap .btn{min-height:34px;padding:6px 10px;font-size:13px;white-space:nowrap}
/* 表头不吸顶、首列不吸左：整张表跟着页面一起滚，只保留左右滑动 */
body.cards-mode .table-wrap th{position:static}
/* 长表格也不在表格框里单独纵向滚动（不再有嵌套滚动条和悬浮表头），统一由页面滚 */
body.cards-mode .panel.table-wrap{height:auto;min-height:0;max-height:none}
body.cards-mode .table-wrap img{max-width:100%}

.keypad-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.keypad-grid h3{margin:0 0 10px;font-size:14px}
.keypad-field{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.keypad-field .input{width:110px;min-width:110px;padding:7px 9px}
@media(max-width:900px){.keypad-grid{grid-template-columns:1fr}}

/* 调试日志：筛选栏固定在内容区顶部，上下翻日志时不消失（2026-10-04）。
   背景用页面底色，滚动到顶时靠 .is-stuck 加一条分隔阴影；表头 sticky 的 top 由页面脚本写入
   --filter-sticky-h（筛选栏高度），这样表头正好贴在筛选栏下面而不是被它盖住。 */
.filter-sticky{position:sticky;top:0;z-index:8;background:var(--bg);padding:10px 0 12px;margin:-10px 0 0}
.filter-sticky.is-stuck{box-shadow:0 8px 16px -12px rgba(15,23,42,.45)}
.filter-sticky .filter-actions{margin:0}
.table-under-sticky th{top:var(--filter-sticky-h,0px)}
@media(max-width:520px){.filter-sticky{padding:8px 0 10px}}
/* 窄屏（手机）下筛选栏如果按默认样式排成一列会有 300+px 高，固定住就吃掉半个屏幕 ——
   这里把它改成"横向一条、放不下就左右滑"的工具栏，固定住也就 50px 左右。 */
@media(max-width:900px){
.filter-sticky{padding:8px 0 10px}
.filter-sticky .filter-actions{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;gap:8px;align-items:center;-webkit-overflow-scrolling:touch}
.filter-sticky .filter-actions>*{width:auto;min-width:0;flex:0 0 auto}
.filter-sticky .filter-actions .input{width:auto;min-width:104px}
.filter-sticky .filter-actions .btn{min-height:34px;padding:6px 12px;white-space:nowrap}
.filter-sticky .title{flex:0 0 auto;margin:0 0 6px}
}
/* 调试日志：**表头那一行也固定**（跟着筛选栏一起不动）。两种宽度的"参照物"不一样：
   宽屏：表格容器没有自己的滚动（下面把 overflow 放开），页面在滚 → 表头相对 .content 粘住，
         偏移量 = 筛选栏高度（页面脚本写进 --filter-sticky-h），正好贴在筛选栏下面；
   窄屏：容器有 max-height、自己内部滚（项目原有的窄屏样式）→ 表头相对容器顶部粘住即可（top:0），
         容器本来就在固定筛选栏下面，不用再加偏移。 */
.table-under-sticky thead th{position:sticky;top:0;z-index:5}
@media(min-width:901px){
.table-under-sticky{overflow:visible}
.table-under-sticky thead th{top:var(--filter-sticky-h,0px)}
}
/* 收款码弹窗（2026-10-04）：图片居中、限宽限高，下面紧跟"上传新图"表单。 */
.payment-qr-box{margin-top:4px;text-align:center}
.payment-qr-img{max-width:min(420px,100%);max-height:min(60vh,420px);border:1px solid var(--line);border-radius:8px;background:#fff;padding:6px}
.payment-qr-img[src=""]{display:none}
[data-qr-modal] .field label{margin-bottom:4px}
.collapse-panel>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:10px}.collapse-panel>summary::-webkit-details-marker{display:none}.collapse-panel>summary::after{content:'▾';margin-left:auto;color:var(--muted);font-size:14px}.collapse-panel:not([open])>summary::after{content:'▸'}.collapse-panel>summary h2{margin:0}.collapse-panel[open]>summary{margin-bottom:10px}
