:root{--teal-900:#174b70;--teal-800:#1f5f8b;--teal-700:#276f9b;--teal-600:#2d7fa7;--teal-100:#dbeaf4;--teal-50:#f2f7fb;--ink:#172f42;--muted:#5e7182;--line:#d5e1ea;--paper:#fff;--canvas:#f4f7fa;--warning:#9a6100;--warning-bg:#fff6df;--danger:#b43d3d;--danger-bg:#fff1f1;--success:#187b56;--success-bg:#e8f7ef;--shadow:0 16px 42px rgba(18,59,93,.1);--radius:15px}

*{box-sizing:border-box}
html{background:var(--canvas)}
body{margin:0;color:var(--ink);background:var(--canvas);font:14px/1.55 "PingFang SC","Microsoft YaHei",system-ui,sans-serif}
button,input,select,textarea{font:inherit}
.app-shell{min-height:100vh;display:grid;grid-template-columns:270px minmax(0,1fr)}
.sidebar{position:sticky;top:0;height:100vh;padding:24px 17px;color:#f2f7fb;background:#123b5d;display:flex;flex-direction:column}
.brand{display:flex;align-items:center;gap:11px;padding:0 8px 26px}
.brand-mark{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;color:#19534f;background:#c7f1eb;font-weight:800}
.brand strong{font-size:15px;white-space:nowrap}
.workspace{min-width:0}
.content{max-width:1480px;margin:auto;padding:30px 34px 50px}
.hero{display:flex;justify-content:space-between;align-items:flex-start;gap:25px;margin-bottom:20px}
.hero h2{margin:0;font-size:25px}
.hero p{margin:4px 0 0;color:var(--muted)}
.button-row,.actions,.toolbar,.modal-actions,.result-actions,.result-footer{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.button{border:1px solid var(--line);border-radius:9px;padding:9px 14px;color:var(--ink);background:var(--paper);font-weight:700;cursor:pointer}
.button:hover{border-color:var(--teal-600);color:var(--teal-800)}
.button.primary{color:white;border-color:var(--teal-800);background:var(--teal-800)}
.button.danger{color:var(--danger);border-color:#ecc0c0}
.button.small{padding:6px 10px;font-size:12px}
.button:disabled{opacity:.48;cursor:not-allowed}
.card,.metric,.quote-summary{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 7px 24px rgba(20,91,85,.045)}
.card{padding:22px;margin-bottom:18px}
.card-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:16px}
.card-head h3{margin:0;font-size:17px}
.card-head p{margin:3px 0 0;color:var(--muted);font-size:12px}
.stats-grid{display:grid;grid-template-columns:repeat(4,minmax(150px,1fr));gap:14px;margin-bottom:18px}
.metric{padding:17px}
.metric span{display:block;color:var(--muted);font-size:12px}
.metric strong{display:block;margin-top:5px;color:var(--teal-900);font-size:22px}
.metric small{display:block;margin-top:2px;color:#7d9290}
.toolbar{margin-bottom:16px}
.toolbar input,.toolbar select{width:auto;min-width:190px}
.quote-filters input{min-width:280px}
.field-grid{display:grid;grid-template-columns:repeat(3,minmax(190px,1fr));gap:16px}
.field-grid.two{grid-template-columns:repeat(2,minmax(240px,1fr))}
.field-grid.four{grid-template-columns:repeat(4,minmax(150px,1fr))}
.field{display:flex;flex-direction:column;gap:6px}
.field.wide{grid-column:1/-1}
.field label,.field-label{font-size:12px;font-weight:700;color:#46615f}
.field small,.card>small{color:var(--muted)}
input,select,textarea{width:100%;padding:10px 11px;color:var(--ink);background:white;border:1px solid #cadcd9;border-radius:9px;outline:none}
input:focus,select:focus,textarea:focus{border-color:var(--teal-600);box-shadow:0 0 0 3px #35a69b20}
input[readonly],textarea[readonly],select:disabled{background:#f3f7f6;color:#718281}
.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:11px}
table{width:100%;border-collapse:collapse}
th{padding:11px 12px;color:#3d625f;background:var(--teal-50);font-size:11px;text-align:left;white-space:nowrap}
td{padding:11px 12px;border-top:1px solid #edf3f2;vertical-align:middle}
tbody tr:hover{background:#fbfefd}
.table-input{min-width:100px;padding:7px 8px}
.actions{justify-content:flex-end;white-space:nowrap}
.badge{display:inline-flex;align-items:center;white-space:nowrap;padding:4px 9px;border-radius:999px;font-size:11px;font-weight:800;background:#edf2f1;color:#617270}
.badge.published,.badge.completed,.badge.success{background:var(--success-bg);color:var(--success)}
.badge.draft,.badge.running{background:var(--warning-bg);color:var(--warning)}
.badge.failed,.badge.validation_failed,.badge.cancelled{background:var(--danger-bg);color:var(--danger)}
.empty{padding:45px 20px;text-align:center;color:var(--muted)}
.quote-summary{display:grid;grid-template-columns:1fr 1.4fr .7fr 2fr auto;gap:18px;align-items:center;padding:14px 17px;margin-bottom:17px}
.quote-summary div{min-width:0}
.quote-summary span{display:block;color:var(--muted);font-size:11px}
.quote-summary strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.step-actions{display:flex;justify-content:space-between;gap:12px;margin-top:18px}
.data-section{margin-top:20px}
.data-section h4{margin:0 0 10px}
.distribution-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:13px}
.mini-list{padding:14px}
.mini-row{display:grid;grid-template-columns:minmax(100px,1fr) 110px 28px;gap:7px;margin-top:7px}
.icon-button{width:28px;height:35px;border:0;color:var(--danger);background:transparent;cursor:pointer;font-size:18px}
.review-list{display:grid;gap:8px}
.review-item{display:flex;justify-content:space-between;gap:20px;padding:10px 12px;border-bottom:1px solid #edf2f1}
.review-item span{color:var(--muted)}
.validation{display:grid;gap:8px;margin:14px 0}
.validation div,.notice{padding:11px 13px;border-radius:9px}
.validation .error,.notice.error{color:var(--danger);background:var(--danger-bg);border:1px solid #f0caca}
.validation .warning,.notice.warning{color:var(--warning);background:var(--warning-bg);border:1px solid #efd49e}
.validation .ok,.notice.success{color:var(--success);background:var(--success-bg);border:1px solid #bfe2cf}
#alert-region{position:fixed;z-index:30;right:28px;top:24px;width:min(410px,calc(100vw - 40px))}
.notice{margin-bottom:9px;box-shadow:var(--shadow)}
.progress-shell{max-width:760px;margin:60px auto;text-align:center}
.progress-ring{position:relative;width:110px;height:110px;margin:0 auto 20px;border-radius:50%;display:grid;place-items:center;background:conic-gradient(var(--teal-600) var(--progress),#dceae8 0)}
.progress-ring:before{content:"";width:82px;height:82px;border-radius:50%;background:white}
.progress-ring strong{position:absolute;color:var(--teal-900);font-size:20px}
.result-actions{margin-bottom:13px}
.result-hero{padding:25px;background:#237b74;border:0}
.result-hero,.result-hero h2{color:white}
.result-hero p{color:#d9f4f0}
.result-hero .metric{box-shadow:none}
.result-hero .metric strong{color:var(--teal-900)}
.checks{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
.check{padding:13px;border:1px solid var(--line);border-radius:10px}
.check strong,.check span{display:block}
.check span{color:var(--muted);font-size:12px}
.check.pass{border-color:#b9dfce;background:#f4fbf8}
.check.fail{border-color:#efc5c5;background:#fff7f7}
.chart-shell{position:relative}
.chart{display:block;width:100%;height:auto;min-height:280px}
.chart text{font-family:inherit;fill:#66807e;font-size:11px}
.chart .axis{stroke:#aac6c2}
.chart .grid-line{stroke:#e4eeec;stroke-dasharray:4 4}
.chart .series{fill:none;stroke:var(--teal-600);stroke-width:2.5}
.chart-point{fill:transparent;cursor:crosshair}
.chart-point:hover{fill:var(--teal-700)}
.chart-tooltip{position:absolute;z-index:2;padding:7px 9px;border-radius:7px;color:white;background:#173c39;font-size:12px;pointer-events:none;white-space:nowrap}
.split{display:grid;grid-template-columns:1.1fr .9fr;gap:18px}
.result-footer{justify-content:flex-end;margin-top:18px}
.preset-parameters{display:grid;grid-template-columns:repeat(4,minmax(140px,1fr));gap:13px}
.factor-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:15px}
.code-note{padding:11px 13px;border-left:4px solid var(--teal-500,#35a69b);background:var(--teal-50);color:#466563}
.rule-chip-list{display:flex;flex-wrap:wrap;gap:8px}
.rule-chip{padding:6px 10px;border-radius:999px;background:var(--teal-100);color:var(--teal-900);font-size:12px;font-weight:700}
.rule-chip.secondary{background:#eef2f1;color:#667b79}
.checkbox-row{display:flex;align-items:center;gap:8px}
.checkbox-row input{width:auto}
.modal-backdrop{position:fixed;z-index:40;inset:0;display:grid;place-items:center;padding:24px;background:#153f3c99}
.modal{width:min(900px,100%);max-height:90vh;overflow:auto;background:white;border-radius:17px;box-shadow:0 28px 80px #001f1c55}
.modal-compact{width:min(680px,100%)}
.modal-confirm{width:min(460px,100%)}
.modal-head{position:sticky;top:0;z-index:2;display:flex;justify-content:space-between;align-items:center;padding:18px 22px;background:white;border-bottom:1px solid var(--line)}
.modal-head h3{margin:0}
.modal-body{padding:22px}
.modal-close{border:0;background:transparent;font-size:24px;cursor:pointer}
.modal-actions{justify-content:flex-end;margin-top:20px}
.footer-note{margin-top:20px;color:var(--muted);font-size:12px}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.muted{color:var(--muted)}
@media(max-width:1100px){.app-shell{grid-template-columns:225px minmax(0,1fr)}
.brand strong{white-space:normal}
.field-grid,.field-grid.four{grid-template-columns:repeat(2,minmax(190px,1fr))}
.stats-grid{grid-template-columns:repeat(2,1fr)}
.distribution-grid,.split,.factor-grid{grid-template-columns:1fr}
.quote-summary{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:760px){.app-shell{display:block}
.sidebar{position:relative;width:100%;height:auto}
.content{padding:20px 14px}
.hero{display:block}
.hero .button-row{margin-top:13px}
.field-grid,.field-grid.two,.field-grid.four,.preset-parameters,.stats-grid,.quote-summary{grid-template-columns:1fr}
.distribution-grid,.checks{grid-template-columns:1fr}
.modal-backdrop{padding:12px}
}
/* 数值采用手工输入；移除浏览器原生步进按钮。 */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
input[type="number"] { appearance: textfield; -moz-appearance: textfield; }
