html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}body{margin:0}[tabindex="-1"]:focus{outline:none}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}:root{--tower-red: #b71c1c;--tower-red-dark: #8f1414;--vc-blue: #1e40af;--ink: #1e293b;--muted: #64748b;--line: #e2e8f0;--surface: #ffffff;--bg: #f3f5f9;--radius: 10px}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;background:var(--bg);color:var(--ink);font-family:PingFang SC,Hiragino Sans GB,Microsoft YaHei,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}.app-shell{min-height:100vh;display:flex;flex-direction:column}.app-header{position:sticky;top:0;z-index:20;background:#fffffff5;border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.header-inner{max-width:1440px;margin:0 auto;padding:.65rem 1.25rem;display:flex;align-items:center;gap:1.25rem;flex-wrap:wrap}.brand{display:inline-flex;align-items:center;gap:.5rem;font-weight:700;font-size:1.02rem;white-space:nowrap}.brand-mark{display:inline-block;width:12px;height:12px;border-radius:3px;background:var(--tower-red);flex:none}.nav-tabs{display:flex;align-items:center;gap:.15rem;flex:1 1 520px;min-width:0;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}.nav-tabs::-webkit-scrollbar{display:none}.nav-tab{padding:.45rem .7rem;border-radius:7px;color:#475569;font-size:.9rem;white-space:nowrap;transition:background .15s ease,color .15s ease}.nav-tab:hover{background:#f1f5f9;color:var(--ink)}.nav-tab.active{color:var(--tower-red);background:#fef2f2;font-weight:600}.nav-tab.external{color:var(--muted);font-size:.85rem}.nav-tab.external span{font-size:.72rem;margin-left:2px}.header-status{display:flex;align-items:center;gap:.45rem;margin-left:auto;flex-wrap:wrap;flex-shrink:0}.header-status .ant-tag{border-radius:999px;margin-inline-end:0}.main-container{flex:1;width:100%;max-width:1440px;margin:0 auto;padding:1.15rem 1.25rem 2.5rem;min-width:0}.page-head{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin-bottom:1.05rem}.page-title{margin:0;font-size:1.32rem;line-height:1.35;font-weight:700}.page-subtitle{margin:.2rem 0 0;color:var(--muted);font-size:.82rem}.head-actions{display:flex;gap:.55rem;flex-wrap:wrap}.page-alert{margin-bottom:1rem}.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem}.grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 1px 2px #0f172a0a;margin-bottom:1rem;overflow:hidden;min-width:0}.card:last-child{margin-bottom:0}.card-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap;padding:.72rem 1rem;border-left:4px solid var(--tower-red);border-bottom:1px solid var(--line);background:#fff}.card-header.blue{border-left-color:var(--vc-blue)}.card-title{display:inline-flex;align-items:center;gap:.4rem;flex-wrap:wrap;min-width:0;font-size:.94rem;font-weight:700;color:#334155}.card-body{padding:1rem;min-width:0}.flush-table{padding:.5rem}.stat-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}.stat-grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}.stat-grid.four{grid-template-columns:repeat(4,minmax(0,1fr))}.stat-box{background:#f8fafc;border:1px solid var(--line);border-radius:8px;padding:.7rem .8rem;min-width:0}.stat-label{color:var(--muted);font-size:.75rem;margin-bottom:.25rem}.stat-value{font-size:1.15rem;font-weight:700;line-height:1.25;word-break:break-word}.stat-value.small{font-size:.92rem;font-weight:600}.stat-hint{color:var(--muted);font-size:.72rem;margin-top:.2rem}.latest-stats{margin-bottom:1rem}.tower-red{color:var(--tower-red)}.vc-blue{color:#1e40af}.green{color:#059669}.purple{color:#7c3aed}.muted{color:var(--muted)}.error-text{color:#dc2626}.ok-text{color:#16a34a}.small-note{font-size:.78rem}.title-note{font-size:.78rem;font-weight:400}.report-head{display:flex;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:.4rem}.report-text{white-space:pre-wrap;word-break:break-word;background:#f8fafc;border:1px solid var(--line);border-radius:8px;padding:.7rem .8rem;font-size:.82rem;line-height:1.65;color:#334155;max-height:15rem;overflow:auto}.report-text.warm{background:#fff7ed;border-color:#ffedd5}.report-image{display:block;max-width:100%;max-height:360px;margin:0 auto;border-radius:4px;cursor:pointer}.image-box{text-align:center}.empty-image{padding:2rem;text-align:center;color:var(--muted)}.section-title{font-size:.84rem;font-weight:700;color:#334155;margin:.9rem 0 .5rem}.section-title.no-top{margin-top:0}.log-box{margin:0;white-space:pre-wrap;word-break:break-word;background:#0f172a;color:#dbe4f0;border-radius:8px;padding:.75rem .85rem;font-family:SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:.75rem;line-height:1.55;max-height:20rem;overflow:auto}.device-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:.55rem;margin-top:.6rem}.device-item{border:1px solid var(--line);border-radius:7px;background:#f8fafc;padding:.5rem .6rem;font-size:.78rem}.device-name{font-weight:600;color:#334155}.device-code{color:var(--muted);font-family:SFMono-Regular,Consolas,monospace;font-size:.72rem;word-break:break-all;margin-top:.12rem}.device-meta{color:var(--muted);margin-top:.18rem}.toolbar{display:flex;align-items:flex-end;gap:.65rem;flex-wrap:wrap}.toolbar .field{min-width:150px}.toolbar .field.grow{flex:1 1 260px}.field-label{display:block;color:#475569;font-size:.76rem;font-weight:600;margin-bottom:.28rem}.login-page{min-height:100vh;min-height:100dvh;display:flex;align-items:center;justify-content:center;padding:1.25rem;padding-top:max(1.25rem,env(safe-area-inset-top));padding-bottom:max(1.25rem,env(safe-area-inset-bottom));padding-left:max(1.25rem,env(safe-area-inset-left));padding-right:max(1.25rem,env(safe-area-inset-right));background:radial-gradient(circle at 18% 12%,rgba(183,28,28,.09),transparent 42%),radial-gradient(circle at 82% 88%,rgba(30,64,175,.07),transparent 42%),var(--bg)}.login-card{width:100%;max-width:400px;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 18px 45px #0f172a17;overflow:hidden}.login-head{padding:1.15rem 1.25rem;border-top:4px solid var(--tower-red);border-bottom:1px solid var(--line);font-size:1.04rem;font-weight:700;display:flex;align-items:center;gap:.45rem}.login-body{padding:1.25rem}.login-alert{margin-bottom:1rem}.login-submit{width:100%;margin-top:1rem}.login-foot{color:var(--muted);font-size:.74rem;text-align:center;margin-top:1rem}.relogin-collapse{margin-top:.85rem}.relogin-alert{margin-bottom:.75rem}.relogin-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.75rem}.hint-text{font-size:.78rem}.relogin-box{margin-bottom:.75rem}.captcha-wrap{text-align:center;margin:.5rem 0}.captcha-wrap img{max-height:60px;max-width:100%}.relogin-controls{display:flex;gap:.5rem;flex-wrap:wrap}.relogin-controls .ant-input-affix-wrapper,.relogin-controls .ant-input{max-width:220px}.responsive-table,.responsive-table .ant-spin-nested-loading,.responsive-table .ant-spin-container{width:100%;min-width:0}.ant-table{--ant-table-header-bg: #f8fafc;font-size:.84rem;color:#334155}.ant-table-thead>tr>th{background:#f8fafc!important;color:#475569!important;font-weight:600;white-space:nowrap}.ant-table-tbody>tr.run-live-row>td{background:#fffbeb}.ant-table-tbody>tr.run-live-row:hover>td{background:#fef3c7!important}.detail-stack{display:flex;flex-direction:column;gap:.65rem;padding:.35rem .1rem}.run-live{display:inline-flex;align-items:center;gap:.35rem;color:#b45309;font-weight:600;white-space:nowrap}.run-live-reason{color:#b45309}.spin{display:inline-block;width:13px;height:13px;border:2px solid #fde68a;border-top-color:#b45309;border-radius:50%;animation:run-live-spin .8s linear infinite;vertical-align:-2px}@keyframes run-live-spin{to{transform:rotate(360deg)}}.mobile-data-list{display:grid;gap:.75rem}.mobile-data-fields{margin:0}.mobile-data-field{display:grid;grid-template-columns:minmax(78px,31%) minmax(0,1fr);gap:.65rem;align-items:start;padding:.45rem 0;line-height:1.5}.mobile-data-field+.mobile-data-field{border-top:1px solid #f1f5f9}.mobile-data-field dt{color:var(--muted);font-size:.76rem}.mobile-data-field dd{min-width:0;margin:0;font-size:.84rem;overflow-wrap:anywhere}.mobile-data-prose{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.mobile-data-field .ant-tag{height:auto;min-height:24px;max-width:100%;padding-block:3px;white-space:normal;line-height:1.4}.mobile-card-actions{display:flex;flex-wrap:wrap;gap:.5rem;padding:.45rem 0 .2rem;border-top:1px solid #f1f5f9}.mobile-data-field .ant-btn,.mobile-card-actions .ant-btn,.mobile-expand-toggle,.mobile-list-footer .ant-btn{min-height:40px;max-width:100%}.mobile-expand-toggle{width:100%;margin-top:.25rem}.mobile-expanded-content{padding:.5rem 0;border-top:1px solid var(--line);overflow-wrap:anywhere}.mobile-list-footer{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.75rem .25rem .25rem;font-size:.82rem;color:var(--muted)}.mobile-list-count{white-space:nowrap}.mobile-table-empty{padding:1rem 0}.responsive-dialog{max-width:calc(100vw - 1.5rem);top:0;margin-top:max(1rem,env(safe-area-inset-top));margin-bottom:max(1rem,env(safe-area-inset-bottom));padding-bottom:0}.responsive-dialog .ant-modal-content{display:flex;flex-direction:column;padding:0;max-height:calc(100vh - 2rem);max-height:calc(100dvh - 2rem - env(safe-area-inset-top) - env(safe-area-inset-bottom));overflow:hidden}.responsive-dialog .ant-modal-header{flex:none;margin:0;padding:1rem 1rem .75rem;border-bottom:1px solid var(--line)}.responsive-dialog .ant-modal-title{font-size:1rem;line-height:1.5;padding-right:2rem;overflow-wrap:anywhere}.responsive-dialog .ant-modal-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior-y:contain;padding:1rem;overflow-wrap:anywhere}.responsive-dialog .ant-modal-footer{flex:none;display:flex;gap:.5rem;margin:0;padding:.75rem 1rem;border-top:1px solid var(--line)}.responsive-dialog .ant-modal-footer .ant-btn{flex:1 1 0;min-width:0;min-height:44px;margin-inline-start:0}.responsive-dialog .ant-modal-close{top:.7rem;inset-inline-end:.7rem}@media(max-width:960px){.grid-2{grid-template-columns:1fr}.stat-grid,.stat-grid.four{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:720px){.login-page{align-items:flex-start}.app-shell{min-height:100dvh}.header-inner{padding:.55rem max(.8rem,env(safe-area-inset-right)) .55rem max(.8rem,env(safe-area-inset-left));gap:.5rem}.brand{font-size:.95rem}.nav-tabs{order:3;flex-basis:100%;min-width:0;padding-bottom:.1rem}.header-status{order:2;gap:.3rem}.header-status .ant-tag{font-size:.7rem;padding:0 .35rem}.main-container{padding:.85rem max(.75rem,env(safe-area-inset-right)) max(2rem,env(safe-area-inset-bottom)) max(.75rem,env(safe-area-inset-left))}.main-container>*,.grid-2>*,.card-body>*,.stat-box{min-width:0;max-width:100%}.page-title{font-size:1.12rem}.page-subtitle,.stat-hint,.card-title{overflow-wrap:anywhere}.card-header,.card-body{padding:.8rem}.flush-table{padding:.5rem}.stat-grid,.stat-grid.two,.stat-grid.four,.grid-3{grid-template-columns:1fr}.device-grid{grid-template-columns:minmax(0,1fr)}.toolbar{flex-direction:column;align-items:stretch}.toolbar .field,.toolbar .field.grow{flex:initial;min-width:0;width:100%}.toolbar-actions,.head-actions{display:flex;gap:.55rem;width:100%}.toolbar-actions .ant-btn,.head-actions .ant-btn{flex:1 1 0;min-width:0;min-height:40px;padding-inline:.5rem}.ant-input,.ant-input-affix-wrapper,.ant-input-affix-wrapper input,textarea.ant-input{font-size:16px}.ant-alert-content,.ant-form-item-control{min-width:0;overflow-wrap:anywhere}.mobile-data-card{min-width:0;border:1px solid var(--line);border-radius:8px;padding:.35rem .75rem;background:#fff}.mobile-data-card.run-live-row{background:#fffbeb;border-color:#fde68a}.responsive-dialog{width:calc(100vw - 1.5rem)!important;max-width:calc(100vw - 1.5rem);margin:max(1rem,env(safe-area-inset-top)) auto auto;padding-bottom:0}.responsive-dialog .ant-modal-content{max-height:calc(100dvh - 2rem - env(safe-area-inset-top) - env(safe-area-inset-bottom))}.responsive-dialog .ant-modal-close{width:40px;height:40px}}@media(orientation:portrait){.responsive-dialog .ant-modal-header,.responsive-dialog .ant-modal-body,.responsive-dialog .ant-modal-footer{padding-left:max(1rem,env(safe-area-inset-left));padding-right:max(1rem,env(safe-area-inset-right))}}@media(orientation:landscape){.responsive-dialog .ant-modal-header,.responsive-dialog .ant-modal-body,.responsive-dialog .ant-modal-footer{padding-left:max(2rem,env(safe-area-inset-left));padding-right:max(2rem,env(safe-area-inset-right))}}.mono{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:.82rem;overflow-wrap:anywhere}.tag-row{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.3rem;min-width:0}.stat-grid.five{grid-template-columns:repeat(5,minmax(0,1fr))}.stats-strip{margin-bottom:.9rem}.stats-error-box{border-color:#fecaca;background:#fef2f2}.stats-refreshed{margin-top:.6rem}.catalog-tabs{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.9rem}.device-summary{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem;margin:.75rem 0;color:var(--muted);font-size:.82rem}.pager{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.5rem;margin-top:.85rem;max-width:100%}.relations-query{display:flex;flex-wrap:wrap;gap:.65rem;margin-bottom:.9rem}.relations-query .ant-select,.relations-query .dimension-select{width:130px;flex:none}.relations-query .ant-input-affix-wrapper,.relations-query .ant-input{flex:1 1 220px;min-width:0;max-width:360px}.cell-entity,.cell-project{display:flex;flex-direction:column;min-width:0}.cell-primary{color:var(--ink);overflow-wrap:anywhere}.cell-secondary{font-size:.78rem;color:var(--muted);overflow-wrap:anywhere}.confirm-details{display:flex;flex-direction:column;gap:.5rem;margin:.85rem 0}.confirm-row{display:flex;gap:.6rem;font-size:.9rem;line-height:1.45;min-width:0}.confirm-row dt{flex:none;width:78px;color:var(--muted)}.confirm-row dd{margin:0;min-width:0;overflow-wrap:anywhere}.confirm-guard{border:1px solid #fecaca;background:#fef2f2;border-radius:8px;padding:.7rem .8rem}.confirm-guard .ant-checkbox-wrapper{align-items:flex-start;color:#991b1b;font-weight:600;line-height:1.5}.confirm-guard-hint{margin-top:.3rem;padding-left:1.5rem;color:#b91c1c;font-size:.78rem;line-height:1.5}.dialog-hint{margin-bottom:.85rem}.settings-form{display:flex;flex-direction:column;gap:.85rem}.settings-notes{margin-top:1rem}.firewall-filters{margin-bottom:.75rem}.flow-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:.75rem}.flow-card{display:flex;align-items:stretch;gap:.4rem;border:1px solid var(--line);border-radius:8px;background:#f8fafc;padding:.65rem;min-width:0}.flow-node{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:.2rem;padding:.5rem .6rem;border-radius:7px;background:#fff;border:1px solid var(--line)}.flow-node.external{border-left:3px solid #dc2626}.flow-node.gateway{border-left:3px solid var(--tower-red)}.flow-node.internal{border-left:3px solid #16a34a}.flow-label{color:var(--muted);font-size:.7rem}.flow-node strong,.flow-node small{min-width:0;overflow-wrap:anywhere}.flow-node strong{font-size:.8rem}.flow-node small{color:var(--muted);font-size:.7rem}.flow-arrow{align-self:center;color:#94a3b8;font-size:1.05rem;flex:none}.iface-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.55rem}.iface-card{border:1px solid var(--line);border-radius:7px;background:#f8fafc;padding:.55rem .65rem;min-width:0;text-align:left;cursor:pointer;color:inherit;font:inherit}.iface-card.active{border-color:#2563eb;background:#eff6ff}.iface-top,.addr-list{display:flex;flex-direction:column;gap:.15rem;min-width:0}.iface-name{font-weight:700;font-size:.82rem;overflow-wrap:anywhere}.zone-list,.rule-list{display:flex;flex-direction:column;gap:.5rem}.zone-row,.rule-row{border:1px solid var(--line);border-radius:7px;background:#f8fafc;padding:.55rem .65rem;min-width:0}.zone-members{display:flex;flex-wrap:wrap;gap:.3rem;margin-top:.35rem}.rule-head{display:flex;align-items:center;gap:.45rem;flex-wrap:wrap;font-size:.82rem;min-width:0}.rule-detail{display:flex;flex-wrap:wrap;gap:.3rem .9rem;margin-top:.35rem;color:#475569;font-size:.76rem;overflow-wrap:anywhere}.nightly-collapse{margin:.85rem 0}.nightly-unresolved{border-width:2px}.nightly-unresolved .ant-alert-message{font-weight:700}.ai-review{background:#f0fdf4;border-color:#bbf7d0;margin-bottom:1rem}.ai-review-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.35rem}.run-group-list{display:flex;flex-direction:column;gap:.3rem}.run-group-row{display:flex;flex-wrap:wrap;gap:.6rem;font-size:.82rem}@media(max-width:960px){.stat-grid.five{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:720px){.stat-grid.five,.flow-grid{grid-template-columns:minmax(0,1fr)}.flow-card{flex-direction:column}.flow-arrow{transform:rotate(90deg);align-self:center}.relations-query .ant-select,.relations-query .ant-input-affix-wrapper,.relations-query .ant-input,.relations-query .ant-btn{width:100%;max-width:none;flex:initial;min-height:40px}.confirm-row{flex-direction:column;gap:.15rem}.confirm-row dt{width:auto;font-size:.78rem}.pager{justify-content:space-between;overflow-x:auto}.iface-grid{grid-template-columns:minmax(0,1fr)}}
