:root{--bg:#f8fafc;--cyan:#2563eb;--purple:#8B5CF6;--t1:#F3F4F6;--t2:#9CA3AF;--t3:#4B5563;--card:rgba(7,20,40,.78);--bdr:rgba(37,99,235,.1);--cyan-soft:rgba(37,99,235,.05);--cyan-soft-2:rgba(37,99,235,.12);--cyan-soft-bd:rgba(37,99,235,.25);--amber:#FFB74D;--t-dim:#6B7280;--overlay:rgba(0,0,0,.7);--card-strong:rgba(7,20,40,.98);--shadow:rgba(0,0,0,.5);--btn-text:#fff}
body{background:var(--bg);color:#D1D5DB;font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;margin:0}
/* 浅色主题：header-user.js 依据白天时段/?theme=light 挂 body.light —— 变量级整体换肤 */
body.light{--bg:#F6F8FB;--cyan:#0E7A6A;--purple:#6D28D9;--t1:#1F2937;--t2:#4B5563;--t3:#9CA3AF;--card:rgba(255,255,255,.95);--bdr:rgba(14,122,106,.2);--cyan-soft:rgba(0,150,120,.06);--cyan-soft-2:rgba(0,150,120,.15);--cyan-soft-bd:rgba(14,122,106,.3);--amber:#92400E;--t-dim:#5B6472;--overlay:rgba(15,23,42,.55);--card-strong:rgba(255,255,255,.98);--shadow:rgba(15,23,42,.16);--btn-text:#fff;color:#374151}
body.light .form-input{background:#fff}
body.light .part-item{background:rgba(2,8,18,.03)}
body.light .output-tab{background:rgba(2,8,18,.03)}
body.light .output-content{background:#fff}
body.light .expr-rep-row{background:rgba(2,8,18,.03)}
body.light .warn-item{background:rgba(245,158,11,.1);border-left-color:#D97706;color:#92400E}
body.light .expr-sci-note{background:rgba(255,193,7,.1);color:#7A6210;border-color:rgba(217,119,6,.35)}
body.light .btn-primary{background:linear-gradient(135deg,rgba(14,122,106,.12),rgba(109,40,217,.1))}
body.light .btn-primary:hover{background:linear-gradient(135deg,rgba(14,122,106,.2),rgba(109,40,217,.16));box-shadow:0 0 30px rgba(14,122,106,.12)}

/* JS 驱动的交互类：颜色一律走 CSS 变量，随 body.light 自适应，不内联硬编码 */
.sel-item{display:inline-flex;align-items:center;gap:6px;padding:9px 14px;border:2px solid var(--bdr);border-radius:8px;cursor:pointer;font-size:.85rem}
.sel-item input{accent-color:var(--cyan)}
.sel-item.sel-reco{border-color:var(--cyan);background:var(--cyan-soft)}
.sel-sub{color:var(--t3);font-size:.75rem}
.repair-list{margin-top:8px;font-size:.76rem;color:var(--t3);line-height:1.8}
.repair-tag{display:inline-block;padding:2px 8px;margin:2px 4px 0 0;border:1px solid var(--cyan-soft-bd);border-radius:10px;background:var(--cyan-soft)}
.sel-warn{margin-top:6px;font-size:.78rem;color:var(--amber)}

/* 模板驱动的类：模式卡片 / 使用教程框 / 登录弹窗（原为模板内联暗色样式，已类化） */
.mode-card{position:relative;flex:1;min-width:200px;padding:14px;border:2px solid var(--bdr);border-radius:10px;cursor:pointer;background:transparent;transition:border-color .2s,background .2s,box-shadow .2s;display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.mode-card .mode-radio{width:16px;height:16px;margin:0;flex:0 0 auto;accent-color:var(--cyan);cursor:pointer}
.mode-card .mc-title{font-size:.95rem;color:var(--t1);line-height:1.3}
.mode-card .mc-desc{font-size:.78rem;color:var(--t-dim);margin-top:2px;flex-basis:100%;padding-left:24px}
.mode-card.mode-sel{border-color:var(--cyan);background:var(--cyan-soft-2);box-shadow:0 0 0 1px var(--cyan-soft-bd),0 0 16px var(--cyan-soft)}
.mode-card.mode-sel .mc-title{color:var(--cyan)}
.mode-card.mode-sel::after{content:'✓ 已选';margin-left:auto;flex:0 0 auto;font-size:.72rem;color:var(--cyan);font-weight:600;border:1px solid var(--cyan-soft-bd);background:var(--cyan-soft);border-radius:8px;padding:2px 8px}
.tutorial-box{max-width:860px;margin:32px auto 0;background:var(--card);border:1px solid var(--bdr);border-radius:16px;padding:28px;backdrop-filter:blur(14px);line-height:1.8;color:var(--t2)}
.tutorial-box h3{color:var(--t1);margin:0 0 14px}
.login-modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;background:var(--overlay);justify-content:center;align-items:center}
.login-modal .modal-box{background:var(--card-strong);border:1px solid var(--bdr);border-radius:16px;padding:40px;text-align:center;max-width:400px;width:90%;box-shadow:0 20px 60px var(--shadow)}
.login-modal .modal-icon{font-size:3rem;margin-bottom:16px}
.login-modal .modal-box h3{color:var(--t1);margin:0 0 8px;font-size:1.2rem}
.login-modal .modal-box p{color:var(--t-dim);font-size:.88rem;margin:0 0 24px;line-height:1.6}
.login-modal .login-btn{display:inline-block;padding:12px 40px;background:var(--cyan);color:var(--btn-text);border-radius:10px;text-decoration:none;font-weight:600;font-size:.95rem}
.login-modal .modal-cancel{display:block;margin:16px auto 0;background:none;border:none;color:var(--t-dim);cursor:pointer;font-size:.82rem;padding:8px 24px}
a{text-decoration:none}

.tool-hero{text-align:center;padding:40px 24px 20px;position:relative;z-index:10}
.tool-hero h1{font-size:1.8rem;color:var(--t1);margin:0 0 6px}
.tool-hero .sub{font-size:.9rem;color:var(--t2);max-width:600px;margin:0 auto}

.tool-wrap{max-width:900px;margin:0 auto;padding:0 24px 48px;position:relative;z-index:10}

/* Host selector */
.host-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:8px;margin-bottom:20px}
.host-card{padding:12px;background:var(--card);border:2px solid var(--bdr);border-radius:10px;cursor:pointer;transition:all .2s;text-align:center}
.host-card:hover{border-color:rgba(37,99,235,.3);transform:translateY(-1px)}
.host-card.active{border-color:var(--cyan);background:rgba(37,99,235,.08)}
.host-card .hn{font-size:.9rem;color:var(--t1);font-weight:600;margin-bottom:2px}
.host-card .hd{font-size:.75rem;color:var(--t3);line-height:1.3}

/* Form area */
.form-section{background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:24px;margin-bottom:16px}
.form-section h3{font-size:.95rem;color:var(--t1);margin:0 0 12px;display:flex;align-items:center;gap:8px}
.form-label{display:block;font-size:.82rem;color:var(--t2);margin-bottom:6px}
.form-input{width:100%;padding:10px 14px;background:rgba(2,8,18,.6);border:1px solid var(--bdr);border-radius:8px;color:var(--t1);font-size:.88rem;font-family:monospace;resize:vertical;box-sizing:border-box;transition:border-color .2s}
.form-input:focus{outline:none;border-color:var(--cyan)}
.form-textarea{min-height:100px;line-height:1.5}
.form-select{appearance:none;cursor:pointer}

.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px;background:linear-gradient(135deg,rgba(37,99,235,.15),rgba(139,92,246,.15));border:1px solid var(--cyan);border-radius:10px;color:var(--cyan);font-size:1rem;font-weight:600;cursor:pointer;transition:all .2s}
.btn-primary:hover{background:linear-gradient(135deg,rgba(37,99,235,.25),rgba(139,92,246,.25));box-shadow:0 0 30px rgba(37,99,235,.15)}
.btn-primary:disabled{opacity:.5;cursor:not-allowed}
.btn-download{padding:8px 16px;background:rgba(37,99,235,.1);border:1px solid var(--bdr);border-radius:6px;color:var(--cyan);font-size:.85rem;cursor:pointer;transition:all .15s}
.btn-download:hover{background:rgba(37,99,235,.2)}

/* Progress */
.progress-wrap{display:none;background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:20px;margin-bottom:16px;text-align:center}
.progress-bar{height:4px;background:rgba(37,99,235,.1);border-radius:2px;margin:12px 0;overflow:hidden}
.progress-bar-fill{height:100%;background:linear-gradient(90deg,var(--cyan),var(--purple));border-radius:2px;transition:width .3s;width:0}
.progress-msg{font-size:.85rem;color:var(--t2)}
.progress-elapsed{font-size:.78rem;color:var(--t3);margin-top:4px}

/* Results */
.result-wrap{display:none;background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:24px;margin-bottom:16px}
.result-section{margin-bottom:20px}
.result-section:last-child{margin-bottom:0}
.result-section h4{font-size:.9rem;color:var(--t1);margin:0 0 8px;padding-bottom:6px;border-bottom:1px solid var(--bdr)}
.rationale{font-size:.88rem;color:var(--t2);line-height:1.6;padding:10px 14px;background:rgba(37,99,235,.04);border-radius:8px}

/* Module bar visualization */
.module-bar{display:flex;gap:2px;margin:12px 0;height:36px;border-radius:6px;overflow:hidden}
.module-seg{display:flex;align-items:center;justify-content:center;font-size:.68rem;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-shadow:0 1px 2px rgba(0,0,0,.5)}
.module-seg:hover{filter:brightness(1.3)}
.seg-P{background:#2196F3}.seg-R{background:#FF9800}.seg-S{background:#E91E63}
.seg-N{background:#9C27B0}.seg-L{background:#607D8B}.seg-C{background:#4CAF50}
.seg-T{background:#F44336}.seg-tag{background:#795548}
.seg-colors{display:flex;gap:10px;flex-wrap:wrap;margin:8px 0;font-size:.72rem;color:var(--t3)}

/* Parts list */
.parts-list{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.part-item{padding:8px 12px;background:rgba(2,8,18,.4);border-radius:6px;font-size:.82rem}
.part-item .pi-label{color:var(--t3);font-size:.72rem}
.part-item .pi-value{color:var(--t1);font-weight:500}
.part-item .pi-reason{color:var(--t2);font-size:.75rem;margin-top:2px}

/* Output tabs */
.output-tabs{display:flex;gap:4px;margin-bottom:12px}
.output-tab{padding:6px 14px;background:rgba(2,8,18,.4);border:1px solid var(--bdr);border-radius:6px 6px 0 0;color:var(--t2);font-size:.82rem;cursor:pointer}
.output-tab.active{background:var(--card);border-bottom-color:transparent;color:var(--cyan)}
.output-content{background:rgba(2,8,18,.6);border:1px solid var(--bdr);border-radius:0 8px 8px 8px;padding:16px;max-height:400px;overflow:auto;font-size:.78rem;font-family:monospace;color:var(--t2);line-height:1.5;white-space:pre-wrap;word-break:break-all}
.output-content::-webkit-scrollbar{width:6px}
.output-content::-webkit-scrollbar-thumb{background:rgba(37,99,235,.15);border-radius:3px}

.balance-bar{font-size:.8rem;color:var(--t3);text-align:center;margin-bottom:16px}
.balance-bar span{color:var(--cyan)}

.warn-item{padding:6px 10px;background:rgba(255,152,0,.08);border-left:3px solid #FF9800;border-radius:0 4px 4px 0;font-size:.82rem;color:#FFB74D;margin-bottom:4px}
/* 预计消耗提示（通用工具页同款样式） */
.tool-cost-hint{margin:0 0 12px;font-size:.82rem;color:#6B7280;line-height:1.6}
body.light .tool-cost-hint{color:#8B7355}

/* 科研诚信升级：声明横幅 / 密码子优化报告 / 元件来源追溯 */
.expr-sci-note{background:rgba(255,193,7,.06);color:#EBD9A6;border:1px solid rgba(255,193,7,.22)}
.part-item .pi-src{display:inline-block;color:var(--t3);font-size:.7rem;margin-top:2px;word-break:break-all;line-height:1.5}
.part-item .pi-src-link{color:var(--cyan);text-decoration:underline;text-underline-offset:2px;word-break:break-all}
.part-item .pi-src-link:hover{opacity:.85}
.part-item .pi-src.pi-codon{color:var(--cyan)}
body.light .part-item .pi-src-link{color:#0E7A6A}
body.light .part-item .pi-src.pi-codon{color:#0E7A6A}
.expr-rep{display:flex;flex-direction:column;gap:6px;font-size:.8rem}
.expr-rep-row{display:flex;flex-wrap:wrap;gap:6px 14px;padding:6px 10px;background:rgba(2,8,18,.4);border-radius:6px;color:var(--t2);line-height:1.7}
.expr-rep-k{font-weight:600;color:var(--t1);min-width:9em}
.expr-cst{font-weight:600;color:var(--t1)}
.expr-cst-desc{color:var(--t2)}
.expr-rep-warn{border-left:3px solid #FF9800;background:rgba(255,152,0,.08);color:#FFB74D}
.expr-warn-line{line-height:1.7}
body.light .expr-cst{color:#1F2937}
body.light .expr-cst-desc{color:#4A5568}
body.light .expr-rep-warn{border-left-color:#D97706;background:rgba(245,158,11,.08);color:#92400E}

/* ===== 信号肽切割位点校验（SignalP 6.0, Item E, 2026-08-17）===== */
.expr-signalp-advice{border-left:3px solid var(--cyan);background:rgba(37,99,235,.06);color:var(--t2)}
.expr-signalp-ok{border-left:3px solid #2ECC71;background:rgba(46,204,113,.08);color:#7CFC9B}
.expr-signalp-warn{border-left:3px solid #FF9800;background:rgba(255,152,0,.08);color:#FFB74D}
.expr-signalp-info{border-left:3px solid #5DADE2;background:rgba(93,173,226,.08);color:#9FD6F8}
body.light .expr-signalp-advice{border-left-color:#0E7A6A;background:rgba(0,150,120,.06);color:#4A5568}
body.light .expr-signalp-ok{border-left-color:#059669;background:rgba(5,150,105,.08);color:#065F46}
body.light .expr-signalp-warn{border-left-color:#D97706;background:rgba(245,158,11,.08);color:#92400E}
body.light .expr-signalp-info{border-left-color:#2563EB;background:rgba(37,99,235,.08);color:#1E40AF}

/* ===== 表达模块设计器 SEO 信任徽标 + 正文区块（2026-08-16）===== */
.trust-badges{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:12px 0 0}
.trust-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 14px;background:rgba(37,99,235,.05);border:1px solid rgba(37,99,235,.18);border-radius:20px;color:var(--t2);font-size:.78rem;line-height:1.7;white-space:nowrap}
.trust-badge::before{content:"\2713";color:var(--cyan);font-weight:700}
body.light .trust-badge{background:rgba(0,150,120,.05);border-color:rgba(0,150,120,.25);color:#4A5568}
body.light .trust-badge::before{color:#0E7A6A}
.tool-seo{max-width:960px;margin:44px auto 12px;padding:26px 20px 8px;border-top:1px solid var(--bdr)}
.tool-seo h2{font-size:1.12rem;color:var(--t1);margin:24px 0 8px;line-height:1.6;font-weight:600}
.tool-seo p{font-size:.87rem;color:var(--t2);line-height:1.95;margin:0 0 4px}
.tool-seo a{color:var(--cyan);text-decoration:underline;text-underline-offset:2px}
body.light .tool-seo h2{color:#1F2937}
body.light .tool-seo p{color:#4A5568}
body.light .tool-seo a{color:#0E7A6A}

/* ===== 乐高式模块组装：分步侧边栏 + 我的模块库（Stage A, 2026-08-16）===== */
/* 布局：左侧分步侧边栏 + 右侧内容区；样式全部走 CSS 变量，随 body.light 换肤 */
.expr-layout{display:flex;gap:20px;align-items:flex-start;max-width:1180px;margin:0 auto;padding:0 24px 8px;position:relative;z-index:10}
.expr-sidebar{flex:0 0 190px;position:sticky;top:16px}
.expr-steps{display:flex;flex-direction:column;gap:6px;background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:12px;backdrop-filter:blur(14px)}
.expr-step{display:flex;align-items:center;gap:8px;padding:11px 12px;border-radius:8px;color:var(--t2);font-size:.88rem;cursor:pointer;transition:all .18s;border:1px solid transparent;user-select:none}
.expr-step:hover{background:var(--cyan-soft)}
.expr-step-active{background:var(--cyan-soft-2);border-color:var(--cyan-soft-bd);color:var(--cyan);font-weight:600}
.expr-step-num{font-style:normal;font-weight:700;flex:0 0 auto}
.expr-step-txt{line-height:1.3}
.expr-step-soon{color:var(--t3);cursor:not-allowed;opacity:.6}
.expr-step-soon:hover{background:transparent}
.expr-step-tag{margin-left:auto;font-size:.62rem;color:var(--t3);border:1px solid var(--bdr);border-radius:8px;padding:1px 6px;white-space:nowrap}
.expr-content{flex:1 1 auto;min-width:0}
.expr-view{display:none}
#exprViewDesign{display:block}
body.light .expr-step-soon{color:#9CA3AF}
body.light .expr-step-soon .expr-step-tag{color:#9CA3AF}
/* 侧边栏布局下 tool-wrap 不再自身居中，由 expr-content 承接间距 */
.expr-content .tool-wrap{max-width:900px;padding:0 0 48px;margin:0}

/* 模块库视图 */
.modlib-wrap{background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:20px;backdrop-filter:blur(14px)}
.modlib-head{display:flex;align-items:baseline;gap:10px;margin-bottom:14px}
.modlib-title{font-size:1.05rem;color:var(--t1);font-weight:600}
.modlib-count{font-size:.78rem;color:var(--t3)}
.modlib-filters{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
.modlib-search{flex:1 1 220px;max-width:340px}
.modlib-group-filter{width:auto;min-width:130px;cursor:pointer}
.modlib-loading{font-size:.85rem;color:var(--t3);padding:30px 0;text-align:center}
.modlib-error{font-size:.85rem;color:var(--amber);padding:20px 0;text-align:center}
.modlib-empty{font-size:.85rem;color:var(--t3);padding:30px 0;text-align:center;line-height:1.8}
.modlib-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}

/* 模块卡片：缩略图（启动子-CDS-终止子结构色块条，CSS 绘制） */
.mod-card{background:var(--card-strong);border:1px solid var(--bdr);border-radius:10px;padding:12px;transition:all .18s;display:flex;flex-direction:column;gap:8px}
.mod-card:hover{border-color:var(--cyan-soft-bd);box-shadow:0 4px 18px var(--shadow)}
.mod-thumb{display:flex;height:10px;border-radius:5px;overflow:hidden;gap:1px;background:var(--cyan-soft)}
.mod-thumb-seg{height:100%;display:block}
.mod-thumb-seg.seg-P{background:var(--seg-promoter,#12b981)}
.mod-thumb-seg.seg-C{background:var(--seg-cds,#4f7cff)}
.mod-thumb-seg.seg-T{background:var(--seg-terminator,#f59e0b)}
body.light .mod-thumb-seg.seg-P{background:#059669}
body.light .mod-thumb-seg.seg-C{background:#3b6fe0}
body.light .mod-thumb-seg.seg-T{background:#d97706}
.mod-card-top{display:flex;justify-content:space-between;align-items:flex-start;gap:8px}
.mod-card-name{font-size:.86rem;color:var(--t1);font-weight:600;word-break:break-all;line-height:1.35}
.mod-card-host{font-size:.7rem;color:var(--cyan);border:1px solid var(--cyan-soft-bd);background:var(--cyan-soft);border-radius:8px;padding:1px 7px;white-space:nowrap;flex:0 0 auto}
.mod-card-group{font-size:.72rem;color:var(--t2);display:inline-block}
.mod-card-meta{font-size:.74rem;color:var(--t3);line-height:1.6}
.mod-card-actions{display:flex;gap:6px;margin-top:2px;flex-wrap:wrap}
.btn-mini{padding:6px 12px;background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:6px;color:var(--cyan);font-size:.78rem;cursor:pointer;transition:all .15s}
.btn-mini:hover{background:var(--cyan-soft-2)}
.btn-mini-del{background:transparent;border-color:rgba(239,68,68,.35);color:#F87171}
.btn-mini-del:hover{background:rgba(239,68,68,.12)}
.btn-mini-load{background:linear-gradient(135deg,rgba(37,99,235,.12),rgba(139,92,246,.12))}
body.light .btn-mini-del{color:#DC2626;border-color:rgba(220,38,38,.35)}
body.light .btn-mini-del:hover{background:rgba(220,38,38,.1)}

/* 存入模块库 / 模块详情弹窗 */
.mod-save-box{text-align:left;max-width:420px !important;padding:28px !important}
.mod-save-box h3{margin-bottom:6px}
.mod-modal-desc{font-size:.8rem;color:var(--t3);margin:0 0 16px;line-height:1.6;text-align:left}
.mod-save-status{min-height:18px;font-size:.78rem;color:var(--amber);margin-top:8px;text-align:left}
.mod-save-cancel{flex:0 0 auto}
.mod-save-ok{flex:1 1 auto;width:auto !important}
.mod-detail-box{max-width:640px !important;padding:24px !important;text-align:left}
.mod-detail-box h3{text-align:left}
.mod-detail-meta{font-size:.78rem;color:var(--t3);margin-bottom:12px;text-align:left}
.mod-detail-content{max-height:300px;text-align:left}
body.light .mod-save-status{color:#92400E}

/* 手动添加模块弹窗（A 结构化 / B 纯序列） */
.modman-box{max-width:560px !important;padding:28px !important;text-align:left;max-height:88vh;overflow-y:auto}
.modman-box h3{margin-bottom:6px}
.modman-mode-row{display:flex;gap:8px;margin:12px 0 14px}
.modman-mode{flex:1;padding:9px 12px;border:1px solid var(--bdr);border-radius:8px;background:var(--card-strong);color:var(--t2);font-size:.83rem;cursor:pointer;transition:all .15s}
.modman-mode.active{border-color:var(--cyan-soft-bd);background:var(--cyan-soft);color:var(--cyan);font-weight:600}
.modman-mode:hover{border-color:var(--cyan-soft-bd)}
.modman-grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}
.modman-flabel{display:flex;flex-direction:column;gap:6px;font-size:.78rem;color:var(--t2)}
.modman-req{color:#F87171}
.modman-rbs{font-size:.76rem;color:var(--t3);background:var(--cyan-soft);border:1px dashed var(--cyan-soft-bd);border-radius:6px;padding:6px 10px;margin:10px 0 2px;line-height:1.6}
.modman-textarea{width:100%;box-sizing:border-box;margin-top:8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.8rem;line-height:1.6}
.modman-ok{flex:1 1 auto;width:auto !important}
body.light .modman-req{color:#DC2626}

/* 模块卡片「手动」标记 */
.mod-card-badge-manual{display:inline-block;font-size:.62rem;font-weight:600;color:var(--cyan);background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:6px;padding:0 5px;margin-left:6px;vertical-align:1px}
.asm-pick-name .mod-card-badge-manual{margin-left:5px;vertical-align:1px}

/* 结果区「存入模块库」按钮 */
.mod-save-btn{padding:10px 24px;font-size:.88rem}

/* 全局 toast（Expr.toast 动态创建） */
.expr-toast{position:fixed;bottom:32px;left:50%;transform:translateX(-50%) translateY(20px);background:var(--card-strong);border:1px solid var(--cyan-soft-bd);color:var(--t1);padding:10px 22px;border-radius:10px;font-size:.85rem;z-index:99999;opacity:0;pointer-events:none;transition:all .25s;box-shadow:0 10px 30px var(--shadow)}
.expr-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.expr-toast-err{border-color:rgba(239,68,68,.4);color:#F87171}
body.light .expr-toast-err{color:#DC2626}

/* 移动端：侧边栏转顶部横向步骤条 */
@media (max-width:720px){
  .expr-layout{flex-direction:column;padding:0 16px}
  .expr-sidebar{flex:1 1 auto;width:100%;position:static;top:auto}
  .expr-steps{flex-direction:row;flex-wrap:wrap}
  .expr-step{flex:1 1 auto;justify-content:center}
}

/* ===== 多基因组装（③）与结果输出（④）（Stage E, 2026-08-17）===== */
.asm-wrap{background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:22px;backdrop-filter:blur(14px)}
.asm-head{margin-bottom:18px}
.asm-title{font-size:1.08rem;color:var(--t1);font-weight:600;display:flex;align-items:center;gap:8px}
.asm-desc{font-size:.8rem;color:var(--t2);margin-top:4px;line-height:1.7}
.asm-section{margin-bottom:22px}
.asm-section h4{font-size:.9rem;color:var(--t1);margin:0 0 10px;padding-bottom:6px;border-bottom:1px solid var(--bdr)}
.asm-section h4:before{content:"";display:inline-block;width:4px;height:14px;background:var(--cyan);border-radius:2px;margin-right:8px;vertical-align:-2px}
.asm-pick-tools{display:flex;gap:8px;margin-bottom:12px}
.asm-pick-loading{font-size:.82rem;color:var(--t3);padding:20px 0;text-align:center}
.asm-pick-error{font-size:.82rem;color:var(--amber);padding:16px 0;text-align:center}
.asm-pick-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px}
.asm-pick-card{position:relative;background:var(--card-strong);border:1px solid var(--bdr);border-radius:10px;padding:12px;cursor:pointer;transition:all .18s;display:flex;flex-direction:column;gap:6px}
.asm-pick-card:hover{border-color:var(--cyan-soft-bd);box-shadow:0 4px 18px var(--shadow)}
.asm-pick-card.asm-pick-sel{border-color:var(--cyan);background:var(--cyan-soft-2);box-shadow:0 0 0 1px var(--cyan-soft-bd)}
.asm-pick-check{position:absolute;top:8px;right:8px;width:20px;height:20px;border-radius:50%;border:1px solid var(--cyan-soft-bd);display:flex;align-items:center;justify-content:center;font-size:.72rem;color:var(--cyan);background:var(--card)}
.asm-pick-card.asm-pick-sel .asm-pick-check{background:var(--cyan);color:var(--btn-text);border-color:var(--cyan)}
.asm-pick-name{font-size:.84rem;color:var(--t1);font-weight:600;line-height:1.35;word-break:break-all;padding-right:22px}
.asm-pick-meta{font-size:.72rem;color:var(--t3);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.asm-pick-group{font-size:.7rem;color:var(--t2);border:1px solid var(--bdr);border-radius:8px;padding:1px 8px;display:inline-block;width:fit-content;word-break:break-all}
.asm-hint{font-size:.8rem;color:var(--t2);margin-bottom:10px}
.asm-hint b{color:var(--cyan)}
.asm-list{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}
.asm-row{display:flex;align-items:center;gap:8px;background:var(--card-strong);border:1px solid var(--bdr);border-radius:8px;padding:8px 12px;flex-wrap:wrap}
.asm-row-idx{flex:0 0 auto;width:22px;height:22px;border-radius:50%;background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);color:var(--cyan);display:flex;align-items:center;justify-content:center;font-size:.72rem;font-weight:700}
.asm-row-name{flex:1 1 120px;font-size:.84rem;color:var(--t1);font-weight:600;word-break:break-all;min-width:80px}
.asm-row-len{font-size:.74rem;color:var(--t3);white-space:nowrap}
.asm-row-dir{min-width:64px}
.asm-empty{font-size:.82rem;color:var(--t3);padding:14px 0;text-align:center;border:1px dashed var(--bdr);border-radius:8px}
.asm-route-row{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.asm-route{position:relative;flex:1 1 160px;padding:12px 14px;border:2px solid var(--bdr);border-radius:10px;cursor:pointer;background:transparent;transition:all .18s;display:flex;align-items:center;gap:8px}
.asm-route input{accent-color:var(--cyan);margin:0;flex:0 0 auto;cursor:pointer}
.asm-route:hover{border-color:var(--cyan-soft-bd)}
.asm-route:has(input:checked),.asm-route.route-checked{border-color:var(--cyan);background:var(--cyan-soft-2);box-shadow:0 0 0 1px var(--cyan-soft-bd)}
.asm-route .ar-name{font-size:.88rem;color:var(--t1);font-weight:600}
.asm-route .ar-note{flex-basis:100%;font-size:.72rem;color:var(--t3);line-height:1.5;padding-left:24px}
.asm-route-note{font-size:.78rem;color:var(--t2);line-height:1.8;padding:8px 12px;background:var(--cyan-soft);border-left:3px solid var(--cyan);border-radius:0 6px 6px 0;margin-bottom:14px}
body.light .asm-route-note{background:rgba(0,150,120,.06)}

/* 结果视图 */
.asm-result-wrap{background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:24px;backdrop-filter:blur(14px)}
.asm-result-empty{font-size:.88rem;color:var(--t3);padding:60px 0;text-align:center;line-height:2}
.asm-result-head{margin-bottom:16px}
.asm-record-head{display:none}
.asm-result-title{font-size:1.25rem;color:var(--t1);font-weight:700}
.asm-result-route{display:inline-block;margin-top:6px;font-size:.8rem;color:var(--cyan);border:1px solid var(--cyan-soft-bd);background:var(--cyan-soft);border-radius:8px;padding:3px 12px}
.asm-result-meta{font-size:.76rem;color:var(--t3);margin-top:6px}
.asm-result-actions{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0 18px}
.asm-note-list{display:flex;flex-direction:column;gap:6px}
.asm-note-item{font-size:.82rem;color:var(--t2);line-height:1.7;padding:8px 12px;background:var(--cyan-soft);border-radius:8px}
.asm-note-item.asm-ok{color:var(--cyan);border-left:3px solid var(--cyan)}
.asm-note-item.asm-bad{color:var(--amber);border-left:3px solid #F59E0B;background:rgba(255,152,0,.08)}

/* 通路结构图 */
.asm-pathway-bar{display:flex;height:42px;border-radius:6px;overflow:hidden;border:1px solid var(--bdr);gap:2px;background:var(--cyan-soft)}
.asm-path-seg{height:100%;min-width:2px;transition:filter .15s}
.asm-path-seg:hover{filter:brightness(1.35)}
.asm-pathway-legend{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;font-size:.72rem;color:var(--t2)}
.asm-legend-item{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--bdr);border-radius:8px;padding:2px 8px;background:var(--card-strong)}
.asm-legend-dot{width:10px;height:10px;border-radius:3px;flex:0 0 auto}
.asm-details{margin-top:12px;font-size:.8rem}
.asm-details summary{cursor:pointer;color:var(--cyan);user-select:none}
.asm-seq{font-family:monospace;font-size:.72rem;color:var(--t2);word-break:break-all;line-height:1.6;padding:10px 12px;background:rgba(2,8,18,.4);border:1px solid var(--bdr);border-radius:6px;margin-top:8px;max-height:180px;overflow:auto;white-space:pre-wrap}
body.light .asm-seq{background:rgba(2,8,18,.04);color:#374151}

/* 数据表格 */
.asm-table{width:100%;border-collapse:collapse;font-size:.8rem;margin-top:8px}
.asm-table th,.asm-table td{border:1px solid var(--bdr);padding:6px 9px;text-align:left;vertical-align:top;line-height:1.55;color:var(--t2)}
.asm-table th{background:var(--cyan-soft);color:var(--t1);font-weight:600;white-space:nowrap}
.asm-table td code{font-family:monospace;font-size:.74rem;color:var(--cyan);word-break:break-all}
.asm-table.asm-kv th{width:110px;white-space:nowrap}
.asm-kv th{background:var(--cyan-soft)}
.asm-seq-cell{display:inline-block;max-width:420px;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}
.asm-primer-meta{font-size:.68rem;color:var(--t3);margin-top:2px}
.asm-gg-overhang{color:#F59E0B;font-weight:600;font-family:monospace;font-size:.74rem}
.asm-gg-arm{font-family:monospace;color:var(--cyan);font-size:.72rem;word-break:break-all}
.asm-gg-dir{font-size:.72rem;color:var(--t2);border:1px solid var(--bdr);border-radius:8px;padding:1px 8px;white-space:nowrap}
.asm-gg-note{font-size:.74rem;color:var(--t3);line-height:1.7;margin-top:8px;padding:8px 10px;background:var(--cyan-soft);border-radius:6px}
body.light .asm-gg-dir{color:#4A5568}

/* ===== 反向模块风险提示（Item F, 2026-08-17）===== */
.asm-dir-rev{display:inline-block;font-size:.72rem;font-weight:700;color:#FFB74D;border:1px solid rgba(245,158,11,.55);background:rgba(255,152,0,.12);border-radius:8px;padding:1px 8px;white-space:nowrap;cursor:help}
.asm-dir-rev:hover{box-shadow:0 0 0 2px rgba(255,152,0,.15)}
body.light .asm-dir-rev{color:#B45309;border-color:rgba(217,119,6,.55);background:rgba(245,158,11,.1)}
.asm-host-warn{margin:0 0 14px;padding:12px 14px;border:1px solid rgba(245,158,11,.45);border-left:4px solid #F59E0B;border-radius:8px;background:rgba(255,152,0,.08)}
.asm-host-warn-title{font-size:.84rem;color:var(--amber);font-weight:700;margin-bottom:4px}
.asm-host-warn-msg{font-size:.8rem;color:var(--t2);line-height:1.7}
.asm-host-warn-hosts{font-size:.74rem;color:var(--amber);margin-top:6px;font-family:monospace}
body.light .asm-host-warn{background:rgba(245,158,11,.1);border-color:rgba(217,119,6,.4);border-left-color:#D97706}
body.light .asm-host-warn-title{color:#92400E}
body.light .asm-host-warn-msg{color:#4A5568}
body.light .asm-host-warn-hosts{color:#92400E}
/* D6：路线可行性横幅——Golden Gate 路线但骨架无 Type IIS 位点（红/橙警示） */
.asm-route-feas-warn{margin:0 0 14px;padding:12px 14px;border:1px solid rgba(248,113,113,.5);border-left:4px solid #EF4444;border-radius:8px;background:rgba(239,68,68,.08)}
.asm-route-feas-title{font-size:.84rem;color:#F87171;font-weight:700;margin-bottom:4px}
.asm-route-feas-msg{font-size:.8rem;color:var(--t2);line-height:1.7}
body.light .asm-route-feas-warn{background:rgba(239,68,68,.07);border-color:rgba(220,38,38,.4);border-left-color:#DC2626}
body.light .asm-route-feas-title{color:#B91C1C}
.asm-seam-id{font-size:.68rem;color:var(--t3)}
.asm-grade{display:inline-block;font-weight:700;font-size:.76rem;padding:1px 10px;border-radius:10px}
.grade-hi{color:#34D399;background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.35)}
.grade-mi{color:#FBBF24;background:rgba(251,191,36,.1);border:1px solid rgba(251,191,36,.3)}
.grade-lo{color:#F87171;background:rgba(248,113,113,.1);border:1px solid rgba(248,113,113,.35)}
body.light .grade-hi{color:#059669;background:rgba(5,150,105,.1);border-color:rgba(5,150,105,.35)}
body.light .grade-mi{color:#B45309;background:rgba(217,119,6,.1);border-color:rgba(217,119,6,.35)}
body.light .grade-lo{color:#DC2626;background:rgba(220,38,38,.08);border-color:rgba(220,38,38,.3)}
.asm-reasons{font-size:.74rem;color:var(--t3)}

/* 驯化报告 */
.asm-dom-mod{margin:10px 0;padding:12px;background:rgba(2,8,18,.35);border-radius:8px;border:1px solid var(--bdr)}
.asm-dom-title{font-size:.82rem;color:var(--t1);font-weight:600;margin-bottom:8px}
.asm-sug{font-size:.78rem;color:var(--amber);line-height:1.7;padding:6px 10px;background:rgba(255,152,0,.08);border-left:3px solid #F59E0B;border-radius:0 4px 4px 0;margin-top:6px}
body.light .asm-dom-mod{background:rgba(2,8,18,.03)}
body.light .asm-sug{color:#92400E;background:rgba(245,158,11,.08);border-left-color:#D97706}

/* 克隆/共转化步骤 */
.asm-steps{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.asm-step-item{display:flex;gap:12px;padding:10px 12px;background:rgba(2,8,18,.35);border:1px solid var(--bdr);border-radius:8px}
.asm-step-num{flex:0 0 auto;width:22px;height:22px;border-radius:50%;background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);color:var(--cyan);display:flex;align-items:center;justify-content:center;font-size:.74rem;font-weight:700}
.asm-step-body{flex:1 1 auto;min-width:0}
.asm-step-title{font-size:.84rem;color:var(--t1);font-weight:600;line-height:1.5}
.asm-step-detail{font-size:.78rem;color:var(--t2);line-height:1.7;margin-top:2px}
body.light .asm-step-item{background:rgba(2,8,18,.03)}

/* 打印（页面直接打印时兜底；PDF 导出走新窗口内联样式） */
@media print{
  body{background:#fff !important;color:#111 !important}
  .tool-hero,.expr-sidebar,.asm-result-actions,.btn-mini,.tool-seo,.tutorial-box,.balance-bar,.expr-toast{display:none !important}
  .expr-layout{display:block !important;max-width:100%;padding:0}
  .expr-content{display:block !important}
  .expr-view{display:none !important}
  #exprViewResult{display:block !important}
  .asm-result-wrap{box-shadow:none;border:none;background:#fff;padding:0}
  .asm-record-head{display:block;font-size:20px;font-weight:700;color:#0b3b8f;margin-bottom:4px}
  .asm-table th,.asm-table td{border-color:#999}
  .asm-section{break-inside:avoid}
  .asm-seq{background:rgba(2,8,18,.05);color:#111}
}

/* ── 纯 TU 模块扩增引物（2026-08-17 追加）── */
.expr-primer-seq{font-family:'Courier New',Consolas,monospace;color:var(--cyan);letter-spacing:.3px;word-break:break-all}
.expr-rep-note{margin-top:6px;padding:8px 10px;font-size:.74rem;color:var(--t3);background:rgba(2,8,18,.35);border:1px solid var(--bdr);border-radius:6px;line-height:1.7}
body.light .expr-rep-note{background:rgba(2,8,18,.03)}

/* ── 组装：最终载体骨架 + 单一抗性标记 下拉（2026-08-17 追加）── */
.asm-parts-grid{display:flex;flex-wrap:wrap;gap:14px;margin-top:8px}
.asm-parts-field{display:flex;flex-direction:column;gap:6px;font-size:.8rem;font-weight:600;color:var(--t2);min-width:280px}
.asm-parts-field .form-select{width:100%}
.asm-parts-field select option{color:#0e1626;background:#f5f7fa}

/* ── 组装：最终环形通路质粒展示（2026-08-17 追加）── */
.asm-plasmid-head{display:flex;flex-wrap:wrap;gap:8px 18px;align-items:center;font-size:.82rem;color:var(--t2);margin:4px 0 10px}
.asm-plasmid-badge{display:inline-block;padding:2px 10px;border:1px solid var(--cyan);color:var(--cyan);border-radius:999px;font-size:.72rem}
.asm-plasmid-bar{display:flex;width:100%;height:34px;border-radius:8px;overflow:hidden;border:1px solid var(--bdr);margin:6px 0 8px}
.asm-plasmid-part{display:flex;align-items:center;justify-content:center;color:#fff;font-size:.68rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.asm-plasmid-legend{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:.76rem;color:var(--t2)}
.asm-warn{margin:6px 0;padding:8px 12px;border-left:3px solid #FF9800;background:rgba(255,152,0,.08);color:#FFB74D;border-radius:4px;font-size:.8rem}
body.light .asm-warn{border-left-color:#D97706;color:#92400E}

/* ── 组装：组装风险预判 + 对照方案（2026-08-17 追加）── */
/* 风险等级徽章：注意与接缝 .grade-hi/mi/lo（好=绿）语义相反，独立命名，不复用 */
.risk-sev{display:inline-block;font-weight:700;font-size:.74rem;padding:1px 10px;border-radius:10px;white-space:nowrap}
.risk-hi{color:#F87171;background:rgba(248,113,113,.12);border:1px solid rgba(248,113,113,.4)}
.risk-mi{color:#FBBF24;background:rgba(251,191,36,.1);border:1px solid rgba(251,191,36,.32)}
.risk-lo{color:#34D399;background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.35)}
body.light .risk-hi{color:#DC2626;background:rgba(220,38,38,.08);border-color:rgba(220,38,38,.32)}
body.light .risk-mi{color:#B45309;background:rgba(217,119,6,.1);border-color:rgba(217,119,6,.35)}
body.light .risk-lo{color:#059669;background:rgba(5,150,105,.1);border-color:rgba(5,150,105,.35)}
.risk-summary-badges{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 4px}
.risk-badge{display:inline-flex;align-items:center;gap:6px;font-size:.76rem;color:var(--t2);border:1px solid var(--bdr);background:var(--card-strong);border-radius:10px;padding:3px 10px}
.risk-badge b{color:var(--t1)}
.risk-badge.risk-bad-high b{color:#F87171}
.risk-badge.risk-bad-mid b{color:#FBBF24}
.risk-badge.risk-bad-low b{color:#34D399}
body.light .risk-badge.risk-bad-high b{color:#DC2626}
body.light .risk-badge.risk-bad-mid b{color:#B45309}
body.light .risk-badge.risk-bad-low b{color:#059669}
.risk-sub{margin-top:12px}
.risk-sub-title{font-size:.82rem;color:var(--t1);font-weight:600;margin-bottom:6px}
.risk-pos{font-family:'Courier New',Consolas,monospace;font-size:.72rem;color:var(--t3)}
.risk-advice{font-size:.76rem;color:var(--t2);line-height:1.7;margin-top:4px}
.risk-method{margin-top:10px}
.risk-note{margin-top:8px}
.asm-ctrl-box{margin-top:12px;padding:12px;background:rgba(2,8,18,.35);border:1px solid var(--bdr);border-radius:8px}
.asm-ctrl-desc{font-size:.78rem;color:var(--t2);line-height:1.7;margin-bottom:8px}
.asm-ctrl-mod{font-size:.8rem;color:var(--t1);font-weight:600;margin:10px 0 4px}
.asm-ctrl-expected{font-size:.76rem;color:var(--t2);line-height:1.7;margin-top:8px;padding:8px 10px;background:rgba(255,193,7,.06);border-left:3px solid var(--amber);border-radius:0 4px 4px 0}
.risk-notes{margin-top:10px}
.asm-sub-head{display:flex;align-items:center;font-size:.85rem;color:var(--cyan);font-weight:600;margin-bottom:6px}
.asm-sub-head:before{content:"";display:inline-block;width:3px;height:12px;background:var(--cyan);border-radius:2px;margin-right:6px}
body.light .asm-ctrl-box{background:rgba(2,8,18,.03)}
body.light .asm-ctrl-expected{background:rgba(255,193,7,.08);color:#7A6210;border-left-color:#D97706}
/* Item V：正交元件推荐高亮块（重复 high 项，仅推荐、不自动替换） */
.risk-ortho{margin-top:8px;padding:8px 10px;background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-left:4px solid var(--cyan);border-radius:0 6px 6px 0}
.risk-ortho-title{font-size:.76rem;color:var(--cyan);font-weight:600;margin-bottom:4px}
.risk-ortho-hit{font-size:.72rem;color:var(--t3);line-height:1.6;margin-bottom:4px}
.risk-ortho-cand{font-size:.74rem;color:var(--t2);line-height:1.7}
.risk-ortho-cand b{color:var(--t1);font-weight:600}
body.light .risk-ortho{background:rgba(14,122,106,.06);border-color:rgba(14,122,106,.3)}
/* Item V：模块元件正交性提示（与 host_warning 同级展示） */
.asm-ortho-warn{margin:0 0 14px;padding:12px 14px;border:1px solid var(--cyan-soft-bd);border-left:4px solid var(--cyan);border-radius:8px;background:var(--cyan-soft)}
.asm-ortho-warn-title{font-size:.84rem;color:var(--cyan);font-weight:700;margin-bottom:4px}
.asm-ortho-warn-msg{font-size:.8rem;color:var(--t2);line-height:1.7}
.asm-ortho-warn-item{font-size:.76rem;color:var(--t2);line-height:1.6;margin-top:2px}
body.light .asm-ortho-warn{background:rgba(14,122,106,.06);border-color:rgba(14,122,106,.3)}
/* W2 代谢流平衡评估（flux_assessment）样式 */
.flux-noec{display:inline-block;font-size:.72rem;font-weight:700;color:#F59E0B;border:1px solid rgba(245,158,11,.5);background:rgba(255,152,0,.1);border-radius:6px;padding:1px 6px;white-space:nowrap}
.flux-noec-note{font-size:.7rem;color:var(--t3);line-height:1.5;margin-top:2px}
.flux-tox{display:inline-block;font-size:.72rem;font-weight:700;color:#F59E0B;border:1px solid rgba(245,158,11,.5);background:rgba(255,152,0,.1);border-radius:6px;padding:1px 6px;white-space:nowrap}
.flux-tox-item{background:rgba(245,158,11,.07);border-left:3px solid #F59E0B}
.flux-refs{font-size:.7rem;color:var(--t3)}
.flux-rep{background:var(--cyan-soft);border-left:3px solid var(--cyan)}
.flux-rep b{color:var(--cyan)}
body.light .flux-tox-item{background:rgba(245,158,11,.08)}
/* X 反向模块接缝悬垂标注 */
.asm-revnote{margin-top:5px;font-size:.72rem;color:#F59E0B;line-height:1.6;padding:4px 8px;background:rgba(255,152,0,.08);border:1px solid rgba(245,158,11,.35);border-radius:6px}
body.light .asm-revnote{background:rgba(255,152,0,.06)}

/* ── 定位标签选择器（可选，UniProt 一手序列；N端/C端 拼接规则见提示）── */
.loc-tags-hint{font-size:.76rem;color:var(--t3);line-height:1.7;margin-bottom:10px;padding:8px 10px;background:var(--cyan-soft);border:1px solid var(--bdr);border-radius:8px}
.loc-tags-wrap{margin-top:4px}
.loc-tags-loading,.loc-tags-empty{font-size:.8rem;color:var(--t3);padding:12px;background:var(--card);border:1px dashed var(--bdr);border-radius:8px;text-align:center}
.loc-tags-count{font-size:.74rem;color:var(--t3);margin-bottom:8px}
.loc-tag-group{margin-bottom:10px}
.loc-tag-group-title{font-size:.78rem;color:var(--cyan);font-weight:600;margin-bottom:4px;display:flex;align-items:center}
.loc-tag-group-title:before{content:"";display:inline-block;width:3px;height:12px;background:var(--cyan);border-radius:2px;margin-right:6px}
.loc-tag-item{display:flex;align-items:center;gap:8px;padding:6px 8px;margin-bottom:4px;background:var(--card);border:1px solid var(--bdr);border-radius:8px;cursor:pointer;transition:border-color .15s,background .15s}
.loc-tag-item:hover{border-color:var(--cyan-soft-bd)}
.loc-tag-item:has(.loc-tag-cb:checked){border-color:var(--cyan);background:var(--cyan-soft-2)}
.loc-tag-cb{accent-color:var(--cyan);width:14px;height:14px;margin:0;flex:0 0 auto;cursor:pointer}
.loc-tag-name{font-size:.78rem;color:var(--t1);flex:1 1 auto;min-width:0;word-break:break-all}
.loc-tag-aa{font-family:'Courier New',Consolas,monospace;font-size:.72rem;color:var(--t2);flex:0 0 auto;letter-spacing:.5px}
.loc-tag-pos{font-size:.68rem;color:var(--t3);flex:0 0 auto;border:1px solid var(--bdr);border-radius:6px;padding:1px 6px;background:var(--cyan-soft)}
.loc-tags-conflict{display:none;margin:6px 0 4px;padding:7px 10px;font-size:.76rem;line-height:1.7;color:#F87171;background:rgba(239,68,68,.09);border:1px solid rgba(239,68,68,.35);border-left:4px solid #EF4444;border-radius:6px}
.loc-tags-conflict.visible{display:block}
body.light .loc-tag-item{background:#fff}
body.light .loc-tag-group-title{color:#0E7A6A}
body.light .loc-tags-conflict{color:#B91C1C;background:rgba(239,68,68,.07);border-color:rgba(185,28,28,.35);border-left-color:#DC2626}

/* ── 序列卡片（FASTA 批量设计；每卡片独立定位标签区，随 body.light 自适应）── */
.seq-cards{display:none}
.seq-cards-hint{font-size:.76rem;color:var(--t3);line-height:1.7;margin-bottom:12px;padding:8px 10px;background:var(--cyan-soft);border:1px solid var(--bdr);border-radius:8px}
.seq-cards-hint code{color:var(--cyan);font-family:'Courier New',Consolas,monospace;background:var(--cyan-soft-2);padding:1px 5px;border-radius:4px}
.seq-card{background:var(--card);border:1px solid var(--bdr);border-radius:10px;padding:14px;margin-bottom:12px}
.seq-card-head{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.seq-card-name{flex:1 1 auto;min-width:0;font-family:inherit}
.seq-card-meta{flex:0 0 auto;font-size:.72rem;color:var(--t3);border:1px solid var(--bdr);background:var(--cyan-soft);padding:2px 8px;border-radius:8px;white-space:nowrap}
.seq-card-preview{font-family:'Courier New',Consolas,monospace;font-size:.72rem;color:var(--t2);line-height:1.6;word-break:break-all;padding:8px 10px;background:rgba(2,8,18,.5);border:1px solid var(--bdr);border-radius:8px;margin-bottom:10px}
.seq-card-locs{margin-top:2px}
.seq-card-locs .loc-tags-wrap{margin-top:8px}
.seq-card-locs .loc-tags-count{font-size:.7rem}
.seq-card-locs .loc-tag-item{padding:4px 8px;margin-bottom:3px}
.seq-card-locs .loc-tag-name{font-size:.72rem}
/* 批量结果摘要 */
.batch-summary-list{margin:10px 0 6px;display:flex;flex-direction:column;gap:6px}
.batch-summary-item{display:flex;align-items:center;gap:10px;padding:8px 12px;background:rgba(2,8,18,.4);border:1px solid var(--bdr);border-radius:8px;font-size:.82rem}
.batch-name{flex:1 1 auto;min-width:0;color:var(--t1);word-break:break-all;font-weight:600}
.batch-len{flex:0 0 auto;color:var(--t3);font-family:'Courier New',Consolas,monospace;font-size:.74rem}
.batch-ok{flex:0 0 auto;color:var(--cyan);font-size:.78rem}
.batch-err{flex:0 0 auto;color:#F87171;font-size:.78rem}
.batch-hint{margin-top:10px;font-size:.78rem;color:var(--t2);padding:8px 10px;background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:8px}
body.light .seq-card{background:#fff}
body.light .seq-card-preview{background:rgba(2,8,18,.03)}
body.light .batch-summary-item{background:rgba(2,8,18,.03)}
body.light .batch-ok{color:#0E7A6A}
body.light .batch-err{color:#B91C1C}

/* ── 逐条序列框（序列行；每行独立名称/长度徽标/删除/定位标签区，随 body.light 自适应）── */
.seq-row{background:var(--card);border:1px solid var(--bdr);border-radius:10px;padding:14px;margin-bottom:12px}
.seq-row-head{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:wrap}
.seq-row-name{flex:1 1 auto;min-width:0;font-family:inherit}
.seq-row-gene{flex:0 1 200px;min-width:0;font-family:inherit}
.seq-row-len{flex:0 0 auto;font-size:.72rem;color:var(--t3);border:1px solid var(--bdr);background:var(--cyan-soft);padding:2px 8px;border-radius:8px;white-space:nowrap}
.seq-row-del-hidden{display:none}
.seq-row-seq{font-family:'Courier New',Consolas,monospace;font-size:.8rem;line-height:1.6}
.seq-row-tools{display:flex;align-items:center;gap:8px;margin-top:8px}
.loc-tags-toggle{background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:6px;color:var(--cyan);font-size:.76rem;padding:5px 10px;cursor:pointer;transition:all .15s}
.loc-tags-toggle:hover{background:var(--cyan-soft-2)}
.seq-row-locs{display:none;margin-top:10px;padding-top:10px;border-top:1px dashed var(--bdr)}
#seqRows .seq-row[data-locs-open="1"] .seq-row-locs{display:block}
.seq-rows-hint{font-size:.76rem;color:var(--t3);line-height:1.7;margin-top:10px}
body.light .seq-row{background:#fff}
body.light .seq-row-len{background:rgba(2,8,18,.03)}

/* ════════════════════════════════════════════════════════════════════
   T8 前端改造（2026-08-19 追加）：单模块 6 项 + 组装 5 项 + 个人元件库
   颜色一律走 CSS 变量 / body.light 覆盖，不在模板写内联样式
   ════════════════════════════════════════════════════════════════════ */

/* ── 通用：全局隐藏态（模板/JS 所有 expr-hide 依赖此规则）── */
.expr-hide{display:none !important}

/* ── SnapGene 四色碱基 + 接头/位点高亮（组装序列渲染）── */
.snap-A{color:#34D399;font-weight:600}
.snap-T{color:#F87171;font-weight:600}
.snap-C{color:#60A5FA;font-weight:600}
.snap-G{color:#FBBF24;font-weight:600}
.snap-N{color:var(--t3)}
body.light .snap-A{color:#059669}
body.light .snap-T{color:#DC2626}
body.light .snap-C{color:#2563EB}
body.light .snap-G{color:#B45309}
.expr-oh{background:rgba(255,183,77,.28);outline:1px solid rgba(255,183,77,.5);border-radius:3px;padding:0 1px}
body.light .expr-oh{background:rgba(255,183,77,.25);outline-color:#D97706}
.lv0-seq{display:flex;gap:8px;align-items:flex-start;font-size:.74rem;color:var(--t3);margin-top:4px;line-height:1.6}
.lv0-seq-label{flex:0 0 auto;color:var(--t2);font-family:'Courier New',Consolas,monospace;white-space:nowrap}
.lv0-seq-bases{font-family:'Courier New',Consolas,monospace;word-break:break-all;color:var(--t1)}

/* ── 来源徽标（AI 建议 / 文献 / 系统规则 / 个人元件 / 其他）── */
.expr-src-badge{display:inline-block;font-size:.68rem;font-weight:600;padding:1px 8px;border-radius:10px;margin-left:5px;vertical-align:1px;white-space:nowrap}
.src-ai{color:#FB923C;background:rgba(249,115,22,.12);border:1px solid rgba(249,115,22,.4)}
.src-lit{color:#60A5FA;background:rgba(59,130,246,.12);border:1px solid rgba(59,130,246,.4)}
.src-rule{color:#9CA3AF;background:rgba(107,114,128,.14);border:1px solid rgba(107,114,128,.4)}
.src-user{color:#22D3EE;background:rgba(34,211,238,.1);border:1px solid rgba(34,211,238,.4)}
.src-other{color:var(--t3);background:var(--cyan-soft);border:1px solid var(--bdr)}
body.light .src-ai{color:#C2410C;background:rgba(249,115,22,.1);border-color:rgba(194,65,12,.35)}
body.light .src-lit{color:#1D4ED8;background:rgba(59,130,246,.1);border-color:rgba(29,78,216,.35)}
body.light .src-rule{color:#4B5563;background:rgba(107,114,128,.1);border-color:rgba(107,114,128,.35)}
body.light .src-user{color:#0E7490;background:rgba(34,211,238,.12);border-color:rgba(14,116,144,.35)}

/* ── 下一步路线建议 ── */
.expr-route-advice{margin:8px 0;padding:10px 12px;border:1px solid var(--cyan-soft-bd);border-left:4px solid var(--cyan);background:var(--cyan-soft);border-radius:8px;display:flex;flex-direction:column;gap:4px}
.expr-route-advice-title{font-size:.8rem;color:var(--cyan);font-weight:700}
.expr-route-advice-text{font-size:.78rem;color:var(--t2);line-height:1.7}
body.light .expr-route-advice{background:rgba(14,122,106,.06);border-color:rgba(14,122,106,.3)}

/* ── 元件替换弹窗（公共库 / 个人库 双列）── */
.expr-repl-mask{display:none;position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;background:var(--overlay);justify-content:center;align-items:center;padding:20px;box-sizing:border-box}
.expr-repl-dialog{background:var(--card-strong);border:1px solid var(--bdr);border-radius:16px;width:640px;max-width:100%;max-height:84vh;display:flex;flex-direction:column;box-shadow:0 20px 60px var(--shadow)}
.expr-repl-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--bdr);flex:0 0 auto}
.expr-repl-title{font-size:.95rem;color:var(--t1);font-weight:600}
.expr-repl-close{background:none;border:none;color:var(--t3);font-size:1rem;cursor:pointer;padding:4px 8px}
.expr-repl-close:hover{color:var(--t1)}
.expr-repl-sub{padding:10px 20px;font-size:.78rem;color:var(--t2);border-bottom:1px solid var(--bdr);flex:0 0 auto}
.expr-repl-sub b{color:var(--t1)}
.expr-repl-search{display:block;margin:12px 20px 0;padding:8px 12px;background:rgba(2,8,18,.5);border:1px solid var(--bdr);border-radius:8px;color:var(--t1);font-size:.84rem;font-family:inherit;box-sizing:border-box;width:calc(100% - 40px);flex:0 0 auto}
.expr-repl-search:focus{outline:none;border-color:var(--cyan)}
.expr-repl-body{flex:1 1 auto;overflow-y:auto;display:flex;gap:12px;padding:16px 20px}
.expr-repl-col{flex:1 1 50%;min-width:0;display:flex;flex-direction:column;gap:6px}
.expr-repl-col-title{font-size:.76rem;color:var(--cyan);font-weight:600}
.expr-repl-list{display:flex;flex-direction:column;gap:6px}
.expr-repl-item{padding:9px 11px;background:rgba(2,8,18,.4);border:1px solid var(--bdr);border-radius:8px;cursor:pointer;transition:border-color .15s,background .15s}
.expr-repl-item:hover{border-color:var(--cyan-soft-bd);background:var(--cyan-soft)}
.expr-repl-item.expr-repl-cur{border-color:var(--cyan);background:var(--cyan-soft-2)}
.expr-repl-name{font-size:.8rem;color:var(--t1);font-weight:600;word-break:break-all}
.expr-repl-meta{font-size:.7rem;color:var(--t3);margin-top:2px;line-height:1.5}
.expr-repl-note{font-size:.68rem;color:var(--t3);margin-top:4px;padding:4px 6px;background:var(--cyan-soft);border-radius:5px;line-height:1.5}
.expr-repl-empty{font-size:.76rem;color:var(--t3);padding:12px;text-align:center;border:1px dashed var(--bdr);border-radius:8px}
.expr-repl-badge{display:inline-block;font-size:.62rem;font-weight:600;color:var(--t3);border:1px solid var(--bdr);background:var(--cyan-soft);border-radius:6px;padding:0 6px;margin-left:5px;vertical-align:1px;white-space:nowrap}
.expr-repl-badge-warn{color:#F87171;border-color:rgba(239,68,68,.4);background:rgba(239,68,68,.08)}
.expr-ver-ok{color:#34D399;border-color:rgba(52,211,153,.4);background:rgba(52,211,153,.08)}
.expr-repl-foot{padding:14px 20px;border-top:1px solid var(--bdr);display:flex;justify-content:flex-end;flex:0 0 auto}
body.light .expr-repl-item{background:rgba(2,8,18,.03)}
body.light .expr-repl-search{background:#fff}
body.light .expr-repl-badge-warn{color:#DC2626;background:rgba(220,38,38,.07)}
body.light .expr-ver-ok{color:#059669;background:rgba(5,150,105,.08)}

/* ── 已替换徽标 / 替换/恢复按钮 ── */
.expr-ov-badge{display:inline-block;font-size:.68rem;font-weight:600;color:var(--cyan);background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:8px;padding:0 7px;margin-left:5px;vertical-align:1px}
.expr-replace-btn{display:inline-block;margin-left:8px;padding:3px 10px;font-size:.7rem;color:var(--cyan);background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:6px;cursor:pointer}
.expr-replace-btn:hover{background:var(--cyan-soft-2)}
.expr-restore-btn{color:var(--amber);border-color:rgba(255,183,77,.4)}
body.light .expr-restore-btn{color:#92400E;border-color:rgba(146,64,14,.35)}

/* ── 组装：元件正交性报告 ── */
.asm-ortho-card{border-color:var(--cyan-soft-bd)}
.asm-ortho-method{color:var(--t3)}
.asm-ortho-level{display:inline-block;font-size:.7rem;font-weight:700;padding:1px 8px;border-radius:10px;white-space:nowrap}
.asm-ortho-high{color:#F87171;background:rgba(248,113,113,.12);border:1px solid rgba(248,113,113,.4)}
.asm-ortho-medium{color:#FBBF24;background:rgba(251,191,36,.1);border:1px solid rgba(251,191,36,.32)}
.asm-ortho-low{color:#34D399;background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.35)}
.asm-ortho-other{color:var(--t3);background:var(--cyan-soft);border:1px solid var(--bdr)}
.asm-ortho-summary{color:var(--t2)}
.asm-ortho-advs{display:flex;flex-wrap:wrap;gap:6px}
.asm-ortho-adv{display:inline-block;padding:3px 10px;background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:10px;font-size:.74rem;color:var(--t2)}
body.light .asm-ortho-high{color:#DC2626;background:rgba(220,38,38,.08);border-color:rgba(220,38,38,.32)}
body.light .asm-ortho-medium{color:#B45309;background:rgba(217,119,6,.1);border-color:rgba(217,119,6,.35)}
body.light .asm-ortho-low{color:#059669;background:rgba(5,150,105,.1);border-color:rgba(5,150,105,.35)}

/* ── 组装：标准层级组装方案 ── */
.asm-hier-card{border-color:var(--cyan-soft-bd)}
.asm-hier-note{color:var(--t2)}
.asm-hier-sub{display:flex;align-items:center;gap:6px;font-size:.84rem;color:var(--cyan);font-weight:600;margin:12px 0 6px}
.asm-hier-sub:before{content:"";display:inline-block;width:3px;height:12px;background:var(--cyan);border-radius:2px;margin-right:2px}
.asm-hier-tu{margin:8px 0;padding:10px 12px;background:rgba(2,8,18,.35);border:1px solid var(--bdr);border-left:3px solid var(--cyan);border-radius:8px}
.asm-hier-tu-head{font-size:.8rem;color:var(--t1);font-weight:600;margin-bottom:6px}
.asm-hier-parts{display:flex;flex-wrap:wrap;gap:5px;align-items:center;margin-top:6px}
body.light .asm-hier-tu{background:rgba(2,8,18,.03)}

/* ── 组装：失败排查指南 ── */
.asm-trouble-card{border-color:rgba(245,158,11,.35)}
.asm-trouble-method{color:var(--t3)}
.asm-trouble-warn{color:#F59E0B;background:rgba(255,152,0,.08);border:1px solid rgba(245,158,11,.35);border-left:4px solid #F59E0B;border-radius:6px;padding:8px 10px}
body.light .asm-trouble-warn{background:rgba(255,152,0,.06);color:#B45309}

/* ── 组装：一步同源组装方案 ── */
.asm-gibson-card{border-color:var(--cyan-soft-bd)}
.asm-gibson-primer{margin:8px 0;padding:10px 12px;background:rgba(2,8,18,.35);border:1px solid var(--bdr);border-radius:8px}
.asm-gibson-primer-head{font-size:.8rem;color:var(--t1);font-weight:600;margin-bottom:6px}
.asm-gibson-primer-head b{color:var(--cyan)}
.asm-gibson-primer-pair{display:flex;flex-direction:column;gap:5px}
.asm-gibson-primer-f,.asm-gibson-primer-r{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.asm-primer-dir{flex:0 0 auto;width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;font-size:.68rem;font-weight:700;border-radius:50%;background:var(--cyan-soft-2);color:var(--cyan);border:1px solid var(--cyan-soft-bd)}
body.light .asm-gibson-primer{background:rgba(2,8,18,.03)}

/* ── 组装：驯化决策弹窗（DOMESTICATION_DECISION_REQUIRED 三选一）── */
.expr-dom-decision{width:520px;max-width:100%;display:flex;flex-direction:column;overflow:hidden}
.expr-dom-msg{font-size:.82rem;color:var(--t2);line-height:1.7;padding:14px 20px;flex:0 0 auto}
/* D5 滚动修复：详情区可伸展并独立滚动，决策多时不被裁掉（min-height:0 允许 flex 收缩） */
.expr-dom-details{flex:1 1 0;overflow-y:auto;min-height:0;padding:0 20px 6px;font-size:.76rem;color:var(--t2);line-height:1.55}
.expr-dom-options{display:flex;flex-direction:column;gap:8px;padding:0 20px 16px;overflow-y:auto;flex:0 0 auto}
.expr-dom-opt{display:flex;flex-direction:column;align-items:flex-start;gap:4px;text-align:left;padding:11px 13px;background:rgba(2,8,18,.4);border:1px solid var(--bdr);border-radius:8px;color:var(--t1);font-size:.82rem;cursor:pointer;transition:all .15s;font-family:inherit}
.expr-dom-opt:hover{border-color:var(--cyan-soft-bd);background:var(--cyan-soft)}
.expr-dom-opt-ok{border-color:var(--cyan-soft-bd)}
.expr-dom-opt-ok:hover{background:rgba(52,211,153,.1);border-color:rgba(52,211,153,.4)}
.expr-dom-opt-repl:hover{background:rgba(139,92,246,.1);border-color:rgba(139,92,246,.4)}
.expr-dom-opt-route:hover{background:rgba(245,158,11,.1);border-color:rgba(245,158,11,.4)}
.expr-dom-opt-sub{font-size:.72rem;color:var(--t3)}
body.light .expr-dom-opt{background:rgba(2,8,18,.03)}

/* ── 组装：酶切位点清理对比 ── */
.expr-dom-section{background:rgba(2,8,18,.3);border:1px solid var(--bdr);border-radius:8px;padding:12px}
.expr-dom-title{font-size:.8rem;color:var(--t1);font-weight:600;margin-bottom:4px}
.expr-dom-table{display:flex;flex-direction:column;gap:4px;margin-top:8px}
.expr-dom-row{display:flex;align-items:center;gap:8px;font-family:'Courier New',Consolas,monospace;font-size:.76rem;padding:5px 8px;background:var(--cyan-soft);border-radius:6px;flex-wrap:wrap}
.expr-dom-row.expr-dom-note{background:transparent;font-family:inherit;color:var(--t2)}
.expr-dom-pos{color:var(--t3);min-width:44px}
.expr-dom-orig{color:#F87171;text-decoration:line-through;font-weight:600}
.expr-dom-arrow{color:var(--t3)}
.expr-dom-mut{color:#34D399;font-weight:700}
.expr-dom-note{color:var(--t2);font-family:inherit}
body.light .expr-dom-section{background:rgba(2,8,18,.03)}
body.light .expr-dom-orig{color:#DC2626}
body.light .expr-dom-mut{color:#059669}

/* ── 个人元件库：Tab 栏 + 元件卡片 + 验证状态徽标 ── */
.modlib-tabs{display:flex;gap:6px;margin-bottom:14px;border-bottom:1px solid var(--bdr)}
.modlib-tab{flex:0 0 auto;padding:8px 18px;background:transparent;border:1px solid transparent;border-bottom:2px solid transparent;border-radius:8px 8px 0 0;color:var(--t2);font-size:.84rem;cursor:pointer;transition:all .15s;font-family:inherit;margin:0}
.modlib-tab:hover{color:var(--t1);background:var(--cyan-soft)}
.modlib-tab.active{color:var(--cyan);font-weight:600;border-color:var(--cyan-soft-bd);border-bottom-color:var(--cyan);background:var(--cyan-soft)}
.up-card{background:var(--card-strong);border:1px solid var(--bdr);border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:6px}
.up-card:hover{border-color:var(--cyan-soft-bd);box-shadow:0 4px 18px var(--shadow)}
.up-card-top{display:flex;justify-content:space-between;align-items:flex-start;gap:8px}
.up-card-name{font-size:.85rem;color:var(--t1);font-weight:600;word-break:break-all;line-height:1.35;min-width:0}
.up-card-type{flex:0 0 auto;font-size:.68rem;color:var(--cyan);border:1px solid var(--cyan-soft-bd);background:var(--cyan-soft);border-radius:8px;padding:1px 7px;white-space:nowrap}
.up-card-host{flex:0 0 auto;font-size:.7rem;color:var(--t2)}
.up-card-meta{font-size:.72rem;color:var(--t3);line-height:1.5;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.up-card-note{font-size:.7rem;color:var(--t3);line-height:1.5;padding:6px 8px;background:var(--cyan-soft);border-radius:6px;word-break:break-all}
.up-card-actions{display:flex;gap:6px;margin-top:2px}
.up-badge{display:inline-block;font-size:.62rem;font-weight:600;border-radius:6px;padding:1px 7px;white-space:nowrap}
.up-ver-ok{color:#34D399;background:rgba(52,211,153,.1);border:1px solid rgba(52,211,153,.4)}
.up-ver-pend{color:#9CA3AF;background:rgba(107,114,128,.12);border:1px solid rgba(107,114,128,.4)}
body.light .up-card{background:#fff}
body.light .up-ver-ok{color:#059669;background:rgba(5,150,105,.08);border-color:rgba(5,150,105,.35)}
body.light .up-ver-pend{color:#4B5563;background:rgba(107,114,128,.08);border-color:rgba(107,114,128,.35)}

/* ── 个人元件库：上传弹窗 ── */
.up-hint{margin:10px 0 2px;padding:7px 10px;font-size:.74rem;color:var(--t3);background:var(--cyan-soft);border:1px dashed var(--cyan-soft-bd);border-radius:6px;line-height:1.6}
.up-mt12{margin-top:12px}
.up-btn-row{display:flex;gap:10px;margin-top:16px}
.up-ok{flex:1 1 auto;width:auto !important}

/* ── 实验记录单（打印窗口内类名兜底，不与窗口内联样式冲突）── */
.asm-record-sheet-head{font-size:22px;font-weight:700;margin-bottom:6px;color:#0b3b8f}
.asm-record-sheet-meta{font-size:13px;color:#555;margin-bottom:18px}

/* ── T8 浅色主题：个人元件验证徽标深色文字变体（浅底可读）── */
body.light .up-ver-ok{color:#047857;background:rgba(16,185,129,.1);border:1px solid rgba(4,120,87,.4)}
body.light .up-ver-pend{color:#6B7280;background:rgba(107,114,128,.1);border:1px solid rgba(107,114,128,.4)}

/* ── 批量设计结果卡（确认后入库，2026-08-21 追加）── */
.batch-card{margin:10px 0;background:var(--card);border:1px solid var(--bdr);border-radius:12px;padding:12px 14px}
.batch-card-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.bcard-pending{flex:0 0 auto;color:var(--t3);font-size:.76rem;border:1px dashed var(--bdr);background:var(--cyan-soft);padding:2px 8px;border-radius:8px;white-space:nowrap}
.batch-card .expr-ov-badge.bcard-conf{color:#34D399;border-color:rgba(52,211,153,.4);background:rgba(52,211,153,.1)}
body.light .batch-card .expr-ov-badge.bcard-conf{color:#047857;border-color:rgba(4,120,87,.4);background:rgba(4,120,87,.1)}
.bcard-parts{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px;margin-top:4px}
.bcard-part{margin:0}
.bcard-empty{grid-column:1/-1;font-size:.76rem;color:var(--t3);padding:10px;text-align:center;border:1px dashed var(--bdr);border-radius:8px}
.bcard-err{margin-top:8px;padding:6px 10px;background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.35);border-radius:8px}
.bcard-foot{margin-top:10px;padding-top:8px;border-top:1px dashed var(--bdr);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.bcard-confirm{font-size:.78rem;padding:6px 14px;color:#0E7A6A;border:1px solid rgba(14,122,106,.4)}
.batch-card .bcard-confirm[disabled]{opacity:.5;cursor:not-allowed}
.bcard-allbar{margin:12px 0 4px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px;background:var(--cyan-soft);border:1px solid var(--cyan-soft-bd);border-radius:10px}
.bcard-confirm-all{font-size:.82rem;padding:8px 18px}
.bcard-allbar .batch-hint{margin-top:0}
