*{box-sizing:border-box}
:root{font-family:system-ui,-apple-system,"Segoe UI","Noto Sans TC",sans-serif;color:#16222c;background:#f3f6f8}
body{margin:0;background:#f3f6f8}
button,input,select,textarea{font:inherit}
button{cursor:pointer}
button:disabled{cursor:not-allowed;opacity:.55}
.login{max-width:470px;margin:9vh auto;background:#fff;padding:32px;border-radius:16px;box-shadow:0 10px 36px #0002}
.login form{display:grid;gap:12px}
input,select,textarea{padding:9px 10px;border:1px solid #cbd4dc;border-radius:8px;background:#fff}
button{padding:9px 13px;border:1px solid #b9c3cc;border-radius:8px;background:#fff}
button.primary{background:#205d83;color:#fff;border-color:#205d83}
button.good{background:#176b3a;color:#fff;border-color:#176b3a}
button.warn{background:#a15c00;color:#fff;border-color:#a15c00}
button.danger{background:#a42828;color:#fff;border-color:#a42828}
.err{color:#b42318;margin-top:12px;white-space:pre-wrap}
.notice{padding:10px 12px;background:#edf7ff;border:1px solid #cde9ff;border-radius:8px;margin:10px 0}
.muted{color:#66737d}
.small{font-size:12px;color:#66737d}
.app header{min-height:60px;background:#172a3a;color:#fff;display:flex;align-items:center;justify-content:space-between;padding:10px 20px;gap:14px;flex-wrap:wrap}
.badge{font-size:12px;background:#3c6e8f;padding:3px 7px;border-radius:99px}
.app header button{margin-left:8px}
.app nav{display:flex;gap:8px;padding:10px 16px;background:#fff;border-bottom:1px solid #d9e0e6;overflow:auto}
.app nav button.active{background:#e8f2f8;border-color:#80a9c1}
.app main{padding:16px}
.grid{display:grid;grid-template-columns:340px 1fr;gap:16px}
.grid aside,.grid section,.panel{background:#fff;border-radius:12px;padding:16px;box-shadow:0 2px 8px #0000000b}
.list{display:grid;gap:6px;margin-top:12px;max-height:70vh;overflow:auto}
.list button{text-align:left;border:1px solid #dde3e8;background:#fff;border-radius:8px;padding:9px}
.list button.selected{outline:2px solid #2c6c91}
.list small{display:block;color:#6a7680;margin-top:4px}
.toolbar,.row,.filters,.actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.canvaswrap{max-height:72vh;overflow:auto;background:#111;padding:8px;border-radius:8px}
.canvaswrap canvas{max-width:100%;height:auto;display:block;margin:auto;cursor:crosshair}
table{border-collapse:collapse;width:100%}
th,td{border-bottom:1px solid #e2e7eb;padding:8px;text-align:left;vertical-align:top}
th{background:#f8fafb;position:sticky;top:0;z-index:1}
.tablewrap{max-height:63vh;overflow:auto;border:1px solid #e1e7ec;border-radius:10px}
.status{display:inline-block;padding:3px 7px;border-radius:99px;font-size:12px;background:#edf1f4}
.status.approved{background:#dff4e6;color:#125b31}
.status.rejected{background:#ffe7e7;color:#8a1d1d}
.status.excluded{background:#f2e6ff;color:#5d2780}
.status.submitted{background:#fff1cf;color:#755000}
.status.draft{background:#e8f2ff;color:#285b91}
.split{display:inline-block;min-width:42px;text-align:center;font-size:12px;border-radius:6px;padding:2px 6px;background:#eef2f5}
.qc-layout{display:grid;grid-template-columns:minmax(520px,1.2fr) minmax(360px,.8fr);gap:16px}
.qc-detail{background:#fff;border-radius:12px;padding:16px}
.qc-detail canvas{max-width:100%;height:auto;background:#111}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:14px 0}
.card{border:1px solid #dde5eb;border-radius:10px;padding:12px;background:#fff}
.card b{font-size:22px;display:block}
code{background:#eef2f5;padding:2px 5px;border-radius:4px}
pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#f6f8fa;padding:12px;border-radius:8px}
@media(max-width:1050px){.grid,.qc-layout{grid-template-columns:1fr}.tablewrap{max-height:none}}

/* v0.3 training + model registry */
.train-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin:12px 0 16px}
.train-form label{display:flex;flex-direction:column;gap:5px;font-size:13px;font-weight:600}
.train-form label.check{flex-direction:row;align-items:center;align-self:end;padding-bottom:8px}
.train-form input,.train-form select{width:100%;box-sizing:border-box}
.progress{height:8px;background:#e5e7eb;border-radius:999px;overflow:hidden;min-width:120px;margin:4px 0}
.progress i{display:block;height:100%;background:#2563eb;border-radius:999px}
.terminal{background:#111827;color:#e5e7eb;max-height:420px;overflow:auto;white-space:pre-wrap;word-break:break-word;border-radius:8px;padding:12px;font-size:12px;line-height:1.45}
.run-detail{margin-top:18px;border-top:1px solid #d1d5db;padding-top:12px}
.goodtext{color:#067647;font-weight:700}
.model-status{max-width:130px}

/* v0.3.1 legacy YOLO import */
.legacy-form{display:grid;grid-template-columns:minmax(280px,2fr) minmax(180px,1fr) auto;gap:12px;align-items:end;margin:14px 0}
.legacy-form label{display:flex;flex-direction:column;gap:5px;font-size:13px;font-weight:600}
.goodbox{background:#ecfdf3;border-color:#abefc6;color:#067647}
.badtext{color:#b42318;font-weight:700}
@media(max-width:900px){.legacy-form{grid-template-columns:1fr}}


/* v0.3.1.2 annotation ownership + box editor */
.annotation-meta{display:flex;gap:12px;align-items:end;flex-wrap:wrap;margin:4px 0 10px}
.annotation-meta label{display:flex;flex-direction:column;gap:5px;font-size:13px;font-weight:600;min-width:320px}
.editor-toolbar button.mode.active{background:#205d83;color:#fff;border-color:#205d83}
.editor-toolbar button:disabled{opacity:.45}
.editor-help{margin-top:-4px;margin-bottom:10px}
.canvaswrap canvas{touch-action:none;user-select:none}


/* v0.3.1.3 annotation workflow filters + contributor metrics */
.annotation-stats{border:1px solid #d8e5ee;background:#f8fbfd;border-radius:10px;padding:10px;margin:8px 0 12px}
.annotation-stats-title{font-weight:700;margin-bottom:8px}
.annotation-stat-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}
.annotation-stat-grid>div{background:#fff;border:1px solid #e5ebef;border-radius:8px;padding:7px}
.annotation-stat-grid b{display:block;font-size:18px}
.annotation-stat-grid span{font-size:11px;color:#66737d}
.expertise-line{margin:8px 0 4px;font-size:12px}
.image-work-filters{display:grid;gap:7px;margin:10px 0 4px}
.image-work-filters select,.image-work-filters input{width:100%}
.image-list-title{font-weight:600;overflow-wrap:anywhere}
.image-list-meta{margin-top:5px}
.workstate{display:inline-block;padding:2px 7px;border-radius:999px;font-size:11px;font-weight:700}
.workstate.unstarted{background:#fee4e2;color:#912018}
.workstate.in_progress{background:#fff1cf;color:#755000}
.workstate.completed{background:#dff4e6;color:#125b31}
.empty-state{padding:14px 8px;color:#66737d;text-align:center}
.expertise-badge{display:inline-block;padding:3px 7px;border-radius:999px;background:#e8f2f8;color:#244d65;white-space:nowrap}


/* v0.3.1.4 admin QC dashboard + role separation */
.qc-dashboard{margin:8px 0 22px}
.qc-dashboard-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;margin:4px 0 10px}
.qc-dashboard-head h3{margin:0 0 3px}
.qc-dashboard-head p{margin:0}
.qc-dashboard-time{font-size:12px;color:#66737d}
.qc-dashboard-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.qc-metric-card{border:1px solid #dde5eb;border-radius:14px;background:linear-gradient(180deg,#fff,#fbfdfe);padding:14px;min-width:0}
.qc-metric-card h4{margin:0 0 10px;font-size:15px}
.qc-donut{position:relative;width:178px;height:178px;margin:4px auto 10px}
.qc-donut.large{width:196px;height:196px}
.qc-donut svg{width:100%;height:100%;display:block;transform:rotate(-90deg)}
.qc-donut-segment{will-change:stroke-dasharray}
.qc-donut-center{position:absolute;inset:28%;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;pointer-events:none}
.qc-donut-center strong{font-size:26px;line-height:1;font-variant-numeric:tabular-nums}
.qc-donut-center span{font-size:11px;color:#66737d;margin-top:5px}
.qc-summary-line{text-align:center;margin:2px 0 8px;font-size:14px}
.qc-summary-line b{font-size:19px}
.qc-legend{display:grid;gap:5px;margin-top:8px}
.qc-legend-row{display:grid;grid-template-columns:10px minmax(0,1fr) auto auto;align-items:center;gap:7px;font-size:12px}
.qc-legend-dot{width:9px;height:9px;border-radius:50%}
.qc-legend-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qc-legend-count,.qc-legend-pct{font-variant-numeric:tabular-nums;text-align:right}
.qc-legend-count{color:#52616c;min-width:28px}
.qc-legend-pct{font-weight:700;min-width:48px}
.qc-zero-users{margin-top:11px;padding-top:9px;border-top:1px solid #e7ecef;font-size:12px}
.qc-zero-users>div{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.qc-zero-users span{background:#f1f4f6;border:1px solid #e0e5e9;border-radius:999px;padding:3px 7px;color:#596670}
.qc-worklist-title{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;border-top:1px solid #e4e9ed;padding-top:16px}
.qc-worklist-title h3{margin:0}
.qc-dashboard-loading{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.qc-skeleton{height:300px;border-radius:14px;background:linear-gradient(100deg,#eef2f5 20%,#f8fafb 40%,#eef2f5 60%);background-size:200% 100%;animation:qcSkeleton 1.1s linear infinite}
@keyframes qcSkeleton{to{background-position:-200% 0}}
@media(max-width:1180px){.qc-dashboard-grid,.qc-dashboard-loading{grid-template-columns:1fr}.qc-metric-card{display:grid;grid-template-columns:210px 1fr;column-gap:14px;align-items:center}.qc-metric-card h4{grid-column:1/-1}.qc-donut{grid-row:2/6}.qc-zero-users{grid-column:2}}
@media(max-width:680px){.qc-metric-card{display:block}.qc-zero-users{display:block}.qc-dashboard-grid,.qc-dashboard-loading{grid-template-columns:1fr}}

/* v0.3.1.6 long-run hardening */
.worker-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(135px,1fr));gap:8px;margin-bottom:8px}
.worker-grid>div{background:#fff;border:1px solid #d8e5ee;border-radius:9px;padding:8px 10px;min-width:0}
.worker-grid span{display:block;font-size:11px;color:#66737d;margin-bottom:3px}
.worker-grid b{display:block;font-size:15px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
.worker-message{border-top:1px solid #dbe7ee;padding-top:7px;margin-top:5px}
.telemetry-cards .card b{font-size:19px;line-height:1.15;font-variant-numeric:tabular-nums}
.telemetry-cards .card small{display:block;margin-top:4px;color:#66737d;font-size:11px;font-weight:400}
.telemetry-history{overflow:auto;border:1px solid #e1e7ec;border-radius:9px;max-height:310px}
.telemetry-history table{min-width:760px}
.telemetry-history th,.telemetry-history td{font-size:12px;white-space:nowrap}
.notice.contention{background:#fff4e5;border-color:#f6c875;color:#704400}
.notice.watchdog{background:#fff1f1;border-color:#f1b5b5;color:#7c2424}
.run-detail details{border:1px solid #e1e7ec;border-radius:9px;padding:9px 10px;margin:10px 0;background:#fbfcfd}
.run-detail details summary{cursor:pointer;font-weight:650}
.run-detail details pre{margin-bottom:0}
.train-form .small{font-weight:400;line-height:1.35}
@media(max-width:720px){.worker-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.telemetry-cards{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* v0.3.1.6-H2 pause UX */
.status.paused{background:#fff3cd;color:#7a5600;border-color:#f0cf70}


/* v0.4 evaluation + inference */
.eval-form,.infer-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px;margin:12px 0 16px;align-items:end}
.eval-form label,.infer-form label,.threshold-panel label{display:flex;flex-direction:column;gap:5px;font-size:13px;font-weight:600}
.curve-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(310px,1fr));gap:14px;margin:14px 0}
.curve-grid>div{border:1px solid #dde5eb;border-radius:12px;padding:10px;background:#fff;min-width:0}
.curve-grid h4{margin:0 0 8px}
.metric-curve{width:100%;height:auto;overflow:visible}
.metric-curve line{stroke:#8b98a3;stroke-width:1}
.metric-curve polyline{fill:none;stroke:#2563eb;stroke-width:2.4;vector-effect:non-scaling-stroke}
.metric-curve text{fill:#52616c;font-size:11px}
.threshold-panel{border:1px solid #d8e5ee;background:#f8fbfd;border-radius:10px;padding:12px;margin:12px 0}
.inference-image{display:block;max-width:100%;max-height:72vh;margin:12px auto;border-radius:10px;background:#111}
.status.queued{background:#fff1cf;color:#755000}.status.running,.status.evaluation,.status.inference{background:#e8f2ff;color:#285b91}.status.completed,.status.published,.status.validated{background:#dff4e6;color:#125b31}.status.failed,.status.disabled{background:#ffe7e7;color:#8a1d1d}.status.archived{background:#edf1f4;color:#596670}
@media(max-width:760px){.curve-grid{grid-template-columns:1fr}.eval-form,.infer-form{grid-template-columns:1fr}}

/* v0.4.0-H2 interactive evaluation SVG */
.eval-curve-grid{grid-template-columns:repeat(auto-fit,minmax(390px,1fr))}
.eval-chart-shell{border:1px solid #dde5eb;border-radius:12px;padding:10px;background:#fff;min-width:0}
.eval-chart-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px}
.eval-chart-head h4{margin:0}
.eval-chart-actions{display:flex;gap:6px;flex:0 0 auto}
.eval-chart-actions button{padding:5px 9px;font-size:12px}
.eval-chart{width:100%;height:auto;overflow:visible}
.eval-chart text{-webkit-user-select:text;user-select:text;cursor:text}
.eval-chart .plot-bg{fill:#fff}
.eval-chart .axis,.eval-chart .tick{stroke:#687783;stroke-width:1}
.eval-chart .grid{stroke:#e7ebef;stroke-width:1}
.eval-chart .curve-line{fill:none;stroke:#2563eb;stroke-width:2.5;vector-effect:non-scaling-stroke}
.eval-chart .chart-point{fill:#fff;stroke:#2563eb;stroke-width:2;vector-effect:non-scaling-stroke;cursor:crosshair}
.eval-chart .chart-point:hover{fill:#2563eb}
.eval-chart .tick-label{fill:#52616c;font-size:11px}
.eval-chart .axis-label{fill:#33414b;font-size:13px;font-weight:600}
.eval-chart-tooltip{position:fixed;z-index:99999;display:none;pointer-events:none;max-width:330px;padding:7px 9px;border-radius:7px;background:rgba(20,28,35,.94);color:#fff;font-size:12px;line-height:1.4;box-shadow:0 4px 18px rgba(0,0,0,.22)}
.eval-chart-tooltip.show{display:block}
.confusion-svg .cm-cell{fill:#2563eb;stroke:#fff;stroke-width:3;cursor:crosshair}
.confusion-svg .cm-key{font-size:18px;font-weight:700}
.confusion-svg .cm-value{font-size:28px;font-weight:700}
.confusion-svg .cm-axis-title{font-size:14px;font-weight:700}
.confusion-svg .cm-row,.confusion-svg .cm-col{font-size:12px}
#evConfusion{margin:14px 0;max-width:650px}
@media(max-width:760px){.eval-curve-grid{grid-template-columns:1fr}.eval-chart-head{align-items:flex-start;flex-direction:column}}

/* v0.4.0-H3 Evaluation Dataset Provenance / Leakage Guard */
.eval-dataset-provenance{margin:16px 0;padding:16px;border:1px solid #d9e2ef;border-radius:12px;background:#fbfdff}
.eval-provenance-head{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;margin-bottom:12px}
.eval-provenance-head h3{margin:0 0 8px}
.eval-guard,.eval-check{display:inline-block;border-radius:999px;padding:3px 9px;font-size:12px;font-weight:700;border:1px solid transparent}
.eval-guard.pass,.eval-check.pass{background:#e6f6ea;color:#176b35;border-color:#b9e0c5}
.eval-guard.fail,.eval-check.fail{background:#fde8e8;color:#9c1c1c;border-color:#f1b8b8}
.eval-check.info{background:#edf2f7;color:#475569;border-color:#d6dee8}
.eval-protocol{margin:12px 0}
.eval-provenance-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.eval-dataset-items{margin:8px 0;border:1px solid #e2e8f0;border-radius:8px;padding:8px 10px;background:#fff}
.eval-dataset-items summary{cursor:pointer;font-weight:700}
.eval-dataset-items table{font-size:12px}
.notice.warning{border-color:#f0cf70;background:#fff9df}
@media(max-width:1000px){.eval-provenance-grid{grid-template-columns:1fr}.eval-provenance-head{flex-direction:column}}

/* v0.4.0-H4 Research-grade Split */
.research-split-panel{margin:16px 0;padding:16px;border:1px solid #c7d8ee;border-radius:12px;background:#f8fbff}
.research-grid{display:grid;grid-template-columns:repeat(4,minmax(150px,1fr));gap:10px;margin:12px 0}
.research-grid label{display:flex;flex-direction:column;gap:5px}
.research-badge{display:inline-block;padding:2px 7px;border-radius:999px;background:#e8f7ed;color:#176b35;font-size:11px;font-weight:800}
@media(max-width:1100px){.research-grid{grid-template-columns:repeat(2,minmax(160px,1fr))}}
@media(max-width:700px){.research-grid{grid-template-columns:1fr}}


/* v0.4.1 Full H5 Functional Integration */
.v041-upload-panel{margin-bottom:14px}.between{justify-content:space-between}.filebtn{display:inline-flex;align-items:center;padding:8px 12px;border:1px solid #cbd5e1;border-radius:8px;cursor:pointer;background:#f8fafc}.v041-preview{margin-top:12px;border-top:1px solid #e5e7eb;padding-top:10px}.preview-row{display:grid;grid-template-columns:minmax(220px,2fr) minmax(120px,1fr) minmax(150px,1fr);gap:8px;align-items:center;padding:10px;border:1px solid #e5e7eb;border-radius:9px;margin:7px 0}.preview-row.blocked{background:#fff1f2;border-color:#fecdd3}.preview-row.collision{background:#fffbeb;border-color:#fde68a}.preview-row input,.preview-row select{min-width:0}.workstate.unannotated{background:#e8f7ee;color:#166534}.workstate.my_in_progress{background:#eff6ff;color:#1d4ed8}.workstate.pending_other{background:#fff7ed;color:#9a3412}.workstate.approved_locked{background:#f3f4f6;color:#374151}.performance-card{border:1px solid #dbe3ea;border-radius:12px;padding:12px;margin:10px 0;background:#fbfdff}.performance-card.certified{border-width:2px}.performance-title{font-weight:700;margin-bottom:4px}#infPerformance{grid-column:1/-1}#myImageManager{margin-top:12px}@media(max-width:900px){.preview-row{grid-template-columns:1fr}}

/* v0.5.0-D.3 RibDataTable */
.tablewrap.rib-dt-host{max-height:none;overflow:visible}.rib-dt-shell{width:100%;min-width:0}.rib-dt-scroll{max-height:63vh;overflow:auto;border-radius:8px}
.rib-dt-controls,.rib-dt-footer{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:8px 10px;background:#fbfcfd}
.rib-dt-controls{border-bottom:1px solid #e1e7ec}.rib-dt-footer{border-top:1px solid #e1e7ec}.rib-dt-controls label{display:flex;align-items:center;gap:6px;font-size:13px}.rib-dt-search-label{margin-left:auto}.rib-dt-search{min-width:220px}
.rib-dt-pages{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.rib-dt-pages button{padding:5px 8px;min-width:34px}.rib-dt-pages button.active{background:#205d83;color:#fff;border-color:#205d83}.rib-dt-ellipsis{padding:0 3px;color:#66737d}
th.rib-dt-sortable{cursor:pointer;padding-right:24px;position:sticky}th.rib-dt-sortable::after{content:"↕";position:absolute;right:7px;color:#82909b;font-weight:400}th.rib-dt-sort-asc::after{content:"▲";color:#205d83}th.rib-dt-sort-desc::after{content:"▼";color:#205d83}th.rib-dt-nosort{cursor:default}.rib-dt-info{font-size:12px;color:#66737d}
@media(max-width:720px){.rib-dt-search-label,.rib-dt-search{width:100%;margin-left:0}.rib-dt-footer{align-items:flex-start;flex-direction:column}.rib-dt-pages{justify-content:flex-start}}

/* v0.5.0-D.3 two-stage batch import */
.batch-stage-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:8px 0}.batch-stepper{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.batch-step{display:flex;align-items:center;gap:6px;padding:7px 11px;border:1px solid #cbd6df;border-radius:999px;background:#f8fafb;color:#66737d;font-size:13px}.batch-step b{display:inline-flex;width:21px;height:21px;border-radius:50%;align-items:center;justify-content:center;background:#e8eef3}.batch-step.active{background:#e9f5fc;border-color:#7bb2d1;color:#174f70;font-weight:700}.batch-step.active b{background:#205d83;color:#fff}
.batch-phase-line{min-height:20px;margin:5px 0 8px}.batch-slider{width:100%;min-width:0;overflow:hidden;scroll-behavior:auto;border:1px solid #e1e7ec;border-radius:12px;background:#fff}.batch-slide-track{display:flex;width:100%;transition:transform .34s cubic-bezier(.2,.8,.2,1);transform:translate3d(0,0,0);will-change:transform}.batch-slide{flex:0 0 100%;width:100%;max-width:100%;padding:14px;min-width:100%;box-sizing:border-box}.batch-slider[data-step="A"] .batch-slide-track{transform:translate3d(0,0,0)}.batch-slider[data-step="B"] .batch-slide-track,.batch-slider[data-step="B1"] .batch-slide-track{transform:translate3d(-100%,0,0)}.batch-slider[data-step="B2"] .batch-slide-track{transform:translate3d(-200%,0,0)}.batch-slider[data-step="C"] .batch-slide-track{transform:translate3d(-300%,0,0)}.batch-slider[data-step="S"] .batch-slide-track{transform:translate3d(-400%,0,0)}
.batch-slide-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}.batch-slide-actions-right{justify-content:flex-end}.batch-slide-actions-between{justify-content:space-between}.batch-stage-empty,.batch-stage-loading{min-height:170px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:#66737d;border:1px dashed #d8e1e8;border-radius:10px;padding:20px}
.batch-local-filters{display:grid;grid-template-columns:repeat(3,minmax(170px,1fr));gap:10px;margin:10px 0}.batch-local-filters label{display:flex;flex-direction:column;gap:5px;font-size:12px;font-weight:700}.batch-progress-track{height:10px;background:#e7edf3;border-radius:6px;overflow:hidden;margin:6px 0 12px}#batchProgressBar{height:100%;width:0;background:#246b9a;transition:width .2s ease}
.batch-image-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;align-items:start;margin:10px 0}.batch-image-card{position:relative;border:1px solid #d9e2ea;border-radius:10px;background:#fff;padding:7px;min-width:0}.batch-image-card.blocked{background:#fff7f7;border-color:#e9bbbb}
.batch-card-exclude{position:absolute;right:5px;top:5px;z-index:4;width:28px;height:28px;padding:0;border-radius:50%;background:rgba(255,255,255,.94);font-size:20px;line-height:1}.batch-thumb{position:relative;height:180px;background:#111;border-radius:7px;overflow:hidden;cursor:zoom-in;display:flex;align-items:center;justify-content:center}.batch-card-canvas{width:100%;height:100%;object-fit:contain}.batch-expand-icon{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) scale(.9);width:44px;height:44px;border-radius:50%;background:rgba(23,42,58,.78);color:#fff;display:flex;align-items:center;justify-content:center;font-size:24px;opacity:0;transition:opacity .16s ease,transform .16s ease;pointer-events:none}.batch-thumb:hover .batch-expand-icon{opacity:1;transform:translate(-50%,-50%) scale(1)}
.batch-card-name{font-weight:700;margin-top:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.batch-card-meta,.batch-card-status{font-size:11px;color:#66737d;margin-top:3px;line-height:1.35}.batch-card-controls{display:grid;gap:5px;margin-top:7px}.batch-card-controls input,.batch-card-controls select{width:100%;min-width:0;padding:6px;font-size:11px}
.batch-image-pager{display:flex;justify-content:center;align-items:center;gap:5px;flex-wrap:wrap;margin:12px 0}.batch-image-pager button{padding:6px 9px}.batch-image-pager button.active{background:#205d83;color:#fff;border-color:#205d83}.batch-page-ellipsis{padding:0 2px;color:#66737d}.batch-commit-state{min-height:24px;margin-top:5px;text-align:right}
.batch-lightbox{position:fixed;inset:0;z-index:17000;background:rgba(11,18,24,.88);display:flex;align-items:center;justify-content:center;padding:24px}.batch-lightbox-dialog{position:relative;max-width:min(92vw,1500px);max-height:92vh;background:#fff;border-radius:12px;padding:14px;box-shadow:0 20px 60px #0008}.batch-lightbox-dialog img{display:block;max-width:88vw;max-height:80vh;object-fit:contain;background:#111;margin:auto}.batch-lightbox-title{font-weight:700;margin:0 42px 9px 0;overflow-wrap:anywhere}.batch-lightbox-close{position:absolute;right:10px;top:8px;width:32px;height:32px;border-radius:50%;padding:0;font-size:22px}
@media(max-width:1300px){.batch-image-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:760px){.batch-local-filters{grid-template-columns:1fr}.batch-image-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.batch-slide{padding:10px}}

/* v0.5.0-D.3.1: keep enhanced table layout stable during live tbody polling. */
.rib-dt-shell{contain:layout style}


/* v0.5.1 task workflow / notification UX */
.rib-task-form-fieldset{border:0;padding:0;margin:0;min-width:0}
.rib-task-form-fieldset.is-disabled{opacity:.58;filter:grayscale(.18)}
.rib-task-form-fieldset:disabled input,
.rib-task-form-fieldset:disabled select,
.rib-task-form-fieldset:disabled button{cursor:not-allowed}
.rib-run-progress-nav{display:flex;justify-content:flex-end;align-items:center;margin:7px 0 3px}
.rib-summary-table table{min-width:520px}.rib-summary-table th{width:220px;text-align:left}.rib-summary-table td{overflow-wrap:anywhere}
.rib-report-text{white-space:pre-wrap;line-height:1.55;padding:10px 12px;border:1px solid #dce5eb;border-radius:8px;background:#fbfcfd}
.status.legacy{background:#f1edf8;color:#5d467d;border-color:#d8cce8}
#ribTaskNoticeStack{position:fixed;z-index:16000;top:18px;left:50%;transform:translateX(-50%);width:min(900px,86vw);display:flex;flex-direction:column;gap:9px;pointer-events:none}
.rib-task-notice{position:relative;pointer-events:auto;background:rgba(255,255,255,.98);border:1px solid #97bdd4;border-left:5px solid #246b9a;border-radius:10px;box-shadow:0 10px 30px rgba(18,44,61,.22);padding:12px 46px 12px 16px;animation:ribNoticeRise .28s cubic-bezier(.2,.8,.2,1) both;transition:transform .18s ease,opacity .22s ease,max-height .22s ease,margin .22s ease,padding .22s ease}
.rib-task-notice-title{font-weight:800;color:#173f58;margin-bottom:2px}.rib-task-notice-text{line-height:1.45;color:#243b4a}
.rib-task-notice-close{position:absolute;right:9px;top:7px;width:29px;height:29px;padding:0;border-radius:50%;font-size:19px;line-height:1;background:#fff}
.rib-task-notice-link{display:inline;border:0;background:transparent;padding:0 1px;margin-left:6px;color:#145d88;border-bottom:1px dashed currentColor;border-radius:0;font-weight:700;cursor:pointer}
.rib-task-notice-link:hover{background:transparent;color:#0c4569}
.rib-task-notice.leaving{opacity:0;transform:translateY(-12px) scale(.985);max-height:0;margin:0;padding-top:0;padding-bottom:0;border-width:0;overflow:hidden}
@keyframes ribNoticeRise{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}
@media(max-width:720px){#ribTaskNoticeStack{top:10px;width:94vw}.rib-summary-table table{min-width:460px}}


/* RIB_WAVE2_FORMAL_20260920 */
.batch-macro-stepper{align-items:flex-start}
.batch-b-group{display:grid;gap:8px;align-items:start;justify-items:start}
.batch-b-group .batch-b-substeps{margin:0;min-width:max-content}
.rib-multifilter-native{display:none!important}
.rib-multifilter{position:relative;display:inline-block;min-width:150px;max-width:280px;vertical-align:middle}
.rib-multifilter-button{width:100%;min-width:150px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:#fff}
.rib-multifilter-panel{position:absolute;z-index:12000;left:0;top:calc(100% + 4px);min-width:240px;max-width:min(380px,80vw);max-height:320px;overflow:auto;background:#fff;border:1px solid #cbd6df;border-radius:10px;box-shadow:0 12px 30px rgba(20,40,60,.18);padding:8px}
.rib-multifilter-actions{display:flex;gap:6px;padding-bottom:7px;margin-bottom:6px;border-bottom:1px solid #e5ebf0}
.rib-multifilter-actions button{padding:5px 8px;font-size:12px}
.rib-multifilter-options{display:grid;gap:3px}
.rib-multifilter-options label{display:flex!important;flex-direction:row!important;align-items:center;gap:7px!important;font-weight:400!important;padding:5px 4px;cursor:pointer}
.rib-multifilter-options label:hover{background:#f4f8fb}
.qc-import-history{margin:12px 0 18px;padding:12px;border:1px solid #dce6ee;border-radius:10px;background:#fbfdff}

/* RIB_WAVE2_1_STABILIZATION_20260920 */
/* Macro chips share one true geometry; current state is emphasis, not scaling. */
.batch-macro-step{box-sizing:border-box;min-height:42px;line-height:1.25}
.batch-macro-step.current{transform:none!important}
.batch-b-group{grid-template-rows:auto auto}
.batch-b-group>.batch-macro-step{min-height:42px}

/* Stable B-1/B-2 comparison geometry. */
.batch-b1-modal{align-items:flex-start!important;padding-top:72px!important;padding-bottom:24px!important}
.batch-b1-modal-card{width:min(94vw,1200px)!important;max-width:min(94vw,1200px)!important;max-height:calc(100vh - 96px)!important;margin:0 auto!important}
.batch-b1-filter-title{font-weight:800;font-size:13px;color:#263846;width:100%;margin-bottom:2px}
.batch-b1-compare-empty{padding:28px 18px;text-align:center;border:1px dashed #c5d2dc;border-radius:10px;color:#667782;background:#fafcfd}

/* Unfinished import-session workspace. */
.rib-session-workspace{display:grid;gap:12px}
.rib-session-count-link{background:none!important;border:0!important;padding:0!important;color:#205d83!important;text-decoration:underline!important;cursor:pointer!important}
.rib-session-gallery{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px;overflow:auto;padding:4px}
.rib-session-image-card{border:1px solid #d7e0e7;border-radius:10px;overflow:hidden;background:#fff}
.rib-session-image-card img{display:block;width:100%;aspect-ratio:4/3;object-fit:contain;background:#111}
.rib-session-image-meta{padding:8px 10px;font-size:12px;display:grid;gap:3px;overflow-wrap:anywhere}

/* RibDataTable v1.1.0 header popovers. */
.rib-dt-controls{justify-content:flex-start}
.rib-dt-search-label,.rib-dt-search{display:none!important}
th.rib-dt-header-control{cursor:pointer;position:relative;padding-right:24px!important;user-select:none}
th.rib-dt-header-control::after{content:"▾";position:absolute;right:7px;top:50%;transform:translateY(-50%);font-size:11px;color:#7d8b95}
th.rib-dt-header-control:hover{background:#edf5fa}
th.rib-dt-filter-active::after{content:"●";color:#205d83;font-size:9px}
th.rib-dt-sort-asc::before,th.rib-dt-sort-desc::before{position:absolute;right:16px;top:50%;transform:translateY(-50%);font-size:9px;color:#205d83}
th.rib-dt-sort-asc::before{content:"▲"}th.rib-dt-sort-desc::before{content:"▼"}
.rib-dt-popover{position:fixed;z-index:19050;width:min(330px,calc(100vw - 16px));max-height:calc(100vh - 16px);overflow:auto;background:#fff;border:1px solid #b9c7d2;border-radius:10px;box-shadow:0 18px 45px rgba(18,35,48,.24);padding:10px;display:grid;gap:8px}
.rib-dt-pop-title{font-weight:800;border-bottom:1px solid #e1e7ec;padding:2px 2px 8px}
.rib-dt-pop-sort{display:grid;grid-template-columns:1fr 1fr;gap:6px}.rib-dt-pop-sort button.active{background:#e5f2fa;border-color:#6097bb;color:#174e72}
.rib-dt-pop-actions{display:flex;gap:6px}.rib-dt-pop-actions button{font-size:12px;padding:5px 8px}
.rib-dt-option-search{width:100%;box-sizing:border-box}
.rib-dt-options{display:grid;gap:2px;max-height:230px;overflow:auto;border:1px solid #e0e7ec;border-radius:6px;padding:5px;background:#fff}
.rib-dt-options label{display:flex!important;align-items:center;gap:7px!important;font-weight:400!important;padding:5px!important;cursor:pointer}.rib-dt-options label:hover{background:#f1f6f9}
.rib-dt-pop-footer{display:flex;justify-content:flex-end;gap:7px;border-top:1px solid #e1e7ec;padding-top:8px}.rib-dt-empty{padding:16px;text-align:center;color:#78858f}

/* My uploads details / actions. */
.rib-my-upload-actions{display:flex;gap:6px;flex-wrap:wrap}.rib-my-upload-filename{color:#205d83;text-decoration:underline;cursor:pointer;background:none;border:0;padding:0;text-align:left}


/* RIB_WAVE2_1_1_STABILIZATION_HOTFIX_20260920 */
/* Slider transforms are static so browser history/session resume cannot show Stage-A body under a Stage-C macro state. */
.batch-slider[data-step="A"] .batch-slide-track{transform:translate3d(0,0,0)}
.batch-slider[data-step="B"] .batch-slide-track,.batch-slider[data-step="B1"] .batch-slide-track{transform:translate3d(-100%,0,0)}
.batch-slider[data-step="B2"] .batch-slide-track{transform:translate3d(-200%,0,0)}
.batch-slider[data-step="C"] .batch-slide-track{transform:translate3d(-300%,0,0)}
.batch-slider[data-step="S"] .batch-slide-track{transform:translate3d(-400%,0,0)}

/* DataTable v1.2 typed filters and clear-all action. */
.rib-dt-controls{justify-content:space-between!important}
.rib-dt-clear-all{margin-left:auto}
.rib-dt-clear-all:disabled{opacity:.45;cursor:not-allowed}
.rib-dt-popover[data-side="right"]{transform-origin:left center}
.rib-dt-popover[data-side="left"]{transform-origin:right center}
.rib-dt-range-filter,.rib-dt-number-filter{display:grid;gap:8px;padding:4px 0}
.rib-dt-range-filter label{display:grid!important;grid-template-columns:92px minmax(0,1fr);align-items:center;gap:8px!important;font-weight:600!important}
.rib-dt-range-filter input{width:100%;box-sizing:border-box}
.rib-dt-number-filter label{display:grid!important;grid-template-columns:70px minmax(0,1fr);align-items:center;gap:8px!important}
.rib-dt-number-filter select,.rib-dt-number-filter input{width:100%;box-sizing:border-box}
@media(max-width:720px){
  .rib-dt-controls{align-items:stretch}
  .rib-dt-clear-all{margin-left:0;width:100%}
}

/* RIB_WAVE2_1_2_STABILIZATION_HOTFIX_20260920 */
.rib-dt-value-filter{display:grid;gap:7px;border-top:1px solid #e4e9ed;padding-top:8px}
.rib-dt-value-filter .rib-dt-option-search{order:0}
.rib-dt-value-filter .rib-dt-pop-actions{order:1}
.rib-dt-value-filter .rib-dt-options{order:2}

/* RIB_WAVE2_1_3_ANNOTATION_TABLE_STABILIZATION_20260920 */
.auto-label-model-row{display:block;width:100%;margin-top:8px}
.auto-label-model-row #autoLabelModel{display:block;width:100%;max-width:none;box-sizing:border-box}
.auto-label-model-note{margin:4px 0 8px;min-height:18px}
.auto-label-run-row{align-items:flex-end;gap:10px;flex-wrap:wrap}
.auto-label-progress{margin:8px 0 4px}
.auto-label-progress-segments{display:grid;grid-template-columns:repeat(3,1fr);gap:4px;height:8px;margin-bottom:5px}
.auto-label-progress-segments span{border-radius:999px;background:#e2e9ee;transition:background .18s ease}
.auto-label-progress-segments span.active{background:#2b78a6}
.rib-decision-card{max-width:min(720px,94vw)!important}
.rib-decision-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-start;margin-top:14px}
.rib-dt-popover .rib-dt-options{overscroll-behavior:contain}
.rib-dt-range-filter[data-typed-active="0"],.rib-dt-number-filter[data-typed-active="0"]{background:#fbfcfd;border-radius:7px;padding:7px}


/* RIB_WAVE2_1_4_NOTIFICATION_ANNOTATION_ARCHIVE_20260921 */
.annotation-version-picker-row{display:flex;align-items:flex-end;gap:8px;min-width:0}
.annotation-version-picker{flex:1 1 auto;min-width:0}
.annotation-version-picker select{width:100%}
.annotation-version-delete{flex:0 0 38px;width:38px;height:38px;border-radius:50%;font-size:20px;line-height:1;padding:0}
.annotation-version-delete[disabled]{opacity:.45;cursor:not-allowed}

/* RIB_DATATABLE_V131_TYPED_RANGE_OPTION_LINKAGE_20260921 */


/* RIB_WAVE2_2_PRE_B3_ASYNC_IMPORT_CONTINUAL_LEARNING_20260921 */
/* Modal positioning must never depend on visiting B-1 first. */
.batch-b1-modal{position:fixed!important;inset:0!important;z-index:17020!important;background:rgba(11,18,24,.88)!important;display:flex!important;justify-content:center!important;overflow:auto!important;align-items:flex-start!important;padding:72px 24px 24px!important}
.batch-b1-modal-card{position:relative!important;background:#fff!important;border-radius:12px!important;padding:14px!important;box-shadow:0 20px 60px #0008!important;display:flex!important;flex-direction:column!important;width:min(94vw,1200px)!important;max-width:min(94vw,1200px)!important;max-height:calc(100vh - 96px)!important;margin:0 auto!important}
.rib-decision-card{width:min(720px,94vw)!important;max-width:min(720px,94vw)!important}
.rib-wave22-leave-hint{margin-top:10px;padding:10px 12px;border:1px solid #d19b26;border-radius:10px;background:#fff7df;color:#6f4b00;font-weight:700;line-height:1.45}
.rib-wave22-policy-state{font-size:12px;color:#5f6d77}


/* RIB_WAVE2_2_1_RESUME_PROGRESS_STABILIZATION_20260926 */
.rib-wave221-progress-card{border:1px solid #c8d8e4;border-radius:12px;background:#f8fbfd;padding:16px 18px;margin:4px 0;min-height:132px;display:flex;flex-direction:column;justify-content:center}
.rib-wave221-progress-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px}
.rib-wave221-progress-track{height:12px;background:#e5edf2;border-radius:999px;overflow:hidden;position:relative;margin:4px 0 10px}
.rib-wave221-progress-track>div{height:100%;background:#246b9a;border-radius:999px;transition:width .2s ease}
.rib-wave221-progress-track.indeterminate>div,#batchProgressBar.rib-wave221-indeterminate{width:36%!important;animation:ribWave221Indeterminate 1.25s ease-in-out infinite}
@keyframes ribWave221Indeterminate{0%{transform:translateX(-120%)}50%{transform:translateX(90%)}100%{transform:translateX(300%)}}
.rib-wave221-progress-text{line-height:1.5}
.rib-wave221-resume-overlay{position:fixed;inset:0;z-index:19550;background:rgba(11,18,24,.58);display:flex;align-items:center;justify-content:center;padding:24px}
.rib-wave221-resume-card{width:min(92vw,520px);background:#fff;border-radius:14px;box-shadow:0 22px 70px #0007;padding:24px;text-align:center;display:grid;justify-items:center;gap:10px}
.rib-wave221-spinner{width:34px;height:34px;border-radius:50%;border:4px solid #dce6ed;border-top-color:#246b9a;animation:ribWave221Spin .8s linear infinite}
@keyframes ribWave221Spin{to{transform:rotate(360deg)}}
