:root{--bg:#f5f6f8;--card:#fff;--ink:#1d2430;--muted:#6b7280;--line:#e3e6eb;--pri:#1f6feb;--pri-ink:#fff;--red:#d1242f;--red-bg:#fdecec;--ok-bg:#e8f6ec;--warn-bg:#fff6e0}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif}
a{color:var(--pri);text-decoration:none}a:hover{text-decoration:underline}
.top{background:#fff;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:5}
.bar{display:flex;align-items:center;gap:16px;max-width:1200px;margin:0 auto;padding:8px 16px}
.logo{font-weight:700;font-size:17px;color:var(--ink);white-space:nowrap}
nav{display:flex;gap:4px;align-items:center;margin-left:auto;flex-wrap:wrap}
nav a,nav .link{padding:6px 10px;border-radius:6px;color:var(--ink);background:none;border:0;font:inherit;cursor:pointer}
nav a.on{background:#e8f0fe;color:var(--pri)}
nav form{margin:0}
.search{display:flex;gap:8px;max-width:1200px;margin:0 auto;padding:0 16px 10px}
.search input{flex:1;min-width:0}
.search select{width:auto;max-width:9em}
main{max-width:1200px;margin:0 auto;padding:16px}
h2{margin:8px 0 12px;font-size:20px}h3{margin:20px 0 8px;font-size:16px}
small,.muted{color:var(--muted);font-weight:normal}
.head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.head h2,.head h3{margin-bottom:8px}
.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px;margin-bottom:16px}
input,select,textarea{font:inherit;padding:7px 9px;border:1px solid #cfd4db;border-radius:6px;background:#fff;color:var(--ink);width:100%;max-width:100%}
textarea{font-family:ui-monospace,Menlo,monospace;font-size:14px}
button{font:inherit;padding:7px 14px;border:1px solid #cfd4db;border-radius:6px;background:#fff;color:var(--ink);cursor:pointer;white-space:nowrap}
button.primary{background:var(--pri);border-color:var(--pri);color:var(--pri-ink)}
button.danger{color:var(--red);border-color:#f0b4b8}
button.small{padding:3px 10px;font-size:14px}
.btns{display:flex;gap:8px;flex-wrap:wrap}
.form label{display:block;margin:0 0 10px}
.form .lbl{margin-bottom:4px}
.form.inline{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}
.form.inline label{flex:1;min-width:160px;margin:0}
.cats{display:flex;flex-wrap:wrap;gap:6px 14px;margin-bottom:10px}
.chk{display:inline-flex !important;align-items:center;gap:4px;margin:0 !important}
.chk input{width:auto}
.flash{padding:10px 14px;border-radius:8px;margin-bottom:14px}
.flash.ok{background:var(--ok-bg)}.flash.bad{background:var(--red-bg);color:var(--red)}.flash.warn{background:var(--warn-bg)}
.flash p{margin:0}.flash ul{margin:6px 0 0;padding-left:20px}
.t{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.t th,.t td{padding:8px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;overflow-wrap:anywhere}
.t th{background:#fafbfc;font-weight:600;white-space:nowrap;user-select:none}
.t th.can{cursor:pointer}.t th.can:hover{background:#f0f3f7}
.t th .arrow{color:var(--muted);font-size:12px;margin-left:3px}
.t tr:last-child td{border-bottom:0}
.t .ops{white-space:nowrap}.t .ops form{display:inline;margin:0}
.t tr.due td{color:var(--red)}.t tr.due a{color:var(--red);font-weight:600}
.red-note{display:inline-block;margin-left:6px;padding:0 6px;border-radius:4px;background:var(--red);color:#fff;font-size:12px}
.t tr.done td{color:var(--muted)}
.kv div{margin:0}
.tag{font-size:13px;padding:1px 6px;border-radius:4px;background:#eef1f5;white-space:nowrap}
.tag.新加{background:var(--ok-bg)}.tag.删除{background:var(--red-bg);color:var(--red)}.tag.修改{background:#e8f0fe}
.dn{font-weight:600}
.sortbar{display:none}
dialog{border:0;border-radius:12px;padding:18px;width:min(460px,calc(100vw - 32px));box-shadow:0 10px 40px rgba(0,0,0,.25)}
dialog.big{width:min(760px,calc(100vw - 32px))}
dialog::backdrop{background:rgba(0,0,0,.35)}
dialog h3{margin-top:0}
.danger-zone{margin-top:28px}.danger-zone summary{color:var(--muted);cursor:pointer}
.login-body{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:16px}
.login{width:100%;max-width:360px}.login h1{font-size:20px;margin:4px 0 16px}.login label{display:block;margin-bottom:12px}.login button{width:100%}
code{background:#f0f2f5;padding:1px 5px;border-radius:4px;overflow-wrap:anywhere}

@media (max-width:700px){
  body{font-size:15px}
  .bar{flex-wrap:wrap;gap:4px 8px;padding:8px 12px}
  nav{margin-left:0;width:100%;justify-content:space-between}
  nav a,nav .link{padding:6px 8px}
  .search{padding:0 12px 10px;flex-wrap:wrap}
  .search input{flex:1 1 100%}
  .search select{flex:1;max-width:none}
  main{padding:12px}
  .sortbar{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px}
  .sortbar button{padding:3px 9px;font-size:13px}
  .sortbar .lab{color:var(--muted);font-size:13px;align-self:center}
  .t,.t tbody,.t tr,.t td{display:block;width:100%}
  .t{border:0;background:none}
  .t thead{display:none}
  .t tr{background:#fff;border:1px solid var(--line);border-radius:10px;margin-bottom:10px;padding:6px 12px}
  .t td{border:0;padding:4px 0;display:flex;gap:10px}
  .t td::before{content:attr(data-label);flex:0 0 6.5em;color:var(--muted)}
  .t tr.empty td::before{content:none}
  .t td.kv{flex-wrap:wrap}.t td.kv::before{flex-basis:100%}
  .form.inline label{min-width:100%}
  dialog{padding:14px;width:calc(100vw - 24px);max-height:calc(100vh - 24px)}
  dialog.big{width:calc(100vw - 24px)}
}
