:root{--bg:#f4f6f8;--surface:#fff;--surface-2:#fafbfc;--surface-3:#f0f3f6;--border:#e4e8ec;--border-strong:#d2d8df;--text:#18212f;--text-2:#57616f;--text-3:#8893a1;--accent:#2563eb;--accent-press:#1d4fd7;--accent-soft:#e8f0fe;--accent-soft-border:#c9dbfb;--ok:#1e9e6a;--ok-soft:#e6f6ee;--ok-border:#bfe7d2;--warn:#c77700;--warn-soft:#fbf1de;--warn-border:#f0dcb3;--bad:#d64545;--bad-soft:#fbeaea;--bad-border:#f2c9c9;--info:#2563eb;--info-soft:#e8f0fe;--info-border:#c9dbfb;--flag:#b7791f;--flag-soft:#fcf4e1;--flag-border:#eeddb0;--radius:8px;--radius-sm:6px;--radius-lg:12px;--shadow-sm:0 1px 2px rgba(20,30,45,.06),0 1px 1px rgba(20,30,45,.04);--shadow-md:0 4px 14px rgba(20,30,45,.08),0 1px 3px rgba(20,30,45,.05);--shadow-lg:0 12px 40px rgba(20,30,45,.16),0 2px 8px rgba(20,30,45,.08);--sans:"IBM Plex Sans",-apple-system,"PingFang HK","Microsoft JhengHei","Noto Sans CJK HK","Noto Sans HK",system-ui,sans-serif;--mono:"IBM Plex Mono",ui-monospace,"SF Mono",Menlo,"Noto Sans Mono CJK HK",monospace;--row-h:42px;--pad:14px}[data-density=compact]{--row-h:36px;--pad:10px}[data-density=comfy]{--row-h:50px;--pad:18px}*{box-sizing:border-box}body,html{margin:0;padding:0;height:100%}body{font-family:var(--sans);background:var(--bg);color:var(--text);font-size:14px;line-height:1.45;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}.mono{font-family:var(--mono);font-feature-settings:"tnum" 1}::-webkit-scrollbar{width:11px;height:11px}::-webkit-scrollbar-thumb{background:#c8d0d9;border-radius:8px;border:3px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:#b2bcc8}::-webkit-scrollbar-track{background:transparent}button{font-family:inherit;cursor:pointer}input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}input:focus,select:focus,textarea:focus{outline:none}a{color:inherit;text-decoration:none}::selection{background:var(--accent-soft)}.img-ph{background:repeating-linear-gradient(135deg,#eef1f4 0 14px,#e7ebef 14px 28px);border:1px solid var(--border);color:var(--text-3);display:flex;align-items:center;justify-content:center;position:relative}.fade-in{animation:fadeIn .22s ease both}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.spin{animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(1turn)}}