*{box-sizing:border-box}body{margin:0;font-family:-apple-system,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;background:#f5f7fa;color:#333}.navbar{display:flex;align-items:center;background:#304156;color:#fff;padding:0 20px;height:50px}.navbar .brand{font-weight:600;margin-right:24px}.navbar a{color:#e0e6ed;text-decoration:none;margin-right:16px;font-size:14px}.navbar a:hover{color:#ffd04b}.navbar .spacer{flex:1}.navbar .user{font-size:14px;cursor:pointer}.navbar .user:hover{color:#ffd04b}.layout{display:flex;height:100vh}.sidebar{width:140px;background:#304156;color:#e0e6ed;display:flex;flex-direction:column;flex-shrink:0;transition:width .2s;overflow:hidden}.sidebar.collapsed{width:48px}.toggle-btn{background:transparent;border:none;color:#e0e6ed;padding:12px 0;cursor:pointer;width:100%;flex-shrink:0;border-top:1px solid #3a4d64;font-size:20px;font-weight:700;line-height:1}.toggle-btn:hover{background:#3a4d64;color:#fff}.menu-item{display:flex;align-items:center;gap:8px;padding:14px 12px;color:#e0e6ed;text-decoration:none;font-size:14px;cursor:pointer;white-space:nowrap}.menu-item .icon{width:20px;text-align:center;flex-shrink:0;display:flex;justify-content:center}.menu-item .icon svg{width:16px;height:16px}.menu-item:hover{background:#3a4d64;color:#fff}.menu-item.active{background:#263445;color:#ffd04b;border-left:3px solid #ffd04b}.sidebar.collapsed .menu-item{justify-content:center;padding:14px 0}.sidebar.collapsed .menu-item.active{border-left:none}.sub-item{display:flex;align-items:center;gap:8px;padding:12px 12px 12px 30px;color:#e0e6ed;text-decoration:none;font-size:13px;cursor:pointer;white-space:nowrap}.sub-item .icon{width:20px;text-align:center;flex-shrink:0;display:flex;justify-content:center}.sub-item .icon svg{width:14px;height:14px}.sub-item:hover{background:#3a4d64;color:#fff}.sub-item.active{background:#263445;color:#ffd04b}.sub-arrow{margin-left:auto;font-size:11px}.sidebar .spacer{flex:1}.sidebar .user-info{padding:14px 16px;border-top:1px solid #3a4d64;font-size:13px}.sidebar .username{color:#fff;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar .logout{color:#909399;cursor:pointer;font-size:12px}.sidebar .logout:hover{color:#ffd04b}.role-badge{display:inline-block;margin-left:6px;padding:0 6px;border-radius:8px;background:#67c23a;color:#fff;font-size:11px}.main{flex:1;padding:20px;overflow:auto}.page{padding:20px;max-width:1200px;margin:0 auto}.toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.toolbar-actions{display:flex;gap:8px;align-items:center}.toolbar-actions select,td select{padding:5px 8px;border:1px solid #dcdfe6;border-radius:4px;font-size:13px;background:#fff}.toolbar h3{margin:0}.btn{display:inline-block;padding:6px 14px;border:1px solid #c0c4cc;border-radius:4px;background:#fff;color:#333;cursor:pointer;font-size:13px}.btn:hover{border-color:#409eff;color:#409eff}.btn.primary{background:#409eff;border-color:#409eff;color:#fff}.btn.primary:hover{background:#66b1ff}.btn.danger{color:#f56c6c;border-color:#fbc4c4}.btn.danger:hover{background:#fef0f0}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.small{padding:3px 8px;font-size:12px}table{width:100%;border-collapse:collapse;background:#fff}th,td{border:1px solid #ebeef5;padding:9px 10px;text-align:left;font-size:13px}th{background:#f5f7fa;font-weight:600}td a{color:#409eff;text-decoration:none}tr:hover td{background:#f5f7fa}.tag{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px}.tag.on{background:#f0f9eb;color:#67c23a}.tag.off{background:#f4f4f5;color:#909399}.search-bar{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap;align-items:center}.search-bar input{padding:7px 10px;border:1px solid #dcdfe6;border-radius:4px;font-size:13px;width:160px}.search-bar select{padding:7px 8px;border:1px solid #dcdfe6;border-radius:4px;font-size:13px;background:#fff}.pagination{display:flex;align-items:center;gap:10px;margin-top:14px;font-size:13px;color:#606266}.card{max-width:480px;margin:60px auto;background:#fff;border-radius:6px;padding:30px;box-shadow:0 2px 12px #0000000f}.card.wide{max-width:560px}.form-row{margin-bottom:14px}.form-row label{display:block;font-size:13px;margin-bottom:4px;color:#606266}.form-row input{width:100%;padding:8px 10px;border:1px solid #dcdfe6;border-radius:4px;font-size:14px}.form-row input:focus{outline:none;border-color:#409eff}.form-row select{width:100%;padding:8px 10px;border:1px solid #dcdfe6;border-radius:4px;font-size:14px;background:#fff}.form-row .code-wrap{display:flex;gap:8px}.form-actions{margin-top:18px;display:flex;gap:8px}.form-actions .btn{flex:1}.links{display:flex;justify-content:space-between;margin-top:12px}.links a{color:#409eff;text-decoration:none;font-size:13px;cursor:pointer}.info-row{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid #f0f2f5;font-size:14px}.info-row:last-child{border-bottom:none}.info-label{color:#909399}.dashboard{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}.dashboard .card{margin:0}.dashboard .card h4{margin:0 0 10px;font-size:14px;color:#303133;border-bottom:1px solid #f0f2f5;padding-bottom:8px}.divider{text-align:center;color:#909399;font-size:12px;margin:14px 0;position:relative}.divider:before,.divider:after{content:"";position:absolute;top:50%;width:40%;height:1px;background:#ebeef5}.divider:before{left:0}.divider:after{right:0}.error{color:#f56c6c;font-size:13px;margin-bottom:10px}.hint{color:#909399;font-size:13px}.icp{text-align:center;padding:16px;color:#909399;font-size:13px}.icp a{color:#909399;text-decoration:none}
