:root{--bg: #f6f8fa;--panel: #fff;--muted: #6b7280;--accent: #0ea5a4;--danger: #ef4444;--warn: #d97706;--success: #16a34a;--text: #0f1724;--border: rgba(15, 23, 36, 0.08);--border-hover: rgba(15, 23, 36, 0.2);--mono: "SFMono-Regular", "Menlo", "Monaco", "Roboto Mono", "Courier New", monospace;--gap: 12px;--radius: 8px}.blinkShadow{animation:blinkShadow .5s 1}@keyframes blinkShadow{50%{box-shadow:0 0 10px var(--success);border-color:var(--success)}}*{box-sizing:border-box}html,body{height:100%;margin:0;background:linear-gradient(180deg, #fbfdfe 0%, #f3f6f8 100%);color:var(--text);font-family:var(--mono);font-size:13px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.app-container{display:flex;flex-direction:column;gap:var(--gap);padding:16px;height:100vh;min-height:100vh}.app-container .top-controls{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap}.panel{background:var(--panel);border:1px solid var(--border);padding:10px;border-radius:var(--radius);color:var(--text);box-shadow:0 1px 2px rgba(16,24,40,.03)}.panel:hover{border-color:var(--border-hover)}.panel .panel-title{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;margin-bottom:3px;font-weight:600;color:var(--muted);font-size:13px}.panel .panel-title .status-opened,.panel .panel-title .status-closed{background-color:var(--danger);height:10px;width:10px;display:inline-block;vertical-align:middle;border-radius:50%;margin-right:4px}.panel .panel-title .status-opened.status-opened,.panel .panel-title .status-closed.status-opened{background-color:var(--success)}.panel .panel-title .port-source-tabs{display:flex;gap:4px;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center}.panel .panel-title .port-source-tabs .port-source-link{font-size:12px;font-weight:normal;text-decoration:none;color:var(--accent)}.panel .panel-title .port-source-tabs .port-source-link.active{font-weight:bold;color:var(--muted)}.panel .panel-title .port-source-tabs .port-source-link:hover{text-decoration:underline}.panel .panel-title .panel-title-status{font-weight:normal;display:flex;align-items:center}.panel .panel-title .port-param-info{font-size:12px;font-weight:normal}.panel .panel-title .port-param-info .port-param-value{font-weight:bold}.panel .panel-title .port-param-info .port-param-sep{opacity:.8}.panel .panel-title .port-param-info .port-param-edit{padding-left:5px;padding-right:5px;cursor:pointer;color:var(--accent);font-size:12px}.panel .panel-title a{text-decoration:none;font-weight:normal;color:var(--accent)}.panel .panel-title a:hover{text-decoration:underline}.panel .panel-title .panel-title-left{display:flex;align-items:center;flex-wrap:nowrap;flex-shrink:0;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none}.panel .panel-title .panel-title-left .panel-title-left-status{display:flex;align-items:center;margin-left:10px;font-weight:normal;font-size:12px;flex-shrink:0}.panel .panel-title .panel-title-left>span{white-space:nowrap;flex-shrink:0;padding-left:6px;padding-right:6px;height:33px;line-height:33px}.panel .panel-title .panel-title-left>span:first-child{padding-left:0}.panel .panel-title .panel-title-left>span:last-child{padding-right:0}.panel .panel-title .panel-title-right{display:flex;gap:8px;align-items:center;flex-wrap:nowrap;flex-shrink:0}.panel .panel-title .panel-title-right .panel-title-right button{white-space:nowrap;flex-shrink:0}.panel .panel-title .panel-title-form{font-weight:normal;color:var(--text);display:flex;align-items:center;justify-content:center;gap:4px}.panel .panel-title .panel-title-form label{display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}.panel .panel-title .panel-title-form .inc-group{display:flex;align-items:center;flex-wrap:wrap;gap:4px}.panel .panel-title.title-stacked{flex-direction:column;align-items:flex-start;gap:0px}.panel .panel-title .panel-title-form.inc-stacked{flex-direction:column;align-items:flex-start;gap:0px}.send-group{display:flex;align-items:center;gap:4px}.controls-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}select,input[type=text],input[type=number],textarea{background:#fbfdff;color:var(--text);border:1px solid var(--border);padding:6px 8px;border-radius:6px;font-family:var(--mono);font-size:13px;outline:none}select:disabled,input[type=text]:disabled,input[type=number]:disabled,textarea:disabled{cursor:default;background-color:light-dark(rgba(239, 239, 239, 0.6), rgba(59, 59, 59, 0.6));color:light-dark(rgb(84, 84, 84), rgb(170, 170, 170))}textarea{resize:vertical;line-height:1.5;white-space:pre;-moz-tab-size:4;-o-tab-size:4;tab-size:4}select{-webkit-user-select:none;-moz-user-select:none;user-select:none}button{background:linear-gradient(180deg, #fff, #fbfbfb);color:var(--text);border:1px solid var(--border);padding:6px 8px;border-radius:6px;cursor:pointer;font-family:var(--mono);font-size:13px;transition:all .12s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none}button:hover{transform:translateY(-1px);box-shadow:0 6px 18px rgba(16,24,40,.06)}button:active{transform:translateY(0)}button:disabled{opacity:.6;cursor:not-allowed}button.selected{border-color:var(--success);color:var(--success)}.btn-open{border-color:rgba(14,165,164,.18);color:var(--accent)}.btn-close{border-color:rgba(239,68,68,.12);color:var(--danger)}.btn-send{border-color:rgba(22,163,74,.12);color:var(--success)}.btn-reset{border-color:rgba(239,68,68,.12);color:var(--danger)}.main-area{display:flex;gap:12px;flex:1 1 auto;min-height:0}.main-area .left{flex:1 1 60%;display:flex;flex-direction:column;min-width:0}.main-area .right{flex:0 0 36%;display:flex;flex-direction:column;min-width:0;overflow:visible}.comm-panel{display:flex;flex-direction:column;height:100%}.comm-panel #comm-table-body{overflow:auto;scrollbar-gutter:stable;border-bottom:1px solid var(--border);border-left:1px solid var(--border);border-right:1px solid var(--border);flex:1 1 auto;min-height:0;background:#fff;border-radius:0 0 8px 8px;position:relative}.comm-panel>table.comm-table{border-right:24px solid rgba(0,0,0,0)}.comm-panel .comm-table{width:100%;table-layout:fixed;border-collapse:collapse;font-family:var(--mono);font-size:13px;color:var(--text)}.comm-panel .comm-table .data,.comm-panel .comm-table .id{font-family:monospace}.comm-panel .comm-table .label{font-size:12px;border-radius:4px;padding:2px;margin-right:6px;background:#0074fb;color:#fff;-webkit-user-select:none;-moz-user-select:none;user-select:none}.comm-panel .comm-table.comm-table-can .index{width:8%}.comm-panel .comm-table.comm-table-can .dir{width:8%}.comm-panel .comm-table.comm-table-can .time{width:14%}.comm-panel .comm-table.comm-table-can .id{width:15%}.comm-panel .comm-table.comm-table-can .format{width:8%}.comm-panel .comm-table.comm-table-can .type{width:8%}.comm-panel .comm-table.comm-table-can .dlc{width:6%}.comm-panel .comm-table tbody{white-space:nowrap}.comm-panel .comm-table tbody.wrap .data{white-space:normal;word-break:normal;overflow-wrap:break-word}.comm-panel .comm-table.comm-table-serial .id,.comm-panel .comm-table.comm-table-serial .format,.comm-panel .comm-table.comm-table-serial .type,.comm-panel .comm-table.comm-table-serial .dlc{display:none}.comm-panel .comm-table.comm-table-serial .index{width:6%;text-overflow:ellipsis;white-space:nowrap}.comm-panel .comm-table.comm-table-serial .dir{width:8%;text-overflow:ellipsis;white-space:nowrap}.comm-panel .comm-table.comm-table-serial .time{width:15%;white-space:nowrap}.comm-panel .comm-table.comm-table-serial .data{width:71%}.comm-panel .comm-table thead th{position:sticky;top:0;background:#fff;border-bottom:1px solid var(--border);padding:8px 11px;text-align:left;color:var(--muted);font-weight:700;font-size:12px}.comm-panel .comm-table tbody tr{border-bottom:1px solid rgba(15,23,36,.03)}.comm-panel .comm-table tbody tr:hover{border-bottom:1px solid var(--accent);background:rgba(14,165,164,.1)}.comm-panel .comm-table tbody tr.selected{background:rgba(14,165,164,.2)}@keyframes flash-bg-yellow{0%{background-color:#ff9}100%{background-color:rgba(0,0,0,0)}}@keyframes flash-bg-green{0%{background-color:#c8e6c9}100%{background-color:rgba(0,0,0,0)}}.comm-panel .comm-table tbody tr.received{color:var(--warn)}.comm-panel .comm-table tbody tr.sent{color:var(--success)}.comm-panel .comm-table tbody tr.flash.received{animation:flash-bg-yellow .4s ease-in-out}.comm-panel .comm-table tbody tr.flash.sent{animation:flash-bg-green .4s ease-in-out}.comm-panel .comm-table tbody tr td{padding:6px 11px;white-space:nowrap;text-overflow:ellipsis;vertical-align:top;font-size:13px;line-height:1.3;-webkit-user-select:text;-moz-user-select:text;user-select:text}.debug-panel{display:flex;flex-direction:column;height:100%;overflow:visible;position:relative}.debug-panel #debug-body{width:100%;resize:none;border-radius:8px;border:1px solid var(--border);background:#fff;color:var(--text);padding:10px;font-family:var(--mono);font-size:13px;line-height:1.4;flex:1 1 auto;min-height:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;user-select:text}.debug-panel #debug-body .log-line{display:flex;align-items:flex-start}.debug-panel #debug-body .log-time{flex-shrink:0;white-space:pre;margin-right:5px;opacity:.6}.debug-panel #debug-body .log-content{flex:1;min-width:0;white-space:pre;word-break:break-word}.debug-panel #debug-body .log-info,.debug-panel #debug-body .log-warn,.debug-panel #debug-body .log-error{white-space:pre;word-break:break-word}.debug-panel #debug-body .log-debug{color:var(--muted)}.debug-panel #debug-body .log-info{color:var(--text)}.debug-panel #debug-body .log-warn{color:var(--warn)}.debug-panel #debug-body .log-error{color:var(--danger)}.debug-panel #debug-body .log-notice{color:var(--muted)}.debug-panel #debug-body .log-success{color:blue}.debug-panel #debug-body .log-hr{background-color:var(--border);height:1px;margin:5px 0}.debug-panel #debug-body .log-hr .log-time{display:none}.debug-panel #favorite-body{width:100%;resize:none;border-radius:8px;color:var(--text);font-family:var(--mono);font-size:13px;line-height:1.4;flex:1 1 auto;min-height:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;user-select:text;display:flex;flex-direction:column;position:relative}.debug-panel #favorite-body .log-info,.debug-panel #favorite-body .log-warn,.debug-panel #favorite-body .log-error{white-space:pre;word-break:break-word}.debug-panel #favorite-body .log-debug{color:var(--muted)}.debug-panel #favorite-body .log-info{color:var(--text)}.debug-panel #favorite-body .log-warn{color:var(--warn)}.debug-panel #favorite-body .log-error{color:var(--danger)}.hint{color:var(--muted);font-size:12px}.compact button{padding:5px 8px;font-size:12px}.status-pill{display:inline-block;padding:4px 8px;border-radius:999px;font-size:12px;color:#fff}.status-online{background:var(--accent)}.status-offline{background:#9ca3af}.text-danger{color:var(--danger)}.text-success{color:var(--success)}.text-warn{color:var(--warn)}.no_select,.no_select td{-webkit-user-select:none !important;-moz-user-select:none !important;user-select:none !important}.tab-active{color:var(--accent);font-weight:700}.fav-folder-bar{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;gap:8px;flex-wrap:nowrap;padding:4px 2px}.fav-folder-bar button:hover{transform:none;box-shadow:0 4px 14px rgba(14,165,164,.15)}.fav-folder-tabs{display:flex;gap:6px;align-items:center;flex:1;min-width:0;overflow-x:auto;overflow-y:hidden;white-space:nowrap}.fav-folder-tabs button{white-space:nowrap;flex-shrink:0}.fav-folder-actions{display:flex;gap:6px;flex-shrink:0;margin-left:auto;overflow:visible}.fav-folder-content{flex:1 1 auto;overflow:auto;min-height:0}.fav-folder-content .log-line{display:flex;align-items:flex-start}.fav-folder-content .log-time{flex-shrink:0;width:120px;white-space:pre}.fav-folder-content .log-content{flex:1;min-width:0;white-space:pre;word-break:break-word}.fav-folder-content .log-info,.fav-folder-content .log-warn,.fav-folder-content .log-error{white-space:pre;word-break:break-word}.fav-folder-content .log-debug{color:var(--muted)}.fav-folder-content .log-info{color:var(--text)}.fav-folder-content .log-warn{color:var(--warn)}.fav-folder-content .log-error{color:var(--danger)}.fav-folder-content .fav-log-group{margin-bottom:12px;border:1px solid var(--border);border-radius:6px;padding:8px}.fav-folder-content .fav-log-header{display:flex;align-items:center;gap:6px;margin-bottom:2px;color:var(--muted);font-size:12px}.fav-folder-content .fav-log-header-btns{display:flex;gap:4px;flex-shrink:0;margin-left:auto}.fav-folder-content .fav-log-time{flex-shrink:0}.fav-folder-content .fav-log-subject{color:var(--text);font-weight:600}.fav-folder-content .fav-log-detail{display:flex;flex-wrap:wrap;gap:2px 12px;align-items:center;color:var(--text)}.fav-folder-content .fav-log-detail span:first-child,.fav-folder-content .fav-log-detail span:nth-child(3),.fav-folder-content .fav-log-detail span:nth-child(5){color:var(--text);font-size:12px}.fav-folder-content .fav-log-detail+.fav-log-detail{margin-top:5px}.fav-folder-content .fav-log-spacer{display:inline-block;width:8px}.folder-modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.3);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.folder-modal{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px 24px;max-width:320px;box-shadow:0 8px 24px rgba(0,0,0,.12)}.folder-modal .folder-modal-title{font-weight:600;margin-bottom:10px;font-size:14px}.folder-modal input{width:100%;margin-bottom:10px}.folder-modal .folder-modal-btns{display:flex;gap:8px;justify-content:flex-end;align-items:center}.favorite-modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.3);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.favorite-modal{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px;min-width:300px;box-shadow:0 8px 24px rgba(0,0,0,.12)}.favorite-modal .favorite-modal-title{font-weight:600;margin-bottom:10px;font-size:14px}.favorite-modal .favorite-modal-body{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}.favorite-modal .favorite-modal-body .favorite-modal-label{font-size:12px;color:var(--muted);font-weight:600;margin-bottom:2px}.favorite-modal .favorite-modal-body input,.favorite-modal .favorite-modal-body select{width:100%}.favorite-modal .favorite-modal-preview{font-size:12px;color:var(--muted);margin-top:4px}.favorite-modal .favorite-modal-btns{display:flex;gap:8px;justify-content:flex-end}.serial-config-row{display:flex;align-items:center;gap:8px;margin-bottom:10px}.serial-config-row label{font-size:12px;color:var(--muted);font-weight:600;min-width:50px}.serial-config-row select{flex:1}.test-config-modal{max-width:640px}.test-config-modal .test-config-body{display:flex;gap:12px;margin-bottom:10px}.test-config-modal .test-config-col{flex:1;display:flex;flex-direction:column}.test-config-modal .test-config-col textarea{width:100%;font-family:var(--mono);font-size:13px;resize:vertical}@keyframes fadeIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.plugin_tool_result{animation:fadeIn .3s ease-out}#function-body .function-items{display:flex;flex-wrap:wrap;gap:8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}#function-body .function-items .function-item{display:inline-flex;align-items:center}#function-body .function-items .function-item label{cursor:pointer}#panels_placeholder{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:visible}plugin-panel{display:none;overflow-y:auto;flex:1 1 auto;min-height:0}plugin-panel.plugin-panel-loaded{display:block}plugin-feature{display:none;margin-top:10px;background:#fdfdfd;border:1px solid var(--border);padding:10px;border-radius:5px;color:var(--text);position:relative}plugin-feature.plugin-feature-loaded{display:block}plugin-feature:hover{background:#fafafa}plugin-feature[title]::before{content:attr(title);display:block;color:#555;margin-bottom:5px}plugin-feature[status]::after{content:attr(status);display:block;color:#555;position:absolute;top:10px;right:10px}plugin-feature label{display:inline-flex;align-items:center;cursor:pointer}plugin-feature a{text-decoration:none;color:var(--accent);vertical-align:middle}plugin-feature a:hover{text-decoration:underline}plugin-debugger{display:none}plugin-debugger.plugin-feature-loaded{display:block}.plugin-panel-script-item{margin-bottom:10px;background:#fdfdfd;border:1px solid var(--border);padding:10px;border-radius:5px;color:var(--text);position:relative}.plugin-panel-script-item:not(.loaded):hover{background:#fafafa;background:rgba(14,165,164,.06)}.plugin-panel-script-item.loaded{border-color:var(--accent);background:rgba(14,165,164,.06);box-shadow:0 0 0 1px var(--accent) inset}.plugin-panel-script-item .plugin-panel-script-item-info{display:flex;justify-content:space-between;color:#555;align-items:center}.plugin-panel-script-item .plugin-panel-script-item-info .title{display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex:1;cursor:pointer;padding:10px;margin:-10px;margin-right:0;padding-right:0;z-index:1;overflow:hidden;white-space:nowrap}.plugin-panel-script-item .plugin-panel-script-item-info .title.force{cursor:default}.plugin-panel-script-item .plugin-panel-script-item-info .title .name{pointer-events:none;flex:1;display:flex;align-items:center}.plugin-panel-script-item .plugin-panel-script-item-info .title .name input{margin:0;margin-right:3px}.plugin-panel-script-item .plugin-panel-script-item-info .title .description{font-size:12px;margin-left:10px;color:var(--muted);text-overflow:ellipsis;overflow:hidden}.plugin-panel-script-item .plugin-panel-script-item-info .btns{display:flex;gap:8px;-webkit-user-select:none;-moz-user-select:none;user-select:none;margin-left:10px}.plugin-panel-script-item .plugin-panel-script-item-info .btns a{text-decoration:none;color:var(--accent);vertical-align:middle}.plugin-panel-script-item .plugin-panel-script-item-info .btns a:hover{text-decoration:underline}.plugin-panel-script-item .plugin-panel-script-item-buttons{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.body-loading .folder-modal-overlay{display:none !important}.body-loading .favorite-modal-overlay{display:none !important}.filter-checkbox{display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-size:12px;color:var(--text)}.filter-checkbox input[type=checkbox]{margin:0;vertical-align:middle;cursor:pointer}.filter-checkbox span{line-height:1}.filter-cat-badge{font-size:11px;color:var(--accent);background:rgba(14,165,164,.1);padding:1px 6px;border-radius:10px;margin-left:2px;white-space:nowrap}.controls-row.nowrap{flex-flow:nowrap;white-space:nowrap}.controls-row.full-width{width:100%}.port-select{width:160px}.target-port-select{min-width:100px}.baud-rate-select{width:120px;text-align:right}.can-baud-display{width:180px;text-align:right}.can-rtr-select,.can-dlc-select{width:80px}.inline-textarea,.send-data-serial,.send-data-can,.send-can-id{white-space:pre-wrap;overflow-wrap:anywhere;overflow-y:hidden;resize:none}.send-can-id{width:120px}.send-data-can{flex:1;min-width:200px;max-width:220px}.send-data-serial{flex:1;min-width:220px}.count-sep{margin:0 4px;color:#ccc}.panel-tab{cursor:pointer}.empty-state{color:var(--muted);padding:16px;text-align:center}.edit-comm-modal{width:350px}.edit-comm-modal textarea{width:100%}.folder-modal-select{width:100%;margin-bottom:10px}.folder-modal-textarea{width:100%;margin-bottom:10px}.filter-folder-bar{margin:4px 0}.panel-body-scroll{overflow-y:auto;flex:1 1 auto}.filter-move-select{font-size:11px;padding:2px 4px;width:auto}.filter-move-select option.placeholder-hidden{display:none}.filter-id-input{width:150px}.filter-data-input{width:200px}.tool-btn{margin-bottom:8px;margin-right:8px}.plugin_tool_result{margin-bottom:12px}.plugin-panel-body{overflow-y:auto}.plugin-disable-link{z-index:2147483647}.debug-hint{flex:1}.modal-overlay-high{z-index:100}.config-modal{min-width:240px}.can-config-baud-display{width:180px;text-align:center}.btn-reset-offset{margin-right:43px}.modal-btn-spacer{flex:1}@media(max-width: 1000px){.app-container{padding:8px}.main-area{flex-direction:column}.main-area .left,.main-area .right{width:100%}.main-area .right{order:2}}@media(max-width: 700px){.controls-row{gap:6px}.panel{padding:8px}.panel .panel-title{font-size:12px}button{padding:6px 8px;font-size:12px}}