:root{--bg-primary: #0f1117;--bg-secondary: #161822;--bg-card: #1c1f2e;--bg-card-hover: #232640;--bg-input: #12141e;--border: #2a2d3e;--border-focus: #6366f1;--text-primary: #e8eaf0;--text-secondary: #9ca3af;--text-muted: #6b7280;--accent: #6366f1;--accent-hover: #818cf8;--accent-glow: rgba(99, 102, 241, .25);--success: #10b981;--success-bg: rgba(16, 185, 129, .12);--danger: #ef4444;--danger-bg: rgba(239, 68, 68, .12);--warning: #f59e0b;--warning-bg: rgba(245, 158, 11, .12);--info: #06b6d4;--info-bg: rgba(6, 182, 212, .12);--font-sans: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;--font-mono: "JetBrains Mono", "Fira Code", monospace;--radius: 10px;--radius-sm: 6px;--radius-lg: 16px;--transition: .15s cubic-bezier(.4, 0, .2, 1)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{font-family:var(--font-sans);background:var(--bg-primary);color:var(--text-primary);line-height:1.6;-webkit-font-smoothing:antialiased}.app{min-height:100vh;display:flex;flex-direction:column}.app-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background:var(--bg-secondary);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:100;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.app-header h1{font-size:1.25rem;font-weight:700;background:linear-gradient(135deg,var(--accent),var(--info));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.02em}.app-header .status-badge{display:flex;align-items:center;gap:8px;font-size:.8rem;color:var(--text-muted)}.status-dot{width:8px;height:8px;border-radius:50%;background:var(--danger)}.status-dot.connected{background:var(--success);box-shadow:0 0 8px var(--success);animation:pulse 2s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.app-main{flex:1;max-width:1200px;width:100%;margin:0 auto;padding:32px 24px}.card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:28px;transition:border-color var(--transition),box-shadow var(--transition)}.card:hover{border-color:var(--border-focus);box-shadow:0 0 0 1px var(--accent-glow)}.card-header{margin-bottom:20px}.card-header h2{font-size:1.125rem;font-weight:600;margin-bottom:4px}.card-header p{font-size:.875rem;color:var(--text-secondary)}.form-group{margin-bottom:16px}.form-group label{display:block;font-size:.8125rem;font-weight:500;color:var(--text-secondary);margin-bottom:6px}.form-input{width:100%;padding:10px 14px;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font-sans);font-size:.875rem;outline:none;transition:border-color var(--transition),box-shadow var(--transition)}.form-input::placeholder{color:var(--text-muted)}.form-input:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-glow)}.form-input.mono{font-family:var(--font-mono);font-size:.8125rem}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 20px;border-radius:var(--radius);font-family:var(--font-sans);font-size:.875rem;font-weight:600;cursor:pointer;border:none;outline:none;transition:all var(--transition)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:linear-gradient(135deg,var(--accent),#8b5cf6);color:#fff;box-shadow:0 2px 8px var(--accent-glow)}.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 16px var(--accent-glow)}.btn-secondary{background:var(--bg-card);color:var(--text-primary);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){background:var(--bg-card-hover);border-color:var(--border-focus)}.btn-success{background:var(--success);color:#fff}.btn-sm{padding:6px 12px;font-size:.75rem;border-radius:var(--radius-sm)}.pair-page{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - 200px)}.pair-card{width:100%;max-width:440px;text-align:center}.pair-card .icon{font-size:3rem;margin-bottom:16px}.pair-code-input{text-align:center;font-family:var(--font-mono);font-size:1.75rem;letter-spacing:.5em;padding:14px 20px}.pair-status{margin-top:16px;padding:10px 16px;border-radius:var(--radius-sm);font-size:.8125rem;font-weight:500}.pair-status.detecting{background:var(--info-bg);color:var(--info)}.pair-status.success{background:var(--success-bg);color:var(--success)}.pair-status.error{background:var(--danger-bg);color:var(--danger)}.pair-status.warning{background:var(--warning-bg);color:var(--warning)}.pair-status code{font-family:var(--font-mono)}.connect-page{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - 200px)}.connect-card{width:100%;max-width:520px}.toggle-group{display:flex;gap:0;margin-bottom:20px;border-radius:var(--radius-sm);overflow:hidden;border:1px solid var(--border)}.toggle-group button{flex:1;padding:8px 16px;background:var(--bg-input);border:none;color:var(--text-secondary);font-size:.8125rem;font-weight:500;cursor:pointer;transition:all var(--transition)}.toggle-group button.active{background:var(--accent);color:#fff}.form-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}.app-main:has(.schema-page){max-width:1680px}.schema-page{display:grid;grid-template-columns:280px 1fr;gap:24px;min-height:calc(100vh - 200px)}@media(max-width:768px){.schema-page{grid-template-columns:1fr}}.table-list{list-style:none}.table-list-item{padding:10px 14px;border-radius:var(--radius-sm);cursor:pointer;font-size:.875rem;font-weight:500;transition:all var(--transition);display:flex;align-items:center;gap:8px;color:var(--text-secondary)}.table-list-item:hover{background:var(--bg-card-hover);color:var(--text-primary)}.table-list-item.active{background:var(--accent-glow);color:var(--accent-hover);border-left:3px solid var(--accent)}.table-list-item .table-icon{opacity:.6}.table-list-item .col-count{margin-left:auto;font-size:.7rem;color:var(--text-muted);background:var(--bg-input);padding:2px 6px;border-radius:4px}.detail-panel{min-width:0;display:flex;flex-direction:column;gap:20px}.detail-header{display:flex;align-items:center;justify-content:space-between}.detail-header h2{font-family:var(--font-mono);font-size:1.125rem}.columns-table{width:100%;border-collapse:collapse;font-size:.8125rem}.columns-table th{text-align:left;padding:8px 12px;color:var(--text-muted);font-weight:500;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--border)}.columns-table td{padding:8px 12px;border-bottom:1px solid var(--border);color:var(--text-secondary)}.columns-table tr:hover td{background:var(--bg-card-hover);color:var(--text-primary)}.columns-table .col-name{font-family:var(--font-mono);font-weight:500;color:var(--text-primary)}.columns-table .col-type{font-family:var(--font-mono);color:var(--info);font-size:.75rem}.badge{display:inline-block;padding:2px 6px;border-radius:4px;font-size:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em}.badge-pk{background:var(--warning-bg);color:var(--warning)}.badge-fk{background:var(--info-bg);color:var(--info)}.badge-notnull{background:var(--danger-bg);color:var(--danger)}.tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:16px}.tab{padding:10px 20px;font-size:.8125rem;font-weight:500;color:var(--text-muted);background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--transition)}.tab:hover{color:var(--text-secondary)}.tab.active{color:var(--accent-hover);border-bottom-color:var(--accent)}:root{--erd-out: #6aa9f0;--erd-in: #5ac8a8;--erd-both: #a78bda;--erd-near: #5c6474;--erd-out-soft: #9cc6f6;--erd-in-soft: #8fdcc6;--erd-focus-bg: #232a3c;--erd-rim: #6f7d92;--erd-key: #a9dfbd}.erd{display:flex;flex-direction:column;height:calc(100vh - 230px);min-height:480px;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}.erd.erd-fullscreen{height:100vh;border:none;border-radius:0;background:var(--bg-primary)}.erd-bar{flex:none;display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--border);font-size:.72rem;color:var(--text-secondary)}.erd-modes{display:flex;gap:2px;padding:2px;background:var(--bg-primary);border:1px solid var(--border);border-radius:7px}.erd-modes button{font:inherit;font-size:.75rem;padding:3px 14px;border:0;border-radius:5px;background:none;color:var(--text-secondary);cursor:pointer}.erd-modes button:hover{color:var(--text-primary)}.erd-modes button.on{background:var(--bg-card-hover);color:var(--text-primary)}.erd-modes button:focus-visible{outline:2px solid var(--erd-out);outline-offset:1px}.erd-counts{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}.erd-counts b{font-family:var(--font-mono);font-size:.8rem;color:var(--text-primary);font-weight:600}.erd-counts .o{color:var(--erd-out)}.erd-counts .i{color:var(--erd-in)}.erd-counts em{font-style:normal;font-variant-numeric:tabular-nums;color:var(--text-primary)}.erd-legend{display:flex;gap:13px;flex-wrap:wrap;justify-content:flex-end;margin-left:auto;font-size:.68rem}.erd-legend i{display:inline-block;margin-right:6px}.erd-legend i.bar{width:15px;height:2px;border-radius:1px;vertical-align:3px}.erd-legend i.dot{width:8px;height:8px;border-radius:50%;vertical-align:0}.erd-legend .out{background:var(--erd-out)}.erd-legend .in{background:var(--erd-in)}.erd-legend .both{background:var(--erd-both)}.erd-legend .near{background:var(--erd-near)}.erd-legend i.dash{width:15px;height:0;border-top:2px dashed var(--text-muted);vertical-align:3px}.erd-toggle{display:inline-flex;align-items:center;gap:6px;font-size:.68rem;color:var(--text-secondary);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none}.erd-toggle input{accent-color:var(--accent);margin:0}.erd-note{padding:7px 14px;font-size:.72rem;line-height:1.45;color:var(--warning);background:var(--warning-bg);border-bottom:1px solid var(--border)}.erd-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-secondary);cursor:pointer}.erd-btn:hover{background:var(--bg-card-hover);color:var(--text-primary)}.erd-wrap{position:relative;flex:1;min-height:0}.erd-canvas{width:100%;height:100%;display:block;cursor:grab;touch-action:none}.erd-canvas:active{cursor:grabbing}.erd-panel{position:absolute;background:#161822ed;border:1px solid var(--border);border-radius:7px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.erd-detail{left:14px;bottom:14px;max-width:min(470px,55%);padding:9px 12px;font-size:.7rem;color:var(--text-secondary);pointer-events:none}.erd-detail .hd{font-family:var(--font-mono);font-size:.75rem;color:var(--text-primary);margin-bottom:2px;word-break:break-word}.erd-detail .who{font-family:var(--font-mono);font-size:.64rem;color:var(--text-muted);margin-bottom:6px}.erd-detail ul{list-style:none;margin:0;padding:0;font-family:var(--font-mono);font-size:.7rem;color:var(--text-primary)}.erd-detail li span{color:var(--text-muted)}.erd-detail .leg+.leg{margin-top:8px;padding-top:8px;border-top:1px solid var(--border)}.erd-zoom{right:14px;bottom:14px;display:flex;gap:2px;padding:3px}.erd-zoom button{font:inherit;font-size:.75rem;min-width:28px;height:24px;padding:0 7px;border:0;border-radius:4px;background:none;color:var(--text-secondary);cursor:pointer}.erd-zoom button:hover{background:var(--bg-card-hover);color:var(--text-primary)}.erd-zoom button:focus-visible{outline:2px solid var(--erd-out);outline-offset:-1px}.erd-canvas .ghint{font-family:var(--font-sans);font-size:12px;fill:var(--text-secondary)}.erd-canvas .edge{fill:none;stroke-width:1.4px}.erd-canvas .edge.out{stroke:var(--erd-out)}.erd-canvas .edge.in{stroke:var(--erd-in)}.erd-canvas .card{cursor:pointer;outline:none}.erd-canvas .card.dead{cursor:default}.erd-canvas .card rect{fill:var(--bg-card);stroke:var(--border);stroke-width:1px}.erd-canvas .card.out rect{stroke:#31517a}.erd-canvas .card.in rect{stroke:#2f5a51}.erd-canvas .card:hover rect{fill:var(--bg-card-hover)}.erd-canvas .card .nm{font-family:var(--font-mono);font-size:12.5px;fill:var(--text-primary)}.erd-canvas .card .tb{font-family:var(--font-mono);font-size:10px;fill:var(--text-muted)}.erd-canvas .card .jn{font-family:var(--font-mono);font-size:10.5px}.erd-canvas .card.out .jn{fill:var(--erd-out-soft)}.erd-canvas .card.in .jn{fill:var(--erd-in-soft)}.erd-canvas .card .chip{font-family:var(--font-sans);font-size:9px;fill:var(--text-secondary)}.erd-canvas .card .rule{stroke:var(--border)}.erd-canvas .card:focus-visible rect{stroke:var(--text-primary);stroke-width:2px}.erd-canvas .focus{cursor:default}.erd-canvas .focus rect{fill:var(--erd-focus-bg);stroke:#4d5a6e;stroke-width:1.5px}.erd-canvas .card.focus .nm{font-size:14px;font-weight:600}.erd-canvas .focus .fc{font-family:var(--font-mono);font-size:11px;fill:var(--text-primary)}.erd-canvas .focus .fc.key{fill:var(--erd-key)}.erd-canvas .focus .fn{font-family:var(--font-mono);font-size:10px;fill:var(--text-muted)}.erd-canvas .focus .kb{font-family:var(--font-sans);font-size:8px;fill:#7fae90}.erd-canvas .lod .card .tb,.erd-canvas .lod .card .jn,.erd-canvas .lod .card .chip,.erd-canvas .lod .card .rule{display:none}.erd-canvas .lod .card .nm{font-size:15px}.erd-canvas .spoke,.erd-canvas .chord,.erd-canvas .loop{fill:none}.erd-canvas .spoke{stroke-width:1.2px}.erd-canvas .spoke.out{stroke:var(--erd-out)}.erd-canvas .spoke.in{stroke:var(--erd-in)}.erd-canvas .spoke.both{stroke:var(--erd-both)}.erd-canvas .loop{stroke:var(--erd-out);stroke-width:1.2px}.erd-canvas .chord{stroke:var(--erd-near);stroke-width:1px}.erd-canvas .edge.inferred,.erd-canvas .spoke.inferred,.erd-canvas .chord.inferred{stroke-dasharray:5 4}.erd-canvas .card.inferred rect{stroke-dasharray:4 3}.erd-canvas .node.inferred circle{fill-opacity:.45;stroke-dasharray:3 2}.erd-detail .who i{font-style:normal;color:var(--warning)}.erd-canvas .node{cursor:pointer;outline:none}.erd-canvas .node.dead{cursor:default}.erd-canvas .node circle{stroke:var(--bg-input);stroke-width:1.5px}.erd-canvas .node.out circle{fill:var(--erd-out)}.erd-canvas .node.in circle{fill:var(--erd-in)}.erd-canvas .node.both circle{fill:var(--erd-both)}.erd-canvas .node .lbl{font-family:var(--font-mono);font-size:10px;fill:var(--text-primary);pointer-events:none;paint-order:stroke;stroke:var(--bg-input);stroke-width:3px;stroke-linejoin:round}.erd-canvas .node:focus-visible circle{stroke:var(--text-primary);stroke-width:2.5px}.erd-canvas .node.hub circle{stroke:var(--erd-rim)}.erd-canvas .core circle{fill:var(--erd-focus-bg);stroke:var(--erd-rim);stroke-width:2.5px}.erd-canvas .core .lbl{font-family:var(--font-mono);font-size:15px;font-weight:600;fill:#fff;pointer-events:none;paint-order:stroke;stroke:var(--bg-input);stroke-width:5px;stroke-linejoin:round}.erd-canvas .core .halo{fill:var(--bg-input);opacity:.82}.erd-canvas .lod .node .lbl{display:none}.erd-fullscreen .node circle{stroke:var(--bg-primary)}.erd-fullscreen .node .lbl,.erd-fullscreen .core .lbl{stroke:var(--bg-primary)}.erd-fullscreen .core .halo{fill:var(--bg-primary)}@media(prefers-reduced-motion:reduce){.erd *{transition:none!important;animation:none!important}}.pair-hint{margin-top:12px;font-size:.75rem;line-height:1.5;color:var(--text-muted);text-align:left}.pair-steps{padding-left:20px}.pair-steps li+li{margin-top:4px}.pair-hint code{font-family:var(--font-mono);color:var(--info)}.copy-btn{position:relative}.copy-toast{position:absolute;top:-32px;left:50%;transform:translate(-50%);background:var(--success);color:#fff;padding:4px 10px;border-radius:var(--radius-sm);font-size:.7rem;white-space:nowrap;animation:fadeUp 1.5s ease forwards}@keyframes fadeUp{0%{opacity:1;transform:translate(-50%) translateY(0)}to{opacity:0;transform:translate(-50%) translateY(-10px)}}.indexes-list{list-style:none;font-size:.8125rem}.indexes-list li{padding:8px 12px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;color:var(--text-secondary)}.indexes-list .idx-name{font-family:var(--font-mono);color:var(--text-primary);font-weight:500}.indexes-list .idx-cols{font-family:var(--font-mono);font-size:.75rem;color:var(--info)}.badge-unique{background:var(--success-bg);color:var(--success)}.spinner{width:20px;height:20px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .6s linear infinite;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.error-msg{padding:12px 16px;background:var(--danger-bg);color:var(--danger);border-radius:var(--radius-sm);font-size:.8125rem}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;color:var(--text-muted);text-align:center}.empty-state .empty-icon{font-size:3rem;margin-bottom:16px;opacity:.4}
