/* app.css — Steep 形板式與卡件(單產地=design/blueprint.md §三/§四;
   值恆引 tokens.css 變量,恆不另造色值)。
   氣質五鐵律:淺地墨字/髮絲線不靠框/一個品牌色/大數小標/零裝飾。
   D1-b 起字號/間距/時長/緩動/圓角/陰影恆取令牌,字面值即 CI 紅
   (錨=core/tests/test_design_guards.py;越階換算=就近檔、等距取上檔,ADR-0021)。 */

/* ===== 地 ===== */
* { box-sizing: border-box; margin: 0; padding: 0; }
html { -webkit-text-size-adjust: 100%; }
body {
  background: var(--ground);
  color: var(--ink);
  font-family: var(--font-ui);
  font-size: var(--fs-15);
  line-height: 1.45;
}
a { color: var(--accent); text-decoration: none; }
button { font: inherit; cursor: pointer; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* 動效恆尊重意願:關停位恆含平滑滾動——舊形只關 transition,
   `scroll-behavior: smooth` 逃在殺傷範圍外(uiux-audit-001 §四缺口 7) */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition: none !important; animation: none !important; }
  .stream-wrap { scroll-behavior: auto !important; }
}

/* 件7 面切換(timeline ↔ map):二者皆**真導航**(整頁),故恆用
   跨文檔 View Transitions 的聲明形——`document.startViewTransition` 只管
   同文檔 DOM 交換,對鏈接跳轉恆不觸發,寫了也是死碼。不支持的瀏覽器恆
   忽略本塊=原樣跳(漸進增強,零 JS 零依賴)。 */
@view-transition { navigation: auto; }

/* ===== 骨架:導航窄欄+主列(§三1) ===== */
.shell { display: flex; min-height: 100dvh; }

.nav-rail {
  width: 76px; flex: none;
  border-right: 1px solid var(--hairline);
  display: flex; flex-direction: column; align-items: center;
  padding: var(--sp-16) 0; gap: var(--sp-4);
  position: sticky; top: 0; height: 100dvh;
  background: var(--ground);
}
/* 品牌位(L-0):標記+字標恆**豎疊**,字標恆**單行**。
   舊形恆只一枚 76px 窄欄裏的 --fs-13 字標,「Hermod Field」於 76px 恆折兩行
   ——折行恆是此票之傷。字標遂降一檔取 --fs-11、字距歸零、nowrap。
   **r15/UI-2 改判**:「名過長者恆省略號截」自此恆**只**是末道兜底,恆不是
   窄位之常態——窄位所印者恆是**簡形**(≤2 字;尺=`org_profile.rail_name`
   單產地,恆不在 CSS 或模板裏另鑄),故截字條件在窄位恆不成立。
   何以恆不靠省略號:1280 真渲量得窄欄內容盒恆 59px(76 − 1 邊 − 2×--sp-8),
   而「Hermod Field」恆 70.1px、「Willow Riding Campaign」恆 128.0px、
   「北岸競選 · North Shore」恆 120.1px——三者皆逾,截出來的是「Hermod …」,
   而**半截字恆不是任何一個名**。全名恆由 title + 字標之 aria-label + 頁
   `<title>` 三處兜住。何以恆不加寬窄欄:名之上限恆 120 字(約 700px 之欄),
   加寬恆只解掉手上這一串恆不解下一串,且那已恆不是**窄**欄(§三1)。 */
.brand {
  display: flex; flex-direction: column; align-items: center;
  gap: var(--sp-4);
}
.brand-mark { display: block; flex: none; }
/* 原標之白中層:值恆等原檔 `#fff`,產地恆取 --card(恆不給白開第二產地) */
.brand-mark-mid { fill: var(--card); }
.brand-name {
  font-weight: 700; color: var(--accent);
  white-space: nowrap; max-width: 100%;
  overflow: hidden; text-overflow: ellipsis;
}
.nav-rail .brand { margin-bottom: var(--sp-16); }
/* QA15-1:省略號恆須一枚**有界**的父寬。`.brand` 落在 `.nav-rail` 這枚
   column flex 的 `align-items:center` 下,其寬恆是 fit-content——於是
   `.brand-name` 那句 `max-width:100%` 恆等於文字自己的寬,截字條件恆不成立,
   名一長即橫向溢出 76px 窄欄並被視口左緣裁掉(實測「Willow Riding Campaign」
   → 屏上「w Riding Campaign」)。rail 變體遂恆 `align-self:stretch` 取滿窄欄,
   左右各留 --sp-8 與槽同寬,省略號自此恆觸發。`.brand--auth` 恆不受此規則
   ——它的父(`.auth-card h1`)本就有界,故那一變體一直是對的。
   **r15/UI-2**:本條二句恆**留**(有界寬恆仍是末道:哪天有人繞過窄位口把長
   名塞進來,溢出恆仍被這枚界收住,恆不再撐破窄欄)。惟須記:這枚 `padding`
   把可用寬由 75px 收成 59px,而當拍那枚數值探針量的是**外**寬 76px——
   於是「Hermod Field」70.1px 恰落在二數之間,錨全綠而屏上截字。錨自此恆量
   **內容盒**(自本行 padding 與 `.nav-rail` 之寬/邊框現讀),恆不再量外寬。 */
.brand--rail { align-self: stretch; padding: 0 var(--sp-8); }
.brand--rail .brand-mark { width: 24px; height: 24px; }
.brand--rail .brand-name { font-size: var(--fs-11); letter-spacing: 0; }
/* 登錄頁恆同源同一枚 include:殼=`.auth-card h1`(其字族/字號/下距恆承舊規則,
   本變體恆不重寫),故此處恆只給標記之寸與二件之間距。 */
.brand--auth { gap: var(--sp-8); }
.brand--auth .brand-mark { width: 76px; height: 76px; }
.nav-slot {
  display: flex; flex-direction: column; align-items: center; gap: var(--sp-4);
  width: 60px; min-height: 48px; padding: var(--sp-4) 0;
  border-radius: var(--radius-sm); color: var(--ink-2);
  font-size: var(--fs-11); line-height: 1.2;
  transition: background var(--dur-base) var(--ease-standard);
}
/* [MAP-9 · P2-5 · 圖紙 r19]圖標之線形恆**一處聲明**=原語 P-icon(§四2 第八件)。
   此前恆四處各寫一副(本行 · `.map-btn svg` · 圖例收起態 · 門行外鏈之字形),故
   「屏上是不是一套圖標語言」恆靠四處記得寫同樣的話。歸一恆**只統語彙恆不統尺與
   幾何**:尺恆由消費面定(下有回落,同 P-ring),網格恆同一副 24——線寬遂隨尺自然
   縮放,小圖恆不揹着大圖的粗線。本行遂整刪,形恆下移至 `.p-icon`。 */
.nav-slot:hover { background: var(--card-tint-hover); }
.nav-slot:active { background: var(--hairline); }
.nav-slot.active { color: var(--accent-deep); background: var(--accent-soft); }
/* W4-3(波三門報 P1-3):活槽之**字**取文字役 --accent-deep,其**圖標**恆回圖形役
   本體 --accent。上一行若獨行,`stroke: currentColor` 會把文字役順繼承鏈潑到圖標
   上——那恆不是「一枚槽一種紫」,那恆是「一枚令牌兩種役」,而 B-S1 分役的整個
   前提恆是「非文字役恆不改指」。二值差 1 個百分點明度,肉眼恆同一枚紫。 */
.nav-slot.active svg { stroke: var(--accent); }
/* QA15-4(裁 2026-09-02):導航槽之 disabled 態**退役**。canonical spec
   `identity-compliance` R「最小權限與深度投影」逐字「無權之能力 SHALL 恆不以
   灰態或摺疊態出現」——槽既恆不出現,這一族樣式即恆無消費者;留着它就是給
   「哪天再畫一枚灰槽」備好了皮。`aria-disabled` 那一慣用法恆仍在
   (`.p-overlay` 那一族,見下),恆非整條紀律退役。 */
/* 登出槽=表單包一枚裸鈕(去內聯 style;形恆與其餘槽一致) */
.nav-rail .nav-form { border: none; background: none; }
.nav-rail .nav-btn {
  all: unset; display: flex; flex-direction: column; align-items: center;
  gap: var(--sp-4); cursor: pointer;
}

.main { flex: 1; display: flex; flex-direction: column; min-width: 0; }

/* 常駐屏入殼(U-P1-N · refero-audit-002):dashboard/settings/candidates 亦置於
   .shell>.main 內,與 timeline 同構帶 nav。auth-page 恆不再自撐 100dvh(殼已給高
   ——否則移動態底欄下會多出一截空滾);.dash 恆於 .main 交叉軸居中。
   獨立 login/offline 之 auth-page 恆不在 .shell 內,恆不受此規則波及。 */
.shell .main > .auth-page { min-height: 0; flex: 1; }
.shell .main > .dash { align-self: center; }

/* ===== agenda 條(釘頂細條;§四) ===== */
/* 底恆實色:毛玻璃違 §一5 零裝飾(事故錨=uiux-audit-001 §二毛玻璃三處) */
.agenda-bar {
  position: sticky; top: 0; z-index: 30;
  display: flex; align-items: center; gap: var(--sp-8);
  padding: var(--sp-8) var(--sp-16);
  background: var(--ground);
  border-bottom: 1px solid var(--hairline);
  font-size: var(--fs-13); color: var(--ink-2);
  min-height: 36px;
}
.agenda-bar.has-items #agenda-text {
  color: var(--accent); font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.agenda-bar .agenda-clear { color: var(--ok); }

/* ===== 流(單列 ≤680px 居中) ===== */
.stream-wrap { flex: 1; overflow-y: auto; }
@media (prefers-reduced-motion: no-preference) {
  .stream-wrap { scroll-behavior: smooth; }
}
.stream {
  max-width: 680px; margin: 0 auto;
  padding: var(--sp-24) var(--sp-16) var(--sp-32);
  display: flex; flex-direction: column; gap: var(--sp-16);
}
/* ?turn 落錨恆不被釘頂 agenda 條壓字 */
.stream > [data-pk] { scroll-margin-top: var(--sp-48); }
/* 卡到達:淡入 + 2px 上移(§一5 剋制,恆非入場大動畫;reduced-motion 下全關)。
   D1-c 件6:恆只對**追加**的片段生效——`.arrive` 由 timeline.js 在 appendChild
   之前掛上,首屏卡恆無此類,故開門恆不整流淡入。 */
.stream > [data-pk].arrive {
  transition: opacity var(--dur-slow) var(--ease-standard),
              transform var(--dur-slow) var(--ease-emphasized);
}
@starting-style {
  .stream > [data-pk].arrive { opacity: 0; transform: translateY(2px); }
}
/* 日分隔=P-label 的居中變體(字距略寬)。選擇器帶一級祖先:原語塊在本檔
   後段,同特異度下靠**序**決勝,不加這一級就會被 .p-label 的 .06em 蓋掉。 */
.stream > .day-divider {
  text-align: center; letter-spacing: .08em; padding: var(--sp-8) 0 0;
}

/* ===== 通用卡面(髮絲線,whisper 影) ===== */
.card {
  background: var(--card);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  box-shadow: var(--shadow-whisper);
  padding: var(--sp-16);
}
.who-line { font-size: var(--fs-11); color: var(--ink-3); margin-bottom: var(--sp-4); }
.c1 .data-asof { margin-top: var(--sp-8); }
.c2 .inline-ref { display: inline; }
.offline-actions { margin-top: var(--sp-16); }

/* ===== 原語層(blueprint §四2;各恆**一處產地**)=====
   事故錨=uiux-audit-001 §二組件節:同一原語此前手寫多副——標籤-值行 6 副 /
   小標 6 副 / 主按鈕 3 副 / pill 3 副 / 抽屜 2 副且行爲不同。
   產地二分:**形**恆此一份;**殼**恆 core/templates/core/primitives/*.html。
   卡與件恆**組合**原語(類或 include),恆不再各起一副。 */

/* P-row 標籤-值行:默認=帶髮絲線的 meta 行(決策/留痕/彙總同形) */
.p-row {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-8);
  padding: var(--sp-8) 0; border-top: 1px solid var(--hairline);
  font-size: var(--fs-13);
}
/* 兩枚窄變體恆回 `align-items: normal`:基形的 baseline 對齊會讓行內
   11px 的出處小字把 15px 的行撐高約 2px/行(真站實測 C3 卡 +16/+10px)。
   口徑行與根據節此前恆是 stretch,歸一恆不帶這一檔觀感變化。 */
.p-row--bare  { padding: 0; border-top: none; flex-wrap: nowrap;
                align-items: normal; }
.p-row--tight { padding: var(--sp-4) 0; border-top: none; flex-wrap: nowrap;
                align-items: normal; font-size: inherit; }
/* 兩枚窄變體的**格內長串恆可斷**(B6 · qa-003 缺陷⑧):375 實測 C3 根據節
   `.p-row--tight` 子項 67+24+203=294 擠在 275 的行裏,`scrollWidth 309 >
   clientWidth 275`,出處串 `settings.CONTACT_COOLDOWN_DAYS` 橫穿卡緣被裁。
   `nowrap` 管的是「三格不換行」,而 flex 子項默認 `min-width:auto` 恆不肯
   縮到內容之下——兩件合起來就是一行推不動的牆。
   收口三件恆配套:①子項恆 min-width:0(牆可推);②**只有出處小字那一格**
   任意斷行(標籤與值恆不被拆成「cooldow / n」);③擠壓恆**全落在出處那一格**
   (flex-shrink 加權)——收據是小字,標籤與數是正文,該讓的是小字。
   短串本就不觸發,桌面觀感零變化。 */
.p-row--bare > *, .p-row--tight > * { min-width: 0; }
.p-row--bare > .who-line, .p-row--tight > .who-line {
  overflow-wrap: anywhere; flex-shrink: 999;
}
.p-row-k { color: var(--ink-3); }
.p-row-v { font-variant-numeric: tabular-nums; }

/* P-label 小標(§一4 大數小標) */
.p-label {
  font-size: var(--fs-11); color: var(--ink-3);
  text-transform: uppercase; letter-spacing: .06em;
}
.p-label--lg { font-size: var(--fs-13); }

/* P-btn 主按鈕(四態恆齊,§四3) */
.p-btn {
  min-height: var(--touch-min);
  background: var(--accent); color: var(--accent-ink);
  border: none; border-radius: var(--radius);
  font-size: var(--fs-15); font-weight: 600; padding: 0 var(--sp-16);
  transition: filter var(--dur-fast) var(--ease-standard);
}
.p-btn:hover { filter: brightness(1.06); }
.p-btn:active { filter: brightness(.94); }
.p-btn:disabled { opacity: .5; cursor: default; }

/* P-pill chip/膠囊(觸target 介質分層=ADR-0013,值恆 tokens.css 二枚) */
.p-pill {
  border-radius: var(--radius-pill); font-size: var(--fs-13);
  padding: var(--sp-8) var(--sp-16); min-height: var(--touch-fine);
  transition: filter var(--dur-fast) var(--ease-standard);
}
.p-pill--solid { background: var(--accent-soft); color: var(--accent-deep); border: none; }
.p-pill--outline {
  background: transparent; color: inherit; border: 1px solid currentColor;
  padding: var(--sp-4) var(--sp-16);
}
/* --sentence(refero-audit W-2):長 label(渲後逾閾值,如逐戶例句)恆**複用
   P-row 形**=整行(flex-basis 100% 佔獨行)+左對齊 --ink 字+頂髮絲分隔+ --radius 0
   ——恆不再穿 pill 皮於 375 折兩行讀成列表。態恆承 .p-pill 基態,恆不另起態選擇器。 */
.p-pill--sentence {
  flex-basis: 100%; width: 100%; text-align: left;
  background: none; color: var(--ink);
  border: none; border-top: 1px solid var(--hairline);
  border-radius: 0; padding: var(--sp-8) 0;
  overflow-wrap: anywhere;
}
/* [FE-2 · 門 P2-3]P-pill 作 `<label>` 之載體時恆須**成盒**:inline 之高喫不進
   `min-height`,而命中區那一條(coarse ≥ --touch-min)恆下在 `.p-pill` 上。這一句
   與上面那條 `fieldset:disabled .p-pill` 恆是同一件事的兩半(「label 載體才需要」),
   故恆同住原語層——半住原語半住消費面,下一處用 label 皮的人就得再補一遍。 */
label.p-pill { display: inline-flex; align-items: center; }
.p-pill:hover { filter: brightness(.97); }
.p-pill:active { filter: brightness(.92); }
/* [FE-2] 第二枚選擇子恆是**同一枚態之另一種載體**恆非第二副形:P-pill 亦作
   `<label>` 用時(原生 radio 之 label 複用 pill 皮=圖紙 §五「Lens anatomy」逐字),
   `:disabled` 恆咬不着它——label 恆非表單控件,禁用恆住其 `fieldset` 上。故二者
   恆共此一條聲明:形恆一處產地,禁用之樣與禁用之實(fieldset.disabled 連帶禁掉
   組內每一枚 input)恆同拍,恆不各寫一份 opacity。 */
.p-pill:disabled, fieldset:disabled .p-pill { opacity: .5; cursor: default; }

/* P-sheet 底抽屜(目錄與門列表恆同一形) */
.p-sheet {
  background: var(--sheet);
  border-radius: var(--radius) var(--radius) 0 0;
  border-top: 1px solid var(--hairline);
  box-shadow: var(--shadow-sheet);
  transition: transform var(--dur-slow) var(--ease-emphasized);
}

/* P-icon 圖標(原語第八件;圖紙 §四2 · r19)——**線形恆此一處**。
   殼=`core/templates/core/primitives/icon.html`(幾何恆閉集:一名一圖,換一枚字形
   恆只改那一處)。色恆 `currentColor`:圖標恆隨所在件之墨,恆不自鑄第二枚色
   (故 `.nav-slot.active svg` 那一枚圖形役覆寫恆仍在其上,W4-3 一字未動)。
   尺恆**由消費面定**,本行那 20 恆只是回落(P-ring 先例:殼內 26 恆是回落)。 */
.p-icon {
  width: 20px; height: 20px;
  fill: none; stroke: currentColor; stroke-width: 1.6;
  stroke-linecap: round; stroke-linejoin: round;
}

/* P-overlay 浮層 chrome(工作面上的浮條/膠囊;實底恆無毛玻璃) */
.p-overlay {
  position: fixed; z-index: 30;
  background: var(--card);
  border: 1px solid var(--hairline);
  border-radius: var(--radius-pill);
  box-shadow: var(--shadow-whisper);
  font-family: var(--font-ui);   /* 浮層恆自帶字族,恆不賴頁面繼承 */
  font-size: var(--fs-13); color: var(--ink);
  padding: var(--sp-8) var(--sp-16); min-height: var(--touch-min);
  display: flex; align-items: center; gap: var(--sp-8);
  text-decoration: none; cursor: pointer;
  transition: background var(--dur-fast) var(--ease-standard);
}
/* `hidden` 恆真隱藏:display:flex 會蓋掉 HTML 的 hidden 屬性(help-pop 舊傷) */
.p-overlay[hidden] { display: none; }
a.p-overlay:hover, button.p-overlay:hover { background: var(--card-tint-hover); }
a.p-overlay:active, button.p-overlay:active { background: var(--hairline); }
/* 四態恆齊(B6 · qa-003 §五 一格差):圖紙 §四3 矩陣給 P-overlay 的 disabled
   是 ●,而全支只有前三態。表達恆沿既有剋制形(透明度+光標),恆不新起裝飾層;
   鏈接形無 :disabled 僞類,故 aria-disabled 同判(與死槽同一慣用法)。 */
a.p-overlay[aria-disabled="true"], button.p-overlay:disabled,
button.p-overlay[aria-disabled="true"] { opacity: .5; cursor: default; }

/* ===== K3 人話行(右置 pill) ===== */
.k3 { display: flex; justify-content: flex-end; }
.k3 .bubble {
  max-width: 78%;
  background: var(--accent-soft); color: var(--ink);
  border-radius: var(--radius-pill);
  padding: var(--sp-12) var(--sp-16); font-size: var(--fs-15);
  overflow-wrap: anywhere;
}
.k3 .bubble .attach {
  display: inline-block; font-size: var(--fs-11); color: var(--accent);
  background: var(--card); border: 1px solid var(--hairline);
  border-radius: var(--radius-pill); padding: 0 var(--sp-8);
  margin-right: var(--sp-4);
  vertical-align: 1px;
}
.k3.pending .bubble { opacity: .55; }

/* ===== C1 晨報卡 ===== */
.c1 { min-width: 0; overflow-wrap: anywhere; }
.c1 .greeting {
  font-family: var(--font-display);
  font-size: var(--fs-24); line-height: 1.3; margin-bottom: var(--sp-12);
}
/* 記分行恆**一處產地**(r7 歸位;§四2 原語律)。
   既存傷:本規則原鎖在 `.c1 .scoreline`,而數字屏借用同一 class 卻拿不到它
   ——四數遂縱列(ba204a75 報告注)。同一 class 恆同一副長相,恆不各寫各的;
   祖先限定恆只用來**改**形(見下方 .dash-sub),恆不用來**藏**形。
   錨=core/tests/test_t1_numbers.py::test_scoreline_layout_rule_is_not_locked_inside_c1 */
.scoreline {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  row-gap: var(--sp-8); column-gap: var(--sp-16);
  padding: var(--sp-12) 0; border-top: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline); margin-bottom: var(--sp-12);
}
.metric { min-width: 0; }
/* 大數恆取階頂 --fs-34(ADR-0019:舊註釋「數字大號 28-34」這一區間恆收進階內) */
.metric .num {
  font-size: var(--fs-34); font-weight: 700; font-family: var(--font-num);
  font-variant-numeric: tabular-nums; line-height: 1.15;
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-8);
}
.metric .delta { font-size: var(--fs-13); font-weight: 400; }
.metric .delta.up { color: var(--ok); }
.metric .delta.down { color: var(--bad); }
.metric .delta.flat { color: var(--ink-3); }
.metric .label { margin-top: var(--sp-4); }
.metric .ring { flex: none; align-self: center; }
.c1 .lines {
  display: flex; flex-direction: column; gap: var(--sp-8); font-size: var(--fs-15);
}
.c1 .exceptions {
  margin-top: var(--sp-12); padding-top: var(--sp-12);
  border-top: 1px solid var(--hairline);
}
.c1 .exceptions .ex {
  display: flex; gap: var(--sp-8); align-items: baseline;
  font-size: var(--fs-15); padding: var(--sp-4) 0;
}
.c1 .exceptions .ex::before { content: "◦"; color: var(--warn); }

/* ===== C2 答卡 ===== */
.c2 .main-sentence { font-size: var(--fs-17); line-height: 1.5; }
.c2 .main-sentence .num-link {
  color: var(--accent); font-weight: 600;
  font-variant-numeric: tabular-nums;
  border-bottom: 1px dashed color-mix(in srgb, var(--accent) 45%, transparent);
}
.c2 .trend { margin: var(--sp-12) 0 var(--sp-4); }
.c2 .trend svg { display: block; width: 100%; height: auto; }
.caliber { margin-top: var(--sp-12); font-size: var(--fs-13); color: var(--ink-2); }
.caliber summary {
  cursor: pointer; list-style: none; color: var(--ink-3); user-select: none;
}
.caliber summary::-webkit-details-marker { display: none; }
/* [UI-4 · 門判 P1-2] 披露標恆取**子**組合器（先例=`.c3-basis > summary::after`）。
   後代形在嵌套面上恆說假話：UI-4 首次把一枚 `.caliber`（排行餘員摺疊）
   嵌進另一枚 `.caliber`（口徑抽屜）之內，外層一開，`[open]` 那一句連**內層那枚
   關着的** summary 一併命中——屏上遂印 `▾`，讀作「這裏已全展開」而庫裏
   `open === false`。標恆與態同一件事，恆與本件所服之 R「逐數收據」同一條紀律。
   單層消費者（C2 口徑 / C3 根據 / GOTV 車道）之 summary 恆是直接子，故恆逐字等價。 */
.caliber > summary::after { content: " ▸"; }
.caliber[open] > summary::after { content: " ▾"; }
.caliber .caliber-body {
  margin-top: var(--sp-8); padding: var(--sp-12);
  background: var(--ground); border-radius: var(--radius-sm);
  display: flex; flex-direction: column; gap: var(--sp-4);
}
.caliber .p-row-k { min-width: 72px; }

/* ===== C3 方案卡(四節+態) ===== */
.c3 .c3-head {
  display: flex; align-items: baseline; gap: var(--sp-8);
  margin-bottom: var(--sp-4);
}
.c3 .c3-seq {
  flex: none; width: 24px; height: 24px; border-radius: 50%;
  background: var(--accent-soft); color: var(--accent-deep);
  font-size: var(--fs-13); font-weight: 700; display: flex;
  align-items: center; justify-content: center;
  font-variant-numeric: tabular-nums;
}
.c3 .c3-title {
  flex: 1; min-width: 0; font-size: var(--fs-17); font-weight: 600;
  display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; overflow: hidden; overflow-wrap: anywhere;
}
.c3 .c3-meta {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-8);
  margin-bottom: var(--sp-12);
}
.c3 .c3-meta .who-line {
  flex: 1; min-width: 0; margin-bottom: 0; overflow-wrap: anywhere;
}
.c3 .c3-state {
  margin-left: auto; font-size: var(--fs-11); border-radius: var(--radius-pill);
  padding: var(--sp-4) var(--sp-12); white-space: nowrap; flex: none;
}
.c3 .c3-state.pending { background: var(--accent-soft); color: var(--accent-deep); }
.c3 .c3-state.approved { background: var(--ok-soft); color: var(--ok); }
.c3 .c3-state.declined { background: var(--bad-soft); color: var(--bad); }
.c3 .c3-state.expired  { background: var(--ground); color: var(--ink-3); }
.c3 section, .c3 .c3-basis {
  padding: var(--sp-8) 0; border-top: 1px solid var(--hairline);
  font-size: var(--fs-15);
}
.c3 section h4 { font-weight: 600; margin-bottom: var(--sp-4); }
.c3 .c3-basis > summary {
  min-height: var(--touch-fine); display: flex; align-items: center;
  cursor: pointer; list-style: none;
}
.c3 .c3-basis > summary::-webkit-details-marker { display: none; }
.c3 .c3-basis > summary::after { content: " ▸"; }
.c3 .c3-basis[open] > summary::after { content: " ▾"; }
.c3 .c3-basis[open] > summary { margin-bottom: var(--sp-4); }
.c3 .c3-warning-summary {
  margin-top: var(--sp-8); padding-top: var(--sp-8);
  border-top: 1px solid var(--hairline);
}
.c3 .c3-warning-summary-text {
  display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; overflow: hidden; overflow-wrap: anywhere;
  color: var(--warn); font-size: var(--fs-13);
}
.c3 .c3-warning-detail {
  margin-top: var(--sp-8); padding-top: var(--sp-8);
  border-top: 1px solid var(--hairline);
}
.c3 .p-row-k {
  color: var(--ink-2); flex: none;
}   /* C3 標籤恆不被長值擠扁;值在餘寬內換行 */
.c3 .p-row-v { overflow-wrap: anywhere; }
.c3 .law { font-size: var(--fs-13); color: var(--ink-2); }
.c3 .rehearsal {
  margin-top: var(--sp-12); padding: var(--sp-12);
  background: var(--ground); border-radius: var(--radius-sm);
  font-size: var(--fs-15);
}
.c3 .rehearsal .say-hint { color: var(--ink-3); font-size: var(--fs-13); }
.c3 .rehearsal .say-hint code {
  font-family: var(--font-ui); background: var(--accent-soft);
  color: var(--accent-deep); border-radius: var(--radius-sm); padding: 0 var(--sp-8);
}

/* ===== C5 事件行(無卡面;整行恆同一字號,細聲細氣) ===== */
.c5 {
  display: flex; gap: var(--sp-12); align-items: baseline;
  font-size: var(--fs-13); color: var(--ink-2); padding: 0 var(--sp-4);
}
.c5 .t {
  font-variant-numeric: tabular-nums; color: var(--ink-3);
  font-size: var(--fs-13); flex: none;
}
.c5 .receipt-link { font-size: var(--fs-13); }
.c5 .ok-dot { color: var(--ok); }

/* ===== C7 澄清卡 ===== */
.c7 .q { font-size: var(--fs-15); }
.c7 .opts { margin-top: var(--sp-12); }

/* ===== M1 地圖卡(流列全寬 16:10) ===== */
.m1 { padding: 0; overflow: hidden; }
/* [MAP-3] 縮略圖恆是**三段疊一處**(同 L1 之次序):基層 SVG 在下、瓦片底圖在上,
   故承它們的這一枚恆 relative——尺寸恆仍由基層 SVG 定(16/10、min-height 180px),
   瓦片層恆只 inset:0 鋪滿它,恆不另立第二處高度產地。 */
.m1 .m1-thumb { position: relative; }
.m1 .m1-svg { display: block; width: 100%; aspect-ratio: 16 / 10; min-height: 180px; background: var(--card);
  transition: opacity var(--dur-slow) var(--ease-standard); }
/* 圖內字號恆經 CSS 給:SVG 的 font-size **表現屬性**不做 var() 替換,
   寫 var() 會靜默回落到繼承值(件9 歸階時實測)。值仍單產地=令牌。 */
.m1 .m1-svg .m1-n { font-size: var(--fs-11); }
/* M1 件4:SVG 表現屬性恆禁 var()(屬性值不解 CSS 變量)——色恆住類。
   六類=流內直繪 SVG 的全部塗裝閉集(m1 卡/c1 環;map 基層同類名住 map.css) */
.svg-extent { fill: none; stroke: var(--hairline-strong); }
.svg-route { fill: none; stroke: var(--accent); }
.svg-door { fill: var(--card); stroke: var(--ink-2); }
.svg-door.done { fill: var(--ink-2); }
.svg-endpoint { fill: var(--card); stroke: var(--hairline-strong); }
.m1 .m1-svg .m1-n { fill: var(--ink); }
.m1 .m1-svg .m1-empty { fill: var(--ink-3); }
.svg-ring-track { fill: none; stroke: var(--hairline); }
.svg-ring-value { fill: none; stroke: var(--target); }
.m1 .m1-svg .m1-empty { font-size: var(--fs-13); }
/* [MAP-3] 瓦片底圖層:恆**非交互**——`pointer-events: none` 恆是結構性那一道
   (Leaflet 之 dragging/zoom/keyboard/tap 另在 m1-thumb.js 逐件關),整張縮略圖
   恆仍是外層那一枚 <a>,流裏恆不長出第二個可操縱的地圖。
   底恆 --map-block(同 L1 之 .map-host):瓦片未到之窗恆不留一片白。
   現恆候**瓦片真到**(.thumb-live)——縮略圖恆只 320×200,基層與疊加層並現即
   兩副幾何互疊讀不出,故此處恆是**換**恆非 L1 那樣的「疊加層接管即淡出」。 */
.m1 .m1-mini {
  position: absolute; inset: 0; pointer-events: none;
  background: var(--map-block);
  /* 層恆**關在自己屋裏**:`z-index: 0` 使本盒成層疊上下文,渲染庫內部那幾層
     (瓦片/疊加層各有自己的 z-index)遂恆不外溢——不關的話它們會蓋住 DOM 序在
     後的兄弟,而那個兄弟正是**署名**(真站首幀當場量到:署名整枚不見)。 */
  z-index: 0;
  opacity: 0; transition: opacity var(--dur-slow) var(--ease-standard);
}
.m1.thumb-live .m1-mini { opacity: 1; }
.m1.thumb-live .m1-svg { opacity: 0; }
/* 瓦片源署名(圖紙 §四1 末):恆隨瓦片同現——瓦片在即署名在(使用政策之條件),
   瓦片不在則本無可署之圖。形恆 --fs-11 / --ink-3 坐圖角,恆不折疊恆不 hover 才現。 */
.m1 .m1-attrib {
  /* 層恆**顯名**恆不賴 DOM 序:`.m1-mini` 是 z-index:auto 的定位盒故恆不成
     層疊上下文,Leaflet 之 pane(z-index:400)遂會蓋住 DOM 序在它之後的兄弟
     ——真站首幀當場量到(署名整枚不見)。署名是使用政策之條件,恆不許被蓋。
     [MAP-5b · 圖紙 r14 ⑧ · **用戶裁 2026-09-02**]「我會做成透明沒有白色作爲背景
     放進去地圖裏面」:舊形是一枚白底、右下貼死、左上角帶 --radius-sm 的小舌頭
     ——那是**一件 UI 貼在圖上**,恆不是「這張圖是誰的」。故本拍整枚**去盒**:
     零底色零圓角零內距,字直接坐圖,可讀性恆改由字自持(細暈 --card 雙層 2px
     ——此數恆不新鑄:r14 E4 已裁「彩色柵格上之幾何恆以 --card 隔離 2px」,
     署名之字恆是同一處境之另一形,故同律同數)。貼角恆取 --sp-8,與 L1 那一面
     **同數同形同尺**——一枚署名恆不該在兩處長得不一樣。
     恆不可降者恆仍一:字級 --fs-11 已是字階六檔之最小,恆不再降。 */
  position: absolute; right: var(--sp-8); bottom: var(--sp-8); z-index: 1;
  display: none;
  font-size: var(--fs-11); line-height: 1.2; color: var(--ink-3);
  text-shadow: 0 0 2px var(--card), 0 0 2px var(--card);
}
.m1.thumb-live .m1-attrib { display: block; }
/* 底圖缺席態(斷網 / 瓦片源不可達):退回基層幾何,並**明示**其缺席——恆不靜默
   留一張抽象圖冒充「這就是地圖」。句恆詞典單產地 tl_map_st_tiles。 */
.m1 .m1-basemap-off { display: none; padding: var(--sp-8) var(--sp-16) 0; }
.m1.thumb-absent .m1-basemap-off { display: block; }
.m1 .m1-foot {
  display: flex; align-items: center; gap: var(--sp-8);
  padding: var(--sp-12) var(--sp-16); border-top: 1px solid var(--hairline);
  font-size: var(--fs-13); color: var(--ink-2);
}
.m1 .m1-open { margin-left: auto; color: var(--accent); font-weight: 600; }

/* ===== 疊加層之圖形語彙(MAP-3:L1 與 M1 卡縮略圖恆共此一副形) =====
   形隨繪法同處產地:繪法住 map-overlay.js,塗裝住此(app.css 恆二面皆掛,
   而 map.css 恆只 /map 一面——留在那兒即等於縮略圖上無形可用,或逼出第二副)。 */
/* [MAP-6 · 圖紙 r16 · **用戶裁 2026-09-02** 擇方向 A]**借來之柵格恆整塊去飽和**。
   r14 E4 之雙描邊解的是「讀不讀得出」;**「誰是主角」**恆是另一問——底圖之最豔者
   (高速/主幹/園)彩度恆逾 --accent,故 §一3「唯一強調」在這張借來的圖上恆只是
   名義上的。判據恆一句:**屏上最豔者恆須是數據恆非底圖**(375 真站逐像素實測:
   saturate(1) 之最豔 218 > --accent 之 140;0.55 後最豔恆 140=--accent 自己)。
   度數恆**令牌**恆不在此鑄裸數(產地=圖紙 §二 --map-desat;何以是那個數=r16)。
   射面恆**只**瓦片層:疊加層(線/門/起點/標籤/圖例)恆在 filter 之外——去的恆只
   借來那一層之飽和,我們自己畫的恆一分未減。
   本條恆住 app.css 恆不住 map.css:r14 ① 逐字「卡上那張圖與打開地圖所見自此恆是
   **同一個世界**」——一面去飽和一面不去,即二個世界。 */
.leaflet-tile-pane { filter: saturate(var(--map-desat)); }
/* 起點標記:一枚 --accent **實標**+起點詞(恆不只以色宣稱);與站序徽標
   恆形上分得開(實心塊 vs 白底圓徽),恆不另起第三種地圖色語彙。 */
.start-mark, .day-bubble {
  display: inline-flex; align-items: center; justify-content: center;
  min-height: var(--touch-fine); padding: 0 var(--sp-8);
  font-size: var(--fs-11); font-weight: 600; white-space: nowrap;
  box-shadow: var(--shadow-whisper);
}
.start-mark {
  background: var(--accent); color: var(--card);
  border-radius: var(--radius-sm);
}
/* 按日氣泡:按天面標出該日計劃之位置(他日之線恆不渲=既立之按天律),
   形恆與起點標記同族恆不另鑄——變的只有它說的是哪一天。 */
.day-bubble {
  background: var(--card); color: var(--ink);
  border: 1px solid var(--accent);
  border-radius: var(--radius-pill);
  font-variant-numeric: tabular-nums;
}

/* ===== E1 錄入回執卡 ===== */
.e1 { border-color: var(--hairline-strong); }
.e1 .echo { font-size: var(--fs-15); }
.e1 .echo .n { font-weight: 700; font-variant-numeric: tabular-nums; }
.e1 .undo-row {
  margin-top: var(--sp-12); display: flex; align-items: center; gap: var(--sp-12);
  background: var(--warn-soft); border-radius: var(--radius-sm);
  padding: var(--sp-8) var(--sp-12); font-size: var(--fs-13); color: var(--warn-deep);
}
.e1 .undo-count { font-variant-numeric: tabular-nums; font-weight: 700; }
.e1 .undo-row.sent { background: var(--ok-soft); color: var(--ok); }
.e1 .next-hint { margin-top: var(--sp-8); font-size: var(--fs-15); color: var(--ink-2); }

/* ===== parked 草稿卡(P-012:候人工再歸屬;原文可見,人裁歸屬) ===== */
.card.parked { border-color: var(--warn-soft); background: var(--warn-soft); }
.parked-item { padding: var(--sp-8) 0; border-top: 1px solid var(--hairline); }
.parked-item:first-of-type { border-top: none; }
.parked-text { font-size: var(--fs-15); color: var(--ink); overflow-wrap: anywhere; }
/* parked 卡之次級文字恆取 `--ink-2`(裁席裁 2026-09-01 · B-P1-1;零新令牌)。
   `.who-line` 基態是 `--ink-3`:於卡白 `--card` 恆 4.74 過 AA,而 parked 卡地
   是 `--warn-soft` `#FBEFE3`(暖底比卡白暗),同一枚墨在此只 **4.19** < 4.5
   ——**地一換,同一役就掉出正文門**。此處改指**已授之可讀役** `--ink-2`
   (於 `--warn-soft` 恆 6.19),恆不放寬閾值、恆不新起令牌、恆不改 §二 值。
   判據恆是「這行字底真實是什麼」恆非「類名叫什麼」;守衛隨之由「二地」
   改爲**逐組合真解**(見 test_uiux_pass1_guards.InkRampContrast)。 */
.card.parked .who-line { color: var(--ink-2); }

/* ===== chips(≤3,預填不代發) ===== */
.chips { display: flex; flex-wrap: wrap; gap: var(--sp-8); margin-top: var(--sp-12); }

/* B1b-2 觸target 介質分層(ADR-0013):粗指針(觸屏)命中區恆 ≥--touch-min;
   細指針(鼠標)恆守 --touch-fine 細 pill——下限只對觸發它的介質生效。
   D1-c:44/32 二值自此**恆不再在此處寫字面**,產地=tokens.css 兩枚令牌;
   錨 test_b1b_patches 隨之改讀 var 形並**加驗令牌真值**(鏈更長不更松)。 */
@media (pointer: coarse) {
  /* B6(qa-003 §五 一格差):本塊恆**只**抬命中區下限。原先它順手把內距也
     改成 12/16,於是 375 實測 P-pill 內距是 12 16 而圖紙 §四2 定的是
     --sp-8 --sp-16——命中區由 min-height 擔,內距恆不必第二次表態。 */
  .p-pill { min-height: var(--touch-min); }
  .c3 .c3-basis > summary { min-height: var(--touch-min); }
  .composer .icon-btn { width: var(--touch-min); height: var(--touch-min); }
  .composer input[type="text"] { min-height: var(--touch-min); }
  /* 未登錄面三處(qa-002 I):語言鏈 18px / 同意勾 16px / 重試鏈 21px */
  .auth-card .lang-row a { min-height: var(--touch-min); padding: 0 var(--sp-8); }
  /* [L-1] 時間線頁腳之語言行同族同律:基態恆 --touch-fine,粗指針恆抬到
     --touch-min(桌面密度恆不爲觸屏付賬;ADR-0013 介質分層)。 */
  .footline a { min-height: var(--touch-min); }
  /* [門 P1-1] 返回行之鏈(數字屏 · 催票面 · 硬表格諸面之「‹ 時間線」):
     族級恆一次收進——W4-5 自注逐字「逐案追加一次,下一枚手寫小控件就又默認掉在
     門外」。實測 390 細檔恆 20.3×21,粗指針恆無抬升。 */
  .back-row a { display: inline-flex; align-items: center;
                min-height: var(--touch-min); }
  /* [FOOT-1] 版權行之公司主頁鏈同族同律:它恆在**每一**整頁上(含未登錄面),
     故恆須有自己的命中區下限——行內 <a> 恆顯名成盒,否則 min-height 恆被靜默
     丟棄(W4-5 同一課)。可見字形恆一字不動。 */
  .copyline a { display: inline-flex; align-items: center;
                min-height: var(--touch-min); }
  .auth-card .consent-row { min-height: var(--touch-min); align-items: center; }
  .auth-card .consent-row input { width: var(--sp-24); height: var(--sp-24); }
  .auth-card .offline-retry { min-height: var(--touch-min); }
  /* S5-8(T-1 門報 P2-1):未登錄面之**屏間切換鏈**族——`/login`↔`/signup` 之
     互指與 join 之回登錄口皆住 `.who-line` 內,而上面三族恆不含它,遂實測
     EN 42.95×16 · ZH 29.91×16(下限恆 44)。恆**族級**收進恆不逐案追加;
     行內 <a> 恆顯名成盒,否則 min-height 恆被靜默丟棄(W4-5 同一課)。
     可見字形恆一字不動(門報明拒「縮可見形去湊命中區」)。 */
  .auth-card .who-line a {
    display: inline-flex; align-items: center; min-height: var(--touch-min);
  }
  /* W4-5(波三門報 P2-1 · qa-010 門報 P1-2):三**族**恆一次收進,恆不再逐案
     追加——逐案追加一次,下一枚手寫小控件就又默認掉在門外(實測:附件 chip
     關閉鈕 15.875×18.84 · 口徑披露 18.84 高,而下限恆 44)。可見形恆一字不動
     (門報明拒「縮可見形去湊命中區」);行內件恆顯名成盒——`min-height` 寫在
     `display:inline` 上恆被靜默丟棄,那種「寫了不算」的綠恆比紅更壞。 */
  /* [GO-1c · P2-5] 二軸恆齊擔:舊形恆只擔 `min-height`,故短標籤(二字 CJK
     =26px,如「重取」)於粗指針實測 26×44——**一軸過一軸不過恆等於不過**。
     同檔 `.composer .attach-chip button` 恆早已二軸齊擔=先例在,故本拍恆是
     族級補齊恆非逐案追加(app.css §W4-5 自己寫下的那一課)。可見形恆一字不動
     ——盒長而墨恆不動(門報明拒「縮可見形去湊命中區」)。 */
  .receipt-link {
    display: inline-flex; align-items: center; justify-content: center;
    min-height: var(--touch-min); min-width: var(--touch-min);
  }
  .caliber summary { min-height: var(--touch-min); }
  .composer .attach-chip button {
    display: inline-flex; align-items: center; justify-content: center;
    min-height: var(--touch-min); min-width: var(--touch-min);
  }
}

/* ===== B1 · 批後引導 / 決策列表 / 留痕抽屜(令牌恆引 §二,零新色值) ===== */
/* 收據鏈:形是鏈接,標籤是按鈕(點開抽屜不跳頁)——兩者同一副長相 */
.receipt-link {
  font-size: var(--fs-13); color: var(--accent);
  background: none; border: none; padding: 0;
}
/* 「鏈被按下」之反饋恆此一處產地(blueprint §四3 r5 收編未登錄面二觸點):
   語言鏈與離線重試鏈 r5 前恆只得**尺寸**恆無**反饋**(app.css 既有註釋只判了
   命中區隨介質長),而同倉另六枚手寫控件恆早已備之。二枚恆**併入本規則**恆不
   另起一副——另起即又一枚繞過 §二 的態表達字面(態表達基線上限恆 10,§二 至今
   無減淡/按壓令牌族),亦即 §四2「原語無產地,組件就各寫各的」之同一病。
   focus-visible 恆承全局唯一焦點環(app.css:19)。
   事故錨=docs/uiux/refero-audit-002.md P2-1(離線面恆是志願者斷網實地之唯一面)。 */
.receipt-link:hover,
.auth-card .lang-row a:hover,
.auth-card .offline-retry:hover { text-decoration: underline; }
.receipt-link:active,
.auth-card .lang-row a:active,
.auth-card .offline-retry:active { opacity: .7; }
/* C5 下一步:與事件行同一條基線縮排(時刻列寬 + gap),細聲細氣 */
.c5-next {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-12);
  padding: var(--sp-4) var(--sp-4) 0 var(--sp-48);
  font-size: var(--fs-13); color: var(--ink-2);
}
.c5-next .chips { margin-top: var(--sp-4); }
/* C2 決策列表:髮絲線分隔,不靠框(§一2) */
.c2 .dec-list { margin-top: var(--sp-12); }
.c2 .dec-list .t { font-variant-numeric: tabular-nums; color: var(--ink-3); flex: none; }
.c2 .dec-list .dec-title { flex: 1; min-width: 0; }
.c2 .dec-list .dec-verdict { color: var(--ink-2); }
/* CLIENT-2 前置清單(名冊申領截止卡):行恆 P-row 原語一副,此處恆只承**版位**
   恆不承形與態。k 取 --ink-2 並佔餘寬(同 .dash 那一處既立之做法):此行的
   「標籤」是清單項本身=正文,「值」是狀態詞=次級,故權重恆與基形相反。
   零新令牌、零硬編色。 */
.c2 .rd-list { margin-top: var(--sp-12); }
.c2 .rd-list .p-row-k { flex: 1; color: var(--ink-2); }
/* 出處小字恆獨佔次行(`flex-basis:100%`):它與狀態詞同擠一行時,狀態詞之左緣
   隨出處串長短逐行漂,五行遂成鋸齒——而「狀態」是逐行要**對着讀**的一列。 */
.c2 .rd-list .p-row > .who-line { flex-basis: 100%; }
.c2 .rd-list .rd-note { margin-top: var(--sp-8); margin-bottom: 0; }
/* 三留痕:抽屜內逐行(與目錄同一枚底抽屜;行形恆 .p-row) */
.catalog .p-row .who-line { margin-bottom: 0; min-width: 64px; }

/* ===== 輸入區(釘底) ===== */
.composer-wrap {
  position: sticky; bottom: 0; z-index: 30;
  background: var(--ground);
  border-top: 1px solid var(--hairline);
}
.composer {
  max-width: 680px; margin: 0 auto;
  padding: var(--sp-12) var(--sp-16) var(--sp-8);
}
.composer .attach-row { display: flex; gap: var(--sp-8); margin-bottom: var(--sp-8); }
.composer .attach-chip {
  display: inline-flex; align-items: center; gap: var(--sp-8);
  background: var(--accent-soft); color: var(--accent-deep);
  border-radius: var(--radius-pill); padding: var(--sp-4) var(--sp-12);
  font-size: var(--fs-13);
}
.composer .attach-chip button {
  background: none; border: none; color: inherit;
  font-size: var(--fs-13); padding: 0 var(--sp-4);
}
.composer form { display: flex; gap: var(--sp-8); align-items: flex-end; }
.composer .field {
  flex: 1; display: flex; align-items: center; gap: var(--sp-4);
  background: var(--card); border: 1px solid var(--hairline-strong);
  border-radius: var(--radius);
  padding: var(--sp-4) var(--sp-8) var(--sp-4) var(--sp-16);
  transition: border-color var(--dur-base) var(--ease-standard);
  position: relative;   /* @ 挑選器浮層錨 */
}
.composer .field:focus-within { border-color: var(--accent); }
.composer input[type="text"] {
  flex: 1; border: none; background: transparent; outline: none;
  font: inherit; color: var(--ink); min-height: 36px;
  min-width: 0; width: 100%;  /* flex 內在寬防溢(378 視口下 placeholder 撐破) */
}
.composer input[type="text"]::placeholder { color: var(--ink-3); }
.composer .icon-btn {
  flex: none; width: 36px; height: 36px; border: none; background: transparent;
  color: var(--ink-3); border-radius: var(--radius-sm); font-size: var(--fs-17);
  display: flex; align-items: center; justify-content: center;
  transition: background var(--dur-fast) var(--ease-standard);
}
.composer .icon-btn:hover { background: var(--card-tint-hover); color: var(--ink-2); }
.composer .icon-btn:active { background: var(--hairline); }
.composer .say-btn { flex: none; min-width: 64px; }
/* in-flight 與禁用恆同一副長相(§四3 loading ●):置位=timeline.js 的
   setSending 真置 disabled,故形恆複用 .p-btn:disabled,此處恆不再另立死規則。 */

/* 斷網重試條(恆不丟話) */
.retry-bar {
  display: none; max-width: 680px; margin: 0 auto;
  padding: var(--sp-8) var(--sp-16);
  font-size: var(--fs-13); color: var(--warn);
}
.retry-bar.show { display: flex; align-items: center; gap: var(--sp-8); }

/* 恆真句(釘 chrome,細灰行) */
.lawline {
  max-width: 680px; margin: 0 auto;
  padding: var(--sp-4) var(--sp-16) var(--sp-8);
  font-size: var(--fs-11); color: var(--ink-3); text-align: center;
}

/* [L-1 · 門 P1-2 落點收斂] 頁腳元信息帶之語言行:**非地圖整頁恆此一形**
   (地圖面恆住圖例末行行組)。恆與其下二行同軸同寬同居中;字階恆**不**降到
   --fs-11 —— 那二行恆是**讀**的,本行恆是**按**的。
   命中區恆**只**在粗指針檔抬(ADR-0013 介質分層;規則恆住上面那一枚 coarse
   塊)——基態恆**不**寫 min-height:寫了它反而恆勝(同名同特異度而位在其後),
   coarse 那一條遂成死碼。此坑恆記於此:同族新規恆寫進 coarse 塊,恆不在基態
   另立一枚下限。 */
.footline {
  max-width: 680px; margin: 0 auto;
  padding: 0 var(--sp-16); font-size: var(--fs-13); text-align: center;
}
.footline a { display: inline-flex; align-items: center; padding: 0 var(--sp-8); }

/* 版權行(FOOT-1;identity-compliance R「恆真句常駐」:每一整頁恆與恆真句並列)。
   形恆**逐項承恆真句那一副**——同寸同色同字階同居中:二者恆是同一條頁腳法律帶
   之兩行,恆不是一行主一行副。恆只去掉上內距(它恆緊貼上一行恆不自成一段)。 */
.copyline {
  max-width: 680px; margin: 0 auto;
  padding: 0 var(--sp-16) var(--sp-8);
  font-size: var(--fs-11); color: var(--ink-3); text-align: center;
}
/* 名恆不折斷:窄面上這一行恆折,而折點恆須落在名**之外**——「HERMOD /
   SYSTEMS」那一副半截名恆不是任何一個名(同 L-0 窄欄那一課:半截字恆不上屏)。
   二枚名恆同律:招牌(鏈之顯名)與法定名(`.cp-name`,產地=chrome_tags 之名盒)。*/
.copyline a, .cp-name { white-space: nowrap; }

/* ===== 實體挑選器(@ 閉集浮層) ===== */
.picker {
  position: absolute; bottom: 100%; left: 0; right: 0; margin-bottom: var(--sp-8);
  background: var(--sheet); border: 1px solid var(--hairline);
  border-radius: var(--radius); box-shadow: var(--shadow-whisper);
  max-height: 40vh; overflow-y: auto; display: none;
}
.picker.show { display: block; }
.picker .picker-group { padding: var(--sp-12) var(--sp-16) var(--sp-4); }
.picker .picker-item {
  display: block; width: 100%; text-align: left; background: none; border: none;
  padding: var(--sp-8) var(--sp-16); font-size: var(--fs-15); color: var(--ink);
  min-height: 40px;
  transition: background var(--dur-fast) var(--ease-standard);
}
.picker .picker-item:hover { background: var(--card-tint-hover); }
.picker .picker-item:active { background: var(--hairline); }

/* ===== 目錄抽屜(P-sheet:與 /map 門列表恆同一形,§四2) ===== */
/* 舊形=display 切換零動效,與 map 的 .sheet 兩副長相(uiux-audit-001 §二);
   改 visibility+transform 後二者同形,且恆不需動 JS(仍只切 .show 類) */
.catalog {
  position: fixed; inset: 0; z-index: 60;
  visibility: hidden;
}
.catalog.show { visibility: visible; }
.catalog .catalog-scrim {
  position: absolute; inset: 0; background: var(--scrim);
  opacity: 0; transition: opacity var(--dur-base) var(--ease-standard);
}
.catalog.show .catalog-scrim { opacity: 1; }
/* 形恆 .p-sheet(見原語層);此處只留「它在哪、多大」 */
.catalog .catalog-sheet {
  position: absolute; left: 0; right: 0; bottom: 0;
  max-height: 85dvh; overflow-y: auto;
  padding: var(--sp-16); max-width: 680px; margin: 0 auto;
  /* 收起位=自身高度 100%(位移恆只夠把自己挪下去,恆不多走);
     開態由 `.catalog.show .catalog-sheet` 覆寫爲 0,形與 /map 的 .sheet 同。 */
  transform: translateY(100%);
}
.catalog.show .catalog-sheet { transform: translateY(0); }
.catalog h3 { margin: var(--sp-16) 0 var(--sp-8); }
/* 抽屜內容頭(目錄/留痕共用一枚;去內聯 style 後的落位) */
/* 抽屜取件佔位:靜態灰條(零 keyframes 零閃爍——§一5 零裝飾) */
.sheet-skeleton .sk {
  height: var(--sp-12); background: var(--hairline);
  border-radius: var(--radius-sm); margin: var(--sp-12) 0;
}
.sheet-skeleton .sk-a { width: 62%; }
.sheet-skeleton .sk-b { width: 88%; }
.sheet-skeleton .sk-c { width: 45%; }
/* 目錄裏被跳到的那條恆有落點感(焦點環由全局 :focus-visible 給) */
.cat-rule:focus { outline: none; background: var(--accent-soft); }
.sheet-head { display: flex; align-items: baseline; gap: var(--sp-12); }
.sheet-head .sheet-title { flex: 1; margin-top: 0; }
.sheet-head .sheet-lang { font-size: var(--fs-13); }
.cat-rule { margin: var(--sp-8) 0; }
.catalog .cat-item {
  display: block; width: 100%; text-align: left; background: none;
  border: none; border-top: 1px solid var(--hairline);
  padding: var(--sp-12) var(--sp-4); font-size: var(--fs-15); color: var(--ink);
  min-height: var(--touch-min);
  transition: color var(--dur-fast) var(--ease-standard);
}
.catalog .cat-item:hover { color: var(--accent); }
.catalog .cat-item:active { background: var(--card-tint-hover); }

/* ===== 登錄·同意 ===== */
.auth-page {
  min-height: 100dvh; display: flex; align-items: center; justify-content: center;
  padding: var(--sp-24);
}
.auth-card { width: 100%; max-width: 400px; }
.auth-card h1 {
  font-family: var(--font-display); font-size: var(--fs-24);
  margin-bottom: var(--sp-16);
}
.auth-card label.text-label { display: block; margin: var(--sp-12) 0 var(--sp-4); }
/* 未登錄面之文本錄入格恆一條規則管到底(型別漏一枚=那一格掉回瀏覽器默認小盒,
   全寬/髮絲線/圓角/--touch-min 命中區四樣同失;事故錨=qa-013 QA13-2:T-1 之
   `type="email"` 郵箱欄漏在選擇器外。新增錄入型別恆同拍入列——錨會紅) */
.auth-card input[type="text"], .auth-card input[type="password"],
.auth-card input[type="email"] {
  width: 100%; font: inherit; padding: var(--sp-12);
  border: 1px solid var(--hairline-strong); border-radius: var(--radius-sm);
  background: var(--card); color: var(--ink); min-height: var(--touch-min);
}
.auth-card .consent-row {
  display: flex; gap: var(--sp-12); margin: var(--sp-16) 0;
  font-size: var(--fs-13); color: var(--ink-2);
  align-items: flex-start;
}
.auth-card .consent-row input {
  margin-top: var(--sp-4); width: 16px; height: 16px; accent-color: var(--accent);
}
.auth-card .submit { width: 100%; }
.auth-card .err { color: var(--bad); font-size: var(--fs-13); margin-top: var(--sp-12); }
.auth-card .lang-row { text-align: right; font-size: var(--fs-13); margin-bottom: var(--sp-8); }
/* 語言鏈/同意行/重試鏈恆是**未登錄面**的人機觸點:命中區隨介質長
   (qa-002 I;同意勾更是「同意先於會話」紅線域的唯一觸點) */
.auth-card .lang-row a { display: inline-flex; align-items: center; }
.auth-card .offline-retry { display: inline-flex; align-items: center; }
.auth-card .lawline { margin-top: var(--sp-16); }

/* ===== 彙總屏(P5;D1-b 自 dashboard.html 的 60 行內聯 <style> 遷入
       ——模板恆不是第二枚 CSS 產地,uiux-audit-001 §四缺口 12) ===== */
.dash {
  max-width: 680px; margin: 0 auto;
  padding: var(--sp-24) var(--sp-16) var(--sp-48);
}
.dash h1 {
  font-family: var(--font-display); font-size: var(--fs-24);
  margin-bottom: var(--sp-4);
}
.dash .asof { font-size: var(--fs-11); color: var(--ink-3); margin-bottom: var(--sp-16); }
.dash section.card { margin-bottom: var(--sp-16); }
.dash h2 { margin-bottom: var(--sp-12); }
/* 日條=自繪 SVG(D1-c;技術基線「圖表恆自繪」——div 柱圖退役)。
   data-ink 優先:無網格無圖例框,系列恆 1 枚 --series-1,軸標 --ink-3。
   字號恆經 CSS(SVG 表現屬性不做 var() 替換),故 viewBox 與容器同量級。 */
.dash-bars { display: block; width: 100%; height: auto; margin-top: var(--sp-8); }
.dash-bars .bar-n {
  font-size: var(--fs-11); fill: var(--ink-2);
  font-variant-numeric: tabular-nums;
}
.dash-bars .bar-k { font-size: var(--fs-11); fill: var(--ink-3); }
/* 條形 mark 恆一處產地(r7 歸位):日條與「按區域」橫條恆同一副墨。
   §四 三色分役——--series-1 恆只承**實績之形**,恆不承「離目標多遠」。 */
.svg-bar { fill: var(--series-1); }
.svg-bar-zero { stroke: var(--hairline-strong); }
/* ===== T1「環與脈」主格(r7;用戶裁 2026-09-01「數字太 dry」)=====
   形恆照 blueprint §四「數字屏主格 hero」;零新令牌——環與脈各只借既有一枚色。
   三色分役:--series-1=實績之形(脈) · --target=對目標之進度(環/計量條) ·
   --hairline=軌。判詞類 chip(配速)恆缺席,理由釘在圖紙 r7④(同屏恆不兩把尺)。 */
.dash-hero {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-16); padding: var(--sp-4) 0 var(--sp-12);
}
.dash-hero .metric { flex: 1 1 0; }
/* 環恆放大一檔以配 --fs-34 的大數;色與形恆仍 C1 那一副(.svg-ring-*)。 */
.dash-hero .ring { width: 40px; height: 40px; }
/* 脈:恆不撐滿整卡——它是大數的**旁註**恆不是第二張主圖(§一4 大數小標)。 */
.dash-pulse { display: block; flex: none; width: 176px; height: auto; }
.dash-pulse .pulse-line {
  fill: none; stroke: var(--series-1); stroke-linejoin: round;
  stroke-linecap: round;
}
/* 末點=「今天」:實心 --series-1 + 2px 面色環(dataviz「surface ring」形
   ——恆以面色環分隔,恆不給 mark 描邊加非數據的墨)。 */
.dash-pulse .pulse-dot { fill: var(--series-1); stroke: var(--card); }
/* 首尾值標註恆退到軸標一檔(§四 圖表通則:軸標 --ink-3 --fs-11),
   恆不與 --fs-34 的大數爭焦;文字恆不穿數據色(dataviz 同律)。 */
.dash-pulse .pulse-n {
  font-size: var(--fs-11); fill: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
/* 副格:三枚中性數(累計/pledge/可聯支持者)恆同一副小號長相。 */
.dash-sub { border-top: none; padding-top: 0; }
.dash-sub .num { font-size: var(--fs-24); }
/* pledge 計量條=「對目標之進度」,故恆與環同族同色(--target),
   恆不另起第三種進度語彙;軌恆 --hairline。
   名恆**不**取 `.p-` 前綴:本支 `.p-*` 恆專指註冊在冊的六枚原語(殼+目錄頁+
   `test_d1c_primitives.PRIMITIVES`),未註冊而冒前綴即假稱產地。現僅數字屏一個
   消費者,故恆先按屏件落;**第二個消費者一出現即提原語**(補殼+入冊)。 */
.dash-meter {
  margin-top: var(--sp-4); height: 4px;
  background: var(--hairline); border-radius: var(--radius-pill);
  overflow: hidden;
}
.dash-meter > i {
  display: block; height: 100%; background: var(--target);
  border-radius: var(--radius-pill);
}
/* 「按區域」橫條(Q9-3;r7)。類名左、條中、值右成列——值恆不壓在條內
   (逾寬即裁字,dataviz 明禁);條恆複用 .svg-bar 那一副墨。 */
.dash-areas { display: block; width: 100%; height: auto; margin-top: var(--sp-8); }
/* W4-6(qa-010 門報 P2-1):類名恆住一枚**定寬盒**,逾寬即單行省略號截。
   裁字恆由**盒**擔恆不由字數擔——名之寬隨語種/字形而變,數字數恆量不出它;
   長英文名舊式實測右緣 373.28,橫穿了殘根 108.20 與右對齊計數 335.18。
   `overflow` 恆二處各寫一遍:盒本體(foreignObject 恆不自動替你裁)與盒內那
   行字(省略號恆須一枚 hidden 的塊才畫得出來)。全名恆由 `<title>`/`aria-label`
   兜住,故截的恆只是像素恆不是事實。 */
.dash-areas .area-k-box { overflow: hidden; }
.dash-areas .area-k {
  font-size: var(--fs-11); color: var(--ink-2); line-height: 1.2;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dash-areas .area-n {
  font-size: var(--fs-11); fill: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
.dash .p-row-k { flex: 1; color: var(--ink-2); }
.dash .p-row-v { font-weight: 600; }
.dash .pct {
  color: var(--ink-3); font-size: var(--fs-11); min-width: 48px; text-align: right;
}
.records {
  font-size: var(--fs-11); color: var(--ink-3);
  padding: var(--sp-8) 0 var(--sp-4) var(--sp-12);
}
.records div { padding: 0; }
/* UI-4 · 排行披露把手:上限 · 總數 · 去路三件恆同一行(spec semantic-core
   R「逐數收據」:上限與總數恆寫在屏上,全員恆有去路可達)。披露形恆承
   `.caliber` 那一副(▸/▾ 與命中區皆隨其族,含 coarse 之 --touch-min),
   本類恆只承版位與三件之並排——恆不另起一副披露組件。 */
/* [UI-4 · 門判 P1-1] 餘員恆與頭行**同形**：披露體套在行列之內，而 `.caliber`
   那兩句（--fs-13 / --ink-2）恆向下繼承到**餘行**而頭行在其外——第 9 條起整體
   降一檔，而本件所實現之那句 spec 恆是「排行類集合恆不靜默截斷」：列全了而
   降級呈現恆是同一枚傷換了一種說法。故本類恆把二枚**可繼承**屬性釘回 `inherit`
   （圖紙 §四：新類恆只承**版位**恆不承形與態），餘行之形恆隨**其所在之列**；
   把手自身恆仍住把手那一檔（先例=`.gotv-lane > summary` 把字級釘回它該有那一檔）。
   墨恆不在此再寫一枚：`.caliber summary` 那句 --ink-3 恆已是把手墨之單產地。 */
.records-all { margin-top: var(--sp-4); font-size: inherit; color: inherit; }
.records-all > summary {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--sp-8);
  font-size: var(--fs-13);
}
/* 去路那一枚恆是可點字面,故取鏈接同一枚墨(與 .receipt-link 同族) */
.records-all .rank-all { color: var(--accent); }
.back-row { margin-bottom: var(--sp-12); }
.dash .coverage-note { margin-top: var(--sp-8); }

/* ===== G1 催票工作面(GO-1b;blueprint §四1 G1;單產地=圖紙,值恆 §二令牌)
       板式恆 §三1 常駐屏形(單列 ≤680px 居中),恆不取佔屏律——那是地圖之律。
       本塊恆**零態規則**:面上一切觸點(重取 / 補記 / 組頭 / 導出鈕 / 深鏈)
       恆複用既有原語與既有族(.receipt-link / .caliber / .p-btn / .p-pill),
       故 hover/active/focus 與 (pointer:coarse) 命中區恆隨其族,恆不在此另寫
       一副——另寫一副即是「原語無產地就各寫各的」那一課重上一遍。 ===== */
.gotv {
  width: 100%; max-width: 680px; margin: 0 auto; align-self: center;
  padding: var(--sp-24) var(--sp-16) var(--sp-48);
}
.gotv h1 {
  font-family: var(--font-display); font-size: var(--fs-24);
  margin-bottom: var(--sp-16);
}
/* 主句=當拍下一步(ADR-0050 判據①);字級恆同 C2 主句一檔,恆不與 h1 爭焦 */
.gotv-headline { font-size: var(--fs-17); line-height: 1.5; }
.gotv-act { margin-top: var(--sp-12); }
.gotv-wave { margin-top: var(--sp-8); }
/* 停原頁告示:形恆 .who-line(卡內次級讀數行之族),恆非橫幅恆非 toast。
   [GO-1c · P2-4] 本行恆是那枚**常駐** live region:重取恆只換其內文恆不換
   它自己,就近告示(.gotv-stale)亦住其內——同一枚區,故一現身即有聲。 */
.gotv-live { margin-top: var(--sp-8); }
.gotv-live .receipt-link { margin-left: var(--sp-4); }
.gotv-closed { margin-top: var(--sp-8); color: var(--ink-2); }
/* 三件恆同一枚 live region 內:取數時刻與「重取」並肩,就近告示恆另起整行
   (`width:100%` 配 flex-wrap 擔,恆**不**給 .gotv-stale 寫 display——寫了就
   蓋掉 HTML 的 `hidden`,那是 .p-overlay 早年踩過的一枚坑)。 */
.gotv-live { display: flex; flex-wrap: wrap; align-items: baseline; }
.gotv-live .gotv-asof { flex: 1 1 auto; min-width: 0; }
/* 就近告示恆緊貼那三個數(恆不去頁頂);頂髮絲分隔=它與上一行恆不糊成一句 */
.gotv-stale {
  width: 100%; margin-top: var(--sp-8); padding-top: var(--sp-8);
  border-top: 1px solid var(--hairline); color: var(--ink-2);
}
/* 車道恆複用 .caliber 之披露形(▸/▾ 與命中區皆隨其族);本類恆只承版位 */
.gotv-lane { margin-top: var(--sp-16); }
.gotv-lane > summary { color: var(--ink); font-size: var(--fs-15); }
.gotv-lane .lane-body { margin-top: var(--sp-4); }
.gotv-lane .lane-empty { color: var(--ink-3); }
/* 一行之左恆是這一條的身份(--ink-2 正文一檔),右恆是補記(小字讀數)。
   格內長串恆可斷(同 P-row 兩枚窄變體之律):補記讀數帶日期與人名,375 上
   恆須能在格內換行——`min-width:auto` 恆會讓它變成一堵推不動的牆。 */
.gotv-row { justify-content: space-between; }
.gotv-row > * { min-width: 0; }
.gotv-row .gotv-note { overflow-wrap: anywhere; }
.gotv-row-id { color: var(--ink-2); font-variant-numeric: tabular-nums; }
.gotv-row .gotv-note { margin-bottom: 0; text-align: right; }
/* C2 之卡內鏈行(GO-1b 同拍):次級文字深鏈恆與上一句留一檔氣口 */
.c2 .c2-open { margin-top: var(--sp-8); }

/* ===== /_gallery 目錄頁(DEBUG-only;恆不是產品面) ===== */
.gal { max-width: 1100px; margin: 0 auto; padding: var(--sp-24) var(--sp-16) var(--sp-48); }
.gal-sec { margin-bottom: var(--sp-32); }
.gal-strip {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-12);
  margin: var(--sp-12) 0;
}
.gal-card { margin: var(--sp-12) 0; }
.gal-vp {
  border: 1px solid var(--hairline); border-radius: var(--radius);
  background: var(--ground); overflow: hidden; margin-top: var(--sp-12);
}
.gal-vp--desktop { max-width: 680px; }
.gal-vp--mobile { max-width: 375px; }
.gal-overlay-stage {
  position: relative; height: 96px; margin-top: var(--sp-12);
  border: 1px solid var(--hairline); border-radius: var(--radius);
  background: var(--map-block);
}
.gal-overlay-stage .gal-ov { position: absolute; top: var(--sp-16); left: var(--sp-16); }
.gal-sheet-stage {
  position: relative; height: 96px; margin-top: var(--sp-12); overflow: hidden;
  border: 1px solid var(--hairline); border-radius: var(--radius);
  background: var(--map-block);
}
.gal-sheet-stage .gal-sheet {
  position: absolute; left: 0; right: 0; bottom: 0; padding: var(--sp-16);
  min-height: var(--sp-32);   /* 空殼=其誠實形(內容隨抽屜注入);留高度以見抽屜形 */
}
.gal-sheet-stage .gal-sheet-cap { position: relative; z-index: 1; }

/* ===== 移動 375(§三3):導航折底欄,單手可達 ===== */
@media (max-width: 767px) {
  .shell { flex-direction: column; }
  .nav-rail {
    order: 2; width: 100%; height: auto; position: fixed;
    top: auto; bottom: 0; left: 0;   /* top:auto 必寫:桌面態 sticky top:0 會隨級聯漏下來,與 bottom:0 同綁即拉滿全屏蓋頁 */
    z-index: 40; flex-direction: row; justify-content: space-around;
    padding: var(--sp-4) 0 max(var(--sp-4), env(safe-area-inset-bottom));
    border-right: none; border-top: 1px solid var(--hairline);
  }
  /* W4-2(波三門報 P1-2):底欄恆**只收字標**,24px 標記恆在場。舊形整枚
     `display:none`,375 實測標記盒 0x0——登錄後那一面恆是產品唯一常駐殼,
     標記一去,窄屏上就再沒有一處說得出這是誰家的產品。橫排底欄容不下豎疊
     二件,故掉的恆是字標(可取捨者)恆不是標記。 */
  .nav-rail .brand { margin-bottom: 0; }
  .nav-rail .brand-name { display: none; }
  .main { padding-bottom: calc(var(--sp-48) + var(--sp-16)); }
  .k3 .bubble { max-width: 86%; }
  /* C3 建議行恆留兩格可讀寬。長標籤若承襲桌面的 flex:none，會獨佔
     375 卡內寬並把值壓成 0px 逐字豎排；移動態兩格等分、各自在格內換行。 */
  .c3 [data-c3-section="suggest"] > .p-row--tight > .p-row-k,
  .c3 [data-c3-section="suggest"] > .p-row--tight > .p-row-v {
    flex: 1 1 0; min-width: 0;
  }
  .c3 [data-c3-section="suggest"] > .p-row--tight > .p-row-k {
    overflow-wrap: anywhere;
  }
}
