:root{--purple: #533afd;--purple-hover: #4434d4;--purple-soft: #f1efff;--navy: #061b31;--ink: #273951;--body: #64748d;--white: #ffffff;--border: #e5edf5;--border-purple: #b9b9f9;--bg: #f6f9fc;--brand-dark: #1c1e54;--success: #15be53;--success-text: #108c3d;--success-soft: rgba(21, 190, 83, .12);--danger: #dc2626;--danger-soft: rgba(220, 38, 38, .08);--warning: #b45309;--warning-soft: rgba(180, 83, 9, .1);--shadow-1: rgba(23, 23, 23, .06) 0px 3px 6px;--shadow-2: rgba(23, 23, 23, .08) 0px 15px 35px;--shadow-3: rgba(50, 50, 93, .25) 0px 30px 45px -30px, rgba(0, 0, 0, .1) 0px 18px 36px -18px;--r: 4px;--r-md: 6px;--r-lg: 8px;--font: "Source Sans 3", -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", "PingFang SC", sans-serif;--mono: "Source Code Pro", "SF Mono", Consolas, monospace}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}body{font-family:var(--font);color:var(--navy);background:var(--bg);font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased}.app-shell{display:flex;height:100vh;overflow:hidden}.sidebar{width:232px;flex-shrink:0;background:var(--brand-dark);background-image:linear-gradient(180deg,#23255f,#1c1e54 60%,#171a4a);display:flex;flex-direction:column;padding:20px 14px 14px}.sidebar-brand{display:flex;align-items:center;gap:11px;padding:0 8px 24px}.brand-logo{width:34px;height:34px;border-radius:8px;background:linear-gradient(135deg,#665efd,#533afd);color:#fff;font-size:16px;font-weight:600;display:flex;align-items:center;justify-content:center;box-shadow:#32325d66 0 8px 16px -6px}.brand-name{font-size:14px;font-weight:600;color:#fff;letter-spacing:.3px}.brand-sub{font-size:11px;color:#ffffff73}.sidebar-nav{flex:1;display:flex;flex-direction:column;gap:2px}.nav-btn{display:flex;align-items:center;gap:11px;width:100%;padding:9px 10px;border:none;border-radius:6px;background:transparent;cursor:pointer;text-align:left;font-family:var(--font);color:#ffffff9e;transition:background .15s,color .15s}.nav-btn:hover{background:#ffffff0f;color:#fff}.nav-btn.active{background:#533afd59;color:#fff;box-shadow:inset 0 0 0 1px #b9b9f940}.nav-icon{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0}.nav-icon svg{width:16px;height:16px}.nav-text{display:flex;flex-direction:column;line-height:1.25}.nav-label{font-size:13px;font-weight:500}.nav-desc{font-size:10.5px;color:#ffffff8c}.nav-btn.active .nav-desc{color:#ffffffa6}.sidebar-footer{border-top:1px solid rgba(255,255,255,.08);padding-top:12px}.user-chip{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:6px;background:#ffffff0a}.user-avatar{width:28px;height:28px;border-radius:6px;background:linear-gradient(135deg,#665efd,#533afd);color:#fff;font-weight:600;font-size:12px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.user-meta{flex:1;min-width:0;line-height:1.3}.user-name{font-size:12px;font-weight:600;color:#ffffffd9}.user-role{font-size:10.5px;color:#fff6}.user-chip .btn{color:#ffffffa6;font-size:11px;padding:4px 9px;background:#ffffff14;border-color:transparent}.user-chip .btn:hover{color:#fff;background:#ffffff29}.main-area{flex:1;display:flex;flex-direction:column;overflow:hidden}.page-header{padding:22px 32px 6px}.page-header h1{margin:0;font-size:22px;font-weight:300;letter-spacing:-.3px;color:var(--navy)}.page-header p{margin:3px 0 0;color:var(--body);font-size:13px}.page{flex:1;overflow-y:auto;padding:14px 32px 48px;max-width:1200px;width:100%}.page.center{display:flex;align-items:center;justify-content:center}.card{background:var(--white);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow-1);padding:20px 22px;margin-bottom:20px;transition:box-shadow .2s}.card:hover{box-shadow:var(--shadow-2)}.card h3{margin:0 0 12px;font-size:15px;font-weight:400;letter-spacing:-.1px;color:var(--navy)}.card .muted{margin-top:4px}.btn{font-family:var(--font);font-size:13px;font-weight:400;height:32px;padding:0 14px;border-radius:var(--r);border:1px solid var(--border);background:var(--white);color:var(--navy);cursor:pointer;transition:all .15s;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;gap:6px}.btn:hover{border-color:var(--border-purple);color:var(--purple);background:#533afd08}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--purple);border-color:var(--purple);color:#fff}.btn-primary:hover{background:var(--purple-hover);border-color:var(--purple-hover);color:#fff}.btn-ghost{border-color:transparent;background:transparent;color:var(--body)}.btn-ghost:hover{background:var(--purple-soft);color:var(--purple);border-color:transparent}.btn-sm{padding:3px 9px;font-size:12px;border-radius:var(--r)}.btn-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.tbl{width:100%;border-collapse:collapse;font-size:13px;background:var(--white);border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden}.tbl th{background:var(--bg);color:var(--ink);font-weight:500;text-align:left;padding:9px 14px;border-bottom:1px solid var(--border);font-size:12.5px;white-space:nowrap}.tbl td{padding:9px 14px;border-bottom:1px solid var(--border);vertical-align:top}.tbl tr:last-child td{border-bottom:none}.tbl tr:hover td{background:#fafbff}.tbl tbody tr:nth-child(2n) td{background:#f6f9fc99}.tbl tbody tr:nth-child(2n):hover td{background:#fafbff}.tbl .num{font-variant-numeric:tabular-nums}.field,.json-editor,textarea,input[type=text],input[type=password],select{font-family:var(--font);font-size:13px;height:32px;padding:0 11px;border:1px solid var(--border);border-radius:var(--r);background:var(--white);color:var(--navy);outline:none;transition:border-color .15s,box-shadow .15s}.field:focus,.json-editor:focus,textarea:focus,input:focus,select:focus{border-color:var(--purple);box-shadow:0 0 0 3px #533afd1f}textarea,.json-editor{width:100%;resize:vertical;line-height:1.55;height:auto;min-height:32px;padding:7px 11px}.json-editor,.json-editor textarea{font-family:var(--mono);font-size:12.5px}.chk{accent-color:var(--purple);width:15px;height:15px}.model-item{display:inline-flex;align-items:center;gap:5px;font-size:13px;color:var(--ink);cursor:pointer}.cell-edit{border:1px solid transparent;border-radius:var(--r);padding:5px 9px;width:100%;background:transparent;font-family:var(--font);font-size:13px;color:var(--navy)}.cell-edit:hover{border-color:var(--border);background:var(--white)}.btn:hover{border-color:var(--border-strong);background:var(--bg)}.btn-orange{background:#f97316;border-color:#f97316;color:#fff}.btn-orange:hover{background:#ea580c;border-color:#ea580c;color:#fff}.cell-edit:focus{border-color:var(--purple);background:var(--white);box-shadow:0 0 0 3px #533afd1a;outline:none}textarea.cell-edit{resize:vertical;min-height:56px}.detail-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px;margin-top:10px}.dt-item{border:1px solid var(--border);border-radius:var(--r);padding:10px 12px;background:var(--bg)}.dt-title{font-weight:500;font-size:13px;margin-bottom:4px;display:flex;align-items:center;gap:6px}.dt-item ul{margin:4px 0 0;padding-left:18px;font-size:12.5px;color:var(--body)}.dt-item li{margin:2px 0}.muted{color:var(--body)}.small{font-size:12px}.error-text{color:var(--danger);font-size:12.5px;margin-top:6px}.warn{color:var(--warning)}.ok{color:var(--success-text)}.save-hint{font-size:12px;color:var(--success-text)}.rv-doc{background:var(--white);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow-1);padding:26px 30px;display:flex;flex-direction:column;gap:22px}.rv-sec{display:flex;flex-direction:column;gap:12px}.rv-sec-title{display:flex;align-items:center;font-size:14.5px;font-weight:600;color:var(--navy);background:var(--bg);border-left:4px solid var(--navy);padding:9px 14px;border-radius:0 var(--r) var(--r) 0}.rv-info-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px 24px}.rv-info-item{display:flex;flex-direction:column;gap:2px}.rv-info-key{font-size:11.5px;color:var(--body)}.rv-info-val{font-size:13.5px;color:var(--navy);font-weight:500}.rv-side{display:flex;flex-direction:column;gap:8px;align-items:flex-start}.rv-side-badge{display:inline-flex;align-items:center;background:var(--purple-soft);color:var(--purple);font-size:13px;font-weight:500;padding:5px 12px;border-radius:var(--r)}.rv-side-basis{margin:0;font-size:13px;color:var(--body);line-height:1.7}.rv-text{margin:0;font-size:13px;color:var(--text);line-height:1.8;white-space:pre-wrap}.rv-tbl{box-shadow:none}.badge{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11.5px;white-space:nowrap}.badge-red{background:var(--danger-soft);color:var(--danger)}.badge-amber{background:var(--warning-soft);color:var(--warning)}.badge-gray{background:var(--bg);color:var(--body);border:1px solid var(--border)}.badge-blue{background:var(--purple-soft);color:var(--purple)}.report-box{background:var(--bg);border:1px solid var(--border);border-radius:var(--r-md);padding:16px 18px;font-family:var(--mono);font-size:12.5px;line-height:1.7;white-space:pre-wrap;overflow-x:auto;max-height:520px;overflow-y:auto}.tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:16px}.tabs button{font-family:var(--font);font-size:13px;font-weight:400;padding:8px 14px;border:none;background:transparent;cursor:pointer;color:var(--body);border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s}.tabs button:hover{color:var(--navy)}.tabs button.active{color:var(--purple);border-bottom-color:var(--purple);font-weight:500}.steps{display:flex;align-items:center;gap:0;margin:8px 0 22px}.step-item{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.step-num{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;background:var(--bg);color:var(--body);border:1px solid var(--border);transition:all .2s}.step-label{font-size:13.5px;font-weight:500;color:var(--body);transition:color .2s}.step-item.active .step-num{background:var(--purple);border-color:var(--purple);color:#fff;box-shadow:#533afd4d 0 6px 14px -4px}.step-item.active .step-label{color:var(--navy)}.step-item.done .step-num{background:var(--success);border-color:var(--success);color:#fff}.step-item.done .step-label{color:var(--ink)}.step-line{flex:1;height:2px;background:var(--border);margin:0 12px;min-width:40px;border-radius:1px}.step-line.on{background:var(--purple)}.drop-zone{border:1.5px dashed var(--border);border-radius:var(--r-md);padding:28px 20px;text-align:center;cursor:pointer;transition:border-color .2s,background .2s}.drop-zone:hover{border-color:var(--purple);background:var(--purple-soft)}.drop-icon{font-size:30px;color:var(--body);line-height:1}.photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:10px;margin-top:14px}.photo-item{position:relative;border-radius:var(--r);overflow:hidden;border:1px solid var(--border)}.photo-item img{width:100%;height:72px;object-fit:cover;display:block}.photo-del{position:absolute;top:4px;right:4px;width:20px;height:20px;border-radius:50%;border:none;background:#0000008c;color:#fff;font-size:13px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.photo-del:hover{background:var(--danger)}.drop-summary{font-size:13px;color:var(--ink);font-weight:500}.lightbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;background:#060a18eb;display:flex;align-items:center;justify-content:center}.lightbox-stage{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden;cursor:default}.lightbox-stage img{max-width:92vw;max-height:88vh;object-fit:contain;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;transition:transform .06s linear;box-shadow:#00000080 0 20px 60px}.lightbox-close{position:fixed;top:16px;right:20px;width:38px;height:38px;border-radius:50%;border:none;background:#ffffff1f;color:#fff;font-size:22px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s}.lightbox-close:hover{background:#ffffff40}.lightbox-nav{position:fixed;top:50%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:none;background:#ffffff1a;color:#fff;font-size:24px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s}.lightbox-nav:hover{background:#ffffff38}.lightbox-nav.prev{left:18px}.lightbox-nav.next{right:18px}.lightbox-bar{position:fixed;bottom:16px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:14px;background:#ffffff1a;border-radius:24px;padding:7px 16px;color:#fff;font-size:12.5px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.lightbox-bar .muted{color:#ffffff8c}.lightbox-bar .btn{background:#ffffff26;border-color:transparent;color:#fff;height:26px;font-size:12px}.lightbox-bar .btn:hover{background:#ffffff4d;color:#fff}.report-layout{display:flex;gap:18px;align-items:flex-start}.report-main{flex:1;min-width:0}.photo-rail{width:190px;flex-shrink:0;position:sticky;top:16px;max-height:calc(100vh - 60px);overflow-y:auto;background:var(--white);border:1px solid var(--border);border-radius:var(--r-md);padding:12px;box-shadow:var(--shadow-1)}.photo-rail-title{font-size:12.5px;font-weight:600;color:var(--ink);margin-bottom:10px}.photo-rail-item{border:1px solid var(--border);border-radius:var(--r);overflow:hidden;margin-bottom:10px;cursor:zoom-in;transition:border-color .15s,box-shadow .15s}.photo-rail-item:hover{border-color:var(--purple);box-shadow:#533afd26 0 4px 12px}.photo-rail-item img{width:100%;height:96px;object-fit:cover;display:block}.photo-rail-name{display:block;font-size:10.5px;color:var(--body);padding:4px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.verdict-group{display:inline-flex;gap:4px}.verdict-btn{font-size:12px;padding:3px 10px;border-radius:var(--r);border:1px solid var(--border);background:var(--white);color:var(--body);cursor:pointer;transition:all .15s}.verdict-btn:hover{border-color:var(--purple)}.verdict-btn.on.ok{background:var(--success-soft);border-color:var(--success);color:var(--success-text);font-weight:600}.verdict-btn.on.bad{background:var(--danger-soft);border-color:var(--danger);color:var(--danger);font-weight:600}.verdict-btn.on.suspect{background:var(--warning-soft);border-color:var(--warning);color:var(--warning);font-weight:600}.run-progress{margin-top:16px;display:flex;flex-direction:column;align-items:center;gap:8px}.run-hint{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--body);margin-left:8px}.spinner{width:30px;height:30px;border:3px solid var(--border);border-top-color:var(--purple);border-radius:50%;animation:spin .8s linear infinite}.spinner.sm{width:15px;height:15px;border-width:2px;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;background:#060a188c;display:flex;align-items:center;justify-content:center;padding:30px}.modal-box{background:var(--bg);border-radius:var(--r-md);max-width:860px;width:100%;max-height:90vh;display:flex;flex-direction:column;padding:18px 20px;box-shadow:#0000004d 0 20px 60px}.modal-scroll{overflow-y:auto;flex:1}.login-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg);background-image:radial-gradient(600px 300px at 80% -10%,rgba(83,58,253,.1),transparent 60%),radial-gradient(500px 260px at 10% 110%,rgba(233,34,97,.07),transparent 60%);padding:20px}.login-card{width:396px;max-width:100%;background:var(--white);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow-3);padding:40px 36px 32px;text-align:center}.login-logo{width:48px;height:48px;margin:0 auto 16px;border-radius:10px;background:linear-gradient(135deg,#665efd,#533afd);color:#fff;font-size:22px;font-weight:600;display:flex;align-items:center;justify-content:center;box-shadow:#533afd59 0 12px 24px -8px}.login-card h1{margin:0 0 4px;font-size:21px;font-weight:300;letter-spacing:-.3px;color:var(--navy)}.login-card .sub{color:var(--body);font-size:13px;margin:0 0 28px}.login-card form{display:flex;flex-direction:column;gap:14px;text-align:left}.login-card label{font-size:12.5px;font-weight:500;color:var(--ink);display:flex;flex-direction:column;gap:5px}.login-card input{padding:9px 12px}.login-card .btn-primary{padding:10px;font-size:14px;margin-top:6px;letter-spacing:2px}.login-foot{margin-top:24px;font-size:11.5px;color:var(--body)}
