:root{--ink:#172033;--muted:#7b8aa1;--line:#e6ebf3;--brand:#3b6ef6;--bg:#f3f5f9;--dark:#0b1220}
*{box-sizing:border-box}
html,body{height:100%}
.layui-btn{background-color:#3b6ef6;border-radius:5px}.layui-btn:hover{background-color:#2f60e0;color:#fff}.layui-btn-primary{background-color:#fff;border-color:#dbe3ef;color:#33415a}.layui-btn-primary:hover{border-color:#b9cdf0;color:#2b5be0}.layui-btn-danger{background-color:#e0455b}.layui-btn-danger:hover{background-color:#c93a4e}.layui-btn-xs{border-radius:4px}
body{margin:0;background:var(--bg);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif}
a{text-decoration:none}
.layui-layout-admin .layui-header{background:var(--dark);height:56px;box-shadow:0 1px 0 rgba(255,255,255,.06)}
.layui-layout-admin .layui-logo{width:230px;color:#fff!important;font-size:16px;font-weight:700;letter-spacing:.2px;line-height:56px;display:flex;align-items:center;gap:9px;padding:0 18px;white-space:nowrap;overflow:visible!important;box-sizing:border-box;text-overflow:clip!important}
.layui-layout-admin .layui-logo span{white-space:nowrap}
.logo-mark{width:28px;height:28px;border-radius:8px;line-height:1!important;background:linear-gradient(135deg,#5b8cff,#8f6bff);display:flex;align-items:center;justify-content:center;line-height:1;font-weight:800;font-size:13px;color:#fff;box-shadow:0 6px 16px rgba(91,140,255,.35)}
.layui-layout-admin .layui-header .layui-nav .layui-nav-item a{color:#b9c7dc;font-size:13px}
.app-switch{height:30px!important;line-height:30px;padding:0 8px;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.06);color:#dbe7ff;border-radius:5px;width:150px;outline:none}
.layui-layout-admin .layui-header .layui-nav .layui-nav-item a:hover{color:#fff}
.layui-layout-admin .layui-side{width:230px;background:var(--dark);top:56px}
.layui-side-scroll{width:240px}
.layui-nav-tree{background:transparent!important;width:230px}
.layui-nav-tree .layui-nav-item a{height:42px;line-height:42px;color:#a8b7cc;font-size:13.5px;padding-left:22px}
.layui-nav-tree .layui-nav-item a:hover{background:rgba(255,255,255,.06);color:#fff}
.layui-layout-admin .layui-side .layui-nav-tree .layui-nav-item.layui-this{background:linear-gradient(90deg,rgba(59,110,246,.42),rgba(59,110,246,.08))!important}
.layui-layout-admin .layui-side .layui-nav-tree .layui-this>a,
.layui-layout-admin .layui-side .layui-nav-tree .layui-this>a:hover{background:linear-gradient(90deg,rgba(59,110,246,.42),rgba(59,110,246,.08))!important;color:#fff!important}
.layui-nav-tree .layui-nav-item a i{margin-right:9px;font-size:15px;color:#8fa4c2}
.layui-nav-tree .layui-this>a i{color:#8fb0ff}
.layui-nav-tree .layui-nav-child a{padding-left:46px;font-size:13px}
.side-group{height:30px;line-height:30px;padding:8px 22px 0;color:#5e718c;font-size:10.5px;letter-spacing:1.2px;text-transform:uppercase}
.nav-dim{opacity:.5}
.layui-layout-admin .layui-body{left:230px;bottom:0;background:var(--bg);overflow:auto}
.page{max-width:1500px;margin:0 auto;padding:22px 24px 40px}
.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;margin-bottom:16px;flex-wrap:wrap}
.page-head h1{font-size:21px;margin:0;letter-spacing:-.2px}
.page-head p{margin:4px 0 0;color:var(--muted);font-size:12.5px}
.head-actions{display:flex;gap:8px;flex-wrap:wrap}
.card{background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 4px 14px rgba(23,32,51,.04);margin-bottom:16px;overflow:hidden}
.card-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #eef2f8}
.card-head h3{margin:0;font-size:14.5px}
.card-body{padding:18px}
.card-body.no-pad{padding:0}
.stat-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;margin-bottom:16px}
.stat{background:#fff;border:1px solid var(--line);border-radius:10px;padding:14px 16px;box-shadow:0 4px 14px rgba(23,32,51,.04);position:relative;overflow:hidden}
.stat:before{content:"";position:absolute;right:-18px;top:-22px;width:70px;height:70px;border-radius:50%;background:var(--tint,#eef3ff)}
.stat .lbl{font-size:12px;color:var(--muted)}
.stat .val{font-size:25px;font-weight:750;letter-spacing:-.5px;margin-top:2px}
.stat .sub{font-size:11px;color:#9aa8bd}
.grid-2{display:grid;grid-template-columns:1.5fr 1fr;gap:16px}
.layui-table{margin:0}
.layui-table th{font-size:12px;color:#6d7d94;background:#fafbfd;font-weight:600}
.layui-table td{font-size:13px;color:#33415a;padding:10px 15px}
.layui-table tbody tr:hover{background:#fafcff}
.badge{display:inline-block;padding:1px 8px;border-radius:20px;font-size:11.5px;line-height:19px;background:#f0f3f9;color:#61718a}
.badge.green{background:#e9faf2;color:#0e7a50}
.badge.blue{background:#eef3ff;color:#2b5be0}
.badge.orange{background:#fff7e6;color:#9a620d}
.badge.red{background:#fff0f2;color:#b62d43}
.badge.gray{background:#f0f3f9;color:#61718a}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}
.muted{color:var(--muted)}
.tiny{font-size:12px}
.cell-sub{font-size:11.5px;color:#93a2b8;margin-top:1px}
.toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.toolbar .spacer{flex:1}
.search{position:relative;width:260px;max-width:100%}
.search .layui-input{padding-left:34px}
.search i{position:absolute;left:11px;top:10px;color:#9aa8bd;font-size:15px}
.empty{padding:46px 20px;text-align:center;color:#95a3b8}
.empty i{font-size:38px;color:#c9d5e6;display:block;margin-bottom:8px}
.empty b{display:block;color:#526178;font-weight:600;margin-bottom:2px}
.kv{display:grid;grid-template-columns:110px 1fr;gap:9px 14px;font-size:13px}
.kv dt{color:var(--muted)}
.kv dd{margin:0;word-break:break-all}
.code{background:#0f172a;color:#dbe7ff;border-radius:8px;padding:13px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;white-space:pre-wrap;max-height:320px;overflow:auto}
.copy{cursor:pointer;color:var(--brand);font-size:12px;margin-left:6px}
.notice-preview{border:1px dashed #d7e2f4;background:#fbfcff;border-radius:8px;padding:12px;margin-top:10px}
.notice-preview h4{margin:0 0 4px;font-size:13.5px}
/* login */
.login-page{min-height:100vh;display:grid;grid-template-columns:1.05fr .95fr;background:#fff}
.login-art{background:radial-gradient(900px 500px at 0% 0%,#1d4198,#0b1220 60%);color:#fff;padding:54px;display:flex;flex-direction:column;justify-content:space-between;position:relative;overflow:hidden}
.login-art:after{content:"";position:absolute;width:480px;height:480px;border-radius:50%;right:-160px;bottom:-220px;background:radial-gradient(circle,rgba(91,140,255,.35),transparent 65%)}
.login-art h2{font-size:31px;line-height:1.3;margin:0 0 12px}
.login-art p{color:#a9bcd8;line-height:1.9;max-width:420px}
.login-points{display:flex;flex-direction:column;gap:11px;margin-top:24px}
.login-points div{color:#c6d4e8;font-size:13px}
.login-points i{color:#8fb0ff;margin-right:8px}
.login-form{display:flex;align-items:center;justify-content:center;padding:36px}
.login-box{width:100%;max-width:360px}
.login-box h1{font-size:23px;margin:0 0 4px}
.login-box .lead{color:var(--muted);margin:0 0 24px;font-size:13px}
.login-box .layui-input{height:42px}
.login-box .login-input{margin-bottom:14px;padding:0 12px;font-size:13.5px}
.login-box .layui-form-item{margin-bottom:0}
.login-box .layui-btn{height:42px;line-height:42px}
.login-note{margin-top:18px;background:#f7f9fe;border:1px solid #e9eff9;border-radius:7px;padding:9px 11px;font-size:12px;color:#6f8098}
/* dialog form */
.dialog-body{padding:20px 22px 6px}
.dialog-body .layui-form-item{margin-bottom:14px}
.dialog-body .layui-form-label{width:92px;padding:9px 10px;font-size:13px;color:#5a6a80}
.dialog-body .layui-input-block{margin-left:92px}
.dialog-body .layui-input,.dialog-body .layui-textarea{font-size:13px}
.hint{font-size:11.5px;color:#93a2b8;line-height:1.7;margin-top:4px}
.app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}
.app-card{background:#fff;border:1px solid var(--line);border-radius:10px;padding:18px;cursor:pointer;transition:.15s;box-shadow:0 4px 14px rgba(23,32,51,.04)}
.app-card:hover{transform:translateY(-2px);border-color:#c9d8f6;box-shadow:0 12px 30px rgba(23,32,51,.08)}
.app-icon{width:38px;height:38px;border-radius:9px;background:#eef3ff;color:var(--brand);display:grid;place-items:center;font-weight:750;margin-bottom:12px}
.app-card h3{margin:0 0 3px;font-size:15.5px}
.app-card .id{font-size:11px;color:#9aa8bd;font-family:ui-monospace,Menlo,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.app-card .meta{margin-top:12px;display:flex;gap:7px;flex-wrap:wrap}
.page-title-link{color:var(--brand);cursor:pointer}
@media(max-width:1100px){.stat-grid{grid-template-columns:repeat(3,1fr)}.grid-2{grid-template-columns:1fr}}
@media(max-width:768px){
  .layui-layout-admin .layui-side{left:-230px;transition:left .2s;z-index:1000}
  .layui-layout-admin .layui-side.open{left:0}
  .layui-layout-admin .layui-body{left:0}
  .layui-layout-admin .layui-logo{width:auto;padding-left:14px}
  .page{padding:14px}
  .stat-grid{grid-template-columns:repeat(2,1fr);gap:9px}
  .stat .val{font-size:21px}
  .page-head h1{font-size:18px}
  .head-actions{width:100%}
  .head-actions .layui-btn{flex:1}
  .login-page{grid-template-columns:1fr}
  .login-art{display:none}
  .login-form{padding:22px}
  .search{width:100%}
  .layui-table-view{overflow:auto}
  .mobile-toggle{display:inline-block!important}
  .app-switch{display:none}
}
.mobile-toggle{display:none;color:#c7d5ea;font-size:20px;margin-right:8px;cursor:pointer}
.pager{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 16px;border-top:1px solid #eef2f8;color:#7b8aa1;font-size:12px}
.pager .layui-btn[disabled]{opacity:.45;cursor:not-allowed}
.layui-form-label{width:104px;padding:9px 10px;white-space:nowrap;box-sizing:border-box}
.layui-input-block{margin-left:104px}
.dialog-body .layui-form-label{width:96px}
.dialog-body .layui-input-block{margin-left:96px}
