dbxlite-ui 0.3.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ *{box-sizing:border-box}:root{--space-1: 2px;--space-2: 4px;--space-3: 6px;--space-4: 8px;--space-5: 10px;--space-6: 12px;--space-7: 14px;--space-8: 16px;--space-9: 20px;--space-10: 24px;--space-12: 30px;--space-14: 40px;--space-16: 60px;--radius-xs: 2px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--radius-xl: 12px;--radius-2xl: 16px;--radius-full: 9999px;--font-xs: 10px;--font-sm: 11px;--font-base: 12px;--font-md: 13px;--font-lg: 14px;--font-xl: 16px;--font-2xl: 18px;--font-3xl: 20px;--font-4xl: 24px;--font-5xl: 48px;--header-height: 48px;--tab-bar-height: 40px;--sidebar-width: 280px;--sidebar-collapsed-width: 48px;--footer-height: 32px;--min-pane-height: 100px;--max-content-width: 1800px;--z-base: 0;--z-raised: 1;--z-dropdown: 10;--z-sticky: 20;--z-overlay: 50;--z-modal-backdrop: 100;--z-modal: 110;--z-toast: 120;--z-popover: 130;--z-context-menu: 140;--color-error: #ef4444;--color-error-light: rgba(239, 68, 68, .1);--color-warning: #f59e0b;--color-warning-light: rgba(245, 158, 11, .1);--color-success: #10b981;--color-success-light: rgba(16, 185, 129, .1);--color-info: #3b82f6;--color-info-light: rgba(59, 130, 246, .1);--color-purple: #8b5cf6;--color-purple-light: rgba(139, 92, 246, .1);--progress-gradient-start: #4CAF50;--progress-gradient-end: #66BB6A;--btn-radius: var(--radius-md);--btn-transition: all .15s ease;--btn-hover-lift: translateY(-1px);--btn-active-press: translateY(0);--table-cell-padding: var(--space-4) var(--space-6);--table-row-stripe: rgba(var(--bg-secondary-rgb, 30, 30, 30), .3);--transition-fast: .1s ease;--transition-normal: .15s ease;--transition-slow: .25s ease;--focus-ring: 0 0 0 2px var(--accent);--focus-ring-offset: 0 0 0 4px var(--bg-primary);--mode-http-color: #22c55e;--mode-http-bg: rgba(34, 197, 94, .15);--mode-wasm-color: #3b82f6;--mode-wasm-bg: rgba(59, 130, 246, .15)}[data-theme=vs]{--mode-http-color: #15803d;--mode-http-bg: rgba(21, 128, 61, .12);--mode-wasm-color: #1d4ed8;--mode-wasm-bg: rgba(29, 78, 216, .12)}.mode-indicator-badge{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;font-size:11px;font-weight:600;border-radius:4px;border:none;cursor:pointer;transition:all .15s}.mode-indicator-badge.http{background-color:var(--mode-http-bg);color:var(--mode-http-color)}.mode-indicator-badge.wasm{background-color:var(--mode-wasm-bg);color:var(--mode-wasm-color)}.mode-indicator-dot{width:6px;height:6px;border-radius:50%}.mode-indicator-dot.http{background-color:var(--mode-http-color)}.mode-indicator-dot.wasm{background-color:var(--mode-wasm-color)}[data-theme=vs] .mode-indicator-badge.http{background-color:#15803d1f;color:#15803d;-webkit-text-fill-color:#15803d;background-clip:border-box}[data-theme=vs] .mode-indicator-badge.wasm{background-color:#1d4ed81f;color:#1d4ed8;-webkit-text-fill-color:#1d4ed8;background-clip:border-box}[data-theme=vs] .mode-indicator-dot.http{background-color:#15803d}[data-theme=vs] .mode-indicator-dot.wasm{background-color:#1d4ed8}.mode-indicator-dot-lg{width:8px;height:8px;border-radius:50%}.mode-indicator-dot-lg.http{background-color:var(--mode-http-color)}.mode-indicator-dot-lg.wasm{background-color:var(--mode-wasm-color)}[data-theme=vs] .mode-indicator-dot-lg.http{background-color:#15803d}[data-theme=vs] .mode-indicator-dot-lg.wasm{background-color:#1d4ed8}*:focus-visible{outline:none;box-shadow:var(--focus-ring-offset),var(--focus-ring)}button:focus-visible,[tabindex]:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none;box-shadow:var(--focus-ring-offset),var(--focus-ring)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}html{transition:background-color .3s ease,color .3s ease}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;margin:0;padding:0;background:var(--bg-secondary);color:var(--text-primary);overflow-x:hidden;transition:background-color .3s ease,color .3s ease}html,body{overscroll-behavior-x:none}.app,.header,.tab-bar,.main-compact,.result-table-container,.modal-content,.data-source-explorer{transition:background-color .3s ease,color .3s ease,border-color .3s ease}.app{min-height:100vh;display:flex;flex-direction:column;overscroll-behavior-x:none}.header{background:linear-gradient(135deg,var(--header-gradient-start) 0%,var(--header-gradient-end) 100%);background-color:rgba(var(--bg-primary-rgb),var(--header-bg-alpha));backdrop-filter:var(--header-blur);-webkit-backdrop-filter:var(--header-blur);padding:6px 8px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(var(--bg-primary-rgb),.2);box-shadow:var(--shadow-md);flex-shrink:0;position:relative;gap:20px}[data-theme=vs] .header{background:linear-gradient(135deg,#fafafa,#f5f5f5);border-bottom:1px solid #e5e5e5;box-shadow:0 1px 3px #00000014;position:relative}[data-theme=vs] .header:before{content:"";position:absolute;top:0;left:0;right:0;height:0;background:transparent;opacity:0;z-index:0}[data-theme=vs] .header>*{position:relative;z-index:1}@media(prefers-reduced-motion:reduce){.header{transition:none}}.header-section{display:flex;align-items:center;gap:12px;padding:4px 12px;position:relative}.header-left{flex-shrink:0;padding-left:6px;border-right:1px solid var(--divider-color)}.header-center{flex-shrink:0;gap:6px}.header-right{gap:8px;flex-shrink:0;margin-left:auto;padding-left:16px;border-left:1px solid var(--divider-color)}[data-theme=vs] .header-right{border-left:2px solid #d4d4d8}[data-theme=vs] .header-right:hover{background:#00000008;border-left-color:#a1a1aa;box-shadow:none}.app-title{margin:0;font-size:16px;font-weight:700;color:var(--text-primary);letter-spacing:-.5px;display:flex;align-items:center;gap:10px}[data-theme=vs] .app-title{background:linear-gradient(135deg,var(--accent) 0%,var(--success) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:800;letter-spacing:-.8px}.duckdb-badge{color:gold;text-shadow:0 1px 2px rgba(0,0,0,.3)}[data-theme=vs] .duckdb-badge{font-size:18px;color:#d97706;filter:none;text-shadow:none;opacity:1;font-weight:700;-webkit-text-fill-color:#d97706;-webkit-background-clip:unset;background-clip:unset;background:none}[data-theme=hc-light] .duckdb-badge{color:#8b6914;text-shadow:0 1px 2px rgba(139,105,20,.2)}[data-theme=vs-light] .duckdb-badge,[data-theme=github-light] .duckdb-badge,[data-theme=solarized-light] .duckdb-badge,[data-theme=ayu-light] .duckdb-badge{color:#b8860b;text-shadow:none;font-weight:700}.status-indicator{font-size:11px;padding:6px 12px;border-radius:16px;background:rgba(var(--bg-secondary-rgb),.8);border:1px solid rgba(var(--bg-primary-rgb),.3);backdrop-filter:blur(8px);transition:all .3s ease;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;min-width:0}[data-theme=vs] .status-indicator{background:var(--bg-tertiary);border:1px solid var(--border);font-weight:600;padding:5px 10px}.status-initializing{color:var(--warning);animation:pulse-warning 2s ease-in-out infinite}[data-theme=vs] .status-initializing{background:#f59e0b1a;border-color:var(--warning)}.status-error{color:var(--error);animation:shake .5s ease-in-out}[data-theme=vs] .status-error{background:#dc26261a;border-color:var(--error)}.status-ready{color:var(--success)}[data-theme=vs] .status-ready{background:#10b9811a;border-color:var(--success)}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.7}}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-4px)}75%{transform:translate(4px)}}.connector-selector{display:flex;align-items:center;gap:8px;font-size:13px}.connector-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;background:var(--connector-accent, var(--accent));box-shadow:0 0 0 3px color-mix(in srgb,var(--connector-accent, var(--accent)) 20%,transparent)}.connector-selector label{color:var(--text-secondary);font-weight:500}.connector-selector select{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);padding:6px 12px;border-radius:6px;font-size:13px;cursor:pointer;transition:all .15s ease-out;box-shadow:var(--shadow-sm)}.connector-selector select:hover{border-color:var(--border-light);transform:translateY(-1px);box-shadow:var(--shadow-md)}.connector-selector select:active{transform:translateY(0)}.connector-selector select:disabled{opacity:.5;cursor:not-allowed}.settings-button{background:transparent;color:var(--text-primary);border:1px solid transparent;padding:6px 12px;border-radius:var(--btn-radius);font-size:13px;cursor:pointer;transition:var(--btn-transition);font-weight:500}.settings-button:hover{background:var(--bg-secondary);border-color:var(--border);color:var(--accent)}.settings-button:active{background:var(--bg-tertiary)}.theme-toggle{display:flex;align-items:center;gap:6px;padding:4px 8px;border-radius:6px;transition:background .2s ease}.theme-toggle:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}.theme-toggle.theme-changing{animation:theme-pulse .4s ease-out}.theme-icon{transition:transform .3s ease,color .3s ease}.theme-icon.icon-spin{animation:icon-rotate .4s ease-out}.theme-select{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);padding:6px 10px;border-radius:6px;font-size:13px;cursor:pointer;font-weight:500;transition:all .15s ease-out}.theme-select:hover{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 20%,transparent)}.theme-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.theme-accent-dot{flex-shrink:0}@keyframes icon-rotate{0%{transform:rotate(0) scale(1)}50%{transform:rotate(180deg) scale(1.2)}to{transform:rotate(360deg) scale(1)}}@keyframes theme-pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--accent) 40%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 20%,transparent)}to{box-shadow:0 0 0 0 transparent}}.run-button-header{background:var(--accent-hover);color:#fff;border:none;padding:6px 16px;border-radius:var(--btn-radius);font-size:13px;font-weight:600;cursor:pointer;transition:var(--btn-transition);box-shadow:0 2px 8px #2563eb40,var(--shadow-sm);position:relative;overflow:hidden}.run-button-header:hover:not(:disabled){background:#1d4ed8;transform:var(--btn-hover-lift) scale(1.02);box-shadow:0 8px 20px #2563eb73,var(--shadow-md)}.run-button-header:active:not(:disabled){transform:var(--btn-active-press) scale(1.01);box-shadow:0 2px 8px #2563eb40}.run-button-header:disabled{background:var(--bg-tertiary);color:var(--text-muted);cursor:not-allowed;opacity:.6;box-shadow:none}.stop-button-header{background:#dc2626;color:#fff;border:none;padding:6px 16px;border-radius:var(--btn-radius);font-size:13px;font-weight:600;cursor:pointer;transition:var(--btn-transition);box-shadow:var(--shadow-sm);animation:pulse-glow 2s cubic-bezier(.4,0,.6,1) infinite}.stop-button-header:hover{background:#b91c1c;transform:var(--btn-hover-lift) scale(1.02);box-shadow:0 6px 16px #dc262680,var(--shadow-md)}.stop-button-header:active{transform:var(--btn-active-press) scale(1);box-shadow:var(--shadow-sm)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.8}}@keyframes pulse-glow{0%,to{box-shadow:0 0 8px #dc26264d,var(--shadow-sm)}50%{box-shadow:0 0 16px #dc262699,var(--shadow-md)}}.main{flex:1;padding:20px;display:flex;flex-direction:column;max-width:1800px;width:100%;margin:0 auto;overflow:hidden}.main-compact{flex:1;min-height:0;padding:6px;display:flex;flex-direction:column;max-width:100%;margin:0;overflow:hidden;gap:0;transition:margin-left .2s}.main-compact:has(.monaco-editor){overflow:visible}.editor-pane-compact{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--bg-primary);overflow:visible;padding:12px 16px;border:1px solid var(--border);border-radius:8px}.resize-handle-compact{height:8px;background:transparent;cursor:ns-resize;display:flex;align-items:center;justify-content:center;position:relative;margin:4px 0;user-select:none}.resize-handle-compact:hover .resize-handle-bar,.resize-handle-compact.dragging .resize-handle-bar{background:var(--accent);height:4px;width:60px}.resize-handle-bar{width:40px;height:3px;background:var(--border);border-radius:2px;transition:all var(--transition-fast)}.resize-handle-compact.dragging{background:#3b82f614}.main-compact.layout-right{flex-direction:row}.resize-handle-compact.vertical{width:8px;height:auto;align-self:stretch;cursor:col-resize}.resize-handle-compact.vertical .resize-handle-bar{width:3px;height:40px}.resize-handle-compact.vertical:hover .resize-handle-bar,.resize-handle-compact.vertical.dragging .resize-handle-bar{width:4px;height:60px}.results-wrapper{min-width:0}.results-pane-compact{background:transparent;flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.error-message{padding:10px 12px;background:#ef444426;border:1px solid var(--error);border-radius:6px;color:#fca5a5;margin-bottom:6px;font-size:12px;max-height:150px;overflow-y:auto}.result-stats-footer{container-type:inline-size;display:flex;flex-wrap:wrap;align-items:center;gap:16px;row-gap:6px;padding:5px 10px;background:var(--bg-secondary);border-top:1px solid var(--border);font-size:10px;color:var(--text-secondary);flex-shrink:0;z-index:10}@container (max-width: 640px){.table-footer-stats{font-size:9px;gap:var(--space-3)}.result-stats-footer .control-btn,.result-stats-footer .export-btn{font-size:10px;padding:3px 6px}}@container (max-width: 460px){.table-footer-stats{font-size:8px}.result-stats-footer .control-btn,.result-stats-footer .export-btn{font-size:9px;padding:2px 4px}.table-footer-stats strong{display:none}}.result-stats-footer strong{color:var(--text-primary);font-weight:600}.result-stats-footer input[type=number]{transition:border-color .2s,box-shadow .2s}.result-stats-footer input[type=number]:hover{border-color:var(--accent)}.result-stats-footer input[type=number]:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.result-stats-footer input[type=number]::-webkit-inner-spin-button,.result-stats-footer input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.result-stats-footer input[type=number]{-moz-appearance:textfield}.result-table-container{overflow-x:auto;overflow-y:auto;flex:1 1 auto;min-height:0;height:0;border:1px solid var(--border);border-radius:6px;background:var(--bg-secondary);position:relative}.result-table-container::-webkit-scrollbar{width:14px;height:14px}.result-table-container::-webkit-scrollbar-track{background:var(--bg-primary);border-radius:6px;margin:2px}.result-table-container::-webkit-scrollbar-thumb{background:var(--border-light);border-radius:6px;border:3px solid var(--bg-primary);min-height:40px}.result-table-container::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.result-table-container::-webkit-scrollbar-thumb:active{background:var(--accent)}.result-table-container::-webkit-scrollbar-corner{background:var(--bg-primary)}.result-table{width:100%;border-collapse:collapse;font-size:13px}.result-table thead{position:sticky;top:0;background:linear-gradient(135deg,var(--header-gradient-start) 0%,var(--header-gradient-end) 100%);background-color:rgba(var(--bg-primary-rgb),.95);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:10;box-shadow:0 2px 8px #00000026,0 1px 3px #0000001a}.result-table th{padding:12px 14px;text-align:left;font-weight:700;border-right:1px solid var(--divider-color);border-bottom:2px solid var(--accent);background:rgba(var(--bg-secondary-rgb),.3);color:var(--text-primary);min-width:100px;transition:all .2s ease;text-transform:uppercase;font-size:11px;letter-spacing:.8px;text-shadow:0 1px 2px rgba(0,0,0,.2)}[data-theme=vs] .result-table th{background:var(--bg-tertiary);color:var(--text-primary);border-bottom:2px solid var(--accent);text-shadow:none;font-weight:700;letter-spacing:1px}.result-table th:hover{background:rgba(var(--bg-secondary-rgb),.5);box-shadow:inset 0 0 20px #3b82f614}[data-theme=vs] .result-table th:hover{background:var(--bg-hover);box-shadow:inset 0 0 0 1px var(--accent)}.result-table tbody tr{border-bottom:1px solid var(--border)}.result-table tbody tr:hover{background:#3b82f60d}.result-table tbody tr:nth-child(2n){background:#0000001a}.result-table tbody tr:nth-child(2n):hover{background:#3b82f614}.result-table td{padding:7px 12px;border-right:1px solid var(--border);color:#e2e8f0;font-size:13px}.result-table td:first-child{font-weight:600;color:#94a3b8;background:#0003;font-size:12px}.result-table-modern{width:100%;border-collapse:collapse;font-size:13px;table-layout:auto}.result-table-modern thead{position:sticky;top:0;background:linear-gradient(135deg,var(--header-gradient-start) 0%,var(--header-gradient-end) 100%);background-color:rgba(var(--bg-primary-rgb),.95);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:10;user-select:none;box-shadow:0 2px 8px #00000026,0 1px 3px #0000001a}.result-table-modern th{padding:0;text-align:left;font-weight:600;border-right:1px solid var(--divider-color);border-bottom:2px solid var(--accent);background:rgba(var(--bg-secondary-rgb),.3);position:relative;overflow:hidden;transition:all .2s ease}.result-table-modern th:hover{background:rgba(var(--bg-secondary-rgb),.5);box-shadow:inset 0 0 20px #3b82f614}.th-content{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;position:relative}.column-name{text-transform:uppercase;font-size:11px;letter-spacing:.8px;color:var(--text-primary);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:0 1px 2px rgba(0,0,0,.2)}.row-number-header{background:rgba(var(--bg-secondary-rgb),.4);border-bottom:2px solid rgba(148,163,184,.5)}.row-number-header:hover{background:rgba(var(--bg-secondary-rgb),.6);box-shadow:inset 0 0 20px #94a3b81a}.row-number-header .th-content{justify-content:center}.row-number-header span{color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.5px}.column-resizer{position:absolute;right:0;top:0;bottom:0;width:8px;cursor:col-resize;background:transparent;z-index:2;transition:all .2s ease}.column-resizer:hover{background:linear-gradient(90deg,transparent 0%,var(--accent) 100%);box-shadow:0 0 8px #3b82f680}.column-resizer:active{background:linear-gradient(90deg,transparent 0%,var(--accent-hover) 100%);box-shadow:0 0 12px #3b82f6cc}.result-table-modern tbody tr{border-bottom:1px solid var(--border);transition:background var(--transition-fast),box-shadow var(--transition-fast)}.result-table-modern tbody tr:hover{background:var(--bg-hover);box-shadow:inset 3px 0 0 var(--accent)}.result-table-modern tbody tr:nth-child(2n){background:var(--table-row-stripe)}.result-table-modern tbody tr:nth-child(2n):hover{background:var(--bg-hover);box-shadow:inset 3px 0 0 var(--accent)}.result-table-modern td{padding:var(--table-cell-padding);border-right:1px solid var(--border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative}.result-table-modern .table-cell:after{content:"";position:absolute;right:0;top:0;bottom:0;width:30px;background:linear-gradient(to right,transparent 0%,currentColor 100%);pointer-events:none;opacity:.15;z-index:1}[data-theme=vs-dark] .result-table-modern .table-cell:after{background:linear-gradient(to right,#0f172a00,#0f172a)}[data-theme=vs] .result-table-modern .table-cell:after{background:linear-gradient(to right,#fff0,#fff)}.result-table-modern .table-cell:hover:after{opacity:.05}.row-number-cell{font-weight:600;color:var(--text-muted);background:#00000040;font-size:11px;text-align:center;padding:6px 4px}.data-cell{color:#e2e8f0;font-size:13px;font-family:SF Mono,Monaco,Inconsolata,Fira Code,monospace;transition:background .1s,box-shadow .1s}.data-cell:hover{background:#3b82f61f}.data-cell.selected-cell{background:#3b82f633;box-shadow:inset 0 0 0 1px var(--accent);position:relative}.data-cell.selected-cell:after{content:"📋";position:absolute;right:4px;top:50%;transform:translateY(-50%);font-size:10px;opacity:.6}.empty-row{text-align:center;padding:40px 20px;color:var(--text-muted);font-style:italic}.empty-state-compact{padding:30px 20px;text-align:center;color:var(--text-muted);border:1px dashed var(--border);border-radius:6px;margin:6px}.empty-state-enhanced{padding:60px 20px;text-align:center;border:1px dashed var(--border);border-radius:8px;margin:12px;background:var(--bg-secondary);animation:fadeIn .3s ease-in}@keyframes fadeIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:48px;margin-bottom:16px;opacity:.9}.empty-heading{margin:0 0 12px;font-size:18px;font-weight:600;color:var(--text-primary)}.empty-hint{margin:0 0 20px;font-size:14px;color:var(--text-secondary);line-height:1.5}.empty-shortcuts{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;background:var(--bg-tertiary);border-radius:6px;font-size:13px;color:var(--text-muted)}.empty-shortcuts kbd{background:var(--bg-primary);border:1px solid var(--border);border-radius:4px;padding:4px 8px;font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:12px;font-weight:600;color:var(--text-primary);box-shadow:0 1px 2px #0000001a}@keyframes modal-enter{0%{opacity:0;transform:scale(.95) translateY(-10px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes modal-backdrop-enter{0%{opacity:0}to{opacity:1}}.modal-overlay{position:fixed;inset:0;background:#000000bf;display:flex;align-items:center;justify-content:center;z-index:var(--z-modal-backdrop);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);animation:modal-backdrop-enter .2s ease-out}.modal-content{background:var(--bg-primary);border:1px solid var(--border);border-radius:16px;width:95%;max-width:1200px;min-height:600px;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg);animation:modal-enter .2s ease-out}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--bg-primary);z-index:var(--z-sticky)}.modal-header h2{margin:0;font-size:20px;font-weight:700;color:var(--text-primary)}.modal-close{background:transparent;border:none;color:var(--text-muted);font-size:24px;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:6px;transition:all .2s}.modal-close:hover{background:var(--bg-secondary);color:var(--text-primary)}.modal-body{padding:24px}.cell-modal-header{position:relative;overflow:visible}[data-theme=vs-dark] .cell-modal-header{background:linear-gradient(135deg,var(--bg-secondary) 0%,rgba(37,99,235,.08) 50%,var(--bg-secondary) 100%);border-bottom:2px solid rgba(37,99,235,.3);box-shadow:0 2px 8px #0000004d,inset 0 1px #ffffff0d}[data-theme=vs-dark] .cell-modal-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,transparent 0%,#2563eb 20%,#10b981 50%,#2563eb 80%,transparent 100%);opacity:.8}[data-theme=vs] .cell-modal-header{background:linear-gradient(135deg,#fff,#f0f9ff,#e0f2fe);border-bottom:2px solid var(--border-light);box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f,inset 0 1px #fffc}[data-theme=vs] .cell-modal-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#2563eb,#10b981,#2563eb);opacity:.6}.cell-data-type-badge{text-transform:uppercase;transition:all .2s ease}[data-theme=vs-dark] .cell-data-type-badge{background:linear-gradient(135deg,#2563eb26,#10b98126);color:#60a5fa;border:1px solid rgba(37,99,235,.3);box-shadow:0 0 8px #2563eb33}[data-theme=vs-dark] .cell-data-type-badge:hover{background:linear-gradient(135deg,#2563eb40,#10b98140);box-shadow:0 0 12px #2563eb66;transform:translateY(-1px)}[data-theme=vs] .cell-data-type-badge{background:linear-gradient(135deg,#dbeafe,#d1fae5);color:#1e40af;border:1px solid #93c5fd;box-shadow:0 1px 3px #2563eb33}[data-theme=vs] .cell-data-type-badge:hover{background:linear-gradient(135deg,#bfdbfe,#a7f3d0);box-shadow:0 2px 6px #2563eb4d;transform:translateY(-1px)}.modal-body>div{background:var(--bg-secondary);border:1px solid var(--border);border-radius:12px;padding:20px;margin-bottom:16px}.modal-body h3{margin-top:0;margin-bottom:16px;font-size:16px;font-weight:600;color:var(--text-primary)}.modal-body label{display:block;font-size:13px;font-weight:500;margin-bottom:6px;color:var(--text-secondary)}.modal-body input[type=password],.modal-body input[type=text],.modal-body textarea{width:100%;padding:8px 12px;background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);font-size:13px;margin-bottom:12px;font-family:inherit}.modal-body input:focus,.modal-body textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #3b82f61a}.modal-body button{background:var(--accent);color:#fff;border:none;padding:8px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;transition:all .2s;margin-right:8px}.modal-body button:hover{background:var(--accent-hover)}.modal-body progress{width:100%;height:6px;border-radius:3px}.tab-bar{background:var(--bg-secondary);border-bottom:1px solid var(--border);padding:8px 0 0;margin-top:-8px;display:flex;align-items:center;transition:margin-left .2s;flex-shrink:0}.tab-list{display:flex;align-items:center;gap:2px;padding:4px 8px;overflow-x:auto;flex:1}.tab-examples{margin-left:auto;border:1px solid var(--accent-muted, color-mix(in srgb, var(--accent) 30%, transparent));background:var(--accent-muted, color-mix(in srgb, var(--accent) 10%, transparent));color:var(--accent);border-radius:6px;padding:6px 10px;font-size:12px;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.tab-examples.active,.tab-examples:hover{background:var(--accent-muted, color-mix(in srgb, var(--accent) 20%, transparent));border-color:var(--accent);box-shadow:0 0 8px var(--accent-muted, color-mix(in srgb, var(--accent) 30%, transparent))}.tab{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--bg-primary);border:1px solid transparent;border-top:2px solid transparent;border-radius:6px 6px 0 0;cursor:pointer;font-size:13px;color:var(--text-secondary);transition:all .2s;min-width:100px;max-width:200px;white-space:nowrap}.tab:hover{background:var(--bg-tertiary);color:var(--text-primary)}.tab.active{background:var(--bg-primary);color:var(--text-primary);border-color:var(--border);border-bottom-color:var(--bg-primary);position:relative;z-index:1}.tab.active:after{content:"";position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent);border-radius:2px 2px 0 0}.tab.file-backed{border-left:3px solid #4b5563;padding-left:9px}[data-theme=vs] .tab.file-backed{border-left-color:#9ca3af}.tab.file-backed.active{border-left:3px solid var(--accent);padding-left:9px}.tab.editing{background:var(--bg-tertiary);border-top-color:var(--accent)}@keyframes pulse-border{0%,to{border-top-color:var(--accent)}50%{border-top-color:var(--accent-hover)}}.tab.editing.active{animation:pulse-border 2s ease-in-out infinite}.tab-name{flex:1;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.tab-name-input{background:var(--bg-tertiary);border:1px solid var(--accent);border-radius:4px;padding:2px 6px;color:var(--text-primary);font-size:13px;outline:none;width:100%}.dirty-indicator{color:var(--warning);margin-left:4px;font-weight:700}.unsaved-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background-color:#f59e0b;margin-right:6px;vertical-align:middle;flex-shrink:0}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.unsaved-dot{animation:pulse 2s ease-in-out infinite}.tab-close{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px 4px;border-radius:3px;font-size:14px;line-height:1;transition:all var(--transition-fast);opacity:0}.tab:hover .tab-close,.tab.active .tab-close{opacity:1}.tab-close:hover{background:var(--error);color:#fff}.tab-add{background:none;border:1px solid var(--border);color:var(--text-secondary);cursor:pointer;padding:4px 12px;border-radius:6px;font-size:16px;line-height:1;transition:all .2s;margin-left:4px}.tab-add:hover{background:var(--accent);color:#fff;border-color:var(--accent)}.tab-add:disabled{opacity:.4;cursor:not-allowed;background:none;border-color:var(--border);color:var(--text-muted)}.file-button{background:transparent;color:var(--text-primary);border:1px solid transparent;padding:6px 12px;border-radius:var(--btn-radius);font-size:13px;font-weight:500;cursor:pointer;transition:var(--btn-transition);white-space:nowrap}.file-button:hover:not(:disabled){background:var(--bg-secondary);border-color:var(--border)}.file-button:active:not(:disabled){background:var(--bg-tertiary)}.file-button:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}@media(max-width:1100px){.duckdb-badge{display:none}}@media(max-width:768px){.header{flex-direction:column;gap:12px;align-items:stretch}.header-left,.header-center,.header-right{justify-content:space-between;border-right:none;border-left:none;padding-right:0;border-bottom:2px solid var(--divider-color);padding-bottom:12px}.header-left{border-top:3px solid rgba(59,130,246,.4)}.header-center{border-top:3px solid rgba(6,182,212,.4)}.header-right{border-top:3px solid rgba(255,240,0,.4);border-bottom:none;padding-bottom:0}.main{padding:12px;gap:12px}.modal-content{width:95%;max-height:90vh}.tab-list{overflow-x:scroll}.file-button{font-size:11px;padding:5px 8px}}.resizable-explorer{position:fixed;left:0;top:52px;bottom:0;background:var(--bg-primary);border-right:1px solid var(--border);z-index:var(--z-overlay);box-shadow:var(--shadow-sm);display:flex;flex-direction:column}.explorer-resize-handle{position:fixed;top:72px;bottom:0;width:6px;cursor:col-resize;z-index:var(--z-overlay);display:flex;align-items:center;justify-content:center}.explorer-resize-handle:hover .resize-handle-indicator,.explorer-resize-handle.resizing .resize-handle-indicator{background:var(--accent);opacity:1}.resize-handle-indicator{width:2px;height:40px;background:var(--border);border-radius:2px;opacity:0;transition:all .2s}.data-source-explorer{width:100%;height:100%;display:flex;flex-direction:column;position:relative}.data-source-explorer.drag-over{border:2px dashed var(--accent)}.drag-drop-overlay{position:absolute;inset:0;background:#3b82f61a;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000;pointer-events:none}.drag-drop-message{background:var(--bg-secondary);padding:32px;border-radius:12px;border:2px dashed var(--accent);text-align:center}.drag-drop-icon{font-size:48px;margin-bottom:16px}.drag-drop-message>div:nth-child(2){font-size:18px;font-weight:600;color:var(--text-primary);margin-bottom:8px}.drag-drop-hint{font-size:14px;color:var(--text-secondary)}.explorer-header{padding:8px 16px 10px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;background:var(--bg-secondary);flex-shrink:0;transition:all .2s ease}[data-theme=vs] .explorer-header{background:linear-gradient(to bottom,var(--bg-primary),var(--bg-secondary));border-bottom:1px solid var(--border-light);box-shadow:var(--shadow-sm)}.explorer-title{font-size:13px;font-weight:600;margin:0;color:var(--text-primary);letter-spacing:.3px;text-transform:uppercase;font-size:11px}[data-theme=vs] .explorer-title{color:var(--text-primary);font-weight:700}.explorer-header-actions{display:flex;gap:4px;align-items:center}.explorer-action-btn{background:none;border:none;color:var(--text-secondary);font-size:18px;cursor:pointer;padding:4px 8px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.explorer-action-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.explorer-close-btn{background:none;border:none;color:var(--text-secondary);font-size:24px;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.explorer-close-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.explorer-search{padding:8px 12px;border-bottom:1px solid var(--border);background:var(--bg-secondary);display:flex;align-items:center;gap:6px;flex-shrink:0}.search-input{flex:1;min-width:0;padding:6px 10px;background:var(--bg-primary);border:1px solid var(--border);border-radius:4px;color:var(--text-primary);font-size:13px;outline:none;transition:all .2s}.search-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.search-input::placeholder{color:var(--text-muted)}.search-actions{display:flex;align-items:center;gap:2px;flex-shrink:0}.search-action-btn{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:4px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.search-action-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.search-clear-btn{background:none;border:none;color:var(--text-muted);font-size:18px;cursor:pointer;padding:2px;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.search-clear-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.explorer-content{flex:1;overflow-y:auto;overflow-x:hidden}.explorer-content.unified{padding:8px 0}.explorer-content.unified .empty-state{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:40px 8px;gap:12px;position:relative;height:100%}.empty-state-icon{font-size:48px;opacity:.3}.empty-state-text{font-size:14px;font-weight:500;color:var(--text-muted)}.empty-state-hint{font-size:12px;color:var(--text-muted);opacity:.7}.empty-state-size-note{font-size:11px;color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);padding:6px 12px;border-radius:12px;font-weight:500;margin-top:4px}.empty-state-details{display:flex;flex-direction:column;gap:6px;margin-top:12px;padding:12px;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border-light);width:100%}.empty-state-detail-row{display:flex;gap:8px;font-size:11px;align-items:flex-start}.empty-state-detail-row .detail-label{color:var(--text-secondary);white-space:nowrap;min-width:70px}.empty-state-detail-row .detail-value{color:var(--text-muted);flex:1}.empty-state-examples-section{margin-top:16px;padding-top:16px;border-top:1px dashed var(--border);width:100%}.empty-state-examples-section .examples-carousel{margin:0;padding:8px 0}.empty-state-examples-header{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;text-align:center;margin-bottom:12px}.empty-state-samples{margin-top:20px;padding-top:16px;border-top:1px dashed var(--border);width:100%;max-width:280px}.empty-state-samples-title{font-size:11px;color:var(--text-muted);margin-bottom:10px;text-transform:uppercase;letter-spacing:.5px}.empty-state-samples-list{display:flex;flex-direction:column;gap:6px}.sample-query-link{background:var(--bg-secondary);border:1px solid var(--border);border-radius:4px;padding:8px 12px;font-size:12px;color:var(--accent);cursor:pointer;text-align:left;transition:all .15s ease}.sample-query-link:hover{background:var(--bg-tertiary);border-color:var(--accent);transform:translate(2px)}.sample-query-link:active{transform:translate(2px) scale(.98)}.empty-state-examples{position:absolute;bottom:16px;left:8px;right:8px}.empty-state-examples .examples-carousel{margin:0}.examples-carousel{display:grid;grid-template-columns:28px 1fr 28px;grid-template-rows:1fr auto;gap:8px;padding:12px;margin:8px}.examples-carousel-nav{width:28px;height:28px;border-radius:50%;border:1px solid var(--border);background:var(--bg-secondary);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;align-self:center;color:var(--text-muted);flex-shrink:0}.examples-carousel-nav:hover{background:var(--accent);border-color:var(--accent);color:#fff;transform:scale(1.05)}.examples-carousel-card{background:linear-gradient(135deg,color-mix(in srgb,var(--category-color, var(--accent)) 8%,var(--bg-secondary)),var(--bg-secondary));border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px;transition:all .2s ease;height:240px;display:flex;flex-direction:column;overflow:hidden}.examples-carousel-card:hover{border-color:var(--category-color, var(--accent));box-shadow:0 4px 12px #00000014;transform:translateY(-1px)}.examples-carousel-header{display:flex;align-items:center;gap:8px;font-size:var(--font-md);font-weight:600;color:var(--category-color, var(--accent));margin-bottom:12px;cursor:pointer;transition:opacity .15s ease;flex-shrink:0}.examples-carousel-header:hover{opacity:.8}.examples-carousel-examples{display:flex;flex-direction:column;gap:8px;flex:1;overflow-y:auto;min-height:0}.examples-carousel-example{display:block;width:100%;text-align:left;padding:10px 12px;background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:all .15s ease}.examples-carousel-example:hover{border-color:var(--category-color, var(--accent));background:var(--bg-tertiary);transform:translate(2px)}.examples-carousel-example .example-label{display:block;font-size:var(--font-sm);font-weight:500;color:var(--text-primary)}.examples-carousel-example .example-hint{display:block;font-size:11px;color:var(--text-muted);margin-top:3px}.examples-carousel-more{background:none;border:none;color:var(--category-color, var(--accent));font-size:var(--font-sm);cursor:pointer;padding:6px 0 0;text-align:left;transition:all .15s ease;flex-shrink:0}.examples-carousel-more:hover{text-decoration:underline}.examples-carousel-dots{grid-column:1 / -1;display:flex;justify-content:center;gap:6px;padding-top:10px}.examples-carousel-dot{width:8px;height:8px;border-radius:50%;border:none;background:var(--border);cursor:pointer;transition:all .2s ease;padding:0}.examples-carousel-dot.active{width:10px;height:10px;background:var(--dot-color, var(--accent))}.examples-carousel-dot:hover:not(.active){background:var(--text-muted);transform:scale(1.1)}.explorer-section{border-bottom:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0}.data-source-section{margin-bottom:8px}.data-source-section:last-child{margin-bottom:0}.section-header{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;user-select:none;background:var(--bg-secondary);transition:all .2s ease;font-weight:600;font-size:12px;letter-spacing:.5px;text-transform:uppercase}.section-header:hover{background:var(--bg-tertiary)}[data-theme=vs] .section-header{background:var(--bg-tertiary);color:var(--text-secondary);border-radius:6px;margin:4px 8px;font-weight:700}[data-theme=vs] .section-header:hover{background:var(--bg-hover);color:var(--text-primary)}.section-icon{font-size:14px;color:var(--text-muted);transition:color .2s ease}[data-theme=vs] .section-icon{color:var(--accent)}[data-theme=vs] .section-header:hover .section-icon{color:var(--accent-hover)}.connection-placeholder{display:flex;align-items:center;gap:10px;padding:10px 16px;margin:4px 8px;background:var(--bg-secondary);border:1px dashed var(--border);border-radius:6px;cursor:pointer;transition:all .2s}.connection-placeholder:hover{background:var(--bg-tertiary);border-color:var(--accent)}.connection-icon{font-size:18px}.connection-name{flex:1;font-size:13px;font-weight:500;color:var(--text-primary)}.connection-status{font-size:11px;color:var(--text-muted);padding:2px 8px;background:var(--bg-tertiary);border-radius:10px}.connection-action{font-size:14px;color:var(--accent);opacity:.7;transition:opacity .2s}.connection-placeholder:hover .connection-action{opacity:1}.section-title{flex:1;font-size:13px;font-weight:600;color:var(--text-primary)}.section-count{font-size:11px;color:var(--text-muted);background:var(--bg-tertiary);padding:2px 6px;border-radius:10px}.section-content{background:var(--bg-primary);overflow-y:auto;overflow-x:hidden;height:calc(100% - 40px)}.empty-state{padding:16px;text-align:center;color:var(--text-muted);font-size:12px;font-style:italic}.empty-state.server-mode{padding:24px 16px;display:flex;flex-direction:column;gap:20px;font-style:normal;height:100%;justify-content:flex-start}.empty-state.server-mode .empty-state-icon{margin-bottom:4px}.empty-state.server-mode .empty-state-text{font-size:16px;font-weight:600;color:var(--text-primary);margin:0}.empty-state.server-mode .empty-state-hint{font-size:12px;color:var(--text-muted);margin-top:-12px}.server-tips{display:flex;flex-direction:column;gap:12px;text-align:left;margin-top:8px}.server-tip{display:flex;gap:12px;align-items:flex-start;padding:12px;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border)}.server-tip-icon{font-size:18px;line-height:1;flex-shrink:0}.server-tip-content{display:flex;flex-direction:column;gap:4px;min-width:0}.server-tip-title{font-size:12px;font-weight:600;color:var(--text-primary)}.server-tip code{font-size:11px;color:var(--text-secondary);background:var(--bg-tertiary);padding:4px 8px;border-radius:4px;font-family:var(--font-mono);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.server-tip-desc{font-size:11px;color:var(--text-secondary)}button.server-tip-clickable{width:100%;cursor:pointer;transition:all .15s ease;text-align:left}button.server-tip-clickable:hover{background:var(--bg-tertiary);border-color:var(--accent-color)}button.server-tip-clickable:active{transform:scale(.98)}.server-shortcuts{display:flex;justify-content:center;gap:16px;margin-top:auto;padding-top:16px;border-top:1px solid var(--border)}.server-shortcuts .shortcut{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--text-muted)}.server-shortcuts kbd{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;font-size:11px;font-family:var(--font-mono);background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;box-shadow:0 1px 0 var(--border)}.section-resize-handle{height:6px;cursor:row-resize;display:flex;align-items:center;justify-content:center;position:relative;background:var(--bg-secondary);border-top:1px solid var(--border);border-bottom:1px solid var(--border);transition:background .2s;flex-shrink:0}.section-resize-handle:hover{background:var(--bg-tertiary)}.section-resize-handle:hover .section-resize-indicator,.section-resize-handle.resizing .section-resize-indicator{background:var(--accent);opacity:1}.section-resize-indicator{width:40px;height:2px;background:var(--border);border-radius:2px;opacity:.5;transition:all .2s}.database-tree,.file-list{padding:4px 0}.file-list-warning{display:flex;align-items:center;gap:8px;padding:8px 12px;margin:4px 8px;background:#ffc1071a;border:1px solid rgba(255,193,7,.3);border-radius:4px;font-size:12px}.warning-icon{font-size:14px}.warning-text{flex:1;color:var(--text-secondary)}.warning-action-btn{background:var(--accent);color:#fff;border:none;padding:4px 12px;border-radius:4px;font-size:11px;font-weight:500;cursor:pointer;transition:all .2s}.warning-action-btn:hover{background:var(--accent-hover)}.file-unavailable{opacity:.6;background:#ff00000d}.file-unavailable:hover{opacity:.8;background:#ff00001a}.unavailable-badge{margin-left:4px;font-size:12px;opacity:.8}.permission-granted-badge{margin-left:4px;font-size:11px;color:#4ade80;opacity:.9}.permission-needed-badge{margin-left:4px;font-size:12px;opacity:.8;transition:opacity .2s,transform .2s}.permission-needed-badge:hover{opacity:1;transform:scale(1.1)}.permission-denied-badge{margin-left:4px;font-size:12px;color:#ef4444;opacity:.9}.file-remote{background:#0096ff0d;border-left:2px solid rgba(0,150,255,.3)}.file-remote:hover{background:#0096ff1a}.remote-badge{margin-left:4px;font-size:11px;opacity:.7}.file-reload-btn{padding:4px 8px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:all .2s;opacity:.8;margin-left:8px}.file-reload-btn:hover{opacity:1;transform:rotate(180deg);background:var(--accent-hover)}.tree-item{display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none;transition:background var(--transition-fast),box-shadow var(--transition-fast);font-size:13px;position:relative;margin-left:-16px;padding:6px 8px 6px 28px;margin-right:-8px;border-radius:4px}.tree-item:hover{background:var(--bg-hover)}.tree-item.selected{background:#3b82f626;box-shadow:inset 3px 0 0 var(--accent)}.tree-chevron{transition:transform var(--transition-normal)}.tree-item.expanded .tree-chevron{transform:rotate(90deg)}.tree-icon{font-size:14px;min-width:18px;text-align:center}.tree-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary)}.tree-meta{font-size:11px;color:var(--text-muted)}.tree-type{font-size:11px;color:var(--text-muted);font-family:SF Mono,Monaco,monospace}.tree-children{position:relative;padding-left:16px}.tree-children:before{content:"";position:absolute;left:8px;top:0;bottom:0;width:1px;background:var(--border);opacity:.4}.database-item{font-weight:500}.schema-item{padding-left:24px}.table-item{padding-left:36px}.column-item{padding-left:48px;font-size:12px;padding-top:4px;padding-bottom:4px}.columns-list{background:#0000001a}.file-item-container{border-bottom:1px solid var(--border)}.file-item{padding:10px 12px}.file-info{flex:1;overflow:hidden}.file-name{font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-meta{font-size:11px;color:var(--text-muted);margin-top:2px}.expand-icon{font-size:10px;color:var(--text-muted)}.context-menu{position:fixed;background:var(--bg-primary);border:1px solid var(--border);border-radius:8px;box-shadow:var(--shadow-md);min-width:180px;padding:4px 0;z-index:var(--z-context-menu)}.context-menu-item{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;transition:background var(--transition-fast);font-size:13px;color:var(--text-primary)}.context-menu-item:hover{background:var(--bg-tertiary)}.context-menu-item.disabled{opacity:.5;cursor:not-allowed}.context-menu-item.disabled:hover{background:transparent}.context-menu-icon{font-size:14px;min-width:18px}.context-menu-label{flex:1}.context-menu-separator{height:1px;background:var(--border);margin:4px 0}.modal-backdrop{position:fixed;inset:0;background:var(--overlay-bg);display:flex;align-items:center;justify-content:center;z-index:var(--z-context-menu);backdrop-filter:blur(4px)}.data-preview-modal{width:90%;max-width:1400px;max-height:85vh;display:flex;flex-direction:column}.modal-title{margin:0;font-size:18px;color:var(--text-primary)}.modal-close{background:none;border:none;color:var(--text-secondary);font-size:32px;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.modal-close:hover{background:var(--bg-tertiary);color:var(--text-primary)}.modal-body{flex:1;overflow:hidden;display:flex;flex-direction:column;padding:0}.preview-loading,.preview-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;gap:16px;color:var(--text-secondary)}.spinner{width:40px;height:40px;border:3px solid var(--bg-tertiary);border-top-color:var(--accent);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.preview-stats{display:flex;gap:20px;padding:12px 20px;background:var(--bg-secondary);border-bottom:1px solid var(--border);font-size:12px;color:var(--text-secondary)}.preview-table-container{flex:1;overflow:auto;padding:0}.preview-table{width:100%;border-collapse:collapse;font-size:12px}.preview-table thead{position:sticky;top:0;z-index:10;background:var(--bg-secondary)}.preview-table th{padding:10px 12px;text-align:left;font-weight:600;color:var(--text-primary);border-bottom:2px solid var(--border);white-space:nowrap}.preview-table td{padding:8px 12px;border-bottom:1px solid var(--border);color:var(--text-secondary);max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.preview-table tbody tr:hover{background:var(--bg-tertiary)}.row-number-header,.row-number{width:50px;text-align:center;color:var(--text-muted);font-size:11px}.modal-footer{padding:16px 20px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:8px;background:var(--bg-secondary)}.btn{padding:8px 16px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;border:none;transition:all .2s}.btn-secondary{background:var(--bg-tertiary);color:var(--text-primary)}.btn-secondary:hover{background:var(--border-light)}.retry-btn{padding:8px 16px;background:var(--accent);color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:13px;transition:background .2s}.retry-btn:hover{background:var(--accent-hover)}.main-compact.with-explorer,.tab-bar.with-explorer{margin-left:var(--explorer-width, 300px)}.results-wrapper{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.app-with-explorer .main-content{margin-left:300px}.app-with-explorer .editor-pane,.app-with-explorer .result-pane{margin-left:0}.connection-list{padding:4px 0}.connection-item{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:13px;color:var(--text-primary)}.connection-icon{font-size:14px}.connection-name{flex:1}@media(max-width:768px){.data-source-explorer{width:100%;max-width:300px}.app-with-explorer .main-content{margin-left:0}}.monaco-editor .suggest-widget,.monaco-editor .suggest-widget *{all:revert;color:revert;background:revert;-webkit-text-fill-color:revert}.monaco-editor .suggest-widget{z-index:var(--z-overlay)!important;background-color:var(--bg-secondary, #252526)!important;border:1px solid var(--border, #454545)!important}[data-theme=vs] .monaco-editor .suggest-widget{background-color:#f3f3f3!important;border:1px solid #c8c8c8!important}.loading-indicator{padding:8px;text-align:center;color:var(--text-muted);font-size:12px}.cors-error-hint{margin-top:8px;font-size:11px;opacity:.9}.cors-error-option{margin-top:12px}.cors-error-option-title{font-weight:600}.cors-error-code{margin-top:4px;opacity:.9;font-family:monospace;font-size:10px}.control-btn{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 8px;border-radius:4px;font-size:11px;cursor:pointer;transition:var(--btn-transition)}.control-btn:hover:not(:disabled){background:var(--accent);color:#fff;border-color:var(--accent)}.control-btn:disabled{background:var(--bg-secondary);color:var(--text-muted);cursor:not-allowed}.control-btn-primary{background:var(--accent);color:#fff;border:none;padding:8px 16px;border-radius:6px;font-size:12px;cursor:pointer;transition:var(--btn-transition)}.control-btn-primary:hover:not(:disabled){background:var(--accent-hover)}.control-btn-primary:disabled{opacity:.6;cursor:not-allowed}.export-btn{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 10px;border-radius:4px;font-size:11px;cursor:pointer;transition:all .2s}.export-btn:hover{background:var(--accent);color:#fff}.export-format-btn{color:#fff;border:none;padding:12px 20px;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500;text-align:left;transition:var(--btn-transition)}.export-format-btn:hover{filter:brightness(1.1);transform:var(--btn-hover-lift)}.export-format-btn.csv{background:#0891b2}.export-format-btn.parquet{background:#8b5cf6}.export-format-btn.json{background:#10b981}.form-select{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 8px;border-radius:4px;font-size:11px;cursor:pointer}.form-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.form-input-sm{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 8px;border-radius:4px;font-size:11px;width:60px}.form-input-sm:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.form-label{font-size:11px;color:var(--text-muted)}.flex-row{display:flex;align-items:center}.flex-row.gap-sm{gap:6px}.flex-row.gap-md{gap:12px}.flex-row.wrap{flex-wrap:wrap}.flex-col{display:flex;flex-direction:column}.flex-col.gap-sm{gap:6px}.flex-col.gap-md{gap:12px}.simple-modal-overlay{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.simple-modal-content{background:var(--bg-secondary);border-radius:8px;padding:24px;border:1px solid var(--border-light)}.simple-modal-content.sm{max-width:500px;width:90%}.simple-modal-content.md{max-width:600px;width:90%;max-height:80vh;overflow:auto}.simple-modal-content.lg{max-width:800px;width:90%;max-height:80vh}.simple-modal-content.flex{display:flex;flex-direction:column}.simple-modal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.simple-modal-title{margin:0;color:var(--text-primary);font-size:18px}.simple-modal-title.sm{font-size:16px}.simple-modal-close{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:24px;padding:0 8px;transition:color .2s}.simple-modal-close:hover{color:var(--text-primary)}.simple-modal-description{color:var(--text-secondary);font-size:14px;margin-bottom:20px}.simple-modal-note{margin-top:16px;font-size:11px;color:var(--text-muted);font-style:italic}.simple-modal-hint{margin-top:12px;font-size:11px;color:var(--text-muted)}.schema-table{width:100%;border-collapse:collapse}.schema-table thead tr{background:var(--bg-primary);border-bottom:2px solid var(--border-light)}.schema-table th{padding:10px;text-align:left;color:var(--text-muted);font-weight:600;font-size:12px}.schema-table tbody tr{border-bottom:1px solid var(--border)}.schema-table td{padding:10px;font-size:12px}.schema-table td.row-num{color:var(--text-muted)}.schema-table td.col-name{color:var(--text-primary);font-size:13px;font-family:monospace;font-weight:500}.schema-table td.col-type{color:var(--accent);font-family:monospace}.schema-table td.col-sample{color:var(--text-secondary);font-family:monospace;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-detail-textarea{flex:1;background:var(--bg-primary);border:1px solid var(--border);border-radius:4px;color:var(--text-primary);padding:12px;font-size:14px;font-family:monospace;resize:none;outline:none;user-select:text;cursor:text}.cell-detail-textarea:focus{border-color:var(--accent)}.export-progress-overlay{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:10000}.export-progress-modal{background:var(--bg-primary);border:1px solid var(--border-light);border-radius:8px;padding:24px;min-width:400px;max-width:500px}.export-progress-title{margin:0 0 16px;font-size:16px;font-weight:600}.export-progress-file{margin-bottom:16px;font-size:13px;color:var(--text-muted)}.export-progress-stats{display:flex;justify-content:space-between;margin-bottom:8px;font-size:14px}.export-progress-bar{width:100%;height:8px;background:var(--bg-tertiary);border-radius:4px;overflow:hidden;position:relative}.export-progress-fill{height:100%;background:linear-gradient(90deg,var(--progress-gradient-start),var(--progress-gradient-end));transition:width .3s ease}.export-progress-fill.indeterminate{width:30%;position:absolute;animation:progress-slide 1.5s ease-in-out infinite}@keyframes progress-slide{0%{left:-30%}to{left:100%}}.export-progress-hint{font-size:12px;color:var(--text-muted);margin-top:16px;font-style:italic}.divider-vertical{width:1px;height:16px;background:var(--border);margin:0 4px}.page-info{font-size:11px;color:var(--text-muted)}.stats-text{margin-left:8px}.help-text{margin-left:auto;opacity:.7;font-size:10px}.debug-details{margin-top:8px;font-size:10px;font-family:monospace}.debug-details summary{cursor:pointer}.debug-details pre{margin-top:4px;padding:8px;background:var(--bg-tertiary);border-radius:4px;overflow:auto}.sort-indicator{margin-left:6px;font-size:10px}.th-content.centered{justify-content:center;padding:8px 4px}.table-info-field{margin-bottom:var(--space-8)}.table-info-label{font-size:var(--font-md);color:var(--text-muted);margin-bottom:var(--space-2)}.table-info-value{font-size:var(--font-lg)}.table-info-value.mono{font-family:monospace;background:var(--bg-secondary);padding:var(--space-4);border-radius:var(--radius-sm);word-break:break-all}.table-info-columns-list{max-height:300px;overflow:auto;border:1px solid var(--border);border-radius:var(--radius-sm)}.table-info-column-row{display:flex;padding:var(--space-4) var(--space-6);font-size:var(--font-md)}.table-info-column-row:not(:last-child){border-bottom:1px solid var(--border)}.table-info-column-name{flex:1;font-family:monospace;font-weight:600}.table-info-column-type{color:var(--text-muted);margin-left:var(--space-8)}.table-info-column-not-null{margin-left:var(--space-4);color:var(--text-muted);font-size:var(--font-sm);font-weight:600}.table-footer{flex-shrink:0;height:var(--header-height);display:flex;justify-content:space-between;align-items:center;flex-wrap:nowrap;gap:var(--space-6);padding:var(--space-4) var(--space-6);overflow:hidden}.table-footer.minimal{justify-content:flex-end}.table-footer-stats{display:flex;flex-wrap:wrap;gap:var(--space-6);row-gap:2px;align-items:center;font-size:var(--font-sm);min-width:0}.table-footer-selection{color:var(--accent);background:var(--color-info-light);padding:var(--space-1) var(--space-3);border-radius:var(--radius-xs);font-weight:500;min-width:120px}.table-footer-selection.hidden{visibility:hidden;background:transparent}.pagination-controls{display:flex;gap:var(--space-3);align-items:center}.pagination-input{width:45px;padding:var(--space-1) var(--space-2);border:1px solid var(--border-light);border-radius:var(--radius-xs);background:var(--bg-primary);color:var(--text-primary);font-size:var(--font-sm);text-align:center}.pagination-input:focus{outline:none;border-color:var(--accent)}.pagination-badge{background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-4);font-size:var(--font-xs);color:var(--accent);display:flex;align-items:center;gap:var(--space-2);font-weight:500}.history-btn{background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-4);font-size:var(--font-xs);color:var(--text-muted);cursor:pointer;display:flex;align-items:center;gap:var(--space-2);transition:all var(--transition-normal)}.history-btn:hover{background:var(--bg-quaternary);color:var(--text-primary)}.history-badge{background:var(--color-error);color:#fff;border-radius:var(--radius-lg);padding:1px var(--space-2);font-size:9px;font-weight:700;min-width:var(--space-7);text-align:center}.tree-container{width:100%;height:100%;overflow:auto;outline:none;padding-bottom:var(--min-pane-height)}.tree-section{margin-bottom:var(--space-4)}.tree-section-header{display:flex;align-items:center;padding:var(--space-5) var(--space-6);cursor:pointer;background:var(--bg-secondary);border-bottom:1px solid var(--border);user-select:none}.tree-section-header:hover{background:var(--bg-hover)}.tree-section-icon{margin-right:var(--space-4);font-size:var(--font-xs);color:var(--text-muted);transition:transform var(--transition-normal);display:inline-block;width:var(--space-6)}.tree-section-icon.expanded{transform:rotate(90deg)}.tree-section-title-icon{margin-right:var(--space-5);font-size:var(--font-xl);display:inline-flex;align-items:center}.tree-section-title{font-weight:600;font-size:var(--font-md);color:var(--text-primary);text-transform:uppercase;letter-spacing:.5px}.tree-section-count{margin-left:auto;font-size:var(--font-sm);color:var(--text-muted);font-weight:500}.tree-section-action{margin-left:8px;padding:2px 8px;font-size:14px;font-weight:600;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-secondary);transition:all .15s}.tree-section-action:hover{background:var(--accent);border-color:var(--accent);color:#fff}.add-project-bar{display:flex;gap:6px;padding:8px 12px;background:var(--bg-secondary);border-bottom:1px solid var(--border)}.add-project-input{flex:1;padding:6px 10px;font-size:13px;border:1px solid var(--border);border-radius:4px;background:var(--bg-primary);color:var(--text-primary);outline:none}.add-project-input:focus{border-color:var(--accent)}.add-project-input::placeholder{color:var(--text-muted)}.add-project-btn{padding:6px 12px;font-size:13px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer;font-weight:500}.add-project-btn:disabled{background:var(--bg-tertiary);color:var(--text-muted);cursor:not-allowed}.add-project-cancel{padding:6px 10px;font-size:16px;background:var(--bg-tertiary);color:var(--text-secondary);border:1px solid var(--border);border-radius:4px;cursor:pointer}.add-project-cancel:hover{background:var(--bg-hover);color:var(--text-primary)}.tree-section-badge{margin-left:var(--space-4);padding:1px 6px;font-size:10px;font-weight:600;border-radius:4px;text-transform:uppercase;letter-spacing:.3px}.session-tables-section{background-color:#f59e0b0a}.session-tables-section .tree-section-header{background-color:#f59e0b14}.session-tables-section .tree-section-header:hover{background-color:#f59e0b1f}.tree-section-content{padding-top:var(--space-2)}.tree-empty{padding:var(--space-9) var(--space-6);text-align:center;color:var(--text-muted);font-size:var(--font-base);font-style:italic}.tree-node{display:flex;align-items:flex-start;padding:var(--space-3) var(--space-4);cursor:pointer;font-size:var(--font-md);color:var(--text-primary);user-select:none;position:relative;transition:all var(--transition-normal);border-left:2px solid transparent}.tree-node:hover{background:var(--bg-hover)}.tree-container.keyboard-navigating .tree-node:hover{background:transparent}.tree-node.selected{background:var(--bg-secondary);border-left-color:var(--accent)}.tree-node.focused{outline:2px solid var(--accent);outline-offset:-2px}.tree-node-expand{margin-right:var(--space-4);margin-left:1px;font-size:var(--font-base);color:var(--text-muted);transition:color var(--transition-normal);display:inline-block;width:var(--space-6);text-align:center;margin-top:2px;flex-shrink:0}.tree-node-icon{margin-right:var(--space-4);font-size:var(--font-lg);display:inline-flex;align-items:center;flex-shrink:0;align-self:flex-start;margin-top:2px}.tree-node-content{display:flex;flex-direction:column;flex:1;min-width:0;container-type:inline-size;container-name:tree-node}.tree-node-main{display:flex;align-items:center;min-width:0;gap:var(--space-2)}.tree-node-name-wrapper{display:flex;align-items:center;flex:1 1 auto;min-width:80px;overflow:hidden}.tree-node-badge-wrapper{display:flex;align-items:center;flex-shrink:1;overflow:hidden}.tree-node-inline-meta{font-size:var(--font-xs);color:var(--text-muted);margin-left:var(--space-2);white-space:nowrap;flex-shrink:0}.tree-node-secondary{font-size:var(--font-xs);color:var(--text-muted);margin-top:1px;padding-left:calc(var(--font-lg) + var(--space-4));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tree-node-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto;min-width:0}.tree-node-type-badge{margin-left:var(--space-4);padding:var(--space-1) var(--space-3);border-radius:var(--radius-sm);font-size:var(--font-xs);font-weight:600}.tree-node-metadata{display:none}.tree-node-badge{margin-right:var(--space-4);padding:3px var(--space-2);background:var(--bg-tertiary);border-radius:var(--radius-sm);font-size:var(--font-xs);font-weight:600;color:var(--text-secondary);display:inline-flex;align-items:center;justify-content:flex-end;gap:var(--space-1);min-width:auto;text-align:center;flex-shrink:0;white-space:nowrap;flex-wrap:nowrap}.tree-line-vertical{position:absolute;width:2px;background:var(--border);opacity:.7}.tree-line-horizontal{position:absolute;height:2px;background:var(--border);opacity:.7}.tree-node-metadata.compact{font-size:var(--font-xs);max-width:60px}.tree-node-badge .badge-icon{margin-right:var(--space-2)}.tree-node-badge.compact{min-width:auto;padding:3px var(--space-2)}.tree-node-badge.compact .badge-text{display:none}.tree-node-badge.compact .badge-icon{margin-right:0}.badge-suffix{display:inline-flex;align-items:center;margin-left:var(--space-2);cursor:help;opacity:.9}.badge-suffix:hover{opacity:1}.suffix-icon{font-size:var(--font-xs);flex-shrink:0}.suffix-label{margin-left:2px;font-size:var(--font-2xs);text-transform:uppercase;white-space:nowrap}@container tree-node (max-width: 350px){.badge-suffix.priority-0 .suffix-label{display:none}.badge-suffix.priority-0{margin-left:var(--space-1)}}@container tree-node (max-width: 300px){.badge-suffix.priority-1 .suffix-label{display:none}.badge-suffix.priority-1{margin-left:var(--space-1)}}@container tree-node (max-width: 250px){.badge-suffix.priority-2 .suffix-label{display:none}.badge-suffix.priority-2{margin-left:var(--space-1)}}@container tree-node (max-width: 200px){.tree-node-badge .badge-text{display:none}.tree-node-badge .badge-icon{margin-right:0}}.tree-node-badge.compact .suffix-label{display:none}.tree-node-badge.compact .badge-suffix{margin-left:var(--space-1)}.tree-context-menu{position:fixed;background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:0 4px 12px #00000026;z-index:var(--z-context-menu);min-width:180px;padding:var(--space-2) 0}.tree-context-separator{height:1px;background:var(--border);margin:var(--space-2) 0}.tree-context-item{padding:var(--space-4) var(--space-8);cursor:pointer;font-size:var(--font-md);color:var(--text-primary);display:flex;align-items:center;gap:var(--space-5)}.tree-context-item:hover{background:var(--bg-hover)}.tree-context-item.focused{background:var(--bg-hover);outline:2px solid var(--accent);outline-offset:-2px}.tree-context-icon{font-size:var(--font-lg);display:inline-flex;align-items:center}.error-monitor{position:fixed;right:var(--space-9);width:600px;height:450px;background:var(--bg-tertiary, #1e1e1e);border:1px solid var(--border, #444);border-radius:var(--radius-lg) var(--radius-lg) 0 0;box-shadow:0 -4px 16px #0000004d;z-index:var(--z-toast);transition:bottom var(--transition-slow);display:flex;flex-direction:column}.error-monitor.open{bottom:0}.error-monitor.closed{bottom:-400px}.error-monitor-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-4) var(--space-6);background:var(--bg-secondary, #2d2d2d);border-bottom:1px solid var(--border, #444);cursor:pointer}.error-monitor-title{font-weight:700;font-size:var(--font-md);color:var(--text-primary, #fff)}.error-monitor-stats{font-size:var(--font-sm);color:var(--text-muted, #888)}.error-monitor-stat{margin-right:var(--space-4)}.error-monitor-stat.error{color:var(--color-error)}.error-monitor-stat.warning{color:var(--color-warning)}.error-monitor-stat.info{color:var(--color-info)}.error-monitor-stat.success{color:var(--color-success)}.error-monitor-actions{display:flex;gap:var(--space-4)}.error-monitor-clear-btn{padding:var(--space-2) var(--space-4);font-size:var(--font-sm);background:var(--bg-primary, #1a1a1a);color:var(--text-primary, #fff);border:1px solid var(--border, #444);border-radius:var(--radius-sm);cursor:pointer}.error-monitor-toggle{font-size:var(--font-xl)}.error-monitor-filters{display:flex;gap:var(--space-4);padding:var(--space-4) var(--space-6);background:var(--bg-primary, #1a1a1a);border-bottom:1px solid var(--border, #444)}.error-monitor-filter-btn{padding:var(--space-2) var(--space-6);font-size:var(--font-sm);background:var(--bg-secondary, #2d2d2d);color:var(--text-primary, #fff);border:1px solid var(--border, #444);border-radius:var(--radius-sm);cursor:pointer;text-transform:capitalize}.error-monitor-filter-btn.active{background:var(--accent, #3b82f6)}.error-monitor-list{flex:1;overflow-y:auto;padding:var(--space-6)}.error-monitor-empty{text-align:center;padding:var(--space-14);color:var(--text-muted, #888);font-size:var(--font-md)}.error-monitor-entry{margin-bottom:var(--space-6);padding:var(--space-6);background:var(--bg-secondary, #2d2d2d);border-radius:var(--radius-md);font-size:var(--font-base)}.error-monitor-entry.error{border:1px solid var(--color-error)}.error-monitor-entry.warning{border:1px solid var(--color-warning)}.error-monitor-entry.info{border:1px solid var(--color-info)}.error-monitor-entry-header{display:flex;justify-content:space-between;margin-bottom:var(--space-4)}.error-monitor-entry-type{font-weight:700;color:var(--text-primary, #fff)}.error-monitor-entry-time{font-size:var(--font-xs);color:var(--text-muted, #888)}.error-monitor-entry-message{color:var(--text-secondary, #ccc);margin-bottom:var(--space-4);word-break:break-word}.error-monitor-details{margin-top:var(--space-4)}.error-monitor-details summary{cursor:pointer;font-size:var(--font-sm);color:var(--text-muted, #888)}.error-monitor-details pre{margin-top:var(--space-4);padding:var(--space-4);background:var(--bg-primary, #1a1a1a);border-radius:var(--radius-sm);font-size:var(--font-xs);overflow:auto;max-height:var(--min-pane-height)}.error-monitor-stack pre{max-height:150px;color:var(--text-muted, #888)}.overlay-backdrop{position:absolute;inset:0;background-color:var(--overlay-bg);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:var(--z-toast);backdrop-filter:blur(8px)}.overlay-icon-container{border-radius:50%;padding:var(--space-12);margin-bottom:var(--space-12);position:relative}.overlay-icon-container.accent{background-color:#3b82f61a}.overlay-icon-container.success{background-color:var(--color-success-light)}.overlay-icon-container.warning{background-color:var(--color-warning-light)}.overlay-icon-container.purple{background-color:var(--color-purple-light)}.overlay-icon-container.error{background-color:var(--color-error-light)}.overlay-spinner{width:64px;height:64px;border:4px solid var(--border);border-top:4px solid var(--accent);border-radius:50%;animation:spin .8s linear infinite}.overlay-spinner-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:var(--font-2xl);font-weight:700;color:var(--accent);font-variant-numeric:tabular-nums;min-width:40px;text-align:center}.overlay-title{font-size:var(--font-4xl);font-weight:600;color:var(--text-primary);margin-bottom:var(--space-4);letter-spacing:-.025em}.overlay-subtitle{font-size:var(--font-lg);color:var(--text-secondary);margin-bottom:var(--space-12);text-align:center;max-width:400px}.overlay-subtitle.narrow{margin-bottom:var(--space-8)}.overlay-current-file{margin-bottom:var(--space-4);font-weight:500;color:var(--color-success)}.overlay-current-file.warning{color:var(--color-warning)}.overlay-current-file.purple{color:var(--color-purple)}.overlay-hint{font-size:var(--font-lg);color:var(--text-secondary);text-align:center;max-width:400px}.overlay-hint.sm{font-size:var(--font-lg)}.overlay-subtitle.wide{max-width:500px}.overlay-cancel-hint{font-size:var(--font-md);color:var(--text-muted);margin-top:var(--space-8);font-style:italic}.overlay-stop-btn{padding:var(--space-7) var(--space-10);font-size:15px;font-weight:600;background-color:var(--color-error);color:#fff;border:none;border-radius:var(--radius-xl);cursor:pointer;display:flex;align-items:center;gap:var(--space-5);box-shadow:0 10px 25px -5px #ef444466,0 8px 10px -6px #ef44444d;transition:all var(--transition-normal)}.overlay-stop-btn:hover{filter:brightness(.9);transform:translateY(-2px);box-shadow:0 20px 35px -5px #ef444480,0 10px 15px -6px #ef444466}.server-info-modal{background:var(--bg-primary);border-radius:12px;border:1px solid var(--border);width:1100px;max-width:95vw;height:80vh;max-height:800px;min-height:500px;display:flex;flex-direction:column;overflow:hidden}.server-info-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0;position:relative;overflow:visible}[data-theme=vs-dark] .server-info-header{background:linear-gradient(135deg,var(--bg-secondary) 0%,rgba(37,99,235,.08) 50%,var(--bg-secondary) 100%);border-bottom:2px solid rgba(37,99,235,.3);box-shadow:0 2px 8px #0000004d,inset 0 1px #ffffff0d}[data-theme=vs-dark] .server-info-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,transparent 0%,#2563eb 20%,#10b981 50%,#2563eb 80%,transparent 100%);opacity:.8}[data-theme=vs] .server-info-header{background:linear-gradient(135deg,#fff,#f0f9ff,#e0f2fe);border-bottom:2px solid var(--border-light);box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f,inset 0 1px #fffc}[data-theme=vs] .server-info-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#2563eb,#10b981,#2563eb);opacity:.6}.server-info-title{font-size:16px;font-weight:600;color:var(--text-primary);margin:0}[data-theme=vs-dark] .server-info-title{background:linear-gradient(135deg,#60a5fa,#34d399);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}[data-theme=vs] .server-info-title{color:#1e3a8a;background:none;-webkit-background-clip:unset;-webkit-text-fill-color:#1e3a8a;background-clip:unset;text-shadow:none}.server-info-close-btn{background:transparent;border:none;font-size:24px;color:var(--text-muted);cursor:pointer;padding:0;line-height:1;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px}.server-info-close-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.server-info-tabs{display:flex;gap:4px;padding:0 20px;border-bottom:1px solid var(--border);flex-shrink:0}.server-info-tab{padding:10px 16px;background:transparent;color:var(--text-secondary);border:none;border-bottom:2px solid transparent;cursor:pointer;font-size:13px;font-weight:500;transition:all .2s;display:flex;align-items:center;gap:6px}.server-info-tab:hover{color:var(--text-primary);background:var(--bg-tertiary)}.server-info-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.server-info-tab-count{background:var(--bg-tertiary);padding:2px 6px;border-radius:10px;font-size:11px;min-width:20px;text-align:center}.server-info-tab.active .server-info-tab-count{background:#3b82f626;color:var(--accent)}.server-info-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.server-info-loading,.server-info-error,.server-info-empty{display:flex;align-items:center;justify-content:center;height:200px;color:var(--text-muted);font-size:14px;flex-direction:column;gap:12px}.server-info-error{color:var(--color-error)}.server-info-error button{padding:6px 12px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-primary)}.server-info-refresh-btn{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;padding:4px 8px;cursor:pointer;display:flex;align-items:center;gap:4px;color:var(--text-secondary);transition:all .2s}.server-info-refresh-btn:hover{background:var(--bg-secondary);color:var(--text-primary)}.server-info-refresh-btn:disabled{opacity:.5;cursor:wait}.extensions-tab{display:flex;flex-direction:column;height:100%;overflow:hidden}.extensions-toolbar{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border);flex-shrink:0;background:var(--bg-secondary)}.extensions-search{display:flex;align-items:center;gap:8px;background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;padding:6px 10px;flex:1;max-width:300px}.extensions-search svg{color:var(--text-muted);flex-shrink:0}.extensions-search-input{border:none;background:transparent;outline:none;font-size:13px;color:var(--text-primary);flex:1;min-width:0}.extensions-search-input::placeholder{color:var(--text-muted)}.extensions-search-clear{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:16px;padding:0;line-height:1}.extensions-search-clear:hover{color:var(--text-primary)}.extensions-filters{display:flex;gap:4px}.extensions-filter-btn{padding:5px 10px;font-size:11px;border:1px solid var(--border);background:var(--bg-primary);color:var(--text-secondary);border-radius:4px;cursor:pointer;transition:all .2s;white-space:nowrap}.extensions-filter-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.extensions-filter-btn.active{background:var(--accent);color:#fff;border-color:var(--accent)}.extensions-table-container{flex:1;overflow:auto}.server-info-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12px}.server-info-table thead{position:sticky;top:0;z-index:10}.server-info-table th{padding:10px 12px;text-align:left;font-weight:600;color:var(--text-muted);background:var(--bg-secondary);border-bottom:1px solid var(--border);text-transform:uppercase;font-size:11px}.server-info-table td{padding:10px 12px;border-bottom:1px solid var(--border);color:var(--text-primary);background:var(--bg-primary)}.server-info-table tbody tr:hover td{background:var(--bg-tertiary)}.extensions-table .ext-name{font-family:var(--font-mono);font-weight:500;white-space:nowrap}.extensions-table .ext-description{color:var(--text-secondary);font-size:12px;max-width:300px}.extensions-table .ext-actions{white-space:nowrap}.ext-type-badge{display:inline-block;padding:2px 6px;font-size:10px;border-radius:3px;font-weight:500;text-transform:uppercase}.ext-type-badge.core{background:#8b5cf626;color:#8b5cf6}.ext-type-badge.community{background:#eab30826;color:#eab308}.ext-active-label{color:var(--text-muted);font-size:11px}.server-info-status{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:500}.server-info-status.loaded{background:#22c55e26;color:#22c55e}.server-info-status.installed{background:#3b82f626;color:#3b82f6}.server-info-status.not-installed{background:#9ca3af26;color:var(--text-muted)}.server-info-action-btn{padding:4px 10px;font-size:11px;border-radius:4px;cursor:pointer;transition:all .2s;border:none;font-weight:500}.server-info-action-btn.load{background:#22c55e26;color:#22c55e}.server-info-action-btn.load:hover:not(:disabled){background:#22c55e40}.server-info-action-btn.install{background:#3b82f626;color:#3b82f6}.server-info-action-btn.install:hover:not(:disabled){background:#3b82f640}.server-info-action-btn:disabled{opacity:.5;cursor:not-allowed}.server-info-table-container{flex:1;overflow:auto;padding:16px}.server-info-secret-type{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:500;text-transform:uppercase}.server-info-secret-type.s3{background:#ff990026;color:#f90}.server-info-secret-type.gcs{background:#4285f426;color:#4285f4}.server-info-secret-type.azure{background:#0078d426;color:#0078d4}.server-info-secret-type.bigquery{background:#4285f426;color:#4285f4}.server-info-kv-list{display:flex;flex-direction:column;gap:8px;padding:16px;overflow:auto}.server-info-kv-item{display:flex;align-items:center;gap:12px;padding:10px 12px;background:var(--bg-secondary);border-radius:6px;border:1px solid var(--border)}.server-info-kv-name{font-family:var(--font-mono);font-weight:600;color:var(--text-primary);min-width:180px;font-size:12px}.server-info-kv-value{font-family:var(--font-mono);color:var(--accent);font-size:12px;word-break:break-all;flex:1}.server-info-kv-type{color:var(--text-muted);font-size:11px;margin-left:auto}.settings-tab{display:flex;flex-direction:column;height:100%;overflow:hidden}.settings-header-tip{display:flex;align-items:center;gap:8px;padding:12px 16px;background:#2563eb14;border-bottom:1px solid var(--border);font-size:12px;color:var(--text-secondary);flex-shrink:0}.settings-list{display:flex;flex-direction:column;gap:12px;padding:16px;overflow-y:auto;flex:1}.setting-item{display:flex;flex-direction:column;gap:8px;padding:14px 16px;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border)}.setting-name-row{display:flex;align-items:center;gap:8px}.setting-name{font-family:var(--font-mono);font-weight:600;color:var(--text-primary);font-size:13px}.setting-info-icon{position:relative;display:flex;align-items:center;color:var(--text-muted);cursor:help;transition:color .2s}.setting-info-icon:hover{color:var(--accent)}.setting-tooltip-portal{padding:14px 16px;background:var(--bg-primary);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #0006;width:340px;max-width:90vw;pointer-events:none}[data-theme=vs] .setting-tooltip-portal{background:#fff;box-shadow:0 8px 24px #00000026}[data-theme=vs-dark] .setting-tooltip-portal{background:#1e1e2e;border-color:#ffffff1a}.setting-tooltip-content{font-size:12px;line-height:1.5;color:var(--text-primary)}.setting-tooltip-readonly{margin-top:8px;padding-top:8px;border-top:1px solid var(--border);font-size:11px;color:var(--text-muted);font-style:italic}.setting-readonly-badge{font-size:10px;padding:2px 6px;border-radius:4px;background:var(--bg-tertiary);color:var(--text-muted);margin-left:auto}.setting-value-row{display:flex;align-items:center}.setting-value-readonly{font-family:var(--font-mono);font-size:13px;color:var(--text-secondary);padding:8px 12px;background:var(--bg-tertiary);border-radius:6px;border:1px solid var(--border)}.setting-toggle{display:flex;align-items:center;gap:10px;cursor:pointer}.setting-toggle input{display:none}.setting-toggle-slider{position:relative;width:44px;height:24px;background:var(--bg-tertiary);border-radius:12px;border:1px solid var(--border);transition:all .2s}.setting-toggle-slider:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background:var(--text-muted);border-radius:50%;transition:all .2s}.setting-toggle input:checked+.setting-toggle-slider{background:var(--accent);border-color:var(--accent)}.setting-toggle input:checked+.setting-toggle-slider:after{left:22px;background:#fff}.setting-toggle-label{font-size:13px;color:var(--text-secondary)}.setting-select{padding:8px 32px 8px 12px;font-size:13px;font-family:var(--font-mono);background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;min-width:120px}.setting-select:hover{border-color:var(--accent)}.setting-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #2563eb33}.setting-number-input{display:flex;align-items:center;gap:8px}.setting-input{padding:8px 12px;font-size:13px;font-family:var(--font-mono);background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);width:100px}.setting-input:hover{border-color:var(--accent)}.setting-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #2563eb33}.setting-input-actions{display:flex;gap:4px}.setting-save-btn{padding:6px 12px;font-size:12px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer}.setting-save-btn:hover{opacity:.9}.setting-cancel-btn{padding:6px 8px;font-size:14px;background:var(--bg-tertiary);color:var(--text-muted);border:1px solid var(--border);border-radius:4px;cursor:pointer}.setting-cancel-btn:hover{color:var(--text-primary)}.server-settings{padding:0}.server-settings-not-available{text-align:center;padding:60px 40px;color:var(--text-muted)}.server-settings-not-available svg{color:var(--text-muted);margin-bottom:16px}.server-settings-not-available h3{color:var(--text-primary);margin:0 0 12px;font-size:18px}.server-settings-not-available p{max-width:400px;margin:0 auto;line-height:1.5}.server-settings-not-available code{background:var(--bg-tertiary);padding:2px 6px;border-radius:4px;font-size:12px}.server-settings-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:linear-gradient(135deg,#22c55e26,#06b6d41a);border-radius:10px;margin-bottom:20px;border:1px solid rgba(34,197,94,.2);position:relative;overflow:hidden}[data-theme=vs] .server-settings-header{background:linear-gradient(135deg,#15803d1a,#06b6d414);border-color:#15803d26}.server-settings-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#22c55e,#06b6d4,#8b5cf6);border-radius:10px 10px 0 0}.server-settings-status{display:flex;align-items:center;gap:16px}.server-settings-connected{display:flex;align-items:center;gap:8px;font-weight:600;font-size:14px;color:var(--text-primary)}.server-dot{width:8px;height:8px;border-radius:50%;background:#22c55e;box-shadow:0 0 8px #22c55e80}[data-theme=vs] .server-dot{background:#15803d;box-shadow:0 0 8px #15803d66}.server-settings-updated{font-size:11px;color:var(--text-muted)}.server-settings-refresh{display:flex;align-items:center;gap:6px;padding:6px 12px;font-size:12px;background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-secondary);cursor:pointer;transition:all .2s}.server-settings-refresh:hover{background:var(--bg-tertiary);color:var(--text-primary);border-color:var(--accent)}.server-settings-refresh:disabled{opacity:.5;cursor:not-allowed}.server-settings-tabs{display:flex;gap:4px;border-bottom:2px solid var(--border);margin-bottom:16px}.server-settings-tab{padding:10px 16px;background:transparent;border:none;border-bottom:2px solid transparent;margin-bottom:-2px;color:var(--text-muted);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s;display:flex;align-items:center;gap:8px}.server-settings-tab:hover{color:var(--text-primary);background:var(--bg-tertiary)}.server-settings-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.server-settings-tab-count{background:var(--bg-tertiary);color:var(--text-muted);padding:2px 6px;border-radius:10px;font-size:10px;font-weight:600}.server-settings-tab.active .server-settings-tab-count{background:#2563eb26;color:var(--accent)}.server-settings-content{min-height:400px;max-height:500px;overflow-y:auto}.server-settings-loading,.server-settings-error,.server-settings-empty{text-align:center;padding:40px 20px;color:var(--text-muted)}.server-settings-error{color:var(--error)}.server-settings-error button{margin-top:12px;padding:6px 16px;background:var(--accent);border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:12px}.extensions-panel{display:flex;flex-direction:column;gap:12px}.extensions-table-wrap,.secrets-panel{overflow-x:auto}.settings-panel{display:flex;flex-direction:column;gap:12px}.variables-panel{display:flex;flex-direction:column;gap:8px}.table-info-tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:var(--space-12)}.table-info-tab{padding:8px 16px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-size:13px;transition:all .2s}.table-info-tab:hover{color:var(--text-primary)}.table-info-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.table-info-tab-panel{min-height:200px}.table-info-index-row,.table-info-constraint-row{padding:10px 12px;border:1px solid var(--border);border-radius:6px;margin-bottom:8px;background:var(--bg-tertiary)}.table-info-index-name,.table-info-constraint-type{font-family:var(--font-mono);font-weight:600;color:var(--text-primary);margin-bottom:4px;display:flex;align-items:center;gap:8px}.table-info-index-badge{display:inline-block;padding:2px 6px;font-size:10px;border-radius:4px;font-weight:500}.table-info-index-badge.primary{background:#8b5cf626;color:#8b5cf6}.table-info-index-badge.unique{background:#22c55e26;color:#22c55e}.table-info-constraint-columns{font-family:var(--font-mono);font-size:12px;color:var(--text-muted)}.table-info-sql{margin-top:8px;padding:8px;background:var(--bg-secondary);border-radius:4px;font-family:var(--font-mono);font-size:11px;white-space:pre-wrap;word-break:break-all;max-height:80px;overflow:auto;color:var(--text-secondary)}.table-info-content{flex:1;overflow-y:auto;padding:var(--space-16)}.table-info-table{width:100%;border-collapse:collapse;font-size:12px}.table-info-table th,.table-info-table td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}.table-info-table th{font-weight:600;color:var(--text-secondary);font-size:11px;text-transform:uppercase;background:var(--bg-secondary)}.table-info-table tr:hover td{background:var(--bg-hover)}.table-info-badge{display:inline-block;padding:2px 8px;font-size:10px;border-radius:4px;font-weight:500;background:var(--bg-tertiary);color:var(--text-secondary)}.table-info-badge.primary,.table-info-badge.primary-key{background:#8b5cf626;color:#8b5cf6}.table-info-badge.unique{background:#22c55e26;color:#22c55e}.table-info-badge.foreign-key{background:#3b82f626;color:#3b82f6}.table-info-badge.check{background:#eab30826;color:#eab308}.table-info-badge.not-null{background:#ef444426;color:#ef4444}.table-info-loading,.table-info-error,.table-info-empty{padding:var(--space-24);text-align:center;color:var(--text-muted);font-size:13px}.table-info-error{color:var(--error)}.results-layout-toggle{display:inline-flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--border);border-radius:6px;background:var(--bg-secondary)}.results-layout-btn{display:flex;align-items:center;justify-content:center;width:26px;height:24px;padding:0;border:none;background:transparent;color:var(--text-muted);border-radius:4px;cursor:pointer;transition:all var(--transition-fast)}.results-layout-btn:hover{color:var(--text-primary);background:var(--bg-tertiary)}.results-layout-btn.active{color:var(--accent);background:var(--bg-tertiary)}.file-button.icon-only{padding:6px;display:inline-flex;align-items:center;justify-content:center;line-height:0}.maximize-overlay{border:1px solid var(--border);border-radius:8px;background:var(--bg-primary);box-shadow:0 10px 40px #00000073;overflow:hidden}.maximize-overlay .editor-pane-compact{border:none;border-radius:0;box-shadow:none}.maximize-chrome{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 8px 6px 12px;border-bottom:1px solid var(--border);background:var(--bg-secondary);font-size:12px}.maximize-chrome-title{font-weight:600;color:var(--text-primary)}.maximize-chrome-actions{display:flex;align-items:center;gap:10px}.maximize-chrome-hint{color:var(--text-muted);font-size:11px}.maximize-chrome-close{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:4px;color:var(--text-muted);cursor:pointer;transition:all var(--transition-fast)}.maximize-chrome-close:hover{background:var(--bg-tertiary);color:var(--text-primary)}@media(max-width:1280px){.header{gap:10px}.header-section{padding:4px 10px;gap:10px}}@media(max-width:1080px){.header .btn-label{display:none}.header-section{padding:4px 6px;gap:6px}}
@@ -0,0 +1 @@
1
+ import{c as l,a as h,b as f}from"./oauth-constants-deHgNN8Q.js";const y="bigquery_oauth_response",g="bigquery_oauth_error",n=new URLSearchParams(window.location.search),r=n.get("code"),o=n.get("state"),d=n.get("error"),_=n.get("error_description"),p=document.getElementById("spinner"),a=document.getElementById("status"),c=(e,t)=>{a&&(a.textContent=e,t&&(a.className=t)),p&&t&&(p.style.display="none")},u=e=>{try{localStorage.setItem(h,e)}catch{}try{localStorage.setItem(y,JSON.stringify({type:"oauth_code",code:JSON.parse(e).code,state:JSON.parse(e).state,timestamp:Date.now()}))}catch{}},E=e=>{try{localStorage.setItem(f,e)}catch{}try{localStorage.setItem(g,e)}catch{}},w=typeof window.opener<"u"&&window.opener!==null,S=()=>{for(const e of[h,f,y,g])try{localStorage.removeItem(e)}catch{}};window.addEventListener("unload",S);if(d){const e=_||d;c(`Authentication failed: ${e}`,"error");let t=!1;if(w)try{window.opener.postMessage({type:"oauth_error",error:e,state:o},window.location.origin),t=!0}catch{}if(!t&&(E(e),typeof BroadcastChannel<"u"))try{const s=new BroadcastChannel(l);s.postMessage({type:"oauth_error",error:e,state:o}),setTimeout(()=>s.close(),1e3)}catch{}setTimeout(()=>window.close(),3e3)}else if(r&&o){c("Authentication successful. Closing…","success");const e=JSON.stringify({code:r,state:o,timestamp:Date.now()});let t=!1;if(w)try{window.opener.postMessage({type:"oauth_code",code:r,state:o},window.location.origin),t=!0}catch{}if(t)setTimeout(()=>window.close(),250);else{if(u(e),typeof BroadcastChannel<"u")try{const i=new BroadcastChannel(l);i.postMessage({type:"oauth_code",code:r,state:o}),setTimeout(()=>i.close(),1e3)}catch{}let s=0;const m=setInterval(()=>{s++,u(e),s>=6&&(clearInterval(m),window.close())},500)}}else c("Missing authorization code. Please try again.","error"),setTimeout(()=>window.close(),3e3);
@@ -0,0 +1 @@
1
+ (function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const n of r)if(n.type==="childList")for(const i of n.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function t(r){const n={};return r.integrity&&(n.integrity=r.integrity),r.referrerPolicy&&(n.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?n.credentials="include":r.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function s(r){if(r.ep)return;r.ep=!0;const n=t(r);fetch(r.href,n)}})();const a=65535,d=new TextDecoder;class c{constructor(e){this.reader=e}peekFieldId(){return this.reader.peekUint16(!0)}consumeFieldId(){this.reader.consume(2)}checkFieldId(e){return this.peekFieldId()===e?(this.consumeFieldId(),!0):!1}expectFieldId(e){const t=this.peekFieldId();if(t!==e)throw new Error(`Expected field ID ${e}, got ${t} at offset ${this.reader.getOffset()}`);this.consumeFieldId()}expectObjectEnd(){this.expectFieldId(a)}throwUnsupported(e="Unsupported"){throw new Error(`${e} at offset ${this.reader.getOffset()}`)}readUint8(){return this.reader.readUint8()}readUint16(){return this.reader.readUint16(!0)}readUint32(){return this.reader.readUint32(!0)}readFloat64(){return this.reader.readFloat64(!0)}readBool(){return this.reader.readUint8()!==0}readVarInt(){let e=0,t=0,s;do s=this.reader.readUint8(),e|=(s&127)<<t,t+=7;while(s>=128);return e}readSignedVarInt(){const e=this.readVarInt();return e>>>1^-(e&1)}readVarInt64(){let e=0n,t=0n,s;do s=this.reader.readUint8(),e|=BigInt(s&127)<<t,t+=7n;while(s>=128);return e}readNullable(e){return this.readUint8()!==0?e(this):null}readData(){const e=this.readVarInt();return this.reader.readBytes(e)}readString(){const e=this.readVarInt(),t=this.reader.readBytes(e);return d.decode(t)}readList(e){const t=this.readVarInt(),s=[];for(let r=0;r<t;r++)s.push(e(this,r));return s}readPair(e,t){const s=e(this),r=t(this);return this.expectObjectEnd(),[s,r]}readProperty(e,t){return this.expectFieldId(e),t(this)}readPropertyWithDefault(e,t,s){return this.checkFieldId(e)?t(this):s}hasMore(){return this.reader.hasMore()}getOffset(){return this.reader.getOffset()}}const u="snowflake_oauth_response",l="snowflake_oauth_error",h="snowflake-auto-connect",f="snowflake_oauth",p="/oauth-callback.html";export{c as B,p as S,u as a,l as b,f as c,h as d};
@@ -0,0 +1,5 @@
1
+ function O(r){return Number.isNaN(r)||!Number.isFinite(r)?null:r}function z(r,f=!0){if(r.length===0)return 0n;let e=0n;for(let a=r.length-1;a>=0;a--)e=e<<32n|BigInt(r[a]>>>0);if(f){const a=r.length*32,s=1n<<BigInt(a-1);if(e>=s){const u=1n<<BigInt(a);e=e-u}}return e>BigInt(Number.MAX_SAFE_INTEGER)||e<BigInt(Number.MIN_SAFE_INTEGER)?e.toString():e}function W(r){return r>BigInt(Number.MAX_SAFE_INTEGER)||r<BigInt(Number.MIN_SAFE_INTEGER)?r.toString():Number(r)}function L(r){return r>BigInt(Number.MAX_SAFE_INTEGER)?r.toString():Number(r)}let M=null,d=null,S=null,H=[],k=null;const G=2,b=new Map,R=new Set;function P(){const r=globalThis;typeof r.gc=="function"&&r.gc()}setInterval(()=>{P()},15e3);function q(r,f,e,a,s){if(r==null)return r;if(typeof r=="object"&&r!==null&&!Array.isArray(r)&&e){let t=!1;for(const i of e.values())if(i.toLowerCase().includes("dictionary")){t=!0;break}if(t)try{const i=JSON.stringify(r);return JSON.parse(i)}catch{}}if(typeof r=="bigint")return r>Number.MAX_SAFE_INTEGER||r<Number.MIN_SAFE_INTEGER?r.toString():Number(r);if(r instanceof Date)return r.toISOString();if(typeof r!="object")return r;if(r.constructor?.name?.includes("Decimal")){const t=r.toString();try{const i=BigInt(t);if(i>BigInt(Number.MAX_SAFE_INTEGER)||i<BigInt(Number.MIN_SAFE_INTEGER))return t}catch{}return Number(t)}const p=Array.isArray(r),E=p?[]:{},h=[];if(p)for(let t=r.length-1;t>=0;t--)h.push([r[t],E,t,void 0]);else{const t=Object.keys(r);for(let i=t.length-1;i>=0;i--){const l=t[i];h.push([r[l],E,l,l])}}for(;h.length>0;){const[t,i,l,m]=h.pop();if(t==null){i[l]=t;continue}if(typeof t=="bigint"){t>Number.MAX_SAFE_INTEGER||t<Number.MIN_SAFE_INTEGER?i[l]=t.toString():i[l]=Number(t);continue}if(t instanceof Date){i[l]=t.toISOString();continue}if(typeof t!="object"){i[l]=t;continue}if(m&&e?.has(m)&&e.get(m).toLowerCase().includes("dictionary")){const o=String(t);if(o&&!o.startsWith("[object ")){i[l]=o;continue}}const A=t.constructor?.name;if(A?.includes("Decimal")){const n=t.toString();if(m&&f?.has(m)){const o=f.get(m);if(o>0){const y=Number(n),w=Math.pow(10,o);i[l]=y/w;continue}}try{const o=BigInt(n);o>BigInt(Number.MAX_SAFE_INTEGER)||o<BigInt(Number.MIN_SAFE_INTEGER)?i[l]=n:i[l]=Number(n)}catch{i[l]=Number(n)}continue}if(t instanceof Uint8Array){const n=Array.from(t).map(o=>o.toString(16).padStart(2,"0")).join("");i[l]=`0x${n}`;continue}if(t instanceof Uint32Array){const n=z(t);typeof n=="bigint"?i[l]=Number(n):i[l]=n;continue}if(t instanceof BigInt64Array){t.length===1?i[l]=W(t[0]):i[l]=Array.from(t).map(n=>W(n));continue}if(t instanceof BigUint64Array){t.length===1?i[l]=L(t[0]):i[l]=Array.from(t).map(n=>L(n));continue}if(t instanceof Float32Array){if(t.length===1){const n=O(t[0]);n===null&&(t[0],void 0),i[l]=n}else i[l]=Array.from(t).map(n=>O(n));continue}if(t instanceof Float64Array){if(t.length===1){const n=O(t[0]);n===null&&(t[0],void 0),i[l]=n}else i[l]=Array.from(t).map(n=>O(n));continue}if(m&&e?.get(m)?.toLowerCase().includes("interval")){let n=0,o=0,y=0;const w=a?.get(m);if(w&&s!==void 0){const g=s*4;if(g+3<w.length){n=w[g],o=w[g+1];const N=w[g+2]>>>0,_=w[g+3];y=N+_*4294967296}}else if(A==="Int32Array"){const g=t;g.length>=2&&(n=g[0]*12+g[1])}const c=[];if(n!==0){const g=Math.floor(Math.abs(n)/12),N=Math.abs(n)%12,_=n<0?"-":"";g!==0&&c.push(`${_}${g}y`),N!==0&&c.push(`${n<0&&g===0?"-":""}${N}mo`)}if(o!==0){const g=o<0?"-":"";c.push(`${g}${Math.abs(o)}d`)}if(y!==0){const g=Math.abs(y),N=y<0?"-":"",_=Math.floor(g/36e11),$=Math.floor(g%36e11/6e10),C=g%6e10,B=Math.floor(C/1e9),I=C%1e9;if(_!==0&&c.push(`${N}${_}h`),$!==0&&c.push(`${$}m`),B!==0||I!==0)if(I===0)c.push(`${B}s`);else if(I%1e6===0){const v=I/1e6;c.push(`${B}.${v.toString().padStart(3,"0")}s`)}else if(I%1e3===0){const v=I/1e3;c.push(`${B}.${v.toString().padStart(6,"0")}s`)}else c.push(`${B}.${I.toString().padStart(9,"0")}s`)}i[l]=c.length>0?c.join(" "):"0";continue}if(Array.isArray(t)){const n=[];i[l]=n;for(let o=t.length-1;o>=0;o--)h.push([t[o],n,o,m]);continue}if(typeof t.toJSON=="function"){const n=t.toJSON();h.push([n,i,l,m]);continue}if(t instanceof Map){const n={};i[l]=n;const o=Array.from(t.entries());for(let y=o.length-1;y>=0;y--){const[w,c]=o[y];h.push([c,n,String(w),String(w)])}continue}const D={};i[l]=D;const T=Object.keys(t);for(let n=T.length-1;n>=0;n--){const o=T[n];h.push([t[o],D,o,o])}}return E}async function U(){try{S&&await S.close(),d&&await d.terminate()}catch{}d=null,S=null}function x(r){return{mvp:{mainModule:`${r}/duckdb-mvp.wasm`,mainWorker:`${r}/duckdb-browser-mvp.worker.js`},eh:{mainModule:`${r}/duckdb-eh.wasm`,mainWorker:`${r}/duckdb-browser-eh.worker.js`},coi:{mainModule:`${r}/duckdb-coi.wasm`,mainWorker:`${r}/duckdb-browser-coi.worker.js`,pthreadWorker:`${r}/duckdb-browser-coi.pthread.worker.js`}}}async function X(r){for(const f of r)try{const e=f.eh?.mainModule||f.mvp?.mainModule;if(e&&(await fetch(e,{method:"HEAD"})).ok)return f}catch{}return null}self.addEventListener("message",async r=>{const f=r.data;try{if(f.type==="init"){const e=f.baseUrls||[];if(H=e,!M){const t=await import("./duckdb-browser-BX0LtQQW.js");M=t,k=t.DuckDBDataProtocol}const a=new M.ConsoleLogger(M.LogLevel.WARNING),s=e.map(t=>x(t));let u=await X(s);u||(u=M.getJsDelivrBundles());const p=u.eh||await M.selectBundle(u),E=new Worker(p.mainWorker);d=new M.AsyncDuckDB(a,E),await d.instantiate(p.mainModule,p.pthreadWorker);let h=!1;await d.open({path:":memory:",accessMode:M.DuckDBAccessMode.READ_WRITE}),S=await d.connect();try{await S.query("SET memory_limit=-1"),await S.query("SET threads=1"),await S.query("SET preserve_insertion_order=false");const t=Intl.DateTimeFormat().resolvedOptions().timeZone;t&&await S.query(`SET TimeZone='${t}'`)}catch(t){console.warn("[DuckDB] Config failed (non-critical):",t)}self.postMessage({type:"inited",opfsPersistence:h})}else if(f.type==="run"){const{id:e,sql:a}=f;b.set(e,0);try{if(S&&typeof S.queryArrowIPC=="function"){const s=await S.queryArrowIPC(a);for await(const u of s){for(;(b.get(e)||0)>=G;)await new Promise(p=>setTimeout(p,10));try{self.postMessage({type:"arrow",id:e,buffer:u},[u])}catch{self.postMessage({type:"arrow",id:e,buffer:u})}b.set(e,(b.get(e)||0)+1)}}else{const s=await S.query(a),u=new Map;if(s.schema?.fields){for(const p of s.schema.fields)if(p.type?.toString()?.includes("Interval")){const E=s.getChild(p.name);E?.data?.[0]?.values instanceof Int32Array&&u.set(p.name,E.data[0].values)}}if(s.toArrow){const p=s.toArrow();self.postMessage({type:"arrow",id:e,buffer:p},[p])}else{let p,E;if(s.schema&&s.schema.fields){p=new Map,E=new Map;const o=s.schema.fields.map(c=>{let g="UNKNOWN";return c.type&&typeof c.type.toString=="function"&&(g=c.type.toString()),E.set(c.name,g),c.type&&c.type.constructor?.name?.includes("Decimal")&&c.type.scale!==void 0&&p.set(c.name,c.type.scale),{name:c.name,type:g,nullable:c.nullable}}),y=JSON.stringify(o),w=new TextEncoder().encode(y).buffer;self.postMessage({type:"json-schema",id:e,buffer:w},[w])}const h=s.toArray?s.toArray():s,t=5*1024*1024,i=500,l=5e5;let m=[],A=0,F=0,D=0,T=0,n=0;for(let o=0;o<h.length&&!R.has(e);o++)try{const y=q(h[o],p,E,u,o),c=JSON.stringify(y).length;if(F+=c,c>T&&(T=c),c>l&&D++,m.length>0&&(A+c>t||m.length>=i)){const g=JSON.stringify(m),N=new TextEncoder().encode(g).buffer;for(self.postMessage({type:"json",id:e,buffer:N},[N]),n++,b.set(e,(b.get(e)||0)+1);(b.get(e)||0)>=G&&!R.has(e);)await new Promise(_=>setTimeout(_,10));m=[],A=0}m.push(y),A+=c}catch(y){const w=h[o],c=w&&typeof w=="object"?Object.keys(w):[];console.error(`[DuckDB Worker] Row ${o} failed to serialize:`,{error:String(y),errorName:y.name,rowKeys:c.slice(0,10)}),m.push({__error:`Row ${o} failed: ${y.name}`}),A+=100}if(m.length>0&&!R.has(e)){const o=JSON.stringify(m),y=new TextEncoder().encode(o).buffer;self.postMessage({type:"json",id:e,buffer:y},[y]),n++,b.set(e,(b.get(e)||0)+1)}self.postMessage({type:"query-stats",id:e,stats:{totalRows:h.length,totalBytes:F,largeRowCount:D,maxRowSize:T,chunkCount:n,avgRowSize:h.length>0?Math.round(F/h.length):0}})}}}catch(s){const u=String(s);u.includes("database has been invalidated")||u.includes("FATAL Error")?(await U(),self.postMessage({type:"error",id:e,error:"Database encountered a fatal error and has been reset. Please reload the page to reinitialize."})):u.includes("Out of Memory")||u.includes("Allocation failure")?self.postMessage({type:"error",id:e,error:`Out of Memory: The query or file is too large to process in the browser. Try:
2
+ 1. Querying smaller subsets using LIMIT or WHERE clauses
3
+ 2. Using SELECT with specific columns instead of SELECT *
4
+ 3. Processing smaller files
5
+ 4. Using COUNT(*) with LIMIT for large tables`}):self.postMessage({type:"error",id:e,error:u})}finally{self.postMessage({type:"done",id:e}),b.delete(e),R.delete(e),P()}}else if(f.type==="ack"){const{id:e}=f,a=b.get(e)||0;b.set(e,Math.max(0,a-1))}else if(f.type==="cancel"){const{id:e}=f;R.add(e),self.postMessage({type:"cancelled",id:e})}else if(f.type==="register_file"){const{id:e,fileName:a,fileBuffer:s}=f;try{if(!d)throw new Error("Database not initialized");await d.registerFileBuffer(a,new Uint8Array(s)),self.postMessage({type:"file_registered",id:e})}catch(u){self.postMessage({type:"error",id:e,error:String(u)})}}else if(f.type==="copy_file_to_buffer"){const{id:e,fileName:a}=f;try{if(!d)throw new Error("Database not initialized");const s=await d.copyFileToBuffer(a);self.postMessage({type:"file_buffer",id:e,buffer:s},[s.buffer])}catch(s){self.postMessage({type:"error",id:e,error:String(s)})}}else if(f.type==="register_file_handle"){const{id:e,fileName:a,file:s}=f;try{if(!d)throw new Error("Database not initialized");if(!k)throw new Error("DuckDBDataProtocol not loaded");await d.registerFileHandle(a,s,k.BROWSER_FILEREADER,!0),self.postMessage({type:"file_registered",id:e})}catch(u){self.postMessage({type:"error",id:e,error:String(u)})}}else if(f.type==="drop_file"){const{id:e,fileName:a}=f;try{if(!d)throw new Error("Database not initialized");await d.dropFile(a),self.postMessage({type:"file_dropped",id:e})}catch(s){self.postMessage({type:"error",id:e,error:String(s)})}}else if(f.type==="opfs_register_output"){const{id:e,fileName:a}=f;try{if(!d)throw new Error("Database not initialized");if(!k)throw new Error("DuckDBDataProtocol not loaded");const u=await(await navigator.storage.getDirectory()).getFileHandle(a,{create:!0});await d.registerFileHandle(a,u,k.BROWSER_FSACCESS,!0),self.postMessage({type:"opfs_output_registered",id:e})}catch(s){self.postMessage({type:"error",id:e,error:String(s)})}}else if(f.type==="opfs_release_output"){const{id:e,fileName:a}=f;try{if(!d)throw new Error("Database not initialized");await d.dropFile(a),self.postMessage({type:"opfs_output_released",id:e})}catch(s){self.postMessage({type:"error",id:e,error:String(s)})}}else if(f.type==="opfs_probe"){const{id:e}=f,a=`__opfs_probe_${Date.now()}.parquet`,s=async()=>{try{await(await navigator.storage.getDirectory()).removeEntry(a)}catch{}};try{if(!d||!S||!k)throw new Error("Database not initialized");const u=await navigator.storage.getDirectory(),p=await u.getFileHandle(a,{create:!0});await d.registerFileHandle(a,p,k.BROWSER_FSACCESS,!0),await S.query(`COPY (SELECT 1 AS a) TO '${a}' (FORMAT PARQUET)`),await d.dropFile(a);const h=(await(await u.getFileHandle(a)).getFile()).size>0;await s(),self.postMessage({type:"opfs_probe_result",id:e,ok:h})}catch{await s(),self.postMessage({type:"opfs_probe_result",id:e,ok:!1})}}}catch(e){self.postMessage({type:"error",error:String(e)})}});
package/assets/index.html CHANGED
@@ -7,6 +7,33 @@
7
7
  <meta name="description" content="Lightweight browser-native SQL utility powered by DuckDB. No install, just query. Run SQL queries entirely in your browser with zero setup.">
8
8
  <meta name="keywords" content="sql, duckdb, browser, database, query, data analysis, wasm, browser-native, no install">
9
9
 
10
+ <!--
11
+ Content Security Policy. Always-on baseline; HTTP-header CSP from
12
+ cli.js / vercel.json takes precedence when present and adds
13
+ frame-ancestors (which is meta-incompatible).
14
+ - 'wasm-unsafe-eval' is required by DuckDB-WASM
15
+ - connect-src https: is required for DuckDB httpfs (queries against
16
+ arbitrary remote CSV/Parquet URLs); known endpoints listed
17
+ explicitly for documentation even though https: subsumes them
18
+ - http://localhost:4213 is the DuckDB CLI's `-ui` server (server
19
+ mode). Without it the mode-detection probe to /info is blocked,
20
+ including under the vite dev server, so server mode never detects.
21
+ - blob: for DuckDB worker module URLs
22
+ -->
23
+ <meta http-equiv="Content-Security-Policy" content="
24
+ default-src 'self';
25
+ script-src 'self' 'wasm-unsafe-eval';
26
+ style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
27
+ font-src 'self' data: https://fonts.gstatic.com;
28
+ img-src 'self' data: blob:;
29
+ connect-src 'self' https: http://localhost:4213 blob: data:;
30
+ worker-src 'self' blob:;
31
+ object-src 'none';
32
+ base-uri 'self';
33
+ form-action 'self';
34
+ ">
35
+ <meta name="referrer" content="no-referrer">
36
+
10
37
  <!-- Google Fonts for editor font options -->
11
38
  <link rel="preconnect" href="https://fonts.googleapis.com">
12
39
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@ -14,12 +41,12 @@
14
41
 
15
42
  <!-- Favicon - database icon in gradient rounded square -->
16
43
  <link rel="icon" type="image/svg+xml" href="./logo/favicon.svg">
17
- <script type="module" crossorigin src="./assets/main-BMGJaDqG.js"></script>
18
- <link rel="modulepreload" crossorigin href="./assets/oauth-constants-m7PlKcMR.js">
44
+ <script type="module" crossorigin src="./assets/main-Bof6Xytb.js"></script>
45
+ <link rel="modulepreload" crossorigin href="./assets/oauth-constants-deHgNN8Q.js">
19
46
  <link rel="modulepreload" crossorigin href="./assets/react-vendor-B2Ij4Vfr.js">
20
47
  <link rel="modulepreload" crossorigin href="./assets/monaco-editor-CbzSR0rd.js">
21
48
  <link rel="stylesheet" crossorigin href="./assets/monaco-editor-DvqauXKu.css">
22
- <link rel="stylesheet" crossorigin href="./assets/main-CiZpADZR.css">
49
+ <link rel="stylesheet" crossorigin href="./assets/main-BwPcj8tu.css">
23
50
  </head>
24
51
  <body>
25
52
  <div id="root"></div>
@@ -45,8 +45,8 @@
45
45
  color: #ff6b6b;
46
46
  }
47
47
  </style>
48
- <script type="module" crossorigin src="./assets/oauth-callback-BSauVj6P.js"></script>
49
- <link rel="modulepreload" crossorigin href="./assets/oauth-constants-m7PlKcMR.js">
48
+ <script type="module" crossorigin src="./assets/oauth-callback-D-QMdUuo.js"></script>
49
+ <link rel="modulepreload" crossorigin href="./assets/oauth-constants-deHgNN8Q.js">
50
50
  </head>
51
51
  <body>
52
52
  <div class="box">
package/dist/cli.js CHANGED
@@ -228,6 +228,28 @@ const server = createServer((req, res) => {
228
228
  'Content-Type': contentType,
229
229
  'Content-Length': content.length,
230
230
  'Cache-Control': 'no-cache',
231
+ // Security headers - mirror the production posture (sql.dbxlite.com)
232
+ // so the npm-distributed build doesn't have a weaker baseline than
233
+ // the hosted version. CSP also lives in index.html as a meta tag;
234
+ // the HTTP header here adds frame-ancestors (which meta CSP can't
235
+ // express) and ensures any non-HTML asset (JS, WASM) is served with
236
+ // a CSP too.
237
+ 'Content-Security-Policy':
238
+ "default-src 'self'; " +
239
+ "script-src 'self' 'wasm-unsafe-eval'; " +
240
+ "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; " +
241
+ "font-src 'self' data: https://fonts.gstatic.com; " +
242
+ "img-src 'self' data: blob:; " +
243
+ "connect-src 'self' https: http://localhost:4213 blob: data:; " +
244
+ "worker-src 'self' blob:; " +
245
+ "object-src 'none'; " +
246
+ "base-uri 'self'; " +
247
+ "form-action 'self'; " +
248
+ "frame-ancestors 'none';",
249
+ 'Cross-Origin-Opener-Policy': 'same-origin',
250
+ 'Cross-Origin-Embedder-Policy': 'credentialless',
251
+ 'Referrer-Policy': 'no-referrer',
252
+ 'X-Content-Type-Options': 'nosniff',
231
253
  });
232
254
  res.end(content);
233
255
  } catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dbxlite-ui",
3
- "version": "0.3.6",
3
+ "version": "0.5.0",
4
4
  "description": "Local UI for DuckDB - replaces duckdb -ui with dbxlite",
5
5
  "homepage": "https://github.com/hfmsio/dbxlite",
6
6
  "bugs": "https://github.com/hfmsio/dbxlite/issues",
@@ -1 +0,0 @@
1
- *{box-sizing:border-box}:root{--space-1: 2px;--space-2: 4px;--space-3: 6px;--space-4: 8px;--space-5: 10px;--space-6: 12px;--space-7: 14px;--space-8: 16px;--space-9: 20px;--space-10: 24px;--space-12: 30px;--space-14: 40px;--space-16: 60px;--radius-xs: 2px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--radius-xl: 12px;--radius-2xl: 16px;--radius-full: 9999px;--font-xs: 10px;--font-sm: 11px;--font-base: 12px;--font-md: 13px;--font-lg: 14px;--font-xl: 16px;--font-2xl: 18px;--font-3xl: 20px;--font-4xl: 24px;--font-5xl: 48px;--header-height: 48px;--tab-bar-height: 40px;--sidebar-width: 280px;--sidebar-collapsed-width: 48px;--footer-height: 32px;--min-pane-height: 100px;--max-content-width: 1800px;--z-base: 0;--z-raised: 1;--z-dropdown: 10;--z-sticky: 20;--z-overlay: 50;--z-modal-backdrop: 100;--z-modal: 110;--z-toast: 120;--z-popover: 130;--z-context-menu: 140;--color-error: #ef4444;--color-error-light: rgba(239, 68, 68, .1);--color-warning: #f59e0b;--color-warning-light: rgba(245, 158, 11, .1);--color-success: #10b981;--color-success-light: rgba(16, 185, 129, .1);--color-info: #3b82f6;--color-info-light: rgba(59, 130, 246, .1);--color-purple: #8b5cf6;--color-purple-light: rgba(139, 92, 246, .1);--progress-gradient-start: #4CAF50;--progress-gradient-end: #66BB6A;--btn-radius: var(--radius-md);--btn-transition: all .15s ease;--btn-hover-lift: translateY(-1px);--btn-active-press: translateY(0);--table-cell-padding: var(--space-4) var(--space-6);--table-row-stripe: rgba(var(--bg-secondary-rgb, 30, 30, 30), .3);--transition-fast: .1s ease;--transition-normal: .15s ease;--transition-slow: .25s ease;--focus-ring: 0 0 0 2px var(--accent);--focus-ring-offset: 0 0 0 4px var(--bg-primary);--mode-http-color: #22c55e;--mode-http-bg: rgba(34, 197, 94, .15);--mode-wasm-color: #3b82f6;--mode-wasm-bg: rgba(59, 130, 246, .15)}[data-theme=vs]{--mode-http-color: #15803d;--mode-http-bg: rgba(21, 128, 61, .12);--mode-wasm-color: #1d4ed8;--mode-wasm-bg: rgba(29, 78, 216, .12)}.mode-indicator-badge{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;font-size:11px;font-weight:600;border-radius:4px;border:none;cursor:pointer;transition:all .15s}.mode-indicator-badge.http{background-color:var(--mode-http-bg);color:var(--mode-http-color)}.mode-indicator-badge.wasm{background-color:var(--mode-wasm-bg);color:var(--mode-wasm-color)}.mode-indicator-dot{width:6px;height:6px;border-radius:50%}.mode-indicator-dot.http{background-color:var(--mode-http-color)}.mode-indicator-dot.wasm{background-color:var(--mode-wasm-color)}[data-theme=vs] .mode-indicator-badge.http{background-color:#15803d1f;color:#15803d;-webkit-text-fill-color:#15803d;background-clip:border-box}[data-theme=vs] .mode-indicator-badge.wasm{background-color:#1d4ed81f;color:#1d4ed8;-webkit-text-fill-color:#1d4ed8;background-clip:border-box}[data-theme=vs] .mode-indicator-dot.http{background-color:#15803d}[data-theme=vs] .mode-indicator-dot.wasm{background-color:#1d4ed8}.mode-indicator-dot-lg{width:8px;height:8px;border-radius:50%}.mode-indicator-dot-lg.http{background-color:var(--mode-http-color)}.mode-indicator-dot-lg.wasm{background-color:var(--mode-wasm-color)}[data-theme=vs] .mode-indicator-dot-lg.http{background-color:#15803d}[data-theme=vs] .mode-indicator-dot-lg.wasm{background-color:#1d4ed8}*:focus-visible{outline:none;box-shadow:var(--focus-ring-offset),var(--focus-ring)}button:focus-visible,[tabindex]:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none;box-shadow:var(--focus-ring-offset),var(--focus-ring)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}html{transition:background-color .3s ease,color .3s ease}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;margin:0;padding:0;background:var(--bg-secondary);color:var(--text-primary);overflow-x:hidden;transition:background-color .3s ease,color .3s ease}html,body{overscroll-behavior-x:none}.app,.header,.tab-bar,.main-compact,.result-table-container,.modal-content,.data-source-explorer{transition:background-color .3s ease,color .3s ease,border-color .3s ease}.app{min-height:100vh;display:flex;flex-direction:column;overscroll-behavior-x:none}.header{background:linear-gradient(135deg,var(--header-gradient-start) 0%,var(--header-gradient-end) 100%);background-color:rgba(var(--bg-primary-rgb),var(--header-bg-alpha));backdrop-filter:var(--header-blur);-webkit-backdrop-filter:var(--header-blur);padding:6px 8px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(var(--bg-primary-rgb),.2);box-shadow:var(--shadow-md);flex-shrink:0;position:relative;gap:20px}[data-theme=vs] .header{background:linear-gradient(135deg,#fafafa,#f5f5f5);border-bottom:1px solid #e5e5e5;box-shadow:0 1px 3px #00000014;position:relative}[data-theme=vs] .header:before{content:"";position:absolute;top:0;left:0;right:0;height:0;background:transparent;opacity:0;z-index:0}[data-theme=vs] .header>*{position:relative;z-index:1}@media(prefers-reduced-motion:reduce){.header{transition:none}}.header-section{display:flex;align-items:center;gap:16px;padding:4px 20px;transition:all .3s ease;position:relative}.header-left{border-right:2px solid var(--divider-color);flex-shrink:1;min-width:0;padding-left:8px;border-radius:8px;overflow:hidden}.header-left:hover{background:rgba(var(--bg-secondary-rgb),.4)}[data-theme=vs] .header-left{border-right:1px solid #e5e5e5}[data-theme=vs] .header-left:hover{background:#00000008;box-shadow:none}.header-center{border-right:2px solid var(--divider-color);border-left:3px solid rgba(6,182,212,.4);flex-shrink:0;gap:12px;border-radius:8px}.header-center:hover{background:rgba(var(--bg-secondary-rgb),.3);border-left-color:#06b6d499}[data-theme=vs] .header-center{border-right:1px solid #e5e5e5;border-left:2px solid #d4d4d8}[data-theme=vs] .header-center:hover{background:#00000008;border-left-color:#a1a1aa;box-shadow:none}.header-right{border-left:3px solid rgba(255,240,0,.4);gap:12px;flex-shrink:0;margin-left:auto;border-radius:8px}.header-right:hover{background:rgba(var(--bg-secondary-rgb),.25);border-left-color:#fff00099}[data-theme=vs] .header-right{border-left:2px solid #d4d4d8}[data-theme=vs] .header-right:hover{background:#00000008;border-left-color:#a1a1aa;box-shadow:none}.app-title{margin:0;font-size:16px;font-weight:700;color:var(--text-primary);letter-spacing:-.5px;display:flex;align-items:center;gap:10px}[data-theme=vs] .app-title{background:linear-gradient(135deg,var(--accent) 0%,var(--success) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:800;letter-spacing:-.8px}.duckdb-badge{color:gold;text-shadow:0 1px 2px rgba(0,0,0,.3)}[data-theme=vs] .duckdb-badge{font-size:18px;color:#d97706;filter:none;text-shadow:none;opacity:1;font-weight:700;-webkit-text-fill-color:#d97706;-webkit-background-clip:unset;background-clip:unset;background:none}[data-theme=hc-light] .duckdb-badge{color:#8b6914;text-shadow:0 1px 2px rgba(139,105,20,.2)}[data-theme=vs-light] .duckdb-badge,[data-theme=github-light] .duckdb-badge,[data-theme=solarized-light] .duckdb-badge,[data-theme=ayu-light] .duckdb-badge{color:#b8860b;text-shadow:none;font-weight:700}.status-indicator{font-size:11px;padding:6px 12px;border-radius:16px;background:rgba(var(--bg-secondary-rgb),.8);border:1px solid rgba(var(--bg-primary-rgb),.3);backdrop-filter:blur(8px);transition:all .3s ease;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;min-width:0}[data-theme=vs] .status-indicator{background:var(--bg-tertiary);border:1px solid var(--border);font-weight:600;padding:5px 10px}.status-initializing{color:var(--warning);animation:pulse-warning 2s ease-in-out infinite}[data-theme=vs] .status-initializing{background:#f59e0b1a;border-color:var(--warning)}.status-error{color:var(--error);animation:shake .5s ease-in-out}[data-theme=vs] .status-error{background:#dc26261a;border-color:var(--error)}.status-ready{color:var(--success)}[data-theme=vs] .status-ready{background:#10b9811a;border-color:var(--success)}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.7}}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-4px)}75%{transform:translate(4px)}}.connector-selector{display:flex;align-items:center;gap:8px;font-size:13px}.connector-selector label{color:var(--text-secondary);font-weight:500}.connector-selector select{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);padding:6px 12px;border-radius:6px;font-size:13px;cursor:pointer;transition:all .15s ease-out;box-shadow:var(--shadow-sm)}.connector-selector select:hover{border-color:var(--border-light);transform:translateY(-1px);box-shadow:var(--shadow-md)}.connector-selector select:active{transform:translateY(0)}.connector-selector select:disabled{opacity:.5;cursor:not-allowed}.settings-button{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--accent-muted, color-mix(in srgb, var(--accent) 40%, var(--border)));padding:6px 14px;border-radius:6px;font-size:13px;cursor:pointer;transition:all .15s ease-out;font-weight:500;box-shadow:var(--shadow-sm)}.settings-button:hover{background:var(--accent-muted, color-mix(in srgb, var(--accent) 15%, var(--bg-secondary)));border-color:var(--accent);color:var(--accent);transform:translateY(-1px);box-shadow:0 2px 8px color-mix(in srgb,var(--accent) 25%,transparent)}.settings-button:active{transform:translateY(0)}.theme-toggle{display:flex;align-items:center;gap:6px;padding:4px 8px;border-radius:6px;transition:background .2s ease}.theme-toggle:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}.theme-toggle.theme-changing{animation:theme-pulse .4s ease-out}.theme-icon{transition:transform .3s ease,color .3s ease}.theme-icon.icon-spin{animation:icon-rotate .4s ease-out}.theme-select{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);padding:6px 10px;border-radius:6px;font-size:13px;cursor:pointer;font-weight:500;transition:all .15s ease-out}.theme-select:hover{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 20%,transparent)}.theme-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.theme-accent-dot{flex-shrink:0}@keyframes icon-rotate{0%{transform:rotate(0) scale(1)}50%{transform:rotate(180deg) scale(1.2)}to{transform:rotate(360deg) scale(1)}}@keyframes theme-pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--accent) 40%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 20%,transparent)}to{box-shadow:0 0 0 0 transparent}}.run-button-header{background:var(--accent-hover);color:#fff;border:none;padding:6px 16px;border-radius:var(--btn-radius);font-size:13px;font-weight:600;cursor:pointer;transition:var(--btn-transition);box-shadow:0 2px 8px #2563eb40,var(--shadow-sm);position:relative;overflow:hidden}.run-button-header:hover:not(:disabled){background:#1d4ed8;transform:var(--btn-hover-lift) scale(1.02);box-shadow:0 8px 20px #2563eb73,var(--shadow-md)}.run-button-header:active:not(:disabled){transform:var(--btn-active-press) scale(1.01);box-shadow:0 2px 8px #2563eb40}.run-button-header:disabled{background:var(--bg-tertiary);color:var(--text-muted);cursor:not-allowed;opacity:.6;box-shadow:none}.stop-button-header{background:#dc2626;color:#fff;border:none;padding:6px 16px;border-radius:var(--btn-radius);font-size:13px;font-weight:600;cursor:pointer;transition:var(--btn-transition);box-shadow:var(--shadow-sm);animation:pulse-glow 2s cubic-bezier(.4,0,.6,1) infinite}.stop-button-header:hover{background:#b91c1c;transform:var(--btn-hover-lift) scale(1.02);box-shadow:0 6px 16px #dc262680,var(--shadow-md)}.stop-button-header:active{transform:var(--btn-active-press) scale(1);box-shadow:var(--shadow-sm)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.8}}@keyframes pulse-glow{0%,to{box-shadow:0 0 8px #dc26264d,var(--shadow-sm)}50%{box-shadow:0 0 16px #dc262699,var(--shadow-md)}}.main{flex:1;padding:20px;display:flex;flex-direction:column;max-width:1800px;width:100%;margin:0 auto;overflow:hidden}.main-compact{flex:1;min-height:0;padding:6px;display:flex;flex-direction:column;max-width:100%;margin:0;overflow:hidden;gap:0;transition:margin-left .2s}.main-compact:has(.monaco-editor){overflow:visible}.editor-pane-compact{height:100%;background:var(--bg-primary);overflow:visible;padding:12px 16px;border:1px solid var(--border);border-radius:8px}.resize-handle-compact{height:8px;background:transparent;cursor:ns-resize;display:flex;align-items:center;justify-content:center;position:relative;margin:4px 0;user-select:none}.resize-handle-compact:hover .resize-handle-bar,.resize-handle-compact.dragging .resize-handle-bar{background:var(--accent);height:4px;width:60px}.resize-handle-bar{width:40px;height:3px;background:var(--border);border-radius:2px;transition:all var(--transition-fast)}.resize-handle-compact.dragging{background:#3b82f614}.results-pane-compact{background:transparent;flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.error-message{padding:10px 12px;background:#ef444426;border:1px solid var(--error);border-radius:6px;color:#fca5a5;margin-bottom:6px;font-size:12px;max-height:150px;overflow-y:auto}.result-stats-footer{display:flex;gap:16px;padding:5px 10px;background:var(--bg-secondary);border-top:1px solid var(--border);font-size:10px;color:var(--text-secondary);flex-shrink:0;z-index:10}.result-stats-footer strong{color:var(--text-primary);font-weight:600}.result-stats-footer input[type=number]{transition:border-color .2s,box-shadow .2s}.result-stats-footer input[type=number]:hover{border-color:var(--accent)}.result-stats-footer input[type=number]:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.result-stats-footer input[type=number]::-webkit-inner-spin-button,.result-stats-footer input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.result-stats-footer input[type=number]{-moz-appearance:textfield}.result-table-container{overflow-x:auto;overflow-y:auto;flex:1 1 auto;min-height:0;height:0;border:1px solid var(--border);border-radius:6px;background:var(--bg-secondary);position:relative}.result-table-container::-webkit-scrollbar{width:14px;height:14px}.result-table-container::-webkit-scrollbar-track{background:var(--bg-primary);border-radius:6px;margin:2px}.result-table-container::-webkit-scrollbar-thumb{background:var(--border-light);border-radius:6px;border:3px solid var(--bg-primary);min-height:40px}.result-table-container::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.result-table-container::-webkit-scrollbar-thumb:active{background:var(--accent)}.result-table-container::-webkit-scrollbar-corner{background:var(--bg-primary)}.result-table{width:100%;border-collapse:collapse;font-size:13px}.result-table thead{position:sticky;top:0;background:linear-gradient(135deg,var(--header-gradient-start) 0%,var(--header-gradient-end) 100%);background-color:rgba(var(--bg-primary-rgb),.95);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:10;box-shadow:0 2px 8px #00000026,0 1px 3px #0000001a}.result-table th{padding:12px 14px;text-align:left;font-weight:700;border-right:1px solid var(--divider-color);border-bottom:2px solid var(--accent);background:rgba(var(--bg-secondary-rgb),.3);color:var(--text-primary);min-width:100px;transition:all .2s ease;text-transform:uppercase;font-size:11px;letter-spacing:.8px;text-shadow:0 1px 2px rgba(0,0,0,.2)}[data-theme=vs] .result-table th{background:var(--bg-tertiary);color:var(--text-primary);border-bottom:2px solid var(--accent);text-shadow:none;font-weight:700;letter-spacing:1px}.result-table th:hover{background:rgba(var(--bg-secondary-rgb),.5);box-shadow:inset 0 0 20px #3b82f614}[data-theme=vs] .result-table th:hover{background:var(--bg-hover);box-shadow:inset 0 0 0 1px var(--accent)}.result-table tbody tr{border-bottom:1px solid var(--border)}.result-table tbody tr:hover{background:#3b82f60d}.result-table tbody tr:nth-child(2n){background:#0000001a}.result-table tbody tr:nth-child(2n):hover{background:#3b82f614}.result-table td{padding:7px 12px;border-right:1px solid var(--border);color:#e2e8f0;font-size:13px}.result-table td:first-child{font-weight:600;color:#94a3b8;background:#0003;font-size:12px}.result-table-modern{width:100%;border-collapse:collapse;font-size:13px;table-layout:auto}.result-table-modern thead{position:sticky;top:0;background:linear-gradient(135deg,var(--header-gradient-start) 0%,var(--header-gradient-end) 100%);background-color:rgba(var(--bg-primary-rgb),.95);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:10;user-select:none;box-shadow:0 2px 8px #00000026,0 1px 3px #0000001a}.result-table-modern th{padding:0;text-align:left;font-weight:600;border-right:1px solid var(--divider-color);border-bottom:2px solid var(--accent);background:rgba(var(--bg-secondary-rgb),.3);position:relative;overflow:hidden;transition:all .2s ease}.result-table-modern th:hover{background:rgba(var(--bg-secondary-rgb),.5);box-shadow:inset 0 0 20px #3b82f614}.th-content{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;position:relative}.column-name{text-transform:uppercase;font-size:11px;letter-spacing:.8px;color:var(--text-primary);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:0 1px 2px rgba(0,0,0,.2)}.row-number-header{background:rgba(var(--bg-secondary-rgb),.4);border-bottom:2px solid rgba(148,163,184,.5)}.row-number-header:hover{background:rgba(var(--bg-secondary-rgb),.6);box-shadow:inset 0 0 20px #94a3b81a}.row-number-header .th-content{justify-content:center}.row-number-header span{color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.5px}.column-resizer{position:absolute;right:0;top:0;bottom:0;width:8px;cursor:col-resize;background:transparent;z-index:2;transition:all .2s ease}.column-resizer:hover{background:linear-gradient(90deg,transparent 0%,var(--accent) 100%);box-shadow:0 0 8px #3b82f680}.column-resizer:active{background:linear-gradient(90deg,transparent 0%,var(--accent-hover) 100%);box-shadow:0 0 12px #3b82f6cc}.result-table-modern tbody tr{border-bottom:1px solid var(--border);transition:background var(--transition-fast),box-shadow var(--transition-fast)}.result-table-modern tbody tr:hover{background:var(--bg-hover);box-shadow:inset 3px 0 0 var(--accent)}.result-table-modern tbody tr:nth-child(2n){background:var(--table-row-stripe)}.result-table-modern tbody tr:nth-child(2n):hover{background:var(--bg-hover);box-shadow:inset 3px 0 0 var(--accent)}.result-table-modern td{padding:var(--table-cell-padding);border-right:1px solid var(--border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative}.result-table-modern .table-cell:after{content:"";position:absolute;right:0;top:0;bottom:0;width:30px;background:linear-gradient(to right,transparent 0%,currentColor 100%);pointer-events:none;opacity:.15;z-index:1}[data-theme=vs-dark] .result-table-modern .table-cell:after{background:linear-gradient(to right,#0f172a00,#0f172a)}[data-theme=vs] .result-table-modern .table-cell:after{background:linear-gradient(to right,#fff0,#fff)}.result-table-modern .table-cell:hover:after{opacity:.05}.row-number-cell{font-weight:600;color:var(--text-muted);background:#00000040;font-size:11px;text-align:center;padding:6px 4px}.data-cell{color:#e2e8f0;font-size:13px;font-family:SF Mono,Monaco,Inconsolata,Fira Code,monospace;transition:background .1s,box-shadow .1s}.data-cell:hover{background:#3b82f61f}.data-cell.selected-cell{background:#3b82f633;box-shadow:inset 0 0 0 1px var(--accent);position:relative}.data-cell.selected-cell:after{content:"📋";position:absolute;right:4px;top:50%;transform:translateY(-50%);font-size:10px;opacity:.6}.empty-row{text-align:center;padding:40px 20px;color:var(--text-muted);font-style:italic}.empty-state-compact{padding:30px 20px;text-align:center;color:var(--text-muted);border:1px dashed var(--border);border-radius:6px;margin:6px}.empty-state-enhanced{padding:60px 20px;text-align:center;border:1px dashed var(--border);border-radius:8px;margin:12px;background:var(--bg-secondary);animation:fadeIn .3s ease-in}@keyframes fadeIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:48px;margin-bottom:16px;opacity:.9}.empty-heading{margin:0 0 12px;font-size:18px;font-weight:600;color:var(--text-primary)}.empty-hint{margin:0 0 20px;font-size:14px;color:var(--text-secondary);line-height:1.5}.empty-shortcuts{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;background:var(--bg-tertiary);border-radius:6px;font-size:13px;color:var(--text-muted)}.empty-shortcuts kbd{background:var(--bg-primary);border:1px solid var(--border);border-radius:4px;padding:4px 8px;font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:12px;font-weight:600;color:var(--text-primary);box-shadow:0 1px 2px #0000001a}@keyframes modal-enter{0%{opacity:0;transform:scale(.95) translateY(-10px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes modal-backdrop-enter{0%{opacity:0}to{opacity:1}}.modal-overlay{position:fixed;inset:0;background:#000000bf;display:flex;align-items:center;justify-content:center;z-index:var(--z-modal-backdrop);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);animation:modal-backdrop-enter .2s ease-out}.modal-content{background:var(--bg-primary);border:1px solid var(--border);border-radius:16px;width:95%;max-width:1200px;min-height:600px;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg);animation:modal-enter .2s ease-out}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--bg-primary);z-index:var(--z-sticky)}.modal-header h2{margin:0;font-size:20px;font-weight:700;color:var(--text-primary)}.modal-close{background:transparent;border:none;color:var(--text-muted);font-size:24px;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:6px;transition:all .2s}.modal-close:hover{background:var(--bg-secondary);color:var(--text-primary)}.modal-body{padding:24px}.cell-modal-header{position:relative;overflow:visible}[data-theme=vs-dark] .cell-modal-header{background:linear-gradient(135deg,var(--bg-secondary) 0%,rgba(37,99,235,.08) 50%,var(--bg-secondary) 100%);border-bottom:2px solid rgba(37,99,235,.3);box-shadow:0 2px 8px #0000004d,inset 0 1px #ffffff0d}[data-theme=vs-dark] .cell-modal-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,transparent 0%,#2563eb 20%,#10b981 50%,#2563eb 80%,transparent 100%);opacity:.8}[data-theme=vs] .cell-modal-header{background:linear-gradient(135deg,#fff,#f0f9ff,#e0f2fe);border-bottom:2px solid var(--border-light);box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f,inset 0 1px #fffc}[data-theme=vs] .cell-modal-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#2563eb,#10b981,#2563eb);opacity:.6}.cell-data-type-badge{text-transform:uppercase;transition:all .2s ease}[data-theme=vs-dark] .cell-data-type-badge{background:linear-gradient(135deg,#2563eb26,#10b98126);color:#60a5fa;border:1px solid rgba(37,99,235,.3);box-shadow:0 0 8px #2563eb33}[data-theme=vs-dark] .cell-data-type-badge:hover{background:linear-gradient(135deg,#2563eb40,#10b98140);box-shadow:0 0 12px #2563eb66;transform:translateY(-1px)}[data-theme=vs] .cell-data-type-badge{background:linear-gradient(135deg,#dbeafe,#d1fae5);color:#1e40af;border:1px solid #93c5fd;box-shadow:0 1px 3px #2563eb33}[data-theme=vs] .cell-data-type-badge:hover{background:linear-gradient(135deg,#bfdbfe,#a7f3d0);box-shadow:0 2px 6px #2563eb4d;transform:translateY(-1px)}.modal-body>div{background:var(--bg-secondary);border:1px solid var(--border);border-radius:12px;padding:20px;margin-bottom:16px}.modal-body h3{margin-top:0;margin-bottom:16px;font-size:16px;font-weight:600;color:var(--text-primary)}.modal-body label{display:block;font-size:13px;font-weight:500;margin-bottom:6px;color:var(--text-secondary)}.modal-body input[type=password],.modal-body input[type=text],.modal-body textarea{width:100%;padding:8px 12px;background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);font-size:13px;margin-bottom:12px;font-family:inherit}.modal-body input:focus,.modal-body textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #3b82f61a}.modal-body button{background:var(--accent);color:#fff;border:none;padding:8px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;transition:all .2s;margin-right:8px}.modal-body button:hover{background:var(--accent-hover)}.modal-body progress{width:100%;height:6px;border-radius:3px}.tab-bar{background:var(--bg-secondary);border-bottom:1px solid var(--border);padding:8px 0 0;margin-top:-8px;display:flex;align-items:center;transition:margin-left .2s;flex-shrink:0}.tab-list{display:flex;align-items:center;gap:2px;padding:4px 8px;overflow-x:auto;flex:1}.tab-examples{margin-left:auto;border:1px solid var(--accent-muted, color-mix(in srgb, var(--accent) 30%, transparent));background:var(--accent-muted, color-mix(in srgb, var(--accent) 10%, transparent));color:var(--accent);border-radius:6px;padding:6px 10px;font-size:12px;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.tab-examples.active,.tab-examples:hover{background:var(--accent-muted, color-mix(in srgb, var(--accent) 20%, transparent));border-color:var(--accent);box-shadow:0 0 8px var(--accent-muted, color-mix(in srgb, var(--accent) 30%, transparent))}.tab{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--bg-primary);border:1px solid transparent;border-top:2px solid transparent;border-radius:6px 6px 0 0;cursor:pointer;font-size:13px;color:var(--text-secondary);transition:all .2s;min-width:100px;max-width:200px;white-space:nowrap}.tab:hover{background:var(--bg-tertiary);color:var(--text-primary)}.tab.active{background:var(--bg-primary);color:var(--text-primary);border-color:var(--border);border-bottom-color:var(--bg-primary);position:relative;z-index:1}.tab.active:after{content:"";position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent);border-radius:2px 2px 0 0}.tab.file-backed{border-left:3px solid #4b5563;padding-left:9px}[data-theme=vs] .tab.file-backed{border-left-color:#9ca3af}.tab.file-backed.active{border-left:3px solid var(--accent);padding-left:9px}.tab.editing{background:var(--bg-tertiary);border-top-color:var(--accent)}@keyframes pulse-border{0%,to{border-top-color:var(--accent)}50%{border-top-color:var(--accent-hover)}}.tab.editing.active{animation:pulse-border 2s ease-in-out infinite}.tab-name{flex:1;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.tab-name-input{background:var(--bg-tertiary);border:1px solid var(--accent);border-radius:4px;padding:2px 6px;color:var(--text-primary);font-size:13px;outline:none;width:100%}.dirty-indicator{color:var(--warning);margin-left:4px;font-weight:700}.unsaved-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background-color:#f59e0b;margin-right:6px;vertical-align:middle;flex-shrink:0}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.unsaved-dot{animation:pulse 2s ease-in-out infinite}.tab-close{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px 4px;border-radius:3px;font-size:14px;line-height:1;transition:all var(--transition-fast);opacity:0}.tab:hover .tab-close,.tab.active .tab-close{opacity:1}.tab-close:hover{background:var(--error);color:#fff}.tab-add{background:none;border:1px solid var(--border);color:var(--text-secondary);cursor:pointer;padding:4px 12px;border-radius:6px;font-size:16px;line-height:1;transition:all .2s;margin-left:4px}.tab-add:hover{background:var(--accent);color:#fff;border-color:var(--accent)}.tab-add:disabled{opacity:.4;cursor:not-allowed;background:none;border-color:var(--border);color:var(--text-muted)}.file-button{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);padding:6px 12px;border-radius:var(--btn-radius);font-size:13px;font-weight:500;cursor:pointer;transition:var(--btn-transition);white-space:nowrap;box-shadow:var(--shadow-sm)}.file-button:hover:not(:disabled){background:var(--bg-tertiary);border-color:var(--border-light);transform:var(--btn-hover-lift);box-shadow:var(--shadow-md)}.file-button:active:not(:disabled){transform:var(--btn-active-press);box-shadow:var(--shadow-sm)}.file-button:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}@media(max-width:1100px){.duckdb-badge{display:none}}@media(max-width:768px){.header{flex-direction:column;gap:12px;align-items:stretch}.header-left,.header-center,.header-right{justify-content:space-between;border-right:none;border-left:none;padding-right:0;border-bottom:2px solid var(--divider-color);padding-bottom:12px}.header-left{border-top:3px solid rgba(59,130,246,.4)}.header-center{border-top:3px solid rgba(6,182,212,.4)}.header-right{border-top:3px solid rgba(255,240,0,.4);border-bottom:none;padding-bottom:0}.main{padding:12px;gap:12px}.modal-content{width:95%;max-height:90vh}.tab-list{overflow-x:scroll}.file-button{font-size:11px;padding:5px 8px}}.resizable-explorer{position:fixed;left:0;top:52px;bottom:0;background:var(--bg-primary);border-right:1px solid var(--border);z-index:var(--z-overlay);box-shadow:var(--shadow-sm);display:flex;flex-direction:column}.explorer-resize-handle{position:fixed;top:72px;bottom:0;width:6px;cursor:col-resize;z-index:var(--z-overlay);display:flex;align-items:center;justify-content:center}.explorer-resize-handle:hover .resize-handle-indicator,.explorer-resize-handle.resizing .resize-handle-indicator{background:var(--accent);opacity:1}.resize-handle-indicator{width:2px;height:40px;background:var(--border);border-radius:2px;opacity:0;transition:all .2s}.data-source-explorer{width:100%;height:100%;display:flex;flex-direction:column;position:relative}.data-source-explorer.drag-over{border:2px dashed var(--accent)}.drag-drop-overlay{position:absolute;inset:0;background:#3b82f61a;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000;pointer-events:none}.drag-drop-message{background:var(--bg-secondary);padding:32px;border-radius:12px;border:2px dashed var(--accent);text-align:center}.drag-drop-icon{font-size:48px;margin-bottom:16px}.drag-drop-message>div:nth-child(2){font-size:18px;font-weight:600;color:var(--text-primary);margin-bottom:8px}.drag-drop-hint{font-size:14px;color:var(--text-secondary)}.explorer-header{padding:8px 16px 10px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;background:var(--bg-secondary);flex-shrink:0;transition:all .2s ease}[data-theme=vs] .explorer-header{background:linear-gradient(to bottom,var(--bg-primary),var(--bg-secondary));border-bottom:1px solid var(--border-light);box-shadow:var(--shadow-sm)}.explorer-title{font-size:13px;font-weight:600;margin:0;color:var(--text-primary);letter-spacing:.3px;text-transform:uppercase;font-size:11px}[data-theme=vs] .explorer-title{color:var(--text-primary);font-weight:700}.explorer-header-actions{display:flex;gap:4px;align-items:center}.explorer-action-btn{background:none;border:none;color:var(--text-secondary);font-size:18px;cursor:pointer;padding:4px 8px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.explorer-action-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.explorer-close-btn{background:none;border:none;color:var(--text-secondary);font-size:24px;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.explorer-close-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.explorer-search{padding:8px 12px;border-bottom:1px solid var(--border);background:var(--bg-secondary);display:flex;align-items:center;gap:6px;flex-shrink:0}.search-input{flex:1;min-width:0;padding:6px 10px;background:var(--bg-primary);border:1px solid var(--border);border-radius:4px;color:var(--text-primary);font-size:13px;outline:none;transition:all .2s}.search-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.search-input::placeholder{color:var(--text-muted)}.search-actions{display:flex;align-items:center;gap:2px;flex-shrink:0}.search-action-btn{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:4px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.search-action-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.search-clear-btn{background:none;border:none;color:var(--text-muted);font-size:18px;cursor:pointer;padding:2px;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.search-clear-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.explorer-content{flex:1;overflow-y:auto;overflow-x:hidden}.explorer-content.unified{padding:8px 0}.explorer-content.unified .empty-state{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:40px 8px;gap:12px;position:relative;height:100%}.empty-state-icon{font-size:48px;opacity:.3}.empty-state-text{font-size:14px;font-weight:500;color:var(--text-muted)}.empty-state-hint{font-size:12px;color:var(--text-muted);opacity:.7}.empty-state-size-note{font-size:11px;color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);padding:6px 12px;border-radius:12px;font-weight:500;margin-top:4px}.empty-state-details{display:flex;flex-direction:column;gap:6px;margin-top:12px;padding:12px;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border-light);width:100%}.empty-state-detail-row{display:flex;gap:8px;font-size:11px;align-items:flex-start}.empty-state-detail-row .detail-label{color:var(--text-secondary);white-space:nowrap;min-width:70px}.empty-state-detail-row .detail-value{color:var(--text-muted);flex:1}.empty-state-examples-section{margin-top:16px;padding-top:16px;border-top:1px dashed var(--border);width:100%}.empty-state-examples-section .examples-carousel{margin:0;padding:8px 0}.empty-state-examples-header{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;text-align:center;margin-bottom:12px}.empty-state-samples{margin-top:20px;padding-top:16px;border-top:1px dashed var(--border);width:100%;max-width:280px}.empty-state-samples-title{font-size:11px;color:var(--text-muted);margin-bottom:10px;text-transform:uppercase;letter-spacing:.5px}.empty-state-samples-list{display:flex;flex-direction:column;gap:6px}.sample-query-link{background:var(--bg-secondary);border:1px solid var(--border);border-radius:4px;padding:8px 12px;font-size:12px;color:var(--accent);cursor:pointer;text-align:left;transition:all .15s ease}.sample-query-link:hover{background:var(--bg-tertiary);border-color:var(--accent);transform:translate(2px)}.sample-query-link:active{transform:translate(2px) scale(.98)}.empty-state-examples{position:absolute;bottom:16px;left:8px;right:8px}.empty-state-examples .examples-carousel{margin:0}.examples-carousel{display:grid;grid-template-columns:28px 1fr 28px;grid-template-rows:1fr auto;gap:8px;padding:12px;margin:8px}.examples-carousel-nav{width:28px;height:28px;border-radius:50%;border:1px solid var(--border);background:var(--bg-secondary);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;align-self:center;color:var(--text-muted);flex-shrink:0}.examples-carousel-nav:hover{background:var(--accent);border-color:var(--accent);color:#fff;transform:scale(1.05)}.examples-carousel-card{background:linear-gradient(135deg,color-mix(in srgb,var(--category-color, var(--accent)) 8%,var(--bg-secondary)),var(--bg-secondary));border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px;transition:all .2s ease;height:240px;display:flex;flex-direction:column;overflow:hidden}.examples-carousel-card:hover{border-color:var(--category-color, var(--accent));box-shadow:0 4px 12px #00000014;transform:translateY(-1px)}.examples-carousel-header{display:flex;align-items:center;gap:8px;font-size:var(--font-md);font-weight:600;color:var(--category-color, var(--accent));margin-bottom:12px;cursor:pointer;transition:opacity .15s ease;flex-shrink:0}.examples-carousel-header:hover{opacity:.8}.examples-carousel-examples{display:flex;flex-direction:column;gap:8px;flex:1;overflow-y:auto;min-height:0}.examples-carousel-example{display:block;width:100%;text-align:left;padding:10px 12px;background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:all .15s ease}.examples-carousel-example:hover{border-color:var(--category-color, var(--accent));background:var(--bg-tertiary);transform:translate(2px)}.examples-carousel-example .example-label{display:block;font-size:var(--font-sm);font-weight:500;color:var(--text-primary)}.examples-carousel-example .example-hint{display:block;font-size:11px;color:var(--text-muted);margin-top:3px}.examples-carousel-more{background:none;border:none;color:var(--category-color, var(--accent));font-size:var(--font-sm);cursor:pointer;padding:6px 0 0;text-align:left;transition:all .15s ease;flex-shrink:0}.examples-carousel-more:hover{text-decoration:underline}.examples-carousel-dots{grid-column:1 / -1;display:flex;justify-content:center;gap:6px;padding-top:10px}.examples-carousel-dot{width:8px;height:8px;border-radius:50%;border:none;background:var(--border);cursor:pointer;transition:all .2s ease;padding:0}.examples-carousel-dot.active{width:10px;height:10px;background:var(--dot-color, var(--accent))}.examples-carousel-dot:hover:not(.active){background:var(--text-muted);transform:scale(1.1)}.explorer-section{border-bottom:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0}.data-source-section{margin-bottom:8px}.data-source-section:last-child{margin-bottom:0}.section-header{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;user-select:none;background:var(--bg-secondary);transition:all .2s ease;font-weight:600;font-size:12px;letter-spacing:.5px;text-transform:uppercase}.section-header:hover{background:var(--bg-tertiary)}[data-theme=vs] .section-header{background:var(--bg-tertiary);color:var(--text-secondary);border-radius:6px;margin:4px 8px;font-weight:700}[data-theme=vs] .section-header:hover{background:var(--bg-hover);color:var(--text-primary)}.section-icon{font-size:14px;color:var(--text-muted);transition:color .2s ease}[data-theme=vs] .section-icon{color:var(--accent)}[data-theme=vs] .section-header:hover .section-icon{color:var(--accent-hover)}.connection-placeholder{display:flex;align-items:center;gap:10px;padding:10px 16px;margin:4px 8px;background:var(--bg-secondary);border:1px dashed var(--border);border-radius:6px;cursor:pointer;transition:all .2s}.connection-placeholder:hover{background:var(--bg-tertiary);border-color:var(--accent)}.connection-icon{font-size:18px}.connection-name{flex:1;font-size:13px;font-weight:500;color:var(--text-primary)}.connection-status{font-size:11px;color:var(--text-muted);padding:2px 8px;background:var(--bg-tertiary);border-radius:10px}.connection-action{font-size:14px;color:var(--accent);opacity:.7;transition:opacity .2s}.connection-placeholder:hover .connection-action{opacity:1}.section-title{flex:1;font-size:13px;font-weight:600;color:var(--text-primary)}.section-count{font-size:11px;color:var(--text-muted);background:var(--bg-tertiary);padding:2px 6px;border-radius:10px}.section-content{background:var(--bg-primary);overflow-y:auto;overflow-x:hidden;height:calc(100% - 40px)}.empty-state{padding:16px;text-align:center;color:var(--text-muted);font-size:12px;font-style:italic}.empty-state.server-mode{padding:24px 16px;display:flex;flex-direction:column;gap:20px;font-style:normal;height:100%;justify-content:flex-start}.empty-state.server-mode .empty-state-icon{margin-bottom:4px}.empty-state.server-mode .empty-state-text{font-size:16px;font-weight:600;color:var(--text-primary);margin:0}.empty-state.server-mode .empty-state-hint{font-size:12px;color:var(--text-muted);margin-top:-12px}.server-tips{display:flex;flex-direction:column;gap:12px;text-align:left;margin-top:8px}.server-tip{display:flex;gap:12px;align-items:flex-start;padding:12px;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border)}.server-tip-icon{font-size:18px;line-height:1;flex-shrink:0}.server-tip-content{display:flex;flex-direction:column;gap:4px;min-width:0}.server-tip-title{font-size:12px;font-weight:600;color:var(--text-primary)}.server-tip code{font-size:11px;color:var(--text-secondary);background:var(--bg-tertiary);padding:4px 8px;border-radius:4px;font-family:var(--font-mono);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.server-tip-desc{font-size:11px;color:var(--text-secondary)}button.server-tip-clickable{width:100%;cursor:pointer;transition:all .15s ease;text-align:left}button.server-tip-clickable:hover{background:var(--bg-tertiary);border-color:var(--accent-color)}button.server-tip-clickable:active{transform:scale(.98)}.server-shortcuts{display:flex;justify-content:center;gap:16px;margin-top:auto;padding-top:16px;border-top:1px solid var(--border)}.server-shortcuts .shortcut{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--text-muted)}.server-shortcuts kbd{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;font-size:11px;font-family:var(--font-mono);background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;box-shadow:0 1px 0 var(--border)}.section-resize-handle{height:6px;cursor:row-resize;display:flex;align-items:center;justify-content:center;position:relative;background:var(--bg-secondary);border-top:1px solid var(--border);border-bottom:1px solid var(--border);transition:background .2s;flex-shrink:0}.section-resize-handle:hover{background:var(--bg-tertiary)}.section-resize-handle:hover .section-resize-indicator,.section-resize-handle.resizing .section-resize-indicator{background:var(--accent);opacity:1}.section-resize-indicator{width:40px;height:2px;background:var(--border);border-radius:2px;opacity:.5;transition:all .2s}.database-tree,.file-list{padding:4px 0}.file-list-warning{display:flex;align-items:center;gap:8px;padding:8px 12px;margin:4px 8px;background:#ffc1071a;border:1px solid rgba(255,193,7,.3);border-radius:4px;font-size:12px}.warning-icon{font-size:14px}.warning-text{flex:1;color:var(--text-secondary)}.warning-action-btn{background:var(--accent);color:#fff;border:none;padding:4px 12px;border-radius:4px;font-size:11px;font-weight:500;cursor:pointer;transition:all .2s}.warning-action-btn:hover{background:var(--accent-hover)}.file-unavailable{opacity:.6;background:#ff00000d}.file-unavailable:hover{opacity:.8;background:#ff00001a}.unavailable-badge{margin-left:4px;font-size:12px;opacity:.8}.permission-granted-badge{margin-left:4px;font-size:11px;color:#4ade80;opacity:.9}.permission-needed-badge{margin-left:4px;font-size:12px;opacity:.8;transition:opacity .2s,transform .2s}.permission-needed-badge:hover{opacity:1;transform:scale(1.1)}.permission-denied-badge{margin-left:4px;font-size:12px;color:#ef4444;opacity:.9}.file-remote{background:#0096ff0d;border-left:2px solid rgba(0,150,255,.3)}.file-remote:hover{background:#0096ff1a}.remote-badge{margin-left:4px;font-size:11px;opacity:.7}.file-reload-btn{padding:4px 8px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:all .2s;opacity:.8;margin-left:8px}.file-reload-btn:hover{opacity:1;transform:rotate(180deg);background:var(--accent-hover)}.tree-item{display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none;transition:background var(--transition-fast),box-shadow var(--transition-fast);font-size:13px;position:relative;margin-left:-16px;padding:6px 8px 6px 28px;margin-right:-8px;border-radius:4px}.tree-item:hover{background:var(--bg-hover)}.tree-item.selected{background:#3b82f626;box-shadow:inset 3px 0 0 var(--accent)}.tree-chevron{transition:transform var(--transition-normal)}.tree-item.expanded .tree-chevron{transform:rotate(90deg)}.tree-icon{font-size:14px;min-width:18px;text-align:center}.tree-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary)}.tree-meta{font-size:11px;color:var(--text-muted)}.tree-type{font-size:11px;color:var(--text-muted);font-family:SF Mono,Monaco,monospace}.tree-children{position:relative;padding-left:16px}.tree-children:before{content:"";position:absolute;left:8px;top:0;bottom:0;width:1px;background:var(--border);opacity:.4}.database-item{font-weight:500}.schema-item{padding-left:24px}.table-item{padding-left:36px}.column-item{padding-left:48px;font-size:12px;padding-top:4px;padding-bottom:4px}.columns-list{background:#0000001a}.file-item-container{border-bottom:1px solid var(--border)}.file-item{padding:10px 12px}.file-info{flex:1;overflow:hidden}.file-name{font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-meta{font-size:11px;color:var(--text-muted);margin-top:2px}.expand-icon{font-size:10px;color:var(--text-muted)}.context-menu{position:fixed;background:var(--bg-primary);border:1px solid var(--border);border-radius:8px;box-shadow:var(--shadow-md);min-width:180px;padding:4px 0;z-index:var(--z-context-menu)}.context-menu-item{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;transition:background var(--transition-fast);font-size:13px;color:var(--text-primary)}.context-menu-item:hover{background:var(--bg-tertiary)}.context-menu-item.disabled{opacity:.5;cursor:not-allowed}.context-menu-item.disabled:hover{background:transparent}.context-menu-icon{font-size:14px;min-width:18px}.context-menu-label{flex:1}.context-menu-separator{height:1px;background:var(--border);margin:4px 0}.modal-backdrop{position:fixed;inset:0;background:var(--overlay-bg);display:flex;align-items:center;justify-content:center;z-index:var(--z-context-menu);backdrop-filter:blur(4px)}.data-preview-modal{width:90%;max-width:1400px;max-height:85vh;display:flex;flex-direction:column}.modal-title{margin:0;font-size:18px;color:var(--text-primary)}.modal-close{background:none;border:none;color:var(--text-secondary);font-size:32px;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .2s}.modal-close:hover{background:var(--bg-tertiary);color:var(--text-primary)}.modal-body{flex:1;overflow:hidden;display:flex;flex-direction:column;padding:0}.preview-loading,.preview-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;gap:16px;color:var(--text-secondary)}.spinner{width:40px;height:40px;border:3px solid var(--bg-tertiary);border-top-color:var(--accent);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.preview-stats{display:flex;gap:20px;padding:12px 20px;background:var(--bg-secondary);border-bottom:1px solid var(--border);font-size:12px;color:var(--text-secondary)}.preview-table-container{flex:1;overflow:auto;padding:0}.preview-table{width:100%;border-collapse:collapse;font-size:12px}.preview-table thead{position:sticky;top:0;z-index:10;background:var(--bg-secondary)}.preview-table th{padding:10px 12px;text-align:left;font-weight:600;color:var(--text-primary);border-bottom:2px solid var(--border);white-space:nowrap}.preview-table td{padding:8px 12px;border-bottom:1px solid var(--border);color:var(--text-secondary);max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.preview-table tbody tr:hover{background:var(--bg-tertiary)}.row-number-header,.row-number{width:50px;text-align:center;color:var(--text-muted);font-size:11px}.modal-footer{padding:16px 20px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:8px;background:var(--bg-secondary)}.btn{padding:8px 16px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;border:none;transition:all .2s}.btn-secondary{background:var(--bg-tertiary);color:var(--text-primary)}.btn-secondary:hover{background:var(--border-light)}.retry-btn{padding:8px 16px;background:var(--accent);color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:13px;transition:background .2s}.retry-btn:hover{background:var(--accent-hover)}.main-compact.with-explorer,.tab-bar.with-explorer{margin-left:var(--explorer-width, 300px)}.results-wrapper{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.app-with-explorer .main-content{margin-left:300px}.app-with-explorer .editor-pane,.app-with-explorer .result-pane{margin-left:0}.connection-list{padding:4px 0}.connection-item{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:13px;color:var(--text-primary)}.connection-icon{font-size:14px}.connection-name{flex:1}@media(max-width:768px){.data-source-explorer{width:100%;max-width:300px}.app-with-explorer .main-content{margin-left:0}}.monaco-editor .suggest-widget,.monaco-editor .suggest-widget *{all:revert;color:revert;background:revert;-webkit-text-fill-color:revert}.monaco-editor .suggest-widget{z-index:var(--z-overlay)!important;background-color:var(--bg-secondary, #252526)!important;border:1px solid var(--border, #454545)!important}[data-theme=vs] .monaco-editor .suggest-widget{background-color:#f3f3f3!important;border:1px solid #c8c8c8!important}.loading-indicator{padding:8px;text-align:center;color:var(--text-muted);font-size:12px}.cors-error-hint{margin-top:8px;font-size:11px;opacity:.9}.cors-error-option{margin-top:12px}.cors-error-option-title{font-weight:600}.cors-error-code{margin-top:4px;opacity:.9;font-family:monospace;font-size:10px}.control-btn{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 8px;border-radius:4px;font-size:11px;cursor:pointer;transition:var(--btn-transition)}.control-btn:hover:not(:disabled){background:var(--accent);color:#fff;border-color:var(--accent)}.control-btn:disabled{background:var(--bg-secondary);color:var(--text-muted);cursor:not-allowed}.control-btn-primary{background:var(--accent);color:#fff;border:none;padding:8px 16px;border-radius:6px;font-size:12px;cursor:pointer;transition:var(--btn-transition)}.control-btn-primary:hover:not(:disabled){background:var(--accent-hover)}.control-btn-primary:disabled{opacity:.6;cursor:not-allowed}.export-btn{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 10px;border-radius:4px;font-size:11px;cursor:pointer;transition:all .2s}.export-btn:hover{background:var(--accent);color:#fff}.export-format-btn{color:#fff;border:none;padding:12px 20px;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500;text-align:left;transition:var(--btn-transition)}.export-format-btn:hover{filter:brightness(1.1);transform:var(--btn-hover-lift)}.export-format-btn.csv{background:#0891b2}.export-format-btn.parquet{background:#8b5cf6}.export-format-btn.json{background:#10b981}.form-select{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 8px;border-radius:4px;font-size:11px;cursor:pointer}.form-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.form-input-sm{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border-light);padding:4px 8px;border-radius:4px;font-size:11px;width:60px}.form-input-sm:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #3b82f61a}.form-label{font-size:11px;color:var(--text-muted)}.flex-row{display:flex;align-items:center}.flex-row.gap-sm{gap:6px}.flex-row.gap-md{gap:12px}.flex-row.wrap{flex-wrap:wrap}.flex-col{display:flex;flex-direction:column}.flex-col.gap-sm{gap:6px}.flex-col.gap-md{gap:12px}.simple-modal-overlay{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.simple-modal-content{background:var(--bg-secondary);border-radius:8px;padding:24px;border:1px solid var(--border-light)}.simple-modal-content.sm{max-width:500px;width:90%}.simple-modal-content.md{max-width:600px;width:90%;max-height:80vh;overflow:auto}.simple-modal-content.lg{max-width:800px;width:90%;max-height:80vh}.simple-modal-content.flex{display:flex;flex-direction:column}.simple-modal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.simple-modal-title{margin:0;color:var(--text-primary);font-size:18px}.simple-modal-title.sm{font-size:16px}.simple-modal-close{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:24px;padding:0 8px;transition:color .2s}.simple-modal-close:hover{color:var(--text-primary)}.simple-modal-description{color:var(--text-secondary);font-size:14px;margin-bottom:20px}.simple-modal-note{margin-top:16px;font-size:11px;color:var(--text-muted);font-style:italic}.simple-modal-hint{margin-top:12px;font-size:11px;color:var(--text-muted)}.schema-table{width:100%;border-collapse:collapse}.schema-table thead tr{background:var(--bg-primary);border-bottom:2px solid var(--border-light)}.schema-table th{padding:10px;text-align:left;color:var(--text-muted);font-weight:600;font-size:12px}.schema-table tbody tr{border-bottom:1px solid var(--border)}.schema-table td{padding:10px;font-size:12px}.schema-table td.row-num{color:var(--text-muted)}.schema-table td.col-name{color:var(--text-primary);font-size:13px;font-family:monospace;font-weight:500}.schema-table td.col-type{color:var(--accent);font-family:monospace}.schema-table td.col-sample{color:var(--text-secondary);font-family:monospace;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-detail-textarea{flex:1;background:var(--bg-primary);border:1px solid var(--border);border-radius:4px;color:var(--text-primary);padding:12px;font-size:14px;font-family:monospace;resize:none;outline:none;user-select:text;cursor:text}.cell-detail-textarea:focus{border-color:var(--accent)}.export-progress-overlay{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:10000}.export-progress-modal{background:var(--bg-primary);border:1px solid var(--border-light);border-radius:8px;padding:24px;min-width:400px;max-width:500px}.export-progress-title{margin:0 0 16px;font-size:16px;font-weight:600}.export-progress-file{margin-bottom:16px;font-size:13px;color:var(--text-muted)}.export-progress-stats{display:flex;justify-content:space-between;margin-bottom:8px;font-size:14px}.export-progress-bar{width:100%;height:8px;background:var(--bg-tertiary);border-radius:4px;overflow:hidden;position:relative}.export-progress-fill{height:100%;background:linear-gradient(90deg,var(--progress-gradient-start),var(--progress-gradient-end));transition:width .3s ease}.export-progress-fill.indeterminate{width:30%;position:absolute;animation:progress-slide 1.5s ease-in-out infinite}@keyframes progress-slide{0%{left:-30%}to{left:100%}}.export-progress-hint{font-size:12px;color:var(--text-muted);margin-top:16px;font-style:italic}.divider-vertical{width:1px;height:16px;background:var(--border);margin:0 4px}.page-info{font-size:11px;color:var(--text-muted)}.stats-text{margin-left:8px}.help-text{margin-left:auto;opacity:.7;font-size:10px}.debug-details{margin-top:8px;font-size:10px;font-family:monospace}.debug-details summary{cursor:pointer}.debug-details pre{margin-top:4px;padding:8px;background:var(--bg-tertiary);border-radius:4px;overflow:auto}.sort-indicator{margin-left:6px;font-size:10px}.th-content.centered{justify-content:center;padding:8px 4px}.table-info-field{margin-bottom:var(--space-8)}.table-info-label{font-size:var(--font-md);color:var(--text-muted);margin-bottom:var(--space-2)}.table-info-value{font-size:var(--font-lg)}.table-info-value.mono{font-family:monospace;background:var(--bg-secondary);padding:var(--space-4);border-radius:var(--radius-sm);word-break:break-all}.table-info-columns-list{max-height:300px;overflow:auto;border:1px solid var(--border);border-radius:var(--radius-sm)}.table-info-column-row{display:flex;padding:var(--space-4) var(--space-6);font-size:var(--font-md)}.table-info-column-row:not(:last-child){border-bottom:1px solid var(--border)}.table-info-column-name{flex:1;font-family:monospace;font-weight:600}.table-info-column-type{color:var(--text-muted);margin-left:var(--space-8)}.table-info-column-not-null{margin-left:var(--space-4);color:var(--text-muted);font-size:var(--font-sm);font-weight:600}.table-footer{flex-shrink:0;height:var(--header-height);display:flex;justify-content:space-between;align-items:center;flex-wrap:nowrap;gap:var(--space-6);padding:var(--space-4) var(--space-6);overflow:hidden}.table-footer.minimal{justify-content:flex-end}.table-footer-stats{display:flex;gap:var(--space-6);align-items:center;font-size:var(--font-sm);overflow:hidden}.table-footer-selection{color:var(--accent);background:var(--color-info-light);padding:var(--space-1) var(--space-3);border-radius:var(--radius-xs);font-weight:500;min-width:120px}.table-footer-selection.hidden{visibility:hidden;background:transparent}.pagination-controls{display:flex;gap:var(--space-3);align-items:center}.pagination-input{width:45px;padding:var(--space-1) var(--space-2);border:1px solid var(--border-light);border-radius:var(--radius-xs);background:var(--bg-primary);color:var(--text-primary);font-size:var(--font-sm);text-align:center}.pagination-input:focus{outline:none;border-color:var(--accent)}.pagination-badge{background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-4);font-size:var(--font-xs);color:var(--accent);display:flex;align-items:center;gap:var(--space-2);font-weight:500}.history-btn{background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-4);font-size:var(--font-xs);color:var(--text-muted);cursor:pointer;display:flex;align-items:center;gap:var(--space-2);transition:all var(--transition-normal)}.history-btn:hover{background:var(--bg-quaternary);color:var(--text-primary)}.history-badge{background:var(--color-error);color:#fff;border-radius:var(--radius-lg);padding:1px var(--space-2);font-size:9px;font-weight:700;min-width:var(--space-7);text-align:center}.tree-container{width:100%;height:100%;overflow:auto;outline:none;padding-bottom:var(--min-pane-height)}.tree-section{margin-bottom:var(--space-4)}.tree-section-header{display:flex;align-items:center;padding:var(--space-5) var(--space-6);cursor:pointer;background:var(--bg-secondary);border-bottom:1px solid var(--border);user-select:none}.tree-section-header:hover{background:var(--bg-hover)}.tree-section-icon{margin-right:var(--space-4);font-size:var(--font-xs);color:var(--text-muted);transition:transform var(--transition-normal);display:inline-block;width:var(--space-6)}.tree-section-icon.expanded{transform:rotate(90deg)}.tree-section-title-icon{margin-right:var(--space-5);font-size:var(--font-xl);display:inline-flex;align-items:center}.tree-section-title{font-weight:600;font-size:var(--font-md);color:var(--text-primary);text-transform:uppercase;letter-spacing:.5px}.tree-section-count{margin-left:auto;font-size:var(--font-sm);color:var(--text-muted);font-weight:500}.tree-section-action{margin-left:8px;padding:2px 8px;font-size:14px;font-weight:600;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-secondary);transition:all .15s}.tree-section-action:hover{background:var(--accent);border-color:var(--accent);color:#fff}.add-project-bar{display:flex;gap:6px;padding:8px 12px;background:var(--bg-secondary);border-bottom:1px solid var(--border)}.add-project-input{flex:1;padding:6px 10px;font-size:13px;border:1px solid var(--border);border-radius:4px;background:var(--bg-primary);color:var(--text-primary);outline:none}.add-project-input:focus{border-color:var(--accent)}.add-project-input::placeholder{color:var(--text-muted)}.add-project-btn{padding:6px 12px;font-size:13px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer;font-weight:500}.add-project-btn:disabled{background:var(--bg-tertiary);color:var(--text-muted);cursor:not-allowed}.add-project-cancel{padding:6px 10px;font-size:16px;background:var(--bg-tertiary);color:var(--text-secondary);border:1px solid var(--border);border-radius:4px;cursor:pointer}.add-project-cancel:hover{background:var(--bg-hover);color:var(--text-primary)}.tree-section-badge{margin-left:var(--space-4);padding:1px 6px;font-size:10px;font-weight:600;border-radius:4px;text-transform:uppercase;letter-spacing:.3px}.session-tables-section{background-color:#f59e0b0a}.session-tables-section .tree-section-header{background-color:#f59e0b14}.session-tables-section .tree-section-header:hover{background-color:#f59e0b1f}.tree-section-content{padding-top:var(--space-2)}.tree-empty{padding:var(--space-9) var(--space-6);text-align:center;color:var(--text-muted);font-size:var(--font-base);font-style:italic}.tree-node{display:flex;align-items:flex-start;padding:var(--space-3) var(--space-4);cursor:pointer;font-size:var(--font-md);color:var(--text-primary);user-select:none;position:relative;transition:all var(--transition-normal);border-left:2px solid transparent}.tree-node:hover{background:var(--bg-hover)}.tree-container.keyboard-navigating .tree-node:hover{background:transparent}.tree-node.selected{background:var(--bg-secondary);border-left-color:var(--accent)}.tree-node.focused{outline:2px solid var(--accent);outline-offset:-2px}.tree-node-expand{margin-right:var(--space-4);margin-left:1px;font-size:var(--font-base);color:var(--text-muted);transition:color var(--transition-normal);display:inline-block;width:var(--space-6);text-align:center;margin-top:2px;flex-shrink:0}.tree-node-icon{margin-right:var(--space-4);font-size:var(--font-lg);display:inline-flex;align-items:center;flex-shrink:0;align-self:flex-start;margin-top:2px}.tree-node-content{display:flex;flex-direction:column;flex:1;min-width:0;container-type:inline-size;container-name:tree-node}.tree-node-main{display:flex;align-items:center;min-width:0;gap:var(--space-2)}.tree-node-name-wrapper{display:flex;align-items:center;flex:1 1 auto;min-width:80px;overflow:hidden}.tree-node-badge-wrapper{display:flex;align-items:center;flex-shrink:1;overflow:hidden}.tree-node-inline-meta{font-size:var(--font-xs);color:var(--text-muted);margin-left:var(--space-2);white-space:nowrap;flex-shrink:0}.tree-node-secondary{font-size:var(--font-xs);color:var(--text-muted);margin-top:1px;padding-left:calc(var(--font-lg) + var(--space-4));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tree-node-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto;min-width:0}.tree-node-type-badge{margin-left:var(--space-4);padding:var(--space-1) var(--space-3);border-radius:var(--radius-sm);font-size:var(--font-xs);font-weight:600}.tree-node-metadata{display:none}.tree-node-badge{margin-right:var(--space-4);padding:3px var(--space-2);background:var(--bg-tertiary);border-radius:var(--radius-sm);font-size:var(--font-xs);font-weight:600;color:var(--text-secondary);display:inline-flex;align-items:center;justify-content:flex-end;gap:var(--space-1);min-width:auto;text-align:center;flex-shrink:0;white-space:nowrap;flex-wrap:nowrap}.tree-line-vertical{position:absolute;width:2px;background:var(--border);opacity:.7}.tree-line-horizontal{position:absolute;height:2px;background:var(--border);opacity:.7}.tree-node-metadata.compact{font-size:var(--font-xs);max-width:60px}.tree-node-badge .badge-icon{margin-right:var(--space-2)}.tree-node-badge.compact{min-width:auto;padding:3px var(--space-2)}.tree-node-badge.compact .badge-text{display:none}.tree-node-badge.compact .badge-icon{margin-right:0}.badge-suffix{display:inline-flex;align-items:center;margin-left:var(--space-2);cursor:help;opacity:.9}.badge-suffix:hover{opacity:1}.suffix-icon{font-size:var(--font-xs);flex-shrink:0}.suffix-label{margin-left:2px;font-size:var(--font-2xs);text-transform:uppercase;white-space:nowrap}@container tree-node (max-width: 350px){.badge-suffix.priority-0 .suffix-label{display:none}.badge-suffix.priority-0{margin-left:var(--space-1)}}@container tree-node (max-width: 300px){.badge-suffix.priority-1 .suffix-label{display:none}.badge-suffix.priority-1{margin-left:var(--space-1)}}@container tree-node (max-width: 250px){.badge-suffix.priority-2 .suffix-label{display:none}.badge-suffix.priority-2{margin-left:var(--space-1)}}@container tree-node (max-width: 200px){.tree-node-badge .badge-text{display:none}.tree-node-badge .badge-icon{margin-right:0}}.tree-node-badge.compact .suffix-label{display:none}.tree-node-badge.compact .badge-suffix{margin-left:var(--space-1)}.tree-context-menu{position:fixed;background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:0 4px 12px #00000026;z-index:var(--z-context-menu);min-width:180px;padding:var(--space-2) 0}.tree-context-separator{height:1px;background:var(--border);margin:var(--space-2) 0}.tree-context-item{padding:var(--space-4) var(--space-8);cursor:pointer;font-size:var(--font-md);color:var(--text-primary);display:flex;align-items:center;gap:var(--space-5)}.tree-context-item:hover{background:var(--bg-hover)}.tree-context-item.focused{background:var(--bg-hover);outline:2px solid var(--accent);outline-offset:-2px}.tree-context-icon{font-size:var(--font-lg);display:inline-flex;align-items:center}.error-monitor{position:fixed;right:var(--space-9);width:600px;height:450px;background:var(--bg-tertiary, #1e1e1e);border:1px solid var(--border, #444);border-radius:var(--radius-lg) var(--radius-lg) 0 0;box-shadow:0 -4px 16px #0000004d;z-index:var(--z-toast);transition:bottom var(--transition-slow);display:flex;flex-direction:column}.error-monitor.open{bottom:0}.error-monitor.closed{bottom:-400px}.error-monitor-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-4) var(--space-6);background:var(--bg-secondary, #2d2d2d);border-bottom:1px solid var(--border, #444);cursor:pointer}.error-monitor-title{font-weight:700;font-size:var(--font-md);color:var(--text-primary, #fff)}.error-monitor-stats{font-size:var(--font-sm);color:var(--text-muted, #888)}.error-monitor-stat{margin-right:var(--space-4)}.error-monitor-stat.error{color:var(--color-error)}.error-monitor-stat.warning{color:var(--color-warning)}.error-monitor-stat.info{color:var(--color-info)}.error-monitor-stat.success{color:var(--color-success)}.error-monitor-actions{display:flex;gap:var(--space-4)}.error-monitor-clear-btn{padding:var(--space-2) var(--space-4);font-size:var(--font-sm);background:var(--bg-primary, #1a1a1a);color:var(--text-primary, #fff);border:1px solid var(--border, #444);border-radius:var(--radius-sm);cursor:pointer}.error-monitor-toggle{font-size:var(--font-xl)}.error-monitor-filters{display:flex;gap:var(--space-4);padding:var(--space-4) var(--space-6);background:var(--bg-primary, #1a1a1a);border-bottom:1px solid var(--border, #444)}.error-monitor-filter-btn{padding:var(--space-2) var(--space-6);font-size:var(--font-sm);background:var(--bg-secondary, #2d2d2d);color:var(--text-primary, #fff);border:1px solid var(--border, #444);border-radius:var(--radius-sm);cursor:pointer;text-transform:capitalize}.error-monitor-filter-btn.active{background:var(--accent, #3b82f6)}.error-monitor-list{flex:1;overflow-y:auto;padding:var(--space-6)}.error-monitor-empty{text-align:center;padding:var(--space-14);color:var(--text-muted, #888);font-size:var(--font-md)}.error-monitor-entry{margin-bottom:var(--space-6);padding:var(--space-6);background:var(--bg-secondary, #2d2d2d);border-radius:var(--radius-md);font-size:var(--font-base)}.error-monitor-entry.error{border:1px solid var(--color-error)}.error-monitor-entry.warning{border:1px solid var(--color-warning)}.error-monitor-entry.info{border:1px solid var(--color-info)}.error-monitor-entry-header{display:flex;justify-content:space-between;margin-bottom:var(--space-4)}.error-monitor-entry-type{font-weight:700;color:var(--text-primary, #fff)}.error-monitor-entry-time{font-size:var(--font-xs);color:var(--text-muted, #888)}.error-monitor-entry-message{color:var(--text-secondary, #ccc);margin-bottom:var(--space-4);word-break:break-word}.error-monitor-details{margin-top:var(--space-4)}.error-monitor-details summary{cursor:pointer;font-size:var(--font-sm);color:var(--text-muted, #888)}.error-monitor-details pre{margin-top:var(--space-4);padding:var(--space-4);background:var(--bg-primary, #1a1a1a);border-radius:var(--radius-sm);font-size:var(--font-xs);overflow:auto;max-height:var(--min-pane-height)}.error-monitor-stack pre{max-height:150px;color:var(--text-muted, #888)}.overlay-backdrop{position:absolute;inset:0;background-color:var(--overlay-bg);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:var(--z-toast);backdrop-filter:blur(8px)}.overlay-icon-container{border-radius:50%;padding:var(--space-12);margin-bottom:var(--space-12);position:relative}.overlay-icon-container.accent{background-color:#3b82f61a}.overlay-icon-container.success{background-color:var(--color-success-light)}.overlay-icon-container.warning{background-color:var(--color-warning-light)}.overlay-icon-container.purple{background-color:var(--color-purple-light)}.overlay-icon-container.error{background-color:var(--color-error-light)}.overlay-spinner{width:64px;height:64px;border:4px solid var(--border);border-top:4px solid var(--accent);border-radius:50%;animation:spin .8s linear infinite}.overlay-spinner-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:var(--font-2xl);font-weight:700;color:var(--accent);font-variant-numeric:tabular-nums;min-width:40px;text-align:center}.overlay-title{font-size:var(--font-4xl);font-weight:600;color:var(--text-primary);margin-bottom:var(--space-4);letter-spacing:-.025em}.overlay-subtitle{font-size:var(--font-lg);color:var(--text-secondary);margin-bottom:var(--space-12);text-align:center;max-width:400px}.overlay-subtitle.narrow{margin-bottom:var(--space-8)}.overlay-current-file{margin-bottom:var(--space-4);font-weight:500;color:var(--color-success)}.overlay-current-file.warning{color:var(--color-warning)}.overlay-current-file.purple{color:var(--color-purple)}.overlay-hint{font-size:var(--font-lg);color:var(--text-secondary);text-align:center;max-width:400px}.overlay-hint.sm{font-size:var(--font-lg)}.overlay-subtitle.wide{max-width:500px}.overlay-cancel-hint{font-size:var(--font-md);color:var(--text-muted);margin-top:var(--space-8);font-style:italic}.overlay-stop-btn{padding:var(--space-7) var(--space-10);font-size:15px;font-weight:600;background-color:var(--color-error);color:#fff;border:none;border-radius:var(--radius-xl);cursor:pointer;display:flex;align-items:center;gap:var(--space-5);box-shadow:0 10px 25px -5px #ef444466,0 8px 10px -6px #ef44444d;transition:all var(--transition-normal)}.overlay-stop-btn:hover{filter:brightness(.9);transform:translateY(-2px);box-shadow:0 20px 35px -5px #ef444480,0 10px 15px -6px #ef444466}.server-info-modal{background:var(--bg-primary);border-radius:12px;border:1px solid var(--border);width:1100px;max-width:95vw;height:80vh;max-height:800px;min-height:500px;display:flex;flex-direction:column;overflow:hidden}.server-info-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0;position:relative;overflow:visible}[data-theme=vs-dark] .server-info-header{background:linear-gradient(135deg,var(--bg-secondary) 0%,rgba(37,99,235,.08) 50%,var(--bg-secondary) 100%);border-bottom:2px solid rgba(37,99,235,.3);box-shadow:0 2px 8px #0000004d,inset 0 1px #ffffff0d}[data-theme=vs-dark] .server-info-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,transparent 0%,#2563eb 20%,#10b981 50%,#2563eb 80%,transparent 100%);opacity:.8}[data-theme=vs] .server-info-header{background:linear-gradient(135deg,#fff,#f0f9ff,#e0f2fe);border-bottom:2px solid var(--border-light);box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f,inset 0 1px #fffc}[data-theme=vs] .server-info-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#2563eb,#10b981,#2563eb);opacity:.6}.server-info-title{font-size:16px;font-weight:600;color:var(--text-primary);margin:0}[data-theme=vs-dark] .server-info-title{background:linear-gradient(135deg,#60a5fa,#34d399);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}[data-theme=vs] .server-info-title{color:#1e3a8a;background:none;-webkit-background-clip:unset;-webkit-text-fill-color:#1e3a8a;background-clip:unset;text-shadow:none}.server-info-close-btn{background:transparent;border:none;font-size:24px;color:var(--text-muted);cursor:pointer;padding:0;line-height:1;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px}.server-info-close-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.server-info-tabs{display:flex;gap:4px;padding:0 20px;border-bottom:1px solid var(--border);flex-shrink:0}.server-info-tab{padding:10px 16px;background:transparent;color:var(--text-secondary);border:none;border-bottom:2px solid transparent;cursor:pointer;font-size:13px;font-weight:500;transition:all .2s;display:flex;align-items:center;gap:6px}.server-info-tab:hover{color:var(--text-primary);background:var(--bg-tertiary)}.server-info-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.server-info-tab-count{background:var(--bg-tertiary);padding:2px 6px;border-radius:10px;font-size:11px;min-width:20px;text-align:center}.server-info-tab.active .server-info-tab-count{background:#3b82f626;color:var(--accent)}.server-info-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.server-info-loading,.server-info-error,.server-info-empty{display:flex;align-items:center;justify-content:center;height:200px;color:var(--text-muted);font-size:14px;flex-direction:column;gap:12px}.server-info-error{color:var(--color-error)}.server-info-error button{padding:6px 12px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-primary)}.server-info-refresh-btn{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;padding:4px 8px;cursor:pointer;display:flex;align-items:center;gap:4px;color:var(--text-secondary);transition:all .2s}.server-info-refresh-btn:hover{background:var(--bg-secondary);color:var(--text-primary)}.server-info-refresh-btn:disabled{opacity:.5;cursor:wait}.extensions-tab{display:flex;flex-direction:column;height:100%;overflow:hidden}.extensions-toolbar{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border);flex-shrink:0;background:var(--bg-secondary)}.extensions-search{display:flex;align-items:center;gap:8px;background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;padding:6px 10px;flex:1;max-width:300px}.extensions-search svg{color:var(--text-muted);flex-shrink:0}.extensions-search-input{border:none;background:transparent;outline:none;font-size:13px;color:var(--text-primary);flex:1;min-width:0}.extensions-search-input::placeholder{color:var(--text-muted)}.extensions-search-clear{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:16px;padding:0;line-height:1}.extensions-search-clear:hover{color:var(--text-primary)}.extensions-filters{display:flex;gap:4px}.extensions-filter-btn{padding:5px 10px;font-size:11px;border:1px solid var(--border);background:var(--bg-primary);color:var(--text-secondary);border-radius:4px;cursor:pointer;transition:all .2s;white-space:nowrap}.extensions-filter-btn:hover{background:var(--bg-tertiary);color:var(--text-primary)}.extensions-filter-btn.active{background:var(--accent);color:#fff;border-color:var(--accent)}.extensions-table-container{flex:1;overflow:auto}.server-info-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12px}.server-info-table thead{position:sticky;top:0;z-index:10}.server-info-table th{padding:10px 12px;text-align:left;font-weight:600;color:var(--text-muted);background:var(--bg-secondary);border-bottom:1px solid var(--border);text-transform:uppercase;font-size:11px}.server-info-table td{padding:10px 12px;border-bottom:1px solid var(--border);color:var(--text-primary);background:var(--bg-primary)}.server-info-table tbody tr:hover td{background:var(--bg-tertiary)}.extensions-table .ext-name{font-family:var(--font-mono);font-weight:500;white-space:nowrap}.extensions-table .ext-description{color:var(--text-secondary);font-size:12px;max-width:300px}.extensions-table .ext-actions{white-space:nowrap}.ext-type-badge{display:inline-block;padding:2px 6px;font-size:10px;border-radius:3px;font-weight:500;text-transform:uppercase}.ext-type-badge.core{background:#8b5cf626;color:#8b5cf6}.ext-type-badge.community{background:#eab30826;color:#eab308}.ext-active-label{color:var(--text-muted);font-size:11px}.server-info-status{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:500}.server-info-status.loaded{background:#22c55e26;color:#22c55e}.server-info-status.installed{background:#3b82f626;color:#3b82f6}.server-info-status.not-installed{background:#9ca3af26;color:var(--text-muted)}.server-info-action-btn{padding:4px 10px;font-size:11px;border-radius:4px;cursor:pointer;transition:all .2s;border:none;font-weight:500}.server-info-action-btn.load{background:#22c55e26;color:#22c55e}.server-info-action-btn.load:hover:not(:disabled){background:#22c55e40}.server-info-action-btn.install{background:#3b82f626;color:#3b82f6}.server-info-action-btn.install:hover:not(:disabled){background:#3b82f640}.server-info-action-btn:disabled{opacity:.5;cursor:not-allowed}.server-info-table-container{flex:1;overflow:auto;padding:16px}.server-info-secret-type{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:500;text-transform:uppercase}.server-info-secret-type.s3{background:#ff990026;color:#f90}.server-info-secret-type.gcs{background:#4285f426;color:#4285f4}.server-info-secret-type.azure{background:#0078d426;color:#0078d4}.server-info-secret-type.bigquery{background:#4285f426;color:#4285f4}.server-info-kv-list{display:flex;flex-direction:column;gap:8px;padding:16px;overflow:auto}.server-info-kv-item{display:flex;align-items:center;gap:12px;padding:10px 12px;background:var(--bg-secondary);border-radius:6px;border:1px solid var(--border)}.server-info-kv-name{font-family:var(--font-mono);font-weight:600;color:var(--text-primary);min-width:180px;font-size:12px}.server-info-kv-value{font-family:var(--font-mono);color:var(--accent);font-size:12px;word-break:break-all;flex:1}.server-info-kv-type{color:var(--text-muted);font-size:11px;margin-left:auto}.settings-tab{display:flex;flex-direction:column;height:100%;overflow:hidden}.settings-header-tip{display:flex;align-items:center;gap:8px;padding:12px 16px;background:#2563eb14;border-bottom:1px solid var(--border);font-size:12px;color:var(--text-secondary);flex-shrink:0}.settings-list{display:flex;flex-direction:column;gap:12px;padding:16px;overflow-y:auto;flex:1}.setting-item{display:flex;flex-direction:column;gap:8px;padding:14px 16px;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border)}.setting-name-row{display:flex;align-items:center;gap:8px}.setting-name{font-family:var(--font-mono);font-weight:600;color:var(--text-primary);font-size:13px}.setting-info-icon{position:relative;display:flex;align-items:center;color:var(--text-muted);cursor:help;transition:color .2s}.setting-info-icon:hover{color:var(--accent)}.setting-tooltip-portal{padding:14px 16px;background:var(--bg-primary);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #0006;width:340px;max-width:90vw;pointer-events:none}[data-theme=vs] .setting-tooltip-portal{background:#fff;box-shadow:0 8px 24px #00000026}[data-theme=vs-dark] .setting-tooltip-portal{background:#1e1e2e;border-color:#ffffff1a}.setting-tooltip-content{font-size:12px;line-height:1.5;color:var(--text-primary)}.setting-tooltip-readonly{margin-top:8px;padding-top:8px;border-top:1px solid var(--border);font-size:11px;color:var(--text-muted);font-style:italic}.setting-readonly-badge{font-size:10px;padding:2px 6px;border-radius:4px;background:var(--bg-tertiary);color:var(--text-muted);margin-left:auto}.setting-value-row{display:flex;align-items:center}.setting-value-readonly{font-family:var(--font-mono);font-size:13px;color:var(--text-secondary);padding:8px 12px;background:var(--bg-tertiary);border-radius:6px;border:1px solid var(--border)}.setting-toggle{display:flex;align-items:center;gap:10px;cursor:pointer}.setting-toggle input{display:none}.setting-toggle-slider{position:relative;width:44px;height:24px;background:var(--bg-tertiary);border-radius:12px;border:1px solid var(--border);transition:all .2s}.setting-toggle-slider:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background:var(--text-muted);border-radius:50%;transition:all .2s}.setting-toggle input:checked+.setting-toggle-slider{background:var(--accent);border-color:var(--accent)}.setting-toggle input:checked+.setting-toggle-slider:after{left:22px;background:#fff}.setting-toggle-label{font-size:13px;color:var(--text-secondary)}.setting-select{padding:8px 32px 8px 12px;font-size:13px;font-family:var(--font-mono);background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;min-width:120px}.setting-select:hover{border-color:var(--accent)}.setting-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #2563eb33}.setting-number-input{display:flex;align-items:center;gap:8px}.setting-input{padding:8px 12px;font-size:13px;font-family:var(--font-mono);background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);width:100px}.setting-input:hover{border-color:var(--accent)}.setting-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #2563eb33}.setting-input-actions{display:flex;gap:4px}.setting-save-btn{padding:6px 12px;font-size:12px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer}.setting-save-btn:hover{opacity:.9}.setting-cancel-btn{padding:6px 8px;font-size:14px;background:var(--bg-tertiary);color:var(--text-muted);border:1px solid var(--border);border-radius:4px;cursor:pointer}.setting-cancel-btn:hover{color:var(--text-primary)}.server-settings{padding:0}.server-settings-not-available{text-align:center;padding:60px 40px;color:var(--text-muted)}.server-settings-not-available svg{color:var(--text-muted);margin-bottom:16px}.server-settings-not-available h3{color:var(--text-primary);margin:0 0 12px;font-size:18px}.server-settings-not-available p{max-width:400px;margin:0 auto;line-height:1.5}.server-settings-not-available code{background:var(--bg-tertiary);padding:2px 6px;border-radius:4px;font-size:12px}.server-settings-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:linear-gradient(135deg,#22c55e26,#06b6d41a);border-radius:10px;margin-bottom:20px;border:1px solid rgba(34,197,94,.2);position:relative;overflow:hidden}[data-theme=vs] .server-settings-header{background:linear-gradient(135deg,#15803d1a,#06b6d414);border-color:#15803d26}.server-settings-header:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#22c55e,#06b6d4,#8b5cf6);border-radius:10px 10px 0 0}.server-settings-status{display:flex;align-items:center;gap:16px}.server-settings-connected{display:flex;align-items:center;gap:8px;font-weight:600;font-size:14px;color:var(--text-primary)}.server-dot{width:8px;height:8px;border-radius:50%;background:#22c55e;box-shadow:0 0 8px #22c55e80}[data-theme=vs] .server-dot{background:#15803d;box-shadow:0 0 8px #15803d66}.server-settings-updated{font-size:11px;color:var(--text-muted)}.server-settings-refresh{display:flex;align-items:center;gap:6px;padding:6px 12px;font-size:12px;background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-secondary);cursor:pointer;transition:all .2s}.server-settings-refresh:hover{background:var(--bg-tertiary);color:var(--text-primary);border-color:var(--accent)}.server-settings-refresh:disabled{opacity:.5;cursor:not-allowed}.server-settings-tabs{display:flex;gap:4px;border-bottom:2px solid var(--border);margin-bottom:16px}.server-settings-tab{padding:10px 16px;background:transparent;border:none;border-bottom:2px solid transparent;margin-bottom:-2px;color:var(--text-muted);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s;display:flex;align-items:center;gap:8px}.server-settings-tab:hover{color:var(--text-primary);background:var(--bg-tertiary)}.server-settings-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.server-settings-tab-count{background:var(--bg-tertiary);color:var(--text-muted);padding:2px 6px;border-radius:10px;font-size:10px;font-weight:600}.server-settings-tab.active .server-settings-tab-count{background:#2563eb26;color:var(--accent)}.server-settings-content{min-height:400px;max-height:500px;overflow-y:auto}.server-settings-loading,.server-settings-error,.server-settings-empty{text-align:center;padding:40px 20px;color:var(--text-muted)}.server-settings-error{color:var(--error)}.server-settings-error button{margin-top:12px;padding:6px 16px;background:var(--accent);border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:12px}.extensions-panel{display:flex;flex-direction:column;gap:12px}.extensions-table-wrap,.secrets-panel{overflow-x:auto}.settings-panel{display:flex;flex-direction:column;gap:12px}.variables-panel{display:flex;flex-direction:column;gap:8px}.table-info-tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:var(--space-12)}.table-info-tab{padding:8px 16px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-size:13px;transition:all .2s}.table-info-tab:hover{color:var(--text-primary)}.table-info-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.table-info-tab-panel{min-height:200px}.table-info-index-row,.table-info-constraint-row{padding:10px 12px;border:1px solid var(--border);border-radius:6px;margin-bottom:8px;background:var(--bg-tertiary)}.table-info-index-name,.table-info-constraint-type{font-family:var(--font-mono);font-weight:600;color:var(--text-primary);margin-bottom:4px;display:flex;align-items:center;gap:8px}.table-info-index-badge{display:inline-block;padding:2px 6px;font-size:10px;border-radius:4px;font-weight:500}.table-info-index-badge.primary{background:#8b5cf626;color:#8b5cf6}.table-info-index-badge.unique{background:#22c55e26;color:#22c55e}.table-info-constraint-columns{font-family:var(--font-mono);font-size:12px;color:var(--text-muted)}.table-info-sql{margin-top:8px;padding:8px;background:var(--bg-secondary);border-radius:4px;font-family:var(--font-mono);font-size:11px;white-space:pre-wrap;word-break:break-all;max-height:80px;overflow:auto;color:var(--text-secondary)}.table-info-content{flex:1;overflow-y:auto;padding:var(--space-16)}.table-info-table{width:100%;border-collapse:collapse;font-size:12px}.table-info-table th,.table-info-table td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}.table-info-table th{font-weight:600;color:var(--text-secondary);font-size:11px;text-transform:uppercase;background:var(--bg-secondary)}.table-info-table tr:hover td{background:var(--bg-hover)}.table-info-badge{display:inline-block;padding:2px 8px;font-size:10px;border-radius:4px;font-weight:500;background:var(--bg-tertiary);color:var(--text-secondary)}.table-info-badge.primary,.table-info-badge.primary-key{background:#8b5cf626;color:#8b5cf6}.table-info-badge.unique{background:#22c55e26;color:#22c55e}.table-info-badge.foreign-key{background:#3b82f626;color:#3b82f6}.table-info-badge.check{background:#eab30826;color:#eab308}.table-info-badge.not-null{background:#ef444426;color:#ef4444}.table-info-loading,.table-info-error,.table-info-empty{padding:var(--space-24);text-align:center;color:var(--text-muted);font-size:13px}.table-info-error{color:var(--error)}
@@ -1 +0,0 @@
1
- import{a as l,b as h,c as u}from"./oauth-constants-m7PlKcMR.js";const y="bigquery_oauth_response",_="bigquery_oauth_error",n=new URLSearchParams(window.location.search),s=n.get("code"),o=n.get("state"),d=n.get("error"),g=n.get("error_description"),p=document.getElementById("spinner"),r=document.getElementById("status"),a=(e,t)=>{r&&(r.textContent=e,t&&(r.className=t)),p&&t&&(p.style.display="none")},c=e=>{try{localStorage.setItem(h,e)}catch{}try{localStorage.setItem(y,JSON.stringify({type:"oauth_code",code:JSON.parse(e).code,state:JSON.parse(e).state,timestamp:Date.now()}))}catch{}},m=e=>{try{localStorage.setItem(u,e)}catch{}try{localStorage.setItem(_,e)}catch{}};s&&o&&c(JSON.stringify({code:s,state:o,timestamp:Date.now()}));if(d){const e=g||d;if(a(`Authentication failed: ${e}`,"error"),m(e),typeof BroadcastChannel<"u")try{const t=new BroadcastChannel(l);t.postMessage({type:"oauth_error",error:e,state:o}),setTimeout(()=>t.close(),1e3)}catch{}if(window.opener)try{window.opener.postMessage({type:"oauth_error",error:e,state:o},window.location.origin)}catch{}setTimeout(()=>window.close(),3e3)}else if(s&&o){a("Authentication successful. Closing…","success");const e=JSON.stringify({code:s,state:o,timestamp:Date.now()});if(c(e),typeof BroadcastChannel<"u")try{const i=new BroadcastChannel(l);i.postMessage({type:"oauth_code",code:s,state:o}),setTimeout(()=>i.close(),1e3)}catch{}if(window.opener)try{window.opener.postMessage({type:"oauth_code",code:s,state:o},window.location.origin)}catch{}let t=0;const w=setInterval(()=>{t++,c(e),t>=6&&(clearInterval(w),window.close())},500)}else a("Missing authorization code. Please try again.","error"),setTimeout(()=>window.close(),3e3);
@@ -1 +0,0 @@
1
- (function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))s(e);new MutationObserver(e=>{for(const t of e)if(t.type==="childList")for(const r of t.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?t.credentials="include":e.crossOrigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function s(e){if(e.ep)return;e.ep=!0;const t=n(e);fetch(e.href,t)}})();const i="snowflake_oauth_response",u="snowflake_oauth_error",a="snowflake-auto-connect",f="snowflake_oauth";export{a as S,f as a,i as b,u as c};
@@ -1 +0,0 @@
1
- function r(e){return new Worker(""+new URL("snowflake-parse.worker-D5M-j54J.js",import.meta.url).href,{type:"module",name:e?.name})}export{r as default};