:root{--bg: #ffffff;--bg-secondary: #fafafa;--text-primary: #171717;--text-body: #4d4d4d;--text-muted: #666666;--text-faint: #999999;--border-shadow: 0px 0px 0px 1px rgba(0,0,0,.08);--card-shadow: rgba(0,0,0,.08) 0px 0px 0px 1px, rgba(0,0,0,.04) 0px 2px 2px, #fafafa 0px 0px 0px 1px;--shadow-md: rgba(0,0,0,.08) 0px 0px 0px 1px, rgba(0,0,0,.06) 0px 4px 8px;--shadow-lg: rgba(0,0,0,.1) 0px 0px 0px 1px, rgba(0,0,0,.08) 0px 8px 24px;--accent-green: #22c55e;--accent-green-bg: #f0fdf4;--accent-red: #ef4444;--accent-red-bg: #fef2f2;--accent-yellow: #eab308;--accent-yellow-bg: #fefce8;--accent-blue: #3b82f6;--accent-blue-bg: #eff6ff;--accent-purple: #8b5cf6;--radius-btn: 6px;--radius-card: 8px;--radius-badge: 9999px;--font-sans: "Geist", -apple-system, BlinkMacSystemFont, sans-serif;--font-mono: "Geist Mono", monospace;--transition: .15s ease}[data-theme=dark]{--bg: #0a0a0a;--bg-secondary: #141414;--text-primary: #e5e5e5;--text-body: #a3a3a3;--text-muted: #737373;--text-faint: #525252;--border-shadow: 0px 0px 0px 1px rgba(255,255,255,.08);--card-shadow: rgba(255,255,255,.06) 0px 0px 0px 1px, rgba(0,0,0,.3) 0px 2px 4px;--shadow-md: rgba(255,255,255,.06) 0px 0px 0px 1px, rgba(0,0,0,.4) 0px 4px 8px;--shadow-lg: rgba(255,255,255,.06) 0px 0px 0px 1px, rgba(0,0,0,.5) 0px 8px 24px;--accent-green: #4ade80;--accent-green-bg: rgba(34,197,94,.1);--accent-red: #f87171;--accent-red-bg: rgba(239,68,68,.1);--accent-yellow: #facc15;--accent-yellow-bg: rgba(234,179,8,.1);--accent-blue: #60a5fa;--accent-blue-bg: rgba(59,130,246,.1);--accent-purple: #a78bfa;color-scheme:dark}[data-theme=dark] .top-nav{background:#0a0a0a;border-bottom-color:#ffffff0f}[data-theme=dark] .input-gs{background:#1a1a1a;border-color:#ffffff1a;color:var(--text-primary)}[data-theme=dark] .input-gs:focus{box-shadow:0 0 0 1px #ffffff26,0 0 0 4px #ffffff0d}[data-theme=dark] .select-gs{background:#1a1a1a;border-color:#ffffff1a;color:var(--text-primary)}[data-theme=dark] .select-gs:focus{box-shadow:0 0 0 1px #ffffff26,0 0 0 4px #ffffff0d}[data-theme=dark] .data-table thead th{background:#141414;border-color:#ffffff0f;color:var(--text-muted)}[data-theme=dark] .data-table tbody td{border-color:#ffffff0a}[data-theme=dark] .data-table tbody tr:hover td{background:#ffffff08}[data-theme=dark] .modal-overlay{background:#000000b3}[data-theme=dark] .modal-container{background:#141414}[data-theme=dark] .modal-header,[data-theme=dark] .modal-footer{border-color:#ffffff0f}[data-theme=dark] .login-card{background:#141414}[data-theme=dark] .tab-btn{color:var(--text-muted)}[data-theme=dark] .tab-btn.active{color:var(--text-primary);border-color:var(--text-primary)}[data-theme=dark] .btn-ghost{color:var(--text-body)}[data-theme=dark] .btn-ghost:hover{background:#ffffff0f}[data-theme=dark] .filter-btn{color:var(--text-muted)}[data-theme=dark] .filter-btn.active{background:var(--text-primary);color:var(--bg)}[data-theme=dark] .progress-track,[data-theme=dark] .main-progress{background:#ffffff0f}[data-theme=dark] .preview-box{background:#0a0a0a;border-color:#ffffff0f}[data-theme=dark] ::-webkit-scrollbar-thumb{background:#ffffff26}[data-theme=dark] ::-webkit-scrollbar-thumb:hover{background:#ffffff40}[data-theme=dark] .toast-item{background:#1a1a1a;border-color:#ffffff1a;color:var(--text-primary)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-sans);background:var(--bg);color:var(--text-body);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:hidden;font-weight:400;font-size:14px;line-height:1.5}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#0000001f;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#0003}h1,h2,h3,h4,h5,h6{color:var(--text-primary);font-weight:600}.v-card{background:var(--bg);box-shadow:var(--card-shadow);border-radius:var(--radius-card);transition:box-shadow var(--transition)}.v-card:hover{box-shadow:#0000001a 0 0 0 1px,#0000000f 0 4px 8px}.stat-card{padding:16px 20px;border-radius:var(--radius-card);background:var(--bg);box-shadow:var(--card-shadow);transition:box-shadow var(--transition)}.stat-card:hover{box-shadow:var(--shadow-md)}.stat-label{font-size:12px;font-weight:500;color:var(--text-muted);margin-bottom:4px;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.04em}.stat-value{font-size:28px;font-weight:600;line-height:1.1;letter-spacing:-.96px;font-variant-numeric:tabular-nums;color:var(--text-primary);transition:color var(--transition)}.node-card{padding:16px;border-radius:var(--radius-card);background:var(--bg);box-shadow:var(--card-shadow);cursor:pointer;transition:all var(--transition);position:relative}.node-card:hover{box-shadow:var(--shadow-md);transform:translateY(-1px)}.node-card.node-up{border-left:2px solid var(--accent-green)}.node-card.node-down{border-left:2px solid var(--accent-yellow)}.node-card.node-unreachable{border-left:2px solid var(--accent-red)}.node-card.node-disabled{border-left:2px solid var(--text-faint);opacity:.5}.node-card.node-disabled:hover{opacity:.7}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0}.status-dot.running{background:var(--accent-green);box-shadow:0 0 0 3px #22c55e26;animation:pulse-dot 2s infinite}.status-dot.idle{background:var(--accent-yellow);box-shadow:0 0 0 3px #eab30826}.status-dot.down{background:var(--accent-red);box-shadow:0 0 0 3px #ef444426}.status-dot.disabled{background:var(--text-faint);box-shadow:0 0 0 3px #0000000f}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.5}}.progress-track{height:4px;background:#0000000f;border-radius:2px;overflow:hidden}.progress-fill{height:100%;border-radius:2px;transition:width .6s cubic-bezier(.4,0,.2,1)}.progress-fill.green{background:var(--accent-green)}.progress-fill.blue{background:var(--accent-blue)}.progress-fill.inactive{background:#0000001a}.main-progress{height:6px;background:#0000000f;border-radius:3px;overflow:hidden}.main-progress .progress-fill{height:100%;border-radius:3px;background:var(--text-primary)}.top-nav{background:var(--bg);box-shadow:inset 0 -1px #00000014;padding:12px 24px;position:sticky;top:0;z-index:100}.brand{font-weight:600;font-size:14px;color:var(--text-primary);display:flex;align-items:center;gap:10px;letter-spacing:-.3px}.brand-icon{width:28px;height:28px;border-radius:6px;background:var(--text-primary);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}.round-badge{font-size:11px;font-weight:500;padding:2px 8px;border-radius:var(--radius-badge);background:var(--accent-green-bg);color:var(--accent-green);font-family:var(--font-mono)}.conn-indicator{width:8px;height:8px;border-radius:50%;transition:all var(--transition)}.conn-indicator.connected{background:var(--accent-green)}.conn-indicator.disconnected{background:var(--accent-red)}.countdown-ring{width:28px;height:28px;position:relative}.countdown-ring svg{width:28px;height:28px;transform:rotate(-90deg)}.countdown-ring circle{fill:none;stroke-width:2.5}.countdown-ring .track{stroke:#0000000f}.countdown-ring .fill-ring{stroke:var(--text-primary);stroke-dasharray:75.4;stroke-dashoffset:0;stroke-linecap:round;transition:stroke-dashoffset 1s linear}.countdown-text{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:500;color:var(--text-muted);font-family:var(--font-mono)}.tab-nav{display:flex;gap:0;padding:0 24px;background:transparent;box-shadow:inset 0 -1px #00000014;overflow-x:auto}.tab-btn{padding:10px 16px;font-size:13px;font-weight:500;color:var(--text-muted);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--transition);white-space:nowrap;display:flex;align-items:center;gap:6px;font-family:var(--font-sans)}.tab-btn:hover{color:var(--text-primary)}.tab-btn.active{color:var(--text-primary);border-bottom-color:var(--text-primary)}.tab-btn .tab-key{font-size:10px;padding:1px 5px;border-radius:4px;box-shadow:var(--border-shadow);color:var(--text-faint);font-family:var(--font-mono);font-weight:400}.tab-pane{animation:fadeIn .2s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}.data-table{width:100%;border-collapse:separate;border-spacing:0}.data-table thead th{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);padding:10px 16px;box-shadow:inset 0 -1px #00000014;position:sticky;top:0;background:var(--bg);z-index:2;font-family:var(--font-mono)}.data-table tbody td{padding:10px 16px;font-size:13px;box-shadow:inset 0 -1px #0000000a;transition:background var(--transition);color:var(--text-body)}.data-table tbody tr:hover td{background:var(--bg-secondary)}.btn-primary-gs{background:var(--text-primary);color:#fff;border:none;padding:8px 16px;border-radius:var(--radius-btn);font-size:13px;font-weight:500;cursor:pointer;transition:all var(--transition);font-family:var(--font-sans)}.btn-primary-gs:hover{opacity:.85}.btn-primary-gs:disabled{opacity:.5;cursor:not-allowed}.btn-ghost{background:var(--bg);color:var(--text-body);box-shadow:var(--border-shadow);border:none;padding:6px 12px;border-radius:var(--radius-btn);font-size:13px;font-weight:500;cursor:pointer;transition:all var(--transition);font-family:var(--font-sans)}.btn-ghost:hover{background:var(--bg-secondary);box-shadow:0 0 0 1px #00000026;color:var(--text-primary)}.btn-accent{background:var(--bg);color:var(--text-primary);box-shadow:var(--border-shadow);border:none;padding:8px 16px;border-radius:var(--radius-btn);font-size:13px;font-weight:500;cursor:pointer;transition:all var(--transition);font-family:var(--font-sans)}.btn-accent:hover{background:var(--bg-secondary);box-shadow:0 0 0 1px #00000026}.btn-danger-gs{background:var(--bg);color:var(--accent-red);box-shadow:var(--border-shadow);border:none;padding:6px 12px;border-radius:var(--radius-btn);font-size:13px;font-weight:500;cursor:pointer;transition:all var(--transition);font-family:var(--font-sans)}.btn-danger-gs:hover{background:var(--accent-red-bg)}.btn-success-gs{background:var(--bg);color:var(--accent-green);box-shadow:var(--border-shadow);border:none;padding:6px 12px;border-radius:var(--radius-btn);font-size:13px;font-weight:500;cursor:pointer;transition:all var(--transition);font-family:var(--font-sans)}.btn-success-gs:hover{background:var(--accent-green-bg)}.btn-icon{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-btn);box-shadow:var(--border-shadow);background:var(--bg);color:var(--text-muted);cursor:pointer;transition:all var(--transition);font-size:13px;border:none}.btn-icon:hover{background:var(--bg-secondary);color:var(--text-primary)}.input-gs{background:var(--bg);box-shadow:var(--border-shadow);color:var(--text-primary);padding:8px 12px;border-radius:var(--radius-btn);font-size:13px;font-family:var(--font-sans);transition:all var(--transition);outline:none;width:100%;border:none}.input-gs:focus{box-shadow:0 0 0 1px #0003,0 0 0 4px #0000000f}.input-gs::placeholder{color:var(--text-faint)}.select-gs{background:var(--bg);box-shadow:var(--border-shadow);color:var(--text-primary);padding:6px 28px 6px 10px;border-radius:var(--radius-btn);font-size:13px;font-family:var(--font-sans);transition:all var(--transition);outline:none;cursor:pointer;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L5 5L9 1' stroke='%23999' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center}.select-gs:focus{box-shadow:0 0 0 1px #0003,0 0 0 4px #0000000f}.filter-group{display:flex;gap:0;border-radius:var(--radius-btn);overflow:hidden;box-shadow:var(--border-shadow)}.filter-btn{padding:5px 14px;font-size:12px;font-weight:500;background:var(--bg);color:var(--text-muted);border:none;cursor:pointer;transition:all var(--transition);font-family:var(--font-sans)}.filter-btn:hover{color:var(--text-primary);background:var(--bg-secondary)}.filter-btn.active{color:var(--text-primary);background:var(--bg-secondary);font-weight:600}.filter-btn+.filter-btn{box-shadow:inset 1px 0 #00000014}.toast-container{position:fixed;bottom:24px;right:24px;z-index:9999;display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast-item{pointer-events:auto;padding:12px 16px;border-radius:var(--radius-card);background:var(--bg);box-shadow:var(--shadow-lg);font-size:13px;color:var(--text-primary);display:flex;align-items:center;gap:10px;min-width:280px;max-width:420px;animation:toast-in .3s ease-out forwards;cursor:pointer;font-weight:500}.toast-item.removing{animation:toast-out .25s ease-in forwards}.toast-item.success{border-left:3px solid var(--accent-green)}.toast-item.error{border-left:3px solid var(--accent-red)}.toast-item.info{border-left:3px solid var(--text-primary)}.toast-item.warning{border-left:3px solid var(--accent-yellow)}.toast-icon{font-size:14px;flex-shrink:0}.toast-msg{flex:1;line-height:1.4;font-weight:400;color:var(--text-body)}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes toast-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(8px)}}.spinner{width:16px;height:16px;border:2px solid rgba(0,0,0,.08);border-top-color:var(--text-primary);border-radius:50%;animation:spin .6s linear infinite;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;z-index:1000;display:flex;align-items:center;justify-content:center;animation:modal-overlay-in .15s ease-out;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}@keyframes modal-overlay-in{0%{opacity:0}to{opacity:1}}.modal-container{background:var(--bg);border-radius:12px;box-shadow:var(--shadow-lg);max-width:560px;width:calc(100% - 32px);max-height:calc(100vh - 64px);display:flex;flex-direction:column;animation:modal-in .15s ease-out}@keyframes modal-in{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-header{padding:20px 24px 16px;display:flex;align-items:center;justify-content:space-between;box-shadow:inset 0 -1px #00000014}.modal-title{font-size:16px;font-weight:600;color:var(--text-primary);display:flex;align-items:center;gap:8px;letter-spacing:-.3px}.modal-close{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-btn);transition:all var(--transition);font-size:16px}.modal-close:hover{background:var(--bg-secondary);color:var(--text-primary)}.modal-body{padding:20px 24px;overflow-y:auto;flex:1}.modal-footer{padding:16px 24px;box-shadow:inset 0 1px #00000014;display:flex;flex-wrap:wrap;gap:6px}.login-screen{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg)}.login-card{width:360px;padding:40px;border-radius:12px;background:var(--bg);box-shadow:var(--shadow-lg)}.login-logo{width:48px;height:48px;border-radius:12px;background:var(--text-primary);display:flex;align-items:center;justify-content:center;font-size:22px;margin:0 auto 20px;color:#fff}.content-area{padding:20px 24px}.section-title{font-size:13px;font-weight:600;color:var(--text-primary);display:flex;align-items:center;gap:8px;letter-spacing:-.2px}.detail-row{display:flex;justify-content:space-between;padding:8px 0;box-shadow:inset 0 -1px #0000000a;font-size:13px}.detail-row:last-child{box-shadow:none}.detail-label{color:var(--text-muted)}.detail-value{color:var(--text-primary);font-weight:500}.preview-box{background:var(--bg-secondary);box-shadow:var(--border-shadow);border-radius:var(--radius-btn);padding:12px;max-height:300px;overflow:auto;font-family:var(--font-mono);font-size:12px;color:var(--text-body);white-space:pre-wrap;word-break:break-all}.shard-cell{width:12px;height:12px;border-radius:2px;display:inline-block;cursor:pointer;position:relative;transition:all .2s ease;margin:2px}.shard-cell:hover{transform:scale(1.6);z-index:50;box-shadow:0 0 0 1px var(--bg),0 0 0 2px var(--text-primary)}.shard-cell:hover .shard-tip{display:block;animation:tip-fade-in .15s ease-out forwards}.shard-tip{display:none;position:absolute;bottom:calc(100% + 10px);left:50%;transform:translate(-50%);background:var(--text-primary);color:var(--bg);box-shadow:var(--shadow-lg);border-radius:6px;padding:6px 10px;font-size:11px;font-family:var(--font-mono);white-space:nowrap;z-index:1000;pointer-events:none;line-height:1.4}.shard-tip:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:var(--text-primary)}@keyframes tip-fade-in{0%{opacity:0;transform:translate(-50%,4px)}to{opacity:1;transform:translate(-50%)}}.font-mono{font-family:var(--font-mono)}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.provision-step{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:6px;margin-bottom:4px;font-size:13px;transition:background .2s}.provision-step.running{background:var(--accent-blue-bg)}.provision-step.done{background:var(--accent-green-bg)}.provision-step.failed{background:var(--accent-red-bg)}.provision-step.skipped{background:var(--bg-secondary)}.provision-step .step-icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:12px;flex-shrink:0}.provision-step.running .step-icon{color:var(--accent-blue)}.provision-step.done .step-icon{color:var(--accent-green)}.provision-step.failed .step-icon{color:var(--accent-red)}.provision-step.skipped .step-icon{color:var(--text-faint)}.provision-step .step-name{font-weight:500;color:var(--text-primary);min-width:120px}.provision-step .step-msg{color:var(--text-muted);font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.step-log-panel{background:var(--bg-secondary);border-radius:0 0 6px 6px;padding:8px 12px;margin-top:-2px;margin-bottom:4px;max-height:300px;overflow-y:auto;border-left:3px solid var(--border)}.step-log-line{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);padding:1px 0;white-space:pre-wrap;word-break:break-all;line-height:1.5}.step-log-line.cmd{color:var(--accent-blue)}.step-log-line.error{color:var(--accent-red)}[data-theme=dark] .step-log-panel{background:#0d0d0d;border-left-color:#333}.cfg-label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--text-muted)}.cfg-label input,.cfg-label select{font-size:13px}.provision-input-row{display:grid;grid-template-columns:2fr 80px 120px 1fr auto;gap:8px;align-items:center;margin-bottom:8px}.provision-input-row.batch{grid-template-columns:1fr}@media(max-width:768px){.provision-input-row{grid-template-columns:1fr}}.job-card{padding:14px;border-radius:var(--radius-card);background:var(--bg);box-shadow:var(--card-shadow);margin-bottom:8px}.job-card .job-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.job-card .job-host{font-weight:600;color:var(--text-primary);font-family:var(--font-mono);font-size:13px}.job-card .job-status{font-size:11px;font-weight:500;padding:2px 8px;border-radius:var(--radius-badge);font-family:var(--font-mono)}.job-card .job-status.running{background:var(--accent-blue-bg);color:var(--accent-blue)}.job-card .job-status.done{background:var(--accent-green-bg);color:var(--accent-green)}.job-card .job-status.failed{background:var(--accent-red-bg);color:var(--accent-red)}.textarea-gs{background:var(--bg);box-shadow:var(--border-shadow);color:var(--text-primary);padding:10px 12px;border-radius:var(--radius-btn);font-size:13px;font-family:var(--font-mono);transition:all var(--transition);outline:none;width:100%;border:none;resize:vertical;min-height:120px;line-height:1.6}.textarea-gs:focus{box-shadow:0 0 0 1px #0003,0 0 0 4px #0000000f}.textarea-gs::placeholder{color:var(--text-faint)}[data-theme=dark] .textarea-gs{background:#1a1a1a;border-color:#ffffff1a;color:var(--text-primary)}[data-theme=dark] .textarea-gs:focus{box-shadow:0 0 0 1px #ffffff26,0 0 0 4px #ffffff0d}[data-theme=dark] .job-card{background:#141414}@media(max-width:768px){.top-nav{padding:10px 16px}.content-area{padding:16px}.tab-nav{padding:0 16px}.stat-card{padding:12px}.stat-value{font-size:22px}.tab-btn .tab-key{display:none}}
