@import"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@300;400;500;600&display=swap";*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--sidebar-w: 220px;--sidebar-bg: #0f1117;--sidebar-border: #1e2130;--sidebar-text: #8b92a8;--sidebar-text-active: #ffffff;--sidebar-item-hover: #1a1f2e;--sidebar-item-active-bg: #1e2540;--sidebar-item-active-border: #3d5afe;--sidebar-group-label: #3d4460;--main-bg: #f4f5f8;--content-bg: #ffffff;--border: #e4e7ef;--border-light: #f0f2f7;--text-primary: #111827;--text-secondary: #6b7280;--text-muted: #9ca3af;--accent: #3d5afe;--accent-hover: #2a46e0;--accent-light: #eef0ff;--danger: #ef4444;--danger-light: #fef2f2;--green: #10b981;--green-light: #ecfdf5;--orange: #f59e0b;--orange-light: #fffbeb;--blue-light: #eff6ff;--blue: #3b82f6;--grey-light: #f3f4f6;--grey: #9ca3af;--radius: 6px;--radius-lg: 10px;--font: "IBM Plex Sans", sans-serif;--font-mono: "IBM Plex Mono", monospace;--shadow-sm: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);--shadow: 0 4px 12px rgba(0,0,0,.08)}html,body,#root{height:100%;font-family:var(--font);background:var(--main-bg);color:var(--text-primary);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}.app-shell{display:flex;height:100vh;overflow:hidden}.app-main{flex:1;overflow-y:auto;padding:32px 36px;background:var(--main-bg)}.sidebar{width:var(--sidebar-w);flex-shrink:0;background:var(--sidebar-bg);border-right:1px solid var(--sidebar-border);display:flex;flex-direction:column;overflow:hidden}.sidebar-brand{display:flex;align-items:center;gap:10px;padding:22px 18px 20px;border-bottom:1px solid var(--sidebar-border)}.sidebar-brand-icon{font-size:22px;color:var(--accent);line-height:1;flex-shrink:0}.sidebar-brand-title{font-size:15px;font-weight:600;color:#fff;letter-spacing:.01em}.sidebar-brand-sub{font-size:10px;color:var(--sidebar-group-label);letter-spacing:.08em;text-transform:uppercase;margin-top:1px}.sidebar-nav{flex:1;overflow-y:auto;padding:12px 0}.nav-group{margin-bottom:4px}.nav-group-label{font-size:9px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--sidebar-group-label);padding:10px 18px 4px}.nav-item{display:flex;align-items:center;gap:9px;width:100%;padding:8px 18px;background:none;border:none;border-left:2px solid transparent;color:var(--sidebar-text);font-family:var(--font);font-size:13px;cursor:pointer;text-align:left;transition:background .12s,color .12s,border-color .12s}.nav-item:hover{background:var(--sidebar-item-hover);color:#d0d5e8}.nav-item--active{background:var(--sidebar-item-active-bg);border-left-color:var(--sidebar-item-active-border);color:var(--sidebar-text-active)}.nav-item-icon{font-size:14px;width:16px;text-align:center;flex-shrink:0;opacity:.7}.nav-item--active .nav-item-icon{opacity:1}.sidebar-footer{padding:14px 18px;border-top:1px solid var(--sidebar-border)}.sidebar-footer-badge{display:inline-block;background:#1a2540;color:var(--accent);font-family:var(--font-mono);font-size:10px;padding:2px 7px;border-radius:3px;border:1px solid #2a3560;margin-bottom:4px}.sidebar-footer-hint{font-size:10px;color:var(--sidebar-group-label)}.crud-page{width:100%}.page-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px;gap:16px}.page-title{font-size:22px;font-weight:600;color:var(--text-primary);letter-spacing:-.01em}.page-desc{font-size:13px;color:var(--text-secondary);margin-top:3px}.alert{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:var(--radius);margin-bottom:16px;font-size:13px}.alert-error{background:var(--danger-light);color:var(--danger);border:1px solid #fecaca}.alert button{background:none;border:none;cursor:pointer;color:inherit;opacity:.6;font-size:14px}.crud-layout{display:flex;gap:20px}.crud-layout--split .table-wrap{flex:1;min-width:0}.crud-layout:not(.crud-layout--split) .table-wrap{width:100%}.table-wrap{background:var(--content-bg);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow-sm);overflow:hidden}.data-table{width:100%;border-collapse:collapse}.data-table th{background:#fafbfc;padding:10px 14px;text-align:left;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap}.data-table td{padding:11px 14px;border-bottom:1px solid var(--border-light);font-size:13px;color:var(--text-primary);vertical-align:middle}.data-table tr:last-child td{border-bottom:none}.data-table tbody tr{cursor:pointer;transition:background .1s}.data-table tbody tr:hover{background:#fafbff}.data-table tbody tr.row--active{background:var(--accent-light)}.cell-id{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);width:40px}.cell-actions{width:80px;text-align:right;white-space:nowrap}.cell-truncate{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:11px}.empty-state{display:flex;flex-direction:column;align-items:center;gap:8px;padding:60px 20px;color:var(--text-muted);font-size:13px}.empty-icon{font-size:32px;opacity:.3;margin-bottom:4px}.loading-state{display:flex;align-items:center;justify-content:center;gap:10px;padding:60px;color:var(--text-muted)}.spinner{width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.edit-panel{width:420px;flex-shrink:0;background:var(--content-bg);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow-sm);display:flex;flex-direction:column;max-height:calc(100vh - 128px);position:sticky;top:0}.edit-panel-header{display:flex;align-items:center;justify-content:space-between;padding:16px 18px;border-bottom:1px solid var(--border)}.edit-panel-header h2{font-size:14px;font-weight:600}.edit-panel-body{flex:1;overflow-y:auto;padding:18px;display:flex;flex-direction:column;gap:14px}.edit-panel-footer{padding:14px 18px;border-top:1px solid var(--border);display:flex;gap:8px;justify-content:flex-end}.options-form{max-width:480px;display:flex;flex-direction:column;gap:20px}.form-hint{font-size:11px;color:var(--text-secondary);margin-top:2px}.form-field{display:flex;flex-direction:column;gap:5px}.form-label{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-secondary)}.required{color:var(--danger);margin-left:2px}.form-input,.form-select,.form-textarea{padding:7px 10px;border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font);font-size:13px;color:var(--text-primary);background:#fff;outline:none;transition:border-color .15s,box-shadow .15s}.form-textarea{resize:vertical;font-family:monospace;font-size:12px;line-height:1.5}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px #3d5afe1a}.form-input:disabled,.form-select:disabled,.form-textarea:disabled{background:var(--grey-light);color:var(--text-muted);cursor:default}.form-select[multiple]{height:100px;padding:4px}.toggle{display:flex;align-items:center;gap:8px;cursor:pointer;width:fit-content}.toggle input{display:none}.toggle-track{width:36px;height:20px;background:var(--border);border-radius:10px;position:relative;transition:background .2s}.toggle-track:after{content:"";position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #0003;transition:transform .2s}.toggle input:checked+.toggle-track{background:var(--accent)}.toggle input:checked+.toggle-track:after{transform:translate(16px)}.btn{padding:8px 16px;border-radius:var(--radius);font-family:var(--font);font-size:13px;font-weight:500;cursor:pointer;border:none;transition:background .15s,opacity .15s;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--accent);color:#fff}.btn-primary:hover:not(:disabled){background:var(--accent-hover)}.btn-ghost{background:transparent;color:var(--text-secondary);border:1px solid var(--border)}.btn-ghost:hover{background:var(--grey-light)}.btn-link{background:none;border:none;padding:0;color:var(--accent);font-size:11px;cursor:pointer;text-decoration:none;margin-top:2px;display:block;text-align:left}.btn-link:hover{color:var(--accent-dark, var(--accent))}.btn-icon{background:none;border:none;cursor:pointer;padding:4px 6px;border-radius:4px;font-size:14px;color:var(--text-muted);transition:background .12s,color .12s}.btn-icon:hover{background:var(--grey-light);color:var(--text-primary)}.btn-icon--edit:hover{color:var(--accent);background:var(--accent-light)}.btn-icon--delete:hover{color:var(--danger);background:var(--danger-light)}.btn-icon--danger{color:var(--danger)}.delete-confirm{display:inline-flex;gap:2px;align-items:center}.badge{display:inline-block;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:500}.badge-green{background:var(--green-light);color:#059669}.badge-grey{background:var(--grey-light);color:var(--grey)}.badge-blue{background:var(--blue-light);color:var(--blue)}.badge-orange{background:var(--orange-light);color:#d97706}.badge-yellow{background:#fef9c3;color:#854d0e}.badge-red{background:#fee2e2;color:#dc2626}.badge-purple{background:#ede9fe;color:#7c3aed}.run-status-cell{display:flex;align-items:center;gap:6px}.status-badge{display:inline-block}.col-status{white-space:nowrap;width:80px}.col-action{white-space:nowrap;width:70px}.offline-cell{display:flex;align-items:center;gap:6px}.btn-sm{padding:2px 8px;font-size:11px}.btn-danger{background:#dc2626;color:#fff;border:none}.btn-danger:hover:not(:disabled){background:#b91c1c}.btn-danger:disabled{opacity:.5;cursor:not-allowed}.resync-modal{background:var(--content-bg);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow);width:460px;display:flex;flex-direction:column}.resync-modal-header{display:flex;align-items:center;padding:16px 18px;border-bottom:1px solid var(--border)}.resync-modal-header h2{font-size:14px;font-weight:600}.resync-modal-body{padding:18px;display:flex;flex-direction:column;gap:10px}.resync-warning{font-size:13px;color:var(--text-primary);line-height:1.5}.resync-table-list{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:4px}.resync-table-list li{font-size:13px}.resync-table-list code{font-family:var(--font-mono);font-size:12px;background:var(--grey-light);padding:1px 5px;border-radius:3px}.resync-warning-strong{font-size:13px;font-weight:600;color:#dc2626}.resync-error{font-size:12px;color:#dc2626;background:#fee2e2;padding:8px 10px;border-radius:var(--radius)}.resync-modal-footer{display:flex;justify-content:flex-end;gap:8px;padding:14px 18px;border-top:1px solid var(--border)}.run-log-modal{background:var(--content-bg);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow);width:860px;max-width:96vw;max-height:80vh;display:flex;flex-direction:column}.run-log-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 18px;border-bottom:1px solid var(--border);flex-shrink:0}.run-log-modal-header h2{font-size:14px;font-weight:600}.run-log-modal-body{overflow-y:auto;padding:16px 18px}.runs-empty{font-size:13px;color:var(--text-muted);text-align:center;padding:24px 0}.run-error-msg{font-size:11px;color:#dc2626;margin-left:4px}.import-overlay{position:fixed;top:0;right:0;bottom:0;left:var(--sidebar-w);background:#0000004d;display:flex;align-items:center;justify-content:center;z-index:100}.import-panel{background:var(--content-bg);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow);width:420px;display:flex;flex-direction:column}.import-panel-header{display:flex;align-items:center;justify-content:space-between;padding:16px 18px;border-bottom:1px solid var(--border)}.import-panel-header h2{font-size:14px;font-weight:600}.import-panel-body{padding:18px;display:flex;flex-direction:column;gap:14px}.import-panel-footer{padding:14px 18px;border-top:1px solid var(--border);display:flex;gap:8px;justify-content:flex-end}.column-structure-empty{font-size:12px;color:var(--text-muted);padding:10px;background:var(--grey-light);border-radius:var(--radius);text-align:center}.column-structure-list{border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;max-height:220px;overflow-y:auto}.column-structure-list{overflow-x:auto}.column-spec-row{display:grid;grid-template-columns:auto auto auto;gap:16px;align-items:center;padding:5px 10px;border-bottom:1px solid var(--border-light);font-size:12px;font-family:var(--font-mono);white-space:nowrap;width:max-content;min-width:100%}.column-spec-row:last-child{border-bottom:none}.column-spec-name{color:var(--text-primary)}.column-spec-mssql{color:var(--text-muted);font-size:11px}.column-spec-psql{color:var(--text-muted);font-size:11px;opacity:.6}.form-readonly{padding:7px 10px;border:1px solid var(--border);border-radius:var(--radius);font-size:13px;color:var(--text-secondary);background:var(--grey-light);font-family:var(--font-mono);min-height:34px}.shuttle-modal{background:var(--content-bg);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow);width:680px;display:flex;flex-direction:column}.shuttle-body{display:flex;align-items:stretch;gap:12px;padding:18px}.shuttle-list-wrap{flex:1;display:flex;flex-direction:column;gap:6px}.shuttle-list-label{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted)}.shuttle-list{border:1px solid var(--border);border-radius:var(--radius);height:300px;overflow-y:auto;background:#fafbfc}.shuttle-item{padding:8px 12px;font-size:13px;cursor:pointer;border-bottom:1px solid var(--border-light);transition:background .1s;-webkit-user-select:none;user-select:none}.shuttle-item:last-child{border-bottom:none}.shuttle-item:hover{background:var(--accent-light)}.shuttle-item--selected{background:var(--accent-light);color:var(--accent);font-weight:500}.shuttle-empty{padding:20px;text-align:center;color:var(--text-muted);font-size:12px}.shuttle-controls{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:0 4px}.shuttle-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius);background:var(--content-bg);font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);transition:background .12s,color .12s,border-color .12s;line-height:1}.shuttle-btn:hover:not(:disabled){background:var(--accent);color:#fff;border-color:var(--accent)}.shuttle-btn:disabled{opacity:.35;cursor:not-allowed}
