#app-container{display:none;width:100vw;height:100vh;overflow:hidden;background:#f0f4f8;position:fixed;top:0;left:0;z-index:1500}#blocklyDiv{flex:1;height:100%;min-width:0}.blocklyDialog{width:min(420px,calc(100vw - 32px));padding:0;border:1px solid #d0d7de;border-radius:10px;background:#ffffff;box-shadow:0 18px 50px rgba(31,41,55,0.24);color:#2c3e50;font-family:inherit}.blocklyDialog::backdrop{background:rgba(15,23,42,0.42)}.blocklyDialogForm{display:flex;flex-direction:column;gap:14px;padding:22px}.blocklyDialogPrompt{color:#2c3e50;font-size:15px;font-weight:700;line-height:1.4}.blocklyDialogInput{width:100%;min-height:40px;box-sizing:border-box;padding:9px 11px;border:1px solid #c7d0da;border-radius:6px;background:#fafbfc;color:#243447;font:inherit;font-size:14px}.blocklyDialogInput:focus{outline:none;border-color:#a55bce;box-shadow:0 0 0 3px rgba(165,91,206,0.18);background:#ffffff}.blocklyDialogButtonRow{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}.blocklyDialogButtonRow button{min-width:84px;min-height:36px;padding:7px 14px;border:1px solid transparent;border-radius:6px;cursor:pointer;font:inherit;font-size:13px;font-weight:700}.blocklyDialogConfirmButton{background:#a55bce;color:#ffffff}.blocklyDialogConfirmButton:hover{background:#914db8}.blocklyDialogCancelButton{border-color:#c7d0da !important;background:#ffffff;color:#536273}.blocklyDialogCancelButton:hover{background:#f0f4f8}#sidebar{width:340px;min-width:340px;height:100vh;box-sizing:border-box;background:#ffffff;padding:15px 18px;box-shadow:-2px 0 15px rgba(0,0,0,0.08);display:flex;flex-direction:column;gap:10px;overflow-y:auto;z-index:10;border-left:1px solid #e8ecf0}.app-title{margin:0 0 8px 0;color:#4C97FF;font-size:1.2rem;font-weight:700}#user-panel{background:#e8f4fd;padding:10px 14px;border-radius:6px;margin-bottom:5px;font-size:13px;display:flex;justify-content:space-between;align-items:center;border-left:4px solid #4C97FF}#user-panel #u-name{font-weight:600;color:#2C3E50}#user-panel .logout-btn{cursor:pointer;color:#e74c3c;font-weight:600;font-size:12px;padding:4px 10px;border-radius:4px;transition:background 0.2s;background:transparent;border:none}#user-panel .logout-btn:hover{background:rgba(231,76,60,0.1)}#project-name{width:100%;padding:8px 12px;border:1px solid #d0d7de;border-radius:6px;box-sizing:border-box;font-size:13px;transition:border-color 0.3s;background:#fafbfc}#project-name:focus{outline:none;border-color:#4C97FF;background:white}#hub-info-panel{background:#e8f4fd;border-left:4px solid #4C97FF;padding:12px 14px;border-radius:4px;display:none;font-size:13px;margin-bottom:5px}#hub-info-panel h4{margin:0 0 8px 0;color:#333;font-size:14px}.info-row{display:flex;justify-content:space-between;margin-bottom:4px;border-bottom:1px dashed #d0d7de;padding-bottom:3px}.info-label{font-weight:600;color:#555}.info-value{color:#000;font-weight:500}button.app-btn{padding:9px 12px;border:none;border-radius:6px;cursor:pointer;font-weight:600;color:white;font-size:13px;width:100%;margin-bottom:4px;transition:all 0.2s ease}button.app-btn:hover{transform:translateY(-1px);box-shadow:0 2px 8px rgba(0,0,0,0.15)}button.app-btn:active{transform:translateY(0)}.btn-run{background:#4C97FF}.btn-run:hover{background:#3a7fd9}.btn-stop{background:#FF4C4C}.btn-stop:hover{background:#e04444}.btn-connect{background:#2ECC71}.btn-connect:hover{background:#27ae60}.btn-save{background:#F39C12}.btn-save:hover{background:#d68910}.btn-load{background:#9B59B6}.btn-load:hover{background:#8e44ad}.btn-group{display:flex;gap:5px}.btn-group button{flex:1}#examples-list{list-style:none;padding:0;margin:0}#examples-list li{padding:10px 12px;border-bottom:1px solid #f0f0f0;cursor:pointer;font-size:13px;border-radius:4px;transition:background 0.2s;color:#2C3E50}#examples-list li:hover{background:#f0f4f8}#examples-list li:last-child{border-bottom:none}.examples-label{margin:0 0 8px 0;font-size:12px;color:#7F8C8D;font-weight:600;text-transform:uppercase;letter-spacing:0.5px}#log{flex:1;min-height:150px;max-height:none;background:#1a1a2e;color:#00ff88;padding:10px 12px;font-family:'Courier New',monospace;font-size:12px;overflow-y:auto;border-radius:6px;border:1px solid #2d2d44;line-height:1.6}#log::-webkit-scrollbar{width:6px}#log::-webkit-scrollbar-track{background:#1a1a2e}#log::-webkit-scrollbar-thumb{background:#4C97FF;border-radius:3px}#log>div{border-bottom:1px solid rgba(255,255,255,0.03);padding:1px 0}.status-bar{font-size:11px;color:#95a5a6;text-align:center;margin-top:5px;padding-top:8px;border-top:1px solid #ecf0f1}#port-status-panel{margin-top:10px;background:#ffffff;border-radius:8px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,0.08);border:1px solid #e8ecf0}.port-status-grid{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:auto auto;gap:1px;background:#e8ecf0}.port-status-cell{background:#ffffff;padding:8px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;min-height:80px}.port-status-cell.hub-status{grid-column:1 / -1;flex-direction:row;justify-content:center;gap:10px;padding:12px}.port-status-cell img{width:40px;height:40px;object-fit:contain;margin-bottom:4px}.port-status-cell.hub-status img{width:50px;height:50px;margin-bottom:0}.port-status-label{font-size:10px;color:#7F8C8D;font-weight:600;text-transform:uppercase;letter-spacing:0.3px}.port-status-cell.hub-status .port-status-label{font-size:12px}.port-status-value{font-size:13px;color:#2C3E50;font-weight:700;margin-top:2px;min-height:16px;font-family:'Courier New',monospace}.port-status-cell.connected{background:#e8f8f0}.port-status-cell.disconnected{background:#fdf0f0}.hub-status-info{display:flex;align-items:center;gap:8px}.status-dot{width:10px;height:10px;border-radius:50%;background:#ccc}.status-dot.connected{background:#2ECC71;box-shadow:0 0 8px rgba(46,204,113,0.5);animation:pulse-dot 2s infinite}.status-dot.disconnected{background:#e74c3c}@keyframes pulse-dot{0%,100%{opacity:1}50%{opacity:0.6}}#output-panel{background:#fafbfc;border:1px solid #d0d7de;border-radius:6px;padding:8px 10px;font-family:'Courier New',monospace;font-size:12px;display:none;max-height:150px;overflow-y:auto;color:#2C3E50;margin-top:10px;box-shadow:inset 0 1px 3px rgba(0,0,0,0.05)}#output-panel.active{display:block}#output-panel .out-line{border-bottom:1px solid #eef1f4;padding:2px 0;word-break:break-all}#output-panel .out-line:last-child{border-bottom:none}#output-panel .out-time{color:#95a5a6;margin-right:8px;font-size:10px}#user-menu-container{position:fixed;bottom:20px;left:20px;z-index:3000;display:none}#user-menu-trigger{display:flex;align-items:center;gap:8px;background:#ffffff;padding:8px 16px;border-radius:30px;box-shadow:0 2px 10px rgba(0,0,0,0.15);cursor:pointer;transition:all 0.2s ease;border:1px solid #e0e0e0}#user-menu-trigger:hover{box-shadow:0 4px 15px rgba(0,0,0,0.2);transform:translateY(-1px)}#user-menu-trigger .user-icon{font-size:18px}#user-menu-trigger .user-name{font-weight:600;color:#2C3E50;font-size:13px}#user-menu-dropdown{position:fixed;top:8px;left:8px;background:#ffffff;border-radius:12px;box-shadow:0 5px 25px rgba(0,0,0,0.2);padding:8px 0;min-width:200px;display:none;border:1px solid #e0e0e0;overflow:hidden;max-height:calc(100vh - 56px);overflow-y:auto;transform-origin:bottom left}#user-menu-dropdown.show{display:block;animation:dropdownFadeIn 0.2s ease}@keyframes dropdownFadeIn{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.user-menu-item{display:flex;align-items:center;gap:10px;padding:10px 18px;cursor:pointer;font-size:13px;color:#2C3E50;transition:background 0.2s;border:none;background:transparent;width:100%;text-align:left}.user-menu-item:hover{background:#f0f4f8}.user-menu-item.danger{color:#e74c3c}.user-menu-item .menu-icon{font-size:16px;width:20px;text-align:center}.user-menu-divider{height:1px;background:#ecf0f1;margin:5px 0}@media (max-width:1024px){#sidebar{width:280px;min-width:280px;padding:12px 14px}}@media (max-width:768px){#app-container{flex-direction:column}#sidebar{width:100%;min-width:unset;height:50vh;border-left:none;border-top:1px solid #e8ecf0;padding:12px 14px}#blocklyDiv{height:50vh}#log{min-height:60px;max-height:120px}}@media (max-width:480px){#sidebar{padding:10px 12px;gap:6px}.app-title{font-size:1rem}button.app-btn{font-size:12px;padding:7px 10px}#log{font-size:10px;padding:8px 10px;min-height:50px;max-height:100px}}