:root{--pri: #0e7a46;--pri-d: #0a5c35;--bg: #f4f6f4;--card: #fff;--line: #e3e8e3;--txt: #2b3330;--muted: #77817c;--danger: #d64545;--radius: 8px}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Microsoft YaHei,PingFang SC,Arial,sans-serif;background:var(--bg);color:var(--txt);font-size:14px}button{font-family:inherit;cursor:pointer}input,select,textarea{font-family:inherit;font-size:14px;color:var(--txt)}a{color:inherit;text-decoration:none}.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#0a5c35,#16a264)}.login-card{background:#fff;border-radius:12px;padding:36px 34px;width:360px;box-shadow:0 18px 50px #0000002e}.login-card h1{font-size:20px;margin-bottom:6px;color:var(--pri)}.login-card .sub{color:var(--muted);margin-bottom:22px}.field{margin-bottom:16px}.field label{display:block;margin-bottom:6px;color:#444}.field input{width:100%;padding:11px 12px;border:1px solid var(--line);border-radius:6px}.btn{background:var(--pri);color:#fff;border:none;padding:11px;border-radius:6px;width:100%;font-size:15px;font-weight:600}.btn:hover{background:var(--pri-d)}.btn.sm{width:auto;padding:7px 15px}.btn.ghost{background:#88918d}.btn.danger{background:var(--danger)}.err{color:var(--danger);margin-bottom:12px;font-size:13px}.layout{display:flex;min-height:100vh}.side{width:220px;background:#12251f;color:#c7d6ce;flex-shrink:0;display:flex;flex-direction:column}.side .brand{padding:20px 20px 14px;font-weight:700;color:#fff;font-size:16px;border-bottom:1px solid rgba(255,255,255,.08)}.side nav a{display:block;padding:12px 22px;color:#c7d6ce;border-left:3px solid transparent}.side nav a.router-link-active{background:#ffffff0f;color:#fff;border-left-color:var(--pri)}.main{flex:1;display:flex;flex-direction:column;min-width:0}.top{background:#fff;border-bottom:1px solid var(--line);padding:13px 24px;display:flex;justify-content:space-between;align-items:center}.top .title{font-weight:700;font-size:16px}.top .user{color:var(--muted)}.content{padding:24px;flex:1}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:20px;margin-bottom:20px}.card h2{font-size:16px;margin-bottom:16px}.toolbar{display:flex;gap:10px;margin-bottom:16px;flex-wrap:wrap;align-items:center}.toolbar input,.toolbar select{padding:8px 10px;border:1px solid var(--line);border-radius:6px}.toolbar .btn{width:auto;padding:8px 16px}table{width:100%;border-collapse:collapse;background:#fff}th,td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:top}th{background:#f7f9f7;color:#55605b;font-weight:600}tr:hover td{background:#fafcfa}.img-thumb{width:52px;height:52px;object-fit:cover;border-radius:6px;background:#eef3ee}.pager{display:flex;gap:8px;justify-content:flex-end;margin-top:14px;align-items:center}.pager button{padding:6px 12px;border:1px solid var(--line);background:#fff;border-radius:6px}.pager button:disabled{opacity:.5}.tag{display:inline-block;padding:2px 8px;border-radius:20px;font-size:12px}.tag.on{background:#e3f5ea;color:var(--pri)}.tag.off{background:#f0f1f0;color:#8a928d}.tag.unread{background:#fdecec;color:var(--danger)}.empty{text-align:center;color:var(--muted);padding:30px 0}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:flex-start;justify-content:center;padding:40px 16px;z-index:50;overflow:auto}.modal{background:#fff;border-radius:10px;width:720px;max-width:100%;padding:22px}.modal.wide{width:900px}.modal h3{margin-bottom:16px}.modal .row{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}.modal .row.one{grid-template-columns:1fr}.modal label{display:block;margin-bottom:4px;color:#555;font-size:13px}.modal input,.modal select,.modal textarea{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:6px}.modal textarea{min-height:120px;resize:vertical}.modal .actions{text-align:right;margin-top:16px;display:flex;gap:10px;justify-content:flex-end}.dyn-params .prm{display:flex;gap:6px;margin-bottom:6px}.dyn-params .prm input{flex:1}.add-row{color:var(--pri);background:none;border:1px dashed var(--pri);padding:6px;border-radius:6px;width:100%}.params-key,.images-key{font-size:12px;color:var(--muted);margin:2px 0 6px}.msg-body{background:#f6f8f6;border-radius:6px;padding:10px;font-size:13px;white-space:pre-wrap;margin-top:6px}@media (max-width: 720px){.side{width:60px}.side .brand{font-size:0}.side nav a{padding:12px 0;text-align:center;font-size:12px}.content{padding:14px}.modal .row{grid-template-columns:1fr}}
