/* 判定链与错误的样式。颜色名只在 tokens.css 定义；这里只引用变量。
 *
 *  §16.2：**不做无意义炫技**。故这里只有 `<details>` 的原生展开（不自己写动画）
 *  与"揭示"式的边框淡入；没有阴影、没有模糊、没有浮动卡片。
 */

.layers,
.claims {
  display: block;
}

.layers__title {
  display: flex;
  align-items: baseline;
  gap: calc(var(--step) * 1.5);
  font-size: 20px;
  font-weight: 500;
  letter-spacing: 0.02em;
  margin: 0 0 calc(var(--step) * 1.5);
}
.layers__count {
  color: var(--text-dim);
  font-family: var(--mono);
  font-size: 13px;
}
.layers__empty {
  color: var(--text-dim);
  border-left: var(--rule) solid var(--brass-dim);
  padding-left: calc(var(--step) * 1.5);
}

/* 判定分组 */
.layer {
  margin-bottom: calc(var(--step) * 3);
}
.layer__title {
  font-size: 15px;
  font-weight: 500;
  color: var(--brass);
  letter-spacing: 0.04em;
  margin: 0 0 var(--step);
  padding-bottom: 4px;
  border-bottom: var(--hair) solid var(--brass-dim);
}
.layer--unknown .layer__title {
  /* 认不出的族**看得出来**：这一组是页面自己发现"没登记过"的 */
  color: var(--danger);
  border-bottom-color: var(--danger);
}
.layer--focus .layer__title {
  color: var(--brass-lit);
  border-bottom-width: var(--rule);
}
.layer__items {
  list-style: none;
  margin: 0;
  padding: 0;
}
.reading {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--step);
  padding: 3px 0;
  border-bottom: 1px dashed var(--brass-faint);
}
.reading__key {
  font-family: var(--mono);
  font-size: 12px;
  color: var(--text-dim);
  flex: 1 1 55%;
  min-width: 0;
  overflow-wrap: anywhere;
}
.reading__value {
  font-family: var(--mono);
  font-size: 13px;
  color: var(--text);
  flex: 0 1 auto;
}

/* 判词 */
.claim {
  border-top: var(--hair) solid var(--brass-soft);
  padding: calc(var(--step) * 0.75) 0;
}
.claim[open] {
  border-left: 2px solid var(--brass);
  padding-left: calc(var(--step) * 1.5);
  transition: border-color 0.4s;   /* 揭示式，不是炫技 */
}
.claim > summary {
  cursor: pointer;
  line-height: 1.6;
}
.claim > summary::marker {
  color: var(--brass-dim);
}
.claim__cite {
  margin-left: var(--step);
  white-space: nowrap;
}
.claim__body {
  padding: calc(var(--step) * 0.5) 0 calc(var(--step) * 1.5) calc(var(--step) * 2);
}
.claim__reason {
  margin: 0 0 4px;
  color: var(--text-dim);
  font-size: 14px;
  line-height: 1.7;
}
.claim__nothing {
  margin: 0 0 4px;
  color: var(--text-dim);
  font-size: 13px;
  font-style: italic;
}
.claim__rules {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: baseline;
  margin: var(--step) 0 0;
}
.claim__rules-label {
  color: var(--text-dim);
  font-size: 12px;
}
.rule-id {
  font-family: var(--mono);
  font-size: 12px;
  color: var(--brass);
  background: var(--ink-2);
  border: var(--hair) solid var(--brass-dim);
  border-radius: 2px;
  padding: 1px 5px;
}

/* 出处：两栏 label/value，窄屏一栏 */
.source {
  margin: var(--step) 0;
  padding-left: calc(var(--step) * 1.5);
  border-left: var(--hair) solid var(--brass-dim);
}
.source__row {
  display: grid;
  grid-template-columns: 4.5em 1fr;
  gap: var(--step);
  font-size: 13px;
  line-height: 1.7;
}
.source__label {
  color: var(--text-dim);
}
.source__value {
  font-family: var(--mono);
  color: var(--text);
}
@media (max-width: 520px) {
  .source__row { grid-template-columns: 1fr; gap: 0; }
}

.cite {
  color: var(--text-dim);
  font-family: var(--serif);
  font-style: italic;
}
blockquote.cite {
  margin: var(--step) 0 0;
  padding-left: calc(var(--step) * 1.5);
  border-left: var(--hair) solid var(--brass-dim);
  line-height: 1.75;
}

/* 聚焦条：点了行星之后**必须看得见**（P7 复审 I1）。没有它，把相关的层提到最前
   与没点一模一样——最前那一组本来就在最上面。 */
.layers__focus {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--step);
  margin: 0 0 calc(var(--step) * 2);
  padding: var(--step) calc(var(--step) * 1.5);
  background: var(--indigo);
  border-left: var(--rule) solid var(--brass-lit);
  font-size: 13px;
  line-height: 1.7;
}
.layers__focus-label {
  color: var(--brass-lit);
  font-family: var(--mono);
}
.layers__focus-hint {
  color: var(--text-dim);
  flex: 1 1 auto;
}
.layers__focus-clear {
  font: inherit;
  font-size: 12px;
  color: var(--brass);
  background: var(--ink-2);
  border: var(--hair) solid var(--brass-dim);
  border-radius: 2px;
  padding: 1px 8px;
  cursor: pointer;
}
.layers__focus-clear:hover {
  color: var(--brass-lit);
  border-color: var(--brass);
}

/* 命中的判词：左边一条亮线（与聚焦条的左边框同一套语汇） */
.claim--focus {
  border-left: 2px solid var(--brass-lit);
  padding-left: calc(var(--step) * 1.5);
}

/* §8.4 的映射：略亮的底 + 亮边，固定在判定链最上面 */
.mapping {
  margin-bottom: calc(var(--step) * 3);
  padding: calc(var(--step) * 1.5);
  background: var(--indigo);
  border: var(--hair) solid var(--brass);
  border-radius: 2px;
}
.mapping__title {
  margin: 0 0 4px;
  color: var(--brass-lit);
  font-size: 16px;
}
.mapping__rationale {
  margin: 0;
  color: var(--text);
  line-height: 1.7;
}
.mapping--missing {
  border-color: var(--danger);
}
.mapping--missing .mapping__title {
  color: var(--danger);
}
.mapping__hint {
  margin: 4px 0 0;
  color: var(--text-dim);
  font-size: 14px;
}

/* 未落到规则库的判定 */
.ungrounded {
  margin-top: calc(var(--step) * 3);
  padding-top: calc(var(--step) * 1.5);
  border-top: var(--hair) solid var(--brass-dim);
}
.ungrounded__title {
  font-size: 14px;
  font-weight: 500;
  color: var(--text-dim);
  margin: 0 0 4px;
}
.ungrounded__hint {
  margin: 0 0 var(--step);
  color: var(--text-dim);
  font-size: 13px;
  line-height: 1.7;
}
.ungrounded__list {
  margin: 0;
  padding-left: calc(var(--step) * 2.5);
  font-family: var(--mono);
  font-size: 12px;
  color: var(--text-dim);
}

/* 错误：三段（标题 / 提示 / 后端原话） */
.error {
  border-left: var(--rule) solid var(--danger);
  padding: calc(var(--step) * 1.5);
  background: var(--ink-2);
}
.error__title {
  margin: 0 0 var(--step);
  color: var(--danger);
  font-size: 18px;
}
.error__hint {
  margin: 0 0 var(--step);
  color: var(--text);
  line-height: 1.7;
}
.error__message {
  margin: 0;
  padding: calc(var(--step)) calc(var(--step) * 1.5);
  background: var(--ink);
  border: var(--hair) solid var(--danger);
  color: var(--text-dim);
  font-family: var(--mono);
  font-size: 12px;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}

/* 错误区容器。空的时候不占位——一个空盒子看起来像"这里本该有内容" */
.error-box:empty { display: none; }

/* 解读区 —— **结论所在的那一块**（卜卦页由措辞层逐段填入；本命页目前填的是
   确定性 Markdown 判定清单，见 web/README 的差异清单）。

   ★ `white-space: pre-wrap` 是这一块唯一的要点（2026-10-12 用户实测反馈：
     "已经分点了，但还是全部写在一段里面，好拥挤"）。两页都用 `textContent`
     往里写，而普通文本流会把换行折成空格 ⇒ 模型与引擎排好的分点全挤成一段，
     而页面上**看不出丢了什么**。这里只保留换行，**不解析 Markdown**：
     解析要处理转义，而这一块里有必须逐字呈现的英文原文（§16.5），
     在没被要求的地方长出一层解析器是本项目记过多次的那类风险。 */
.prose {
  white-space: pre-wrap;
  color: var(--text);
  font-size: 1.05rem;
  line-height: 1.85;
  max-width: 42em;
  min-height: calc(var(--step) * 10);   /* 流式填入时不把下方的盘顶来顶去 */
}

/* 结论的**逐句**形态（P8 §17.9，两页共用 —— 卜卦走 `textContent` 的一整段，
   本命走 `renderConclusion` 建的结构）。一句话一条，各自带"依据"那一行：
   它引用的判定键（连回那条判定的印刷页）与规则 id。

   ★ 用 `<ol>` 而不是整段文字，是因为这里每一句都**独立地被闸门核过**：
     引了本轮素材里没有的键，丢的是那一句而不是整段。列表把这件事画出来。 */
.conclusion__list {
  margin: 0;
  padding-left: 1.6em;              /* 序号挂在外面，正文与上面的行首对齐 */
  color: var(--text);
  font-size: 1.05rem;
  line-height: 1.85;
}
.conclusion__sentence { margin-bottom: var(--step); }
.conclusion__text { margin: 0; }

/* 依据那一行：比正文小一号、次要颜色——它是**出处**，不是结论本身。 */
.conclusion__basis {
  display: flex;
  flex-wrap: wrap;
  gap: calc(var(--step) / 2);
  align-items: baseline;
  margin: calc(var(--step) / 2) 0 0;
  color: var(--text-dim);
  font-size: 0.85rem;
}
.conclusion__basis-label { letter-spacing: 0.08em; }
/* 释义那一行：与「依据」分开——它是展开，不是引擎的判定。
   颜色再压一档，避免读者把 `janus.*` 当成规则 id。 */
.conclusion__basis--corpus { opacity: 0.9; }
.conclusion__basis-source { opacity: 0.8; }
/* 释义只按主制度取：这句话要把"另一制没有单独释义"说清楚，而不是让读者
   以为漏翻了。 */
.conclusion__corpus-note {
  margin: calc(var(--step) / 2) 0 0;
  color: var(--text-dim);
  font-size: 0.8rem;
}

/* 被丢掉的句子。**要显示出来，且看起来与采用的那些不同**——悄悄丢句与
   "模型本来就没提这一条"在页面上长得一模一样（§17.9）。
   边框用 `--brass-dim`：不是错误（服务端没坏），是"这一句没被采纳"。 */
.conclusion__dropped {
  margin-top: calc(var(--step) * 2);
  padding: var(--step) calc(var(--step) * 1.5);
  border-left: var(--rule) solid var(--brass-dim);
  background: var(--ink-2);
}
.conclusion__dropped-title {
  margin: 0 0 calc(var(--step) / 2);
  font-size: 0.95rem;
  color: var(--brass);
  font-weight: normal;
}
.conclusion__dropped-hint {
  margin: 0 0 var(--step);
  color: var(--text-dim);
  font-size: 0.85rem;
  line-height: 1.6;
}
.conclusion__dropped-list { margin: 0; padding-left: 1.2em; }
.conclusion__dropped-item { margin-bottom: calc(var(--step) / 2); }
.conclusion__dropped-item .conclusion__text {
  color: var(--text-dim);
  text-decoration: line-through;     /* 划掉＝没被采纳，一眼可辨 */
}
.conclusion__dropped-reason {
  margin: 0;
  color: var(--danger);              /* 原因要显眼：那是闸门拒它的理由 */
  font-size: 0.8rem;
  line-height: 1.5;
}

/* 状态说明那一行（"措辞正在生成" / "措辞中断" / "未配置 LLM 措辞"）。
   它是**关于这一块**的说明，不是结论的一部分，故次要颜色、小一号。 */
.prose__note {
  color: var(--text-dim);
  font-size: 0.9rem;
  line-height: 1.6;
  max-width: 42em;
  margin-top: var(--step);
}

/* 结论：四角宫（P12）——**整页最上面那一段**，在链与模型那几句之前。

   ★★ 它是**引擎直下的论断**（P12 收窄 P9 裁定 ④）：①②③ 由读数与口径机械拼出，
   ④ 如实写出今天核不了的两族。故它**不依赖模型**——没配 LLM 时照样在页面上。

   ★ 视觉上要压得住下面两块：比模型那几句**大一号**、左边一道黄铜竖线（`--rule`），
   让它一眼就是"结论"，而不是又一段正文。链与模型那几句仍是原样。
   ★ 引文里可能带尖括号，故一律 textContent（`el()` 的那条路，§16.5）。 */
.conclusion__verdict {
  margin: 0 0 calc(var(--step) * 2);
  padding: 0 0 0 calc(var(--step) * 1.5);
  border-left: var(--rule) solid var(--brass);
}
.verdict__title {
  margin: 0 0 calc(var(--step) / 2);
  font-size: 1.25rem;
  color: var(--brass-lit);
  font-weight: normal;
  letter-spacing: 0.04em;
}
.verdict__count {
  margin-left: calc(var(--step) / 2);
  color: var(--text-dim);
  font-size: 0.85rem;
}
.verdict__hint {
  margin: 0 0 var(--step);
  color: var(--text-dim);
  font-size: 0.82rem;
  line-height: 1.6;
  max-width: 42em;
}
.verdict__house {
  margin: 0 0 var(--step);
  padding: var(--step) 0;
  border-top: var(--hair) solid var(--brass-faint);
}
.verdict__house-title {
  margin: 0 0 calc(var(--step) / 2);
  font-size: 1rem;
  color: var(--brass);
  font-weight: normal;
}
/* 三段各自成行、不折成一坨：①②③ 要分得开读（④在交代的正是②与③的差别） */
.verdict__promise,
.verdict__realization,
.verdict__connection {
  margin: 0 0 calc(var(--step) / 2);
  color: var(--text);
  font-size: 0.95rem;
  line-height: 1.7;
  white-space: pre-wrap;
}
/* ④留白四条链共用同一段，故整块只出现一次；次要颜色、小一号 */
.verdict__blank {
  margin: var(--step) 0 0;
  padding-top: var(--step);
  border-top: var(--hair) solid var(--brass-soft);
  color: var(--text-dim);
  font-size: 0.85rem;
  line-height: 1.7;
  max-width: 42em;
  white-space: pre-wrap;
}

/* 解盘流程链（P10 决定一）——**结论区最上面那一段**。
   它是"引擎算出来的那一半"：固定次序、每步都有落点，✅ 有读数 / ⛔ 核不了 /
   — 不适用。链上不出现任何书里没有的断语（决定二）：后果那句话由下面的结论承担，
   故这里只有读数与规则 id。

   ★ 视觉上要一眼看出它与**模型写的结论**不是同一种东西：模型那一段是暖白正文、
   缩进列表；链是黄铜线框的推演表、字号小一档、底色深一档。 */
.flow {
  margin: 0 0 calc(var(--step) * 2);
  padding: var(--step) calc(var(--step) * 1.5);
  border: var(--hair) solid var(--brass-faint);
  background: var(--ink-2);
}
.flow__title {
  margin: 0 0 calc(var(--step) / 2);
  font-size: 1rem;
  color: var(--brass);
  font-weight: normal;
  letter-spacing: 0.04em;
}
.flow__count {
  margin-left: calc(var(--step) / 2);
  color: var(--text-dim);
  font-size: 0.85rem;
}
.flow__hint {
  margin: 0 0 var(--step);
  color: var(--text-dim);
  font-size: 0.82rem;
  line-height: 1.6;
}

/* 每一宫一块可折叠：块头是「第 7 宫 · 宫主星 Saturn」（决定一）。
   用 `<details>` 是因为一张盘四条链、每条八步——全展开会把下面那结论推出屏外。 */
.flow__house {
  margin-bottom: calc(var(--step) / 2);
  border-top: var(--hair) solid var(--brass-faint);
}
.flow__house-title {
  cursor: pointer;
  padding: calc(var(--step) / 2) 0;
  color: var(--brass-lit);
  font-size: 0.95rem;
}
.flow__steps {
  margin: 0 0 var(--step);
  padding-left: 1.4em;
  list-style: none;
}

/* 一步一行。三态**各有各的外观**（`[data-status]`）——三态若长得一样，
   "核得动"与"核不了"就是页面上两行分不出来的字，而它们的对策完全相反。 */
.flow__step {
  display: flex;
  flex-wrap: wrap;
  gap: calc(var(--step) / 2);
  align-items: baseline;
  padding: calc(var(--step) / 4) 0;
  color: var(--text);
  font-size: 0.9rem;
  line-height: 1.6;
}
.flow__step[data-status="computed"] .flow__mark { color: var(--brass-lit); }
.flow__step[data-status="uncomputable"] .flow__mark { color: var(--danger); }
.flow__step[data-status="not_applicable"] .flow__mark { color: var(--text-dim); }
.flow__mark { flex: none; }
.flow__label {
  flex: none;
  color: var(--text-dim);
  font-size: 0.8rem;
}
.flow__caliber { flex: none; color: var(--brass-dim); }
.flow__step-title { flex: 1 1 100%; color: var(--text-dim); }
.flow__reading { flex: 1 1 100%; color: var(--text); }
/* 「缺什么」那一行：**必须显眼**——它是这一格的待办，与读数不是同一种东西。 */
.flow__missing {
  flex: 1 1 100%;
  color: var(--danger);
  font-size: 0.82rem;
}
.flow__key { color: var(--text-dim); font-size: 0.75rem; }

.flow__hits, .flow__loose {
  display: flex;
  flex-wrap: wrap;
  gap: calc(var(--step) / 2);
  align-items: baseline;
  margin: 0 0 calc(var(--step) / 2);
  color: var(--text-dim);
  font-size: 0.82rem;
}
.flow__hits-label, .flow__loose-label { letter-spacing: 0.06em; }

/* 结算栏：引擎标为成立、结论却没写到的那几条（决定三）。
   与"被丢的句子"同一个形状（都是一种**关于结论本身**的报告），只是原因不同。 */
.conclusion__unused {
  margin-top: calc(var(--step) * 2);
  padding: var(--step) calc(var(--step) * 1.5);
  border-left: var(--rule) solid var(--brass);
  background: var(--ink-2);
}
.conclusion__unused-title {
  margin: 0 0 calc(var(--step) / 2);
  font-size: 0.95rem;
  color: var(--brass);
  font-weight: normal;
}
.conclusion__unused-hint {
  margin: 0 0 var(--step);
  color: var(--text-dim);
  font-size: 0.85rem;
  line-height: 1.6;
}
.conclusion__unused-list {
  display: flex;
  flex-wrap: wrap;
  gap: calc(var(--step) / 2);
  margin: 0;
}

/* ---------------------------------------------------------------- 十二宫分问 */

.questions { display: grid; gap: 1rem; }
.questions__house { border-top: var(--hair) solid var(--brass-soft); padding-top: 0.6rem; }
.questions__title { font-size: 0.95rem; margin: 0 0 0.4rem; color: var(--brass); }
.questions { list-style: none; margin: 0; padding: 0; }
.question { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: baseline;
            padding: 0.25rem 0; border-bottom: var(--hair) dotted var(--brass-faint); }
.question__text { flex: 1 1 16rem; }
.question__state { font-size: 0.85rem; opacity: 0.9; }
.question[data-state="fails"] .question__state,
.question[data-state="leans_fails"] .question__state { color: var(--danger); }
.question[data-state="holds"] .question__state,
.question[data-state="leans_holds"] .question__state { color: var(--brass-lit); }
.question__uncomputable { opacity: 0.7; }
.question__page { font-size: 0.8rem; opacity: 0.7; }
/* ★ 逐制答案（复审 I3）：状态标签说「逐制见下」时，下面必须有东西。
   用 flex-basis:100% 另起一行，避免与问句/状态挤在同一行的末尾。 */
.question__systems { flex-basis: 100%; list-style: none; margin: 0.2rem 0 0;
  padding: 0; display: grid; gap: 0.15rem; }
.question__system { display: flex; flex-wrap: wrap; gap: 0.4rem;
  align-items: baseline; font-size: 0.82rem; opacity: 0.9; }
.question__system-name { color: var(--brass); }

/* ------------------------------------------------------------------- 预测 */

.lifetime { display: grid; gap: 1.2rem; margin-top: 0.8rem; }
.lifetime__firdaria__list, .lifetime__profection__list {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 0.25rem; max-height: 22rem; overflow: auto;
}
.lifetime__firdaria__title, .lifetime__profection__title {
  font-size: 0.95rem; margin: 0 0 0.4rem; color: var(--brass);
}
.segment { display: flex; flex-wrap: wrap; gap: 0.6rem; align-items: baseline;
           font-size: 0.88rem; padding: 0.2rem 0.4rem; border-radius: 3px; }
.segment--current { background: var(--brass-faint); }
.segment__lord { min-width: 6.5rem; font-weight: 600; }
.segment__years { min-width: 7rem; opacity: 0.85; }
.segment__title { flex: 1 1 16rem; }
.segment__direction { flex: 1 1 18rem; opacity: 0.9; }

/* ---------------------------------------------------------------- 逐宫解读 */

/* ★ 与 `.claim` 同一条理由：<details> 的原生展开，不自己写动画。
   第 1 宫由 JS 置 `open`，其余收起——十二宫全摊开会把结论推到几屏之外。 */
.houses { display: grid; gap: 0.5rem; }
.house-report { border-top: var(--hair) solid var(--brass-soft); padding: 0.4rem 0; }
.house-report[open] {
  border-left: 2px solid var(--brass);
  padding-left: calc(var(--step) * 1.5);
}
.house-report > summary {
  cursor: pointer;
  line-height: 1.6;
  color: var(--brass);
}
.house-report > summary::marker { color: var(--brass-dim); }
.house-report__section { padding: 0.3rem 0 0.2rem; }
.house-report__heading {
  font-size: 0.85rem;
  margin: 0 0 0.2rem;
  color: var(--brass-dim);
  font-weight: normal;
}
.house-report__row { margin: 0.1rem 0; line-height: 1.6; }
.house-report__key { font-size: 0.75rem; opacity: 0.6; }
.house-report__none { margin: 0.1rem 0; opacity: 0.7; }
/* ★ 洞要可数：这一块就是「这宫有几格核不了」的机器可读形态。 */
.house-report__missing { margin-top: 0.4rem; }
.house-report__missing-title { margin: 0; font-size: 0.8rem; opacity: 0.8; }
.house-report__missing-list { list-style: none; margin: 0.2rem 0 0; padding: 0;
  font-size: 0.8rem; opacity: 0.7; display: grid; gap: 0.1rem; }
.house-report__prose { border-top: var(--hair) dotted var(--brass-faint);
  margin-top: 0.5rem; padding-top: 0.4rem; }
.house-report__sentence { margin: 0.2rem 0; line-height: 1.75; }

/* ---------------------------------------------------------------- 推运（2026-10-26）
   ★ 复用 `conclusion__*` 那一套（句子 / 依据 / 折叠 / 被丢的句子）：两层的
     排版本来就是同一件事，各写一套就会出现"一处依据是灰的、一处是亮的"。
     这里只补三样：范围副标题、组标题、组间距。 */
.prediction__range {
  margin: 0 0 calc(var(--step) / 2);
  color: var(--brass-dim);
  font-size: 0.9rem;
  letter-spacing: 0.04em;
}
.prediction__group { margin-bottom: var(--step); }
.prediction__section-title {
  margin: 0 0 calc(var(--step) / 3);
  font-size: 0.95rem;
  font-weight: normal;
  color: var(--brass);
}
/* 「第 N 句」与它下面那两行（依据 / 释义）是一回；组内条目之间留一点白。 */
.prediction__basis-item { margin-bottom: calc(var(--step) / 2); }

/* ---------------------------------------------------------------- 承诺表（2026-10-26 晚）
   ★ 承诺是**论断**，排在散文（解释）之前；三组 `现在 / 往后 / 逐月` 由响应里的
     `section` 分组，前端不按日期分。`未定` 与 `核不了` 与其他档同样显眼——
     涂灰或藏起来会让"判不了"读成"没有这一条"。 */
.promises { margin: 0 0 var(--step); }
.promises__title {
  margin: 0 0 calc(var(--step) / 3);
  font-size: 0.95rem;
  font-weight: normal;
  color: var(--brass);
}
.promises__group { margin-bottom: calc(var(--step) / 2); }
.promises__section-title {
  margin: 0 0 calc(var(--step) / 4);
  font-size: 0.85rem;
  font-weight: normal;
  opacity: 0.8;
}
.promises__list { list-style: none; margin: 0; padding: 0; }
.promise { border-top: var(--hair) dotted var(--brass-faint); padding: 0.4rem 0; }
.promise__head { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: baseline; }
.promise__label { color: var(--brass-dim); }
.promise__lord { font-variant: small-caps; }
.promise__window { font-size: 0.8rem; opacity: 0.75; }
.promise__phase { font-size: 0.8rem; color: var(--brass); }
.promise__tone { margin-left: auto; font-size: 0.9rem; }
.promise__themes { margin: 0.2rem 0 0; line-height: 1.7; }
.promise__fulfils { margin: 0.2rem 0 0; font-size: 0.85rem; color: var(--brass); }
.promise__evidence { margin-top: 0.2rem; font-size: 0.8rem; }
.promise__evidence-list { list-style: none; margin: 0.2rem 0 0; padding: 0; }
.promise__evidence-item { margin-bottom: 0.15rem; }
.promise__evidence-label { opacity: 0.6; }
