.pt-search-wrap{position:relative;display:flex;align-items:center}.pt-search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);pointer-events:none;opacity:.5;font-size:14px}.pt-search-input{width:100%;padding:9px 36px;font-size:14px;color:var(--text);background:var(--card-alt);border:1px solid var(--border);border-radius:10px;outline:none;transition:border-color .15s}.pt-search-input:focus{border-color:var(--primary)}.pt-clear-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--sub);background:transparent;border:none;cursor:pointer;border-radius:50%}.pt-clear-btn:hover{background:var(--card);color:var(--text)}.pt-chip-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.pt-chip-label{font-size:11px;font-weight:700;color:var(--sub);letter-spacing:.05em;flex-shrink:0;width:36px}.pt-chips{display:flex;flex-wrap:wrap;gap:6px}.pt-chip{padding:4px 12px;border-radius:999px;font-size:12px;font-weight:500;color:var(--sub);background:var(--card-alt);border:1px solid var(--border);cursor:pointer;transition:all .15s}.pt-chip:hover{color:var(--primary);border-color:var(--primary)}.pt-chip.active{color:#fff;background:var(--primary);border-color:var(--primary)}.pt-list{display:flex;flex-direction:column;gap:10px}.pt-row{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 16px;transition:box-shadow .2s,background .3s;scroll-margin-top:16px}.pt-row:hover{box-shadow:var(--shadow-hover)}.pt-row-flash{background:var(--card-alt);box-shadow:0 0 0 2px var(--primary);animation:pt-flash 1.4s ease-out}@keyframes pt-flash{0%{background:#6366f11f}to{background:var(--card)}}.pt-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:6px}.pt-port{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:18px;font-weight:700;color:var(--text);text-decoration:none;letter-spacing:.02em}.pt-port:hover{color:var(--primary)}.pt-badge{display:inline-block;padding:1px 8px;font-size:11px;font-weight:600;color:#fff;border-radius:4px;letter-spacing:.02em}.pt-badge-tcp{background:#2196f3}.pt-badge-udp{background:#d97706}.pt-badge-both{background:#8e24aa}.pt-service{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;font-weight:600;color:var(--text)}.pt-zh{font-size:12px;color:var(--sub)}.pt-tag{display:inline-block;padding:1px 7px;font-size:11px;color:var(--sub);background:var(--card-alt);border:1px solid var(--border);border-radius:4px}.pt-tag-ok{color:#2e7d32;border-color:#43a04759;background:#43a04714}.pt-tag-warn{color:#b75f00;border-color:#f59e0b59;background:#f59e0b14}.pt-tag-risk{color:#c1121f;border-color:#dc262666;background:#dc262614;font-weight:600}.pt-tag-risk-med{color:#b75f00;border-color:#f59e0b73;background:#f59e0b1a}[data-theme=dark] .pt-tag-ok{color:#6ee7b7;background:#43a04724}[data-theme=dark] .pt-tag-warn{color:#fbbf24;background:#f59e0b24}[data-theme=dark] .pt-tag-risk{color:#fca5a5;background:#dc262629}[data-theme=dark] .pt-tag-risk-med{color:#fcd34d;background:#f59e0b29}.pt-desc{font-size:13px;line-height:1.6;color:var(--sub);margin:4px 0 8px}.pt-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.pt-copy-btn{padding:4px 12px;font-size:12px;font-weight:500;color:var(--sub);background:var(--card-alt);border:1px solid var(--border);border-radius:6px;cursor:pointer;transition:all .15s}.pt-copy-btn:hover{color:#fff;background:var(--primary);border-color:var(--primary)}.pt-spec{font-size:12px;color:var(--sub);text-decoration:none}.pt-spec:hover{color:var(--primary)}.pt-empty{padding:32px 16px;text-align:center;color:var(--sub);font-size:13px}.pt-toast{position:fixed;bottom:32px;left:50%;transform:translate(-50%) translateY(8px);padding:9px 18px;border-radius:20px;font-size:13px;font-weight:600;color:#fff;background:#43a047;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:999;white-space:nowrap}.pt-toast[data-kind=err]{background:#f44336}.pt-toast.show{opacity:1;transform:translate(-50%) translateY(0)}.hidden{display:none!important}@media(max-width:640px){.pt-chip-label{width:auto}}
