*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
:root{
  --bg:#0f1117;--bg2:#1a1d27;--bg3:#242836;--bg4:#2e3344;
  --text:#e8eaf0;--text2:#9ca3b8;--text3:#6b7280;
  --accent:#4ecdc4;--accent2:#45b7aa;--accent-glow:rgba(78,205,196,.15);
  --project-h:44px;
  --warn:#f59e0b;--err:#ef4444;--ok:#22c55e;
  --blue:#3b82f6;--purple:#8b5cf6;
  --radius:8px;--shadow:0 4px 24px rgba(0,0,0,.4);
  --total-top:calc(var(--toolbar-h) + var(--project-h));
  --toolbar-h:48px;--palette-w:240px;--props-w:280px;
}
html,body{height:100%;font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);overflow:hidden}
.hidden{display:none!important}

/* TOOLBAR */
#toolbar{height:var(--toolbar-h);background:var(--bg2);border-bottom:1px solid var(--bg3);display:flex;align-items:center;justify-content:space-between;padding:0 12px;gap:8px;z-index:100}
.toolbar-left{display:flex;align-items:center;gap:10px}
.logo{font-weight:700;font-size:15px;color:var(--accent);text-decoration:none;letter-spacing:1px}
.app-title{font-size:13px;font-weight:500;color:var(--text2);border-left:1px solid var(--bg4);padding-left:10px;margin:0;line-height:1.2}
.toolbar-center{display:flex;align-items:center;gap:2px}
.toolbar-center button{display:flex;align-items:center;gap:5px;background:none;border:1px solid transparent;color:var(--text2);padding:6px 10px;border-radius:6px;cursor:pointer;font-size:12px;font-family:inherit;transition:.2s}
.toolbar-center button:hover{background:var(--bg3);color:var(--text);border-color:var(--bg4)}
.toolbar-center button:active{transform:scale(.96)}
.toolbar-sep{width:1px;height:24px;background:var(--bg4);margin:0 4px}
.toolbar-right{display:flex;flex-direction:column;align-items:flex-end;gap:2px;min-width:110px}
.toolbar-link{font-size:11px;color:var(--accent);text-decoration:none;opacity:.7;transition:.2s}
.toolbar-link:hover{opacity:1}
.lang-switch{display:inline-flex;align-items:center;justify-content:center;gap:4px;background:linear-gradient(135deg,rgba(78,205,196,.12),rgba(139,92,246,.12));border:1px solid rgba(78,205,196,.3);color:var(--text);padding:3px 12px;border-radius:14px;cursor:pointer;font-size:11px;font-weight:600;font-family:inherit;transition:.25s;min-width:60px;letter-spacing:.5px}
.lang-switch:hover{background:linear-gradient(135deg,rgba(78,205,196,.25),rgba(139,92,246,.25));border-color:var(--accent);transform:scale(1.04);box-shadow:0 0 12px rgba(78,205,196,.2)}

/* PROJECT PANEL */
#projectBar{background:var(--bg2);border-bottom:1px solid var(--bg3);position:relative;z-index:50}
#projSummary{height:var(--project-h);display:flex;align-items:center;padding:0 12px;gap:10px;font-size:12px}
.proj-stat{color:var(--text3);font-size:11px;padding:0 8px;border-left:1px solid var(--bg4)}
.proj-stat b{color:var(--accent)}
.proj-toggle{margin-left:auto;padding:4px 12px;background:var(--accent-glow);border:1px solid rgba(78,205,196,.3);border-radius:5px;color:var(--accent);font-size:11px;font-family:inherit;cursor:pointer;transition:.2s}
.proj-toggle:hover{background:rgba(78,205,196,.2)}
#projPanel{background:var(--bg);border-top:1px solid var(--bg3);max-height:320px;overflow-y:auto}
.proj-panel-head{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--bg3)}
.proj-panel-head h4{font-size:12px;font-weight:600;color:var(--text2)}
.proj-panel-head button{padding:4px 12px;background:var(--accent);color:var(--bg);border:none;border-radius:5px;font-size:11px;font-family:inherit;font-weight:600;cursor:pointer;transition:.2s}
.proj-panel-head button:hover{background:var(--accent2)}
.load-card{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid var(--bg3);font-size:11px;flex-wrap:wrap}
.load-card:hover{background:rgba(255,255,255,.02)}
.load-num{width:20px;height:20px;border-radius:50%;background:var(--accent);color:var(--bg);font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.load-card label{color:var(--text3);font-size:10px;white-space:nowrap}
.load-card input,.load-card select{padding:3px 6px;background:var(--bg3);border:1px solid var(--bg4);border-radius:4px;color:var(--text);font-size:11px;font-family:inherit;outline:none}
.load-card input:focus,.load-card select:focus{border-color:var(--accent)}
.load-card .load-result{color:var(--accent);font-weight:600;font-size:11px;padding:2px 8px;background:rgba(78,205,196,.08);border-radius:4px;white-space:nowrap}
.load-card .load-warn{color:var(--warn);font-size:10px}
.load-card .load-del{background:none;border:none;color:var(--text3);cursor:pointer;font-size:14px;padding:2px 4px;opacity:.5;transition:.15s}
.load-card .load-del:hover{opacity:1;color:var(--err)}
.proj-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-top:1px solid var(--bg3);background:var(--bg2)}
.proj-totals{display:flex;gap:16px;font-size:11px;color:var(--text2)}
.proj-totals b{color:var(--accent)}
.proj-apply{padding:6px 16px;background:var(--accent);color:var(--bg);border:none;border-radius:6px;font-size:12px;font-family:inherit;font-weight:600;cursor:pointer;transition:.2s}
.proj-apply:hover{background:var(--accent2);transform:translateY(-1px)}

/* MAIN LAYOUT */
#app{display:flex;height:calc(100vh - var(--total-top))}

/* PALETTE */
#palette{width:var(--palette-w);background:var(--bg2);border-right:1px solid var(--bg3);display:flex;flex-direction:column;overflow:hidden}
.palette-search{padding:8px}
.palette-search input{width:100%;padding:7px 10px;background:var(--bg3);border:1px solid var(--bg4);border-radius:6px;color:var(--text);font-size:12px;font-family:inherit;outline:none;transition:.2s}
.palette-search input:focus{border-color:var(--accent)}
#paletteList{flex:1;overflow-y:auto;padding:0 8px 8px}
#paletteList::-webkit-scrollbar{width:4px}
#paletteList::-webkit-scrollbar-thumb{background:var(--bg4);border-radius:4px}
.palette-cat{margin-bottom:4px}
.palette-cat-title{font-size:11px;font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.5px;padding:8px 4px 4px;cursor:pointer;display:flex;align-items:center;gap:4px;user-select:none}
.palette-cat-title::before{content:'▸';font-size:10px;transition:.2s;display:inline-block}
.palette-cat.open .palette-cat-title::before{transform:rotate(90deg)}
.palette-cat-items{display:none;padding:2px 0}
.palette-cat.open .palette-cat-items{display:block}
.palette-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:grab;font-size:12px;color:var(--text2);transition:.15s;user-select:none}
.palette-item:hover{background:var(--accent-glow);color:var(--text)}
.palette-item:active{cursor:grabbing;transform:scale(.97)}
.palette-item svg{width:32px;height:24px;flex-shrink:0}
.palette-item svg path,.palette-item svg rect,.palette-item svg line,.palette-item svg circle,.palette-item svg polygon{stroke:var(--text2);fill:none;stroke-width:1.5}
.palette-item:hover svg path,.palette-item:hover svg rect,.palette-item:hover svg line,.palette-item:hover svg circle,.palette-item:hover svg polygon{stroke:var(--accent)}

/* CANVAS */
#canvasWrap{flex:1;position:relative;overflow:hidden;background:var(--bg)}
#canvas{width:100%;height:100%;cursor:crosshair}
#canvas .component{cursor:move}
#canvas .component:hover .comp-body{filter:brightness(1.3)}
#canvas .component.selected .comp-body{filter:drop-shadow(0 0 6px var(--accent))}
#canvas .port{cursor:pointer;transition:.15s}
/* Базовые свойства порта; цвет stroke задаётся типом порта (.port-in, .port-out, ...) — см. блок PORTS BY TYPE ниже */
#canvas .port circle{fill:var(--bg);stroke-width:1.5;r:4;transition:.15s}
#canvas .port:hover circle{fill:var(--accent);r:6}
/* v2.3 (P3.22): курсор crosshair на порту = visually очевидно что интерактивен */
#canvas .port{cursor:crosshair !important}
/* v2.3 (P2.11): выделенный компонент — yellow dashed border */
#canvas .component.selected{filter:drop-shadow(0 0 8px #facc15)}
/* v2.3 (P2.13): силенсер виден лучше при zoom 100% — увеличил stroke-width в SVG */
/* v2.3 (P2.21): Live BOM hover — заметнее */
#liveBomList li{transition:background .2s}
#liveBomList li:hover{background:rgba(78,205,196,0.12)}
#liveBomList li:hover .lbom-name{color:var(--text)}
#canvas .connection{stroke:var(--text3);stroke-width:2.5;fill:none;cursor:pointer;transition:.15s}
#canvas .connection:hover{stroke:var(--accent);stroke-width:3.5}
#canvas .connection.flow-active{stroke:var(--accent);stroke-dasharray:8 4;animation:flowAnim 1s linear infinite}
#canvas .connection.flow-reverse{animation:flowAnimReverse 1s linear infinite}
#canvas .connection.flow-exhaust{stroke:var(--warn)!important;stroke-dasharray:6 6;animation:flowAnim .8s linear infinite}

/* v2.0 — единое управление flow-state через data-attribute (вместо ~17 inline style mutations).
   Браузер обрабатывает attribute change быстрее чем style.X = '...' (не триггерит recalc как style). */
#canvas .connection[data-flow-state="extending"]   {opacity:1;stroke:var(--accent)}
#canvas .connection[data-flow-state="retracting"]  {opacity:.6;stroke:#f59e0b}
#canvas .connection[data-flow-state="idle"]        {opacity:.25}
#canvas .connection[data-flow-state="exhaust-on"]  {opacity:.7;stroke:#f59e0b}
#canvas .connection[data-flow-state="exhaust-off"] {opacity:.15}
#canvas .connection[data-flow-state="supply"]      {opacity:1;stroke:var(--accent)}
#canvas .connection[data-flow-state="neutral"]     {opacity:1}
#canvas .connection[data-flow-state="pf-supply"]   {opacity:.8;stroke:#ef4444}
#canvas .connection[data-flow-state="pf-bside"]    {opacity:.5;stroke:#ef4444}
#canvas .connection[data-flow-state="pf-aside"]    {opacity:.5;stroke:#ef4444}
#canvas .connection[data-flow-state="pf-exhaust"]  {opacity:.6;stroke:#ef4444}
#canvas .connection[data-flow-state="pf-dim"]      {opacity:.2}
#canvas .connection[data-flow-state="bi-hold"]     {opacity:.3}
#canvas .tube-label{font-family:'Inter',sans-serif;pointer-events:none;user-select:none}
#canvas .tube-label.warn{fill:var(--warn)}
@keyframes flowAnim{to{stroke-dashoffset:-24}}
@keyframes flowAnimReverse{to{stroke-dashoffset:24}}
.sim-piston{pointer-events:none}
.sim-valve-overlay{pointer-events:none}
.sim-coil-pulse{animation:coilPulse 0.8s ease-in-out infinite}
@keyframes coilPulse{0%,100%{opacity:0.7}50%{opacity:1}}
#btnPowerFail{display:none;color:#ef4444;background:rgba(239,68,68,0.08)}
#btnPowerFail.active{color:#fff;background:rgba(239,68,68,0.6);animation:powerBlink 1s ease-in-out infinite}
@keyframes powerBlink{0%,100%{opacity:0.8}50%{opacity:1}}
#canvas .comp-label{fill:var(--text2);font-size:11px;font-family:'Inter',sans-serif;text-anchor:middle;pointer-events:none}

/* VALIDATION BAR */
#validationBar{position:absolute;bottom:12px;left:50%;transform:translateX(-50%);background:var(--bg2);border:1px solid var(--bg3);border-radius:8px;padding:6px 16px;display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text2);box-shadow:var(--shadow);z-index:10}
#validationBar.error{border-color:var(--err);color:var(--err)}
#validationBar.warning{border-color:var(--warn);color:var(--warn)}
#validationBar.ok{border-color:var(--ok);color:var(--ok)}

/* ZOOM */
#zoomControls{position:absolute;bottom:12px;right:12px;display:flex;align-items:center;gap:4px;background:var(--bg2);border:1px solid var(--bg3);border-radius:8px;padding:4px;z-index:10}
#zoomControls button{width:28px;height:28px;border:none;background:none;color:var(--text2);font-size:16px;cursor:pointer;border-radius:4px;transition:.15s}
#zoomControls button:hover{background:var(--bg3);color:var(--text)}
#zoomLevel{font-size:11px;color:var(--text3);min-width:36px;text-align:center}

/* PROPERTIES PANEL */
#properties{width:var(--props-w);background:var(--bg2);border-left:1px solid var(--bg3);display:flex;flex-direction:column;overflow-y:auto}
#properties::-webkit-scrollbar{width:4px}
#properties::-webkit-scrollbar-thumb{background:var(--bg4);border-radius:4px}
.props-header{display:flex;align-items:center;justify-content:space-between;padding:12px;border-bottom:1px solid var(--bg3)}
.props-header h3{font-size:13px;font-weight:600}
.props-header button{background:none;border:none;font-size:16px;cursor:pointer;opacity:.6;transition:.15s}
.props-header button:hover{opacity:1}
.props-empty{padding:32px 16px;text-align:center;color:var(--text3);font-size:12px;line-height:1.6}
.props-empty svg{margin-bottom:12px}
.props-section{padding:12px;border-bottom:1px solid var(--bg3)}
.props-section label{display:block;font-size:11px;color:var(--text3);margin-bottom:4px;text-transform:uppercase;letter-spacing:.3px}
.props-section h4{font-size:12px;font-weight:600;margin-bottom:8px;color:var(--text2)}
.props-section input,.props-section select{width:100%;padding:6px 8px;background:var(--bg3);border:1px solid var(--bg4);border-radius:6px;color:var(--text);font-size:12px;font-family:inherit;outline:none;transition:.2s}
.props-section input:focus,.props-section select:focus{border-color:var(--accent)}
#catalogLinks a,#wikiLinks a{display:block;padding:6px 8px;font-size:12px;color:var(--accent);text-decoration:none;border-radius:4px;transition:.15s;margin-bottom:2px}
#catalogLinks a:hover,#wikiLinks a:hover{background:var(--accent-glow)}

/* VALIDATION PANEL */
#validationPanel{padding:0}
#validationPanel ul{list-style:none;padding:4px 8px}
#validationPanel li{padding:6px 8px;font-size:11px;border-radius:4px;margin-bottom:2px;display:flex;align-items:flex-start;gap:6px;line-height:1.4}
#validationPanel li.err{color:var(--err);background:rgba(239,68,68,.08)}
#validationPanel li.warn{color:var(--warn);background:rgba(245,158,11,.08)}
#validationPanel li.ok{color:var(--ok);background:rgba(34,197,94,.08)}

/* PROMO */
#promoBlock{margin-top:auto;padding:12px;border-top:1px solid var(--bg3)}
.promo-card{background:linear-gradient(135deg,rgba(78,205,196,.12),rgba(59,130,246,.08));border:1px solid rgba(78,205,196,.2);border-radius:8px;padding:12px;text-align:center;margin-bottom:8px}
.promo-badge{font-size:11px;font-weight:700;color:var(--accent);letter-spacing:1px}
.promo-card p{font-size:11px;color:var(--text2);margin:6px 0 8px;line-height:1.4}
.promo-btn{display:inline-block;padding:6px 14px;background:var(--accent);color:var(--bg);font-size:12px;font-weight:600;border-radius:6px;text-decoration:none;transition:.2s}
.promo-btn:hover{background:var(--accent2);transform:translateY(-1px)}
.promo-tools{display:grid;grid-template-columns:1fr 1fr;gap:4px}
.promo-tools a{display:block;padding:6px;font-size:11px;color:var(--text2);text-decoration:none;text-align:center;border-radius:4px;transition:.15s}
.promo-tools a:hover{background:var(--bg3);color:var(--text)}

/* MODAL */
.modal{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:200;backdrop-filter:blur(4px)}
.modal-content{background:var(--bg2);border:1px solid var(--bg3);border-radius:12px;width:90%;max-width:640px;max-height:80vh;overflow:hidden;box-shadow:var(--shadow);display:flex;flex-direction:column}
.modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--bg3)}
.modal-header h2{font-size:16px;font-weight:600}
.modal-close{background:none;border:none;color:var(--text3);font-size:18px;cursor:pointer;transition:.15s}
.modal-close:hover{color:var(--text)}
.modal-body{padding:16px 20px;overflow-y:auto;flex:1;min-height:0}
.template-card{padding:12px;border:1px solid var(--bg3);border-radius:8px;margin-bottom:8px;cursor:pointer;transition:.2s}
.template-card:hover{border-color:var(--accent);background:var(--accent-glow)}
.template-card h4{font-size:13px;margin-bottom:4px}
.template-card p{font-size:11px;color:var(--text3);line-height:1.4}

/* BOM BUTTON & TABLE */
.proj-bom{padding:6px 16px;background:rgba(59,130,246,.12);color:#60a5fa;border:1px solid rgba(59,130,246,.25);border-radius:6px;cursor:pointer;font-size:12px;font-weight:500;transition:.2s}
.proj-bom:hover{background:rgba(59,130,246,.2);color:#93bbfd}
.bom-section{margin-bottom:18px}
.bom-section h3{font-size:13px;font-weight:600;color:var(--accent);margin-bottom:8px;display:flex;align-items:center;gap:6px}
.bom-table{width:100%;border-collapse:collapse;font-size:12px}
.bom-table th{text-align:left;padding:6px 10px;background:var(--bg3);color:var(--text2);font-weight:500;border-radius:4px 4px 0 0;font-size:11px;text-transform:uppercase;letter-spacing:.5px}
.bom-table td{padding:6px 10px;border-bottom:1px solid var(--bg3);color:var(--text)}
.bom-table tr:last-child td{border-bottom:none}
.bom-table .bom-qty{font-weight:600;color:var(--accent);text-align:center;width:50px}
.bom-table .bom-link{color:#60a5fa;text-decoration:none;font-weight:500;transition:.15s}
.bom-table .bom-link:hover{color:#93bbfd;text-decoration:underline}
.bom-total-row{margin-top:16px;padding:12px;background:linear-gradient(135deg,rgba(78,205,196,.08),rgba(59,130,246,.06));border:1px solid rgba(78,205,196,.15);border-radius:8px;text-align:center;font-size:12px;color:var(--text2)}
.bom-total-row b{color:var(--accent)}

/* ==================== MOBILE TOGGLES ==================== */
.mobile-toggle{display:none;position:fixed;z-index:150;width:44px;height:44px;border-radius:12px;border:1px solid var(--bg4);background:var(--bg2);color:var(--accent);font-size:20px;cursor:pointer;align-items:center;justify-content:center;box-shadow:0 2px 12px rgba(0,0,0,.5);transition:.2s}
.mobile-toggle:hover{background:var(--bg3);transform:scale(1.05)}
.mobile-toggle:active{transform:scale(.95)}
#btnTogglePalette{bottom:80px;left:12px}
#btnToggleProps{bottom:80px;right:12px}
.mobile-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:80;backdrop-filter:blur(2px)}
.mobile-overlay.active{display:block}

/* ==================== TABLET ≤ 1024px ==================== */
@media(max-width:1024px){
  :root{--palette-w:200px;--props-w:240px}
  .toolbar-center button span{display:none}
  .toolbar-center button{padding:8px}
  .app-title{display:none}
  .toolbar-link{font-size:11px}
  .proj-stat{font-size:10px;padding:0 4px}
}

/* ==================== MOBILE ≤ 768px ==================== */
@media(max-width:768px){
  :root{
    --toolbar-h:44px;
    --project-h:40px;
    --palette-w:280px;
    --props-w:300px;
  }

  /* Toolbar compact */
  #toolbar{padding:0 8px;gap:4px}
  .logo{font-size:14px}
  .app-title{display:none}
  .toolbar-center{gap:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  .toolbar-center::-webkit-scrollbar{display:none}
  .toolbar-center button{padding:8px 6px;font-size:11px;flex-shrink:0}
  .toolbar-center button span{display:none}
  .toolbar-sep{margin:0 2px;height:20px}
  .toolbar-right{display:none}

  /* Project bar compact */
  #projSummary{padding:0 8px;gap:6px;font-size:11px;height:var(--project-h);overflow-x:auto;scrollbar-width:none}
  #projSummary::-webkit-scrollbar{display:none}
  #projName{max-width:100px!important;font-size:11px!important}
  .proj-stat{font-size:10px;padding:0 4px}
  .proj-bom{padding:4px 10px;font-size:11px}
  .proj-toggle{font-size:10px;padding:3px 8px}

  /* Main layout: canvas full width */
  #app{position:relative}

  /* Palette: slide-in from left */
  #palette{
    position:fixed;
    top:var(--total-top);
    left:0;
    bottom:0;
    width:var(--palette-w);
    z-index:90;
    transform:translateX(-100%);
    transition:transform .3s cubic-bezier(.4,0,.2,1);
    box-shadow:4px 0 20px rgba(0,0,0,.5);
  }
  #palette.mobile-open{transform:translateX(0)}

  /* Properties: slide-in from right */
  #properties{
    position:fixed;
    top:var(--total-top);
    right:0;
    bottom:0;
    width:var(--props-w);
    z-index:90;
    transform:translateX(100%);
    transition:transform .3s cubic-bezier(.4,0,.2,1);
    box-shadow:-4px 0 20px rgba(0,0,0,.5);
  }
  #properties.mobile-open{transform:translateX(0)}

  /* Show toggle buttons */
  .mobile-toggle{display:flex}

  /* Canvas full width */
  #canvasWrap{width:100%}

  /* Zoom controls bottom left */
  #zoomControls{bottom:12px;left:50%;right:auto;transform:translateX(-50%)}

  /* Validation bar */
  #validationBar{bottom:56px;font-size:11px;padding:4px 12px;max-width:calc(100% - 120px)}

  /* Load cards responsive */
  .load-card{padding:6px 8px;font-size:10px;gap:4px}
  .load-card input,.load-card select{font-size:10px;padding:2px 4px}
  .load-card label{font-size:9px}

  /* Modals full screen on mobile */
  .modal-content{width:95%;max-height:90vh;border-radius:10px}
  .modal-header{padding:12px 16px}
  .modal-body{padding:12px 16px}
}

/* ==================== SMALL PHONES ≤ 480px ==================== */
@media(max-width:480px){
  :root{--palette-w:260px;--props-w:280px}
  .logo{font-size:13px;letter-spacing:0.5px}
  .toolbar-center button{padding:6px 4px}
  #projSummary{flex-wrap:nowrap}
  #projName{max-width:80px!important}
  .proj-stat:nth-child(n+4){display:none}
  .modal-content{width:98%;margin:8px}
  #validationBar{max-width:calc(100% - 80px);font-size:10px}
}

/* FEEDBACK WIDGET */
#sbFeedbackBlock{padding:10px 12px 12px}
.sb-fb-btn{width:100%;padding:7px 10px;background:var(--bg3);border:1px solid var(--bg4);border-radius:var(--radius);color:var(--text2);font-size:12px;font-family:inherit;cursor:pointer;text-align:left;transition:.2s}
.sb-fb-btn:hover{border-color:var(--accent);color:var(--text)}
.sb-fb-btn--active{border-color:var(--accent);background:rgba(78,205,196,.08)}
.sb-fb-form{padding:8px 0 0}
@keyframes sb-fb-fade{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}
.sb-fb-form:not(.hidden){animation:sb-fb-fade .18s ease}
.sb-fb-context{font-size:11px;color:var(--text3);margin-bottom:7px;padding:5px 8px;background:var(--bg3);border-radius:5px;font-style:italic;line-height:1.4}
.sb-fb-fields{display:flex;flex-direction:column;gap:6px}
.sb-fb-select,.sb-fb-text{width:100%;padding:6px 9px;background:var(--bg3);border:1px solid var(--bg4);border-radius:6px;color:var(--text);font-size:12px;font-family:inherit;outline:none;resize:vertical}
.sb-fb-select:focus,.sb-fb-text:focus{border-color:var(--accent)}
.sb-fb-actions{margin-top:7px;display:flex;justify-content:flex-end}
.sb-fb-send{padding:5px 16px;background:var(--accent);color:#000;border:none;border-radius:6px;font-size:12px;font-weight:600;font-family:inherit;cursor:pointer;transition:.2s}
.sb-fb-send:hover{background:var(--accent2)}
.sb-fb-send:disabled{opacity:.5;cursor:not-allowed}
.sb-fb-ok{font-size:12px;color:var(--ok);margin-top:7px;text-align:center}

/* ========== PORTS BY TYPE (v1.8) ========== */
/* Цветовая дифференциация портов: пользователь сразу видит, что куда идёт */
/* Используем #canvas префикс чтобы перебить старое правило #canvas .port circle */
#canvas .port-in circle      {stroke:#38bdf8}  /* вход — голубой */
#canvas .port-source circle  {stroke:#3b82f6}  /* источник — синий */
#canvas .port-out circle     {stroke:#22c55e}  /* выход — зелёный */
#canvas .port-work circle    {stroke:#facc15}  /* рабочий — жёлтый */
#canvas .port-exhaust circle {stroke:#fb923c}  /* выхлоп — оранжевый */
#canvas .port-any circle     {stroke:#94a3b8}  /* универсальный — серый */
/* Подсветка совместимых портов во время draw-connection */
#canvas .port.compatible circle{stroke:#22c55e !important;stroke-width:3;r:6;filter:drop-shadow(0 0 4px #22c55e)}
#canvas .port.incompatible{opacity:.25}
#canvas .port.incompatible circle{stroke:#ef4444 !important}

/* ========== EMPTY CANVAS HERO (v1.8) ========== */
.empty-canvas-hero{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  pointer-events:none;z-index:5;background:radial-gradient(circle at center,rgba(78,205,196,0.04),transparent 60%);
}
.empty-canvas-hero .ech-card{
  pointer-events:auto;max-width:420px;background:var(--bg2);border:1px solid var(--bg4);
  border-radius:14px;padding:32px 28px;text-align:center;box-shadow:0 8px 32px rgba(0,0,0,.4);
  animation:echFadeIn .4s ease-out
}
@keyframes echFadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
.empty-canvas-hero .ech-icon{font-size:42px;margin-bottom:8px}
.empty-canvas-hero .ech-title{font-size:18px;font-weight:600;color:var(--text);margin:0 0 8px}
.empty-canvas-hero .ech-desc{font-size:13px;line-height:1.5;color:var(--text2);margin:0 0 20px}
.empty-canvas-hero .ech-actions{display:flex;gap:8px;justify-content:center}
.empty-canvas-hero .ech-btn{
  padding:10px 18px;border-radius:8px;border:1px solid var(--bg4);background:var(--bg3);
  color:var(--text);font-size:13px;font-family:inherit;cursor:pointer;transition:.2s
}
.empty-canvas-hero .ech-btn:hover{background:var(--bg4)}
.empty-canvas-hero .ech-btn-primary{background:var(--accent);color:#000;border-color:var(--accent);font-weight:600}
.empty-canvas-hero .ech-btn-primary:hover{background:var(--accent2)}

/* ========== TOAST (v1.8) ========== */
.sb-toast{
  position:fixed;left:50%;bottom:32px;transform:translateX(-50%) translateY(20px);
  background:var(--bg2);border:1px solid var(--bg4);color:var(--text);
  padding:10px 18px;border-radius:8px;font-size:13px;font-family:inherit;
  box-shadow:0 4px 16px rgba(0,0,0,.4);
  opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;z-index:99999
}
.sb-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ========== Mobile init fix: всегда показываем кнопки на узких экранах ========== */
.mobile-toggle{display:none}
@media (max-width:768px){.mobile-toggle{display:flex}}

/* ========== LIVE BOM (v1.9) — живая спецификация в правой панели ========== */
#liveBomPanel{padding:10px 12px;border-top:1px solid var(--bg3);background:linear-gradient(180deg,rgba(78,205,196,0.04),transparent)}
#liveBomPanel.hidden{display:none}
#liveBomPanel .props-header{display:flex;align-items:center;justify-content:space-between;margin:0 0 8px 0}
#liveBomPanel h3{font-size:12px;margin:0;font-weight:600;color:var(--text);text-transform:uppercase;letter-spacing:.3px}
.lbom-count{
  display:inline-block;background:var(--accent);color:#000;font-weight:700;
  font-size:11px;padding:1px 7px;border-radius:10px;min-width:18px;text-align:center;margin-left:6px
}
#liveBomList{list-style:none;margin:0;padding:0;max-height:240px;overflow-y:auto;font-size:11.5px}
#liveBomList li{
  display:flex;align-items:center;gap:6px;padding:5px 4px;border-bottom:1px solid var(--bg3);
  transition:background .15s
}
#liveBomList li:last-child{border-bottom:none}
#liveBomList li:hover{background:var(--bg3)}
#liveBomList .lbom-qty{
  display:inline-block;min-width:22px;text-align:center;background:var(--bg3);color:var(--accent);
  font-weight:700;font-size:10px;padding:1px 4px;border-radius:3px
}
/* v2.3 (P2.9): BOM names не обрезаются троеточием — переносим в 2 строки */
#liveBomList .lbom-name{flex:1;color:var(--text2);white-space:normal;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
#liveBomList .lbom-link{
  color:var(--accent);text-decoration:none;font-size:11px;flex-shrink:0;
  opacity:.7;transition:opacity .15s
}
#liveBomList li:hover .lbom-link{opacity:1}
.lbom-footer{margin-top:8px;padding-top:8px;border-top:1px dashed var(--bg4);text-align:center}
.lbom-full-link{
  font-size:11px;color:var(--accent);text-decoration:none;font-weight:600
}
.lbom-full-link:hover{text-decoration:underline}

/* ==================== SEO CONTENT (под редактором) ==================== */
/* Цель: видимый текстовый контент для индексации запроса «пневмосхема онлайн».
   Редактор сохраняет высоту 100vh; SEO-блок появляется при прокрутке вниз. */
html,body{overflow-y:auto!important;overflow-x:hidden}
#seoContent{background:var(--bg);border-top:1px solid var(--bg3);padding:48px 24px 64px;color:var(--text2)}
.seo-inner{max-width:880px;margin:0 auto}
.seo-lead{font-size:17px;line-height:1.6;color:var(--text);margin:0 0 32px;padding:18px 22px;background:var(--bg2);border-left:3px solid var(--accent);border-radius:8px}
.seo-h2{font-size:22px;font-weight:600;color:var(--text);margin:36px 0 16px;letter-spacing:-.2px}
.seo-list,.seo-tools-list{list-style:none;margin:0 0 24px;padding:0}
.seo-list li{padding:10px 0 10px 28px;font-size:14.5px;line-height:1.55;border-bottom:1px solid var(--bg3);position:relative}
.seo-list li:last-child{border-bottom:none}
.seo-list li::before{content:"✓";position:absolute;left:0;top:10px;color:var(--accent);font-weight:700}
.seo-list li b{color:var(--text)}
.seo-tools-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px}
.seo-tools-list li{padding:0}
.seo-tools-list a{display:block;padding:12px 16px;background:var(--bg2);border:1px solid var(--bg3);border-radius:8px;color:var(--accent);text-decoration:none;font-size:14px;transition:.2s}
.seo-tools-list a:hover{border-color:var(--accent);background:var(--bg3);transform:translateY(-1px)}
.seo-faq{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}
.seo-faq-item{background:var(--bg2);border:1px solid var(--bg3);border-radius:8px;overflow:hidden}
.seo-faq-item summary{cursor:pointer;padding:14px 18px;list-style:none;display:flex;align-items:center;gap:8px;transition:background .15s}
.seo-faq-item summary::-webkit-details-marker{display:none}
.seo-faq-item summary::before{content:"+";color:var(--accent);font-weight:700;font-size:18px;flex-shrink:0;transition:transform .2s}
.seo-faq-item[open] summary::before{transform:rotate(45deg)}
.seo-faq-item summary:hover{background:var(--bg3)}
.seo-faq-item summary h3{font-size:15px;font-weight:500;color:var(--text);margin:0;line-height:1.4}
.seo-faq-item p{padding:0 18px 16px 36px;font-size:14px;line-height:1.6;color:var(--text2);margin:0}
@media(max-width:768px){
  #seoContent{padding:32px 16px 48px}
  .seo-lead{font-size:15px;padding:14px 16px}
  .seo-h2{font-size:18px}
  .seo-list li{font-size:13.5px}
  .seo-faq-item summary{padding:12px 14px}
  .seo-faq-item summary h3{font-size:14px}
  .seo-faq-item p{padding:0 14px 14px 30px;font-size:13.5px}
}
