/**
 * 单测视角渲染器 — 把 EvaluationReport 当作 vitest 风格的测试结果看：
 *
 *   每个 sample = 一个 test case
 *     ┌─ 用例设计(测试契约): prompt / rubric / 期望 assertions / 工具调用 mock
 *     ├─ 执行轨迹: thinking + tool calls + 断言绑定到 turn
 *     └─ 断言汇总: 每条 assertion 在哪一步触发,pass/fail
 *
 * 数据全部来自 EvaluationReport,不引入新数据源:
 *   - 设计  ← report.sampleSnapshots[sample_id]
 *   - 执行  ← VariantResult.turns / .toolCalls / .mockStats / .fullOutput
 *   - 断言  ← VariantResult.assertions.details (已经有 passed/failed)
 *
 * 旧 report 缺 sampleSnapshots 时降级显示("无设计快照,只有执行结果")。
 */
import type { EvaluationReport, SampleSnapshot, VariantResult, Lang } from '../types/index.js';
import type { Assertion } from '../types/eval.js';
import type { ToolCallInfo, TurnInfo } from '../types/executor.js';
import type { AssertionDetail } from '../types/judge.js';
/** Tool call 的稳定签名,用于在 turns 里反查 turn 序号。 */
export declare function toolCallSignature(tc: ToolCallInfo): string;
/** 走 turns 数组,给每个 tool call 标一个 turn 编号(1-based)。导出供单测验证。 */
export declare function indexToolCallsByTurn(turns: TurnInfo[] | undefined): Map<string, number>;
/** 字符串解析:`tool_input_contains` / `tool_output_contains` 用 `Tool:substring` 格式。 */
export declare function parseToolColonValue(value: string): {
    tool: string;
    needle: string;
};
/** 把单条 assertion 绑定到某一步。匹配不到返回 null(contains/regex 等作用于 fullOutput
 *  的天然没有 turn 绑定)。导出供单测。
 *
 *  局限:mock_hit 的 turn 绑定靠"该 tool 的第 N 次调用 = 第 N 个 mock"启发式,
 *  和真实 mock matcher(按 match 规则)可能不一致——状态机 mock 场景下 turn 标签可能近似。
 *  pass/fail 仍以 AssertionDetail.passed 为准。 */
export declare function findAssertionTurn(assertion: Assertion, detail: AssertionDetail, toolCalls: ToolCallInfo[], turnByCallSig: Map<string, number>): {
    turn: number | null;
    matchedCall?: ToolCallInfo;
};
/** 用例的整体 verdict:全部 assertion 通过 → pass;任一失败 → fail;无 assertion → 视为 pass(谨慎)。 */
export declare function sampleVerdict(details: AssertionDetail[] | undefined): 'pass' | 'fail';
/**
 * 判断 sample 是否是"诱错样本(tripwire)"——视觉上要跟普通 fail 区分开。
 *
 * 识别来源(任一即算):
 *   1. snapshot.tripwire === true(generator/作者显式标记)
 *   2. diagnostic.rootCause 包含 'tripwire_intentional'(LLM 诊断时自己识破的)
 *
 * 用途:UI 把诱错样本的失败渲染成紫色 "🪤 诱错触发" 而非红色 "✗ FAIL",
 * 避免使用者误以为是要修的真 bug。
 */
export declare function isTripwireSample(snapshot: SampleSnapshot | undefined, variant: VariantResult): boolean;
export declare function renderTestView(report: EvaluationReport, lang: Lang): string;
/** 单测视角的 CSS。
 *
 * 设计原则:
 *   - **scoped 浅色岛**:外层 layout 是深色主题(评分 tab 用),test view 在 .tv-root
 *     里覆盖一套浅色变量,实现"切到单测 tab = 切到杂志阅读模式"。
 *   - **潘通启发的哑色调**:sage/dusty rose/mauve(饱和度 ~50%),不像 GitHub error log。
 *   - **大字号 + 高行高**:正文 15px / 行高 1.75,代码 13px。中文优先 PingFang/YaHei。
 *   - **subtle shadow 替代 border**:卡片间 16-24px 留白,box-shadow 浮起感。
 *   - **default-collapsed**:通过的用例只显一行;失败/诱错展开诊断,其余 section 折叠。
 */
export declare const TEST_VIEW_CSS = "\n/* tv-root: \u6D45\u8272\u5C9B,scoped \u8986\u76D6\u5916\u5C42\u6DF1\u8272 layout */\n.tv-root {\n  --tv-bg:#fbfaf7; --tv-bg-card:#ffffff; --tv-bg-soft:rgba(58,58,58,.025);\n  --tv-text:#3a3a3a; --tv-text-2:#7a7a7a; --tv-text-3:#a8a8a8;\n  --tv-divider:#e8e3da;\n  /* \u52A0\u5927 pass / fail / tripwire \u7684\u8272\u76F8\u8DDD\u79BB + \u6697\u5EA6\u5DEE,\u907F\u514D\u8FDC\u770B\u96F7\u540C\u3002\n     pass: \u9F20\u5C3E\u8349\u7EFF(\u6697\u4E00\u6863,\u9760\u8FD1\u6797\u5730);fail: \u7816\u7EA2\u571F\u9676(\u6697\u4E00\u6863,\u8FDC\u79BB pink);tripwire: \u7D2B\u7F57\u5170(\u72EC\u7ACB\u8272\u76F8)\u3002 */\n  --tv-pass:#5e8252; --tv-fail:#9c4a3f; --tv-tripwire:#7a6b89;\n  --tv-pass-soft:rgba(94,130,82,.10); --tv-fail-soft:rgba(156,74,63,.10); --tv-tripwire-soft:rgba(122,107,137,.10);\n  --tv-accent:#5a7a93; --tv-warn:#b08030;\n  --tv-shadow:0 1px 3px rgba(58,58,58,.06);\n  --tv-shadow-hover:0 2px 8px rgba(58,58,58,.10);\n  background:var(--tv-bg); color:var(--tv-text);\n  padding:32px 0; margin:-16px 0 0; border-radius:6px;\n  font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",sans-serif;\n  font-size:15px; line-height:1.75;\n}\n/* Variant tabs \u2014 \u663E\u5F0F reset \u6D4F\u89C8\u5668\u9ED8\u8BA4 button \u6837\u5F0F(border-radius / outline / appearance)\n   \u9632\u6B62 layout \u90A3\u8FB9\u7684\u5168\u5C40 button \u89C4\u5219\u7ED9\u5E95\u90E8\u52A0\u4E86\u5947\u602A\u5706\u89D2\u548C\u6DF1\u8272\u80CC\u666F\u3002 */\n.tv-root .tv-variant-tabs { display:flex;gap:0;margin:0 0 24px;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-vtab { padding:12px 20px;background:transparent;border:none;border-radius:0;cursor:pointer;color:var(--tv-text-2);border-bottom:2px solid transparent;font-size:14px;font-family:inherit;font-weight:500;outline:none;appearance:none;-webkit-appearance:none;margin-bottom:-1px }\n.tv-root .tv-vtab:hover { color:var(--tv-text) }\n.tv-root .tv-vtab--active { color:var(--tv-text);border-bottom-color:var(--tv-accent);font-weight:600 }\n.tv-root .tv-vtab:focus-visible { outline:2px solid var(--tv-accent);outline-offset:-4px;border-radius:4px }\n/* tv-variant-panel: \u4E0D\u6253\u6A2A\u5411 padding,\u5185\u5BB9\u76F4\u63A5\u5BF9\u9F50 .tv-root \u8FB9\u754C,\u8DDF\u5916\u5C42 omk-view-panel \u7684 h1/subtitle \u540C\u57FA\u7EBF\u3002 */\n/* Stats \u2014 \u66F4\u6241\u5E73\u7684\u6570\u5B57+\u6807\u7B7E\u5E03\u5C40 */\n.tv-root .tv-variant-stats { display:flex;gap:32px;margin:0 0 24px;font-size:14px;color:var(--tv-text-2);align-items:baseline }\n.tv-root .tv-stat { display:flex;align-items:baseline;gap:6px }\n.tv-root .tv-stat-num { color:var(--tv-text);font-weight:600;font-size:18px;font-variant-numeric:tabular-nums }\n.tv-root .tv-stat--pass .tv-stat-num { color:var(--tv-pass) }\n.tv-root .tv-stat--fail .tv-stat-num { color:var(--tv-fail) }\n.tv-root .tv-stat--tripwire .tv-stat-num { color:var(--tv-tripwire) }\n/* Group separator */\n.tv-root .tv-group-sep { display:flex;align-items:center;gap:14px;margin:32px 0 16px;color:var(--tv-text-3);font-size:12px;text-transform:uppercase;letter-spacing:0.08em;font-weight:500 }\n.tv-root .tv-group-sep::after { content:'';flex:1;height:1px;background:var(--tv-divider) }\n/* Pass rows \u2014 one-line list,\u5DE6\u8FB9\u4E00\u9053\u6DE1 sage \u8272\u6761\u505A\"\u901A\u8FC7\"\u6697\u793A */\n.tv-root .tv-rows { display:flex;flex-direction:column;gap:6px;margin:0 }\n.tv-root .tv-row { background:var(--tv-bg-card);border-radius:6px;box-shadow:var(--tv-shadow);transition:box-shadow .15s;border-left:3px solid var(--tv-pass) }\n.tv-root .tv-row:hover { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-row[open] { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-row-h { display:flex;align-items:center;gap:14px;padding:14px 20px;cursor:pointer;list-style:none;font-size:15px }\n.tv-root .tv-row-h::-webkit-details-marker { display:none }\n.tv-root .tv-row-h::after { content:'\u203A';margin-left:8px;color:var(--tv-text-3);font-size:18px;transition:transform .15s }\n.tv-root .tv-row[open] .tv-row-h::after { transform:rotate(90deg) }\n/* Cards (fail / tripwire) \u2014 \u9ED8\u8BA4\u6298\u53E0,\u8DDF pass row \u4E00\u81F4;\u5934\u90E8\u4E0B\u9762\u52A0\u4E00\u884C preview \u8BA9\u6298\u53E0\u6001\u4E5F\u6709\u4FE1\u606F\u5BC6\u5EA6 */\n.tv-root .tv-card { background:var(--tv-bg-card);border-radius:8px;box-shadow:var(--tv-shadow);margin:0 0 12px;transition:box-shadow .15s }\n.tv-root .tv-card:hover { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-card--fail { border-left:3px solid var(--tv-fail) }\n.tv-root .tv-card--tripwire { border-left:3px solid var(--tv-tripwire) }\n.tv-root .tv-card-h { display:flex;align-items:center;gap:14px;padding:16px 22px;cursor:pointer;list-style:none;font-size:15px }\n.tv-root .tv-card-h::-webkit-details-marker { display:none }\n.tv-root .tv-card-h::after { content:'\u203A';margin-left:8px;color:var(--tv-text-3);font-size:18px;transition:transform .15s }\n.tv-root .tv-card[open] .tv-card-h::after { transform:rotate(90deg) }\n.tv-root .tv-card[open] .tv-card-h { border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-card-preview { padding:0 22px 14px;color:var(--tv-text-2);font-size:14px;line-height:1.7;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-card[open] .tv-card-preview { display:none }\n/* Status dots \u2014 \u7528\u5F62\u72B6 + \u8272 + \u5B57\u7B26\u7684\u4E09\u91CD\u533A\u5206,\u907F\u514D\u8272\u76F2 / \u8FDC\u770B\u96F7\u540C\u3002\n   pass: \u5B9E\u5FC3\u5706 sage;fail: \u7EA2 \u2717 \u5B57\u7B26(\u66F4\u663E\u773C);tripwire: \u7D2B\u8272 \u25C6 \u83F1\u5F62\u3002 */\n.tv-root .tv-dot { display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;font-size:14px;font-weight:700;line-height:1 }\n.tv-root .tv-dot--pass::before { content:'';width:10px;height:10px;border-radius:50%;background:var(--tv-pass);box-shadow:0 0 0 3px var(--tv-pass-soft) }\n.tv-root .tv-dot--fail::before { content:'\u2717';color:var(--tv-fail);font-size:16px;font-weight:700 }\n.tv-root .tv-dot--tripwire::before { content:'\u25C6';color:var(--tv-tripwire);font-size:13px }\n.tv-root .tv-id { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;color:var(--tv-text-3) }\n.tv-root .tv-title { flex:1;font-size:15px;color:var(--tv-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap }\n.tv-root .tv-meta { font-size:13px;color:var(--tv-text-3);font-variant-numeric:tabular-nums;font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,monospace }\n/* Body padding */\n.tv-root .tv-card-body, .tv-root .tv-row-body { padding:22px }\n/* Tripwire banner \u2014 \u5361\u7247\u9876\u90E8\u7684\u7D2B\u8272\u89E3\u91CA\u5E26 */\n.tv-root .tv-tripwire-banner { margin:-22px -22px 20px;padding:18px 22px;background:rgba(139,124,147,.08);border-radius:8px 8px 0 0;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-tripwire-banner-title { font-size:14px;font-weight:600;color:var(--tv-tripwire);margin-bottom:6px;letter-spacing:0.02em }\n.tv-root .tv-tripwire-banner-body { font-size:14px;color:var(--tv-text-2);line-height:1.7 }\n/* Diagnosis \u2014 \u4E00\u6BB5\u767D\u8BDD + \u5355\u4E00\u84DD\u8272\u5EFA\u8BAE\u5757 + \u6298\u53E0\u7EC6\u8282 */\n.tv-root .tv-diag { margin:4px 0 16px }\n.tv-root .tv-diag-text { font-size:15px;line-height:1.75;color:var(--tv-text);margin:0 0 16px }\n.tv-root .tv-suggestion { background:rgba(90,122,147,.06);border-left:3px solid var(--tv-accent);padding:14px 18px;margin:12px 0;border-radius:0 4px 4px 0 }\n.tv-root .tv-suggestion-label { display:inline-block;color:var(--tv-accent);font-weight:600;font-size:13px;margin-right:8px;letter-spacing:0.02em }\n.tv-root .tv-suggestion-body { margin:6px 0 0;font-size:14.5px;line-height:1.7;color:var(--tv-text) }\n.tv-root .tv-diag-details { margin-top:14px }\n.tv-root .tv-diag-details > summary { cursor:pointer;font-size:13px;color:var(--tv-text-2);list-style:none }\n.tv-root .tv-diag-details > summary::-webkit-details-marker { display:none }\n.tv-root .tv-diag-details > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px }\n.tv-root .tv-diag-details[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-diag-details-body { padding:10px 0 0 16px;font-size:14px;line-height:1.7;color:var(--tv-text-2) }\n.tv-root .tv-diag-details-body p { margin:6px 0 }\n.tv-root .tv-diag-details-body strong { color:var(--tv-text);margin-right:6px }\n/* RootCause inline pill */\n.tv-root .tv-diag-rc-pill { font-size:11px;padding:2px 8px;border-radius:10px;background:var(--tv-bg-soft);color:var(--tv-text-2);margin-right:6px;display:inline-block }\n.tv-root .tv-diag-rc--tripwire_intentional { background:rgba(139,124,147,.12);color:var(--tv-tripwire) }\n.tv-root .tv-diag-rc--sample_design { background:rgba(90,122,147,.10);color:var(--tv-accent) }\n.tv-root .tv-diag-rc--skill_doc_unclear, .tv-diag-rc--skill_doc_missing, .tv-root .tv-diag-rc--llm_misread { background:rgba(176,128,48,.10);color:var(--tv-warn) }\n/* Failure-mode chips \u2014 \u4E2D\u6587\u6807\u7B7E,\u663E\u8457\u5C55\u793A\u5728 summary \u4E0B */\n.tv-root .tv-diag-modes { display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0 14px }\n.tv-root .tv-diag-modes-label { font-size:12px;color:var(--tv-text-2);margin-right:4px }\n.tv-root .tv-diag-mode-pill { font-size:12px;padding:3px 10px;border-radius:11px;background:var(--tv-bg-soft);color:var(--tv-text);font-weight:500 }\n.tv-root .tv-diag-mode--workflow-skip   { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hardcoded       { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hallucination   { background:rgba(180,75,75,.14);color:#b44b4b }\n.tv-root .tv-diag-mode--tool-misuse     { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--env-blocked     { background:rgba(90,122,147,.12);color:var(--tv-accent) }\n.tv-root .tv-diag-mode--misread         { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--other           { background:var(--tv-bg-soft);color:var(--tv-text-2) }\n/* Workflow checklist \u2014 \u9ED8\u8BA4\u5C55\u5F00,\u653E\u5728 suggestion \u4E4B\u4E0A,\u76F4\u89C2\u5C55\u793A LLM \u8D70\u5BF9\u54EA\u51E0\u6B65 */\n.tv-root .tv-diag-workflow { margin:14px 0;padding:12px 14px;background:var(--tv-bg-soft);border-radius:6px }\n.tv-root .tv-diag-workflow-title { font-size:13px;font-weight:600;color:var(--tv-text);margin:0 0 10px;letter-spacing:0.02em }\n.tv-root .tv-diag-workflow-list { list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px }\n.tv-root .tv-diag-workflow-item { display:flex;align-items:flex-start;gap:10px;line-height:1.6 }\n.tv-root .tv-diag-workflow-icon { flex-shrink:0;font-weight:700;font-size:14px;width:16px;text-align:center;margin-top:2px }\n.tv-root .tv-diag-workflow-item--pass .tv-diag-workflow-icon { color:#3a8a3a }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-icon { color:#b44b4b }\n.tv-root .tv-diag-workflow-body { display:flex;flex-direction:column;gap:2px;flex:1 }\n.tv-root .tv-diag-workflow-step { font-size:14px;color:var(--tv-text) }\n.tv-root .tv-diag-workflow-evidence { font-size:12.5px;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-step { color:#b44b4b }\n/* Partial salvage \u63D0\u793A */\n.tv-root .tv-diag-partial { font-size:12px;color:var(--tv-text-3);margin:0 0 8px;font-style:italic }\n/* Sub-sections \u2014 design / trace / assertions, \u5168\u90E8\u9ED8\u8BA4\u6298\u53E0 */\n.tv-root .tv-section { margin-top:6px;border-top:1px solid var(--tv-divider);padding-top:14px }\n.tv-root .tv-section > summary { cursor:pointer;font-size:14px;font-weight:500;color:var(--tv-text);padding:6px 0;list-style:none }\n.tv-root .tv-section > summary::-webkit-details-marker { display:none }\n.tv-root .tv-section > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px;font-weight:400 }\n.tv-root .tv-section[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-section-stat { font-weight:400;color:var(--tv-text-3);margin-left:6px;font-size:13px }\n.tv-root .tv-section-body { padding:14px 0 0 16px;font-size:14.5px;line-height:1.7 }\n/* Design fields */\n.tv-root .tv-prompt, .tv-root .tv-rubric { font-size:14.5px;line-height:1.75;margin:8px 0;color:var(--tv-text-2) }\n.tv-root .tv-prompt strong, .tv-root .tv-rubric strong { color:var(--tv-text);margin-right:6px;font-weight:600 }\n.tv-root .tv-meta-pills { margin:10px 0;display:flex;flex-wrap:wrap;gap:8px }\n.tv-root .tv-meta-pill { font-size:12px;padding:3px 10px;background:var(--tv-bg-soft);border-radius:10px;color:var(--tv-text-2);font-family:\"SF Mono\",Menlo,monospace }\n.tv-root .tv-expected { margin-top:12px }\n.tv-root .tv-expected-h { font-size:13px;color:var(--tv-text-2);margin-bottom:6px }\n.tv-root .tv-expect-line { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;color:var(--tv-text-2);padding:3px 0;line-height:1.6 }\n.tv-root .tv-collapsible { margin-top:10px;font-size:13px }\n.tv-root .tv-collapsible > summary { cursor:pointer;color:var(--tv-text-2) }\n/* Mocks */\n.tv-root .tv-mocks { margin-top:8px }\n.tv-root .tv-mock-line { font-size:12px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;display:flex;flex-wrap:wrap;gap:6px;align-items:center;line-height:1.6 }\n.tv-root .tv-mock-idx { color:var(--tv-text-3);font-weight:600 }\n.tv-root .tv-mock-tool { background:var(--tv-bg-soft);padding:2px 6px;border-radius:3px }\n.tv-root .tv-mock-match, .tv-root .tv-mock-return { color:var(--tv-text-2);overflow:hidden;text-overflow:ellipsis;max-width:340px;white-space:nowrap }\n.tv-root .tv-mock-arrow { color:var(--tv-text-3) }\n/* Trace turns */\n.tv-root .tv-turn { margin:10px 0;padding:12px 16px;background:var(--tv-bg-soft);border-radius:4px;border-left:2px solid var(--tv-divider) }\n.tv-root .tv-turn-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n.tv-root .tv-turn-dur { color:var(--tv-text-3);font-weight:400;font-size:12px;margin-left:6px }\n.tv-root .tv-thinking { margin:6px 0;font-size:13px }\n.tv-root .tv-thinking summary { cursor:pointer;color:var(--tv-text-3);font-style:italic }\n.tv-root .tv-thinking-body { padding:10px 14px;background:rgba(58,58,58,.04);border-radius:4px;color:var(--tv-text-2);white-space:pre-wrap;font-size:13px;line-height:1.7;margin-top:6px }\n/* Tool calls */\n.tv-root .tv-call { margin:6px 0;padding:10px 14px;background:rgba(58,58,58,.03);border-radius:4px;font-size:13px }\n.tv-root .tv-call--err { border-left:2px solid var(--tv-fail) }\n.tv-root .tv-call-h { font-weight:500;color:var(--tv-text);margin-bottom:4px;font-size:14px }\n.tv-root .tv-call details { margin:4px 0;font-size:12px }\n.tv-root .tv-call summary { cursor:pointer;color:var(--tv-text-3);padding:2px 0 }\n.tv-root .tv-pre { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;background:rgba(58,58,58,.04);padding:10px 14px;border-radius:4px;overflow:auto;max-height:320px;white-space:pre-wrap;margin:4px 0;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-mock-badge { font-size:12px;color:var(--tv-pass);background:rgba(125,155,118,.12);padding:2px 8px;border-radius:10px;margin-left:8px }\n.tv-root .tv-trace-assert { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;margin-top:6px;line-height:1.5 }\n.tv-root .tv-trace-assert.tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-trace-assert.tv-assert--pass { color:var(--tv-text-2) }\n/* Final answer */\n.tv-root .tv-final { margin-top:14px }\n.tv-root .tv-final-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n/* Assertions */\n.tv-root .tv-assert { font-size:14px;font-family:\"SF Mono\",Menlo,monospace;padding:5px 0;line-height:1.6 }\n.tv-root .tv-assert--pass { color:var(--tv-text-2) }\n.tv-root .tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-assert-value { background:rgba(58,58,58,.04);padding:2px 6px;border-radius:3px;margin:0 2px }\n.tv-root .tv-turn-tag { font-size:12px;color:var(--tv-text-3);margin-left:8px;font-style:italic;font-family:-apple-system,sans-serif }\n.tv-root .tv-turn-tag--ok { color:var(--tv-pass) }\n.tv-root .tv-turn-tag--miss { color:var(--tv-fail) }\n.tv-root .tv-assert-msg { font-size:13px;color:var(--tv-text-3);margin-left:20px;margin-top:3px }\n/* Empty/warn states */\n.tv-root .tv-empty, .tv-root .tv-empty-page { color:var(--tv-text-3);font-style:italic;padding:14px 0;font-size:14px }\n.tv-root .tv-warn { color:var(--tv-warn);background:rgba(176,128,48,.08);padding:14px 18px;border-radius:4px;margin:8px 24px;font-size:14px;line-height:1.7 }\n";
/** 单测视角配套 JS:variant 切换 + view tab 切换。挂在 layout 末尾。 */
export declare const TEST_VIEW_JS = "\nfunction omkSwitchVariant(btn) {\n  var target = btn.getAttribute('data-target');\n  var tabs = btn.parentElement.querySelectorAll('.tv-vtab');\n  tabs.forEach(function(t){ t.classList.toggle('tv-vtab--active', t === btn); });\n  var panels = btn.parentElement.parentElement.querySelectorAll('.tv-variant-panel');\n  panels.forEach(function(p){ p.hidden = (p.getAttribute('data-variant') !== target); });\n}\nfunction omkSwitchView(name) {\n  var tabs = document.querySelectorAll('.omk-view-tab');\n  tabs.forEach(function(t){ t.classList.toggle('omk-view-tab--active', t.getAttribute('data-view') === name); });\n  var panels = document.querySelectorAll('.omk-view-panel');\n  panels.forEach(function(p){ p.hidden = (p.getAttribute('data-view') !== name); });\n}\n";
//# sourceMappingURL=test-view.d.ts.map