:root{
  --bg:#f5f6f8; --card:#fff; --line:#e3e6ea; --txt:#1c2330; --sub:#6b7686;
  --acc:#2563eb; --acc-soft:#e8efff; --danger:#dc2626;
  --radius:14px; --pad:12px;
}
*{box-sizing:border-box; -webkit-tap-highlight-color:transparent;}
html,body{margin:0; background:var(--bg); color:var(--txt);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif; font-size:15px;}
header{background:var(--acc); color:#fff; padding:12px 14px calc(12px + env(safe-area-inset-top));
  padding-top:calc(12px + env(safe-area-inset-top)); position:sticky; top:0; z-index:20;
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;}
header h1{font-size:17px; margin:0; flex:1;}
header .tip{font-size:12px; opacity:.85; width:100%;}
.hdBtn{background:rgba(255,255,255,.18); border:none; color:#fff; border-radius:50%;
  width:34px; height:34px; font-size:15px; cursor:pointer; flex:none; padding:0;}
main{max-width:720px; margin:0 auto; padding:12px 10px 60px;}

section{background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:var(--pad); margin-bottom:12px;}
section h2{font-size:15px; margin:0 0 10px; display:flex; align-items:center; gap:8px;}
section h2 .step{background:var(--acc); color:#fff; border-radius:50%; width:22px; height:22px;
  display:inline-flex; align-items:center; justify-content:center; font-size:12px; flex:none;}
section h2 .cnt{margin-left:auto; font-size:12px; color:var(--sub); font-weight:normal;}
.secHead{display:flex; align-items:center; gap:8px;}
.secHead h2{flex:1; margin:0 0 10px;}
.gear{background:transparent; border:none; font-size:17px; cursor:pointer; padding:2px 6px;
  border-radius:8px; color:var(--sub);}
.sub{border-top:1px dashed var(--line); padding-top:10px; margin-top:10px;}
.sub:first-of-type{border-top:none; padding-top:0; margin-top:0;}
.subTitle{font-size:13px; font-weight:600; color:var(--sub); margin-bottom:8px;}

.row{display:flex; gap:8px; flex-wrap:wrap; align-items:center;}
button{border:1px solid var(--line); background:var(--card); color:var(--txt); border-radius:10px;
  padding:11px 14px; font-size:14px; cursor:pointer;}
button:active{transform:scale(.97);}
button.primary{background:var(--acc); border-color:var(--acc); color:#fff;}
button.big{flex:1; padding:13px; font-size:15px;}
button.ghost{background:transparent;}
button.danger{color:var(--danger); border-color:#f3c1c1;}
button:disabled{opacity:.45;}
button.mini{padding:5px 9px; font-size:13px; border-radius:8px;}
button.mini.danger{color:var(--danger);}
.btnlink{display:inline-flex; align-items:center; gap:6px; text-decoration:none; color:var(--txt);
  border:1px solid var(--line); border-radius:10px; padding:12px 16px; font-size:14px; font-weight:600;}
.btnlink.primary{background:var(--acc); border-color:var(--acc); color:#fff;}
label.chk{display:inline-flex; align-items:center; gap:6px; font-size:14px; cursor:pointer;}
.chkRow{display:flex; gap:14px; flex-wrap:wrap; margin:8px 0;}

input[type=number]{width:64px; border:1px solid var(--line); border-radius:8px; padding:8px; font-size:14px;}
.ipt{border:1px solid var(--line); border-radius:8px; padding:9px; font-size:14px;
  font-family:inherit; background:#fff; color:var(--txt);}
select.ipt{min-width:96px;}
textarea.wta{width:100%; min-height:110px; border:1px solid var(--line); border-radius:8px; padding:9px;
  font-size:14px; box-sizing:border-box; font-family:inherit; color:var(--txt);}
.grid2{display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:10px; align-items:end;}
.fld{display:block;}
.flab{display:block; font-size:12px; color:var(--sub); margin-bottom:3px;}
.inRow{margin-top:8px;}

.drop{border:2px dashed #c6cdd8; border-radius:10px; padding:14px; text-align:center;
  color:var(--sub); font-size:13px; margin-top:10px;}
.drop.on{border-color:var(--acc); background:var(--acc-soft); color:var(--acc);}
#docxStage{position:fixed; left:-12000px; top:0; width:794px; background:#fff; z-index:-1;}
#docxStage .dpage{width:794px; box-sizing:border-box; padding:56px 60px; background:#fff;
  color:#000; font-family:"Songti SC","SimSun",serif; font-size:16px; line-height:1.9; word-break:break-word;}
#docxStage .dpage h1{font-size:22px;} #docxStage .dpage h2{font-size:19px;}
#docxStage .dpage p{margin:.6em 0;}
#docxStage .dpage img{max-width:100%; height:auto;}
#docxStage .dpage table{border-collapse:collapse; width:100%; font-size:15px;}
#docxStage .dpage td,#docxStage .dpage th{border:1px solid #999; padding:5px 7px;}

/* 框选 */
.thumbs{display:flex; gap:8px; overflow-x:auto; padding-bottom:6px; margin-bottom:10px; -webkit-overflow-scrolling:touch;}
.thumbs .th{flex:none; width:84px; height:62px; border-radius:8px; overflow:hidden;
  border:2px solid transparent; cursor:pointer; position:relative;}
.thumbs .th canvas{width:100%; height:100%; display:block;}
.thumbs .th.cur{border-color:var(--acc);}
.thumbs .th .n{position:absolute; right:2px; bottom:2px; background:rgba(0,0,0,.6); color:#fff;
  font-size:11px; border-radius:6px; padding:1px 5px;}
.cropWrap{position:relative; display:inline-block; max-width:100%; touch-action:none; line-height:0;
  border:1px solid var(--line); border-radius:6px; overflow:hidden;}
.cropWrap img{max-width:100%; max-height:62vh; display:block; user-select:none; -webkit-user-drag:none;}
.ovl{position:absolute; inset:0;}
.box{position:absolute; border:2px solid var(--acc); background:rgba(37,99,235,.12); border-radius:3px;}
.box .tag{position:absolute; top:-20px; left:0; background:var(--acc); color:#fff; font-size:11px;
  line-height:18px; padding:0 6px; border-radius:4px; white-space:nowrap;}
.box .del{position:absolute; top:-12px; right:-12px; width:24px; height:24px; border-radius:50%;
  background:var(--danger); color:#fff; border:none; font-size:13px; cursor:pointer; padding:0;}
.box .rs{position:absolute; right:-9px; bottom:-9px; width:22px; height:22px; cursor:nwse-resize;
  border-right:3px solid var(--acc); border-bottom:3px solid var(--acc); opacity:.9;}
.cropHint{font-size:12px; color:var(--sub); margin:8px 0;}

/* 题库 */
.bank{display:grid; grid-template-columns:repeat(auto-fill,minmax(110px,1fr)); gap:10px;}
.qcard{border:1px solid var(--line); border-radius:10px; overflow:hidden; position:relative; background:#fff;}
.qcard.sel{border-color:var(--acc); box-shadow:0 0 0 2px var(--acc-soft);}
.qcard img{width:100%; height:104px; object-fit:contain; background:#fafafa; display:block;}
.qcard .meta{padding:5px 7px; font-size:10px; color:var(--sub); white-space:nowrap; overflow:hidden;}
.qcard .pick{position:absolute; top:5px; left:5px; width:20px; height:20px;}
.qcard .x{position:absolute; top:4px; right:4px; width:24px; height:24px; border-radius:50%;
  background:rgba(0,0,0,.55); color:#fff; border:none; cursor:pointer; font-size:13px; padding:0;}
.qcard .tagbtn{position:absolute; right:4px; bottom:4px; width:26px; height:26px; border-radius:50%;
  background:var(--acc); color:#fff; border:none; cursor:pointer; font-size:13px; padding:0;}
.tagbar{display:flex; flex-wrap:wrap; gap:4px; margin-top:3px; padding:0 6px 6px;}
.tagbar .t{font-size:10px; background:var(--acc-soft); color:var(--acc); border-radius:6px; padding:2px 6px;}

.cfg{display:flex; gap:12px; flex-wrap:wrap; align-items:center; font-size:14px;}
.cfg .seg{display:inline-flex; border:1px solid var(--line); border-radius:10px; overflow:hidden;}
.cfg .seg button{border:none; border-radius:0; padding:9px 16px;}
.cfg .seg button.on{background:var(--acc); color:#fff;}

/* 预览页 */
.pages{display:flex; gap:12px; overflow-x:auto; padding:4px 0 10px;}
.pages .cap{font-size:12px; color:var(--sub); margin-top:4px;}
.empty{text-align:center; color:var(--sub); font-size:13px; padding:16px 0;}
.note{font-size:12px; color:var(--sub); margin-top:10px; line-height:1.6;}
.toast{position:fixed; left:50%; bottom:28px; transform:translateX(-50%) translateY(20px); background:#1c2330;
  color:#fff; font-size:13px; padding:10px 16px; border-radius:22px; opacity:0; transition:.25s;
  pointer-events:none; z-index:99; max-width:86vw;}
.toast.show{opacity:1; transform:translateX(-50%) translateY(0);}

/* 文字模块 */
.wlist{max-height:340px; overflow:auto; border:1px solid var(--line); border-radius:8px; margin:10px 0;}
.wrow{display:flex; align-items:center; gap:8px; padding:7px 8px; border-bottom:1px solid var(--line); font-size:14px;}
.wrow:last-child{border-bottom:none;}
.wrow.on{background:var(--acc-soft);}
.wrow .wpick{flex:none; width:18px; height:18px;}
.wrow .wword{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.wrow .wword b{font-weight:600;}
.wrow .ph{color:var(--sub); font-size:12px;}
.wrow .mn{color:#333; font-size:13px;}
.wrow .wdel,.wrow .wedit{flex:none; width:26px; height:26px; border-radius:50%; border:none; color:#fff;
  cursor:pointer; font-size:12px; padding:0;}
.wrow .wdel{background:rgba(0,0,0,.5);}
.wrow .wedit{background:var(--acc);}
.wcfg{display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:10px; align-items:end;}
.wcfg label{display:block; font-size:12px; color:var(--sub); margin-bottom:3px;}
.wcfg .full{grid-column:1/-1;}
.wcfg .ipt{width:100%; box-sizing:border-box;}

/* 弹层 */
.modalBack{position:fixed; inset:0; background:rgba(20,24,32,.72); z-index:80;
  display:flex; align-items:center; justify-content:center; padding:12px; box-sizing:border-box; overflow:auto;}
.modalPanel{background:var(--card); border-radius:var(--radius); width:100%; max-width:520px;
  max-height:92vh; display:flex; flex-direction:column;}
.modalPanel.wide{max-width:680px;}
.modalHead{display:flex; align-items:center; gap:10px; padding:14px 16px; border-bottom:1px solid var(--line);}
.modalTitle{font-size:16px; font-weight:600; flex:1;}
.modalHead .x{background:transparent; border:none; font-size:18px; cursor:pointer; color:var(--sub); padding:0 4px;}
.modalBody{padding:14px 16px 18px; overflow:auto;}
.chips{display:flex; gap:6px; flex-wrap:wrap; margin:4px 0;}
.chip{padding:7px 12px; border:1px solid var(--line); border-radius:999px; font-size:13px; cursor:pointer;
  background:#fff; color:var(--txt);}
.chip.on{background:var(--acc); border-color:var(--acc); color:#fff;}
.taRow{margin:12px 0;}
.taRow .lab{font-size:13px; color:var(--sub); margin-bottom:6px;}

/* 模块管理 / 编辑器 */
.modList{margin:8px 0;}
.modRow{display:flex; align-items:center; gap:8px; padding:8px 0; border-bottom:1px solid var(--line);}
.modIcon{font-size:20px; flex:none;}
.modMeta{flex:1; min-width:0;}
.modName{font-size:14px; font-weight:500;}
.modKind{font-size:12px; color:var(--sub);}
.sw{display:inline-flex; align-items:center; gap:4px; font-size:12px; color:var(--sub); flex:none;}
.editList{border:1px solid var(--line); border-radius:8px; padding:8px; margin:6px 0;}
.editRow{display:flex; align-items:center; gap:6px; flex-wrap:wrap; padding:5px 0;}
.ordName{flex:1; min-width:120px; font-size:14px;}
.chkGrid{display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:8px;}

/* 透视校正弹层 */
.warpWrap{display:flex; flex-direction:column; height:100%;}
.warpStage{position:relative; height:52vh; min-height:240px; display:flex; align-items:center;
  justify-content:center; overflow:hidden; margin-bottom:10px; background:#111; border-radius:10px;}
.warpStage img{max-width:100%; max-height:100%; display:block;}
.warpSvg{position:absolute; pointer-events:none;}
.wh{position:absolute; width:30px; height:30px; margin:-15px 0 0 -15px; border-radius:50%; background:#fff;
  border:3px solid var(--acc); box-shadow:0 1px 5px rgba(0,0,0,.45); touch-action:none; cursor:grab;}
.warpActions{display:flex; gap:8px; flex-wrap:wrap; justify-content:center;}
.warpActions button{flex:1; min-width:104px;}
.warpNote{color:var(--sub); font-size:12px; text-align:center; margin-top:8px;}

/* 试卷还原弹层 */
.erStage{position:relative; background:#141821; border-radius:10px; max-height:44vh; overflow:auto;
  display:flex; justify-content:center; margin-bottom:12px;}
.erStage img{max-width:100%; display:block; cursor:crosshair; touch-action:manipulation;}
.erRow{display:flex; gap:8px; flex-wrap:wrap; align-items:center; margin:8px 0;}
.rngRow{display:flex; align-items:center; gap:10px; margin:6px 0; font-size:13px; color:var(--sub);}
.rngRow .rngLab{flex:none; width:64px;}
.rngRow .rng{flex:1;}
input[type=range].rng{-webkit-appearance:none; appearance:none; height:4px; background:var(--line);
  border-radius:3px; outline:none;}
input[type=range].rng::-webkit-slider-thumb{-webkit-appearance:none; width:20px; height:20px; border-radius:50%;
  background:var(--acc); border:2px solid #fff; box-shadow:0 1px 4px rgba(0,0,0,.3); cursor:pointer;}
.hintLab{font-size:13px; color:var(--sub);}
.qcard .tagbar .t.m-bad{background:#fde8e8; color:#c0392b;}
.qcard .tagbar .t.m-half{background:#fff4e0; color:#b7791f;}
.qcard .tagbar .t.m-good{background:#e6f7ec; color:#1e7d43;}
.qcard .tagbar .t.ans{background:#ece7fb; color:#5b46c4;}
.cfg input.ipt{min-width:150px;}

/* 打印版式面板 */
.seg.wrap{display:flex; flex-wrap:wrap; border:1px solid var(--line); border-radius:10px; overflow:hidden;}
.seg.wrap button{border:none; border-radius:0; padding:9px 12px; font-size:13px; flex:1 1 auto; min-width:72px;}
.seg.wrap button.on{background:var(--acc); color:#fff;}
.cfgPanel{display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:2px 18px;}
.rngRow .rngVal{flex:none; width:52px; text-align:right; font-size:12px; color:var(--sub);}
.sub:not(.hasBlank) .cfgPanel .rngRow:last-child{opacity:.4;}
.qcard .tagbar .t.retry{background:#fee2e2; color:#b91c1c; font-weight:600;}
.qcard .tagbar .t.cnt2{background:#eef1f5; color:#5b6472;}
.qcard .tagbtn.src{right:34px; background:#334155;}
.pracLab{font-size:12px; color:var(--sub);}

/* 原卷对照 */
.srcStage{position:relative; display:inline-block; max-width:100%; margin-top:10px;
  border:1px solid var(--line); border-radius:8px; overflow:hidden;}
.srcImg{max-width:100%; display:block;}
.srcHl{position:absolute; border:3px solid var(--acc); background:rgba(37,99,235,.16); border-radius:3px;
  box-shadow:0 0 0 9999px rgba(15,20,28,.3); pointer-events:none;}

#printArea{display:none;}
@media print{
  @page{size:A4 portrait; margin:0;}
  body>*{display:none !important;}
  #printArea{display:block !important;}
  #printArea img{width:210mm; height:297mm; display:block; page-break-after:always; break-after:page;}
}
