:root{--bg:#f6f7f9;--card:#fff;--line:#e5e7eb;--text:#18181b;--muted:#71717a;--acc:#16a34a;--acc2:#15803d;--red:#dc2626;--hl:#2563eb;--warn:#f59e0b}
*{box-sizing:border-box}html,body{margin:0;height:100%}
body{background:var(--bg);color:var(--text);font:15px/1.5 -apple-system,"Segoe UI",Roboto,Arial,sans-serif}
.hidden{display:none!important}.grow{flex:1}.muted{color:var(--muted);font-size:13px}
.btn{border:0;background:var(--acc);color:#fff;font:inherit;font-weight:600;padding:9px 16px;border-radius:9px;cursor:pointer}
.btn:hover{background:var(--acc2)}.btn:disabled{opacity:.4;cursor:not-allowed}
.btn.ghost{background:transparent;color:var(--text);border:1px solid var(--line)}.btn.ghost:hover{background:#f1f5f9}
.btn.sm{padding:5px 10px;font-size:13px;border-radius:7px}.btn.red{background:var(--red)}
input[type=text],textarea,select{font:inherit;border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:#fff;color:var(--text);width:100%}
textarea{resize:vertical}
.top{display:flex;align-items:center;gap:10px;padding:8px 16px;background:#fff;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20}
.logo{font-weight:800;font-size:18px;color:var(--text);text-decoration:none;display:flex;align-items:center;gap:8px}
.dot{width:10px;height:10px;border-radius:50%;background:var(--acc);display:inline-block}
.top form{margin:0}.sys{font-size:12px;color:var(--muted)}
.wrap{max-width:1000px;margin:0 auto;padding:16px}
.card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px 18px;margin-bottom:16px}
.card h2{margin:0 0 6px;font-size:18px}
.drop{display:block;border:2px dashed #cbd5e1;border-radius:12px;padding:26px;text-align:center;cursor:pointer;margin:10px 0;color:var(--muted)}
.drop.over{border-color:var(--acc);background:#f0fdf4}.drop input{display:none}
.flist{margin:0 0 10px;padding-left:22px}.flist li{padding:3px 0;font-size:14px}
.flist .sz{color:var(--muted);font-size:12px}.flist .bar{height:4px;background:#e5e7eb;border-radius:3px;margin-top:3px}
.flist .bar i{display:block;height:100%;width:0;background:var(--acc);border-radius:3px}
.flist .x{border:0;background:none;color:var(--red);cursor:pointer;font-weight:700}
.row{display:flex;gap:10px;flex-wrap:wrap}.row input{flex:1;min-width:200px}
.plist{display:grid;gap:8px}
.prow{display:flex;gap:12px;align-items:center;border:1px solid var(--line);border-radius:10px;padding:8px;background:#fafafa}
.prow img,.prow .ph{width:46px;height:64px;object-fit:cover;border-radius:5px;background:#e5e7eb;flex:0 0 auto}
.prow .info{flex:1;min-width:0}.prow .info b{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.prog{height:5px;background:#e5e7eb;border-radius:3px;margin-top:4px;max-width:260px}.prog i{display:block;height:100%;background:var(--acc);border-radius:3px}
/* trình sửa */
.ed{display:flex;flex-direction:column;height:calc(100vh - 49px)}
.tool{display:flex;align-items:center;gap:6px;padding:6px 10px;background:#fff;border-bottom:1px solid var(--line);flex-wrap:wrap}
.tool select{width:auto;padding:4px 8px}.pname{cursor:pointer;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pill{font-size:12px;padding:3px 10px;border-radius:999px;background:#f1f5f9;color:var(--muted);max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pill.run{background:#fef3c7;color:#92400e}.pill.ok{background:#dcfce7;color:#166534}.pill.err{background:#fee2e2;color:#991b1b}
.body{flex:1;display:grid;grid-template-columns:110px 1fr 400px;min-height:0}
.body.nothumb{grid-template-columns:0 1fr 400px}.body.nothumb .thumbs{display:none}
.thumbs{overflow-y:auto;border-right:1px solid var(--line);background:#fff;padding:6px}
.th{position:relative;display:block;margin-bottom:6px;border:2px solid transparent;border-radius:6px;cursor:pointer;background:#e5e7eb;min-height:60px}
.th img{width:100%;display:block;border-radius:4px}.th.on{border-color:var(--acc)}
.th span{position:absolute;left:3px;top:3px;background:rgba(0,0,0,.6);color:#fff;font-size:11px;padding:0 5px;border-radius:4px}
.th.wait::after{content:"⏳";position:absolute;right:3px;bottom:3px;font-size:13px}.th.err::after{content:"⚠";position:absolute;right:3px;bottom:3px;color:var(--red)}
.viewer{overflow:auto;background:#3f3f46;padding:12px;min-width:0}
.stage{position:relative;margin:0 auto;max-width:100%;width:fit-content}
.stage img{display:block;max-width:100%;height:auto;user-select:none;-webkit-user-drag:none}
.stage.draw{cursor:crosshair}
.bx{position:absolute;border:2px solid rgba(37,99,235,.55);border-radius:4px;cursor:pointer}
.bx b{position:absolute;left:-11px;top:-11px;min-width:22px;height:22px;padding:0 4px;border-radius:11px;background:var(--red);color:#fff;font-size:12px;line-height:22px;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,.4)}
.bx.on{border-color:var(--hl);background:rgba(37,99,235,.18);box-shadow:0 0 0 3px rgba(37,99,235,.35)}
.bx.tmp{border-style:dashed;border-color:var(--warn)}
.subs{display:flex;flex-direction:column;min-height:0;border-left:1px solid var(--line);background:#fff}
.shead{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line)}
.saved{font-size:12px;color:var(--muted)}
.swait{padding:10px;background:#fffbeb;color:#92400e;font-size:14px}
.slist{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1}
.sl{border:1px solid var(--line);border-radius:10px;padding:8px;margin-bottom:8px;display:grid;grid-template-columns:28px 1fr;gap:4px 8px}
.sl.on{border-color:var(--hl);box-shadow:0 0 0 2px rgba(37,99,235,.2)}.sl.man{border-left:4px solid var(--warn)}
.sl .no{width:24px;height:24px;border-radius:12px;background:var(--red);color:#fff;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center}
.sl textarea.vi{min-height:44px;font-size:15px;padding:6px 8px}
.sl .src{grid-column:2;font-size:12.5px;color:var(--muted);border:1px dashed transparent;border-radius:6px;padding:2px 4px;cursor:text;white-space:pre-wrap}
.sl .src:focus{outline:none;border-color:var(--line);color:var(--text)}
.sl .src:empty::before{content:"(chưa có chữ gốc — câu tự viết)";font-style:italic}
.sl .act{grid-column:2;display:flex;gap:4px;flex-wrap:wrap}
.mini{border:1px solid var(--line);background:#fff;border-radius:6px;padding:1px 7px;cursor:pointer;font-size:12.5px;color:var(--text)}
.mini:hover{background:#f1f5f9}.mini.del{color:var(--red)}
.hint{padding:0 10px 10px;margin:0}
.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);background:#18181b;color:#fff;padding:10px 16px;border-radius:9px;font-size:14px;opacity:0;pointer-events:none;transition:opacity .2s;z-index:50;max-width:90vw}
.toast.show{opacity:1}.toast.err{background:var(--red)}
.idle-toast{position:fixed;left:50%;bottom:70px;transform:translateX(-50%);z-index:60;background:#18181b;color:#fff;border-radius:9px;padding:10px 14px;display:flex;gap:12px;align-items:center;font-size:14px;max-width:92vw}
.idle-toast button{border:0;border-radius:6px;padding:5px 12px;font-weight:700;cursor:pointer}
/* màn hình mã */
body.gate{display:flex;align-items:center;justify-content:center;min-height:100vh}
.lockwrap{padding:16px;width:100%;max-width:340px}.lock{background:#fff;border:1px solid var(--line);border-radius:16px;padding:22px;text-align:center}
.lock h1{font-size:20px;margin:10px 0 4px}.lock .sub{color:var(--muted);font-size:13px;margin:0 0 14px}.lock .logo{justify-content:center}
.lock #code{text-align:center;font-size:26px;letter-spacing:10px;margin-bottom:8px}
.lmsg{min-height:18px;color:var(--red);font-size:13px;visibility:hidden}.lmsg.show{visibility:visible}
.pad{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:8px}
.pad button{font:inherit;font-size:20px;padding:12px 0;border:1px solid var(--line);border-radius:10px;background:#fff;cursor:pointer}
.pad .go{background:var(--acc);color:#fff;border-color:var(--acc)}.pad .soft{color:var(--muted)}
@media (max-width:900px){
  .ed{height:auto}.body,.body.nothumb{display:block}.thumbs{display:none}.body.showthumb .thumbs{display:flex;overflow-x:auto;border:0;gap:6px}
  .body.showthumb .th{width:70px;flex:0 0 auto}.viewer{max-height:70vh}.subs{border:0;border-top:1px solid var(--line)}
  .slist{overflow:visible}.tool .pill{max-width:100%;order:9;flex-basis:100%}
}
