*{box-sizing:border-box}body{margin:0;font:14px/1.55 "Segoe UI","Microsoft YaHei",sans-serif;color:#23334b;background:#f6f8fc}button,input,select{font:inherit}button,a{touch-action:manipulation}button{cursor:pointer;border:1px solid #dce3ee;background:white;border-radius:7px;padding:7px 12px;color:#334b6b}button:hover:not(:disabled){border-color:#628cfa;background:#f3f6ff}button:disabled{cursor:not-allowed;opacity:.5}a{color:#3868cf;text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,p{margin-top:0}h1{font-size:24px;margin-bottom:6px}h2{font-size:17px}h3{font-size:15px}small,.muted{color:#8290a7;font-size:12px}.navigation{width:174px;background:#101e34;color:#d8e4f5;position:fixed;inset:0 auto 0 0;padding:24px 14px;display:flex;flex-direction:column;gap:26px}.navigation a{color:#cbdcf2;padding:11px 10px;border-radius:8px;font-size:13px}.navigation .brand{font-size:17px;font-weight:700;padding:5px 0;color:white;white-space:nowrap}.navigation nav{display:grid;gap:9px}.navigation nav a.active{background:#273f62;color:white;box-shadow:inset 3px 0 #78a1ff}.navigation>small{padding-left:10px}.nav-bottom{margin-top:auto;padding:10px;font-size:12px}.nav-bottom small{display:block;padding:5px 0}.phase,.badge{display:inline-block;border:1px solid #dce5f1;border-radius:5px;padding:2px 7px;font-size:11px;font-weight:400;white-space:nowrap}.phase{color:#b3c8e7;border-color:#39506e;margin-top:8px}main{margin-left:174px;height:100vh;display:flex;flex-direction:column;min-width:0}.top{height:63px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;background:#fff;border-bottom:1px solid #e0e6ef;padding:0 25px}.top strong{font-size:17px}.connection{font-size:11px;color:#348672;background:#edf8f2;border-radius:20px;padding:4px 10px;margin-left:14px}#account{font-size:12px;color:#7d8ba1}#content{flex:1;overflow:auto;position:relative;min-height:0}footer{height:29px;flex-shrink:0;border-top:1px solid #e4eaf3;background:white;display:flex;justify-content:space-between;padding:4px 20px;font-size:11px;color:#8190a6}#notice{background:#fff1ea;border:1px solid #ffcda8;padding:12px 24px;color:#a8491c}.page{padding:27px 30px;max-width:1550px;margin:auto}.page-intro{display:flex;align-items:center;justify-content:space-between;margin-bottom:25px;gap:20px}.page-intro p{color:#79879d;margin:0;font-size:13px}.section-title{display:flex;justify-content:space-between;align-items:center;margin:24px 0 14px}.section-title small{font-weight:400;margin-left:12px}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(285px,1fr));gap:16px}.workflow-card,.atom-card{border:1px solid #e0e7f0;border-radius:12px;padding:20px;background:white;text-align:left;min-width:0;box-shadow:0 3px 12px #152a4a03}.workflow-card{cursor:pointer;min-height:192px;display:flex;flex-direction:column;gap:10px;transition:transform .15s}.workflow-card:hover{transform:translateY(-2px);box-shadow:0 7px 22px #223b6610}.card-heading{display:flex;align-items:center;gap:12px}.icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:11px;background:#eaf0ff;color:#526fd6;font-weight:700;font-size:17px;flex-shrink:0}.workflow-card h3,.atom-card h3{margin:0}.workflow-card p,.atom-card p{color:#7d8ba1;font-size:12px;margin:0}.card-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;color:#8291a8;font-size:11px;margin-top:auto}.journey{font-size:11px;color:#667d9b;padding:9px 0;border-top:1px solid #f0f3f8;white-space:normal}.search-row{display:flex;gap:10px;margin-bottom:18px}.search-row input{width:330px;max-width:65%;padding:9px 12px;border:1px solid #dce4ef;border-radius:8px;background:white}.search-row select,.toolbar select{max-width:280px;border:1px solid #dce4ef;border-radius:6px;padding:6px;color:#45617f;background:white}.atom-card{display:flex;gap:14px;cursor:pointer;min-height:142px}.atom-card .atom-body{min-width:0;flex:1}.atom-card p{margin:9px 0}.atom-card .badge{color:#5f7899;margin-right:5px}.empty{padding:50px;color:#8290a7;text-align:center}.info{background:#eff5ff;border:1px solid #e2eafb;border-radius:8px;padding:12px;color:#6b80a0;font-size:12px}.warning{background:#fff7e7;color:#996a20;border-color:#f3dfac}.toolbar{display:flex;gap:10px;align-items:center;padding:12px 18px;border-bottom:1px solid #e1e7f0;background:white;flex-wrap:wrap;min-height:66px}.toolbar .title{min-width:180px;margin-right:auto}.toolbar .title strong{display:block}.toolbar .title small{display:block;max-width:380px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.designer-page{height:100%;display:flex;flex-direction:column}.designer{position:relative;flex:1;min-height:250px;display:flex;overflow:hidden}.canvas-shell{min-width:0;flex:1;position:relative;display:flex;flex-direction:column;background:#eef3fa}.canvas-caption{padding:10px 16px;display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:11px;color:#748aa6}.canvas-viewport{overflow:hidden;flex:1;min-height:0;position:relative;background-image:radial-gradient(#c4d2e4 .9px,transparent .9px);background-size:18px 18px;touch-action:none;cursor:grab}.canvas-viewport:active{cursor:grabbing}.canvas{position:absolute;transform-origin:0 0;width:1080px;height:600px}.edges{position:absolute;inset:0;overflow:visible;width:100%;height:100%;pointer-events:none}.node{position:absolute;width:218px;height:96px;border:1px solid #c6d6ec;border-radius:10px;background:white;box-shadow:0 3px 9px #24477609;text-align:left;padding:0;overflow:visible;transition:box-shadow .1s}.node:hover{box-shadow:0 3px 18px #426cca24}.node.selected{outline:2px solid #5380ee;outline-offset:1px}.node-heading{display:flex;align-items:center;gap:7px;height:34px;padding:0 11px;background:#f1f5fe;border-radius:9px 9px 0 0;font-size:12px;font-weight:600;overflow:hidden}.node-heading span:last-child{margin-left:auto;font-size:10px;color:#8fa4bd}.node-meta{font-size:10px;padding:6px 11px;color:#7790b1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.node-bottom{display:flex;justify-content:space-between;font-size:10px;padding:0 11px;color:#99aac0}.node.system .node-heading{background:#eef7f5}.node.completed{border-color:#65b39b}.node.failed,.node.unknown{border-color:#dd7b72}.node.failed .node-heading,.node.unknown .node-heading{background:#fff0ed}.node.waiting{border-color:#d5ac58}.node.recorded{border-style:dashed}.port{width:8px;height:8px;border:1.5px solid #8499c5;background:white;border-radius:50%;position:absolute;top:46px}.port.in{left:-5px}.port.out{right:-5px}.canvas-controls{padding:8px 12px;background:#ffffffef;display:flex;align-items:center;gap:7px;border-top:1px solid #e0e6ef;flex-wrap:wrap}.canvas-controls button{padding:4px 9px;font-size:12px}.canvas-controls select{border:0;background:transparent;font-size:12px;color:#527092;max-width:120px}.canvas-controls label{margin-left:auto;font-size:11px;color:#7a8fa8}.canvas-note{padding:7px 14px;background:#f8faff;font-size:11px;color:#8b9db6}.inspector-rail{width:34px;background:white;border-left:1px solid #e0e7ef;display:flex;flex-direction:column;align-items:center;padding-top:14px;color:#8d9eb6}.inspector-rail button{border:0;padding:3px 5px}.inspector-rail span{writing-mode:vertical-rl;margin-top:12px;font-size:11px;letter-spacing:3px}.inspector{width:344px;flex-shrink:0;border-left:1px solid #e0e7ef;background:white;display:flex;flex-direction:column}.inspector header{padding:17px;display:flex;justify-content:space-between;border-bottom:1px solid #e5ebf4}.inspector h2{font-size:15px;margin:3px 0}.inspector header button{border:0;padding:2px 8px;align-self:start;font-size:18px}.inspector-body{overflow:auto;padding:17px;font-size:12px;flex:1}.inspector h3{font-size:12px;margin:20px 0 9px;color:#425c7e}.inspector pre{background:#f6f8fc;white-space:pre-wrap;word-break:break-all;padding:10px;border-radius:6px;font-size:11px;color:#69809e}.kv{display:grid;grid-template-columns:80px 1fr;gap:7px 10px;font-size:12px}.kv dt{color:#8c9db3}.kv dd{margin:0;overflow-wrap:anywhere}.port-row,.mapping{border:1px solid #e6ebf2;border-radius:6px;padding:9px;margin:7px 0;overflow-wrap:anywhere}.port-row small{float:right}.palette{width:224px;flex-shrink:0;background:white;border-right:1px solid #dfe6f1;padding:15px;overflow:auto}.palette input{width:100%;padding:8px;border:1px solid #dbe4ee;border-radius:6px}.palette button{display:block;width:100%;font-size:12px;padding:10px;text-align:left;margin-top:8px}.palette button small{display:block}.trace-panel{max-height:195px;overflow:auto;background:white;border-top:1px solid #dce4ef;padding:12px 17px;font-size:12px}.trace-head{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px}.event{display:flex;align-items:center;gap:10px;border-top:1px solid #f0f3f8;padding:5px 0;color:#7488a2}.event button{padding:2px 6px;font-size:11px;min-width:115px;text-align:left}.event .error{color:#bb6559}.table-wrap{border:1px solid #e0e7f0;background:white;border-radius:10px;overflow:auto}table{border-collapse:collapse;width:100%;font-size:12px}th,td{text-align:left;padding:13px 15px;border-bottom:1px solid #ecf0f6}th{font-size:11px;color:#8295af;background:#f9fbfe;font-weight:400}td small{display:block}.run-open{white-space:nowrap}.pill{font-size:11px;background:#edf3fd;color:#5877aa;padding:3px 7px;border-radius:5px;white-space:nowrap}.pill.failed,.pill.unknown{background:#fff0ed;color:#bb675d}.modal-backdrop{position:fixed;inset:0;background:#162c4e40;z-index:20;display:flex;justify-content:flex-end}.atom-detail{width:530px;max-width:95vw;background:white;height:100%;overflow:auto;padding:25px;box-shadow:-8px 0 40px #172f5520}.atom-detail>header{display:flex;align-items:center;justify-content:space-between;margin-bottom:22px}.atom-detail>header button{border:0;font-size:20px}.atom-detail .reference{display:block;padding:9px;border-bottom:1px solid #edf1f7;font-size:12px}.atom-detail pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;background:#f7f9fc;padding:13px}.atom-detail h3{margin-top:23px}.version-list{display:flex;flex-wrap:wrap;gap:7px;margin:16px 0}.version-list button.active{background:#edf3ff;border-color:#80a1f5}.locate-box{max-width:170px;padding:4px 7px;border:1px solid #dce4ef;border-radius:5px;font-size:12px}.source-note{font-size:11px;padding:6px 17px;color:#7e91ac;background:#fbfcff;border-bottom:1px solid #e6ecf4}.issue{padding:8px 0;border-bottom:1px solid #e7ecf4;font-size:12px}.issue button{font-size:11px;padding:2px 6px}.page-actions{display:flex;gap:10px}.flow-select{max-width:210px!important}.node .state{color:#4a9580}.node.failed .state{color:#be6659}@media(max-width:1050px){.navigation{width:150px;padding:20px 10px}.navigation .brand{font-size:15px}main{margin-left:150px}.inspector{position:absolute;right:0;top:0;bottom:0;z-index:5;box-shadow:-8px 0 24px #16345616}.toolbar{gap:6px;padding:8px 12px}.toolbar .title small{max-width:240px}.page{padding:22px}.palette{position:absolute;left:0;top:0;bottom:0;z-index:6}.cards{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}}
[hidden]{display:none!important}

.spaced{margin-top:20px}

.primary,.primary-link{background:#287b69!important;color:white!important;border-color:#287b69!important}.node-edit-panel{border-bottom:1px solid #e1e7f0;padding-bottom:18px;margin-bottom:18px}.inspector label,.atom-detail label{display:block;font-size:12px;color:#637b9c;margin:12px 0}.inspector input,.inspector textarea,.atom-detail select{display:block;width:100%;margin-top:6px;border:1px solid #d3dfee;border-radius:6px;padding:8px;color:#2d4769;background:white;resize:vertical;font:12px/1.6 inherit}.inspector textarea{font-family:inherit}.node-edit-actions,.file-actions{display:flex;gap:8px;margin:12px 0;flex-wrap:wrap}.danger{color:#ad584e!important}.editable-mapping{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:7px 0;font-size:11px;border-bottom:1px solid #edf1f6;overflow-wrap:anywhere}.editable-mapping button{padding:1px 7px;flex-shrink:0}.upload-label input{font-size:11px}.trial-result{padding:12px 18px;background:white;border-top:1px solid #dce4f0;max-height:220px;overflow:auto;flex-shrink:0}.trial-result-heading{display:flex;justify-content:space-between;align-items:center;gap:12px}.trial-result-heading small{display:block;margin-top:4px}.trial-result p{font-size:12px;margin:7px 0}.trial-actions{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin:8px 0}.trial-actions a{padding:5px 10px;border:1px solid #dce4ef;border-radius:6px;font-size:12px}.trial-actions button{font-size:12px;padding:5px 10px}.trial-result>small{display:block}.file-viewer{width:850px}.file-viewer pre{min-height:220px;max-height:58vh;overflow:auto;white-space:pre;font-family:Consolas,monospace}.file-actions button{font-size:12px}.port{cursor:crosshair;pointer-events:auto;z-index:2;width:11px;height:11px;top:43px}.port.connecting{background:#5782ed;outline:3px solid #bbcffa}.palette button[draggable=true]{cursor:grab}.palette button[draggable=true]:active{cursor:grabbing}#canvasProject{font-size:11px;color:#6984a3;overflow-wrap:anywhere;margin-top:7px}

#content[aria-busy=true]::after{content:'正在读取工作流…';position:absolute;inset:0;background:#f7f9fdcc;display:flex;align-items:center;justify-content:center;color:#6b83a5;z-index:15}

.mode-badge{color:#348572;background:#eaf6f0;border:1px solid #d7eadf;padding:3px 7px;border-radius:5px;font-size:11px;white-space:nowrap}.canvas-feedback{padding:7px 14px;min-height:39px;max-height:83px;overflow:auto;font-size:12px;line-height:1.6;background:#f8fbff;border-bottom:1px solid #dee7f2;color:#607a9e;display:flex;justify-content:space-between;gap:14px;align-items:center}.canvas-feedback.warning{background:#fff8eb;color:#93672c}.canvas-feedback button{white-space:nowrap;padding:3px 8px;font-size:11px;flex-shrink:0}.canvas-feedback .has-issues{color:#a36b26;border-color:#e9ce96}.node .node-meta{font-size:11px;padding:6px 12px;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.node-bottom>span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:142px}.node-bottom .state{white-space:nowrap}.node .port{width:26px;height:26px;top:35px;background:white;border:1.5px solid #91a9ca;display:flex;align-items:center;justify-content:center;color:#6586b2;font-size:10px;font-style:normal;z-index:3}.node .port.in{left:-14px}.node .port.out{right:-14px}.node .port span{pointer-events:none}.node .port:hover,.node .port:focus-visible,.node .port.connecting,.node .port.drop-ready{color:#fff;background:#5483e8;border-color:#3769ca;outline:3px solid #c6d9fc}.node.connection-error{border-color:#d98f76}.node.connection-error .state{color:#b56e49}.node.connection-warning{border-style:dashed;border-color:#c6ad71}.node.focus-target{box-shadow:0 0 0 5px #75a1f64d,0 5px 25px #5c88dd55}.input-binding{padding:10px;border:1px solid #dfe7f1;border-radius:7px;margin:9px 0;background:#fafcff}.input-binding label{margin:0}.input-binding label small{float:right}.input-binding select{display:block;width:100%;max-width:100%;border:1px solid #d1deed;border-radius:5px;padding:7px;margin-top:8px;color:#385c85;background:white;font-size:12px}.input-binding .binding-state{font-size:11px;color:#7b91ac;line-height:1.7;margin:8px 0 0;overflow-wrap:anywhere}.input-binding.missing-binding{border-color:#e1b486;background:#fffaf3}.field-error{outline:2px solid #e1a365;outline-offset:2px}.technical-details{border-top:1px solid #e4ebf3;margin-top:20px;padding-top:12px}.technical-details summary{color:#6e85a4;font-size:12px;cursor:pointer}.technical-details .kv{margin-top:15px}#locateCount{font-size:11px;color:#7890af;min-width:30px;white-space:nowrap}.edges path.selected-edge{stroke:#de8f38;stroke-width:4}.edges g.selected-edge rect{stroke:#de8f38;stroke-width:2}.located-issue{margin-bottom:15px}.issue-warning strong{color:#aa7b30}#mappingHint{margin:14px 0}#mappingTarget{width:100%}.node-edit-panel details{margin:14px 0;font-size:12px;color:#7188a5}.node-edit-panel select{max-width:100%}

/* Dot appearance is separate from the generous pointer/keyboard target. */
.node .port{width:24px;height:24px;top:35px;border:0;background:transparent;color:transparent;outline:none}
.node .port.in{left:-13px}.node .port.out{right:-13px}
.node .port::after{content:'';width:10px;height:10px;border-radius:50%;border:2px solid #6e809b;background:#fff;pointer-events:none}
.node .port.connected::after{border-color:#19805b;background:#2aa776}
.node .port.missing::after{border-color:#c52f40;background:#ed5360}
.node .port:hover,.node .port:focus-visible,.node .port.connecting,.node .port.drop-ready{background:transparent;outline:none}
.node .port:hover::after,.node .port:focus-visible::after,.node .port.connecting::after,.node .port.drop-ready::after{box-shadow:0 0 0 4px #8eb7ff88}
.node.connection-error,.node.connection-warning{border:2px solid #dc3547;background:#fff7f7}
.node.connection-error:hover:not(:disabled),.node.connection-warning:hover:not(:disabled){border-color:#dc3547;background:#fff1f3}
.node.connection-error.selected,.node.connection-warning.selected{outline:2px solid #dc3547}
.node.connection-error .port,.node.connection-warning .port{top:34px}
.node.connection-error .port.in,.node.connection-warning .port.in{left:-14px}
.node.connection-error .port.out,.node.connection-warning .port.out{right:-14px}
.node.connection-error .node-heading,.node.connection-warning .node-heading{background:#ffecef}
.node.connection-error .state,.node.connection-warning .state{color:#bb2538}
.input-binding.missing-binding{border-color:#dc3547;background:#fff1f3}
.field-error{outline-color:#dc3547}
.canvas-feedback.warning{background:#fff1f3;color:#b72d3f}
.canvas-feedback .has-issues{color:#b72d3f;border-color:#e68d98;background:#fff6f7}

.admin-login{min-height:100%;display:grid;place-items:center;padding:30px}.admin-login form{background:#fff;border:1px solid #dce4ef;border-radius:12px;padding:30px;width:380px;max-width:100%;box-shadow:0 8px 35px #1932560a}.admin-login h1{font-size:21px}.admin-login p{color:#71839c;font-size:13px}.admin-login label{display:block;margin:16px 0;font-size:13px}.admin-login input{display:block;width:100%;padding:10px;margin-top:6px;border:1px solid #cfdbeb;border-radius:6px}.admin-login small{display:block;margin-top:17px}.admin-login #adminLoginError{color:#b72d3f;min-height:20px}.admin-login button{width:100%}#account button{font-size:12px;padding:3px 8px;margin-left:8px}
