*{box-sizing:border-box}html,body,#root{margin:0;height:100%;background:#0e1013;color:#e7e4dc;font-family:Segoe UI,system-ui,sans-serif}.app{display:flex;flex-direction:column;height:100vh;overflow:hidden}button{font:inherit;cursor:pointer}select{font:inherit}.topbar{height:50px;flex:none;display:flex;align-items:center;gap:16px;padding:0 16px;background:#14171b;border-bottom:1px solid #2b3038}.mark{font-weight:800;font-size:15px;letter-spacing:.02em;text-transform:uppercase}.mark span{color:#8b938a;font-weight:500;margin-left:8px}.topbar nav{display:flex;gap:6px}.topbar nav button{border:1px solid #343c46;border-radius:3px;background:#191d23;color:#c8c4ba;padding:7px 14px;font-size:13px}.topbar nav button.on{background:#e3b93c;border-color:#b9973a;color:#17150f;font-weight:700}.spacer{flex:1}.tagline{font-size:12px;color:#7f8896}.narrow{display:none;padding:10px 16px;background:#3a2c10;color:#f0c14a;font-size:13px}@media (max-width: 1100px){.narrow{display:block}}.lessonbar{flex:none;min-height:46px;display:flex;align-items:center;gap:12px;padding:6px 16px;background:#12151a;border-bottom:1px solid #2a313a;font-size:13px}.lessonbar select{background:#191d23;color:#f0c14a;border:1px solid #343c46;border-radius:3px;padding:5px 8px;flex:none}.lessonobj{color:#c8c4ba;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.lessonbar b.pass{color:#7ee787;flex:none}.lessonbar b.todo{color:#5d6b7d;flex:none}.modepill{margin-left:auto;flex:none;font-size:11px;letter-spacing:.08em;color:#9fb0a0;font-family:Consolas,monospace}.robotlab,.plclab{flex:1;min-height:0;display:flex;flex-direction:column}.labgrid{flex:1;min-height:0;display:grid;grid-template-columns:460px 1fr}.labgrid.closed{grid-template-columns:44px 1fr}.pendanttab{writing-mode:vertical-rl;letter-spacing:.18em;font-size:12px;color:#c8c4ba;background:#202329;border:0;border-right:1px solid #000;cursor:pointer}.stage{min-width:0;min-height:0;display:grid;grid-template-rows:218px 1fr 178px;background:#0b0d10}.pendant{background:#202329;border-right:1px solid #000;padding:10px 12px;display:flex;flex-direction:column;gap:6px;overflow:auto}.devhead{display:flex;align-items:center;gap:10px;background:#14161a;border:1px solid #343943;border-radius:3px;padding:6px 8px}.led{width:9px;height:9px;border-radius:50%;background:#3ddc68;flex:none}.brand{font-weight:800;letter-spacing:.06em;font-size:13px}.brand span{display:block;font-weight:500;color:#8b938a;font-size:10px;letter-spacing:.12em}.pull{margin-left:auto;background:#191c20;color:#9aa;border:1px solid #3a424c;border-radius:3px;padding:6px 10px;font-size:11px}.estopwrap{text-align:center}.estopwrap div{font-size:9px;letter-spacing:.14em;color:#f0c14a;margin-top:3px}.estop{width:52px;height:52px;border-radius:50%;border:6px solid #e2b400;background:radial-gradient(circle at 38% 32%,#ff5a48,#d10c00 45%,#8d0600);box-shadow:0 2px #7a5c00;cursor:pointer}.modesel{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px}.key{height:34px;border:1px solid #b9b4a8;border-bottom:3px solid #9d9789;border-radius:3px;background:#e8e5de;color:#1d1b17;font-size:12px;font-weight:650}.key:active{background:#d4d0c6}.key.sel,.key.on{background:#e3b93c;border-color:#b9973a;border-bottom-color:#9a7d2e}.key.jog{height:42px;color:#fff;font-size:13px;background:#2f5f86;border-color:#274e6e;border-bottom:3px solid #1d3d57}.key.go{background:#4c8a43;border-color:#3f7238;border-bottom-color:#2f5c2a;color:#fff}.key.holdk{background:#e3b93c;border-color:#b9973a;border-bottom-color:#9a7d2e}.key.sqz{background:#b8453c;border-color:#96362f;border-bottom-color:#7a2b24;color:#fff}.key.dmhold{background:#b9d9a8}.key.ledon{box-shadow:inset 0 0 0 2px #4c8a43;background:#d6ecc8}.lcd{background:#0a120d;border:1px solid #1e3325;border-radius:3px;box-shadow:inset 0 0 0 1px #0d1f13;padding:7px 10px;font-family:Consolas,monospace;color:#b6f3c4}.lcd .r{display:flex;justify-content:space-between;font-size:11px}.lcd .r.dim{margin-top:5px;color:#6fae86}.lcd .big{margin-top:4px;font-size:14px;color:#eaffea}.lcd .xyz{margin-top:4px;font-size:12px;color:#8fd9a8}.sect{font-size:9px;letter-spacing:.14em;color:#8b929d;margin:2px 0 0}.pad{background:#14161a;border:1px solid #343943;border-radius:3px;padding:6px;display:grid;gap:6px}.joggrid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.subrow{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.run{display:grid;grid-template-columns:1.3fr .8fr .8fr;gap:6px}.run2{display:grid;grid-template-columns:1.3fr 1fr;gap:6px}.dmgrid{display:grid;grid-template-columns:1fr 1.2fr 1fr;gap:6px}.dead{display:flex;justify-content:space-between;font-size:11px;letter-spacing:.06em;color:#b7b1a6}.dead b{color:#b6e7a4}.dead b.off{color:#ff8a7a}.specplate{margin-top:auto;border:1px solid #343943;border-radius:3px;padding:7px 9px;font-size:10px;letter-spacing:.12em;color:#7f8896}.editor{border-bottom:1px solid #2a313a;background:#101216;display:flex;flex-direction:column;min-height:0}.edh{flex:none;display:flex;gap:12px;align-items:center;padding:6px 14px;color:#9aa197;font-size:12px;letter-spacing:.06em;border-bottom:1px solid #232830}.edh b{color:#fff}.progtabs{display:flex;gap:4px}.progtabs button{border:1px solid #343c46;border-radius:3px;padding:3px 10px;font-size:11px;background:#191d23;color:#d8d3c8;letter-spacing:.06em}.progtabs button.on{border-color:#f0c14a;color:#f0c14a}.pointinfo{margin-left:auto;color:#f0c14a}.palette{flex:none;display:flex;gap:6px;flex-wrap:nowrap;overflow-x:auto;padding:6px 12px;border-bottom:1px solid #232a34;background:#12151a;scrollbar-width:thin}.palette button{flex:none;border:1px solid #343c46;border-radius:3px;padding:4px 8px;font-size:11px;background:#191d23;color:#d8d3c8;white-space:nowrap}.palette button:hover{border-color:#f0c14a;color:#fff}.palette .sp{flex:1}.palette button.demo{color:#f0c14a}.lineedit{flex:none;display:flex;gap:8px;align-items:center;padding:5px 12px;border-bottom:1px solid #232a34;background:#101318;font-size:12px;color:#9fb0c3}.lineedit b{color:#f0c14a}.lineedit select{background:#191d23;color:#e8e4da;border:1px solid #343c46;border-radius:3px;font-size:12px;padding:4px 6px}.lineedit select:disabled{opacity:.35}.syncbtn{background:#191d23;color:#9fb0c3;border:1px solid #343c46;border-radius:3px;padding:4px 8px;font-size:11px}.lines{flex:1;overflow:auto;padding:2px 0 6px;font-family:Consolas,monospace;font-size:14px;line-height:1.5}.ln{display:grid;grid-template-columns:42px 1fr;padding:1px 14px;cursor:pointer;border-left:3px solid transparent}.ln span{color:#5c6560}.ln:hover{background:#1a1e26}.ln.sel{border-left-color:#3f6d96;background:#171b21}.ln.on{border-left-color:#e3b93c;background:#1d1a12}.ln.on code{color:#fff}.ln code{color:#d9d4c8}.view{position:relative;min-height:0;background:#11151b}.threehost{position:absolute;top:0;right:0;bottom:0;left:0}.layout2d{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background:#151a20;touch-action:none}.tabs{position:absolute;top:10px;left:10px;display:flex;gap:6px;z-index:3}.tab{border:1px solid #343943;border-radius:3px;padding:8px 12px;font-size:13px;background:#14171b;color:#c8c4ba}.tab.on{background:#e8e5de;color:#1b1914;font-weight:700}.viewbtns{position:absolute;top:10px;right:12px;z-index:3;display:flex;gap:5px}.viewbtns button{border:1px solid #343c46;border-radius:3px;padding:6px 9px;font-size:12px;background:#12141ad9;color:#c8c4ba}.viewbtns button:hover{border-color:#f0c14a;color:#fff}.hud{position:absolute;top:52px;right:12px;z-index:3;font-family:Consolas,monospace;font-size:12px;color:#d5ecda;text-align:right;line-height:1.5;background:#0a0c0f8c;padding:4px 7px;border-radius:3px}.hint{position:absolute;left:12px;bottom:10px;z-index:3;color:#aeb6ad;font-size:12px;background:#0e1013d1;padding:5px 8px;border-radius:3px;max-width:46%}.alarm{position:absolute;top:52px;left:50%;transform:translate(-50%);z-index:4;background:#3a0f0c;border:1px solid #ff6b57;color:#ffd9d3;padding:8px 14px;border-radius:3px;font-family:Consolas,monospace;font-size:13px}.selinfo{position:absolute;top:52px;left:12px;z-index:3;background:#12151a;border:1px solid #2c3644;border-left:3px solid #f0c14a;border-radius:3px;padding:8px 11px;font-size:12px;color:#c8c4ba;line-height:1.55;max-width:250px}.selinfo b{color:#fff}.selinfo span{font-family:Consolas,monospace;color:#b6f3c4}.dock{border-top:1px solid #2a313a;background:#101216;padding:8px 12px;display:grid;grid-template-columns:1fr 330px;gap:16px;overflow:auto}.dock h4{margin:0 0 6px;font-size:11px;letter-spacing:.08em;color:#9aa197}.joints{display:grid;grid-template-columns:repeat(6,1fr);gap:8px}.joint{background:#14171b;border:1px solid #2b3038;border-radius:3px;padding:6px 8px}.joint label{display:flex;justify-content:space-between;font-family:Consolas,monospace;font-size:12px;color:#d5ecda}.joint input{width:100%;accent-color:#e3b93c}.joint .steps{display:flex;gap:4px}.joint button{flex:1;border:0;border-radius:2px;padding:4px;background:#232830;color:#eee;font-size:11px}.toolbox{background:#14171b;border:1px solid #2b3038;border-radius:3px;padding:8px 10px}.toolbox .row{display:flex;gap:6px;flex-wrap:wrap}.tbtn{border:0;border-radius:3px;padding:6px 8px;font-size:11px;font-weight:650;background:#2f6eae;color:#fff}.tbtn.green{background:#4c8a43}.tbtn.grey{background:#3a424c}.tbtn.warn{background:#8a6d1f}.read{font-size:12px;color:#b6f3c4;margin-top:6px;line-height:1.5}.read.mono{font-family:Consolas,monospace;font-size:11px}.read b{color:#5d6b7d}.read b.on{color:#7ee787}.read b.warn{color:#e07b2a}.plcgrid{flex:1;min-height:0;display:grid;grid-template-columns:360px 1fr 380px;gap:0;overflow:hidden}.panel{background:#12151a;border-right:1px solid #2a313a;padding:12px 14px;overflow:auto}.panel h4{margin:4px 0 10px;font-size:11px;letter-spacing:.1em;color:#9aa197}.devrow{display:flex;align-items:center;gap:10px;padding:5px 0;font-size:13px}.devrow>span:first-child{width:130px;flex:none;color:#c8c4ba}.devrow .key{height:30px;padding:0 12px}.bitread{font-family:Consolas,monospace;font-size:11px;color:#6fae86}.plamp{display:inline-block;width:13px;height:13px;border-radius:50%;background:#232830;border:1px solid #343c46;vertical-align:-2px;flex:none}.hoas{display:flex;gap:5px}.hoas .key{padding:0 9px;font-size:11px}.motorbox{display:flex;gap:14px;align-items:center;background:#14171b;border:1px solid #2b3038;border-radius:3px;padding:10px;margin-bottom:8px}.motor{position:relative;width:62px;height:62px;border-radius:50%;border:3px solid #46536a;background:#191d23;flex:none}.motor .spoke{position:absolute;left:50%;top:50%;width:3px;height:24px;background:#8b938a;transform-origin:50% 0}.motor .spoke.s2{transform:rotate(120deg)}.motor .spoke.s3{transform:rotate(240deg)}.motor.spin{animation:rot .7s linear infinite}@keyframes rot{to{transform:rotate(360deg)}}.panel.ladder{background:#101216}.rung{border:1px solid #2b3038;border-radius:3px;background:#14171b;padding:8px 10px;margin-bottom:10px}.runghead{display:flex;justify-content:space-between;font-size:11px;color:#9aa197;margin-bottom:6px}.runghead button,.addc{background:#232830;color:#c8c4ba;border:1px solid #343c46;border-radius:3px;font-size:11px;padding:3px 7px}.rail{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-family:Consolas,monospace}.bus{color:#f0c14a;font-weight:700}.contact{display:inline-flex;gap:3px;align-items:center;background:#191d23;border:1px solid #343c46;border-radius:3px;padding:3px}.contact select{background:#101216;color:#d5ecda;border:1px solid #343c46;border-radius:2px;font-size:11px;max-width:170px}.contact button{background:#232830;color:#c8c4ba;border:0;border-radius:2px;font-size:11px;padding:3px 6px}.orlbl{color:#8b929d;font-size:11px}.coilwrap{margin-left:auto;display:inline-flex;gap:6px;align-items:center;color:#f0c14a}.coilwrap select{background:#101216;color:#f0c14a;border:1px solid #343c46;border-radius:2px;font-size:11px}.key.addrun{margin-top:2px}.key.big{height:42px;padding:0 16px}.note{font-size:12px;line-height:1.6;color:#9aa197}.doorframe{position:relative;height:190px;border:2px solid #46536a;border-bottom-width:5px;border-radius:3px;background:#0b0e12;overflow:hidden;margin-bottom:10px}.doorleaf{position:absolute;left:0;right:0;bottom:0;background:repeating-linear-gradient(180deg,#33465e 0,#33465e 22px,#2b3c50 22px,#2b3c50 24px);display:flex;align-items:flex-start;justify-content:center;transition:height .05s linear}.doorleaf span{margin-top:8px;font-size:10px;letter-spacing:.3em;color:#9fb4c8}.doorpos{position:absolute;top:6px;right:8px;font-family:Consolas,monospace;font-size:11px;color:#7ee787}.blockbits{border:1px solid #2b3038;border-radius:3px;background:#14171b;padding:9px 11px;font-size:12px;line-height:1.9;margin-top:8px}.bbhead{font-size:10px;letter-spacing:.1em;color:#8b929d;margin-top:4px}
