.wrap{ max-width:1200px; margin:28px auto; padding:0 14px; }
    .topbar{ display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:14px; }
    .title{ font-size:22px; font-weight:900; }
    .btn{ border:1px solid var(--line); background:#fff; padding:10px 14px; border-radius:10px; cursor:pointer; }
    .btn.primary{ background:var(--accent); border-color:var(--accent); color:#fff; }
    .btn.danger{ background:var(--danger); border-color:var(--danger); color:#fff; }
    .card{ background:var(--card); border:1px solid var(--line); border-radius:var(--radius); box-shadow:var(--shadow); padding:16px; }
    .grid{ display:grid; grid-template-columns: 2fr 1fr; gap:12px; }
    .muted{ color:var(--muted); font-size:12px; }
    .row{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
    .pill{ display:inline-flex; align-items:center; gap:8px; padding:6px 10px; border:1px solid var(--line); border-radius:999px; font-size:12px; background:#fff; }
    .k{ color:var(--muted); }
    .v{ font-weight:700; }
    .tabs{ display:flex; gap:8px; flex-wrap:wrap; margin-top:12px; }
    .tab{ padding:10px 12px; border:1px solid var(--line); border-radius:12px; background:#fff; cursor:pointer; font-weight:700; font-size:13px; }
    .tab.active{ border-color:var(--accent); box-shadow:0 0 0 3px rgba(37,99,235,.12); }
    .panel{ margin-top:12px; }
    label{ display:block; font-size:12px; color:var(--muted); margin:10px 0 6px; }
    textarea, input{
      width:100%; box-sizing:border-box; border:1px solid var(--line); border-radius:12px;
      padding:10px 12px; font-size:14px; background:#fff;
    }
    textarea{ min-height:90px; resize:vertical; }
    table{ width:100%; border-collapse:separate; border-spacing:0; }
    th, td{ text-align:left; padding:10px 10px; border-bottom:1px solid var(--line); font-size:14px; }
    th{ color:var(--muted); font-weight:800; font-size:12px; }
    .right{ text-align:right; }
    .msg{ margin-top:10px; font-size:12px; white-space:pre-wrap; }
    .msg.ok{ color:var(--ok); }
    .msg.err{ color:var(--danger); }
    .skeleton{ background:linear-gradient(90deg,#f3f4f6,#e5e7eb,#f3f4f6); background-size:200% 100%; animation:sh 1.2s infinite; border-radius:10px; height:12px; }
    @keyframes sh{ 0%{background-position:200% 0} 100%{background-position:-200% 0} }
    .hidden{ display:none; }