eduevidence 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +506 -0
  3. package/README.zh-CN.md +434 -0
  4. package/SKILL.md +195 -0
  5. package/bin/eduevidence.js +127 -0
  6. package/domains/education/manifest.json +183 -0
  7. package/domains/education/outcome_taxonomy.json +127 -0
  8. package/domains/manifest.json +26 -0
  9. package/domains/policy/frame.schema.json +234 -0
  10. package/domains/policy/manifest.json +10 -0
  11. package/domains/policy/methodology_checklist.json +109 -0
  12. package/domains/policy/outcome_taxonomy.json +53 -0
  13. package/domains/policy/references/causal-identification.md +45 -0
  14. package/domains/policy/references/cost-evidence.md +44 -0
  15. package/domains/policy/references/equity.md +42 -0
  16. package/domains/policy/references/evidence-hierarchy.md +41 -0
  17. package/domains/policy/references/implementation-evidence.md +47 -0
  18. package/eduevidence_cli.py +26 -0
  19. package/engine/__init__.py +11 -0
  20. package/engine/__pycache__/__init__.cpython-312.pyc +0 -0
  21. package/engine/__pycache__/analysis.cpython-312.pyc +0 -0
  22. package/engine/__pycache__/bias.cpython-312.pyc +0 -0
  23. package/engine/__pycache__/briefs.cpython-312.pyc +0 -0
  24. package/engine/__pycache__/capabilities.cpython-312.pyc +0 -0
  25. package/engine/__pycache__/citation_check.cpython-312.pyc +0 -0
  26. package/engine/__pycache__/contracts.cpython-312.pyc +0 -0
  27. package/engine/__pycache__/datasets.cpython-312.pyc +0 -0
  28. package/engine/__pycache__/events.cpython-312.pyc +0 -0
  29. package/engine/__pycache__/evidence_graph.cpython-312.pyc +0 -0
  30. package/engine/__pycache__/evidence_review.cpython-312.pyc +0 -0
  31. package/engine/__pycache__/evidencecore.cpython-312.pyc +0 -0
  32. package/engine/__pycache__/gap_lens.cpython-312.pyc +0 -0
  33. package/engine/__pycache__/gaps.cpython-312.pyc +0 -0
  34. package/engine/__pycache__/graph_store.cpython-312.pyc +0 -0
  35. package/engine/__pycache__/graph_validate.cpython-312.pyc +0 -0
  36. package/engine/__pycache__/ids.cpython-312.pyc +0 -0
  37. package/engine/__pycache__/library.cpython-312.pyc +0 -0
  38. package/engine/__pycache__/library_builtin.cpython-312.pyc +0 -0
  39. package/engine/__pycache__/living.cpython-312.pyc +0 -0
  40. package/engine/__pycache__/log.cpython-312.pyc +0 -0
  41. package/engine/__pycache__/meta_analysis.cpython-312.pyc +0 -0
  42. package/engine/__pycache__/meta_synthesis.cpython-312.pyc +0 -0
  43. package/engine/__pycache__/migration.cpython-312.pyc +0 -0
  44. package/engine/__pycache__/mode_router.cpython-312.pyc +0 -0
  45. package/engine/__pycache__/paths.cpython-312.pyc +0 -0
  46. package/engine/__pycache__/pilot.cpython-312.pyc +0 -0
  47. package/engine/__pycache__/planner.cpython-312.pyc +0 -0
  48. package/engine/__pycache__/project.cpython-312.pyc +0 -0
  49. package/engine/__pycache__/projections.cpython-312.pyc +0 -0
  50. package/engine/__pycache__/robustness.cpython-312.pyc +0 -0
  51. package/engine/__pycache__/run.cpython-312.pyc +0 -0
  52. package/engine/__pycache__/semantics.cpython-312.pyc +0 -0
  53. package/engine/__pycache__/study_design.cpython-312.pyc +0 -0
  54. package/engine/__pycache__/synthesis.cpython-312.pyc +0 -0
  55. package/engine/__pycache__/tribunal.cpython-312.pyc +0 -0
  56. package/engine/__pycache__/update.cpython-312.pyc +0 -0
  57. package/engine/__pycache__/versions.cpython-312.pyc +0 -0
  58. package/engine/analysis.py +308 -0
  59. package/engine/bias.py +178 -0
  60. package/engine/briefs.py +106 -0
  61. package/engine/capabilities.py +99 -0
  62. package/engine/citation_check.py +192 -0
  63. package/engine/contracts.py +117 -0
  64. package/engine/datasets.py +165 -0
  65. package/engine/events.py +67 -0
  66. package/engine/evidence_graph.py +571 -0
  67. package/engine/evidence_review.py +88 -0
  68. package/engine/evidencecore.py +182 -0
  69. package/engine/gap_lens.py +132 -0
  70. package/engine/gaps.py +169 -0
  71. package/engine/graph_store.py +335 -0
  72. package/engine/graph_validate.py +87 -0
  73. package/engine/ids.py +77 -0
  74. package/engine/library.py +268 -0
  75. package/engine/library_builtin.py +301 -0
  76. package/engine/living.py +671 -0
  77. package/engine/log.py +39 -0
  78. package/engine/meta_analysis.py +333 -0
  79. package/engine/meta_synthesis.py +111 -0
  80. package/engine/migration.py +397 -0
  81. package/engine/mode_router.py +72 -0
  82. package/engine/paths.py +15 -0
  83. package/engine/pilot.py +368 -0
  84. package/engine/planner.py +126 -0
  85. package/engine/project.py +118 -0
  86. package/engine/projections.py +240 -0
  87. package/engine/robustness.py +109 -0
  88. package/engine/run.py +85 -0
  89. package/engine/semantics.py +135 -0
  90. package/engine/study_design.py +87 -0
  91. package/engine/synthesis.py +187 -0
  92. package/engine/tribunal.py +408 -0
  93. package/engine/update.py +113 -0
  94. package/engine/versions.py +12 -0
  95. package/install.sh +510 -0
  96. package/integrations/__init__.py +1 -0
  97. package/integrations/__pycache__/__init__.cpython-312.pyc +0 -0
  98. package/integrations/__pycache__/agent_mcp.cpython-312.pyc +0 -0
  99. package/integrations/__pycache__/smart_web_fetch.cpython-312.pyc +0 -0
  100. package/integrations/agent_mcp.py +856 -0
  101. package/integrations/smart_web_fetch.py +59 -0
  102. package/package.json +50 -0
  103. package/pyproject.toml +55 -0
  104. package/references/applicability-policy.md +88 -0
  105. package/references/education-framing.md +132 -0
  106. package/references/effect_size_formulas.md +35 -0
  107. package/references/evaluation-design.md +111 -0
  108. package/references/evidence-quality.md +79 -0
  109. package/references/grade_framework.md +29 -0
  110. package/references/intervention-design.md +98 -0
  111. package/references/methodology-audit.md +103 -0
  112. package/references/outcome-taxonomy.md +106 -0
  113. package/references/retrieval-protocol.md +142 -0
  114. package/references/skeptic-protocol.md +93 -0
  115. package/references/social_science_pitfalls.md +48 -0
  116. package/references/source-validity.md +140 -0
  117. package/references/tribunal-policy.md +112 -0
  118. package/references/wwc_standards.md +29 -0
  119. package/retrieval/__init__.py +1 -0
  120. package/retrieval/__pycache__/__init__.cpython-312.pyc +0 -0
  121. package/retrieval/__pycache__/corpus_store.cpython-312.pyc +0 -0
  122. package/retrieval/__pycache__/dedupe.cpython-312.pyc +0 -0
  123. package/retrieval/__pycache__/failures.cpython-312.pyc +0 -0
  124. package/retrieval/__pycache__/fetch.cpython-312.pyc +0 -0
  125. package/retrieval/__pycache__/search.cpython-312.pyc +0 -0
  126. package/retrieval/__pycache__/source.cpython-312.pyc +0 -0
  127. package/retrieval/__pycache__/validate.cpython-312.pyc +0 -0
  128. package/retrieval/corpus_store.py +181 -0
  129. package/retrieval/dedupe.py +127 -0
  130. package/retrieval/failures.py +90 -0
  131. package/retrieval/fetch.py +435 -0
  132. package/retrieval/search.py +493 -0
  133. package/retrieval/source.py +160 -0
  134. package/retrieval/validate.py +257 -0
  135. package/schemas/agent-mcp-approval.schema.json +57 -0
  136. package/schemas/chart-spec.schema.json +88 -0
  137. package/schemas/cross-model-review.schema.json +28 -0
  138. package/schemas/education-frame.schema.json +106 -0
  139. package/schemas/evaluation.schema.json +35 -0
  140. package/schemas/evidence.schema.json +81 -0
  141. package/schemas/fetch-result.schema.json +119 -0
  142. package/schemas/intervention.schema.json +46 -0
  143. package/schemas/methodology.schema.json +102 -0
  144. package/schemas/report-result.schema.json +381 -0
  145. package/schemas/report-spec.schema.json +130 -0
  146. package/schemas/source.schema.json +311 -0
  147. package/schemas/v2/analysis-plan.schema.json +28 -0
  148. package/schemas/v2/analysis-run.schema.json +33 -0
  149. package/schemas/v2/claim.schema.json +26 -0
  150. package/schemas/v2/dataset-asset.schema.json +40 -0
  151. package/schemas/v2/decision-snapshot.schema.json +53 -0
  152. package/schemas/v2/evidence-link.schema.json +38 -0
  153. package/schemas/v2/finding.schema.json +47 -0
  154. package/schemas/v2/graph-revision.schema.json +30 -0
  155. package/schemas/v2/knowledge-gap.schema.json +40 -0
  156. package/schemas/v2/methodology-audit.schema.json +30 -0
  157. package/schemas/v2/outcome.schema.json +18 -0
  158. package/schemas/v2/project.schema.json +31 -0
  159. package/schemas/v2/research-intent.schema.json +24 -0
  160. package/schemas/v2/run.schema.json +43 -0
  161. package/schemas/v2/source.schema.json +24 -0
  162. package/schemas/v2/study-design.schema.json +67 -0
  163. package/schemas/v2/study.schema.json +37 -0
  164. package/schemas/v3/pilot-outcome.schema.json +132 -0
  165. package/schemas/v3/run-manifest.schema.json +193 -0
  166. package/schemas/v3/synthesis.schema.json +86 -0
  167. package/schemas/v4/drift-report.schema.json +66 -0
  168. package/schemas/v4/evidence-library.schema.json +42 -0
  169. package/schemas/v4/living-subscription.schema.json +55 -0
  170. package/schemas/v4/meta-analysis.schema.json +152 -0
  171. package/schemas/verdict.schema.json +56 -0
  172. package/scripts/__init__.py +0 -0
  173. package/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  174. package/scripts/__pycache__/benchmark.cpython-312.pyc +0 -0
  175. package/scripts/__pycache__/benchmark_evaluator.cpython-312.pyc +0 -0
  176. package/scripts/__pycache__/benchmark_judge.cpython-312.pyc +0 -0
  177. package/scripts/__pycache__/benchmark_routing.cpython-312.pyc +0 -0
  178. package/scripts/__pycache__/benchmark_v2.cpython-312.pyc +0 -0
  179. package/scripts/__pycache__/benchmark_v3.cpython-312.pyc +0 -0
  180. package/scripts/__pycache__/build_result.cpython-312.pyc +0 -0
  181. package/scripts/__pycache__/claim_audit.cpython-312.pyc +0 -0
  182. package/scripts/__pycache__/complexity_gate.cpython-312.pyc +0 -0
  183. package/scripts/__pycache__/compute_confidence.cpython-312.pyc +0 -0
  184. package/scripts/__pycache__/dashboard_server.cpython-312.pyc +0 -0
  185. package/scripts/__pycache__/did_regression.cpython-312.pyc +0 -0
  186. package/scripts/__pycache__/effect_calculator.cpython-312.pyc +0 -0
  187. package/scripts/__pycache__/evidence_matrix.cpython-312.pyc +0 -0
  188. package/scripts/__pycache__/evidence_score.cpython-312.pyc +0 -0
  189. package/scripts/__pycache__/evidence_semantics.cpython-312.pyc +0 -0
  190. package/scripts/__pycache__/fetch_benchmark.cpython-312.pyc +0 -0
  191. package/scripts/__pycache__/lint_report_layout.cpython-312.pyc +0 -0
  192. package/scripts/__pycache__/orchestrator.cpython-312.pyc +0 -0
  193. package/scripts/__pycache__/pre_verdict_gate.cpython-312.pyc +0 -0
  194. package/scripts/__pycache__/recompute_demo_quality.cpython-312.pyc +0 -0
  195. package/scripts/__pycache__/render_report.cpython-312.pyc +0 -0
  196. package/scripts/__pycache__/render_report_html.cpython-312.pyc +0 -0
  197. package/scripts/__pycache__/run_workspace.cpython-312.pyc +0 -0
  198. package/scripts/__pycache__/skill_lint.cpython-312.pyc +0 -0
  199. package/scripts/__pycache__/startup_probe.cpython-312.pyc +0 -0
  200. package/scripts/__pycache__/sync_killer_demo_report.cpython-312.pyc +0 -0
  201. package/scripts/__pycache__/test_adversarial_empirical.cpython-312-pytest-9.0.2.pyc +0 -0
  202. package/scripts/__pycache__/test_adversarial_empirical.cpython-312-pytest-9.1.1.pyc +0 -0
  203. package/scripts/__pycache__/validate_schema.cpython-312.pyc +0 -0
  204. package/scripts/audit_dois.py +292 -0
  205. package/scripts/bake_pack.sh +37 -0
  206. package/scripts/benchmark.py +183 -0
  207. package/scripts/benchmark_evaluator.py +371 -0
  208. package/scripts/benchmark_judge.py +535 -0
  209. package/scripts/benchmark_routing.py +120 -0
  210. package/scripts/benchmark_v2.py +304 -0
  211. package/scripts/benchmark_v3.py +552 -0
  212. package/scripts/build_esl_artifacts.py +1921 -0
  213. package/scripts/build_evidence_library.py +307 -0
  214. package/scripts/build_killer_demo.py +295 -0
  215. package/scripts/build_result.py +311 -0
  216. package/scripts/check_version_consistency.py +96 -0
  217. package/scripts/citation_check.py +123 -0
  218. package/scripts/claim_audit.py +157 -0
  219. package/scripts/complexity_gate.py +180 -0
  220. package/scripts/compute_confidence.py +176 -0
  221. package/scripts/dashboard_server.py +536 -0
  222. package/scripts/did_regression.py +315 -0
  223. package/scripts/effect_calculator.py +99 -0
  224. package/scripts/enrich_projects_human_and_lieflat.py +315 -0
  225. package/scripts/evidence_matrix.py +129 -0
  226. package/scripts/evidence_score.py +234 -0
  227. package/scripts/evidence_semantics.py +87 -0
  228. package/scripts/fetch_benchmark.py +177 -0
  229. package/scripts/generate_metrics.py +99 -0
  230. package/scripts/generate_new_projects.py +686 -0
  231. package/scripts/generate_promo.py +192 -0
  232. package/scripts/lint_report_layout.py +182 -0
  233. package/scripts/orchestrator.py +1456 -0
  234. package/scripts/pre_verdict_gate.py +513 -0
  235. package/scripts/quickstart.py +121 -0
  236. package/scripts/rebake_all_5themes.py +88 -0
  237. package/scripts/recompute_demo_quality.py +205 -0
  238. package/scripts/render_report.py +270 -0
  239. package/scripts/render_report_html.py +356 -0
  240. package/scripts/retraction_watch.py +110 -0
  241. package/scripts/run_workspace.py +337 -0
  242. package/scripts/serve_web.py +54 -0
  243. package/scripts/skill_lint.py +150 -0
  244. package/scripts/startup_probe.py +265 -0
  245. package/scripts/sync_killer_demo_report.py +270 -0
  246. package/scripts/test_adversarial_empirical.py +541 -0
  247. package/scripts/validate_schema.py +256 -0
  248. package/skill/agents/education-planner.md +80 -0
  249. package/skill/agents/evaluation-designer.md +74 -0
  250. package/skill/agents/evidence-analyst.md +106 -0
  251. package/skill/agents/evidence-judge.md +111 -0
  252. package/skill/agents/evidence-retriever.md +80 -0
  253. package/skill/agents/intervention-designer.md +82 -0
  254. package/skill/agents/method-reviewer.md +104 -0
  255. package/skill/agents/skeptic.md +89 -0
  256. package/skill/sub-skills/aihot-trend-analysis/SKILL.md +31 -0
  257. package/skill/sub-skills/contradiction-analysis/SKILL.md +17 -0
  258. package/skill/sub-skills/data-analysis/SKILL.md +23 -0
  259. package/skill/sub-skills/ethics-review/SKILL.md +25 -0
  260. package/skill/sub-skills/evidence-extraction/SKILL.md +19 -0
  261. package/skill/sub-skills/evidence-review/SKILL.md +18 -0
  262. package/skill/sub-skills/gap-analysis/SKILL.md +25 -0
  263. package/skill/sub-skills/literature-review/SKILL.md +21 -0
  264. package/skill/sub-skills/methodology-audit/SKILL.md +20 -0
  265. package/skill/sub-skills/report-generation/SKILL.md +51 -0
  266. package/skill/sub-skills/research-planning/SKILL.md +21 -0
  267. package/skill/sub-skills/study-design/SKILL.md +16 -0
  268. package/skill/task-briefs/adjudicate.md +17 -0
  269. package/skill/task-briefs/audit.md +15 -0
  270. package/skill/task-briefs/challenge.md +15 -0
  271. package/skill/task-briefs/evaluate.md +13 -0
  272. package/skill/task-briefs/extract.md +16 -0
  273. package/skill/task-briefs/frame.md +17 -0
  274. package/skill/task-briefs/intervene.md +14 -0
  275. package/skill/task-briefs/present.md +16 -0
  276. package/skill/task-briefs/retrieve.md +15 -0
  277. package/visualization/eduevidence-report/assets/base.css +337 -0
  278. package/visualization/eduevidence-report/motion/motion.css +157 -0
  279. package/visualization/eduevidence-report/motion/motion.js +107 -0
  280. package/visualization/eduevidence-report/references/bilingual-style.md +7 -0
  281. package/visualization/eduevidence-report/references/component-catalog.md +145 -0
  282. package/visualization/eduevidence-report/references/evidence-expansion.md +65 -0
  283. package/visualization/eduevidence-report/references/full-report-outline.md +86 -0
  284. package/visualization/eduevidence-report/references/layout-constraints.md +63 -0
  285. package/visualization/eduevidence-report/references/lieflat-composition.md +79 -0
  286. package/visualization/eduevidence-report/references/motion-system.md +31 -0
  287. package/visualization/eduevidence-report/schemas/adapter-envelope.schema.json +22 -0
  288. package/visualization/eduevidence-report/schemas/visual-layout.schema.json +87 -0
  289. package/visualization/eduevidence-report/scripts/__pycache__/adapter_contract.cpython-312.pyc +0 -0
  290. package/visualization/eduevidence-report/scripts/__pycache__/build_artifact_manifest.cpython-312.pyc +0 -0
  291. package/visualization/eduevidence-report/scripts/__pycache__/build_charts.cpython-312.pyc +0 -0
  292. package/visualization/eduevidence-report/scripts/__pycache__/build_figures.cpython-312.pyc +0 -0
  293. package/visualization/eduevidence-report/scripts/__pycache__/build_infographics.cpython-312.pyc +0 -0
  294. package/visualization/eduevidence-report/scripts/__pycache__/build_report.cpython-312.pyc +0 -0
  295. package/visualization/eduevidence-report/scripts/__pycache__/charts_data.cpython-312.pyc +0 -0
  296. package/visualization/eduevidence-report/scripts/__pycache__/lieflat_engine.cpython-312.pyc +0 -0
  297. package/visualization/eduevidence-report/scripts/__pycache__/zh_labels.cpython-312.pyc +0 -0
  298. package/visualization/eduevidence-report/scripts/adapter_contract.py +72 -0
  299. package/visualization/eduevidence-report/scripts/build_artifact_manifest.py +70 -0
  300. package/visualization/eduevidence-report/scripts/build_charts.py +283 -0
  301. package/visualization/eduevidence-report/scripts/build_figures.py +515 -0
  302. package/visualization/eduevidence-report/scripts/build_infographics.py +268 -0
  303. package/visualization/eduevidence-report/scripts/build_report.py +3211 -0
  304. package/visualization/eduevidence-report/scripts/charts_data.py +617 -0
  305. package/visualization/eduevidence-report/scripts/check_mobile_layout.js +220 -0
  306. package/visualization/eduevidence-report/scripts/lieflat_engine.py +852 -0
  307. package/visualization/eduevidence-report/scripts/zh_labels.py +245 -0
  308. package/visualization/eduevidence-report/themes/academic.css +94 -0
  309. package/visualization/eduevidence-report/themes/claude.css +96 -0
  310. package/visualization/eduevidence-report/themes/datalab-dark.css +147 -0
  311. package/visualization/eduevidence-report/themes/datalab.css +151 -0
  312. package/visualization/eduevidence-report/themes/presentation.css +140 -0
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env python3
2
+ """zh_labels.py — 显示层中文标签映射(v5 §10:格式化显示属于渲染器权限)。
3
+
4
+ 只映射枚举/标签类字段(outcome_type、study_type、authority_level、状态、置信度等),
5
+ 绝不改写数据内容(Evidence 文本、Claim 文本、Verdict 文本保持 result.json 原文,
6
+ 以维持 Claim-Evidence-Source 可追溯性与 Scientific Integrity)。
7
+
8
+ 三个适配器 + Composer 共用,保证全报告语言一致。
9
+ """
10
+ from __future__ import annotations
11
+
12
+ OUTCOME_ZH = {
13
+ "knowledge_gain": "知识获得",
14
+ "concept_understanding": "概念理解",
15
+ "retention": "记忆保持",
16
+ "transfer": "迁移能力",
17
+ "independent_problem_solving": "独立问题解决",
18
+ "completion_time": "完成时间",
19
+ "accuracy": "正确率",
20
+ "code_quality": "代码质量",
21
+ "assignment_score": "作业成绩",
22
+ "engagement": "参与度",
23
+ "motivation": "学习动机",
24
+ "cognitive_load": "认知负荷",
25
+ "help_seeking": "求助行为",
26
+ "metacognition": "元认知",
27
+ "ai_dependency": "AI 依赖",
28
+ "over_reliance": "过度依赖",
29
+ "reduced_effort": "努力下降",
30
+ "reduced_transfer": "迁移下降",
31
+ "academic_integrity_risk": "学术诚信风险",
32
+ "false_confidence": "虚假自信",
33
+ "learning_gain": "学习收获",
34
+ "task_performance": "任务表现",
35
+ "programming_skill": "编程技能",
36
+ "writing_skill": "写作技能",
37
+ }
38
+
39
+ STUDY_ZH = {
40
+ "rct": "随机对照试验",
41
+ "randomized_controlled_trial": "随机对照试验",
42
+ "randomized controlled trial (rct)": "随机对照试验",
43
+ "quasi_experiment": "准实验",
44
+ "quasi_experimental": "准实验",
45
+ "quasi-experimental did": "准实验(双重差分)",
46
+ "did": "双重差分",
47
+ "literature_review": "文献综述",
48
+ "literature review": "文献综述",
49
+ "systematic_review": "系统综述",
50
+ "observational": "观察性研究",
51
+ "mixed_methods": "混合方法",
52
+ "case_study": "案例研究",
53
+ "longitudinal": "纵向研究",
54
+ "meta_analysis": "元分析",
55
+ "systematic_review": "系统综述",
56
+ "survey": "调查",
57
+ "qualitative": "质性研究",
58
+ "correlational": "相关研究",
59
+ }
60
+
61
+ AUTHORITY_ZH = {
62
+ "tier1_paper_doi": "T1 DOI 可验证论文",
63
+ "tier1_peer_reviewed": "T1 同行评议论文",
64
+ "tier1_peer_reviewed_journal": "T1 同行评议期刊",
65
+ "tier2_peer_reviewed": "T2 同行评议论文",
66
+ "tier2_peer_reviewed_conference": "T2 同行评议会议",
67
+ "tier3_peer_reviewed": "T3 专业机构成果",
68
+ "tier3_professional_institution": "T3 专业机构",
69
+ "tier4_reputable_media": "T4 权威媒体",
70
+ "tier5_unverified": "T5 未验证",
71
+ }
72
+
73
+ CLAIM_STATUS_ZH = {
74
+ "SUPPORTED": "已支持",
75
+ "supported": "已支持",
76
+ "UNSUPPORTED": "无支撑",
77
+ "unsupported": "无支撑",
78
+ "DOWNGRADE_CONFIDENCE": "降级置信度",
79
+ "downgrade_confidence": "降级置信度",
80
+ "CONTRADICT": "被反驳",
81
+ "contradicted": "被反驳",
82
+ "uncertain": "不确定",
83
+ "missing": "缺失",
84
+ }
85
+
86
+ VERDICT_ZH = {
87
+ "met": "通过",
88
+ "partial": "部分",
89
+ "not_applicable": "不适用",
90
+ "missing": "缺失",
91
+ "concern": "关注",
92
+ "CONCERN": "关注",
93
+ "PASS": "通过",
94
+ "FAIL": "失败",
95
+ }
96
+
97
+ CONFIDENCE_ZH = {
98
+ "High": "高",
99
+ "Moderate": "中",
100
+ "Low": "低",
101
+ "Insufficient": "不足",
102
+ }
103
+
104
+ MODE_ZH = {
105
+ "platform_native": "平台原生",
106
+ "agent_mcp_enhanced": "Agent MCP 增强",
107
+ }
108
+
109
+ ACTION_ZH = {
110
+ "adopt": "全面采用",
111
+ "ADOPT": "全面采用",
112
+ "pilot": "试点验证",
113
+ "PILOT": "试点验证",
114
+ "reject": "不建议采用",
115
+ "REJECT": "不建议采用",
116
+ "insufficient_evidence": "证据不足",
117
+ "INSUFFICIENT": "证据不足",
118
+ "INSUFFICIENT_EVIDENCE": "证据不足",
119
+ }
120
+
121
+
122
+ # 英文可读标签(lang=en 时显示;无映射时显示原始枚举值)
123
+ OUTCOME_EN = {
124
+ "knowledge_gain": "Knowledge gain",
125
+ "concept_understanding": "Concept understanding",
126
+ "retention": "Retention",
127
+ "transfer": "Transfer",
128
+ "independent_problem_solving": "Independent problem solving",
129
+ "completion_time": "Completion time",
130
+ "accuracy": "Accuracy",
131
+ "code_quality": "Code quality",
132
+ "assignment_score": "Assignment score",
133
+ "engagement": "Engagement",
134
+ "motivation": "Motivation",
135
+ "cognitive_load": "Cognitive load",
136
+ "help_seeking": "Help seeking",
137
+ "metacognition": "Metacognition",
138
+ "ai_dependency": "AI dependency",
139
+ "over_reliance": "Over-reliance",
140
+ "reduced_effort": "Reduced effort",
141
+ "reduced_transfer": "Reduced transfer",
142
+ "academic_integrity_risk": "Academic integrity risk",
143
+ "false_confidence": "False confidence",
144
+ "learning_gain": "Learning gain",
145
+ "task_performance": "Task performance",
146
+ "programming_skill": "Programming skill",
147
+ "writing_skill": "Writing skill",
148
+ }
149
+ STUDY_EN = {
150
+ "rct": "Randomized controlled trial",
151
+ "quasi_experiment": "Quasi-experiment",
152
+ "quasi_experimental": "Quasi-experimental",
153
+ "observational": "Observational",
154
+ "mixed_methods": "Mixed methods",
155
+ "case_study": "Case study",
156
+ "longitudinal": "Longitudinal",
157
+ "meta_analysis": "Meta-analysis",
158
+ "systematic_review": "Systematic review",
159
+ "survey": "Survey",
160
+ "qualitative": "Qualitative",
161
+ "correlational": "Correlational",
162
+ }
163
+ AUTHORITY_EN = {
164
+ "tier1_paper_doi": "Tier 1 DOI-verified paper",
165
+ "tier1_peer_reviewed_journal": "Tier 1 peer-reviewed journal",
166
+ "tier2_peer_reviewed_conference": "Tier 2 peer-reviewed conference",
167
+ "tier3_professional_institution": "Tier 3 professional institution",
168
+ "tier4_reputable_media": "Tier 4 reputable media",
169
+ "tier5_unverified": "Tier 5 unverified",
170
+ }
171
+ STATUS_EN = {
172
+ "SUPPORTED": "Supported",
173
+ "UNSUPPORTED": "Unsupported",
174
+ "DOWNGRADE_CONFIDENCE": "Confidence downgraded",
175
+ "CONTRADICT": "Contradicted",
176
+ }
177
+ VERDICT_EN = {
178
+ "met": "Met", "partial": "Partial", "not_applicable": "N/A",
179
+ "concern": "Concern", "CONCERN": "Concern", "PASS": "Pass", "FAIL": "Fail",
180
+ }
181
+ CONFIDENCE_EN = {
182
+ "High": "High", "Moderate": "Moderate", "Low": "Low", "Insufficient": "Insufficient",
183
+ }
184
+ MODE_EN = {
185
+ "platform_native": "Platform native", "agent_mcp_enhanced": "Agent MCP enhanced",
186
+ }
187
+ ACTION_EN = {
188
+ "adopt": "Adopt", "pilot": "Pilot", "reject": "Reject",
189
+ "insufficient_evidence": "Insufficient evidence",
190
+ }
191
+ DIR_EN = {"support": "Support", "contradict": "Contradict", "neutral": "Neutral"}
192
+ DIR_ZH = {"support": "支持", "contradict": "反驳", "neutral": "中性"}
193
+
194
+
195
+ def label(lang: str, kind: str, value: str) -> str:
196
+ """按语言取枚举可读标签:zh → 中文;en → 英文(无映射时返回原值)。"""
197
+ if lang == "zh":
198
+ table = {"outcome": OUTCOME_ZH, "study": STUDY_ZH, "authority": AUTHORITY_ZH,
199
+ "status": CLAIM_STATUS_ZH, "verdict": VERDICT_ZH, "confidence": CONFIDENCE_ZH,
200
+ "mode": MODE_ZH, "action": ACTION_ZH, "dir": DIR_ZH}
201
+ else:
202
+ table = {"outcome": OUTCOME_EN, "study": STUDY_EN, "authority": AUTHORITY_EN,
203
+ "status": STATUS_EN, "verdict": VERDICT_EN, "confidence": CONFIDENCE_EN,
204
+ "mode": MODE_EN, "action": ACTION_EN, "dir": DIR_EN}
205
+ table = table.get(kind, {})
206
+ if value is None:
207
+ return value
208
+ if value in table:
209
+ return table[value]
210
+ lowered = value.lower()
211
+ if lowered in table:
212
+ return table[lowered]
213
+ return value
214
+
215
+
216
+ def zh_outcome(value: str) -> str:
217
+ return OUTCOME_ZH.get(value, value)
218
+
219
+
220
+ def zh_study(value: str) -> str:
221
+ return STUDY_ZH.get(value, value)
222
+
223
+
224
+ def zh_authority(value: str) -> str:
225
+ return AUTHORITY_ZH.get(value, value)
226
+
227
+
228
+ def zh_status(value: str) -> str:
229
+ return CLAIM_STATUS_ZH.get(value, value)
230
+
231
+
232
+ def zh_verdict(value: str) -> str:
233
+ return VERDICT_ZH.get(value, value)
234
+
235
+
236
+ def zh_confidence(value: str) -> str:
237
+ return CONFIDENCE_ZH.get(value, value)
238
+
239
+
240
+ def zh_mode(value: str) -> str:
241
+ return MODE_ZH.get(value, value)
242
+
243
+
244
+ def zh_action(value: str) -> str:
245
+ return ACTION_ZH.get(value, value)
@@ -0,0 +1,94 @@
1
+ /* Theme 02 — Academic Paper.
2
+ Formal review-paper reading and print: serif body, document rules, compact figures,
3
+ minimal decorative cards, strong provenance and grayscale-friendly structure. */
4
+ :root[data-theme="academic"] {
5
+ --bg:#FFFFFF; --surface:#FFFFFF; --surface2:#FAFAF8; --text:#151515;
6
+ --text-muted:#555; --primary:#234B57; --primary-soft:#EEF2F3;
7
+ --support:#2F6B3A; --support-soft:#EDF4EE; --contradict:#8A3A2F;
8
+ --contradict-soft:#F5ECEA; --uncertain:#806727; --uncertain-soft:#F5F1E5;
9
+ --insufficient:#666; --border:#BFC1C2; --radius:0; --radius-sm:0; --shadow:none;
10
+ --font-head:'Times New Roman','Songti SC','STSong',serif;
11
+ --font-ui:'Times New Roman','Songti SC','STSong',serif; --font-mono:'Courier New',Consolas,monospace;
12
+ }
13
+ :root[data-theme="academic"] body { font-size:15px; line-height:1.58; }
14
+ :root[data-theme="academic"] .report-shell { max-width:980px; padding-top:22px; }
15
+ :root[data-theme="academic"] .report-header { border-bottom:2px solid #222; margin-bottom:34px; }
16
+ :root[data-theme="academic"] .report-header h1 { font-size:2rem; line-height:1.18; text-align:center; }
17
+ :root[data-theme="academic"] .report-header .meta { text-align:center; }
18
+ :root[data-theme="academic"] .report-section { background:transparent; border:0; box-shadow:none; padding:0; margin-bottom:34px; }
19
+ :root[data-theme="academic"] .report-section>h2 { font-size:1.08rem; border-bottom:1px solid #444; border-radius:0; padding:0 0 5px; }
20
+ :root[data-theme="academic"] .section-lead { background:transparent; border:0; padding:0; margin:4px 0 14px; font-style:italic; }
21
+ :root[data-theme="academic"] .decision-hero { border:1px solid #444; background:#fff; border-radius:0; padding:22px 24px; }
22
+ :root[data-theme="academic"] .hero-insight,
23
+ :root[data-theme="academic"] .tribunal-card,
24
+ :root[data-theme="academic"] .trace-chain-card,
25
+ :root[data-theme="academic"] .action-node,
26
+ :root[data-theme="academic"] .outcome-group { border-radius:0; background:#fff; box-shadow:none; }
27
+ :root[data-theme="academic"] .hero-insights { gap:0; border-top:1px solid #999; border-left:1px solid #999; }
28
+ :root[data-theme="academic"] .hero-insight { border:0; border-right:1px solid #999; border-bottom:1px solid #999; min-height:0; }
29
+ :root[data-theme="academic"] .data-table { font-size:.82rem; }
30
+ :root[data-theme="academic"] .data-table th,
31
+ :root[data-theme="academic"] .data-table td { border-left:0; border-right:0; border-color:#A8A8A8; padding:6px 8px; }
32
+ :root[data-theme="academic"] .data-table thead th { border-top:1.5px solid #222; border-bottom:1px solid #222; background:#fff; }
33
+ :root[data-theme="academic"] .data-table tbody tr:last-child td { border-bottom:1.5px solid #222; }
34
+ :root[data-theme="academic"] figcaption,
35
+ :root[data-theme="academic"] .chart-summary { font-family:var(--font-ui); font-size:.8rem; font-style:italic; color:#333; }
36
+ :root[data-theme="academic"] .dir { border:1px solid currentColor; background:transparent !important; color:#222 !important; border-radius:0; }
37
+ :root[data-theme="academic"] .quality-meter i { background:#333; }
38
+ /* Dual-layer reader — formal paper / review article. */
39
+ :root[data-theme="academic"] .report-brand-row { justify-content:center; }
40
+ :root[data-theme="academic"] .report-brand { font-variant:small-caps; letter-spacing:.12em; }
41
+ :root[data-theme="academic"] .generated-theme-chip { border:0; padding:0; }
42
+ :root[data-theme="academic"] .report-view-switcher { justify-content:center; border-top:1px solid #222; border-bottom:1px solid #222; padding:5px 0; gap:22px; }
43
+ :root[data-theme="academic"] .report-view-btn { border:0; border-radius:0; background:transparent; padding:3px 2px; font-family:var(--font-ui); }
44
+ :root[data-theme="academic"] .report-view-btn.active { background:transparent; color:#000; box-shadow:none; text-decoration:underline; text-underline-offset:4px; }
45
+ :root[data-theme="academic"] .brief-block { max-width:790px; margin-bottom:48px; }
46
+ :root[data-theme="academic"] .brief-block-header { max-width:none; border-bottom:1px solid #777; padding-bottom:6px; }
47
+ :root[data-theme="academic"] .brief-block-header h2 { font-size:1.16rem; }
48
+ :root[data-theme="academic"] .brief-decision .decision-hero { border:1px solid #444; padding:20px 24px; }
49
+ :root[data-theme="academic"] .brief-outcomes,
50
+ :root[data-theme="academic"] .brief-sources { max-width:930px; }
51
+ :root[data-theme="academic"] .brief-source-grid { gap:0; border-top:1px solid #777; }
52
+ :root[data-theme="academic"] .brief-source { border-width:0 0 1px 0; padding:10px 4px; }
53
+ :root[data-theme="academic"] .full-report-intro { max-width:740px; margin-bottom:22px; text-align:center; }
54
+ :root[data-theme="academic"] .full-report-intro h2 { font-size:1.45rem; }
55
+ :root[data-theme="academic"] .full-report-layout { grid-template-columns:175px minmax(0,1fr); gap:34px; }
56
+ :root[data-theme="academic"] .full-report-toc { border-right:1px solid #777; padding-right:14px; }
57
+ :root[data-theme="academic"] .full-report-toc a { border:0; border-bottom:1px dotted #bbb; padding:7px 0; font-size:.77rem; }
58
+ :root[data-theme="academic"] .full-report-toc a.active { border-left:0; background:transparent; font-weight:700; color:#000; }
59
+ @media (max-width:980px) {
60
+ :root[data-theme="academic"] .full-report-layout { grid-template-columns:minmax(0,1fr); }
61
+ }
62
+ :root[data-theme="academic"] .full-report-content { max-width:740px; }
63
+ :root[data-theme="academic"] .full-chapter { border-bottom:0; margin-bottom:50px; padding-bottom:0; }
64
+ :root[data-theme="academic"] .full-chapter-header { max-width:none; border-bottom:1px solid #444; padding-bottom:7px; margin-bottom:18px; }
65
+ :root[data-theme="academic"] .full-chapter-header h2 { font-size:1.22rem; }
66
+ :root[data-theme="academic"] .full-chapter-lead { font-style:italic; color:#444; }
67
+ :root[data-theme="academic"] .scope-card,
68
+ :root[data-theme="academic"] .retrieval-grid>article,
69
+ :root[data-theme="academic"] .retrieval-coverage,
70
+ :root[data-theme="academic"] .method-audit-item,
71
+ :root[data-theme="academic"] .brief-source,
72
+ :root[data-theme="academic"] .detail-body { border-radius:0; background:#fff; box-shadow:none; }
73
+ :root[data-theme="academic"] .method-audit-grid { grid-template-columns:minmax(0,1fr); gap:0; }
74
+ :root[data-theme="academic"] .method-audit-item { border-width:0 0 1px 0; padding:9px 0; }
75
+ :root[data-theme="academic"] .evidence-detail-grid dt,
76
+ :root[data-theme="academic"] .evidence-detail-grid dd { border-color:#999; }
77
+ @media print {
78
+ :root[data-theme="academic"] .generated-theme { display:none; }
79
+ :root[data-theme="academic"] .report-section { break-inside:auto; }
80
+ :root[data-theme="academic"] .data-table { font-size:8.5pt; }
81
+ }
82
+
83
+ /* Typography pass: journal rules for the Lieflat gallery + print scale. */
84
+ :root[data-theme="academic"] .lieflat-card { border:1px solid #444; border-radius:0; background:#fff; padding:18px 22px 14px; }
85
+ :root[data-theme="academic"] .lieflat-title { font-size:1.05rem; }
86
+ :root[data-theme="academic"] .lieflat-sub { font-size:.82rem; }
87
+ :root[data-theme="academic"] .lieflat-caption { font-style:italic; font-size:.78rem; }
88
+ :root[data-theme="academic"] .lieflat-src { letter-spacing:.06em; }
89
+ :root[data-theme="academic"] .lieflat-figure svg { border:1px solid #999; border-radius:0; background:#fff; }
90
+ @media print {
91
+ :root[data-theme="academic"] body { font-size:8.5pt; }
92
+ :root[data-theme="academic"] .lieflat-card { border:1px solid #444; }
93
+ :root[data-theme="academic"] .lieflat-title { font-size:10pt; }
94
+ }
@@ -0,0 +1,96 @@
1
+ /* Theme 01 — Claude Research.
2
+ Calm long-form research reading: warm paper, restrained accents, sparse cards,
3
+ wide data breakouts and generous section rhythm. */
4
+ :root[data-theme="claude"] {
5
+ --bg:#F7F4ED; --surface:#FFFFFF; --surface2:#FCFAF6; --text:#3A3833;
6
+ --text-muted:#8A867E; --primary:#B8694A; --primary-soft:#F3E4DC;
7
+ --support:#5E8A6A; --support-soft:#E4EDE5; --contradict:#A85B53;
8
+ --contradict-soft:#F0E0DE; --uncertain:#C99A4A; --uncertain-soft:#F4EADA;
9
+ --insufficient:#8A867E; --border:#E5DFD3; --radius:12px; --radius-sm:8px;
10
+ --shadow:0 1px 3px rgba(60,56,48,.07); --font-head:'Georgia','Songti SC','STSong',serif;
11
+ --font-ui:'Helvetica Neue','PingFang SC','Noto Sans CJK SC',Arial,sans-serif; --font-mono:'SF Mono',Menlo,Consolas,monospace;
12
+ }
13
+ :root[data-theme="claude"] .report-shell { max-width:1240px; padding-top:34px; }
14
+ :root[data-theme="claude"] .report-header { max-width:900px; margin:0 auto 42px; padding-bottom:22px; }
15
+ :root[data-theme="claude"] .report-header h1 { font-size:clamp(1.9rem,4vw,3rem); line-height:1.18; font-weight:500; }
16
+ :root[data-theme="claude"] .report-section { background:transparent; border:0; box-shadow:none; padding:0; }
17
+ :root[data-theme="claude"] .report-section>h2 { border:0; font-size:1.4rem; padding:0; margin-bottom:7px; }
18
+ :root[data-theme="claude"] .section-lead { background:transparent; border:0; padding:0; max-width:760px; margin-bottom:24px; }
19
+ :root[data-theme="claude"] .decision-hero { background:var(--surface); box-shadow:0 10px 30px rgba(60,56,48,.06); }
20
+ :root[data-theme="claude"] .hero-insight { border-radius:8px; box-shadow:0 1px 0 rgba(60,56,48,.03); }
21
+ :root[data-theme="claude"] .section-data>.table-wrap,
22
+ :root[data-theme="claude"] .section-data>.matrix-controls,
23
+ :root[data-theme="claude"] .section-data>.outcome-separation,
24
+ :root[data-theme="claude"] .section-data>.trace-chain { width:min(1180px,calc(100vw - 48px)); margin-left:50%; transform:translateX(-50%); }
25
+ :root[data-theme="claude"] .data-table th { font-weight:600; }
26
+ :root[data-theme="claude"] .tribunal-card,
27
+ :root[data-theme="claude"] .trace-chain-card,
28
+ :root[data-theme="claude"] .action-node { background:var(--surface); }
29
+
30
+ /* Dual-layer reader — calm research workspace. */
31
+ :root[data-theme="claude"] .report-header { max-width:940px; }
32
+ :root[data-theme="claude"] .report-brand { color:var(--primary); }
33
+ :root[data-theme="claude"] .report-view-switcher { display:inline-flex; padding:4px; background:#EFEAE0; border-radius:999px; }
34
+ :root[data-theme="claude"] .report-view-btn { border:0; background:transparent; padding:7px 15px; }
35
+ :root[data-theme="claude"] .report-view-btn.active { background:var(--surface); color:var(--text); box-shadow:0 1px 4px rgba(60,56,48,.09); }
36
+ :root[data-theme="claude"] .brief-block { max-width:980px; }
37
+ :root[data-theme="claude"] .brief-block-header { margin-bottom:26px; }
38
+ :root[data-theme="claude"] .brief-block-header h2 { font-size:1.55rem; font-weight:500; }
39
+ :root[data-theme="claude"] .brief-decision { max-width:1040px; }
40
+ :root[data-theme="claude"] .brief-outcomes .brief-block-body,
41
+ :root[data-theme="claude"] .brief-tribunal .brief-block-body { width:min(1120px,calc(100vw - 48px)); margin-left:50%; transform:translateX(-50%); }
42
+ :root[data-theme="claude"] .brief-source { background:var(--surface); box-shadow:0 1px 3px rgba(60,56,48,.04); }
43
+ :root[data-theme="claude"] .full-report-intro { max-width:880px; margin-left:250px; }
44
+ :root[data-theme="claude"] .full-report-layout { grid-template-columns:210px minmax(0,1fr); gap:56px; }
45
+ :root[data-theme="claude"] .full-report-toc { border-right:0; padding-right:0; }
46
+ :root[data-theme="claude"] .full-report-toc a { border-left:1px solid var(--border); padding:8px 0 8px 13px; background:transparent; }
47
+ :root[data-theme="claude"] .full-report-toc a.active { border-left:2px solid var(--primary); background:transparent; color:var(--text); }
48
+ :root[data-theme="claude"] .full-report-content { max-width:900px; }
49
+ @media (max-width:980px) {
50
+ :root[data-theme="claude"] .full-report-layout { grid-template-columns:minmax(0,1fr); gap:28px; }
51
+ }
52
+ :root[data-theme="claude"] .full-chapter { border-bottom:0; margin-bottom:72px; padding-bottom:0; }
53
+ :root[data-theme="claude"] .full-chapter-header { max-width:760px; margin-bottom:30px; }
54
+ :root[data-theme="claude"] .full-chapter-header h2 { font-size:1.8rem; font-weight:500; }
55
+ :root[data-theme="claude"] .scope-card,
56
+ :root[data-theme="claude"] .retrieval-grid>article,
57
+ :root[data-theme="claude"] .retrieval-coverage,
58
+ :root[data-theme="claude"] .method-audit-item { background:var(--surface); }
59
+ :root[data-theme="claude"] .detail-body { background:#FBF8F2; }
60
+
61
+ /* Header chrome: keep language controls inside the reading measure instead of a full-width strip. */
62
+ :root[data-theme="claude"] .controls {
63
+ max-width:940px; margin:16px auto 0; padding:8px 2px 12px;
64
+ border-bottom:1px solid var(--border); background:transparent;
65
+ }
66
+ :root[data-theme="claude"] .generated-theme {
67
+ margin-right:auto; color:var(--text-muted); font-family:var(--font-ui);
68
+ font-size:.76rem; font-weight:700; letter-spacing:.075em; text-transform:uppercase;
69
+ }
70
+ :root[data-theme="claude"] .lang-switcher {
71
+ gap:6px; padding:3px; border:1px solid var(--border); border-radius:999px;
72
+ background:rgba(255,255,255,.62);
73
+ }
74
+ :root[data-theme="claude"] .lang-switcher>span { margin-left:6px; font-size:.72rem; }
75
+ :root[data-theme="claude"] .lang-btn { border:0; background:transparent; padding:4px 11px; }
76
+ :root[data-theme="claude"] .lang-btn.active { background:var(--primary); color:#fff; }
77
+ :root[data-theme="claude"] .report-brand-row { margin-bottom:12px; }
78
+ :root[data-theme="claude"] .generated-theme-chip {
79
+ background:#F1ECE3; border-color:#E2D8C9; color:#736D64; text-transform:none;
80
+ }
81
+ @media (max-width:980px) {
82
+ :root[data-theme="claude"] .full-report-intro { margin-left:0; }
83
+ }
84
+
85
+ /* Typography pass: reading measure stays inside the serif breathing room;
86
+ Lieflat cards inherit the warm-paper identity (no letter-spacing on CJK). */
87
+ :root[data-theme="claude"] .full-chapter-body p,
88
+ :root[data-theme="claude"] .section-narrative p { max-width:68ch; }
89
+ :root[data-theme="claude"] .brief-block-header p,
90
+ :root[data-theme="claude"] .full-chapter-lead,
91
+ :root[data-theme="claude"] .section-lead { max-width:62ch; }
92
+ :root[data-theme="claude"] .lieflat-card { background:var(--surface); border-radius:16px; padding:26px 28px 20px; }
93
+ :root[data-theme="claude"] .lieflat-title { font-weight:500; font-size:1.28rem; line-height:1.3; }
94
+ :root[data-theme="claude"] .lieflat-sub { max-width:720px; }
95
+ :root[data-theme="claude"] .lieflat-figure svg { border-radius:12px; background:transparent; }
96
+ :root[data-theme="claude"] .lieflat-suppressed { background:var(--surface2); }
@@ -0,0 +1,147 @@
1
+ /* Theme 04 — DataLab Dark.
2
+ Same information architecture as DataLab Light, rendered as a focused dark analytical workspace. */
3
+ :root[data-theme="datalab-dark"] {
4
+ --bg:#0F131A; --surface:#171C24; --surface2:#1D2430; --text:#E9EDF3;
5
+ --text-muted:#98A3B3; --primary:#6EA8FF; --primary-soft:#1B3152;
6
+ --support:#58C79B; --support-soft:#18372C; --contradict:#F08282;
7
+ --contradict-soft:#422426; --uncertain:#E4B45F; --uncertain-soft:#3B3020;
8
+ --insufficient:#8D98A8; --border:#2D3745; --radius:8px; --radius-sm:6px;
9
+ --shadow:0 8px 24px rgba(0,0,0,.22); --font-head:'Helvetica Neue',Arial,'PingFang SC',sans-serif;
10
+ --font-ui:'Helvetica Neue',Arial,'PingFang SC',sans-serif; --font-mono:'SF Mono',Menlo,Consolas,monospace;
11
+ }
12
+ :root[data-theme="datalab-dark"] body { font-size:15.5px; }
13
+ :root[data-theme="datalab-dark"] .controls {
14
+ max-width:1480px; margin-top:12px; padding:9px 12px; border:1px solid var(--border);
15
+ border-radius:10px; background:rgba(23,28,36,.94); box-shadow:var(--shadow); backdrop-filter:blur(12px);
16
+ }
17
+ :root[data-theme="datalab-dark"] .generated-theme { color:var(--primary); font-weight:750; letter-spacing:.06em; }
18
+ :root[data-theme="datalab-dark"] .lang-btn { background:var(--surface2); border-color:var(--border); color:var(--text); }
19
+ :root[data-theme="datalab-dark"] .lang-btn.active { background:var(--primary); border-color:var(--primary); color:#0D1420; }
20
+ :root[data-theme="datalab-dark"] .report-shell { width:100%; max-width:1480px; padding:18px clamp(16px,2.4vw,30px) 72px; }
21
+ :root[data-theme="datalab-dark"] .report-header {
22
+ width:100%; max-width:none; margin:0 0 22px; padding:18px 20px;
23
+ border:1px solid var(--border); border-radius:12px; background:var(--surface); box-shadow:var(--shadow);
24
+ }
25
+ :root[data-theme="datalab-dark"] .report-header h1 { max-width:1100px; font-size:clamp(1.55rem,2.6vw,2.15rem); line-height:1.22; }
26
+ :root[data-theme="datalab-dark"] .report-header .meta { margin:8px 0 0; font-size:.85rem; color:var(--text-muted); }
27
+ :root[data-theme="datalab-dark"] .report-brand-row { margin-bottom:8px; }
28
+ :root[data-theme="datalab-dark"] .report-brand { color:var(--primary); text-transform:uppercase; letter-spacing:.08em; font-size:.83rem; }
29
+ :root[data-theme="datalab-dark"] .generated-theme-chip { border-radius:5px; background:var(--surface2); border-color:var(--border); color:var(--text-muted); font-size:.72rem; }
30
+ :root[data-theme="datalab-dark"] .report-view-switcher { margin-top:14px; gap:0; }
31
+ :root[data-theme="datalab-dark"] .report-view-btn { min-height:36px; border-radius:6px 0 0 6px; padding:7px 14px; font-size:.86rem; background:var(--surface2); border-color:var(--border); }
32
+ :root[data-theme="datalab-dark"] .report-view-btn + .report-view-btn { border-radius:0 6px 6px 0; margin-left:-1px; }
33
+ :root[data-theme="datalab-dark"] .report-view-btn.active { background:var(--primary); border-color:var(--primary); color:#0D1420; }
34
+
35
+ :root[data-theme="datalab-dark"] .report-page-brief { width:100%; display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:18px; align-items:start; }
36
+ :root[data-theme="datalab-dark"] .brief-block { width:100%; max-width:none; margin:0; padding:18px 20px; border:1px solid var(--border); border-radius:12px; background:var(--surface); box-shadow:var(--shadow); }
37
+ :root[data-theme="datalab-dark"] .brief-decision,
38
+ :root[data-theme="datalab-dark"] .brief-lieflat,
39
+ :root[data-theme="datalab-dark"] .brief-outcomes,
40
+ :root[data-theme="datalab-dark"] .brief-sources { grid-column:1/-1; }
41
+ :root[data-theme="datalab-dark"] .brief-tribunal,
42
+ :root[data-theme="datalab-dark"] .brief-action { grid-column:span 2; }
43
+ :root[data-theme="datalab-dark"] .brief-block-header { max-width:none; margin-bottom:16px; display:flex; justify-content:space-between; align-items:flex-start; gap:24px; }
44
+ :root[data-theme="datalab-dark"] .brief-block-header h2 { margin:0; font-family:var(--font-ui); font-size:1.02rem; line-height:1.35; text-transform:uppercase; letter-spacing:.055em; }
45
+ :root[data-theme="datalab-dark"] .brief-block-header p { max-width:680px; margin:0; font-size:.86rem; line-height:1.55; text-align:right; color:var(--text-muted); }
46
+ :root[data-theme="datalab-dark"] .brief-decision { padding:0; overflow:hidden; }
47
+ :root[data-theme="datalab-dark"] .brief-decision .brief-block-header { padding:18px 20px 0; }
48
+ :root[data-theme="datalab-dark"] .brief-decision .decision-hero { border-width:1px 0 0; border-radius:0; display:grid; grid-template-columns:minmax(210px,.7fr) minmax(0,2fr); gap:18px 28px; padding:24px 20px; background:var(--surface2); }
49
+ :root[data-theme="datalab-dark"] .brief-decision .hero-decision { align-content:start; margin:0; }
50
+ :root[data-theme="datalab-dark"] .brief-decision .hero-rationale { margin:0; font-family:var(--font-ui); font-size:1.08rem; line-height:1.55; color:#F0F3F8; }
51
+ :root[data-theme="datalab-dark"] .brief-decision .hero-insights { grid-column:1/-1; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; }
52
+ :root[data-theme="datalab-dark"] .brief-decision .hero-insight { min-height:96px; padding:12px 14px; border:1px solid var(--border); border-top-width:3px; border-radius:7px; background:var(--surface); }
53
+ :root[data-theme="datalab-dark"] .brief-outcomes .brief-block-body { display:grid; gap:18px; }
54
+ :root[data-theme="datalab-dark"] .brief-outcomes .outcome-groups { grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr)); gap:10px; }
55
+ :root[data-theme="datalab-dark"] .brief-outcomes .outcome-group { padding:13px 14px; background:var(--surface2); }
56
+ :root[data-theme="datalab-dark"] .brief-chart { margin:0; background:var(--surface2); }
57
+ :root[data-theme="datalab-dark"] .brief-chart svg,
58
+ :root[data-theme="datalab-dark"] .report-section svg { background:#FFFFFF; }
59
+ :root[data-theme="datalab-dark"] .brief-tribunal,
60
+ :root[data-theme="datalab-dark"] .brief-action { min-height:100%; }
61
+ :root[data-theme="datalab-dark"] .tribunal-grid { grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; }
62
+ :root[data-theme="datalab-dark"] .tribunal-card { min-height:0; padding:13px 14px; background:var(--surface2); }
63
+ :root[data-theme="datalab-dark"] .evidence-to-action { gap:7px; padding-bottom:8px; margin-bottom:0; }
64
+ :root[data-theme="datalab-dark"] .action-node { min-width:150px; padding:12px 13px; background:var(--surface2); }
65
+ :root[data-theme="datalab-dark"] .brief-source-grid { grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; }
66
+ :root[data-theme="datalab-dark"] .brief-source { min-width:0; padding:12px 14px; background:var(--surface2); }
67
+ :root[data-theme="datalab-dark"] .brief-source h3 { font-size:.88rem; line-height:1.45; overflow-wrap:anywhere; }
68
+
69
+ :root[data-theme="datalab-dark"] .full-report-intro { max-width:none; margin:24px 0 16px; padding:16px 18px; border:1px solid var(--border); border-radius:10px; background:var(--surface); }
70
+ :root[data-theme="datalab-dark"] .full-report-intro h2 { font-family:var(--font-ui); font-size:1.35rem; }
71
+ :root[data-theme="datalab-dark"] .full-report-layout { grid-template-columns:minmax(210px,270px) minmax(0,1fr); gap:18px; }
72
+ :root[data-theme="datalab-dark"] .full-report-toc { top:12px; padding:12px; border:1px solid var(--border); border-radius:10px; background:var(--surface); box-shadow:var(--shadow); }
73
+ @media (max-width:980px) {
74
+ :root[data-theme="datalab-dark"] .full-report-layout { grid-template-columns:minmax(0,1fr); }
75
+ :root[data-theme="datalab-dark"] .full-report-toc { position:relative; top:auto; max-height:none; }
76
+ }
77
+ :root[data-theme="datalab-dark"] .full-report-toc a { border-left:3px solid transparent; border-radius:5px; padding:8px 9px; font-size:.82rem; color:var(--text-muted); }
78
+ :root[data-theme="datalab-dark"] .full-report-toc a.active { border-left-color:var(--primary); background:var(--primary-soft); color:var(--text); }
79
+ :root[data-theme="datalab-dark"] .full-report-content { max-width:none; }
80
+ :root[data-theme="datalab-dark"] .full-chapter { margin:0 0 18px; padding:20px; border:1px solid var(--border); border-radius:12px; background:var(--surface); box-shadow:var(--shadow); }
81
+ :root[data-theme="datalab-dark"] .full-chapter-header { max-width:none; margin-bottom:18px; display:grid; grid-template-columns:minmax(220px,.65fr) minmax(0,1fr); gap:20px; align-items:start; }
82
+ :root[data-theme="datalab-dark"] .full-chapter-header h2 { font-family:var(--font-ui); font-size:1.18rem; line-height:1.35; }
83
+ :root[data-theme="datalab-dark"] .full-chapter-lead { font-size:.88rem; line-height:1.55; color:var(--text-muted); }
84
+ :root[data-theme="datalab-dark"] .scope-grid { grid-template-columns:repeat(auto-fit,minmax(min(260px,100%),1fr)); }
85
+ :root[data-theme="datalab-dark"] .method-audit-grid { grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr)); gap:9px; }
86
+ :root[data-theme="datalab-dark"] .scope-card,
87
+ :root[data-theme="datalab-dark"] .retrieval-grid>article,
88
+ :root[data-theme="datalab-dark"] .retrieval-coverage,
89
+ :root[data-theme="datalab-dark"] .method-audit-item,
90
+ :root[data-theme="datalab-dark"] .detail-body,
91
+ :root[data-theme="datalab-dark"] .visual-suppressed { background:var(--surface2); border-color:var(--border); }
92
+ :root[data-theme="datalab-dark"] .matrix-controls { position:sticky; top:0; z-index:5; padding:9px; background:rgba(23,28,36,.95); backdrop-filter:blur(8px); border:1px solid var(--border); border-radius:7px; }
93
+ :root[data-theme="datalab-dark"] .matrix-tools input,
94
+ :root[data-theme="datalab-dark"] .matrix-tools select { min-height:36px; padding:6px 9px; background:var(--surface2); border-color:var(--border); color:var(--text); }
95
+ :root[data-theme="datalab-dark"] .data-table { font-size:.82rem; }
96
+ :root[data-theme="datalab-dark"] .data-table th,
97
+ :root[data-theme="datalab-dark"] .data-table td { padding:7px 8px; border-color:var(--border); }
98
+ :root[data-theme="datalab-dark"] .table-wrap .data-table th { background:var(--surface2); }
99
+ :root[data-theme="datalab-dark"] .data-table tbody tr:nth-child(even) { background:#141A22; }
100
+ :root[data-theme="datalab-dark"] .data-table tbody tr:hover { background:var(--primary-soft); }
101
+ :root[data-theme="datalab-dark"] .claim-cell { max-width:none; min-width:260px; }
102
+ :root[data-theme="datalab-dark"] code { font-size:.78em; background:var(--surface2); }
103
+
104
+ /* Lieflat gallery — dark workbench density; figure surface keeps the dark
105
+ card_bg and labels hold ≥4.5:1 contrast against it. */
106
+ :root[data-theme="datalab-dark"] .lieflat-gallery-container {
107
+ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px;
108
+ }
109
+ :root[data-theme="datalab-dark"] .lieflat-card { padding:16px 18px 12px; border-radius:10px; background:var(--surface2); }
110
+ :root[data-theme="datalab-dark"] .lieflat-title { font-family:var(--font-ui); font-size:.98rem; line-height:1.35; }
111
+ :root[data-theme="datalab-dark"] .lieflat-sub { font-size:.8rem; line-height:1.5; }
112
+ :root[data-theme="datalab-dark"] .lieflat-figure svg { border-radius:6px; background:transparent; }
113
+ :root[data-theme="datalab-dark"] .lieflat-caption { font-size:.75rem; }
114
+ :root[data-theme="datalab-dark"] .lieflat-src { font-size:.62rem; }
115
+ :root[data-theme="datalab-dark"] .lieflat-suppressed { font-size:.78rem; }
116
+ :root[data-theme="datalab-dark"] .lang-btn { min-height:36px; }
117
+ :root[data-theme="datalab-dark"] .lang-switcher { align-items:center; }
118
+
119
+ @media (max-width:1100px) {
120
+ :root[data-theme="datalab-dark"] .brief-decision .hero-insights { grid-template-columns:repeat(2,minmax(0,1fr)); }
121
+ :root[data-theme="datalab-dark"] .brief-source-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
122
+ :root[data-theme="datalab-dark"] .lieflat-gallery-container { grid-template-columns:1fr; }
123
+ }
124
+ @media (max-width:980px) {
125
+ :root[data-theme="datalab-dark"] .report-page-brief { grid-template-columns:minmax(0,1fr); }
126
+ :root[data-theme="datalab-dark"] .brief-block { grid-column:1 !important; }
127
+ :root[data-theme="datalab-dark"] .brief-block-header { display:block; }
128
+ :root[data-theme="datalab-dark"] .brief-block-header p { margin-top:6px; max-width:none; text-align:left; }
129
+ :root[data-theme="datalab-dark"] .brief-decision .decision-hero { grid-template-columns:1fr; }
130
+ :root[data-theme="datalab-dark"] .brief-decision .hero-insights { grid-column:1; }
131
+ :root[data-theme="datalab-dark"] .full-chapter-header { grid-template-columns:1fr; }
132
+ }
133
+ @media (max-width:720px) {
134
+ :root[data-theme="datalab-dark"] .controls { width:calc(100% - 24px); padding:8px 10px; }
135
+ :root[data-theme="datalab-dark"] .report-shell { padding-left:14px; padding-right:14px; }
136
+ :root[data-theme="datalab-dark"] .report-header { padding:15px 14px; }
137
+ :root[data-theme="datalab-dark"] .report-header h1 { font-size:1.45rem; }
138
+ :root[data-theme="datalab-dark"] .brief-block { padding:15px 14px; }
139
+ :root[data-theme="datalab-dark"] .brief-decision { padding:0; }
140
+ :root[data-theme="datalab-dark"] .brief-decision .brief-block-header { padding:15px 14px 0; }
141
+ :root[data-theme="datalab-dark"] .brief-decision .decision-hero { padding:18px 14px; }
142
+ :root[data-theme="datalab-dark"] .brief-decision .hero-insights,
143
+ :root[data-theme="datalab-dark"] .brief-source-grid,
144
+ :root[data-theme="datalab-dark"] .tribunal-grid { grid-template-columns:1fr; }
145
+ :root[data-theme="datalab-dark"] .full-chapter { padding:16px 14px; }
146
+ :root[data-theme="datalab-dark"] .data-table { font-size:.8rem; }
147
+ }