* { box-sizing: border-box; }
body { font-family: "Microsoft YaHei", sans-serif; margin: 0; background: #f5f6f8; color: #222; font-size: 14px; }
.sidebar { position: fixed; top: 0; left: 0; bottom: 0; width: 200px; background: #1f3a5f; color: #fff; display: flex; flex-direction: column; overflow-y: auto; }
.sidebar .brand { font-weight: bold; font-size: 16px; padding: 16px; border-bottom: 1px solid #2c5282; }
.side-nav { display: flex; flex-direction: column; padding: 8px 0; flex: 1; }
.side-nav a { color: #cfe0f5; text-decoration: none; padding: 10px 16px; border-left: 3px solid transparent; }
.side-nav a:hover { color: #fff; background: #2c5282; }
.side-nav a.active { color: #fff; background: #2c5282; border-left-color: #ffc857; font-weight: bold; }
.side-user { padding: 12px 16px; border-top: 1px solid #2c5282; font-size: 12px; display: flex; flex-direction: column; gap: 6px; }
.side-user .who { color: #cfe0f5; margin-bottom: 4px; }
.side-user a { color: #cfe0f5; text-decoration: none; }
.side-user a:hover { color: #fff; }
.content.with-sidebar { margin-left: 200px; }
main { padding: 16px; max-width: 1700px; margin: 0 auto; }
h2 { font-size: 18px; margin: 8px 0 12px; }
h3 { font-size: 15px; margin: 6px 0; }
table { border-collapse: collapse; width: 100%; background: #fff; }
th, td { border: 1px solid #dde3ea; padding: 5px 7px; text-align: left; white-space: nowrap; vertical-align: middle; }
th { background: #eef2f7; position: sticky; top: 0; z-index: 1; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }
.flash { margin: 10px 16px 0; padding: 8px 12px; border-radius: 4px; }
.flash.ok { background: #d8f3dc; color: #1b4332; }
.flash.error { background: #fde2e2; color: #9b1c1c; }
.card { background: #fff; border: 1px solid #dde3ea; border-radius: 6px; padding: 12px 16px; margin-bottom: 14px; }
form.inline { display: flex; gap: 8px; flex-wrap: wrap; align-items: flex-end; }
form.inline label { display: flex; flex-direction: column; font-size: 12px; color: #555; gap: 3px; }
input, select, textarea { padding: 5px 8px; border: 1px solid #c4ccd6; border-radius: 4px; font-size: 13px; font-family: inherit; }
button { padding: 6px 14px; background: #1f3a5f; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; }
button:hover { background: #2c5282; }
button.danger { background: #b23b3b; }
button.small { padding: 3px 8px; font-size: 12px; }
a.btn { display: inline-block; padding: 6px 14px; background: #3a6ea5; color: #fff; border-radius: 4px; text-decoration: none; }
a.btn.ghost { background: #fff; color: #1f3a5f; border: 1px solid #1f3a5f; }
.scroll { overflow-x: auto; max-height: 72vh; overflow-y: auto; border: 1px solid #dde3ea; border-radius: 4px; }
.muted { color: #777; font-size: 12px; }
.login-box { max-width: 360px; margin: 80px auto; }
.login-box input { width: 100%; margin-bottom: 10px; }
.login-box button { width: 100%; }
/* 统计卡 */
.stats { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.stat { background: #fff; border: 1px solid #dde3ea; border-radius: 6px; padding: 12px 18px; min-width: 130px; }
.stat .n { font-size: 24px; font-weight: bold; color: #1f3a5f; }
.stat .l { font-size: 12px; color: #777; }
/* 徽标 */
.badge { display: inline-block; padding: 1px 7px; border-radius: 10px; font-size: 12px; font-weight: bold; }
.b-green { background: #d8f3dc; color: #1b6b34; }
.b-blue { background: #dbe9fb; color: #1c5aa6; }
.b-yellow { background: #fdf0c8; color: #8a6d1b; }
.b-orange { background: #fde0cd; color: #a8530f; }
.b-red { background: #fde2e2; color: #b3201f; }
.b-grey { background: #ececec; color: #666; }
tr.todo { background: #fffdf5; }
tr.done { background: #f4fbf5; }
.filterbar { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; align-items: center; }
.filterbar a { padding: 4px 10px; border-radius: 4px; text-decoration: none; color: #1f3a5f; border: 1px solid #c4ccd6; background: #fff; font-size: 13px; }
.filterbar a.on { background: #1f3a5f; color: #fff; }
.tin { width: 92px; }
.tname { white-space: normal; min-width: 220px; max-width: 320px; }
.sticky-actions { position: sticky; bottom: 0; background: #fff; border-top: 1px solid #dde3ea; padding: 10px 0; margin-top: 8px; display: flex; gap: 10px; }
