.graph-canvas{width:100%;height:100vh;position:relative;overflow:hidden}.graph-canvas.with-toolbar{height:calc(100vh - 48px);margin-top:48px}.graph-canvas .tl-container{background-color:#fafafa}.graph-canvas .tl-canvas{background-image:linear-gradient(to right,#e5e7eb 1px,transparent 1px),linear-gradient(to bottom,#e5e7eb 1px,transparent 1px);background-size:20px 20px;background-position:center center}.graph-canvas .tl-toolbar,.graph-canvas .tl-menu-zone,.graph-canvas .tl-navigation-panel{display:none!important}.graph-canvas .tl-shapes{z-index:1}.graph-canvas .tl-selection__fg{stroke:#3b82f6;stroke-width:1.5px}.graph-canvas .tl-selection__bg{fill:#3b82f61a}.graph-canvas:focus-within{outline:none}.graph-canvas.loading{opacity:.7;pointer-events:none}.graph-canvas.loading:after{content:"";position:absolute;top:50%;left:50%;width:40px;height:40px;margin:-20px 0 0 -20px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.graph-toolbar{position:fixed;top:0;left:0;right:0;height:48px;background-color:#fff;border-bottom:1px solid #e5e7eb;display:flex;align-items:center;padding:0 16px;gap:16px;z-index:1000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;box-shadow:0 1px 3px #0000000d}.toolbar-button-group{display:flex;align-items:center;gap:4px}.toolbar-separator{width:1px;height:24px;background-color:#e5e7eb;margin:0 8px}.toolbar-button{display:flex;align-items:center;justify-content:center;gap:6px;padding:6px 12px;border:1px solid #d1d5db;border-radius:6px;background-color:#fff;color:#374151;font-size:13px;font-weight:500;cursor:pointer;transition:all .15s ease;white-space:nowrap}.toolbar-button:hover:not(:disabled){background-color:#f9fafb;border-color:#9ca3af}.toolbar-button:active:not(:disabled){background-color:#f3f4f6}.toolbar-button:disabled{opacity:.5;cursor:not-allowed}.node-type-button{min-width:90px}.node-type-icon{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:4px;background-color:#f3f4f6;font-size:11px;font-weight:600;color:#6b7280}.node-type-label{font-size:12px}.toolbar-button.action-button{padding:6px 14px}.toolbar-button.run-button{background-color:#3b82f6;border-color:#3b82f6;color:#fff}.toolbar-button.run-button:hover:not(:disabled){background-color:#2563eb;border-color:#2563eb}.toolbar-button.run-button.running{background-color:#9ca3af;border-color:#9ca3af;cursor:wait}.toolbar-button.settings-button{padding:6px 10px}.settings-icon{width:18px;height:18px}.file-input-hidden{display:none}.toolbar-icon{font-size:14px}.toolbar-spacer{flex:1}.toolbar-status{display:flex;align-items:center;gap:6px;font-size:12px;color:#6b7280}.status-dot{width:8px;height:8px;border-radius:50%;background-color:#22c55e}.status-dot.running{background-color:#3b82f6;animation:pulse 1.5s infinite}.status-dot.error{background-color:#ef4444}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.toolbar-dropdown{position:relative}.toolbar-dropdown-menu{position:absolute;top:100%;left:0;margin-top:4px;padding:4px;background-color:#fff;border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 4px 12px #0000001a;min-width:160px;z-index:1001}.toolbar-dropdown-item{display:flex;align-items:center;gap:8px;padding:8px 12px;border:none;border-radius:4px;background:none;width:100%;text-align:left;font-size:13px;color:#374151;cursor:pointer}.toolbar-dropdown-item:hover{background-color:#f3f4f6}.property-panel{position:fixed;right:0;top:0;bottom:0;width:320px;background-color:#fff;border-left:1px solid #e5e7eb;display:flex;flex-direction:column;z-index:100;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;color:#374151;box-shadow:-2px 0 8px #0000000d}.property-panel-empty{opacity:.8}.property-panel-header{padding:16px 20px;border-bottom:1px solid #e5e7eb;background-color:#f9fafb;display:flex;justify-content:space-between;align-items:center}.property-panel-header h3{margin:0;font-size:14px;font-weight:600;color:#111827}.property-panel-node-id{font-size:11px;color:#9ca3af;font-family:ui-monospace,monospace}.property-panel-content{flex:1;overflow-y:auto;padding:16px 20px}.property-panel-placeholder{color:#9ca3af;text-align:center;padding:40px 20px;font-style:italic}.property-section{display:flex;flex-direction:column;gap:20px}.property-group{display:flex;flex-direction:column;gap:6px}.property-label{font-size:12px;font-weight:500;color:#374151}.property-hint{font-size:11px;color:#9ca3af;line-height:1.4}.property-input{padding:8px 12px;border:1px solid #d1d5db;border-radius:6px;font-size:13px;color:#1f2937;background-color:#fff;transition:border-color .15s ease,box-shadow .15s ease}.property-input:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.property-input::placeholder{color:#9ca3af}.property-input-small{flex:1;padding:6px 8px;font-size:12px}.property-textarea{padding:10px 12px;border:1px solid #d1d5db;border-radius:6px;font-size:13px;color:#1f2937;background-color:#fff;resize:vertical;min-height:80px;line-height:1.5;transition:border-color .15s ease,box-shadow .15s ease}.property-textarea:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.property-textarea::placeholder{color:#9ca3af}.property-textarea.property-code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.5;background-color:#1e1e1e;color:#d4d4d4;border-color:#3f3f46}.property-textarea.property-code:focus{border-color:#60a5fa}.property-select{padding:8px 32px 8px 12px;border:1px solid #d1d5db;border-radius:6px;font-size:13px;color:#1f2937;background-color:#fff;cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;background-size:16px}.property-select:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.property-slider{width:100%;height:6px;border-radius:3px;background:#e5e7eb;appearance:none;cursor:pointer}.property-slider::-webkit-slider-thumb{appearance:none;width:16px;height:16px;border-radius:50%;background:#3b82f6;cursor:pointer;border:2px solid #ffffff;box-shadow:0 1px 3px #0003}.property-slider::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:#3b82f6;cursor:pointer;border:2px solid #ffffff;box-shadow:0 1px 3px #0003}.property-slider-labels{display:flex;justify-content:space-between;font-size:10px;color:#9ca3af;margin-top:4px}.property-mapping-list{display:flex;flex-direction:column;gap:8px}.property-mapping-item,.property-mapping-add{display:flex;align-items:center;gap:8px}.property-mapping-arrow{color:#9ca3af;font-size:12px;flex-shrink:0}.property-btn-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border:1px solid #d1d5db;border-radius:4px;background-color:#fff;color:#6b7280;cursor:pointer;font-size:14px;transition:all .15s ease}.property-btn-icon:hover{background-color:#fef2f2;border-color:#fca5a5;color:#ef4444}.property-btn-small{padding:6px 12px;border:1px solid #d1d5db;border-radius:4px;background-color:#fff;color:#374151;cursor:pointer;font-size:12px;font-weight:500;transition:all .15s ease}.property-btn-small:hover{background-color:#f3f4f6;border-color:#9ca3af}.property-collapsible{border:1px solid #e5e7eb;border-radius:6px;overflow:hidden}.property-collapsible-header{display:flex;justify-content:space-between;align-items:center;width:100%;padding:10px 12px;border:none;background-color:#f9fafb;cursor:pointer;font-size:12px;font-weight:500;color:#374151;transition:background-color .15s ease}.property-collapsible-header:hover{background-color:#f3f4f6}.property-collapsible-icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:14px;color:#6b7280}.property-collapsible-content{padding:16px 12px;display:flex;flex-direction:column;gap:16px;border-top:1px solid #e5e7eb}.property-output-preview{background-color:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;padding:12px;max-height:200px;overflow-y:auto}.property-output-value{margin:0;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word}.property-output-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.property-output-markdown{font-family:inherit}.property-output-empty{color:#9ca3af;font-style:italic;font-size:12px}.property-panel-content::-webkit-scrollbar,.property-output-preview::-webkit-scrollbar{width:6px}.property-panel-content::-webkit-scrollbar-track,.property-output-preview::-webkit-scrollbar-track{background:transparent}.property-panel-content::-webkit-scrollbar-thumb,.property-output-preview::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.property-panel-content::-webkit-scrollbar-thumb:hover,.property-output-preview::-webkit-scrollbar-thumb:hover{background-color:#9ca3af}@media(max-width:1200px){.property-panel{width:280px}}.node-container{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;transition:box-shadow .15s ease}.node-container:hover{box-shadow:0 4px 6px #0000001a,0 2px 4px #0000000f}.port{cursor:crosshair;transition:transform .1s ease}.port:hover{transform:scale(1.3)}.port-input{background-color:#9ca3af}.port-output{background-color:#3b82f6}.node-container[data-state=idle]{border-color:#9ca3af}.node-container[data-state=running]{border-color:#3b82f6;animation:pulse-border 1.5s infinite}.node-container[data-state=completed]{border-color:#22c55e}.node-container[data-state=error]{border-color:#ef4444}@keyframes pulse-border{0%,to{box-shadow:0 0 #3b82f666}50%{box-shadow:0 0 0 4px #3b82f600}}.text-input-node textarea{scrollbar-width:thin;scrollbar-color:#d1d5db transparent}.text-input-node textarea::-webkit-scrollbar{width:6px}.text-input-node textarea::-webkit-scrollbar-track{background:transparent}.text-input-node textarea::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.output-node pre{scrollbar-width:thin;scrollbar-color:#d1d5db transparent}.output-node pre::-webkit-scrollbar{width:6px}.output-node pre::-webkit-scrollbar-track{background:transparent}.output-node pre::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.text-input-node>div:first-child{background-color:#f9fafb}.output-node>div:first-child{background-color:#fef3c7}*,*:before,*:after{box-sizing:border-box}*{margin:0}html,body{height:100%}body{line-height:1.5;-webkit-font-smoothing:antialiased}img,picture,video,canvas,svg{display:block;max-width:100%}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}:root{--gray-50: #f9fafb;--gray-100: #f3f4f6;--gray-200: #e5e7eb;--gray-300: #d1d5db;--gray-400: #9ca3af;--gray-500: #6b7280;--gray-600: #4b5563;--gray-700: #374151;--gray-800: #1f2937;--gray-900: #111827;--primary-50: #eff6ff;--primary-100: #dbeafe;--primary-200: #bfdbfe;--primary-300: #93c5fd;--primary-400: #60a5fa;--primary-500: #3b82f6;--primary-600: #2563eb;--primary-700: #1d4ed8;--success-500: #22c55e;--success-600: #16a34a;--error-50: #fef2f2;--error-500: #ef4444;--error-600: #dc2626;--warning-100: #fef3c7;--warning-500: #f59e0b;--toolbar-height: 48px;--panel-width: 320px;--event-log-height: 200px;--event-log-collapsed-height: 36px;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;--spacing-1: 4px;--spacing-2: 8px;--spacing-3: 12px;--spacing-4: 16px;--spacing-5: 20px;--spacing-6: 24px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .05);--shadow-md: 0 1px 3px rgba(0, 0, 0, .1), 0 1px 2px rgba(0, 0, 0, .06);--shadow-lg: 0 4px 12px rgba(0, 0, 0, .1);--z-canvas: 1;--z-panel: 100;--z-event-log: 150;--z-toolbar: 1000;--z-modal: 2000}body{font-family:var(--font-sans);color:var(--gray-700);background-color:var(--gray-50);overflow:hidden}.app{width:100vw;height:100vh;display:flex;flex-direction:column;overflow:hidden}.main-layout{flex:1;display:flex;position:relative;overflow:hidden}.main-layout .graph-canvas{width:calc(100% - var(--panel-width))}.main-layout .property-panel{top:var(--toolbar-height)}.event-log-panel{background-color:#fff;border:1px solid var(--gray-200);z-index:var(--z-event-log);font-family:var(--font-sans);display:flex;flex-direction:column}.event-log-panel-bottom{position:fixed;bottom:0;left:0;right:var(--panel-width);height:var(--event-log-height);border-top:1px solid var(--gray-200)}.event-log-panel-right{position:fixed;top:var(--toolbar-height);right:0;bottom:0;width:var(--panel-width);border-left:1px solid var(--gray-200)}.event-log-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;background-color:var(--gray-50);border-bottom:1px solid var(--gray-200)}.event-log-header h3{margin:0;font-size:12px;font-weight:600;color:var(--gray-700)}.event-log-actions{display:flex;align-items:center;gap:8px}.event-log-autoscroll{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--gray-600);cursor:pointer}.event-log-autoscroll input{margin:0}.event-log-clear-btn,.event-log-close-btn{padding:2px 8px;border:1px solid var(--gray-300);border-radius:var(--radius-sm);background-color:#fff;font-size:11px;color:var(--gray-600);cursor:pointer}.event-log-clear-btn:hover,.event-log-close-btn:hover{background-color:var(--gray-50);border-color:var(--gray-400)}.event-log-close-btn{font-size:14px;padding:0 6px}.event-log-filters{display:flex;flex-wrap:wrap;gap:4px;padding:8px 12px;border-bottom:1px solid var(--gray-200);background-color:var(--gray-50)}.event-filter-btn{padding:2px 8px;border:1px solid var(--gray-300);border-radius:12px;background-color:#fff;font-size:10px;color:var(--gray-600);cursor:pointer;transition:all .15s ease}.event-filter-btn:hover{border-color:var(--filter-color)}.event-filter-btn.active{background-color:var(--filter-color);border-color:var(--filter-color);color:#fff}.event-log-list{flex:1;overflow-y:auto;padding:8px}.event-log-empty{color:var(--gray-400);font-size:12px;padding:24px 16px;text-align:center}.event-log-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);font-size:11px;border-left:3px solid var(--event-color);background-color:var(--gray-50);margin-bottom:4px}.event-timestamp{font-family:var(--font-mono);font-size:10px;color:var(--gray-500);flex-shrink:0}.event-type-badge{padding:1px 6px;border-radius:8px;background-color:var(--event-color);color:#fff;font-size:9px;font-weight:500;flex-shrink:0}.event-node-name{font-weight:500;color:var(--gray-700);flex-shrink:0}.event-details{color:var(--gray-600);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-log-list::-webkit-scrollbar{width:6px}.event-log-list::-webkit-scrollbar-track{background:transparent}.event-log-list::-webkit-scrollbar-thumb{background-color:var(--gray-300);border-radius:3px}.event-log-list::-webkit-scrollbar-thumb:hover{background-color:var(--gray-400)}.settings-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:var(--z-modal)}.settings-modal{width:100%;max-width:480px;background-color:#fff;border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden}.settings-modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--gray-200)}.settings-modal-header h2{margin:0;font-size:16px;font-weight:600;color:var(--gray-900)}.settings-modal-close{width:32px;height:32px;display:flex;align-items:center;justify-content:center;border:none;background:none;font-size:20px;color:var(--gray-400);cursor:pointer;border-radius:var(--radius-sm)}.settings-modal-close:hover{background-color:var(--gray-100);color:var(--gray-600)}.settings-modal-content{padding:20px}.settings-section{display:flex;flex-direction:column;gap:16px}.settings-section h3{margin:0;font-size:14px;font-weight:600;color:var(--gray-900)}.settings-field{display:flex;flex-direction:column;gap:6px}.settings-field label{font-size:13px;font-weight:500;color:var(--gray-700)}.settings-input-group{display:flex;gap:8px}.settings-input{flex:1;padding:8px 12px;border:1px solid var(--gray-300);border-radius:var(--radius-md);font-size:13px;color:var(--gray-800)}.settings-input:focus{outline:none;border-color:var(--primary-500);box-shadow:0 0 0 3px #3b82f61a}.settings-toggle-visibility{padding:8px 12px;border:1px solid var(--gray-300);border-radius:var(--radius-md);background-color:var(--gray-50);font-size:12px;color:var(--gray-600);cursor:pointer}.settings-toggle-visibility:hover{background-color:var(--gray-100)}.settings-hint{font-size:12px;color:var(--gray-500);margin:0}.settings-hint a{color:var(--primary-600);text-decoration:none}.settings-hint a:hover{text-decoration:underline}.settings-modal-footer{display:flex;justify-content:flex-end;gap:8px;padding:16px 20px;border-top:1px solid var(--gray-200);background-color:var(--gray-50)}.settings-btn{padding:8px 16px;border-radius:var(--radius-md);font-size:13px;font-weight:500;cursor:pointer;transition:all .15s ease}.settings-btn-secondary{border:1px solid var(--gray-300);background-color:#fff;color:var(--gray-700)}.settings-btn-secondary:hover{background-color:var(--gray-50)}.settings-btn-primary{border:1px solid var(--primary-500);background-color:var(--primary-500);color:#fff}.settings-btn-primary:hover{background-color:var(--primary-600);border-color:var(--primary-600)}.settings-test-connection{display:flex;align-items:center;gap:12px;margin-top:8px}.settings-test-btn{padding:6px 12px;border:1px solid var(--gray-300);border-radius:var(--radius-md);background-color:var(--gray-50);font-size:12px;font-weight:500;color:var(--gray-700);cursor:pointer;transition:all .15s ease}.settings-test-btn:hover:not(:disabled){background-color:var(--gray-100);border-color:var(--gray-400)}.settings-test-btn:disabled{opacity:.6;cursor:not-allowed}.settings-test-btn.testing{color:var(--primary-600)}.settings-test-message{font-size:12px}.settings-test-message.success{color:var(--success-500)}.settings-test-message.error{color:var(--error-500)}.settings-test-message.testing{color:var(--gray-500)}@media(max-width:1200px){:root{--panel-width: 280px}}@media(max-width:768px){:root{--panel-width: 0px}.main-layout .property-panel{display:none}.event-log-panel{right:0}}
