:root{font-family:"Microsoft YaHei UI","PingFang SC",sans-serif;color:#272d30;background:#f4f6f7;font-size:14px;--accent:#087f72;--line:#dce2e4;--muted:#778185;--red:#ba4545;--ink:#272d30}*{box-sizing:border-box;letter-spacing:0}body{margin:0}button,input,select,textarea{font:inherit}button,a,input,select,textarea{outline-offset:3px}button{cursor:pointer;border:1px solid var(--line);border-radius:4px;min-height:34px;padding:6px 13px;background:white;color:var(--ink);display:inline-flex;align-items:center;justify-content:center;gap:7px;white-space:nowrap}button:hover{background:#edf4f1;border-color:#a6c9c0}button:disabled{cursor:default;opacity:.43}button.primary{background:var(--accent);color:white;border-color:var(--accent)}button.danger{color:var(--red)}button.icon{width:34px;height:34px;min-width:34px;padding:7px}svg.lucide{width:17px;height:17px;flex-shrink:0}input,select,textarea{border:1px solid #cdd5d8;border-radius:4px;padding:8px 10px;background:white;color:var(--ink);min-width:0;max-width:100%}input:focus,textarea:focus,select:focus{border-color:var(--accent)}input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);padding:0;flex-shrink:0}textarea{resize:vertical;min-height:100px;overflow-wrap:anywhere}input[type=date]{max-width:155px}label{font-size:13px}.field{display:flex;flex-direction:column;gap:7px;min-width:0}.field+ .field{margin-top:17px}.field label{color:#697479}.inline-check{display:inline-flex;align-items:center;gap:7px;white-space:nowrap}.muted{color:var(--muted)}.mono{font-family:Consolas,monospace;font-size:12px}.brand{display:flex;align-items:center;gap:10px}.brand img{width:31px;height:31px;object-fit:contain}.brand strong{font-size:17px;font-weight:600}.brand small{display:block;font-size:11px;color:var(--muted);margin-top:5px}h1,h2,p{margin:0}h1{font-size:21px;font-weight:600}h2{font-size:17px}.error{color:var(--red);font-size:13px;line-height:1.7;overflow-wrap:anywhere}.success{color:var(--accent)}[hidden]{display:none!important}.login-shell{min-height:100vh;display:grid;place-items:center;padding:24px}.login-form{width:min(100%,350px)}.login-form .brand{margin-bottom:38px}.login-form h1{margin-bottom:26px}.login-form .primary{width:100%;margin-top:25px;height:40px}.login-form .error{min-height:24px;margin-top:12px}.shell{display:grid;grid-template-columns:212px minmax(0,1fr);min-height:100vh}.sidebar{background:#282f30;color:#d2d9d7;display:flex;flex-direction:column;position:sticky;top:0;height:100vh;padding:25px 13px 15px}.sidebar .brand{padding:0 9px 28px;color:#fff}.sidebar .brand strong{font-size:15px}.sidebar .brand small{color:#9ba7a4}.nav{display:flex;flex-direction:column;gap:5px}.nav button{background:transparent;color:#bac5c1;border:0;justify-content:flex-start;border-radius:4px;padding:11px 13px;min-height:43px}.nav button.active{background:#40534e;color:#fff}.nav button:hover{background:#34413d}.sidebar-footer{margin-top:auto;padding:17px 9px 0;border-top:1px solid #414b48;display:flex;align-items:center;gap:8px;font-size:12px;min-width:0}.sidebar-footer span{overflow:hidden;text-overflow:ellipsis;flex:1}.sidebar-footer button{background:transparent;color:#cbd4d0;border-color:#495550}.main{min-width:0}.topbar{height:76px;background:white;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px;padding:0 28px}.topbar .right{margin-left:auto;display:flex;align-items:center;gap:10px}.topbar .muted{font-size:12px}.workspace{padding:24px 28px}.section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:18px;flex-wrap:wrap}.section-head h2{font-size:14px}.summary{display:flex;gap:34px;padding:0 0 22px;align-items:center}.summary b{display:block;font-size:25px;font-weight:600;margin-bottom:4px}.summary span{font-size:12px;color:var(--muted)}.summary .green{color:var(--accent)}.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:14px}.toolbar input[type=search]{width:225px}.toolbar .spacer{flex:1}.toolbar select{height:35px;padding:5px 8px}.toolbar label{font-size:12px}.table-wrap{overflow:auto;background:white;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}table{border-collapse:collapse;width:100%;font-size:12px;text-align:left;white-space:nowrap}th{height:43px;padding:10px 12px;font-weight:500;color:#718080;background:#f9faf9;border-bottom:1px solid var(--line)}td{height:56px;padding:10px 12px;border-bottom:1px solid #edf0f0}tbody tr:last-child td{border-bottom:0}tbody tr:hover{background:#f5f9f7}tbody tr.selected{background:#eaf5ef}td .sub{display:block;margin-top:5px;font-size:11px;color:#8c9698}td .truncate{display:block;max-width:260px;overflow:hidden;text-overflow:ellipsis}td .actions{display:flex;gap:5px}td .actions .icon{width:29px;height:29px;min-width:29px;min-height:29px;padding:5px;background:transparent;border-color:transparent}td .actions .icon:hover{background:#e4efe9}td:first-child,th:first-child{width:37px}.empty{text-align:center;padding:60px 18px;color:var(--muted);height:160px}.badge{display:inline-flex;align-items:center;padding:4px 7px;border-radius:3px;font-size:11px;background:#f0f2f3;color:#7a8587}.badge.success,.badge.completed,.badge.active{background:#e4f3eb;color:#247456}.badge.processing{background:#eaf2fb;color:#48718e}.badge.failed,.badge.disabled{background:#faecea;color:#b55e52}.badge.pending_binding{background:#fcf2dc;color:#9a7c37}.pager{display:flex;align-items:center;gap:10px;padding:16px 0;color:var(--muted);font-size:12px}.pager .spacer{flex:1}.pager select{padding:5px 7px}.pager button{width:31px;min-height:31px;height:31px}.config-form{max-width:680px;background:none;border-top:1px solid var(--line);padding-top:24px}.config-form .row{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:20px}.config-form button{margin-top:25px}.config-form textarea{font-family:Consolas,monospace}.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:#2e3835;color:white;padding:12px 18px;border-radius:5px;z-index:40;max-width:calc(100% - 32px);overflow-wrap:anywhere;font-size:13px}.toast.bad{background:#964c46}dialog{border:1px solid var(--line);border-radius:8px;box-shadow:0 20px 80px #17292125;padding:0;width:min(560px,calc(100% - 32px));max-height:calc(100% - 40px);color:var(--ink)}dialog::backdrop{background:#192b2a55}dialog.wide{width:min(760px,calc(100% - 32px))}.modal-head{display:flex;justify-content:space-between;align-items:center;padding:18px 22px;border-bottom:1px solid var(--line);gap:15px}.modal-body{padding:22px;overflow:auto;max-height:65vh}.modal-foot{display:flex;gap:8px;justify-content:flex-end;padding:14px 22px;border-top:1px solid var(--line)}.modal-error{min-height:20px;margin-top:13px}.modal-body .identity{font-size:13px;color:var(--muted);margin-bottom:18px}.gift-list{border:1px solid var(--line);max-height:265px;overflow:auto;margin-bottom:16px}.gift-row{display:flex;align-items:center;gap:9px;padding:13px 10px;border-bottom:1px solid #edf0ee;font-size:13px;cursor:pointer}.gift-row:last-child{border:0}.gift-row span:first-of-type{flex:1;min-width:0;white-space:normal;overflow-wrap:anywhere}.gift-row.disabled{color:#9ca6a5}.context-menu{position:fixed;background:white;border:1px solid var(--line);border-radius:5px;padding:5px;z-index:30;min-width:145px;box-shadow:0 6px 24px #102c2520}.context-menu button{width:100%;border:0;justify-content:flex-start;border-radius:2px;font-size:13px}.mobile-menu{display:none}.customer{min-height:100vh;background:#fff;display:flex;flex-direction:column}.customer-header{padding:26px 35px;border-bottom:1px solid #eef1f0}.customer-main{width:min(100% - 40px,420px);margin:65px auto 45px}.customer-main h1{font-size:24px;margin-bottom:30px}.customer-main .login-button{width:100%;height:43px;margin-top:24px}.sms-field{display:grid;grid-template-columns:minmax(0,1fr) 112px;gap:9px}.customer-main input{height:43px}.customer-main .error{min-height:25px;margin-top:16px}.customer-result{padding-top:15px}.result-icon{width:54px;height:54px;background:#e6f4ed;color:var(--accent);display:grid;place-items:center;border-radius:50%;margin-bottom:24px}.result-icon svg{width:27px;height:27px}.result-status{font-size:24px;margin-bottom:14px}.customer-result p{font-size:14px;line-height:1.9;color:#7c8687;overflow-wrap:anywhere}.result-meta{border-top:1px solid #ecf0ee;margin-top:26px;padding-top:20px;display:flex;justify-content:space-between;font-size:12px;color:#8c9697}.customer-result button{margin-top:25px}.code-line{display:flex;gap:8px}.code-line input{flex:1}.customer-footer{margin-top:auto;text-align:center;color:#a0aaa9;padding:25px;font-size:11px}.loader{display:inline-block;width:15px;height:15px;border:2px solid #a7c4ba;border-top-color:transparent;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}
@media(max-width:1000px){.workspace{padding:20px}.topbar{padding:0 20px}.shell{grid-template-columns:186px minmax(0,1fr)}.sidebar{padding-left:8px;padding-right:8px}.sidebar .brand strong{font-size:13px}.toolbar .spacer{display:none}}
@media(max-width:720px){.shell{grid-template-columns:minmax(0,1fr)}.sidebar{position:fixed;z-index:25;left:0;width:224px;transform:translateX(-100%);transition:transform .15s}.sidebar.open{transform:translateX(0)}.sidebar-shade{position:fixed;inset:0;background:#102b2655;z-index:24}.mobile-menu{display:inline-flex}.topbar{height:65px;padding:0 14px}.topbar h1{font-size:18px}.topbar .right .muted{display:none}.workspace{padding:18px 13px}.summary{gap:28px}.summary b{font-size:23px}.toolbar input[type=search]{width:100%;flex-basis:100%}.toolbar input[type=date]{max-width:calc(50% - 25px);flex:1}.table-wrap table{min-width:820px}.pager{gap:7px}.pager .page-total{max-width:110px}.customer-header{padding:20px}.customer-main{margin-top:42px}.customer-main h1{font-size:22px}.modal-body{padding:18px;max-height:62vh}.modal-head,.modal-foot{padding:14px 18px}.config-form .row{grid-template-columns:1fr;gap:0}}

/* ---------------- 全屏「环境检测」科幻球 ---------------- */
dialog.probe-overlay{position:fixed;inset:0;width:100vw;height:100vh;max-width:none;max-height:none;margin:0;padding:0;border:0;background:#02040a;color:#d9fff4;overflow:hidden;opacity:0;transition:opacity .22s ease}
dialog.probe-overlay[open]{opacity:1}
dialog.probe-overlay::backdrop{background:#02040a}
.probe-stage{position:relative;width:100%;height:100%;display:grid;place-items:center;overflow:hidden;background:radial-gradient(circle at 50% 44%,#061019 0%,#02040a 52%,#010104 100%)}
.probe-stage::before{content:'';position:absolute;inset:-60%;pointer-events:none;background-image:radial-gradient(1.7px 1.7px at 32% 44%,rgba(210,255,246,.95),transparent 52%),radial-gradient(1.3px 1.3px at 68% 22%,rgba(150,225,255,.85),transparent 52%),radial-gradient(1.1px 1.1px at 52% 82%,rgba(190,255,240,.7),transparent 52%),radial-gradient(1.5px 1.5px at 16% 66%,rgba(150,225,255,.6),transparent 52%),radial-gradient(1px 1px at 84% 58%,rgba(210,255,246,.55),transparent 52%);background-size:340px 340px,280px 280px,240px 240px,400px 400px,460px 460px;animation:starDrift 110s linear infinite}
.probe-stage::after{content:'';position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse 46% 44% at 50% 42%,rgba(32,240,200,.16),transparent 66%),radial-gradient(ellipse 34% 30% at 50% 42%,rgba(120,255,235,.10),transparent 60%)}
.probe-grid{position:absolute;inset:0;pointer-events:none;opacity:.09;background-image:linear-gradient(rgba(110,255,225,.5) 1px,transparent 1px),linear-gradient(90deg,rgba(110,255,225,.5) 1px,transparent 1px);background-size:80px 80px;mask-image:radial-gradient(ellipse 46% 42% at 50% 44%,#000 18%,transparent 72%);-webkit-mask-image:radial-gradient(ellipse 46% 42% at 50% 44%,#000 18%,transparent 72%);animation:gridDrift 26s ease-in-out infinite}
.probe-box{position:relative;display:flex;flex-direction:column;align-items:center;gap:34px;padding:10px 26px;z-index:2}
.probe-label{font-size:11px;letter-spacing:7px;color:rgba(150,230,214,.55);text-transform:uppercase;margin-bottom:-10px}
.probe-orb{position:relative;width:230px;height:230px;display:grid;place-items:center}
.probe-orb::before{content:'';position:absolute;width:520px;height:520px;border-radius:50%;pointer-events:none;background:radial-gradient(circle,rgba(36,238,198,.16),rgba(20,140,190,.07) 34%,transparent 62%)}
.probe-core{width:128px;height:128px;border-radius:50%;position:relative;overflow:hidden;box-shadow:0 0 46px rgba(40,238,196,.55),0 0 130px rgba(14,150,190,.35),inset 0 0 26px rgba(200,255,245,.55)}
.probe-core::before{content:'';position:absolute;inset:-10%;border-radius:50%;background:conic-gradient(from 0deg,#6dffe4,#0fb894,#0a5f7e,#40efc4,#6dffe4);animation:coreSpin 9s linear infinite}
.probe-core::after{content:'';position:absolute;inset:6%;border-radius:50%;background:radial-gradient(circle at 34% 28%,rgba(255,255,255,.95),rgba(198,255,246,.42) 20%,transparent 56%);filter:blur(2.5px)}
.probe-core-glow{position:absolute;width:214px;height:214px;border-radius:50%;background:radial-gradient(circle,rgba(48,255,214,.26),rgba(24,150,190,.10) 46%,transparent 68%);animation:breath 4.2s ease-in-out infinite}
.probe-ring{position:absolute;border-radius:50%;pointer-events:none}
.probe-ring.ring-a{width:340px;height:112px;border:1px solid rgba(110,255,226,.30);transform:rotate(-16deg);animation:ringSpin 22s linear infinite}
.probe-ring.ring-b{width:288px;height:92px;border:1px solid rgba(120,205,255,.20);transform:rotate(38deg);animation:ringSpin 30s linear infinite reverse}
.probe-dot{position:absolute;width:7px;height:7px;margin:-3.5px;border-radius:50%;background:#d9fff6;box-shadow:0 0 12px 3px rgba(110,255,230,.9),0 0 26px 8px rgba(50,220,200,.45);offset-path:ellipse(170px 56px at 50% 50%);offset-rotate:0deg;animation:dotTravel 7s linear infinite}
.probe-dot.dot-b{offset-path:ellipse(144px 46px at 50% 50%);animation-duration:11s;animation-direction:reverse;background:#bfe9ff;box-shadow:0 0 12px 3px rgba(140,215,255,.9),0 0 24px 8px rgba(60,140,220,.4)}
.probe-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px;align-items:stretch;text-align:left;position:relative;min-width:268px}
.probe-steps li{display:flex;align-items:center;gap:14px;color:#79b6ae;font-size:15px;letter-spacing:1.6px;opacity:.62;transition:all .35s ease;padding:9px 16px;border-radius:12px;border:1px solid transparent;position:relative;overflow:hidden}
.probe-steps li i{width:8px;height:8px;border-radius:50%;background:#14413f;flex:none;transition:all .3s}
.probe-steps li.active{opacity:1;color:#f2fffd;font-weight:500;border-color:rgba(92,243,207,.42);background:linear-gradient(90deg,rgba(92,243,207,.16),rgba(92,243,207,.02));box-shadow:0 0 24px rgba(92,243,207,.18),inset 0 0 18px rgba(92,243,207,.10);transform:translateX(3px)}
.probe-steps li.active::before{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:linear-gradient(180deg,transparent,#5cf3cf,transparent);box-shadow:0 0 12px #5cf3cf}
.probe-steps li.active::after{content:'';position:absolute;inset:0;background:linear-gradient(100deg,transparent 20%,rgba(190,255,245,.18) 50%,transparent 80%);transform:translateX(-120%);animation:stepSheen 2.2s ease-in-out infinite}
.probe-steps li.active i{background:#7bffe2;box-shadow:0 0 10px 2px rgba(92,243,207,.95),0 0 22px 6px rgba(92,243,207,.45);animation:dotPulse 1.3s ease-out infinite}
.probe-steps li.active span{text-shadow:0 0 14px rgba(92,243,207,.55)}
.probe-steps li.done{opacity:.95;color:#e6fff9;border-color:rgba(92,243,207,.18);background:rgba(92,243,207,.05)}
.probe-steps li.done i{background:#5cf3cf;box-shadow:0 0 10px rgba(92,243,207,.9)}
@keyframes stepSheen{0%{transform:translateX(-120%)}55%,100%{transform:translateX(120%)}}
.probe-steps li.done span::after{content:'  ✓';color:#5cf3cf}
.probe-steps li.failed{opacity:1;color:#ff9c8f;border-color:rgba(255,107,90,.38);background:rgba(255,107,90,.10)}
.probe-steps li.failed i{background:#ff6b5a;box-shadow:0 0 14px rgba(255,107,90,.9)}
.probe-title{font-size:19px;letter-spacing:9px;color:#e6fffa;text-shadow:0 0 18px rgba(92,243,207,.6);min-height:28px;transition:all .35s;font-weight:400;margin-top:-8px}
.probe-title.done{letter-spacing:12px;color:#fff;text-shadow:0 0 14px #5cf3cf,0 0 38px rgba(92,243,207,.9),0 0 70px rgba(92,243,207,.45)}
.probe-title.failed{letter-spacing:1px;font-size:14px;color:#ffb9ae;text-shadow:none;max-width:340px;text-align:center;line-height:1.8}
.probe-close{margin-top:-10px;padding:9px 38px;border-radius:999px;border:1px solid rgba(140,255,220,.42);background:rgba(4,18,22,.85);color:#c4f8ea;font-size:13px;letter-spacing:8px;cursor:pointer;transition:all .2s}
.probe-close:hover{background:rgba(92,243,207,.14);box-shadow:0 0 22px rgba(92,243,207,.35)}
@keyframes coreSpin{to{transform:rotate(360deg)}}
@keyframes ringSpin{to{transform:rotate(344deg)}}
@keyframes starDrift{to{transform:translate3d(-340px,-280px,0)}}
@keyframes gridDrift{0%,100%{transform:translate3d(0,0,0)}50%{transform:translate3d(0,-20px,0)}}
@keyframes breath{0%,100%{transform:scale(1);opacity:.7}50%{transform:scale(1.14);opacity:1}}
@keyframes dotPulse{0%{box-shadow:0 0 0 0 rgba(92,243,207,.85)}100%{box-shadow:0 0 0 13px rgba(92,243,207,0)}}
@keyframes dotTravel{to{offset-distance:100%}}
@media (max-width:460px){.probe-orb{width:170px;height:170px}.probe-core{width:96px;height:96px}.probe-core-glow{width:150px;height:150px}.probe-ring.ring-a{width:250px;height:84px}.probe-ring.ring-b{width:210px;height:70px}.probe-dot{offset-path:ellipse(124px 42px at 50% 50%)}.probe-dot.dot-b{offset-path:ellipse(104px 34px at 50% 50%)}.probe-title{font-size:16px;letter-spacing:6px}}