/* ============================================================
   site-notarpro / assetsFE/site.css — 站台結構層(佈景可調層)
   ------------------------------------------------------------
   血緣:_temp/mockup-notarpro/mockup-v2.css(業主 2026-07-25 定稿的首頁樣張 v2.1,
     評 70~80 分、特別讚賞 Hero 動畫)。開站 D 段整理進站台層,**未重寫**。
   載入順序(_skinSetting 主題層):
     themes/tech-trust/tokens.css → themes/tech-trust/theme.css
       → assetsFE/tokens.css(租戶覆寫)→ 本檔
   ⚠️ 與樣張的三處差異(整合必要,非改設計):
     ①樣張自帶的 .nx-head / .nx-foot / .mock-flag 全數移除
       —— 平台走 __headerSection.php(navbaritem 驅動)與 __footer.php(frame nap3),
          兩者由 theme.css 上皮;樣張 header 的視覺差異列 live 對比讓業主過眼。
     ②樣張的全域重置(* / html / body / img / a / h1~h3 / p)改掛
       .nx-page--home 作用域,避免污染 bootstrap/bootsnav 與其餘 8 頁。
     ③其餘區塊 CSS 逐字沿用,零手改。
   動效原則(哈吉踩雷):①不用 canvas(例外會殺掉整頁 rAF)②不依賴
     prefers-reduced-motion 預設關閉,而是預設開、以 @media 尊重使用者設定。
   ============================================================ */

/* == 全域(限首頁作用域;.nx-page--home 由 main.php body class 帶)== */
.nx-page--home, .nx-page--home *, .nx-page--home *::before, .nx-page--home *::after { box-sizing: border-box; }
.nx-page--home { overflow-x: hidden; }
.nx-page--home img { max-width: 100%; height: auto; display: block; }
.nx-page--home a { color: var(--t-accent); text-decoration: none; }
.nx-page--home h1,
.nx-page--home h2,
.nx-page--home h3 { font-family: var(--t-f-display); color: var(--t-ink); letter-spacing: var(--t-ls-display); margin: 0 0 .6em; line-height: 1.35; font-weight: 700; }
.nx-page--home p { margin: 0 0 1em; margin-top: 0.5em; }
.nx-wrap { width: min(1180px, calc(100% - 48px)); margin-inline: auto; }

/* ── 按鈕 ── */
.nx-btn {
    display: inline-flex; align-items: center; gap: 8px; padding: 13px 26px;
    border-radius: var(--t-radius); font-size: 15px; font-weight: 500;
    border: 1px solid transparent; transition: transform .16s, box-shadow .16s, background .16s, color .16s;
}
.nx-btn i { font-style: normal; transition: transform .16s; }
.nx-btn:hover i { transform: translateX(3px); }
.nx-btn--sm { padding: 9px 18px; font-size: 14px; }
.nx-btn--lg { padding: 16px 34px; font-size: 16px; }
.nx-btn--primary { background: var(--t-accent); color: #fff; box-shadow: var(--t-glow); }
.nx-btn--primary:hover { background: var(--t-accent-dn); color: #fff; transform: translateY(-2px); }
.nx-btn--ghost { border-color: rgba(255,255,255,.28); color: var(--t-on-dark); }
.nx-btn--ghost:hover { background: rgba(255,255,255,.10); color: #fff; }
/* ⭐ outline=次要動作(2026-07-25 業主回報「白底按鈕不太明顯」後重做)。
   原設計 `border-color: var(--t-line)`(#dde4ee 極淺灰)+ 白底,疊在 --t-paper(#f7f9fc)/
   --t-paper-soft(#eef2f8) 的淺灰區塊上**幾乎隱形**;首頁就有 6 顆。
   新設計(依 ui-ux-pro-max §4 primary-action + state-clarity):
     靜態=白底 + 主色細框 + 主色字 → 看得到、但實心度低於 primary,不搶主 CTA 焦點;
     hover=整顆填滿主色 → 狀態變化明確(不是只有框變色)。
   文字用 --np-text(#1657d6,白底 6.23:1)而非 --t-accent(4.52:1 壓線)。 */
.nx-btn--outline {
    background: var(--t-card);
    border-color: var(--t-accent);
    color: var(--np-text);
    box-shadow: 0 1px 2px rgba(30, 108, 255, .10);
}
.nx-btn--outline:hover {
    background: var(--t-accent);
    border-color: var(--t-accent);
    color: #fff;
    transform: translateY(-2px);
    box-shadow: var(--t-glow);
}
/* 觸控目標:--sm 原高約 38px 未達 44px 下限(ui-ux-pro-max §2 touch-target-size) */
.nx-btn { min-height: 44px; }
.nx-btn--sm { min-height: 40px; }
/* 鍵盤可及性(§1 focus-states):母版沒給前台按鈕 focus 環 */
.nx-btn:focus-visible {
    outline: 3px solid rgba(30, 108, 255, .45);
    outline-offset: 2px;
}
.nx-cta-row { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 30px; }
.nx-cta-row--center { justify-content: center; }

/* ══════ 1 HERO(深色科技開場) ══════ */
.nx-hero { position: relative; background: var(--t-ink-deep); color: var(--t-on-dark); overflow: hidden; }
.nx-hero__bg { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }
.nx-hero__grid { position: absolute; inset: -2px; background-image: var(--t-grid); background-size: 56px 56px;
    mask-image: radial-gradient(ellipse 100% 70% at 50% 30%, #000 40%, transparent 100%); }
.nx-hero__glow { position: absolute; border-radius: 50%; filter: blur(120px); opacity: .26; }
.nx-hero__glow--a { width: 560px; height: 560px; left: -180px; top: -240px; background: var(--t-accent); animation: floatA 22s ease-in-out infinite; }
.nx-hero__glow--b { width: 460px; height: 460px; right: -160px; bottom: -260px; background: var(--t-cyan); opacity: .18; animation: floatB 26s ease-in-out infinite; }
@keyframes floatA { 0%,100% { transform: translate(0,0); } 50% { transform: translate(70px, 50px); } }
@keyframes floatB { 0%,100% { transform: translate(0,0); } 50% { transform: translate(-60px,-40px); } }
.nx-hero__wordmark {
    position: absolute; left: 50%; top: 46px; transform: translateX(-50%);
    font-family: var(--t-f-display); font-weight: 900; font-size: clamp(80px, 15vw, 210px);
    letter-spacing: .04em; color: rgba(255,255,255,.05); white-space: nowrap; line-height: 1;
}
.nx-hero__dots {
    position: absolute; inset: 0;
    background-image:
      radial-gradient(1.6px 1.6px at 12% 28%, rgba(0,200,215,.8), transparent),
      radial-gradient(1.4px 1.4px at 78% 18%, rgba(30,108,255,.75), transparent),
      radial-gradient(1.2px 1.2px at 33% 72%, rgba(255,255,255,.5), transparent),
      radial-gradient(1.6px 1.6px at 63% 62%, rgba(0,200,215,.6), transparent),
      radial-gradient(1.2px 1.2px at 88% 78%, rgba(255,255,255,.4), transparent),
      radial-gradient(1.4px 1.4px at 22% 88%, rgba(30,108,255,.5), transparent);
    animation: twinkle 7s ease-in-out infinite;
}
@keyframes twinkle { 0%,100% { opacity: .85; } 50% { opacity: .35; } }

.nx-hero__in { position: relative; display: grid; grid-template-columns: minmax(0,1.02fr) minmax(0,1fr); gap: 56px; align-items: center; padding: 86px 0 92px; }
.nx-hero__copy { animation: rise .8s cubic-bezier(.2,.7,.3,1) both; }
@keyframes rise { from { opacity: 0; transform: translateY(22px); } to { opacity: 1; transform: none; } }

.nx-badge {
    display: inline-flex; align-items: center; gap: 10px; flex-wrap: wrap;
    border: 1px solid var(--t-line-dark); background: rgba(255,255,255,.04);
    border-radius: 999px; padding: 7px 18px; font-size: 13px; color: var(--t-on-dark-soft); margin: 0 0 26px;
}
.nx-badge .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--t-cyan); box-shadow: 0 0 0 0 rgba(0,200,215,.6); animation: pulse 2.4s infinite; }
@keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(0,200,215,.55); } 70% { box-shadow: 0 0 0 9px rgba(0,200,215,0); } 100% { box-shadow: 0 0 0 0 rgba(0,200,215,0); } }
.nx-badge span { opacity: .4; }
.nx-badge em { font-style: normal; opacity: .68; letter-spacing: .01em; }

.nx-hero h1 { color: #fff; font-size: clamp(34px, 5.2vw, 60px); font-weight: 900; line-height: 1.24; margin-bottom: 24px; }
/* 標題漸層緩慢流動:環境性動態,字本身不動=不影響閱讀 */
.nx-hero h1 .grad {
    background: linear-gradient(100deg, var(--t-accent) 0%, var(--t-cyan) 38%, #7aa8ff 62%, var(--t-accent) 100%);
    background-size: 260% 100%;
    -webkit-background-clip: text; background-clip: text; color: transparent;
    animation: gradShift 11s ease-in-out infinite;
}
@keyframes gradShift { 0%,100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }

/* 網格上緩慢掃過的光帶 */
.nx-hero__sweep {
    position: absolute; inset: 0;
    background: linear-gradient(105deg, transparent 38%, rgba(0,200,215,.075) 47%, rgba(30,108,255,.06) 52%, transparent 62%);
    background-size: 260% 100%;
    animation: sweep 14s linear infinite;
}
@keyframes sweep { 0% { background-position: 130% 0; } 100% { background-position: -40% 0; } }
.nx-hero__feat { color: var(--t-on-dark-soft); font-size: 15.5px; margin-bottom: 4px; line-height: 2; }
.nx-hero__feat i { font-style: normal; margin: 0 9px; opacity: .35; }
.nx-hero__feat .sep { display: block; height: 0; overflow: hidden; }   /* 破折號改成換行,避免斷在數字中間 */
.nx-hero__feat b { color: var(--t-cyan); font-weight: 500; white-space: nowrap; }
/* ⭐ 2026-08-17 .45 → .50(AA):實量在 --t-ink-deep(#0a1120)底上 .45=4.04、**不過 4.5**;
   .49 剛好過(4.58),取 .50 留一點餘裕(4.72)。同一個值在頁尾也用了,一起改。
   ⚠️ 這是**透明度**造成的對比不足,不是色票錯 —— 量的時候要先把 alpha 合成到底色再算。 */
.nx-hero__note { color: rgba(233,238,247,.50); font-size: 13.5px; margin-top: 20px; }

/* ── ⭐Hero 價值演示動態圖(取代系統截圖) ──
   演的是 NotaPro 的實際邏輯:建一次案 → 文書/收據/封面/簿冊自動長出來〔F032〕。
   純 SVG+CSS,無圖檔、無 canvas;動態是「環境性」的,不搶閱讀。 */
.nx-flow {
    position: relative; display: grid; grid-template-columns: minmax(120px,1.05fr) 150px minmax(150px,1.25fr);
    align-items: center; gap: 0; animation: rise 1s .12s cubic-bezier(.2,.7,.3,1) both;
}
.nx-flow__src { position: relative; display: grid; place-items: center; }
.nx-flow__src .core {
    position: relative; z-index: 2; text-align: center; padding: 26px 20px;
    border: 1px solid rgba(30,108,255,.42); border-radius: var(--t-radius-lg);
    background: linear-gradient(160deg, rgba(30,108,255,.16), rgba(0,200,215,.06));
    backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
}
.nx-flow__src .core b { display: block; color: #fff; font-size: 19px; font-weight: 700; }
.nx-flow__src .core em { display: block; font-style: normal; font-size: 12.5px; color: var(--t-on-dark-soft); margin-top: 5px; }
.nx-flow__src .ring {
    position: absolute; width: 178px; height: 178px; border-radius: 50%;
    border: 1px solid rgba(30,108,255,.30); animation: ripple 3.6s ease-out infinite;
}
@keyframes ripple {
    0%   { transform: scale(.62); opacity: .85; }
    100% { transform: scale(1.25); opacity: 0; }
}

/* 線要跟著卡片區一起拉伸,四條終點才會對準四張卡片的垂直中心 */
.nx-flow__wires { width: 100%; height: 100%; align-self: stretch; overflow: visible; }
.nx-flow__wires path {
    fill: none; stroke: rgba(30,108,255,.5); stroke-width: 1.5;
    stroke-dasharray: 7 11; animation: wire 2.6s linear infinite;
}
.nx-flow__wires path:nth-child(2) { animation-delay: .35s; stroke: rgba(0,200,215,.45); }
.nx-flow__wires path:nth-child(3) { animation-delay: .7s; }
.nx-flow__wires path:nth-child(4) { animation-delay: 1.05s; stroke: rgba(0,200,215,.45); }
@keyframes wire { to { stroke-dashoffset: -36; } }

.nx-flow__outs { display: grid; gap: 12px; }
.nx-flow__out {
    position: relative; padding: 13px 16px 13px 42px;
    border: 1px solid var(--t-line-dark); border-radius: var(--t-radius);
    background: rgba(255,255,255,.05); backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
    animation: popIn 6s var(--d, 0s) ease-in-out infinite;
}
.nx-flow__out b { display: block; color: #fff; font-size: 15px; font-weight: 500; }
.nx-flow__out em { display: block; font-style: normal; font-size: 12px; color: var(--t-on-dark-soft); }
.nx-flow__out i {
    position: absolute; left: 15px; top: 50%; margin-top: -8px;
    width: 16px; height: 16px; border-radius: 50%; background: var(--t-accent);
}
.nx-flow__out i::after {
    content: ""; position: absolute; left: 5px; top: 3px; width: 4px; height: 8px;
    border: solid #fff; border-width: 0 1.6px 1.6px 0; transform: rotate(42deg);
}
/* 「自動長出來」:每張卡週期性亮一下,不是持續閃(不干擾閱讀) */
@keyframes popIn {
    0%, 6%   { border-color: var(--t-accent); box-shadow: 0 0 0 1px rgba(30,108,255,.35), 0 6px 20px rgba(30,108,255,.22); transform: translateX(0); }
    16%      { border-color: var(--t-line-dark); box-shadow: none; }
    100%     { border-color: var(--t-line-dark); box-shadow: none; }
}
.nx-flow__cap {
    grid-column: 1 / -1; margin: 22px 0 0; text-align: center;
    font-size: 13.5px; color: var(--t-on-dark-soft);
}

/* hero 底條 */
.nx-hero__strip { position: relative; border-top: 1px solid var(--t-line-dark); background: rgba(255,255,255,.025); }
.nx-strip { display: grid; grid-template-columns: repeat(4, 1fr); }
.nx-strip > div { padding: 24px 8px; text-align: center; border-left: 1px solid var(--t-line-dark); }
.nx-strip > div:first-child { border-left: 0; }
.nx-strip b { display: block; font-size: 26px; font-weight: 900; color: #fff; line-height: 1.2; }
.nx-strip span { font-size: 13px; color: var(--t-on-dark-soft); }

/* ══════ 區塊通用 ══════ */
.nx-sec { padding: var(--t-sec-pad) 0; position: relative; }
.nx-sec--soft { background: var(--t-paper-soft); }
.nx-sec--dark { background: var(--t-ink-deep); color: var(--t-on-dark); overflow: hidden; }
.nx-sec--dark h2 { color: #fff; }
.nx-sec--cta { background: var(--t-ink); color: var(--t-on-dark); overflow: hidden; }
.nx-sec--cta h2 { color: #fff; }
.nx-hero__bg--soft .nx-hero__grid { opacity: .55; }

.nx-sec__head { text-align: center; max-width: 780px; margin: 0 auto 52px; }
.nx-sec__title { font-size: clamp(26px, 3.4vw, 38px); }
.nx-sec__sub { color: var(--t-text-soft); font-size: 15.5px; }
.nx-sec--dark .nx-sec__sub, .nx-sec--cta .nx-sec__sub { color: var(--t-on-dark-soft); }
.nx-eyebrow {
    display: inline-block; font-size: 12.5px; letter-spacing: .16em; margin: 0 0 12px;
    color: var(--t-accent); font-weight: 500;
}
.nx-eyebrow--on-dark { color: var(--t-cyan); }

/* 進場動畫(JS 加 .in)
   ⚠️鐵則:**只有 JS 真的啟動時才隱藏**(html.js 由 head 內 inline script 加)。
   否則 JS 失效/爬蟲/列印/整頁截圖時,整片內容永久 opacity:0=白頁。 */
html.js .reveal { opacity: 0; transform: translateY(26px); transition: opacity .7s, transform .7s; }
html.js .reveal.in { opacity: 1; transform: none; }
@media print { html.js .reveal { opacity: 1 !important; transform: none !important; } }

/* ══════ 2 分流 ══════ */
.nx-sec--router { background: var(--t-card); border-bottom: 1px solid var(--t-line); }
/* 2026-08-17:四選一 → 三選一(業主裁示拿掉「剛開業不久」) */
.nx-router { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.nx-router__opt {
    text-align: left; cursor: pointer; font: inherit; color: inherit;
    background: var(--t-paper); border: 1px solid var(--t-line); border-radius: var(--t-radius-lg);
    padding: 22px 20px 20px; transition: .18s; position: relative;
}
.nx-router__opt:hover { border-color: var(--t-accent); transform: translateY(-3px); box-shadow: var(--t-shadow); }
.nx-router__opt .ic { font-family: var(--t-f-mono); font-size: 16px; color: var(--t-accent); letter-spacing: .1em; }
.nx-router__opt b { display: block; font-size: 18px; color: var(--t-ink); margin: 8px 0 0px; }
.nx-router__opt em { font-style: normal; font-size: 13.5px; color: var(--t-text-soft); line-height: 1.7; display: block; }
.nx-router__opt.is-on { border-color: var(--t-accent); background: var(--t-card); box-shadow: var(--t-glow); }
.nx-router__opt.is-on::after {
    content: ""; position: absolute; left: 50%; bottom: -8px; width: 14px; height: 14px;
    background: var(--t-card); border-right: 1px solid var(--t-accent); border-bottom: 1px solid var(--t-accent);
    transform: translateX(-50%) rotate(45deg);
}
.nx-router__out { margin-top: 30px; border: 1px solid var(--t-accent); border-radius: var(--t-radius-lg); background: var(--t-card); padding: 34px 38px; box-shadow: var(--t-shadow); }
.nx-ans { display: none; }
.nx-ans.is-on { display: block; animation: fadeIn .35s both; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
/* 行寬:2026-08-15 由 --t-measure(=68ch)改走 --nx-measure。`ch` 是「0」字寬,對 CJK 不準;
   ⚠️ 必須帶 fallback —— tech-trust 的 manifest.json 只列 tokens.css/theme.css,**沒載 tokens-schema.css**
   (--nx-measure 的定義處),不給 fallback 會讓整條 max-width 作廢 → 行寬變無限制,比原本更糟。
   38em = 平台 tokens-schema 的同一個值(CJK 一字≈1em);manifest 補齊後會自動改吃平台值。 */
.nx-ans__say { font-size: 17px; color: var(--t-ink); margin-bottom: 22px; }
/* 2026-08-17:17px < 18px 用品牌藍 --t-accent(白底實算 4.52,勉強過 AA)違反
   content-decisions §十「小字不用品牌藍/橘」的長期規則 ⇒ 改深階藍 --t-accent-dn(6.23)。
   色相不變,只是壓深一階;這是規則落地,不是配色調整。 */
.nx-ans__say b { color: var(--t-accent-dn); font-weight: 700; }

/* 分流答案的「這個階段真正在問的事」清單(2026-08-17 業主口錄內容改版)
   ⛔ 刻意**不做成卡片**:.nx-router__out 本身已經是一張白卡,裡面再放圓角白盒=盒中盒,
      正是業主批過的「排排站」。節奏靠字級與 1px 細線,不靠容器
      (同 quick-tour `nx-why` 2026-08-16 由白卡改無框橫列的裁示,不得再加 background/radius/shadow)。
   行寬 46em ≈ 46 個中文字一行:比法律頁的 58em 窄(這裡是問答短段,不是長文)。 */
.nx-ans__list { list-style: none; padding: 0; margin: 0 0 26px; }
.nx-ans__list > li { padding: 15px 0; border-top: 1px solid var(--t-line); }
.nx-ans__list > li:first-child { border-top: 0; padding-top: 4px; }
/* FAQ 深連結的落點補償(`scroll-margin-top`)**已升平台級**,移到 `_core/fe/faq.php`,
   四站共用同一個值;此處刻意不再重複一條,免得日後兩邊各改各的。 */

/* text-wrap:balance:手機實測「可是我的資料很亂，不同時期格式也不一樣」末行只剩「一樣」兩字。
   治法不是改字(換一句文案就復發),同 security hero 孤行的處理。不支援的瀏覽器退回一般折行。 */
.nx-ans__list > li > b { display: block; font-size: 16px; font-weight: 700; color: var(--t-ink); margin-bottom: 5px; text-wrap: balance; }
.nx-ans__list > li > span { display: block; font-size: 15px; line-height: 1.85; color: var(--t-text); }
/* em 在本站是「非斜體的語意強調」慣例(見 .nx-router__opt em / .nx-tourlink__txt em) */
.nx-ans__list em { font-style: normal; font-weight: 600; color: var(--t-ink); }
/* 行內出口連結:15px 屬小字 ⇒ 依 §十 用 --t-accent-dn,不用 --t-accent。
   ⛔ 具體度:`theme.css` 有一條 `body.nx-theme--tech-trust a { color: var(--t-ink) }` = (0,2,1),
      壓過單獨的 `.nx-ans__list a` = (0,1,1) ⇒ 第一版寫了但**沒生效**(實測 computed 仍是 #101a2e)。
      這裡用三個 class = (0,3,1) **靠具體度贏**,不用 !important,也不去參照主題名(換主題不會壞)。
   ⚠️ 同一條主題規則也讓 `site.css` 既有的 `.nx-page--home a`(0,1,1)整條失效 —— 那是既有狀況,
      牽動全首頁所有連結顏色(含頁首頁尾),屬視覺方向不是缺陷修補,本輪不動,已登記。 */
.nx-page--home .nx-ans .nx-ans__list a { color: var(--t-accent-dn); font-weight: 600; white-space: nowrap; }
.nx-page--home .nx-ans .nx-ans__list a:hover { text-decoration: underline; }
.nx-ans__go { display: flex; gap: 12px; flex-wrap: wrap; }

/* ══════ 3 被理解 ══════ */
/* 2026-08-17 改版:原本是「三個只有問題的圓角白卡」,業主要求就地補答案(五題、預設顯示、答案字小一級)。
   ⛔ **刻意拿掉 background / border / border-radius / box-shadow**:
      三個空盒子還撐得住,五組「問題+答案」各包一個白盒就是業主批過的「排排站」。
      沿用 quick-tour `nx-why`(2026-08-16 由 4 張圓角白卡改無框橫列)的既有裁示。
      ⇒ 這一段現在的骨架=左側漸層直線 + 問題大字 + 答案縮排小字,靠層次不靠容器。
   ⭐ 左側那條 `--t-rule-grad` 直線保留,並**貫穿問題與答案**(原本只有問題那一格有)——
      它現在的角色是「這一組是同一件事」的視覺繫繩,不是卡片的裝飾邊。 */
/* 2026-08-17 第二輪(業主親自下的版面指導,逐條落實):
   ①編號與問題**同一列**,編號=深墨方塊底+白字置中 ②拿掉問題左邊那條**黃線**
   ③單元高度縮小 ④答案兩段的間距約減半 ⑤hover 浮現**很淺的藍**長條底、**不要框線**
   ⑥左側線段上下加高(底色出現後才不會貼著文字)。 */
.nx-worry { display: grid; gap: 12px; max-width: 880px; margin-inline: auto; }
/* padding 是⑥的來源:hover 底色與文字之間要有呼吸;左線改成 top/bottom:0 一起長高 */
.nx-worry__item { position: relative; padding: 14px 18px 14px 26px; }
.nx-worry__item > * { position: relative; z-index: 1; }
.nx-worry__item::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; border-radius: 3px; background: var(--t-rule-grad); z-index: 1; }
/* ⑤hover 底:**只動 opacity**(動態紀律=動畫只動 transform/opacity,不動 background)。
   ⛔ 不加框線——業主明講「框線就是左邊那個線段的框線就好」。
   色=左邊那條線的藍 `--t-accent` 稀釋到 6%;第一行 rgba 只是不支援 color-mix 的舊瀏覽器保底,
   值就是 --t-accent 的 6%,不是另一支色票。 */
.nx-worry__item::after {
    content: ""; position: absolute; inset: 0; z-index: 0;
    background: rgba(30, 108, 255, .06);
    background: color-mix(in srgb, var(--t-accent) 6%, transparent);
    opacity: 0; transition: opacity .18s ease;
}
.nx-worry__item:hover::after,
.nx-worry__item:focus-within::after { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .nx-worry__item::after { transition: none; } }
/* ⛔ 這裡有**兩條**母版 `master.css` 給的樣式必須明確歸零,不能只是自己不寫:
   ①`blockquote{background:#fff}` —— 不歸零的話五行問題會在灰底上變成五條白帶
     (等於卡片沒拿掉只是變扁;實測 computed 仍是 rgb(255,255,255) 才抓到)。
   ②`blockquote{border-left:5px solid #f5af19}` —— 就是業主指的那條**黃線**;
     實測 computed `border-left: 5px solid rgb(245, 175, 25)`,來源是母版不是本檔。
   ⇒ **拆掉別人給的樣式要明確歸零。**
   ⭐ 2026-09-05 棒91 T18：標籤已由 `<blockquote>` 換成 `<h3 class="nx-worry__q">`
     （全站 13/15 頁 h3=0；這五題是站上最像問答的一塊，卻只有 JSON-LD 知道）。
     選擇器已同步改綁，**下面每一個數值逐字保留**；margin/padding 歸零這一次改成在抵消
     母版的 h3 預設（標籤改了，要蓋掉的就換成另一組預設，歸零一樣不能少）。 */
.nx-worry .nx-worry__q {
    margin: 0; padding: 0; position: relative; background: transparent;
    border-left: 0;
    display: flex; align-items: flex-start; gap: 10px;
    font-size: 18px; line-height: 1.6; font-weight: 700; color: var(--t-ink);
    text-wrap: balance;
}
/* ①序號:與問題同列的深墨方塊,白字置中。
   ⚠️ letter-spacing 歸零——原本的 .1em 會在最後一個字元後面也加間距,讓「01」在方塊裡偏右。 */
.nx-worry .q {
    flex: none; display: inline-flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; margin: 1px 0 0;
    background: #1e6cff; color: var(--t-on-dark);
    font-family: var(--t-f-mono); font-size: 16px; font-weight: 400;
    letter-spacing: normal;
}
/* 答案:業主指定「字不要太大」⇒ 比問題小一級半;色也退一階,層次交給字級與顏色。
   ④2026-08-17 業主指定段間距與行距都再收:行高 1.8→1.7、段距 8→2
   ⇒ 兩段之間的**視覺**間距 19.2px → 11.8px(行高留白 9.8 + margin 2)。
   ⛔ 沒有做到剛好一半(9.6):margin 歸零後兩段會黏成一段,讀不出分段。 */
.nx-worry__ans { margin-top: 8px; }
.nx-worry__ans p { font-size: 14px; line-height: 1.7; color: var(--t-text); margin: 0 0 2px; }
.nx-worry__ans p:last-child { margin-bottom: 0; }
.nx-worry__ans em { font-style: normal; font-weight: 600; color: var(--t-ink); }
.nx-worry__more { margin-top: 12px !important; }
/* 具體度同 .nx-ans__list a:要贏過 theme.css 的 `body.nx-theme--tech-trust a`(0,2,1) */
.nx-page--home .nx-worry .nx-worry__more a { color: var(--t-accent-dn); font-weight: 600; }
.nx-page--home .nx-worry .nx-worry__more a:hover { text-decoration: underline; }
.nx-after { text-align: center; color: var(--t-text-soft); margin-top: 34px; }

/* ══════ 4 一天的時間軸 ══════ */
.nx-day { max-width: 960px; margin: 0 auto; display: grid; grid-template-columns: 1fr 92px 1fr; border-top: 1px solid var(--t-line); }
.nx-day__hd { padding: 14px 8px; font-size: 13px; letter-spacing: .1em; }
.nx-day__hd--l { text-align: right; color: var(--t-text-soft); }
/* 13px 屬小字 ⇒ 依 content-decisions §十 用 --t-accent-dn 不用 --t-accent(下同) */
.nx-day__hd--r { color: var(--t-accent-dn); font-weight: 700; }
.nx-day__row { display: contents; }
.nx-day__l, .nx-day__r { padding: 20px 22px; border-top: 1px solid var(--t-line); font-size: 15.5px; }
.nx-day__l { text-align: right; color: var(--t-text-soft); background: repeating-linear-gradient(-45deg, transparent 0 9px, rgba(107,118,136,.06) 9px 10px); }
/* 左欄的 em=「客戶還在旁邊等」這類補述:只比周圍深一階,不能比右欄搶眼(左邊是問題不是主角) */
.nx-day__l em { font-style: normal; font-weight: 600; color: var(--t-text); }
.nx-day__r { color: var(--t-ink); background: var(--t-card); }
/* 一般列的 strong=「下一位已經在談了 / 又完成一件 / 這一段不用做」,靠字重不靠字級;
   --key 列(19:00 / 週末)另有 21px 藍色大字規則,具體度 (0,2,1) 較高不受影響 */
.nx-day__r strong { font-weight: 800; color: var(--t-ink); }
.nx-day__r--same { color: var(--t-text-soft); background: transparent; }
/* 2026-08-17:原本只有 --same 的 em 有樣式,新版 10:30 / 17:30 也用到 ⇒ 提升為 .nx-day__r em 通用 */
.nx-day__r em { display: block; font-size: 13.5px; font-style: normal; color: var(--t-accent-dn); margin-top: 4px; }
.nx-day__t {
    display: flex; align-items: center; justify-content: center; border-top: 1px solid var(--t-line);
    font-family: var(--t-f-mono); font-size: 13px; color: var(--t-text-soft);
    background: linear-gradient(to right, transparent calc(50% - .5px), var(--t-line) calc(50% - .5px), var(--t-line) calc(50% + .5px), transparent calc(50% + .5px));
}
.nx-day__row--key .nx-day__r { background: linear-gradient(90deg, rgba(30,108,255,.07), transparent); box-shadow: inset 3px 0 0 var(--t-accent); }
.nx-day__row--key .nx-day__r strong { font-size: 21px; color: var(--t-accent); font-weight: 900; }
.nx-day__foot { text-align: center; margin-top: 46px; color: var(--t-text-soft); font-size: 16.5px; }
.nx-day__foot strong { color: var(--t-ink); font-size: 19px; }
/* 2026-08-15:容器由 <p> 改 <div>(原本 p 包 div 會被瀏覽器拆開),內層 p 的行距在此收斂 */
.nx-day__foot p { margin: 0 0 .45em; font-size: inherit; color: inherit; }
.nx-day__foot p:last-child { margin-bottom: 0; }

/* ══════ 5 證據 ══════ */
/* ⚠️ 2026-08-15:兩張卡原本 `align-items:center` + 只有左卡 `min-height:100%`
   → 實測左卡 466×347、右卡 466×304(**差 43px**、上緣還差 21px),業主回報「看起來奇怪」。
   改成 grid 拉伸等高 + figure 內部 flex、圖用 `margin-block:auto` 吃掉剩餘空間
   → 兩卡上下緣齊平、figcaption 對齊底部。箭頭欄改 `align-self:center` 才不會被一起拉高。
   ⭐ 選擇器由 `figure > img` 改 `figure img`:圖已被 lightbox 的 <a> 包起來,
      維持子選擇器會讓整段樣式**靜默失效**(邊框/寬度全掉)。 */
.nx-proof { display: grid; grid-template-columns: 1fr 108px 1fr; align-items: stretch; gap: 10px; max-width: 1060px; margin: 0 auto 56px; }
.nx-proof figure { margin: 0; background: var(--t-card); border: 1px solid var(--t-line); border-radius: var(--t-radius-lg); padding: 16px; box-shadow: var(--t-shadow); display: flex; flex-direction: column; }
.nx-proof figure img { border: 1px solid var(--t-line); border-radius: 3px; margin-inline: auto; margin-block: auto; display: block; }
.nx-proof figure a { display: block; margin-block: auto; }
.nx-proof figure a img { margin-block: 0; }
.nx-proof figure:first-child img { max-width: 430px; width: 100%; }
/* 2026-08-18:左格由截圖改成示意圖(nx-mock)⇒ 用同樣的 margin-block:auto 吃掉剩餘空間,兩格才會對齊 */
.nx-proof figure .nx-mock { margin-block: auto; width: 100%; }
/* 2026-08-17:figcaption 改成兩層——①② 動作標題(深色)+ 補充說明(淺色小字)。
   出身:業主指出這一段對沒有操作經驗的訪客太抽象,加步驟序號讓「這是一次操作的前後」讀得出來。 */
.nx-proof figcaption { font-size: 13px; color: var(--t-text-soft); text-align: center; margin-top: 12px; line-height: 1.6; }
.nx-proof figcaption b { display: block; font-size: 14.5px; color: var(--t-ink); font-weight: 700; margin-bottom: 4px; }
.nx-proof figcaption small { display: block; font-size: 12.5px; line-height: 1.65; }
.nx-proof__arrow { text-align: center; color: var(--t-accent); align-self: center; }
.nx-proof__click { display: block; font-size: 12.5px; margin-bottom: 6px; font-weight: 500; }
.nx-proof__arrow svg path { stroke-dasharray: 60; animation: dash 2.4s ease-in-out infinite; }
@keyframes dash { 0% { stroke-dashoffset: 60; } 55%,100% { stroke-dashoffset: 0; } }

/* ══════ 5b-0 介面示意圖(nx-mock)══════ */
/* 2026-08-18 業主裁示:上部三層**改用重繪的示意圖,不用真截圖**。
   業主原話:截圖是測試資料、畫面又小看不出細節,「不一定很討喜」;
   ⭐**真實性的責任已經由 7 支影片承擔**(業主:「影片其實我覺得是夠了」)
     ⇒ 這三層的工作變成「把架構講清楚 + 好感度」,不是「證明這是真的軟體」。
   ⭐ 媒材=**DOM/CSS 畫,不是 AI 生圖**:要傳達的是**精確資訊**(欄位叫什麼、那三顆鈕、那顆是灰的),
      生圖畫不出正確的中文欄位名、每改一個字要重抽;DOM 畫則**任何解析度都清晰**
      ——直接解掉業主說的「畫面小看不出細節」,手機也讀得到。
      (出身:`/quick-tour` 把資訊型的圖丟給生圖,業主判 0 分「反而是干擾」;media-choice 失敗模式 B。)
   ⭐ 一組元件畫五張圖 ⇒ 整體感統一(業主:「整體頁面的搭配」)。
   ⛔ 示意圖裡**不放任何真實個資**:資料值一律用灰條(`__fill`)或代稱,這本身也呼應「資料在你自己事務所」。 */
.nx-mock { background: var(--t-card); border: 1px solid var(--t-line); border-radius: 10px; overflow: hidden; font-size: 11.5px; line-height: 1.5; color: var(--t-ink); }
.nx-mock__bar { display: flex; align-items: center; gap: 8px; padding: 8px 11px; background: var(--t-paper-soft); border-bottom: 1px solid var(--t-line); }
.nx-mock__bar b { font-size: 11.5px; font-weight: 600; color: var(--t-text-soft); letter-spacing: .02em; }
.nx-mock__dots { display: flex; gap: 4px; }
.nx-mock__dots i { width: 6px; height: 6px; border-radius: 50%; background: var(--t-line); display: block; }
.nx-mock__body { padding: 11px 12px 13px; }

/* 分頁(進行中/到期/追蹤) */
.nx-mock__tabs { display: flex; gap: 6px; margin-bottom: 10px; flex-wrap: wrap; }
.nx-mock__tabs span { font-size: 11px; padding: 3px 10px; border-radius: 5px 5px 0 0; border: 1px solid var(--t-line); border-bottom: 0; color: var(--t-text-soft); background: var(--t-paper-soft); }
.nx-mock__tabs span.on { background: var(--t-card); color: var(--t-ink); font-weight: 700; box-shadow: inset 0 2px 0 var(--t-accent); }

/* 表格示意:欄名列 + 資料列。資料值用 __fill 灰條,不放真資料 */
.nx-mock__tbl { display: grid; gap: 1px; background: var(--t-line); border: 1px solid var(--t-line); border-radius: 6px; overflow: hidden; }
.nx-mock__tr { display: grid; grid-template-columns: var(--mock-cols, 1fr 1fr 1fr); gap: 1px; background: var(--t-line); }
.nx-mock__tr > * { background: var(--t-card); padding: 6px 8px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nx-mock__tr--head > * { background: var(--t-paper-soft); font-weight: 700; color: var(--t-text-soft); font-size: 11px; }
/* ⛔⭐ 2026-08-19 第一層例稿表是全頁最擠的一張(三欄中文值塞在 ≤242px 的列寬裡)。
   實測 991:三欄實需 85 / 81.3 / 73.5 = 239.8,可用 240 ⇒ **只剩 0.2px**,任何字型誤差都會讓它截字。
   ⇒ 儲存格內距收到 7px(省 6px),且 `--mock-cols` 改用**實測需求比**(1.16 : 1.11 : 1)而不是拍腦袋的 1.3/1/1。 */
.nx-layers__unit .nx-mock__tr > * { padding-left: 7px; padding-right: 7px; }
.nx-mock__tr--on > * { background: rgba(30, 108, 255, .06); }
.nx-mock__fill { display: inline-block; height: 7px; border-radius: 4px; background: var(--t-line); vertical-align: middle; width: var(--w, 70%); }

/* 表單示意:標籤 + 已填灰條 */
.nx-mock__form { display: grid; gap: 7px; }
/* ⛔ 實測:4.6em(52.9px)放不下四個中文字,「統一編號/戶籍地址/通訊地址」全被折成兩行
      ⇒ 那一格比左右兩格高 111px。加寬 + nowrap,由構造保證不折行。 */
.nx-mock__f { display: grid; grid-template-columns: 5.6em 1fr; align-items: center; gap: 8px; }
.nx-mock__f b { font-size: 11px; font-weight: 600; color: var(--t-text-soft); text-align: right; white-space: nowrap; }
.nx-mock__f i { display: block; height: 20px; border: 1px solid var(--t-line); border-radius: 4px; background: var(--t-paper-soft); position: relative; }
.nx-mock__f i::after { content: ""; position: absolute; left: 7px; top: 50%; transform: translateY(-50%); height: 6px; width: var(--w, 55%); border-radius: 3px; background: var(--t-line); }
.nx-mock__f--on i { border-color: var(--t-accent); background: rgba(30, 108, 255, .05); }

/* 按鈕面板示意(系統設定) */
.nx-mock__panel { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
.nx-mock__panel span { border: 1px solid var(--t-line); border-radius: 5px; background: var(--t-paper-soft); padding: 8px 4px; text-align: center; font-size: 11px; color: var(--t-ink); }
.nx-mock__panel span.more { color: var(--t-text-soft); border-style: dashed; background: transparent; }

/* 行動鈕(編輯/收據&封面/結案) */
.nx-mock__acts { display: flex; gap: 5px; }
/* 主畫面上方那排功能鈕:靠右、允許換行(窄螢幕會排成兩列,不擠壓標題) */
.nx-mock__acts--nav { margin-left: auto; flex-wrap: wrap; justify-content: flex-end; gap: 4px; }
.nx-mock__b { font-size: 10.5px; padding: 2px 7px; border-radius: 4px; border: 1px solid var(--t-line); background: var(--t-card); color: var(--t-ink); white-space: nowrap; }
.nx-mock__b--on { border-color: var(--t-ink); background: var(--t-ink); color: #fff; }
/* ⛔ 灰態(還沒輪到的那一步)。第一版用 #9aa3b2 ⇒ 對比 **2.54:1**,五個寬度各 6 個 fail。
      ⚠️ 真實 UI 的 disabled 元件 WCAG 1.4.3 可豁免,**但這是示意圖=內容,豁免不適用**。
      ⇒ 改成靠**虛線框 + 灰底**表現未啟用,字色加深到過 AA;與 --on 的深墨底白字仍然一眼可分。 */
.nx-mock__b--off { color: #5f6b7d; border-style: dashed; background: var(--t-paper-soft); }
.nx-mock__b--primary { border-color: var(--t-seal); background: var(--t-seal); color: #fff; font-weight: 700; }

/* 標註(引線 + 說明),用來把重點指出來 */
.nx-mock__cal { margin: 9px 0 0; font-size: 11.5px; color: var(--t-accent-dn); display: flex; align-items: center; gap: 6px; }
.nx-mock__cal::before { content: ""; width: 14px; height: 1px; background: currentColor; flex: 0 0 auto; }

/* ══════ 5b 系統架構:三層(nx-layers)══════ */
/* 2026-08-18 業主指示「以視覺表現架構,不一定都要用文字」+「先講由那些單元組建、再講那些設計讓案件跑得快」。
   ⭐ 媒材=**C 混合**(業主拍板):骨架與中文標籤走 DOM/CSS(可選取、可讀屏、對比度可控),
      每一格嵌一小塊**真截圖裁切**負責真實感。⛔ 中文一律不烤進圖。
   ⭐ 構圖=**三層 + 由上而下的資料流**,不是六格環繞:
      環繞式在 1440 實測會在中欄留兩個大洞、而且零連線 = 只是兩排卡片(memory: visual-tension-not-tidy-rows)。
      三層對應系統的真實結構:先設好的(例稿/客戶/設定)→ 每天在用的(案件)→ 自己長出來的(文書/簿冊)。
   ⭐ 主從靠**尺寸階差**做:中層 shot 高度是上層的 3.4 倍,而且只有它有 2px 外框與大陰影。 */
.nx-layers { max-width: 1060px; margin: 0 auto; }
.nx-layers__tag { display: flex; align-items: center; gap: 14px; margin: 0 0 16px; }
.nx-layers__tag b { font-size: 13px; letter-spacing: .1em; color: var(--t-ink); white-space: nowrap; font-weight: 700; }
.nx-layers__tag em { font-style: normal; font-size: 13px; color: var(--t-text-soft); }
.nx-layers__tag::after { content: ""; flex: 1; height: 1px; background: var(--t-line); }

.nx-layers__seed { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; align-items: stretch; }
.nx-layers__unit { background: var(--t-card); border: 1px solid var(--t-line); border-radius: var(--t-radius-lg); overflow: hidden; display: flex; flex-direction: column; }
/* 2026-08-18:`.shot` 由「截圖裁切框」改為「示意圖的托底」——裡面裝 .nx-mock,高度由內容決定。
   ⛔ 不再給固定 height:示意圖是畫的,不需要裁切,固定高度只會把它切掉。 */
/* ⭐ 2026-08-19 單元高度參差不齊的真正原因:三張示意圖的內容高度天生不同
   (實測 1440:223.5 / 261.5 / 219.8,差 41.7px),而 `.shot` 高度跟著內容走
   ⇒ 灰底與分隔線在三張卡上各停在不同高度。⇒ 改成 flex:1 吃掉剩餘空間,三格等高。
   ⛔ 不用垂直置中:三張是「三扇窗」,視窗標題列頂端對齊才有一整排的秩序感,
      多出來的空間一律落在下方。`.txt` 的 margin-top:auto 因此拿掉(同一件事別做兩次)。 */
.nx-layers__unit .shot { flex: 1 0 auto; padding: 14px 14px 16px; background: var(--t-paper-soft); border-bottom: 1px solid var(--t-line); }
.nx-layers__unit .txt { display: block; padding: 13px 15px 16px; }
/* ⛔⭐ 2026-08-19 「字級忽大忽小」的根因(業主 2026-08-19 指出):
   原本寫 `.nx-layers__unit b` / `em`(**元素選擇器**),而卡片裡面裝的是 `.nx-mock` 示意圖
   ⇒ 示意圖自己的 `.nx-mock__bar b`(11.5px)與 `.nx-mock__f b`(11px)specificity 同為 (0,1,1),
   但本區塊寫在後面 ⇒ **後者贏**,示意圖裡的視窗標題與欄位標籤全被撐成 15.5px
   (實測 8 個),同一張圖裡字級差 4px。
   ⇒ 外層 wrapper 的元素選擇器**一律限縮到自己的子區**(這裡是 `.txt`),不要洩進巢狀元件。 */
.nx-layers__unit .txt b { display: block; font-size: 15.5px; color: var(--t-ink); margin-bottom: 3px; }
.nx-layers__unit .txt em { font-style: normal; font-size: 13px; color: var(--t-text-soft); line-height: 1.7; display: block; }
/* ⛔⭐ 2026-08-19 實測 991:光靠 `.shot{flex:1}` 不夠。卡片總高雖然被 grid 拉齊,
   但三張的說明文字行數不同(1440 都是 3 行、1200以下變成 3/4/4 行)
   ⇒ `.txt` 高度不同 ⇒ 分隔線又停在不同高度(實測 245.5 / 267.6 / 267.6)。
   ⭐ 真正的表達:「圖區」與「文字區」是**三張卡共用的兩行**,不是每張卡自己的事
   ⇒ 用 subgrid 把兩行提到父層。
   ⚠⚠ 這一塊**必須寫在 `.nx-layers__unit` 基礎規則之後**——@supports 不增加具體度,
      寫在前面時 `display:grid` 會被基礎的 `display:flex` 贏掉(實測過:supports=true 但 display 仍為 flex)。
   ⚠ 不支援 subgrid 的瀏覽器退回 flex 行為——只是線不齊,不會壞。 */
@supports (grid-template-rows: subgrid) {
    .nx-layers__seed { grid-template-rows: auto auto; }
    .nx-layers__unit { grid-row: span 2; display: grid; grid-template-rows: subgrid; }
}

/* 流向:一條線 + 箭頭。⭐ 畫在自己的盒子裡,不用 % 絕對定位 ⇒ 由構造保證不會撞到文字
   (出身:260817_14 流星 % 定位在 1200/991 撞文字) */
.nx-layers__pipe { display: flex; flex-direction: column; align-items: center; padding: 22px 0 18px; }
.nx-layers__pipe span { font-size: 13px; letter-spacing: .06em; color: var(--t-accent-dn); margin-bottom: 6px; }
.nx-layers__pipe i { display: block; width: 1px; height: 34px; background: var(--t-line-strong, #b9c2d0); position: relative; }
.nx-layers__pipe i::after { content: ""; position: absolute; bottom: -1px; left: -4px; border: 4px solid transparent; border-top-color: var(--t-line-strong, #b9c2d0); }

.nx-layers__core { border: 2px solid var(--t-accent); border-radius: var(--t-radius-lg); background: var(--t-card); padding: 18px; box-shadow: var(--t-shadow-lift); }
.nx-layers__core .shot { display: block; }
/* 主角的示意圖放大一級:字大一點、列高一點,讓「三顆鈕在同一列」在手機也讀得到 */
.nx-layers__core .nx-mock { font-size: 12.5px; }
.nx-layers__core .nx-mock__tr > * { padding: 8px 10px; }
.nx-layers__core .nx-mock__tabs span { font-size: 12px; padding: 4px 13px; }
.nx-layers__core .cap { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px; margin-top: 16px; }
.nx-layers__core .cap b { font-size: 19px; color: var(--t-ink); }
.nx-layers__core .cap em { font-style: normal; font-size: 14.5px; color: var(--t-text-soft); }
.nx-layers__tabs { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
.nx-layers__tabs span { font-size: 13px; border: 1px solid var(--t-line); border-radius: 20px; padding: 3px 12px; color: var(--t-text-soft); }
.nx-layers__tabs span:first-child { background: var(--t-ink); color: #fff; border-color: var(--t-ink); }

.nx-layers__out { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
.nx-layers__out > div { border: 1px solid var(--t-line); border-radius: var(--t-radius-lg); padding: 16px 16px 18px; background: var(--t-paper-soft); }
/* 2026-08-18:第三層也加圖像(業主:「多用一些圖形圖像方式去表現」)。
   ⛔ 圖示不是裝飾:四個各自畫的是那份產出物本身(蓋印的公證書/夾附件的請求書/收據/簿冊),
      講不出對應那一份就不該放。 */
.nx-layers__out svg { width: 26px; height: 26px; color: var(--t-accent-dn); display: block; margin-bottom: 9px; }
.nx-layers__out b { display: block; font-size: 15.5px; color: var(--t-ink); margin-bottom: 3px; }
.nx-layers__out em { font-style: normal; font-size: 13px; color: var(--t-text-soft); line-height: 1.65; display: block; }
/* ⭐「還有更多」的收尾:業主的策略=給重要而印象深刻的,其餘讓對方自己腦補。
   所以這一行刻意用「…以及」帶過一串,不展開成清單。 */
.nx-layers__more { margin: 14px 0 0; font-size: 13px; color: var(--t-text-soft); text-align: right; }
.nx-layers__note { text-align: center; color: var(--t-text-soft); font-size: 14.5px; margin: 40px auto 0; max-width: 44em; }
.nx-layers__note b { color: var(--t-ink); }

/* ══════ 5c 讓案件跑得快的設計(nx-fast)══════ */
/* 2026-08-18 業主追加:「系統其實**更重要是在很多細節的地方**,我們都有去做一些鋪陳安排去設計,
   針對一些工作流程…大架構有了,但這些地方可以再去補強、做一些強化的呈現。」
   ⇒ 結構=**一個主角 + 依「一件案子的四個時刻」分組的 12 項**,不是一排等大的功能卡。
   ⭐ 分組用「時刻」不用「功能類別」——業主要的是**工作流程上的鋪陳**,不是功能清單。
   ⛔ 12 項全部有畫面或程式實證,零推論(查證時推翻了兩個猜測:
      `customerNPIDCheck` 其實是「身分證補換發查詢」、`zipCode` 其實是「地區資料管理」設定表)。 */
.nx-fast { max-width: 1060px; margin: 0 auto; }
.nx-fast__hero { display: grid; grid-template-columns: 1.12fr 1fr; gap: 30px; align-items: center;
    background: var(--t-card); border: 1px solid var(--t-line); border-radius: var(--t-radius-lg); padding: 22px; box-shadow: var(--t-shadow); }
.nx-fast__hero .shot { display: block; }
.nx-fast__hero .txt { min-width: 0; }
/* ⛔ 同上:這裡的 `.shot` 也裝著 `.nx-mock`,`.nx-fast__hero p`(0,1,1)會贏過
   `.nx-mock__cal`(0,1,0) ⇒ 實測註解字被撐成 15px(設計值 11.5px)。同樣限縮到 `.txt`。 */
.nx-fast__hero .txt b { display: block; font-size: 20px; line-height: 1.5; color: var(--t-ink); margin-bottom: 8px; }
.nx-fast__hero .txt p { margin: 0; font-size: 15px; color: var(--t-text-soft); }

.nx-fast__groups { display: grid; grid-template-columns: repeat(4, 1fr); gap: 30px; margin-top: 46px; }
.nx-fast__g > b { display: block; font-size: 13px; letter-spacing: .06em; color: var(--t-ink);
    padding-bottom: 9px; border-bottom: 2px solid var(--t-accent); }
.nx-fast__i { display: grid; grid-template-columns: 24px 1fr; gap: 11px; padding: 15px 0; border-top: 1px solid var(--t-line); }
.nx-fast__i:first-of-type { border-top: 0; }
.nx-fast__i svg { width: 22px; height: 22px; color: var(--t-accent-dn); display: block; margin-top: 2px; }
.nx-fast__i b { display: block; font-size: 15px; color: var(--t-ink); margin-bottom: 2px; }
.nx-fast__i span { font-size: 13px; color: var(--t-text-soft); line-height: 1.7; display: block; }

.nx-videos__lead { text-align: center; color: var(--t-text-soft); margin-bottom: 24px; }
/* ⛔⭐⭐ 2026-08-19 影片牆 v2「放映室」（業主：「UI 感覺真的很扣分，可以再努力一下嗎」）
   ── v1 的檢討（v1 = 同日稍早那版：主打卡獨佔一列 + 6 支 3 欄 + maxresdefault）：
      量測面全好了（主角的圖真的最大、零裁切、基線齊），**但視覺方向錯了**。
   ① ⭐**把「舊」放大了**：縮圖是 Windows XP/7 時代的視窗——標題列、紅叉、工作列、灰藍 chrome。
      280px 時是一團灰，378px 時看得清楚了，而**看清楚的是「這程式很舊」**。
      根因＝我用「看得清」當判準；但這一段的工作是**讓人想點**（它是影片封面），不是讓人讀。
      ⭐ 真實性早就由「有 7 支實拍影片」這件事承擔了（content-decisions §二十八 的樞紐），縮圖不必再扛。
   ② **7 顆一模一樣的藍色圓鈕＝噪音**：全頁最搶眼的東西重複 7 次，把主打卡的標題壓過去。焦點只能有一個。
   ③ **白底 + 1px 灰框 + 圓角，跟全頁其他區塊一模一樣**＝業主 2026-07-25 批過的「排排站」；
      而且主打卡被中間那條 border 切成兩半（左深截圖／右純白），兩邊沒有任何東西縫起來。
   ── 解法（不去修截圖本身——改不了也不該改，改的是它的角色與容器）：
   Ⓐ **整段翻深色**：淺灰截圖放深底上會自己「發光」像螢幕；放白底上是「一堆白裡框一張灰」，越框越髒。
   Ⓑ **裁掉視窗 chrome**：`aspect-ratio` 收窄 + `object-position` 置中，把標題列與工作列切出畫面——**舊感的來源就是它們**。
   Ⓒ **統一調性**：7 張不同亮暗的截圖套同一層暗場漸層 + 一點品牌藍，變成同一組東西。
   Ⓓ **播放鍵分級**：主打卡一顆實心大的；其餘 6 顆只留細白圈，hover 才實心 ⇒ 焦點回到主打卡。
   ⚠️ 全部掛在修飾子 `.nx-videos--screen` 上：**首頁那 4 支仍走淺色白卡版**，不受影響。 */
.nx-videos { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }

/* ── 元件本體（兩版共用）───────────────────────────────────────────── */
.nx-vid { background: var(--t-card); border: 1px solid var(--t-line); border-radius: var(--t-radius-lg); overflow: hidden; display: block; transition: .18s; }
.nx-vid:hover { box-shadow: var(--t-shadow-lift); transform: translateY(-3px); border-color: var(--t-accent); }
.nx-vid .thumb { display: block; position: relative; }
.nx-vid img { aspect-ratio: 16/9; object-fit: cover; width: 100%; height: auto; display: block; }
.nx-vid .bd { display: block; padding: 13px 15px 15px; }
.nx-vid .t { display: block; font-size: 15px; font-weight: 600; line-height: 1.55; color: var(--t-ink); }
.nx-vid .w { display: block; margin-top: 4px; font-size: 13px; line-height: 1.65; color: var(--t-text-soft); }
.nx-vid .play {
    position: absolute; inset: 0; margin: auto; width: 52px; height: 52px; border-radius: 50%;
    background: rgba(22, 87, 214, .9); box-shadow: 0 0 0 3px rgba(255, 255, 255, .78), 0 6px 18px rgba(16, 26, 46, .3);
    transition: .18s; z-index: 2;
}
.nx-vid .play::after { content: ""; position: absolute; inset: 0; margin: auto; width: 0; height: 0; border-left: 15px solid #fff; border-top: 9px solid transparent; border-bottom: 9px solid transparent; transform: translateX(3px); }
.nx-vid:hover .play { background: var(--t-accent); transform: scale(1.06); }

/* ══ 影片牆 v2：放映室（.nx-videos--screen，目前只有 /system 用）══ */
/* 主打卡獨佔一列：4 欄制裡它與普通卡同列 ⇒ 高度被 grid stretch 綁死，
   16:9 於 581 寬需 327px 高、普通卡只有 235px ⇒ 「又大又不裁切」數學上做不到。 */
.nx-videos--screen { position: relative; grid-template-columns: repeat(3, 1fr); gap: 34px 22px; }
.nx-videos--screen > .nx-vid--lead { grid-column: 1 / -1; margin-bottom: 10px; }
/* 主打卡後方的一團藍光＝「投影」的暗示；純 CSS，零圖檔 */
.nx-videos--screen::before {
    content: ""; position: absolute; left: 50%; top: -8%; width: min(1040px, 94%); height: 58%;
    transform: translateX(-50%); pointer-events: none; z-index: 0;
    background: radial-gradient(58% 62% at 50% 42%, rgba(30, 108, 255, .18), transparent 72%);
}

/* 卡片不再是卡片——去掉白底、外框、圓角與整張浮起 */
.nx-videos--screen .nx-vid { position: relative; z-index: 1; background: transparent; border: 0; border-radius: 0; overflow: visible; color: var(--t-on-dark); }
.nx-videos--screen .nx-vid:hover { box-shadow: none; transform: none; border-color: transparent; }

/* 縮圖＝一台亮著的螢幕。
   ⭐ `aspect-ratio` 由 16/9 收窄成 16/7.8 ⇒ 上下各切掉約 6.7%，正好是視窗標題列與工作列。
   ⛔ 這是**顯示層的裁切**，不是重截或換圖（content-decisions §三）——原檔一個位元都沒動。 */
.nx-videos--screen .thumb {
    display: block; position: relative; overflow: hidden; border-radius: 12px;
    aspect-ratio: 16 / 7.4; background: #060b16;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .09), 0 16px 36px rgba(0, 0, 0, .45);
}
.nx-videos--screen img {
    width: 100%; height: 100%; aspect-ratio: auto; object-fit: cover; object-position: 50% 48%;
    filter: saturate(.9) contrast(1.05) brightness(.87); transition: transform .5s ease, filter .35s ease;
}
/* 暗場：把 7 張亮暗不一的舊截圖收成同一組，並讓它與深色段底融在一起。
   ⚠️ `.play` 是真實子元素、`::after` 視為最後一個子元素 ⇒ 不給 z-index 的話暗場會蓋住播放鍵。 */
.nx-videos--screen .thumb::after {
    content: ""; position: absolute; inset: 0; pointer-events: none; z-index: 1;
    background:
        linear-gradient(180deg, rgba(6, 11, 22, .22) 0%, rgba(6, 11, 22, 0) 38%, rgba(6, 11, 22, .26) 100%),
        linear-gradient(0deg, rgba(30, 108, 255, .06), rgba(30, 108, 255, .06));
    transition: opacity .35s ease;
}
/* hover 才把它點亮：亮度差是讓一排配角安靜下來、主打卡跳出來的主力手段 */
.nx-videos--screen .nx-vid:hover img { transform: scale(1.04); filter: saturate(.95) contrast(1.04) brightness(1); }
.nx-videos--screen .nx-vid:hover .thumb::after { opacity: .45; }

/* 文字直接躺在深底上，不再是「另外半張白卡」 */
.nx-videos--screen .bd { display: block; padding: 15px 2px 0; }
.nx-videos--screen .t { color: #fff; font-size: 15.5px; font-weight: 600; line-height: 1.5; }
.nx-videos--screen .w { color: var(--t-on-dark-soft); font-size: 13px; margin-top: 5px; line-height: 1.7; }
.nx-videos--screen .nx-vid:hover .t { color: var(--t-cyan); }

/* 播放鍵分級：配角只留細白圈（hover 才實心），主角才是實心藍 ⇒ 全段只有一個焦點 */
.nx-videos--screen .play {
    width: 46px; height: 46px; background: rgba(255, 255, 255, .10); backdrop-filter: blur(8px);
    box-shadow: inset 0 0 0 1.5px rgba(255, 255, 255, .66);
}
.nx-videos--screen .play::after { border-left-width: 13px; border-top-width: 8px; border-bottom-width: 8px; }
.nx-videos--screen .nx-vid:hover .play {
    background: var(--t-accent); transform: scale(1.06);
    box-shadow: inset 0 0 0 1.5px var(--t-accent), 0 8px 24px rgba(30, 108, 255, .5);
}

/* ── 主打卡：不用 border 切兩半，改用留白把圖與文字分開 ── */
.nx-videos--screen .nx-vid--lead { display: grid; grid-template-columns: 54% 1fr; gap: 0 46px; align-items: center; }
.nx-videos--screen .nx-vid--lead .thumb {
    aspect-ratio: 16 / 8.1;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .14), 0 28px 64px rgba(0, 0, 0, .55);
}
/* ⭐ 主打卡不降亮度，也少一層暗場——全段唯一「開著的螢幕」 */
.nx-videos--screen .nx-vid--lead img { filter: saturate(.92) contrast(1.04) brightness(1); }
.nx-videos--screen .nx-vid--lead .thumb::after {
    background:
        linear-gradient(180deg, rgba(6, 11, 22, .16) 0%, rgba(6, 11, 22, 0) 40%, rgba(6, 11, 22, .20) 100%),
        linear-gradient(0deg, rgba(30, 108, 255, .05), rgba(30, 108, 255, .05));
}
.nx-videos--screen .nx-vid--lead .play {
    width: 68px; height: 68px; background: var(--t-accent); backdrop-filter: none;
    box-shadow: 0 0 0 10px rgba(30, 108, 255, .15), 0 14px 36px rgba(0, 0, 0, .45);
}
.nx-videos--screen .nx-vid--lead .play::after { border-left-width: 19px; border-top-width: 11px; border-bottom-width: 11px; }
.nx-videos--screen .nx-vid--lead .bd { padding: 0; }
.nx-videos--screen .nx-vid--lead .eb { display: block; font-size: 12.5px; font-weight: 500; letter-spacing: .16em; color: var(--t-cyan); margin-bottom: 12px; }
.nx-videos--screen .nx-vid--lead .t { font-size: 27px; font-weight: 700; line-height: 1.4; }
.nx-videos--screen .nx-vid--lead .w { font-size: 16px; margin-top: 10px; }
.nx-videos--screen .nx-vid--lead .note { display: block; margin-top: 16px; font-size: 15px; line-height: 1.85; color: var(--t-on-dark-soft); max-width: 30em; text-wrap: balance; }
.nx-videos--screen .nx-vid--lead .go { display: inline-flex; align-items: center; gap: 7px; margin-top: 22px; font-size: 15px; font-weight: 600; color: var(--t-cyan); }
.nx-videos--screen .nx-vid--lead .go i { font-style: normal; transition: transform .18s; }
.nx-videos--screen .nx-vid--lead:hover .go i { transform: translate(2px, -2px); }
.nx-videos--screen .nx-vid--lead:hover .t { color: #fff; }

/* ══════ 6 故事 ══════ */
/* 2026-08-17 業主核准加場景圖(「也可以用壓底色背景圖」)。
   ⭐ 媒材判定:這一段要傳達的是**情緒氛圍**(等了十年的漫長,與終於放下的那一線光)
      ⇒ 生成圖,不用 CSS 畫(CSS 畫不出真實光暈/景深/底片顆粒——這是 2026-08-16 已坐實的教訓)。
   ⭐ 主體=**行星暗面邊緣正在升起的一線晨光**,與既有 12 顆內頁鏡頭**主體不同**(零太空船,
      主角是光本身在越過邊界),不是同一張圖換位置;場景聖經(深藍底/藍青/底片顆粒/無色帶)照收。
   ⚠️ 唯一破格=日出光點是**暖色**,全站唯二(其餘皆藍青)。刻意保留:這一段是全站唯一講「人」的
      段落,暖光有內容依據不是裝飾;面積只有一個光點。業主可一句話推翻(改藍或整張拿掉)。
   ⭐ 落地走 **CSS background-image**:裝飾影像不進 DOM ⇒ 零 DOM 改動、零新 class、
      不必登記 fe-vocab(選擇器用既有的 `#story`,具體度 (1,0,0) 也不會被 theme.css 壓過)。
   ⭐ 壓底 overlay 是**水平漸層**不是均勻暗罩:左側文字帶壓到近乎純底色保住識讀,
      右側放到 .42 讓日出露出來——亮部本來就構圖在文字欄以外(沿用 inner-hero 的同一條規矩)。 */
#story {
    background-image:
        linear-gradient(90deg,
            rgba(8, 14, 26, .94) 0%,
            rgba(8, 14, 26, .92) 46%,
            rgba(8, 14, 26, .62) 68%,
            rgba(8, 14, 26, .26) 100%),
        url("images/story/story-dawn-1920.webp");
    background-repeat: no-repeat;
    background-size: cover;
    /* ⛔⭐⭐ 2026-08-18：原本是 `center`，已改 `center bottom`（業主裁示 B 案）。
       根因：圖是 1920×800（2.4:1）而區塊高度固定約 606px ⇒ 視窗越寬，區塊比例越扁，
       cover 把圖放越大、上下可見帶越窄⇒ 在右下角的行星**從底部被吃掉**。
       實測行星可見高度（圖座標尺）：≤1455寬=285、1920=190、2560=114、3440=55；
       網格最大不透明度同時從 100% 掉到 39%（2560）、6%（3440）——線框球形同存在。
       ⭐ 底部對齊後，可見帶恆以 y=800 收尾 ⇒ **任何寬度行星可見高度都是 285**，由構造保證。
       ⛔ 改這一行**必須同步**改 nx-fx.js 的 `par: 'xMidYMax slice'`（兩者是同一件事的兩半）。
       ℹ 寬度 ≤ 2.4×區塊高（約 1455px）時，cover 是高度主導、垂直零溢出 ⇒ 這一行對它們**無作用**，
         也就是業主已認可的一般桌機比例 **逐像素不變**。 */
    background-position: center bottom;
}
/* 手機:橫圖 cover 到直式容器會把行星裁掉 ⇒ 換一張**直式裁切**(不是把桌機版硬縮),
   文字在上、行星與日出在下,overlay 改成垂直漸層。 */
@media (max-width: 767px) {
    #story {
        background-image:
            linear-gradient(180deg,
                rgba(8, 14, 26, .95) 0%,
                rgba(8, 14, 26, .92) 46%,
                rgba(8, 14, 26, .62) 78%,
                rgba(8, 14, 26, .45) 100%),
            url("images/story/story-dawn-880p.webp");
        background-position: center bottom;
    }
}
/* ── #story 行星線框網格 + 流星(2026-08-17 業主口述)──────────────────────────
   業主原話:「我想要這個有點**時間流動**的感覺…因為我們這個網站其實跟宇宙沒有關係,
   可是其他頁我們用太空象徵前進,我覺得這邊可以沿用,但有點時間流動的感覺會更貼切,
   那它就會跟宇宙這個結合上了。」
   ⭐ 所以動態的任務**不是好看,是讓「宇宙語彙」與「等了十多年」這個時間主題接上**;
      沒有這個理由的動態就是裝飾,依憲章要拿掉。

   ⭐ 媒材=**純 SVG + CSS**,⛔ 零 canvas、零 rAF、零圖檔。
      哈吉那顆雷(`260710_05` §1)的真因是「繪製參數沒 clamp + rAF 迴圈沒隔離」
      (負半徑 → arc() 拋 IndexSizeError → 整頁 rAF 死),不是 canvas 本身;
      這裡連 rAF 都不開 ⇒ 結構上不可能再踩。JS 沒跑=靜態場景照,**不開天窗**。

   ⭐ 幾何(為什麼做得到「不用引擎也能轉」):正交投影下經線(通過兩極的大圓)
      一律投影成橢圓,而且**長軸恆等於 R**(下面 keyframes 的 scaleX 全是 1 就是這件事);
      繞極軸自轉時**緯線完全不動** ⇒ 會動的只有 14 條經線,
      而且 14 條共用**同一組** keyframes,靠 animation-delay 給相位差。
      λ 與 λ+180° 是同一個大圓,故一輪只跑半圈(整顆自轉週期=88s)。
      實測 CSS 內插 vs 真實幾何:半軸誤差 1.13px / 方位角 1.47°(R=540,即 0.2%)。

   ⭐ 對位:SVG 用**原圖座標**當 viewBox + `preserveAspectRatio slice`,
      與 `background-size:cover` + `background-position` **同語意** ⇒
      （⛔ 2026-08-18 起兩邊都是**底部對齊**：`xMidYMax slice` ↔ `center bottom`，改一邊必須改另一邊）
      容器怎麼縮放都跟著圖走,**零 JS 算式**。圓心/半徑由圖檔實測擬合(殘差 <1.5px):
      桌機 1920×800 → (1384.4, 1055.0) r=539.9;手機 880×900 → (802.7, 1180.0) r=593.2。

   ⛔ mask 的淡入區間**是避開文字帶用的,不是美術選擇**。**改文字長度或字級要重量一次**，
      否則網格會爬進字底下。⚠ 2026-08-18 已搬家：淡入區間不再寫在 SVG（圖座標），
      改寫在下方 `.nx-mesh { mask-image }`（**區塊座標** 74%→96%）——理由見那一段。
   ⛔ reduced-motion 用 `animation-play-state:paused` 而**不是** `animation:none`:
      後者會讓 14 條經線全部退回「沒有 transform 的同一顆圓」=畫面只剩一個圈,網格消失。 */
/* ⭐⭐ 淡入遮罩（2026-08-18 從 SVG `<mask>` 搬到這裡）。
   ⛔ 關鍵差別：舊版寫在**圖片座標**（viewBox y 560→736），新版寫在**區塊座標**（74%→96% 區塊高）。
      為什麼要換：文字的位置是跟**區塊**走的，圖却會隨寬度被 cover 放大 ⇒ 同一行字在圖座標上
      會隨螢幕變寬而跑越低；把淡入帶釘在圖座標上，區塊一寬它就相對文字漂上來，網格爬進字底下。
      實測（最後一段文字上的網格強度）：1440寬 0.37（業主已認可的基準）；
      圖座標版 + 底部對齊 → 2560寬 會升到 **0.90**；改成區塊座標後→ 0.55，且**不再隨寬度發散**。
   ⭐ 數字怎麼來的（兩步，不是拍腦袋）：
      ① 先把舊值換算成等價的區塊座標 = **70%/92%**
         （業主認可的 1440 比例縮放率 0.7577：560×0.7577/606=70.0%；736×0.7577/606=92.0%）。
      ② 再跑**對比度硬檢**（藏文字截圖 → 取每行 ink 矩形內最亮底色算 WCAG），
         發現 70% 在寬螢幕會讓網格壓到最後一段：2560 寬 `一份選擇不同的重量。`
         從 13.63:1 掉到 **4.12:1（不足 AA 4.5）** ⇒ 整組往下推 4% 成 **74%/96%**。
      ⭐ 推完的實測：2560 寬 `strong` 4.12 → **10.61**、`我們把這個故事…` 3.26 → **5.01**；
         1440 寬也一併改善（同一行 3.26 → 4.43，=網格已完全不拉低對比），畫面上只差 24px。
      ⚠ 此段文字還有**與網格無關**的 AA 不足（照片星點穿透）：1440 寬最差 2.82:1，
         拿掉網格也一樣 ⇒ **不是 2026-08-18 這輪造成的**，已回報業主待裁示。
   ⛔ 改文案長度/字級讓區塊高度變了，這兩個百分比要**重量一次**（量法：文字最後一行 ink 下緣 / 區塊高）。 */
.nx-mesh {
    position: absolute; inset: 0; width: 100%; height: 100%;
    -webkit-mask-image: linear-gradient(to bottom, transparent 74%, #000 96%);
            mask-image: linear-gradient(to bottom, transparent 74%, #000 96%);
}
/* ⚠️ 只吃 `> g`,不可寫 `.nx-mesh *`:mask/clipPath 裡的 rect 與 circle 帶 fill 呈現屬性,
      被 CSS 覆蓋掉會讓遮罩整個失效(呈現屬性優先序低於任何 CSS 規則)。 */
/* ⚠️ 這裡**刻意不用 `var(--t-cyan)`**(#00c8d7):實測那個飽和度在暗底上讀起來像
      螢光 UI 線條,會跟日出搶戲(業主紅線「不搶戲」)。本值=同一個青提亮去飽和後的
      「大氣層/星光」質感;它是**裝飾線的材質**不是資訊色,故不進 token。 */
/* ⛔⭐⭐ 2026-08-18 寬螢幕閃動修復：這裡原本是 `vector-effect: non-scaling-stroke`，**已拿掉**。
      根因：non-scaling-stroke 要求描邊在**裝置座標**上算，而 14 條經線每幀都在改
      transform（scaleY 0.98→0→0.98）⇒ Chrome 無法快取描邊幾何，**每幀重算 14 條的
      stroke tessellation**；成本跟線在螢幕上的實際尺寸成正比，所以**只在寬螢幕發作**。
      ⭐ 實測（2560寬、1440 高、Chrome）：47.4ms/幀（21 FPS、尖峰 118ms）→ 15.3ms（65 FPS、尖峰 21ms）；
         1440 寬：30.7ms → 9.6ms。幀時**標準差 15.0 → 4.6**——業主看到的「閃動」就是這個差異。
      ⛔ `will-change: transform` 實測**完全無效**（47.8ms）⇒ 不是圖層問題，不要往那邊修。
      ⭐ stroke-width 由 1 改 **1.32** 是補償值：≤約1455px 時 cover 縮放率恆為 606/800=0.7577，
         1.32×0.7577≈1.0px，與原來一致（凍幀像素對比：差異像素數 6313→2269，餘下的全是抗鐘齒邊）；
         更寬時線會跟著行星一起放大，這是**對的**——線框屬於行星，本來就該同比例縮放。 */
.nx-mesh > g { fill: none; stroke: #8fd9ea; stroke-width: 1.32; stroke-opacity: .45; }
.nx-mesh--d .nx-mesh__mer {
    transform-box: view-box; transform-origin: 1384.4px 1055px;
    animation: nx-globe-spin 44s linear infinite;
}

@keyframes nx-globe-spin {
    0% { transform: rotate(0.000deg) scale(1.00000, 0.97815); }
    4.1667% { transform: rotate(32.343deg) scale(1.00000, 0.96978); }
    8.3333% { transform: rotate(52.191deg) scale(1.00000, 0.94482); }
    12.5% { transform: rotate(63.346deg) scale(1.00000, 0.90369); }
    16.6667% { transform: rotate(70.195deg) scale(1.00000, 0.84710); }
    20.8333% { transform: rotate(74.839deg) scale(1.00000, 0.77602); }
    25% { transform: rotate(78.255deg) scale(1.00000, 0.69165); }
    29.1667% { transform: rotate(80.936deg) scale(1.00000, 0.59546); }
    33.3333% { transform: rotate(83.155deg) scale(1.00000, 0.48907); }
    37.5% { transform: rotate(85.078deg) scale(1.00000, 0.37432); }
    41.6667% { transform: rotate(86.811deg) scale(1.00000, 0.25316); }
    45.8333% { transform: rotate(88.432deg) scale(1.00000, 0.12767); }
    50% { transform: rotate(90.000deg) scale(1.00000, 0.00000); }
    54.1667% { transform: rotate(91.568deg) scale(1.00000, 0.12767); }
    58.3333% { transform: rotate(93.189deg) scale(1.00000, 0.25316); }
    62.5% { transform: rotate(94.922deg) scale(1.00000, 0.37432); }
    66.6667% { transform: rotate(96.845deg) scale(1.00000, 0.48907); }
    70.8333% { transform: rotate(99.064deg) scale(1.00000, 0.59546); }
    75% { transform: rotate(101.745deg) scale(1.00000, 0.69165); }
    79.1667% { transform: rotate(105.161deg) scale(1.00000, 0.77602); }
    83.3333% { transform: rotate(109.805deg) scale(1.00000, 0.84710); }
    87.5% { transform: rotate(116.654deg) scale(1.00000, 0.90369); }
    91.6667% { transform: rotate(127.809deg) scale(1.00000, 0.94482); }
    95.8333% { transform: rotate(147.657deg) scale(1.00000, 0.96978); }
    100% { transform: rotate(180.000deg) scale(1.00000, 0.97815); }
}

/* 流星:週期長、可見窗短(飄過約 1.5s 後等十幾秒)=業主要的「偶爾會有流星飄逝」。
   ⛔ 旋轉角**必須寫在 keyframes 裡**:動畫的 transform 優先序高於 inline style,
      寫成 inline 的 rotate() 會被整組蓋掉(靜默失效,只會看到水平飛的線)。
   ⛔ 位置經幾何檢查:四條的掃掠矩形與文字框(含 12px 緩衝)**零相交**,
      所以流星不會跑到字底下影響對比度。改文字寬度要重跑那個檢查。 */
.nx-meteor {
    position: absolute; width: var(--nx-mt-len); height: 1.5px; opacity: 0;
    transform-origin: 0 50%;
    background: linear-gradient(90deg, rgba(160,225,245,0) 0%, rgba(190,235,250,.9) 78%, #fff 100%);
    animation: nx-meteor-fall var(--nx-mt-dur) linear infinite;
    will-change: transform, opacity;
}
@keyframes nx-meteor-fall {
    0%   { transform: rotate(var(--nx-mt-rot)) translate3d(0, 0, 0); opacity: 0; }
    3%   { opacity: .9; }
    11%  { transform: rotate(var(--nx-mt-rot)) translate3d(var(--nx-mt-dist), 0, 0); opacity: 0; }
    100% { transform: rotate(var(--nx-mt-rot)) translate3d(var(--nx-mt-dist), 0, 0); opacity: 0; }
}

/* 手機:網格不出(業主裁示「只留流星」;且實測手機文字框佔滿整段,沒有不壓字的位置) */
@media (max-width: 767px) {
    .nx-mesh { display: none; }
}
/* 捲出畫面暫停(nx-fx.js⑥ 用 IntersectionObserver 切換)。
   ⚠️ 用 paused 而非 animation:none,理由同下方 reduced-motion。 */
.nx-hero__bg.is-fxpaused .nx-mesh__mer,
.nx-hero__bg.is-fxpaused .nx-meteor { animation-play-state: paused; }

@media (prefers-reduced-motion: reduce) {
    .nx-mesh__mer { animation-play-state: paused; }
    .nx-meteor { display: none; }
}

.nx-story { position: relative; max-width: 920px; }
.nx-story h2 { font-size: clamp(25px, 3.2vw, 34px); margin-bottom: 28px; }
.nx-story p { font-size: 16.5px; color: var(--t-on-dark-soft); }
.nx-story em { font-style: normal; color: var(--t-cyan); font-family: var(--t-f-story); font-size: 20px; }
.nx-story__end { margin-top: 30px; padding-top: 24px; border-top: 1px solid var(--t-line-dark); }
.nx-story__end strong { color: #fff; }

/* ══════ 7 資料破口 ══════ */
.nx-gapline { max-width: 920px; margin: 0 auto 48px; }
.nx-gapline__cells { display: grid; grid-template-columns: repeat(7, 1fr); gap: 8px; position: relative; margin-top: 46px; }
/* ⛔ 2026-08-17:這兩處的 13px 橘字實量 **4.48**(差 AA 0.02),而且本來就違反
   content-decisions §十「小於 18px 的字不用品牌橘 --t-seal 當前景色」。
   ⭐ 之前整站掃描沒抓到,是因為這兩格的底畫在 **background-image(漸層)** 上、
      `backgroundColor` 是 transparent ⇒ 探針往上抓到 section 底,同一個盲點也讓
      `.is-full` 的白字被誤報成 1.12(那格是真的深藍底,屬**假失敗**)。
      ⇒ **底用漸層畫的元素,對比度探針一律要人工複核。**
   治法=**警示語意交給橘色的框線與斜紋,文字回到可讀的深灰**(線與底不受 §十 限制)。 */
.nx-gapline__cells::before {
    content: "這幾年補不回來"; position: absolute; left: 0; top: -36px;
    width: calc((100% - 48px) / 7 * 3 + 16px); text-align: center;
    font-size: 13px; font-weight: 600; color: var(--t-text); border-bottom: 1px solid var(--t-seal); padding-bottom: 5px;
}
.nx-gapline__cell { position: relative; height: 132px; border-radius: var(--t-radius); display: flex; align-items: flex-end; justify-content: center; padding-bottom: 12px; font-size: 13px; }
.nx-gapline__cell.is-empty {
    border: 1.5px dashed var(--t-seal);
    background: repeating-linear-gradient(-45deg, rgba(232,84,47,.05) 0 6px, rgba(232,84,47,.17) 6px 8px);
    color: var(--t-text);   /* 見上方註解:原 --t-seal 13px 實量 4.48 不過 AA 且違反 §十 */
}
.nx-gapline__cell.is-full { background: linear-gradient(180deg, var(--t-ink), var(--t-ink-mid)); color: rgba(255,255,255,.85); }

/* ── 資料堆疊(2026-08-17 業主要求)──────────────────────────────
   業主原話:第 4/5/6 年「除了卡片上的白字以外」沒有別的印象,要看得出**資料是有積累的**。
   做法=由下往上疊的橫層,層數隨年份遞增(1→4)⇒ 一眼看出「一年一年疊上去」。
   ⭐ 一層 = 6px 實 + 5px 空 = 11px;層數由 `data-stack` 決定,**不用 nth-child**
      (年份數一改 nth 就全錯位),也**不用行內 style**(平台鐵則禁)。
   ⚠️ 位置:`bottom: 36px` 讓出下方年份字(13px + padding-bottom 12px);
      4 層最高 44px,44+36=80 < 132 的格高,不會頂到上緣。 */
.nx-gapline__cell.is-full::before {
    content: ""; position: absolute; left: 18%; right: 18%; bottom: 36px;
    background: repeating-linear-gradient(to top,
        rgba(255,255,255,.40) 0 8px, transparent 8px 13px);
    border-radius: 2px;
}
/* 一層 = 8px 實 + 5px 空 = 13px。第一版一層只有 6px,第 4 年看起來像一條底線不像「一層資料」。 */
.nx-gapline__cell[data-stack="1"]::before { height: 8px; }
.nx-gapline__cell[data-stack="2"]::before { height: 21px; }
.nx-gapline__cell[data-stack="3"]::before { height: 34px; }
.nx-gapline__cell[data-stack="4"]::before { height: 47px; }
/* 最後一格(…)最高,再加一道更淡的「第五層」暗示還會繼續疊上去(36+47+5=88) */
.nx-gapline__cell[data-stack="4"]::after {
    content: ""; position: absolute; left: 18%; right: 18%; bottom: 88px; height: 8px;
    background: rgba(255,255,255,.16); border-radius: 2px;
}
.nx-gapline__legend { display: flex; gap: 28px; justify-content: center; margin-top: 18px; font-size: 13px; color: var(--t-text-soft); flex-wrap: wrap; }
.nx-gapline__legend .sw { display: inline-block; width: 14px; height: 14px; margin-right: 7px; vertical-align: -2px; border-radius: 3px; }
.nx-gapline__legend .sw.is-empty { border: 1.5px dashed var(--t-seal); background: repeating-linear-gradient(-45deg, rgba(232,84,47,.05) 0 3px, rgba(232,84,47,.2) 3px 5px); }
.nx-gapline__legend .sw.is-full { background: var(--t-ink); }
.nx-reasons { max-width: 740px; margin: 0 auto; padding: 0; list-style: none; }
.nx-reasons li { border-top: 1px solid var(--t-line); padding: 18px 0 18px 28px; position: relative; color: var(--t-text-soft); }
.nx-reasons li::before { content: ""; position: absolute; left: 0; top: 30px; width: 14px; height: 2px; background: var(--t-rule-grad); }
.nx-reasons b { color: var(--t-ink); font-weight: 700; }

/* ══════ 8 誠實區 ══════ */
.nx-honest {
    max-width: 830px; margin: 0 auto; position: relative; background: var(--t-card);
    border: 1px solid var(--t-line); border-top: 3px solid var(--t-seal);
    border-radius: var(--t-radius-lg); padding: 54px 48px 42px; box-shadow: var(--t-shadow);
}
.nx-honest__label { position: absolute; top: -14px; left: 44px; background: var(--t-seal); color: #fff; font-size: 12px; letter-spacing: .2em; padding: 5px 16px; margin: 0; border-radius: 3px; }
.nx-honest h2 { font-size: clamp(23px, 3vw, 31px); margin-bottom: 26px; }
.nx-honest__lead { color: var(--t-text-soft); font-size: 15.5px; margin: -10px 0 22px; }
.nx-honest ul { margin: 0; padding: 0; list-style: none; }
.nx-honest li { border-top: 1px dashed var(--t-line); padding: 18px 0; color: var(--t-text-soft); }
.nx-honest li b { display: block; color: var(--t-ink); font-weight: 700; font-size: 17px; }
/* 三層的分工(2026-08-17 業主指定):
   b = 他的處境(黑字) → __you = 他自己心裡的答案(淺字) → __view = **我們的觀點**。
   ⭐ __view 靠左側印章色細線標示「換人說話了」——與卡片上緣的 --t-seal 邊、
      「誠實說」標籤同一支色票,讀者不必看說明就知道這一行的出處。
   ⛔ 線用 seal 色、**字不用**:15.5px 屬小字,依 content-decisions §十 不拿品牌橘當前景色。 */
.nx-honest__you { display: block; margin-top: 5px; font-size: 15px; color: var(--t-text-soft); }
.nx-honest__view {
    display: block; margin-top: 11px; padding-left: 14px;
    border-left: 2px solid var(--t-seal);
    font-size: 15.5px; line-height: 1.9; color: var(--t-text);
}
.nx-honest__view em { font-style: normal; font-weight: 600; color: var(--t-ink); }
/* 「真的不必的兩種」:與上面四條分開,用實線+淺底,語氣才站得住(有真的說不,以退為進才可信) */
.nx-honest__real {
    margin-top: 26px; padding: 20px 22px; border-radius: var(--t-radius-lg);
    background: var(--t-paper); border: 1px solid var(--t-line);
}
.nx-honest__real b { display: block; color: var(--t-ink); font-size: 16px; margin-bottom: 7px; }
.nx-honest__real p { margin: 0; font-size: 15.5px; line-height: 1.9; color: var(--t-text); }
.nx-honest__real em { font-style: normal; font-weight: 600; color: var(--t-ink); }
.nx-honest__end { margin: 30px 0 0; padding-top: 22px; border-top: 1px solid var(--t-line); color: var(--t-text-soft); }
.nx-honest__end strong { color: var(--t-seal); }

/* ══════ 9 CTA / footer ══════ */
.nx-final { position: relative; max-width: 720px; text-align: center; }
.nx-final h2 { font-size: clamp(26px, 3.6vw, 38px); }
.nx-final p { color: var(--t-on-dark-soft); }
/* 接住猶豫的人那一句(2026-08-17):比下方的流程說明重一級——它回答的是「現在約會不會太早」,
   是這一段真正要解的心結,流程只是配套。用亮度做層次,不加色不加框。
   ⛔ 具體度:本檔下方有 `body.nx-theme--tech-trust .nx-final p`(0,2,2)把段落壓成 --t-on-dark-soft,
      單寫 `.nx-final__lead`(0,1,0)**會輸**(本輪第五次撞到這類覆蓋)⇒ 用三個 class = (0,3,0) 贏過它。 */
.nx-page--home .nx-final .nx-final__lead { font-size: 17.5px; color: #fff; margin-bottom: 14px; text-wrap: balance; }

/* ══════ RWD ══════ */
@media (max-width: 1024px) {
    .nx-hero__in { grid-template-columns: 1fr; gap: 48px; padding: 64px 0 76px; }
    /* 2026-08-17:原本 1024 以下降 2 欄(4 張剛好 2+2)。改三選一後 2 欄會變成 2+1 不對稱,
       且 1024 三欄實寬仍有約 300px 放得下 ⇒ 維持 3 欄,到 860 再一次降單欄。 */
    .nx-videos { grid-template-columns: repeat(2, 1fr); }
    /* ⛔ 實測 991:降 2 欄之後普通卡縮圖變 452px,但 lead 跨滿列只分到 46%
       ⇒ **主角的圖又比配角小了**。⇒ 兩欄時把圖的份額拉大。 */
    .nx-videos--screen { grid-template-columns: repeat(2, 1fr); gap: 30px 20px; }
    .nx-videos--screen .nx-vid--lead { grid-template-columns: 60% 1fr; gap: 0 34px; }
    .nx-videos--screen .nx-vid--lead .t { font-size: 23px; }
    .nx-videos--screen .nx-vid--lead .note { font-size: 14.5px; }
    /* 2026-08-18 /system:左右兩欄在 1024 會把右欄擠到每行 8 個字 ⇒ 直接降單欄 */
    .nx-fast__hero { grid-template-columns: 1fr; gap: 22px; }
    .nx-fast__groups { grid-template-columns: repeat(2, 1fr); gap: 24px 32px; }
    .nx-layers__out { grid-template-columns: repeat(2, 1fr); }
    /* ≤1024 第一層三卡最窄(991 時只剩 242px 的表寬)⇒ 示意圖降到 11px,
       與表頭同尺寸。≤860 卡片轉全寬之後還是 11px,一致且還有大量寬裕。 */
    .nx-layers__unit .nx-mock { font-size: 11px; }
}
@media (max-width: 860px) {
    .nx-theme--tech-trust { --t-sec-pad: 58px; }
    .nx-nav { display: none; }           /* 樣張:手機版導覽先收起(正式版=漢堡選單) */
    .nx-head__in { justify-content: space-between; }
    .nx-strip { grid-template-columns: repeat(2, 1fr); }
    .nx-strip > div:nth-child(3) { border-left: 0; }
    .nx-strip > div:nth-child(n+3) { border-top: 1px solid var(--t-line-dark); }
    .nx-router { grid-template-columns: 1fr; }
    .nx-router__opt.is-on::after { display: none; }
    .nx-router__out { padding: 26px 22px; }
    /* 手機:價值演示圖改上下堆疊,連接線改成垂直短線 */
    .nx-flow { grid-template-columns: 1fr; gap: 0; }
    .nx-flow__src .ring { width: 132px; height: 132px; }
    .nx-flow__wires { height: 46px; transform: rotate(90deg) scaleX(.14); transform-origin: center; }
    .nx-flow__outs { grid-template-columns: repeat(2, 1fr); gap: 10px; }
    .nx-flow__out { padding: 11px 12px 11px 36px; }
    .nx-flow__out i { left: 11px; }

    .nx-day { display: block; border-top: 0; }
    .nx-day__hd { display: none; }
    .nx-day__row { display: grid; grid-template-columns: 1fr; grid-template-areas: "t" "l" "r";
        border: 1px solid var(--t-line); border-radius: var(--t-radius-lg); margin-bottom: 14px; overflow: hidden; background: var(--t-card); }
    .nx-day__t { grid-area: t; justify-content: flex-start; padding: 10px 16px; background: var(--t-paper-soft); border-top: 0; }
    .nx-day__l, .nx-day__r { text-align: left; padding: 14px 16px; border-top: 1px solid var(--t-line); }
    .nx-day__l { grid-area: l; } .nx-day__r { grid-area: r; }
    /* ⭐ 手機欄標籤由 HTML 的 data-label 出,不寫死在 CSS。
       Why:.nx-day 同時服務首頁(沒有系統/用 notarPro)與 onboarding(這一步做什麼/你要準備什麼),
       寫死在 CSS = 第二個消費者的標籤必然全錯(2026-08-17 實測 onboarding 10 個標籤全錯)。
       用屬性選擇器把關:沒給 data-label 就完全不出標籤,而不是出一個錯的。 */
    .nx-day__l[data-label]::before,
    .nx-day__r[data-label]::before { content: attr(data-label); font-size: 11.5px; letter-spacing: .1em; display: block; margin-bottom: 3px; }
    .nx-day__l[data-label]::before { color: var(--t-text-soft); }
    .nx-day__r[data-label]::before { color: var(--t-accent); }
    .nx-day__row--key { border-color: var(--t-accent); }

    /* 2026-08-18 /system 架構三層:第一層三卡改直排 */
    .nx-layers__seed { grid-template-columns: 1fr; }
    /* 第三層在窄欄只剩 165px,12.5px 的字讀起來太吃力 ⇒ 放大 */
    .nx-layers__out em { font-size: 13.5px; }
    .nx-layers__more { font-size: 13.5px; }
    /* ⛔⭐ 2026-08-19 拿掉 `height:132px`——這是 `.shot` 還是「截圖裁切框」那一代的規則。
       8/18 改成裝示意圖之後它就变成一把鎖:實測 390 下三張示意圖實高 214.5 / 221.3 / 293.8,
       被 `overflow:hidden` **各裁掉 112.5 / 119.3 / 191.8px** ⇒ 手機上只看得到視窗標題列。
       ⚠ 這是早於本輪就存在的缺陷(上一棒只驗了「三題鈕沒被裁」與「無溢出」,沒驗垂直裁切)。 */
    .nx-layers__core { padding: 12px; }
    .nx-layers__more { text-align: left; }

    .nx-proof { grid-template-columns: 1fr; }
    .nx-proof__arrow svg { transform: rotate(90deg); }
    .nx-gapline__cells { grid-template-columns: repeat(4, 1fr); }
    .nx-gapline__cells::before { width: calc((100% - 24px) / 4 * 3 + 16px); }
    .nx-honest { padding: 44px 22px 32px; }
}

/* 2026-08-18 /system 影片牆:lead 卡的橫式只在有足夠寬度時成立。
   ⛔ 實測 390:橫式讓縮圖只剩 156px 寬 ⇒ 窄螢幕退回直式。
   ⚠️ 退回時**必須一併把 `grid-column` 還原成 auto**——單欄 grid 遇到 `span 2` 會**長出一個隱式第二欄**,
      整個影片牆會歪掉(寫得出、跑得動、但版面壞掉的第 N 次)。 */
@media (max-width: 560px) {
    /* 四組在 375 每欄只剩 ~160px，組名會斷成兩行、說明每行 6 個字 ⇒ 降單欄 */
    .nx-fast__groups { grid-template-columns: 1fr; gap: 26px; }
    /* ⛔ 實測 375:主畫面示意圖的「作業」欄只剩 106px，三顆按鈕(約 159px)會被 overflow 裁掉。
          ⇒ 藏掉次要欄把空間讓給它——三顆鈕在同一列上是這張圖唯一要傳達的事，不能被切。
          ⚠️ `--mock-cols` 寫在 inline style 上，**媒體查詢不會贏過 inline**，必須用 !important。 */
    .nx-layers__core .nx-mock__tr { grid-template-columns: 1.3fr .5fr 2.9fr !important; }
    .nx-layers__core .nx-mock__tr > :nth-child(2) { display: none; }
    .nx-fast__hero .nx-mock__tr { grid-template-columns: 1.25fr 2.7fr !important; }
    .nx-fast__hero .nx-mock__tr > :nth-child(2) { display: none; }
    .nx-mock__b { font-size: 11px; padding: 2px 6px; }
    .nx-mock__acts { gap: 4px; }
    .nx-mock__panel { grid-template-columns: repeat(2, 1fr); }
    .nx-mock__f { grid-template-columns: 5.2em 1fr; gap: 6px; }
    /* 層標籤在 390 會讓右側說明斷兩行、與左側標題基線錯開 ⇒ 直接折行排 */
    .nx-layers__tag { flex-wrap: wrap; gap: 4px 14px; }
    .nx-layers__tag em { flex: 1 0 100%; }
    .nx-layers__tag::after { display: none; }
    /* ⭐ 2026-08-19:這一段的工作是「讓人想點」。舊版在 390 仍是 2 欄 ⇒ 縮圖只剩 ~157px
       ⇒ 降單欄(縮圖 ~342px)。⚠ 首頁的影片只是引子性質,維持 2 欄不跟進。 */
    .nx-videos--screen { grid-template-columns: 1fr; gap: 26px; }
    /* ⚠ 單欄 grid 遇到 `grid-column: 1/-1` 不會出問題,但還原成 auto 不依賴巧合。 */
    .nx-videos--screen > .nx-vid--lead { grid-column: auto; margin-bottom: 0; }
    .nx-videos--screen .nx-vid--lead { display: block; }
    /* 手機橫式會讓縮圖只剩 156px ⇒ 退直式;主打卡的圖保留較寬的比例作為主從 */
    .nx-videos--screen .nx-vid--lead .thumb { aspect-ratio: 16 / 8.6; }
    .nx-videos--screen .nx-vid--lead .bd { padding: 15px 2px 0; }
    .nx-videos--screen .nx-vid--lead .t { font-size: 20px; }
    .nx-videos--screen .nx-vid--lead .w { font-size: 14.5px; }
    .nx-videos--screen .nx-vid--lead .note { font-size: 14.5px; margin-top: 12px; }
    .nx-videos--screen .nx-vid--lead .go { margin-top: 16px; }
    .nx-videos--screen .nx-vid--lead .play { width: 56px; height: 56px; }
    .nx-videos--screen .nx-vid--lead .play::after { border-left-width: 16px; border-top-width: 9px; border-bottom-width: 9px; }
}

/* 尊重使用者的減少動態設定(不是預設關閉,是使用者說了才關) */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
    .reveal { opacity: 1; transform: none; }
    html { scroll-behavior: auto; }
}

/* ══════ 內頁補充(D 段新增;樣張只做首頁,內頁沿用同一組 nx- 字彙)══════ */

/* 行寬同上:--nx-measure 帶 38em fallback(tech-trust 未載 tokens-schema.css) */
.inner-banner-lead { margin: 10px 0 0; color: var(--t-text-soft); font-size: 16.5px; line-height: 1.75; }
/* ⛔ 2026-08-19:舊的 `.nx-vid .w`(12.5px)原本重複寫在這裡,specificity 與上面相同但位置在後
   ⇒ 會默默贏過影片牆區塊里的規則。已移除,單一真相源回到上方的 `.nx-vid` 區塊。 */
a.nx-router__opt { text-decoration: none; }
a.nx-router__opt .ic { font-size: 11px; letter-spacing: 1.2px; }

/* /security 架構圖(純 SVG,零圖檔) */
.nx-arch { border: 1px solid var(--t-line); border-radius: var(--t-radius-lg); background: var(--t-card); padding: 24px 18px; }
.nx-arch svg { width: 100%; height: auto; display: block; }
.nx-arch__house { fill: rgba(30, 108, 255, .05); stroke: var(--t-accent); stroke-width: 2; }
.nx-arch__label { fill: var(--t-ink); font-size: 17px; font-weight: 700; font-family: var(--t-f-display); }
.nx-arch__box { fill: #fff; stroke: var(--t-accent); stroke-width: 1.5; }
.nx-arch__box--soft { fill: rgba(0, 200, 215, .07); stroke: var(--t-cyan); stroke-dasharray: 4 4; }
.nx-arch__box--ghost { fill: none; stroke: var(--t-line); stroke-width: 1.5; stroke-dasharray: 5 5; }
.nx-arch__t { fill: var(--t-ink); font-size: 15px; font-family: var(--t-f-body); }
.nx-arch__t--sm { fill: var(--t-text-soft); font-size: 12.5px; }
.nx-arch__wire { stroke: var(--t-accent); stroke-width: 2; }
.nx-arch__cut { stroke: var(--t-seal); stroke-width: 2; stroke-dasharray: 6 8; }
.nx-arch__x { fill: var(--t-seal); font-size: 22px; font-weight: 700; }
.nx-arch__cloud { fill: rgba(120, 135, 160, .10); stroke: var(--t-line); stroke-width: 1.5; stroke-dasharray: 5 5; }

@media (max-width: 640px) {
    .nx-arch { padding: 14px 8px; }
    .nx-arch__t { font-size: 19px; }
    .nx-arch__t--sm { font-size: 16px; }
    .nx-arch__label { font-size: 22px; }
}

/* ══════ ⚠️具體度修正(D 段 live 截圖抓到,不是設計變更)══════
   theme.css 的 `body.nx-theme--tech-trust h1~h4`=(0,1,2),壓過樣張的 `.nx-hero h1`=(0,1,1)
   → 深底區塊的標題被塗成 --t-ink(深藍黑)疊在深藍黑底上=幾乎看不見。
   樣張獨立跑沒有 theme.css,所以只有整合進平台後才會出現;curl/php -l 都驗不到,
   靠 live 截圖才抓得到(L2「視覺驗收=live 截圖 vs 設計基準」的實例)。
   修法:把深底標題規則提到同一作用域層級,載入順序在後即勝——不動樣張設計值。 */
body.nx-theme--tech-trust .nx-hero h1,
body.nx-theme--tech-trust .nx-sec--dark h2,
body.nx-theme--tech-trust .nx-sec--dark .nx-sec__title,
body.nx-theme--tech-trust .nx-story h2,
body.nx-theme--tech-trust .nx-final h2 { color: #fff; }
body.nx-theme--tech-trust .nx-hero h1 .grad { color: transparent; }
body.nx-theme--tech-trust .nx-sec--dark p,
body.nx-theme--tech-trust .nx-story p,
body.nx-theme--tech-trust .nx-final p { color: var(--t-on-dark-soft); }
body.nx-theme--tech-trust .nx-sec--dark a:hover,
body.nx-theme--tech-trust .nx-final a:hover { color: var(--t-cyan); }

/* 同一類具體度問題:樣張按鈕是 <a>,theme.css 的 `body.nx-theme--tech-trust a`=(0,1,1)
   壓過 `.nx-btn--ghost`=(0,1,0) → 深底上的 ghost 鈕文字被塗成深藍黑=只剩一個空框。
   把四型按鈕的文字色一併提到同層作用域(值仍是樣張原值)。 */
body.nx-theme--tech-trust .nx-btn--primary,
body.nx-theme--tech-trust .nx-btn--primary:hover { color: #fff; }
body.nx-theme--tech-trust .nx-btn--ghost { color: var(--t-on-dark); }
body.nx-theme--tech-trust .nx-btn--ghost:hover { color: #fff; }
/* ⚠️ 2026-07-25 更新:原本這兩行把 outline 鈕的字設成 --t-ink(深藍黑),是為了壓過 theme.css;
   但 outline 已改為「白底+主色框+主色字」,這裡若留 ink 會把字色蓋回深黑 → 框藍字黑不一致。
   同層改成與新設計一致(實測 computed 確認生效,不靠推論)。 */
body.nx-theme--tech-trust .nx-btn--outline { color: var(--np-text); border-color: var(--t-accent); }
body.nx-theme--tech-trust .nx-btn--outline:hover { color: #fff; background: var(--t-accent); }

/* ══════ footer 變體 nap3(_core/__frame/footer--nap3.php)══════
   出身:D 段抽樣張 CSS 進站台層時,把 `.nx-foot` 整段一起漏掉(同 §二.7 漏掉按鈕系統的同型錯誤)
   → 變體只出 nx-* 鉤子、零視覺(這是變體的設計),樣式沒補=頁尾全裸(連結直排、icon 黑方塊)。
   設計基準=樣張 `_temp/mockup-notarpro/mockup-v2.css` 的 `.nx-foot` 段,值逐條沿用,
   只把選擇器對映到 nap3 的鉤子名(.nx-c-footer__* / .nx-list--footer-*)。
   ⚠️ 哈吉站那份 nap3 樣式全綁 `body.nx-skin--blueprint`(哈吉專屬皮)→ 本站繼承不到,必須自備。 */

/* 母版 master.css 在 ≥992px 讓 #footer-fixed 固定貼底(position:fixed),深色頁尾會浮在
   內容上並在頁中透出。與哈吉站同樣改回正常文流,母版 JS 的 .footer-height 墊位歸零。 */
@media only screen and (min-width: 992px) {
    body.nx-theme--tech-trust #footer-fixed { position: static; }
}
body.nx-theme--tech-trust .footer-height { height: 0 !important; }

/* sticky footer(業主 2026-07-25 裁示):內容撐不滿一屏時把頁尾推到視窗底,不留白帶。
   `#wrapper` 直接子元素實測 9 個:nav(fixed)/內容 section ×N/footer/.footer-height(h=0)/
   #back-to-top(fixed)/#messageModal(display:none)——footer 之後全是不佔文流的,故 margin-top:auto 安全。
   ⚠️ 改 flex 會讓相鄰 section 的 margin 不再塌陷;本站區塊間距走 padding(`.nx-sec`/`.inner-content-section`),
      已用探針逐頁對照 docHeight 確認長頁零位移(見日誌 `260725_12`)。 */
body.nx-theme--tech-trust #wrapper {
    display: flex; flex-direction: column; min-height: 100vh;
}
body.nx-theme--tech-trust #wrapper > .nx-c-footer--nap3 { margin-top: auto; }

/* ⛔母版裸元件:`<button class="scroll-to-top" id="scrollToTop">` 由 _core/fe 八支頁面輸出,
   但**全平台沒有任何 CSS 或 JS 接它** → 以 position:static 裸顯示在頁尾「下方」,佔 33px
   把版面頂出一條白帶(就是探針量到的「footer 未貼底 -33」)。正牌回頂鈕是 footer 內的
   `#back-to-top`(master.css 有樣式、右下 fixed、JS 控 .show)。
   哈吉站 2026-07-25 已同款遮蔽並經業主過審;此為**母版級缺陷**,已登記缺陷簿待平台層治本。 */
body.nx-theme--tech-trust .scroll-to-top { display: none; }

.nx-c-footer--nap3 {
    background: var(--t-ink-deep); color: var(--t-on-dark-soft);
    padding: 48px 0 36px; font-size: 14px; font-family: var(--t-f-body); line-height: 1.7;
}
.nx-c-footer--nap3 .nx-c-footer__inner {
    width: min(1180px, calc(100% - 48px)); margin-inline: auto;
    display: grid; gap: 20px;
}
.nx-c-footer--nap3 .nx-c-footer__brand {
    display: block; color: #fff; font-family: var(--t-f-display);
    font-size: 16px; font-weight: 700; letter-spacing: var(--t-ls-display);
}
.nx-c-footer--nap3 .nx-c-footer__nap-add,
.nx-c-footer--nap3 .nx-c-footer__nap-conn { margin-top: 4px; font-size: 13.5px; }
/* theme.css 的 `body.nx-theme--tech-trust a`=(0,1,1) 會把頁尾連結塗成深藍黑疊在深底上
   —— 與 hero/ghost 鈕同一類具體度問題,同樣提到同層作用域壓回。 */
body.nx-theme--tech-trust .nx-c-footer--nap3 a { color: rgba(233, 238, 247, .8); text-decoration: none; }
body.nx-theme--tech-trust .nx-c-footer--nap3 a:hover { color: var(--t-cyan); }

/* 快速連結 + 社群:樣張是一條橫排列(flex wrap),不是預設的清單直排 */
.nx-c-footer--nap3 .nx-c-footer__col--links {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
    gap: 14px 24px; padding-top: 18px; border-top: 1px solid var(--t-line-dark);
}
.nx-c-footer--nap3 .nx-list--footer-links,
.nx-c-footer--nap3 .nx-list--footer-social {
    display: flex; flex-wrap: wrap; align-items: center; margin: 0; padding: 0; list-style: none;
}
.nx-c-footer--nap3 .nx-list--footer-links { gap: 10px 20px; }
.nx-c-footer--nap3 .nx-list--footer-social { gap: 10px; }
.nx-c-footer--nap3 .nx-list--footer-social a {
    display: inline-flex; align-items: center; justify-content: center;
    width: 34px; height: 34px; border-radius: 50%; font-size: 15px;
    border: 1px solid var(--t-line-dark); transition: border-color .16s, background .16s, color .16s;
}
.nx-c-footer--nap3 .nx-list--footer-social a:hover {
    border-color: var(--t-cyan); background: rgba(255, 255, 255, .06);
}

.nx-c-footer--nap3 .nx-c-footer__col--meta {
    display: flex; flex-wrap: wrap; justify-content: space-between; gap: 4px 20px;
    padding-top: 16px; border-top: 1px solid var(--t-line-dark);
    /* ⭐ 2026-08-17 .45 → .50(AA):同 .nx-hero__note,實量 4.04 → 4.72。
       這一條管的是頁尾版權列與分隔點,**14 條路由每一頁都出現** ⇒ 全站級。 */
    font-size: 13px; color: rgba(233, 238, 247, .50);
}
.nx-c-footer--nap3 .nx-c-footer__tagline { color: rgba(233, 238, 247, .55); }

/* 法律列(2026-08-15 N3):隱私權政策 / 網站服務條款的全站入口。
   位置=meta 橫列內、緊鄰 copyright(法律資訊的慣例位置)。
   連結色不另外指定,沿用上方 `.nx-c-footer--nap3 a` 的 .8 白 —— 比 meta 本身的 .45 亮,
   使用者掃過去看得出「這兩個是可以點的」,而 tagline/copyright 是純文字。 */
.nx-c-footer--nap3 .nx-c-footer__legal {
    display: inline-flex; flex-wrap: wrap; align-items: center;
}
.nx-c-footer--nap3 .nx-c-footer__legal-sep { padding: 0 3px; opacity: .5; }
.nx-c-footer--nap3 .nx-c-footer__legal a:hover { text-decoration: underline; }

/* ⭐ 2026-08-17(Lighthouse `link-in-text-block`):頁尾「哈吉設計」是**句子裡的連結**,
   而它與周圍文字**只靠顏色區分**(連結 alpha .8 / 內文 alpha .5)⇒ 不符 WCAG 1.4.1「不能只用顏色」。
   ⚠️ 這一條與對比度是**兩件事**:對比度問「看不看得清楚」,這一條問「認不認得出它是連結」。
   治法=常態底線(hover 本來就有底線,這裡只是把它變成預設狀態)。
   ⚠️ 必須帶 `body.nx-theme--tech-trust`(0,4,1):同檔上方另有一條
      `body.nx-theme--tech-trust .nx-c-footer--nap3 a { text-decoration:none }`(0,3,1),
      不帶主題前綴就會輸給自己人 —— **本輪第四次「寫得出、跑得動、沒生效」**。 */
body.nx-theme--tech-trust .nx-c-footer--nap3 .nx-c-footer__credit a { text-decoration: underline; }

@media (max-width: 640px) {
    .nx-c-footer--nap3 { padding: 38px 0 30px; }
    .nx-c-footer--nap3 .nx-c-footer__inner { width: calc(100% - 36px); }
    .nx-c-footer--nap3 .nx-c-footer__col--links { justify-content: flex-start; gap: 16px; }
    .nx-c-footer--nap3 .nx-list--footer-links { gap: 8px 18px; font-size: 13.5px; }
    /* 法律列在手機是「一行兩個小連結」,實量觸控高度只有 22px → 放大觸控面
       (與哈吉站頁尾連結同款處理;兩站一致) */
    .nx-c-footer--nap3 .nx-c-footer__legal a { display: inline-block; padding: 6px 0; }
}

/* ══════════════════════════════════════════════════════════════════════
   內頁元件層(2026-07-25 業主 UI/UX 回報後補齊)
   ----------------------------------------------------------------------
   ⛔ 出身:`_core/__pageTemplates/page--contact.php` 與平台元件庫走 **`nx-c-*` 元件命名**
      (與 `__frame/footer--nap3.php` 同一套契約:**只出鉤子、零視覺,樣式必須租戶自備**)。
      NotaPro 的 site.css 是從樣張整理來的,只有樣張語彙 `nx-btn` / `nx-sec`,
      → `/contact` 的 11 個 `nx-c-*` / `nx-contact-*` class **全數零樣式 = 整頁裸奔**;
        `nx-nav-cta`(header CTA)**九頁都沒有樣式**,「預約 Demo」只是一段純文字。
   ⭐ 這是 footer--nap3 同型問題的第三次 —— 上一輪只檢查 footer,沒把同一個檢查套到
      `__pageTemplates/`。盤法已回寫 SOP(逐頁比對「HTML 用到的 class」vs「CSS 定義過的 class」)。
   結構參考 site-no8 同名元件(同源原則),**值全部換 tech-trust token**。
   ══════════════════════════════════════════════════════════════════════ */

/* ── header CTA 鈕(navbaritem 的 nbi_aClass=nx-nav-cta;九頁共用)──
   bootsnav 的 `ul.nav > li > a` 具體度高,必須同層以上才壓得過。
   tech-trust 是科技感亮色皮 → 用實心主色(哈吉 blueprint 用墨線白底,語言不同不照搬)。 */
/* ⛔⭐ 2026-08-17 修「桌機主 CTA 深藍字壓藍底 3.84:1」——**14 條路由每一頁都中**。
   為什麼上一輪只抓到手機、桌機被判無事:量的是手機態,桌機態沒量。
   根因(第三次同型:母版用更長的選擇器悄悄贏過租戶層):
     theme.css 有 `body.nx-theme--tech-trust nav.navbar.bootsnav.navbar-transparent.white ul.nav > li > a`
     = **6 個 class**(0,6,5),而下面這條原本只有 5 個(0,5,5) ⇒ `color:#fff` **寫得出、跑得動、完全沒生效**。
     實測 nav 的 class 真的同時帶 `navbar-transparent` 與 `white` ⇒ 那條一直在贏。
   ⭐ 治法=補一條把母版那兩個 class 也帶上的選擇器(0,7,5),**不用 !important**
     (帶 important 只會讓下一個人更難覆寫;能靠具體度贏就靠具體度)。
   ⚠️ 驗收判準是**量 computed color**,不是看 CSS 寫了什麼 —— 這條規則本身就是反例。 */
body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav > li > a.nx-nav-cta,
body.nx-theme--tech-trust nav.navbar.bootsnav.navbar-transparent.white ul.nav > li > a.nx-nav-cta {
    background: var(--t-accent);
    color: #fff;
    border-radius: var(--t-radius);
    padding: 9px 20px;
    margin: 16px 0 16px 10px;
    line-height: 1.4;
    font-weight: 600;
    box-shadow: 0 2px 10px rgba(30, 108, 255, .28);
    transition: background .16s, transform .16s, box-shadow .16s;
}
/* hover/focus 同上,一併補足具體度(母版 theme.css 的 hover 也走 .navbar-transparent.white 那條) */
body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav > li > a.nx-nav-cta:hover,
body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav > li > a.nx-nav-cta:focus,
body.nx-theme--tech-trust nav.navbar.bootsnav.navbar-transparent.white ul.nav > li > a.nx-nav-cta:hover,
body.nx-theme--tech-trust nav.navbar.bootsnav.navbar-transparent.white ul.nav > li > a.nx-nav-cta:focus {
    background: var(--t-accent-dn);
    color: #fff;
    transform: translateY(-1px);
    box-shadow: var(--t-glow);
}
body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav > li > a.nx-nav-cta::after { display: none; }

/* ⛔⭐ 2026-09-03 修「主 CTA hover 時字色=底色,對比 1:1」(棒86 批次3 實測發現,業主未回報)。
   量測(明細頁 hover 態):文字 rgb(22,87,214) / 底 rgb(22,87,214) ⇒ **對比 1.00**,整顆鈕變成藍色空塊。
   根因(第四次同型:更強的選擇器悄悄贏過租戶層,這次贏在 **ID**):
     main.css 有 `#navbar-menu ul.nav > li > a:hover { color: var(--t-accent-dn) }` = (1,2,3);
     上面那條租戶規則雖然寫了 `color:#fff`,但只有 (0,8,5) —— **ID 一顆就贏過八個 class**。
   ⭐ 治法=把 `#navbar-menu` 也帶進選擇器 (1,3,4),沿用本檔既有紀律:**能靠具體度贏就不用 !important**。
   ⚠️ 判準同樣是量 computed color,不是看 CSS 寫了什麼。 */
body.nx-theme--tech-trust #navbar-menu ul.nav > li > a.nx-nav-cta,
body.nx-theme--tech-trust #navbar-menu ul.nav > li > a.nx-nav-cta:hover,
body.nx-theme--tech-trust #navbar-menu ul.nav > li > a.nx-nav-cta:focus {
    color: #fff;
}

/* ⭐ 2026-08-15 B1+B2 同一個根:**CTA 的外框高度沒有跟著 nav 的兩態切換**。
   量測(桌機 1440,乾淨狀態):
     一般導覽連結 a 的外框高 = nav 高(頂端 80 / 縮小 60,靠 padding 30px→20px 切換);
     CTA 因為 `padding:9px + margin:16px 上下` 固定 = **69.6px,兩態都不變**。
   後果① 頂端態 CTA 外框比 nav 矮 10.4 → 靠上 → 業主說的「沒有垂直置中、偏上」;
   後果② 縮小態 CTA 外框比 nav 高 9.6 → 把 `.container-fluid` 撐到 69.6 > nav 60,
          而藍線 `nav::after` 是 `position:static` 跟著內容盒走 → **中間露出 9.6px 間隙**。
   治法:桌機把 `ul.nav` 改 flex 垂直置中(li 去掉 float),CTA 不再用 margin 撐高度。
     ⚠️ 刻意**不動** `.navbar-collapse` —— 試過 `height:100%`,會讓 nav 從 80 塌成 60(整條變矮)。
     ⚠️ 只在 ≥992px 套用;≤991px 是漢堡展開態,ul 必須維持自然高度。
   實測結果:CTA 上/下留白 頂端 20.2/22.2、縮小 10.2/12.2(原 16/26.4 與 16/6.4);
            `.container-fluid` 高度 80 / 60.8(原 80 / 69.6)。 */
@media (min-width: 992px) {
    body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav.navbar-nav { display: flex; align-items: center; }
    body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav.navbar-nav > li { float: none; }
    body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav > li > a.nx-nav-cta { margin: 0 0 0 10px; }
}

/* ⛔⭐ 992–1199:第一層項目排不下就會**掉出白色 header、落到深色 hero 上**
   —— 那不是「擠」,是深色字壓在深色底上幾乎看不見(2026-08-22 實拍坐實)。
   量出來的帳(1100 寬):可用 1040 = container 1070 − padding 30;
     需求 1092 = logo 322 + ul 656 + CTA 114 ⇒ **差 52px**。
   ⇒ 只在這個區間把選單項水平內距 10px 收成 6px:7 項 × 8px = **省 56px** → 1036 < 1040。
   ⚠️ `:not(.nx-nav-cta)` 是必要的——CTA 是實心按鈕,內距縮掉會變形。
   ⚠️ ≥1200 完全不受影響(那裡本來就有餘裕,gap 108~348),業主看過的桌機樣子零變化。
   ⛔ **1024 附近仍會換行,那是既有缺陷不是本次造成**:1024 可用僅 994,
      就算內距歸零也塞不下 8 項(需求 1092)。要治本得把漢堡選單斷點從 992 提到 1200,
      屬既有 UX 決策 ⇒ **登記待業主裁示,本輪不自行擴大改動範圍**。 */
@media (min-width: 992px) and (max-width: 1199px) {
    body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav.navbar-nav > li > a:not(.nx-nav-cta) {
        padding-left: 6px;
        padding-right: 6px;
    }
}

/* 藍線改貼 nav 自己的下緣,與內容盒高度徹底脫鉤(上面那條把差距壓到 0.8px,這條歸零) */
body.nx-theme--tech-trust nav.navbar.bootsnav::after {
    position: absolute; left: 0; right: 0; top: 100%;
}

@media (max-width: 991px) {
    /* 手機漢堡選單展開時,CTA 不再浮在選單列 → 回歸整寬條目但保留實心底 */
    body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav > li > a.nx-nav-cta {
        margin: 8px 15px; text-align: center; box-shadow: none;
        /* ⭐ 2026-08-17 修「左邊距 15、右邊距 0」(業主 2026-08-17 裁示):
           上面那行 margin 是對的,壞的是**寬度**——母版另有一條把它撐成
           `width: 100%`(= 父層 LI 的 375px),再加上左右各 15 的 margin ⇒
           整顆往右溢出 15px,看起來就是「左邊有留白、右邊沒有」。
           ⭐ 實測(375 手機態,真的展開漢堡選單量):375 → 345,左右各 15 對稱。
           ⚠️ 這裡刻意**不加 `!important`**:site.css 載在最後、選擇器同層,實測已經壓得過;
              帶 important 只會讓下一個人更難覆寫(對比 color 那行是真的非帶不可)。 */
        width: auto;
        /* ⭐ 2026-08-15 覆驗抓到:手機態這顆是**藍底深藍字,對比 3.03:1**(AA 需 4.5)——
           就是業主說的「底色藍、字是黑的,不太明顯」。桌機沒事、只有手機中,
           因為母版 `master.css` 有一條 `@media (max-width:767px)` 的
           `nav.navbar.bootsnav .navbar-nav > li > a{color:#1A2E4A !important}`,
           把上面那條非 important 的 `color:#fff` 壓掉了。⇒ 這裡必須帶 !important。
           修後 #fff on #1E6CFF = 4.52:1(過 AA)。 */
        color: #fff !important;
    }
}

/* ── 區塊標題(nx-sec__head / __title / __body;內頁通用)── */
.nx-sec__head { margin-bottom: 26px; }
.nx-sec__title {
    font-family: var(--t-f-display); color: var(--t-ink);
    font-size: clamp(21px, 2.4vw, 27px); font-weight: 700;
    letter-spacing: var(--t-ls-display); margin: 0 0 10px;
}
.nx-sec__body { color: var(--t-text); line-height: var(--t-lh-body); }
.nx-c-heading {
    font-family: var(--t-f-display); color: var(--t-ink);
    font-size: 18px; font-weight: 700; margin: 26px 0 12px;
}

/* ── 卡片(nx-c-card)── */
.nx-c-card {
    position: relative; display: block; background: var(--t-card);
    border: 1px solid var(--t-line); border-radius: var(--t-radius-lg);
    padding: 22px 24px; text-decoration: none;
    box-shadow: var(--t-shadow);
    transition: border-color .16s, box-shadow .16s, transform .16s;
}
a.nx-c-card:hover {
    border-color: var(--t-accent);
    box-shadow: var(--t-shadow-lift);
    transform: translateY(-2px);
}
.nx-c-card__code {
    display: block; font-size: 11.5px; letter-spacing: .18em;
    color: var(--t-accent); font-weight: 600; margin-bottom: 6px;
}
.nx-c-card__title {
    display: block; font-family: var(--t-f-display); color: var(--t-ink);
    font-size: 17px; font-weight: 700; margin-bottom: 6px;
}
.nx-c-card__desc { display: block; color: var(--t-text-soft); font-size: 14.5px; line-height: 1.75; }
.nx-c-card__more {
    display: inline-flex; align-items: center; gap: 6px;
    color: var(--np-text); font-weight: 600; font-size: 14.5px;
    text-decoration: none; margin-top: 10px;
}
.nx-c-card__more:hover { color: var(--t-accent); }

/* ── 事實表(nx-c-fact:dl/dt/dd 兩欄式聯絡資訊)──
   contact 頁的「電話/Email/LINE」與「Demo 怎麼進行」都吃這顆;
   原本零樣式 → dl 直接堆成純文字(業主截圖 3 的主要症狀)。 */
.nx-c-fact {
    background: var(--t-card); border: 1px solid var(--t-line);
    border-radius: var(--t-radius-lg); box-shadow: var(--t-shadow); overflow: hidden;
}
.nx-c-fact__head {
    display: flex; align-items: baseline; gap: 10px;
    padding: 14px 20px; margin: 0;
    background: var(--t-paper-soft); border-bottom: 1px solid var(--t-line);
    font-family: var(--t-f-display); color: var(--t-ink); font-size: 15.5px; font-weight: 700;
}
/* ⛔⭐ 2026-08-18:`--t-accent` 在 11px 實量 **4.02**(底=--t-paper-soft)不過 AA,
   且違反 content-decisions §十「<18px 一律不用品牌藍/品牌橘當前景色」⇒ 改 --t-accent-dn(5.55)。
   ⚠️ 這條規則**目前只有 /get-started 在吃**——`contact.php` 的 `.nx-c-fact__head` 用的是
      兩個裸 `<span>`、沒帶 `.en` class(等於它的 EN 標籤從來沒吃到這組樣式)。
      那是 contact 自己的待辦,本輪不順手改(改了會動到業主已看過的 contact 版面)。 */
.nx-c-fact__head .en {
    font-size: 11px; letter-spacing: .18em; color: var(--t-accent-dn); font-weight: 600;
}
.nx-c-fact dl {
    display: grid; grid-template-columns: auto 1fr;
    margin: 0; font-size: 14.5px;
}
.nx-c-fact dt {
    padding: 13px 18px; white-space: nowrap; font-weight: 600;
    color: var(--t-text-soft); border-bottom: 1px solid var(--t-line);
    background: rgba(30, 108, 255, .02);
}
.nx-c-fact dd {
    padding: 13px 18px; margin: 0; color: var(--t-text);
    border-bottom: 1px solid var(--t-line); line-height: 1.75;
}
.nx-c-fact dl > dt:last-of-type, .nx-c-fact dl > dd:last-of-type { border-bottom: 0; }
.nx-c-fact a { color: var(--np-text); font-weight: 600; }
.nx-c-fact a:hover { color: var(--t-accent); }

/* ── 業主自述卡(nx-c-voice:contact 開場的「不用先想好要問什麼」)── */
.nx-c-voice {
    background: var(--t-card); border: 1px solid var(--t-line);
    border-left: 3px solid var(--t-accent);
    border-radius: var(--t-radius-lg); box-shadow: var(--t-shadow);
    padding: 30px 32px;
}
.nx-c-voice p { color: var(--t-text); line-height: var(--t-lh-body); margin: 0 0 .9em; }
.nx-c-voice p:last-child { margin-bottom: 0; }
.nx-c-voice strong { color: var(--t-ink); font-weight: 700; }

/* ── contact 版面(兩欄:聯絡資訊 + Demo 流程)──
   ⭐ 2026-08-22 業主裁示「聯絡頁下半部 UI/UX 檢討調整」,三處都是**量出來才改的**:
     ① 兩欄原本 `1fr 1.05fr` ⇒ 實測 541 / 569,差 28px 的**不對稱看起來像沒對齊**,改等寬。
     ② `align-items: start` ⇒ 兩張卡上緣對齊但下緣落差 **175px**(手機 300px),
        像兩塊沒切齊的板子;改 `stretch` + 卡片撐滿高度,下緣也齊。
     ③ 左欄補了一行標題(見 contact.php),兩欄起跑線才一致。 */
.nx-contact-grid {
    display: grid; grid-template-columns: 1fr 1fr; gap: 30px;
    align-items: stretch; margin-top: 8px;
}
.nx-contact-col { min-width: 0; display: grid; gap: 22px; align-content: start; }
/* ⛔ 這裡**刻意不做**「把左欄卡片拉到跟右欄一樣高」:兩欄內容量本來就差很多
   (左欄 2 列、右欄 5 列),硬拉齊只會在卡片裡留下約 200px 空白 —— 那比不齊更難看。
   ⭐ 對齊做在**起跑線**(兩欄各有一行標題)與**欄寬**(1fr 1fr),不做在下緣。 */

/* ── 快速聯絡列(第一屏就給電話/LINE/Email 三個動作)──
   出身:實測電話原本在 y=1643,桌機要捲 0.8 屏、手機 1.3 屏才看得到。 */
.nx-c-quick {
    display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px;
    margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--t-line);
}
.nx-c-quick__lead { font-size: 15px; color: var(--t-ink-soft); }
.nx-c-quick__item {
    display: inline-flex; align-items: center; min-height: 40px;
    padding: 8px 16px; border-radius: var(--t-radius);
    font-size: 15px; font-weight: 600; text-decoration: none;
    border: 1px solid var(--t-accent); background: var(--t-card);
    transition: background .16s, color .16s, transform .16s;
}
body.nx-theme--tech-trust .nx-c-quick__item { color: var(--np-text); }
body.nx-theme--tech-trust .nx-c-quick__item:hover {
    background: var(--t-accent); color: #fff; transform: translateY(-1px);
}
.nx-c-quick__item:focus-visible { outline: 3px solid rgba(30, 108, 255, .45); outline-offset: 2px; }
.nx-contact-mapheading { margin-top: 0; }
.nx-contact-social {
    display: flex; flex-wrap: wrap; gap: 12px; align-items: center;
    padding: 0; background: none; margin-top: 2px;
}

/* ── 元件層按鈕(nx-c-btn;與樣張 .nx-btn 對齊同一組視覺,避免站上兩套按鈕語言)──
   骨架(display/padding/尺寸)主題沒給,由此提供;⚠️**顏色類必須帶 body 主題 class**,
   否則被 theme.css 的 `body.nx-theme--tech-trust .nx-c-btn--outline`(0,2,0)壓過
   (那份是 editorial 衍生的「透明底+墨框」,與本站藍色按鈕語言不一致)。 */
.nx-c-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    min-height: 44px; padding: 12px 24px;
    border: 1px solid transparent; border-radius: var(--t-radius);
    font-size: 15px; font-weight: 600; text-decoration: none;
    transition: transform .16s, box-shadow .16s, background .16s, color .16s;
}
body.nx-theme--tech-trust .nx-c-btn { background: var(--t-accent); color: #fff; }
body.nx-theme--tech-trust .nx-c-btn:hover { background: var(--t-accent-dn); color: #fff; transform: translateY(-2px); box-shadow: var(--t-glow); }
body.nx-theme--tech-trust .nx-c-btn--outline {
    background: var(--t-card); border: 1px solid var(--t-accent); color: var(--np-text);
    box-shadow: 0 1px 2px rgba(30, 108, 255, .10);
}
body.nx-theme--tech-trust .nx-c-btn--outline:hover { background: var(--t-accent); border-color: var(--t-accent); color: #fff; }
.nx-c-btn:focus-visible { outline: 3px solid rgba(30, 108, 255, .45); outline-offset: 2px; }

/* ── 相關連結清單(nx-list--rel)──
   ⭐ 2026-08-22:原本只給 `display:grid` **沒給欄數** ⇒ 預設單欄,三張卡在桌機是
     **1140px 全寬直疊**(實測),與站上其他頁的三欄卡(`.nx-router`)語言不一致、也很佔高。
     tech-trust 主題沒給這個 class 欄數(其他主題有),所以由站台層補。
   ⚠️ 只有 contact.php 與 `_core/__pageTemplates/page--contact.php` 用到,影響面僅聯絡頁。 */
.nx-list--rel {
    list-style: none; margin: 0; padding: 0;
    display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
}
.nx-list--rel li { margin: 0; }
@media (max-width: 991px) { .nx-list--rel { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .nx-list--rel { grid-template-columns: 1fr; } }

/* ── 內頁區塊底色(讓 contact 三段有節奏,不是一整片白)── */
.nx-sec--voice { background: var(--t-paper); }
.nx-sec--contact { background: var(--t-paper-soft); }
.nx-sec--services { background: var(--t-paper); }

/* ⭐內頁區塊間距:`.nx-sec`(首頁節奏 92px)與母版 `.inner-content-section`(15px)**同具體度**,
   site.css 載入在後 → 內頁整批吃到首頁的大間距,contact 兩區之間空出 184px 白帶(業主截圖 3)。
   首頁 landing 需要大呼吸,內頁資訊密度高、要的是可讀節奏 → 內頁降到 56px(8pt 系統,
   ui-ux-pro-max §5 spacing-scale / section spacing hierarchy)。作用域排除首頁。 */
body:not(.nx-page--home) .nx-sec { padding: 56px 0; }
/* ⚠️ 內頁 banner(.inner-banner)自帶 `padding: 120px 0 56px` 用來容納固定 navbar(80px);
   它同時掛 .nx-sec--hero,若在這裡把 padding 歸零,標題會被 header 蓋住。改為只還原它的原值。
   ⭐ 2026-08-16 業主:「麵包屑下面的空間有點太大…大概現有的一半就可以了」。
      實測下緣留白 **82px** = 本規則 padding-bottom 56 + `.inner-banner-content` margin-bottom 26;
      而上緣扣掉固定 nav(80)後只剩約 40px ⇒ **視覺上頭輕腳重**,業主的眼睛是對的。
      只改本規則一個數字(56→16)⇒ 總留白 **42px**,與上緣的 40 對齊;
      刻意不動 `.inner-banner-content` 的 26px(那是母版值,動它會擴散到不需要改的地方)。 */
body:not(.nx-page--home) .inner-banner.nx-sec--hero { padding: 120px 0 16px; }

/* ⛔ contact 的社群列掛了 `nx-sec--cta`(深色 CTA 區塊)但它只是兩顆按鈕的容器
   → 整條被塗成深墨底(業主截圖 3 的「LINE YouTube」黑條)。
   ⚠️ 具體度教訓:theme.css 的 `body.nx-theme--tech-trust .nx-sec--cta`=(0,2,0),
      單靠 `.nx-contact-social.nx-sec--cta`=(0,2,0)+載入在後**實測壓不過**(CSSOM 證實有匹配但 computed 仍是主題值)
      → 跨檔覆蓋主題一律**多帶一層 body 主題 class**,不要賭載入順序。 */
body.nx-theme--tech-trust .nx-contact-social.nx-sec--cta {
    background: transparent;
    color: var(--t-text);
    overflow: visible;
    padding: 0;
    margin-top: 4px;
}
body.nx-theme--tech-trust .nx-contact-social.nx-sec--cta a { color: var(--np-text); }
body.nx-theme--tech-trust .nx-contact-social.nx-sec--cta a:hover { color: #fff; }

/* ── 首頁「一天的時間軸」表頭補漏(nx-day__hd--c;home/onboarding)── */
.nx-day__hd--c { color: var(--t-accent); font-weight: 700; }

@media (max-width: 860px) {
    .nx-contact-grid { grid-template-columns: 1fr; gap: 22px; }
    .nx-c-voice { padding: 24px 22px; }
    .nx-c-fact dl { grid-template-columns: 1fr; }
    .nx-c-fact dt { border-bottom: 0; padding-bottom: 0; background: none; }
    .nx-c-fact dd { padding-top: 4px; }
}

/* ============================================================
   收件表單(nx-form / nx-cf-* / nx-modal)— 2026-08-14 立案 260814_06
   ------------------------------------------------------------
   出身:機制上移 _core 後,contact 頁第一次有 <form>。本站原本這三個家族
     **一個規則都沒有**(哈吉那份 scoped 在 `body.nx-skin--blueprint`,本站是
     `nx-theme--tech-trust`,拿不到)→ 不補=孤兒 class,表單會是裸元件。
   定位=**基線可用樣式**(對齊本檔既有的卡片語言:白卡+1px 線+radius-lg+shadow),
     不是視覺設計輪次;視覺調整待業主眼過後另做。
   ⚠️ 顏色類一律多帶 `body.nx-theme--tech-trust`(本檔上方 nx-c-btn/nx-sec--cta
      的具體度教訓:單靠載入順序壓不過 theme.css 的 (0,2,0))。
   ⭐ 平台層歸位(backlog):本組結構樣式的正確歸屬是
      `_core/__themes/_shared/structure.css`(範本輸出的結構=平台共用層,
      見 `_core/__pageTemplates/_README.md`)。目前該檔不在 theme 層 CSS 鏈裡,
      第二個租戶要表單時一併處理,不在本輪擴大戰場。
   ============================================================ */

/* ── 表單容器 ── */
.nx-form {
    background: var(--t-card); border: 1px solid var(--t-line);
    border-radius: var(--t-radius-lg); box-shadow: var(--t-shadow);
    padding: 30px 32px 26px; margin-top: 8px;
}
.nx-form__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 22px; }
.nx-form__field { margin-bottom: 20px; }
.nx-form__field label {
    display: block; margin-bottom: 7px;
    font-size: 14.5px; font-weight: 600; color: var(--t-ink);
}
.nx-form__req, .nx-form__opt {
    display: inline-block; margin-left: 6px;
    font-size: 11.5px; font-weight: 600; letter-spacing: .04em;
    padding: 1px 6px; border-radius: 3px;
}
body.nx-theme--tech-trust .nx-form__req { color: #fff; background: var(--t-accent); }
body.nx-theme--tech-trust .nx-form__opt { color: var(--t-text-soft); background: var(--t-paper-soft); border: 1px solid var(--t-line); }

/* ── 欄位 ── */
.nx-form input[type="text"],
.nx-form input[type="email"],
.nx-form input[type="tel"],
.nx-form textarea {
    width: 100%; padding: 12px 14px;
    font-family: inherit; font-size: 15px; line-height: 1.6;
    border-radius: var(--t-radius);
}
body.nx-theme--tech-trust .nx-form input[type="text"],
body.nx-theme--tech-trust .nx-form input[type="email"],
body.nx-theme--tech-trust .nx-form input[type="tel"],
body.nx-theme--tech-trust .nx-form textarea {
    background: var(--t-paper); border: 1px solid var(--t-line); color: var(--t-text);
}
.nx-form textarea { resize: vertical; min-height: 132px; }
body.nx-theme--tech-trust .nx-form input[type="text"]:focus,
body.nx-theme--tech-trust .nx-form input[type="email"]:focus,
body.nx-theme--tech-trust .nx-form input[type="tel"]:focus,
body.nx-theme--tech-trust .nx-form textarea:focus {
    outline: none; border-color: var(--t-accent); background: var(--t-card);
    box-shadow: 0 0 0 3px rgba(30, 108, 255, .14);
}
.nx-form ::placeholder { color: var(--t-text-soft); opacity: .78; }
.nx-form__help { margin: 8px 0 0; font-size: 13px; line-height: 1.7; color: var(--t-text-soft); }
.nx-form__label-row {
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px; flex-wrap: wrap; margin-bottom: 7px;
}
.nx-form__label-row label { margin-bottom: 0; }

/* ── 送出 ── */
.nx-form__actions { margin-top: 4px; }
.nx-form__actions .nx-c-note { margin: 12px 0 0; font-size: 13px; line-height: 1.75; color: var(--t-text-soft); }
.nx-form__submit { min-height: 48px; cursor: pointer; }
.nx-form__submit:disabled { opacity: .55; cursor: default; transform: none; box-shadow: none; }

/* ── honeypot:視覺與輔助技術都拿不到,但機器人的自動填表看得到 ── */
.nx-form__hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

/* ── 回應訊息(PRG 與 AJAX 共用)── */
.nx-form__notice {
    padding: 13px 16px; margin-bottom: 18px;
    border-radius: var(--t-radius); font-size: 14.5px; line-height: 1.7;
}
body.nx-theme--tech-trust .nx-form__notice--ok {
    background: rgba(30, 108, 255, .07); border: 1px solid var(--t-accent); color: var(--t-ink);
}
body.nx-theme--tech-trust .nx-form__notice--err {
    background: #fdf0ed; border: 1px solid #d9553c; color: #8f2c17;
}

/* ── 勾選:觸發鈕 / chips(無 JS 時觸發鈕不出現,不給死鈕)── */
.nx-cf-pick { display: none; min-height: 36px; padding: 7px 15px; font-size: 13.5px; }
body.nx-js .nx-cf-pick { display: inline-flex; }
.nx-cf-chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 10px; }
.nx-cf-chips:empty { margin: 0; }
.nx-cf-chip {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 6px 5px 12px; border-radius: 999px;
    font-size: 13.5px; font-weight: 600;
}
body.nx-theme--tech-trust .nx-cf-chip {
    background: rgba(30, 108, 255, .08); border: 1px solid var(--t-accent); color: var(--np-text);
}
.nx-cf-chip__x {
    width: 20px; height: 20px; line-height: 1; border: none; border-radius: 50%;
    font-size: 15px; cursor: pointer;
}
body.nx-theme--tech-trust .nx-cf-chip__x { background: var(--t-accent); color: #fff; }

/* ── 勾選 modal ── */
body.nx-modal-open { overflow: hidden; }
.nx-modal[hidden] { display: none; }
.nx-modal {
    position: fixed; inset: 0; z-index: 1000;
    display: flex; align-items: center; justify-content: center; padding: 16px;
}
.nx-modal__overlay { position: absolute; inset: 0; background: rgba(11, 22, 40, .55); }
.nx-modal__panel {
    position: relative; z-index: 1; width: 100%; max-width: 580px;
    max-height: 88vh; overflow-y: auto; padding: 26px 28px 22px;
    border-radius: var(--t-radius-lg);
}
body.nx-theme--tech-trust .nx-modal__panel {
    background: var(--t-card); border: 1px solid var(--t-line); box-shadow: var(--t-shadow-lift);
}
.nx-modal__head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
.nx-modal__title { margin: 0; font-family: var(--t-f-display); font-size: 19px; font-weight: 700; color: var(--t-ink); }
.nx-modal__x { border: none; background: none; font-size: 24px; line-height: 1; cursor: pointer; color: var(--t-text-soft); }
.nx-modal__x:hover { color: var(--t-ink); }
.nx-modal__sub { margin: 8px 0 18px; font-size: 14px; color: var(--t-text-soft); }
.nx-modal__foot { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; }

.nx-cf-group { margin-bottom: 18px; }
.nx-cf-group__title {
    font-family: var(--t-f-mono); font-size: 12px; font-weight: 700; letter-spacing: .1em;
    color: var(--t-accent); padding-bottom: 7px; margin-bottom: 10px;
    border-bottom: 1px solid var(--t-line);
}
.nx-cf-group__opts { display: flex; flex-direction: column; gap: 8px; }
.nx-cf-opt {
    display: flex; align-items: flex-start; gap: 10px; cursor: pointer;
    padding: 11px 13px; border-radius: var(--t-radius); margin: 0;
}
body.nx-theme--tech-trust .nx-cf-opt { border: 1px solid var(--t-line); background: var(--t-paper); }
body.nx-theme--tech-trust .nx-cf-opt:hover { border-color: var(--t-accent); }
.nx-cf-opt__box { margin-top: 3px; width: 17px; height: 17px; flex: none; accent-color: var(--t-accent); }
.nx-cf-opt__text { font-size: 14.5px; line-height: 1.6; color: var(--t-text); }
/* :has() 不支援的瀏覽器只是少了選取高亮,勾選本身照常 */
body.nx-theme--tech-trust .nx-cf-opt:has(.nx-cf-opt__box:checked) {
    border-color: var(--t-accent); background: rgba(30, 108, 255, .06);
}

@media (max-width: 860px) {
    .nx-form { padding: 22px 20px 20px; }
    .nx-form__grid { grid-template-columns: 1fr; }
    .nx-modal__panel { padding: 20px 18px 18px; max-height: 92vh; }
    .nx-form__label-row { align-items: stretch; }
}

/* ============================================================
   長文條款頁(nx-page--terms / nx-sec--terms / nx-c-prose)— 2026-08-15 N2
   ------------------------------------------------------------
   出身:隱私權政策/服務條款兩頁落地(審查報告 260814_07 N2)。本站原本 `nx-c-prose`
     **一條規則都沒有**——它只存在 `site-no8/assetsFE/site.css` 且 scoped 在
     `.nx-skin--blueprint`,本站走 theme(tech-trust)拿不到 → 4,500 字法律文字會擠成一坨。
   ⚠️ 條文實際用到的標籤(自 live 輸出統計):h5 ×7、ul ×3、ol ×1、li ×32、strong ×10
     → **h5 是條文的節標題**(不是 h2/h3),排版要照這個現實給,不能只寫 h2/h3。
   定位=基線可讀,不是視覺設計輪次;顏色類一律多帶 body 主題 class(同本檔既有具體度教訓)。
   ⭐ 平台層歸位(backlog):正確歸屬是 `_core/__themes/_shared/structure.css`(範本輸出的
     L1/L2 鉤子=平台共用層)。⚠️但 **tech-trust 的 manifest 只列 tokens.css+theme.css**,
     沒列 structure.css → 本站根本沒載到那層(其餘三套 theme 有)。修 manifest 會動到
     首頁既有渲染,屬另案,不在本輪擴大戰場。
   ============================================================ */

.nx-sec--terms .nx-sec__head { margin-bottom: 6px; }

.nx-c-prose {
    /* ⚠️ 刻意**不用** var(--t-measure)(=68ch):`ch` 是「0」字寬,對中文不準——
       CJK 一字≈1em,68ch 實量只有 **33 字/行**(低於 CJK 長文建議的 35~45)。
       改用 em:40em ≈ 40 個中文字/行。實量而非推論(2026-08-15 用 Range.getClientRects 量過)。
       ⚠️ token 本身的問題另記:`--t-measure: 68ch` 還被 inner-banner-lead / nx-ans__say /
          theme.css:93 三處使用,改 token 會動到已驗收頁面 → 列給業主裁示,本輪不動。

       ⭐ 2026-08-17 調整 40em → 58em(業主裁示):原本 620px 在 1170px 的容器裡像一條窄帶,
          與全站其他內容欄(1150px)落差太大,視覺上像沒設定完。
          ⛔ **不照原提案的 1150px**:那是 ~74 中文字/行,比 CJK 長文建議上限(~45)高一倍,
             條款這種要逐條讀的長文會嚴重掉行。58em ≈ 58 字/行是兩邊的折衷,業主拍板。
          ⇒ 這一行的數字**不是隨手填的**,要改請先量「一行幾個中文字」再決定。 */
    max-width: 58em; margin-inline: auto;
    font-size: 15.5px; line-height: 1.95;
}
body.nx-theme--tech-trust .nx-c-prose { color: var(--t-text); }

/* 節標題:條文用的是 h5(h2/h3/h4 一併給,防日後條文改標籤層級就沒樣式) */
.nx-c-prose h2,
.nx-c-prose h3,
.nx-c-prose h4,
.nx-c-prose h5 {
    font-family: var(--t-f-display); font-weight: 700; line-height: 1.5;
    margin: 2.2em 0 .7em;
}
body.nx-theme--tech-trust .nx-c-prose h2,
body.nx-theme--tech-trust .nx-c-prose h3,
body.nx-theme--tech-trust .nx-c-prose h4,
body.nx-theme--tech-trust .nx-c-prose h5 { color: var(--t-ink); }
.nx-c-prose h2 { font-size: 21px; }
.nx-c-prose h3 { font-size: 19px; }
.nx-c-prose h4,
.nx-c-prose h5 { font-size: 17px; }
/* 節標題左側標記:讓 7 個節在長文裡掃得到,不靠字級硬撐 */
body.nx-theme--tech-trust .nx-c-prose h5 {
    padding-left: 14px; border-left: 3px solid var(--t-accent);
}
.nx-c-prose > *:first-child { margin-top: 0; }

.nx-c-prose p { margin: 0 0 1.15em; }
/* ⚠️ 必須顯式指定 list-style:母版 `assetsFE/css/master.css` 有全域 `ul { padding:0; list-style:none }`
   (實測 computed = none)→ 只設縮排的話,法律條文的清單會**沒有項目符號**、讀起來像散段。
   實量才發現的:截圖上看不出來「這是清單」,量 computed 才確認 marker 被母版 reset 清掉。 */
.nx-c-prose ul { list-style: disc outside; }
.nx-c-prose ol { list-style: decimal outside; }
.nx-c-prose ul,
.nx-c-prose ol { margin: 0 0 1.15em; padding-inline-start: 1.6em; }
.nx-c-prose li { margin: .45em 0; display: list-item; }
.nx-c-prose li::marker { color: var(--t-accent); }
body.nx-theme--tech-trust .nx-c-prose strong { color: var(--t-ink); font-weight: 700; }
body.nx-theme--tech-trust .nx-c-prose a { color: var(--np-text); text-decoration: underline; }
body.nx-theme--tech-trust .nx-c-prose a:hover { color: var(--t-accent); }

/* 長文本體放在卡片裡,與站上其他區塊同一種語言 */
body.nx-theme--tech-trust .nx-sec--terms .nx-sec__body {
    background: var(--t-card); border: 1px solid var(--t-line);
    border-radius: var(--t-radius-lg); box-shadow: var(--t-shadow);
    padding: 34px 38px;
}
body:not(.nx-page--home) .nx-sec--terms { background: var(--t-paper-soft); }

@media (max-width: 860px) {
    body.nx-theme--tech-trust .nx-sec--terms .nx-sec__body { padding: 22px 20px; }
    .nx-c-prose { font-size: 15px; line-height: 1.9; }
    body.nx-theme--tech-trust .nx-c-prose h5 { padding-left: 11px; }
}

/* ══════════════════════════════════════════════════════════════════════
   2026-08-15 棒 2 修補批(日誌 `___workingFiles/260815_15`)
   三項都是「巡覽初檢真的點過」才發現的,截圖與量測都抓不到。
   ══════════════════════════════════════════════════════════════════════ */

/* ── ① 手機選單展開時,底層 hero 大標透出來壓在選單項目上 ──
   實測 `.navbar-collapse` 背景 = `rgba(255,255,255,.93)`(等 1200ms 量的,不是動畫中途)。
   hero 的 h1 是白色 60px 粗體,7% 的殘留就足以把選單文字切斷 —— 展開子選單後
   「怎麼開始／導入與訓練／資料安全」三項幾乎讀不到。
   改不透明白底 + 投影,把「這是一層浮起來的面板」講清楚。 */
@media (max-width: 991px) {
    /* ⚠️ 覆驗才抓到:第一版用 class 選擇器**完全沒生效**——母版是
       `master.css` 的 `#navbar-menu.navbar-collapse{background:rgba(255,255,255,.93) !important}`
       (**ID 選擇器 + !important**),不帶 `!important` 一定輸,具體度再高也沒用。
       這裡跟著用同一個 ID 並補 `!important`,是對齊對手的寫法,不是偷懶。
       ⚠️ 母版那條只在 ≤767px;本規則放寬到 ≤991px 才蓋得到平板段的漢堡態。 */
    body.nx-theme--tech-trust nav.navbar.bootsnav #navbar-menu.navbar-collapse {
        background: #fff !important;
        box-shadow: 0 14px 30px rgba(16, 26, 46, .18);
    }
}

/* ── ② 手機下拉指示是豆腐字 □ ──
   來源 `bootsnav.css:1108` → `li.dropdown a.dropdown-toggle:before{font-family:"Ionicons";content:"\f125"}`,
   展開態換成 `\f123`。但 **`ionicons.min.css` 從未被本站載入**(`document.fonts` 零筆 Ionicons、
   全站零筆 `@font-face` 宣告)→ 瀏覽器拿退回字型畫 PUA 碼位 = □。
   ⚠️ 同一支字型還被 `.embed-container::before`(影片播放鈕)、`.slick-prev/next::before`
      (輪播箭頭)、`.accordion-color .panel-heading a::after` 使用 —— **那三處同樣是壞的**,
      但本站首頁沒用到,已登記未處理,不在本批範圍。
   治法:改用 CSS 邊框畫 chevron,零字型依賴;展開態轉 180° 當作狀態回饋。 */
@media (max-width: 991px) {
    body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav li.dropdown > a.dropdown-toggle::before {
        content: "";
        float: right;
        width: 9px; height: 9px;
        margin: 5px 3px 0 10px;
        border-right: 2px solid currentColor;
        border-bottom: 2px solid currentColor;
        transform: rotate(45deg);
        transition: transform .18s ease, margin-top .18s ease;
        opacity: .5;
    }
    body.nx-theme--tech-trust nav.navbar.bootsnav ul.nav li.dropdown.on > a.dropdown-toggle::before {
        transform: rotate(-135deg);
        margin-top: 9px;
        opacity: 1;
    }
}

/* ── ③ ⭐ 鍵盤焦點指示被母版 CSS 主動關掉(WCAG 2.4.7 AA)──
   母版基線有四條在清 outline,其中一條帶 !important:
     `button:focus{outline:none !important}` / `a:hover,a:focus,a:active{outline:none}`
     `.btn:focus,.btn:focus:active{outline:none}` / `textarea:focus,input:focus{outline:none 0}`
   實測(**真按 Tab 鍵**,不是 programmatic focus):`nx-router__opt` 的 `:focus-visible` 成立,
   但 computed `outline-style:none`、`box-shadow:none` → 鍵盤使用者完全看不到自己在那。
   ⚠️ 因為母版那條帶 `!important`,這裡**必須**用 `!important` 才壓得過,不是偷懶。
   ⚠️ 用 `:focus-visible` 不用 `:focus` —— 滑鼠點擊不該出現焦點環(那是母版當年關掉它的原因)。
   ⛔ 範圍:**只修 NotaPro 這個租戶**。哈吉與 demo 吃各自的 master.css 複本,同樣中這個問題,
      已登記,要另外一棒處理(避免這批同時動三站無法逐站覆驗)。 */
body.nx-theme--tech-trust a:focus-visible,
body.nx-theme--tech-trust button:focus-visible,
body.nx-theme--tech-trust input:focus-visible,
body.nx-theme--tech-trust select:focus-visible,
body.nx-theme--tech-trust textarea:focus-visible,
body.nx-theme--tech-trust summary:focus-visible,
body.nx-theme--tech-trust [tabindex]:focus-visible {
    outline: 3px solid var(--t-accent) !important;
    outline-offset: 2px !important;
}

/* 深色底區塊改用白色焦點環 —— 主色藍在深藍底上對比不足 */
body.nx-theme--tech-trust .nx-hero a:focus-visible,
body.nx-theme--tech-trust .nx-hero button:focus-visible,
body.nx-theme--tech-trust .nx-sec--dark a:focus-visible,
body.nx-theme--tech-trust .nx-sec--dark button:focus-visible,
body.nx-theme--tech-trust .nx-sec--cta a:focus-visible,
body.nx-theme--tech-trust .nx-sec--cta button:focus-visible,
body.nx-theme--tech-trust .nx-c-footer a:focus-visible {
    outline-color: #fff !important;
}

/* ══════ A5 內頁 hero 星空 —— 跨頁「同場景不同鏡頭」(2026-08-16 業主裁示「分組 5 顆」)══════ */
/* 規格真相源=`design/notarpro-inner-hero/direction.md` §四(五顆鏡頭 × 14 頁對照表)。
   業主的意象(這段視覺存在的依據,不是裝飾):「我希望客戶想遠一點,思索**中長期的營運需求**…
   太空的未來感、前進」⇒ 每一顆鏡頭都要答得出「它跟中長期/前進有什麼關係」,答不出來就不要放。

   ⭐⭐ 機制 2026-08-16 重構(原本只有 quick-tour 一頁吃得到):
     · **場景照掛在 `.inner-banner` 自身**=純 CSS,個性頁與 `_core/fe` 出的裸模組頁都吃得到,
       不改 DOM、不改 `_core`、沒有 JS 也在。換鏡頭=覆寫 `--sky-img`/`--sky-pos` 兩個變數。
     · `.nx-sky` 那組 span 只剩**動態層**(星場視差);模組頁由站台層 `nx-fx.js` 注入。
     · ⇒ 退化路徑:JS 沒跑 = 靜態場景照,不會開天窗。

   ⛔ **為什麼必須同時關掉 `::before`(實測坐實,不是推論)**:
      2026-08-16「塗紅探針」——把 `.inner-banner::before` 改成純紅並截圖,**畫面零紅**;
      再用 canvas 逐像素查場景照 alpha,**全圖 = 255 完全不透明**,而 `.nx-sky` 是 inset:0 蓋滿 banner。
      ⇒ 舊的兩團星雲漸層與這裡的八層星塵,在 quick-tour 上**一個像素都看不到**,還白跑一個 150s 動畫。
      照片改掛 `.inner-banner` 之後它們會**突然變可見** = 動壞業主已給 75–80 分的頁面,故一併關閉。
   ⛔ `::after` 不可用——theme.css 拿它做底部 7px 雙線。
   內容不會被蓋:`.inner-banner-content` 既有 `position:relative; z-index:2`(inner-pages.css:48)。
   ⚠️ 下方「文字層對比修正」兩條**刻意留在全站**:那是深空底上的 WCAG AA 缺陷,星空撤掉也還在。 */

/* ⛔⭐ 圖檔快取的規矩:`nxAssetVer()` 只版本化載入器輸出的 CSS/JS,**圖檔不在內**
   ⇒ 覆蓋同名圖檔,回訪者可能拿到舊圖(兩端都沒設 Cache-Control,走 heuristic caching)。
   **換鏡頭一律換檔名**(例:`sky-adrift-1920.webp` → `sky-adrift-1920-v2.webp`),
   不要覆蓋同名檔。改檔名 = URL 變 = 一定生效,是機制;手動掛 `?v=` 要靠人記得,不是機制。 */

/* ⭐⭐ 大膽的東西放在「文字欄以外」(2026-08-16 業主:「視覺可以大膽一點沒關係」)
   —— 但 AA 仍是紅線,所以不是整體調亮,是**把亮部挪出文字帶**:
   個性頁文字置中只佔中央 780px,**左右各 322px(全寬 45%)**可以全亮度放狠;
   垂直上文字佔 120–299 列,亮元素往上緣或下緣走。中央維持暗場。
   ⇒ 五顆鏡頭都照這個規矩構圖:星雲在左側、行星鋒在右下、銀河在上緣、遠日在左下、行星在右緣。 */

/* ⭐⭐ 文字帶暗罩(scrim)——**讓「大膽」與 AA 可以同時成立的關鍵機制**(2026-08-16)
   出身:把亮部挪出文字欄只解決一半。planet-dark 的亮部從第 198 列一路到底、
   far-light 的水平光芒橫跨 222–284 列(都是量出來的)⇒ **再怎麼調 `--sky-pos`
   都只是換一行被壓**,因為圖的亮部本來就比文字帶還高。
   ⇒ 加一層**橢圓暗罩**壓在場景照之上:中央變暗保住識讀,**左右兩側維持全亮度**
      (橢圓在 82% 處收乾淨)⇒ 大膽的星雲/光芒留在文字欄外,一點都沒有被犧牲。
   ⛔ **為什麼寫在 `.inner-banner` 而不是 `.nx-sky__veil`**:那一層是 **JS 注入**的,
      JS 沒跑就沒有暗罩,大膽背景會直接讓文字讀不到 —— 識讀不能有「要看 JS 臉色」的前提。
   ⭐ 預設 `--veil-a: 0` = **完全關閉**,只有需要的鏡頭才開 ⇒ 已拍板的 warp/quick-tour
      維持原樣零變化(它靠既有的 `.nx-sky__veil` 就夠了)。 */

/* -- 基準 = far-light(contact 的鏡頭;同時當未對應頁面的退路)-- */
body.nx-theme--tech-trust .inner-banner {
    /* ⭐ `-r` = 水平鏡射版。原圖遠日在左側 x≈21%,實測**正好壓在個性頁置中的麵包屑上**
       (contact / termsOf* 麵包屑 x323–474,對比只有 2.32);而模組頁麵包屑靠左 x143–242,
       在太陽左邊反而是 5.08 全過 —— 同一張圖、同一個位置,兩種版型結果相反。
       鏡射後遠日到 x≈79%,**同時避開置中版型與靠左版型的文字**,位置就不必再往下壓,
       那顆太陽可以完整留在畫面裡(= 這顆鏡頭「用空曠來大膽」的那一下才留得住)。 */
    --sky-img: url("images/sky/sky-far-light-r-1920.webp");
    --sky-pos: 50% 25%;
    --veil-a: .55;          /* 暗罩強度,0=關閉 */
    --veil-w: 66%;
    --veil-h: 86%;
    background-color: var(--t-ink-deep);
    background-image:
        radial-gradient(ellipse var(--veil-w) var(--veil-h) at 50% 50%,
                        rgba(10, 17, 32, var(--veil-a)),
                        rgba(10, 17, 32, calc(var(--veil-a) * .45)) 58%,
                        transparent 82%),
        var(--sky-img);
    background-size: auto, cover;
    background-position: center, var(--sky-pos);
    background-repeat: no-repeat, no-repeat;
}

/* ⭐⭐ 2026-08-17 業主裁示:「**可以不要重複嗎?讓每個都有差異化**」
   ⇒ 由「分組共用 5 顆」改為 **一個區段一顆鏡頭,共 12 顆覆蓋 14 條路由**。
   ⭐ 每一顆都要答得出兩件事:**它為什麼是這一頁**(§一 的意象)、**它跟別顆差在那**
      (差異必須是**主體不同**,不是同一張圖換位置——那還是重複)。對照表見 direction.md §四。
   ⭐ detail 頁**刻意**跟著所屬區段(docs-detail=docs、news-detail=news):
      讀者從列表點進內文仍在同一個地方,那是連貫不是重複。
      這不用寫 CSS —— `_core` 的 `$itemRootName` 本來就把 detail 歸給區段。
   ⚠️ 模組頁的 `nx-page--*` 由 `_core/__feInclude/_skinSetting.php` 產出(2026-08-17 新增,
      業主核准);在那之前模組頁**根本沒有頁面 class**,不符 L1 契約 §2-1。 */

/* quick-tour:已拍板的 warp,⛔零變化(業主看過並給 75–80 分) */
body.nx-page--quick-tour.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-warp-1920.webp");
    --sky-pos: 50% 100%;
    --veil-a: 0;
}
/* get-started:**傾斜的地平線** + 右上一顆導航星 ⇒ 出發的那一刻(唯一斜地平線的一顆) */
body.nx-page--get-started.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-launch-1920.webp");
    --sky-pos: 50% 12%;
    --veil-a: .5;
}
/* pricing:⭐**雙星互繞** ⇒ 兩個大小差很多的天體長期彼此環繞(唯一以「兩個主體的關係」為主體)。
   為什麼是這一頁:本頁講的是**權衡**(成本 vs 它替你換回什麼)與**長期夥伴關係**,
   而雙星正是「兩邊不等重、卻能長期穩定互繞」——不是天秤的兩邊等重。
   ⭐ `--veil-a: 0`:實量中央文字帶(x 26~74%)平均亮度僅 **17.9/255**,亮部整個收在 x 10~30%,
      加暗罩只會把畫面弄鈍(同 galaxy-band / station 的處置)。⚠️ 實際四項對比度以探針為準。 */
body.nx-page--pricing.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-binary-1920.webp");
    --sky-pos: 50% 46%;
    --veil-a: 0;
}
/* onboarding:遠處**環形軌道站**與導引光束 ⇒ 導入=接上既有結構,有人接你(唯一有人造結構) */
body.nx-page--onboarding.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-station-1920.webp");
    --sky-pos: 50% 50%;
    --veil-a: 0;
}
/* faq:右側**密集星團** ⇒ 很多問題聚在一起,每一顆都是一個疑問(唯一以「多」為主體) */
body.nx-page--faq.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-cluster-1920.webp");
    --sky-pos: 50% 50%;
    --veil-a: 0;
}
/* ⭐⭐ **模組頁的通則:文字靠左 ⇒ 亮部一律放右側**(2026-08-17 量出來的)
   個性頁文字置中,左右都空;但 faq/docs/news 的標題與麵包屑**靠左**(x≈143 起),
   左側正是文字區。實測:faq 的星團本來就在右 ⇒ 6.19 過;
   docs 的層牆與 news 的新星在左 ⇒ **3.02 / 1.77 直接掛掉**。
   ⇒ 兩張都用 `-r` 鏡射版把主體移到右側。**鏡射比重生圖便宜太多**(同 far-light 的處置)。 */

/* docs(+docs-detail):右側**層層疊疊的氣體牆** ⇒ 知識有層次、可以往深處讀(唯一強調「層」) */
body.nx-page--docs.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-strata-r-1920.webp");
    --sky-pos: 50% 50%;
    --veil-a: 0;
}
/* news(+news-detail):右側**新星閃現** ⇒ 剛發生的事,光是新鮮銳利的(唯一有事件感) */
body.nx-page--news.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-nova-r-1920.webp");
    --sky-pos: 50% 45%;
    --veil-a: .3;
}
/* termsOfService:一道極細**極規整的行星環** ⇒ 規則是筆直、可預期的(唯一幾何規整)
   ⚠️ 這一顆是**橫線**,左右閃不掉 ⇒ 只能上下閃:量到環落在 h1 上(187 列),
      改 55% 把它推到標籤之上(81 列),下方行星則移出畫面外。 */
body.nx-page--terms-of-service.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-ring-1920.webp");
    --sky-pos: 50% 55%;
    --veil-a: .3;
}
/* termsOfPrivacy:行星的**背光面**,大半在陰影裡 ⇒ 隱私=不被看見的那一面(唯一以「暗」為主體) */
body.nx-page--terms-of-privacy.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-darkside-1920.webp");
    --sky-pos: 50% 40%;
    --veil-a: 0;
}

/* 404:偏離航道 ⇒ ⭐**這一頁刻意沒有「前進」**——星軌整片斜掉、行星被右緣硬切,
   用視覺說「你偏離了」,再由 CTA 把人帶回航道。反例也是有意圖的落差。 */
body.nx-page--404.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-adrift-1920.webp");
    --sky-pos: 50% 40%;
    --veil-a: 0;            /* 這張的中央本來就是空的暗場,實測四項全過,不用暗罩 */
}
/* roi-calculator:⚠️**沿用基準鏡頭 far-light,尚未差異化**(2026-08-19)
   ⭐ 語意上其實對得上:「遠處的一束光」= 看向中長期,正是這一頁在講的事(5/10 年累積)。
   ⛔ 但 contact 也吃同一顆 ⇒ **違反業主 2026-08-17「每頁不要重複」的裁示**。
      不用「同一張圖換 --sky-pos」矇混——那是業主明講過不算差異化的做法。
      ⇒ 已列入交付清單待業主決定要不要生一張專屬的(生成圖成本低,但屬視覺輪次不是本輪範圍)。
   本規則寫成明碼(不靠 base 的隱性 fallback),是為了讓下一棒**看得到**這件事還沒做。 */
body.nx-page--roi-calculator.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-far-light-r-1920.webp");
    --sky-pos: 50% 25%;
    --veil-a: .55;
}
body.nx-theme--tech-trust .inner-banner::before { content: none; }

/* -- 每頁一行 = 換一顆鏡頭 -- */
/* security:行星壓低 ⇒ 安全不是一道牆,是長期穩定的軌道(沿著它的邊緣穩定飛行) */
/* ⭐⭐ `50% 50%` 不是隨手填的,是量出來的(2026-08-16):
   行星亮弧在 banner 座標橫跨 **198–295 列、峰值亮度 0.50**,而文字帶佔 **120–299 列**
   ⇒ 貼底(100%)時 `.inner-banner-lead` 對比只有 **1.42:1**(AA 需 4.5),整行幾乎讀不到。
   逐列剖面算出臨界值 pct ≤ 0.555 才能把亮弧整個推到 299 以下;取 50% 實測四項全過
   (label 5.44 / h1 11.84 / lead 8.29 / 麵包屑 7.87)。
   ⛔ **推到 60% 只是換一行被壓**(麵包屑掉到 1.39)——亮弧 97px、文字帶 179px,
      中間沒有空檔,不是「挑個好位置」能解的,必須整個移出去。
   ⚠️ **代價要講清楚**:亮弧移出後,「行星佔畫面更多」的意圖被壓縮成底緣一道寬光暈,
      與 warp 的差異變小。根因是 **hero 只有 341px 高而文字佔 179px**,
      任何大面積亮元素都必然壓到文字 ⇒ 要兼得,得重生成「暗行星 + 細而不亮的鋒」。 */
body.nx-page--security.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-planet-dark-1920.webp");
    --sky-pos: 50% 8%;
    --veil-a: .8;           /* 最強的一張(左側星雲 + 行星鋒),暗罩也開最強 */
}
/* about(2026-08-22 新頁):**行星環** ⇒ 一層一層疊上去、長時間才形成的穩定結構。
   為什麼是這一頁:本頁講的是「兩代、約二十年」與「兩句話放了十幾年沒有改」——
   環不是某一天出現的,是**時間累積出來的**;這正好也呼應首頁「為什麼是第一天」的年份堆疊。
   ⭐ 與 pricing 的 binary 差在**主體不同**(那顆是「兩個天體的關係」=權衡與夥伴;
      這顆是「單一天體 + 累積的環」=時間),不是同一張圖換位置〔業主 2026-08-17 裁示〕。
   ⭐ 未指派的三張只剩 ring / darkside(adrift 是 404 在用);darkside 語意偏負面,不適合本頁。
   ⛔ 341px 的 hero 放不下「環完全不壓字」的版本(見上方 security 註解的同一個結構限制)
      ⇒ 取 8% 讓 h1 落在乾淨星場、只讓環掠過 lead 與麵包屑,對比度交給暗罩;
      veil 值 = 實測四項對比度後定的,不是估的。 */
body.nx-page--about.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-ring-1920.webp");
    --sky-pos: 50% 8%;
    --veil-a: .5;
}
/* ⛔⭐ 手機要另外處理,而且原因跟桌機**不一樣**(實測 375 才發現):
   窄螢幕時 `cover` 是**依高度**放大(317/768 > 375/1920)⇒ 圖的高度剛好填滿、**一列都沒裁**,
   `background-position` 的 Y 值因此完全失效,行星亮弧整條回到畫面上、正壓在 lead 與麵包屑
   ⇒ 實測 **1.14:1 / 1.15:1**(桌機同時是 8.29 / 7.87 全過)。
   ⭐ 治法=改用 `auto 145%` 讓高度大於容器,Y 位移才重新有作用;取 6% 把亮弧推出下緣。
   代價:手機看不到行星,只剩星場+冷青綠星雲——**這是刻意的**,行星是桌機尺度的手勢,
   手機硬塞只會變成「壓在字上的一團亮」。 */
@media (max-width: 767px) {
    body.nx-page--security.nx-theme--tech-trust .inner-banner {
        /* ⚠️ 兩個圖層要各給一個值:第一個是暗罩漸層、第二個才是場景照。
           只寫一個值會被套用到兩層(把暗罩也拉成 145%)。 */
        background-size: auto, auto 145%;
        --sky-pos: 50% 6%;
    }
    /* get-started 同一個坑:手機 `cover` 依高度放大 ⇒ 一列都沒裁、Y 位移失效,
       亮行星整片回到文字底下(實測 lead 3.17)。放大到 150% 讓 Y 重新有作用。 */
    body.nx-page--get-started.nx-theme--tech-trust .inner-banner {
        background-size: auto, auto 150%;
        --sky-pos: 50% 4%;
    }
    /* termsOfService 第三次踩同一個坑:下方行星壓到麵包屑(3.30)。
       150% + 45% 讓細環落在標籤之上(≈105 列)、行星頂端退到麵包屑之下(≈233 列)。 */
    body.nx-page--terms-of-service.nx-theme--tech-trust .inner-banner {
        background-size: auto, auto 150%;
        --sky-pos: 50% 45%;
    }
    /* about 第四次踩同一個坑之前先擋住:手機 `cover` 依高度放大 ⇒ 一列都沒裁、Y 位移失效,
       環帶會整條回到文字帶上。同樣用 150% 讓高度大於容器,Y 才重新有作用;
       取 10% 把兩道環推到麵包屑之下。⚠️ 實際值以本輪手機探針實測為準,不是照抄。 */
    body.nx-page--about.nx-theme--tech-trust .inner-banner {
        background-size: auto, auto 150%;
        --sky-pos: 50% 10%;
    }
}

/* ⛔⭐⭐ **平板區間(768–991)統一保底暗罩**(2026-08-17;⚠️這個斷點專案**從來沒驗過**)
   加驗 768 才發現:這個寬度下 `cover` 幾乎不裁(768/1920 ≈ 容器高/768)⇒ **整張圖都露出來**,
   每一顆鏡頭的亮部都會回到文字帶,而且各顆位置不同、無法用單一 `--sky-pos` 解。
   ⇒ 改用**暗罩**保底:暗罩與位置無關,壓的就是文字帶。
   ⛔ **實測發現的既有缺陷**:`quick-tour`(已上線·業主已拍板)與 `404` 在 768 也不合格
      (麵包屑 2.67 / 1.59)——它們的鏡頭設定本輪完全沒動,**是原本就有的問題**,一併治掉。
   ⭐ 只影響平板;桌機與手機的觀感完全不變(業主看過的桌機樣子零變化)。
   ⚠️ 選擇器要用 `body.nx-page.nx-theme--tech-trust`(0,3,1)才蓋得過各頁鏡頭規則,
      且必須排在它們之後——同分靠順序決勝。 */
@media (min-width: 768px) and (max-width: 991px) {
    /* ⚠️ 只調 alpha 不夠(實測 .72 仍有 6 項不合格):麵包屑在 banner 約 85% 高的位置,
       正好落在橢圓**淡出的邊緣**。要連同把橢圓放大,讓淡出發生在畫面之外。 */
    body.nx-page.nx-theme--tech-trust .inner-banner {
        --veil-a: .72;
        --veil-w: 104%;
        --veil-h: 150%;
    }
    /* 404 的 adrift 是整片斜星軌(不是單一亮體),.72 之後麵包屑仍只有 3.17
       ⇒ 這一顆在平板另外加重。它是錯誤頁,可讀性優先於氣氛。 */
    body.nx-page--404.nx-theme--tech-trust .inner-banner { --veil-a: .88; }
}

/* ⛔⭐⭐ **手機的通用陷阱(本輪踩了三次,寫在這裡讓下一棒不要再踩)**:
   內頁 hero 在 375 寬時,`cover` 是**依高度**放大(容器高/768 > 375/1920)⇒ 圖的高度剛好填滿、
   **一列都沒有被裁** ⇒ `background-position` 的 Y 值**完全失效**,桌機調好的位置在手機一律無效。
   判準:`容器高 / 768 > 容器寬 / 1920` 就會發生。
   治法:`background-size: auto <145~150>%` 讓圖高大於容器,Y 才重新有作用
   (⚠️ 兩個圖層各給一個值:`auto, auto 150%`,只寫一個會把暗罩也拉大)。 */
/* system:銀河橫過上緣 ⇒ 系統是一整條結構,不是單一功能;故貼齊上緣不是下緣 */
body.nx-page--system.nx-theme--tech-trust .inner-banner {
    --sky-img: url("images/sky/sky-galaxy-band-1920.webp");
    --sky-pos: 50% 0%;
    --veil-a: 0;            /* 銀河在上緣、下方本來就是空的暗場,實測四項全過 ⇒ 不加暗罩(加了只是把畫面弄鈍) */
}

/* -- 模組頁 hero 間距對齊個性頁(2026-08-16 業主裁示)--
   出身已查:theme.css:203-212 `@media(min-width:992px)` 的 `padding-top:140px`,
   註解寫「最大選單(8 項)壓測——nav 換行兩列時 banner 內容不被蓋」=**刻意值,不是殘留**。
   實測本站選單 7 項、單列、nav 高 80px ⇒ 該情境不會發生;個性頁早就用站台層覆寫成 120。
   ⇒ 站台層再補一條給**裸** `.inner-banner`(沒有 .nx-sec--hero 的那些),**不動佈景檔**:
      佈景層那條仍在,只是被蓋住,那天真的加到 8 項、撤掉本條即可回復。
   斷點必須跟著 992——手機是 inner-pages.css 的 88/36,壓到會壞。
   ⭐ **下緣為什麼是 42 不是 16**(量出來的,不是抄個性頁的數字):個性頁的
      `.inner-banner-content` 另外掛了 `.nx-sec__head`,自帶 `margin-bottom:26px`
      ⇒ 實際留白 = 16 + 26 = **42**;模組頁沒有那個 class,實測 margin-bottom = **0**
      ⇒ 直接抄 16 會變成 16,兩邊反而差 26。要對齊的是**看得到的留白**,不是 padding 數字。 */
@media (min-width: 992px) {
    body:not(.nx-page--home) .inner-banner:not(.nx-sec--hero) { padding: 120px 0 42px; }
}
/* 文字層對比修正(A5 量測坐實,全內頁同吃;2026-08-15):
   深空底 #0a1120 上 label #1e6cff = 4.17:1、lead --t-text-soft(#6b7688)= 4.10:1,皆低於 AA 4.5。
   label 改 --t-cyan(9.2:1)=站上「深色區 eyebrow」既有語彙(.nx-eyebrow--on-dark 同色,非新色);
   lead 改 on-dark 白 .82(≈10:1)。--t-text-soft 是淺底 token,本來就不該落在深空上。 */
body.nx-theme--tech-trust .inner-banner-label { color: var(--t-cyan); }
body.nx-theme--tech-trust .inner-banner .inner-banner-lead { color: rgba(233, 238, 247, .82); }

/* ══════ B8 /quick-tour 書信體 + 首頁入口(2026-08-15 拍板;2026-08-16 業主改為書信體)══════ */
/* 業主 2026-08-16:「不用分 section,同一 section 分段落就好」「像是一封書信,我要告訴客戶的真心話」
   ⇒ 舊的五段式(時間游標 0:30→3:00 / 四數字 / 濃縮時間軸)整組移除,不留死碼。
   視覺語言臨摹業主提供的資訊圖表範例:柔和圓角、淡色底、圖示+短句,不是硬邊卡片。 */

/* -- 信體:單欄、行寬受控、段落節奏 -- */
.nx-letter__wrap { }
.nx-letter__salute { font-size: 17px; color: var(--t-text); margin: 0 0 6px; }
.nx-letter__lede {
    font-size: 19px; line-height: 1.9; color: var(--t-ink); font-weight: 500;
    margin: 0 0 34px; padding-bottom: 26px; border-bottom: 1px solid var(--t-line);
}
.nx-letter p { font-size: 16.5px; line-height: 1.95; color: var(--t-text); margin: 0 0 1.15em; }
.nx-letter p b { color: var(--t-ink); font-weight: 700; }
.nx-letter__h {
    font-family: var(--t-f-display); font-size: clamp(19px, 2.4vw, 23px); font-weight: 700;
    color: var(--t-ink); line-height: 1.6; margin: 2.2em 0 .8em;
}
/* 手寫感的段落引導線(不是裝飾線,是「這裡換一口氣」的節奏記號) */
.nx-letter__h::before {
    content: ""; display: block; width: 26px; height: 3px; margin-bottom: 12px;
    border-radius: 3px; background: var(--t-rule-grad, var(--t-accent));
}
/* 抽出來的一句心裡話 */
.nx-letter__pull {
    margin: 1.8em 0; padding: 20px 26px;
    border-left: 3px solid var(--t-accent);
    background: linear-gradient(90deg, rgba(30, 108, 255, .06), transparent);
    border-radius: 0 var(--t-radius-lg) var(--t-radius-lg) 0;
    font-size: 18px !important; color: var(--t-ink) !important;
}
.nx-letter__aside { font-size: 15.5px !important; color: var(--t-text-soft) !important; }
.nx-letter__aside a, .nx-letter a { color: var(--np-text, var(--t-accent)); }
.nx-letter__sign {
    margin-top: 2.4em; padding-top: 20px; border-top: 1px solid var(--t-line);
    font-family: var(--t-f-display); font-size: 17px !important; color: var(--t-ink) !important;
}
.nx-letter__cta { display: flex; flex-wrap: wrap; gap: 12px; margin: 26px 0 10px; }
.nx-letter__note { font-size: 13.5px !important; color: var(--t-text-soft) !important; }
/* 信裡的圖:像貼進信紙的一張照片 */
.nx-letter__fig { margin: 1.8em 0 2em; }
.nx-letter__fig img {
    display: block; width: 100%; height: auto; border-radius: var(--t-radius-lg);
    border: 1px solid var(--t-line); box-shadow: var(--t-shadow);
}
.nx-letter__fig figcaption { margin-top: 10px; font-size: 13.5px; color: var(--t-text-soft); line-height: 1.7; }
.nx-letter__fig small { color: var(--t-text-soft); }

/* -- 四個理由:**無框橫列**(v2,2026-08-16;⛔原本是 4 張圓角白卡)--
   ⛔ 病灶量測:這封信 y=1167→3449 的 2,282px 內有 **9 個**「圓角+1px 邊框+白底」容器
      (圓角值只有 12/16/18 三種)⇒ 讀者往下捲就是同一顆盒子重複九次 = 業主說的「比較僵硬」。
      這四張佔了 9 個裡的 4 個,是最大宗。
   ⭐ 判準(media-choice §二):**它本來就不是圖表,是列點**——給它卡片外觀等於讓它偽裝成元件。
      改成細分隔線 + 留白的橫列,圖示縮小退為記號,不再與圖表①③ 搶份量。 */
.nx-why { list-style: none; margin: 1.5em 0 2em; padding: 0; }
.nx-why__item {
    display: grid; grid-template-columns: 28px 1fr; gap: 2px 15px; align-items: start;
    padding: 16px 0; border-top: 1px solid var(--t-line);
    /* ⛔ 不得再加 background / border-radius / box-shadow:那就是變回卡片 */
}
.nx-why__item:last-child { border-bottom: 1px solid var(--t-line); }
.nx-why__ic {
    grid-row: span 2; width: 26px; height: 26px; padding-top: 2px;
    display: grid; place-items: center; background: none; border-radius: 0;
}
.nx-why__ic svg { width: 24px; height: 24px; fill: none; stroke: var(--t-accent); stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.nx-why__item b { font-size: 16.5px; color: var(--t-ink); font-weight: 700; }
.nx-why__item em { font-style: normal; font-size: 15px; line-height: 1.8; color: var(--t-text); }
.nx-why__item u { text-decoration: none; box-shadow: inset 0 -.5em 0 rgba(0, 200, 215, .22); }

/* -- 資訊圖表③:法定簿冊 = **書背立在檯面上**(v3,2026-08-16 業主拍板方向 A「實體檔案室語彙」)--
   ⭐ 媒材判準(media-choice §二):要傳達的是「精確資訊(名稱)+ 齊全感」⇒ DOM/SVG 的**實體隱喻**,
      不是生成圖(會捏造不存在的簿冊封面)、也不是純 chip 清單(讀不到「本」的實體感)。
      「簿冊」對公證人本來就是天天看到的實體物,「本」這個量詞就是實體的。
   ⛔⭐ v3 第一版讓書背高度隨**書名字數**變,業主判「有點亂」——**字數對讀者不是有意義的差異**,
      等於「為了亂而亂」(記憶 order-within-chaos)⇒ 改**全部等高**,實體感改由「書背標籤帶」承擔。
   ⛔ `height` 必須容得下最長書名一整行(7 字「閱覽抄錄登記簿」實測 113px),否則會折成兩直行
      且「簿」被折到最上面 = 閱讀順序斷掉(本輪實際踩到)。
   ⭐ 右側「統計與查詢」刻意**不做書背**、做躺平的報表卡 = 語彙差異對應「不同類」。 */
/* ⛔⭐ 業主 2026-08-16 二次回饋:「寬度可以和段落左右齊嗎?或是置中」。
      病灶=容器雖然是 736,但內容只到 891(段落右緣 1081)⇒ **右邊空出 190px**,看起來沒對齊。
   ⭐ 處置:書架靠左、統計卡**靠右貼齊段落右緣**,兩端都對到段落邊;
      中間的留白因此變成「兩類東西刻意分開」的分隔,而不是「右邊多出一塊」。
      (刻意不把卡片拉寬填滿——240px 是清單卡的合理寬度,拉到 440px 會變成空洞的長條。) */
.nx-ledgers {
    /* ⭐ 檯面線由容器畫、**貫通整個段落寬**:書架與統計卡站在同一條線上
          ⇒ 中間的留白從「斷裂」變成「同一個檯面上的兩區」,呼應「都在系統裡」。
          (原本 shelf 與 cards 各畫各的底線,中間斷開 230px,像兩塊無關的東西。) */
    position: relative;
    margin: 1.6em 0 1.8em; padding: 0 0 8px;
    display: grid; grid-template-columns: auto 1fr;
    gap: 0 40px; align-items: end;
}
.nx-ledgers::after {
    content: ""; position: absolute; left: 0; right: 0; bottom: 0;
    height: 2px; background: var(--t-accent);
}
.nx-ledgers__grp { min-width: 0; }
.nx-ledgers .nx-ledgers__hd { display: flex; align-items: baseline; gap: 10px; margin: 0 0 15px; }
/* 標題跟著卡片一起靠右,否則標題貼左、卡片貼右會脫節 */
.nx-ledgers__grp:last-child .nx-ledgers__hd { margin-left: auto; width: 100%; max-width: 264px; }
.nx-ledgers__hd b { font-size: 15px; font-weight: 500; color: var(--t-text); letter-spacing: .03em; }
/* 「6」是本圖主角:46px 大字。色用 --t-accent-dn(深藍)不是 --t-accent——
   `color:` 屬性走深藍是本站既定分工(6.24:1 vs 4.52:1),面積才走主藍。 */
.nx-ledgers__n {
    font-style: normal; font-size: 46px; font-weight: 700; line-height: 1;
    letter-spacing: -.03em; color: var(--t-accent-dn);
}
.nx-ledgers__shelf { display: flex; align-items: stretch; gap: 6px; }
.nx-ledgers__spine {
    position: relative; writing-mode: vertical-rl; text-orientation: upright;
    /* ⭐ 用 min-height + flex stretch(不是寫死 height):六本自動齊高到最長的那一本;
          日後加一本 8 字以上的簿冊會**一起長高**而不是折行 = 極端內容不爆版。 */
    width: 44px; min-height: 180px; padding: 20px 0;
    border: 1px solid var(--t-line); border-bottom: none; background: var(--t-card);
    font-size: 15px; letter-spacing: .08em; line-height: 1; color: var(--t-ink);
    display: flex; align-items: center; justify-content: center;
}
/* 書背標籤帶:真實登記簿書背上的那兩條,讓它讀起來是「本」不是「直立的空框」 */
.nx-ledgers__spine::before,
.nx-ledgers__spine::after { content: ""; position: absolute; left: 0; right: 0; height: 1px; background: var(--t-line); }
.nx-ledgers__spine::before { top: 13px; }
.nx-ledgers__spine::after  { bottom: 13px; }
.nx-ledgers__cards {
    list-style: none; margin: 0 0 0 auto; padding: 0; width: 100%; max-width: 264px;
    display: flex; flex-direction: column; gap: 6px;
}
.nx-ledgers__cards li {
    /* 14.5px = 沿用 v2 `.nx-ledgers__items li` 的值。⛔ 一度寫成 13.5px,等於在本輪把
       行動端字級**改小**(audit Gate 8 量到)——沿用既有字級,不順手把頁面標準改壞。 */
    font-size: 14.5px; line-height: 1.5; padding: 8px 12px;
    border: 1px solid var(--t-line); color: var(--t-ink); background: var(--t-card);
}
/* 概括項(業主 2026-08-16:「數量眾多,一一列舉必要性不高,讓客戶知道功能完整即可」)
   ⛔ 色不得用 --t-text-soft:在 --t-paper(#f7f9fc)底上實測只有 4.36:1,13.5px 不過 AA。 */
.nx-ledgers__cards li.is-more { border-style: dashed; background: transparent; color: var(--t-text); }
.nx-ledgers__cap { grid-column: 1 / -1; margin: 15px 0 0; font-size: 14px; color: var(--t-text); line-height: 1.7; }

@media (max-width: 767px) {
    .nx-letter__wrap { max-width: none; }
    .nx-letter__pull { padding: 16px 18px; }
    /* 直排書背在窄螢幕站不住 ⇒ 轉橫排標籤(**同一份 DOM 換 writing-mode**,不是兩份內容) */
    .nx-ledgers { grid-template-columns: 1fr; gap: 26px; align-items: stretch; padding-bottom: 0; }
    .nx-ledgers::after { display: none; }
    .nx-ledgers__shelf { padding-bottom: 8px; border-bottom: 2px solid var(--t-accent); }
    .nx-ledgers__cards, .nx-ledgers__grp:last-child .nx-ledgers__hd { margin-left: 0; max-width: none; }
    .nx-ledgers__shelf { flex-wrap: wrap; gap: 6px; }
    .nx-ledgers__spine {
        writing-mode: horizontal-tb; width: auto; min-height: 0; padding: 7px 12px;
        letter-spacing: .02em; display: block;
    }
    .nx-ledgers__spine::before, .nx-ledgers__spine::after { display: none; }
}

/* -- 首頁入口:置中膠囊 + 三分鐘進度環(業主拍板 1;落點=main.php #router 業主預留 div) -- */
.nx-tourlink { text-align: center; margin-top: 34px; }
.nx-tourlink__btn {
    position: relative; overflow: hidden;          /* overflow:hidden = 光束不外漏 */
    display: inline-flex; align-items: center; gap: 14px;
    padding: 12px 26px 12px 14px;
    border: 1px solid var(--t-line); border-radius: 999px;
    background: var(--t-card); text-decoration: none;
    box-shadow: var(--t-shadow);
    transition: transform .25s, border-color .25s, box-shadow .25s;
}
.nx-tourlink__btn:hover { transform: translateY(-2px); border-color: var(--t-accent); box-shadow: var(--t-glow); }
/* 光束掃過(業主 2026-08-16 裁示):像金屬反光,每 5.5s 一道極淡斜光走過;hover 時加速並提亮。
   只動 transform(規則 13);寬度給 45% 讓它是「一道」不是「一片」。 */
.nx-tourlink__btn::after {
    content: ""; position: absolute; top: -60%; bottom: -60%; left: -70%; width: 45%;
    background: linear-gradient(100deg, transparent, rgba(30, 108, 255, .13) 42%, rgba(255, 255, 255, .55) 50%, rgba(0, 200, 215, .13) 58%, transparent);
    transform: translateX(0) rotate(8deg);
    pointer-events: none;
    animation: nxSheen 5.5s ease-in-out infinite;
}
.nx-tourlink__btn:hover::after { animation-duration: 1.6s; }
@keyframes nxSheen {
    0%, 62%  { transform: translateX(0) rotate(8deg); }      /* 大部分時間停在畫面外=不吵 */
    100%     { transform: translateX(560%) rotate(8deg); }
}
@media (prefers-reduced-motion: reduce) { .nx-tourlink__btn::after { animation: none; opacity: 0; } }
.nx-tourlink__dial { position: relative; width: 44px; height: 44px; flex: 0 0 auto; }
.nx-tourlink__dial svg { width: 44px; height: 44px; transform: rotate(-90deg); display: block; }
.nx-tourlink__dial circle { fill: none; stroke-width: 3; }
.nx-tourlink__dial .bg { stroke: var(--t-line); }
.nx-tourlink__dial .fg {
    stroke: var(--t-accent); stroke-linecap: round;
    stroke-dasharray: 97.4; stroke-dashoffset: 97.4;   /* 2πr, r=15.5 */
    transition: stroke-dashoffset 1.6s cubic-bezier(.25, .1, .25, 1) .3s;
}
/* 進度環 draw:掛既有 reveal 機制(.reveal.in),零新 JS;no-JS(html 無 .js)與 reduced-motion 直接畫滿 */
.reveal.in .nx-tourlink__dial .fg,
html:not(.js) .nx-tourlink__dial .fg { stroke-dashoffset: 0; }
@media (prefers-reduced-motion: reduce) { .nx-tourlink__dial .fg { stroke-dashoffset: 0; transition: none; } }
.nx-tourlink__dial > b { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 15px; font-weight: 900; color: var(--t-accent); font-family: var(--t-f-mono); }
.nx-tourlink__txt { text-align: left; }
.nx-tourlink__txt em { display: block; font-style: normal; font-size: 12.5px; color: var(--t-text); }
.nx-tourlink__txt b { font-size: 16.5px; font-weight: 700; color: var(--np-text, var(--t-ink)); }
/* 箭頭:磁吸位移由 nx-fx.js ③ 寫 inline transform(需要滑鼠座標);
   這裡只留回彈 transition + 無 JS 時的 hover 退路(:not 讓 JS 版不打架)。 */
.nx-tourlink__arr { position: relative; font-style: normal; color: var(--t-accent); font-weight: 700; transition: transform .32s cubic-bezier(.22, 1, .36, 1); }
html:not(.js) .nx-tourlink__btn:hover .nx-tourlink__arr { transform: translateX(4px); }

@media (max-width: 420px) {
    .nx-tourlink__btn { gap: 11px; padding: 11px 20px 11px 12px; }
    .nx-tourlink__txt b { font-size: 15px; }
}

/* ══════ hero 背景 v5「場景照 + CSS 動態層」(2026-08-16 業主指示改走生成圖)══════ */
/* ⭐ 業主 2026-08-16:「你的視覺表現非常弱…是否考慮生成一張 section 用背景圖,不用整張繪製?」
      ——這句是對的,而且**判準本來就寫在 ai-image-magician**:資訊型走 DOM,**情緒/材質/情境走圖檔**。
      v1–v4 全部用 radial-gradient 手點星星 = 拿錯媒材:CSS 畫不出真實光暈、色彩層次、景深、
      星雲的有機形狀與底片顆粒,再調十版也不會好。**已改為兩層:**
        ① **底層=生成的場景照**(`images/sky/sky-warp-1920.webp`,42KB;GF31,session fc4714a2)
           ——負責質感、景深、銀河、行星輝光。
        ② **上層=既有 CSS 星場**(降透明度)——負責**動**:由中心外擴的前進視差。
      分工的理由:靜態照片沒有動、CSS 沒有質感,各給各的強項。
   ⭐ 為什麼下緣要有行星輝光:hero 與下方白色頁面原本是**硬切**,一道由暗到亮的弧線讓它自然過渡,
      同時解掉業主說的「整塊都黑、太沉重」——明暗有分布,色塊才不平。
      故背景定位 `50% 100%`(貼齊下緣),不是置中。
   ⭐ 跨頁變化(業主:「像一個場景,只是鏡頭的角度不同」)=同一個場景換鏡頭,
      機制走 `--sky-img` / `--sky-pos` 兩個變數,每頁覆寫一行即可,不必各寫一套 CSS。
   ⭐⭐ **視角基準已裁示=「前進」不是「尾窗後視」**(業主 2026-08-16:「這個角度感覺是我們在
      前進,那前進也沒問題,我們就照著這樣子去做處理」)⇒ 往後每一頁的鏡頭都以前進為準。
   ⭐⭐ **這個意象在講什麼**(業主同日給的理由,是這一段視覺的存在依據,不是裝飾):
      「我希望客戶想遠一點,思索**中長期的營運需求**,不是只有短期的付款買軟體——
        太空的未來感、前進,有符合這樣的意象。」
      ⇒ 判準:任何一顆新鏡頭都要回答得出「它跟中長期/前進有什麼關係」,答不出來就不要放。
   ⭐ 紅線不變:不搶戲、不影響文字識讀、reduced-motion 全停;動畫只動 transform / opacity。 */
.nx-sky { position: absolute; inset: 0; overflow: hidden; pointer-events: none; z-index: 0; }

/* -- ⭐ 2026-08-16:底層場景照**已移到 `.inner-banner` 自身**(見上方 A5 區段)。
      原因不是整潔,是機制:照片留在這個 div 上 = 只有「有這段 DOM 的頁面」才有鏡頭,
      模組頁(hero 出自 `_core/fe`)永遠吃不到,而且它不透明、會反過來蓋掉 `.inner-banner` 的覆寫。
      ⇒ `.nx-sky` 從此**只負責動態層**,是純疊加、可有可無。
      `--warp` 修飾子同日一併移除(它會變成零樣式的孤兒 class);模組頁的這段 DOM
      由站台層 `nx-fx.js` ④ 注入,判準是「這個 banner 有沒有 .nx-sky」而不是頁面清單。 -- */

/* -- 銀河斜帶:場景照已自帶,CSS 這層只留極淡的呼吸當「光在動」,不再負責造型 -- */
.nx-sky__galaxy {
    position: absolute; inset: -30% -10%;
    background:
        linear-gradient(107deg, transparent 34%, rgba(150, 190, 255, .05) 44%, rgba(190, 225, 255, .08) 50%,
                        rgba(140, 120, 220, .05) 56%, transparent 66%);
    filter: blur(26px);
    opacity: .85;
    animation: nxGalaxyBreathe 26s ease-in-out infinite alternate;
}
@keyframes nxGalaxyBreathe { from { opacity: .5; } to { opacity: .9; } }

/* -- 三層星場:由中心外擴 = 前進視差 -- */
.nx-sky__stars {
    position: absolute; inset: 0;
    background-repeat: no-repeat;
    will-change: transform, opacity;
    transform-origin: 50% 50%;
}
.nx-sky__stars--l1 {   /* 遠景:小、慢、最多顆 */
    background-image:
        radial-gradient(1.6px 1.6px at 6% 12%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 14% 68%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 22% 31%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 9% 88%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 30% 8%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 27% 92%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 38% 20%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 41% 80%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 58% 14%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 63% 86%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 72% 26%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 78% 74%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 86% 10%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 91% 60%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 95% 35%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 69% 95%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 17% 50%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(1.6px 1.6px at 84% 44%, rgba(255,255,255,.92), transparent 62%),
        /* v5.1 加量:業主「左右側再多一點、不要那麼均勻」⇒ 補的六顆全落在左右兩側 */
        radial-gradient(2px 2px at 3% 40%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(2px 2px at 11% 22%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(2px 2px at 24% 62%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(2px 2px at 76% 48%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(2px 2px at 89% 82%, rgba(255,255,255,.92), transparent 62%),
        radial-gradient(2px 2px at 98% 18%, rgba(255,255,255,.92), transparent 62%);
    animation: nxWarpFar 17s linear infinite;
}
.nx-sky__stars--l2 {   /* 中景 */
    background-image:
        radial-gradient(2.2px 2.2px at 11% 25%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 19% 79%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 33% 44%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 36% 66%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 48% 7%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 52% 93%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 66% 38%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 74% 58%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 81% 22%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 88% 80%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 97% 52%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 4% 62%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 25% 15%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 59% 72%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.2px 2.2px at 43% 29%, rgba(214,236,255,.95), transparent 62%),
        /* v5.1 加量:同樣偏左右兩側 */
        radial-gradient(2.8px 2.8px at 7% 36%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.8px 2.8px at 16% 88%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.8px 2.8px at 85% 64%, rgba(214,236,255,.95), transparent 62%),
        radial-gradient(2.8px 2.8px at 94% 30%, rgba(214,236,255,.95), transparent 62%);
    animation: nxWarpMid 11s linear infinite;
    animation-delay: -6s;
}
.nx-sky__stars--l3 {
    /* ⭐ v5.1 近景層改**正圓**(業主 2026-08-16:「它現在有壓扁,有點是扁的線…
       其實圓形的就可以了」「那個光點有點像是飛碟飛過,但其實我們要是星球」)。
       ⛔ 前一版用 22px×3px 的扁橢圓做「拖曳」,目視就是一條橫線=飛碟,語意錯了。
       ⭐ 「變大」怎麼來:圓點本身不變,靠整層 scale(.8→3.4) 外擴 ⇒ 越靠邊緣越大
          =逼近中的球體,這正是業主要的「有點像變大」。 */
    background-image:
        radial-gradient(3.6px 3.6px at 8% 40%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3.2px 3.2px at 23% 60%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3.4px 3.4px at 45% 88%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3.2px 3.2px at 55% 22%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3.4px 3.4px at 70% 66%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3.8px 3.8px at 89% 30%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3px 3px at 15% 5%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3.6px 3.6px at 93% 74%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3px 3px at 37% 96%, rgba(255,255,255,1), transparent 66%),
        radial-gradient(3.2px 3.2px at 61% 4%, rgba(255,255,255,1), transparent 66%);
    animation: nxWarpNear 7s linear infinite;
    animation-delay: -3.5s;
}
/* ⭐ v5 起透明度整組砍半:底下已經是一張有真實星點的照片,CSS 星場的工作從「畫星星」
   改成「讓畫面會動」——太亮會變成兩層星點打架(v4 沒有底圖時才需要那麼亮)。 */
@keyframes nxWarpFar  { 0% { transform: scale(1);    opacity: 0; }
                       12% { opacity: .38; }
                       78% { opacity: .28; }
                      100% { transform: scale(1.55); opacity: 0; } }
@keyframes nxWarpMid  { 0% { transform: scale(.9);   opacity: 0; }
                       14% { opacity: .45; }
                       72% { opacity: .3; }
                      100% { transform: scale(2.1);  opacity: 0; } }
@keyframes nxWarpNear { 0% { transform: scale(.8);   opacity: 0; }
                       18% { opacity: .6; }
                       66% { opacity: .3; }
                      100% { transform: scale(3.4);  opacity: 0; } }

/* -- 中央暗罩:文字帶亮度壓制(識讀紅線)
   ⭐ v5 放淡(.78→.52、範圍縮小):場景照的中央本來就是暗區,罩子維持原強度會**兩層相加**,
      又變回業主說的「整塊都黑」。改完必須回頭量文字對比度(見交付紀錄)。 -- */
/* ⛔⭐⭐ **暗罩必須做兩層,原因是繪製順序**(2026-08-17 實測坐實):
   `.inner-banner` 的暗罩是**背景**,而 `.nx-sky` 是它的**子元素** ⇒ 星場畫在暗罩**之上**,
   背景那層暗罩**壓不到星星**。實測:404 在 768 把 `--veil-a` 從 .72 加到 .88,
   麵包屑只從 3.17 動到 3.70 —— 因為壓在字上的是一顆**動態亮星**,不是背景。
   ⇒ 這一層(在 `.nx-sky` 內、且是最後一個子元素 ⇒ 畫在所有星層之上)也吃同一組
   `--veil-*` 變數,一個旋鈕同時管「背景」與「星場」兩層。
   ⭐ 第二個 gradient 是它原本的職責(星場基本壓制),`--veil-a` 預設 0 時只剩它
      ⇒ 已拍板的 quick-tour 桌機**零變化**。 */
.nx-sky__veil {
    position: absolute; inset: -10%;
    background:
        radial-gradient(ellipse var(--veil-w, 48%) var(--veil-h, 62%) at 50% 50%,
                        rgba(10, 17, 32, var(--veil-a, 0)),
                        rgba(10, 17, 32, calc(var(--veil-a, 0) * .45)) 58%,
                        transparent 82%),
        radial-gradient(ellipse 48% 62% at 50% 50%, rgba(10, 17, 32, .52), rgba(10, 17, 32, .16) 62%, transparent 84%);
}
/* ⛔ 2026-08-16 刪除:`.nx-sky-host::before` 的 nxStardust + nxTwinkle 兩個動畫。
   理由不是重構偏好——**實測那一層被不透明場景照 100% 蓋住**(塗紅探針畫面零紅),
   等於兩個永遠看不到的動畫在每一頁 hero 上長跑。`::before` 已於 A5 區段 `content:none`。 */

@media (prefers-reduced-motion: reduce) {
    /* ⭐ 紅線:停在**可見的靜態星空**,不是把背景抽掉變一片黑。
       場景照是 background-image,本來就不動,不受這裡影響 ⇒ 關掉動態層後畫面仍有完整星空。 */
    .nx-sky__stars, .nx-sky__galaxy { animation: none !important; }
    /* 不動了就別再要合成層——will-change 對低階裝置是實質成本,而這正是這群使用者 */
    .nx-sky__stars { will-change: auto; }
    .nx-sky__stars--l1 { opacity: .38; transform: scale(1.18); }
    .nx-sky__stars--l2 { opacity: .34; transform: scale(1.45); }
    .nx-sky__stars--l3 { opacity: .30; transform: scale(1.9); }
    .nx-sky__galaxy { opacity: .7; }
}
@media (max-width: 767px) {
    .nx-sky__galaxy { filter: blur(18px); }
}

/* ══════ hero 時鐘膠囊(唯一自舊世代保留的規則;DOM 見 quick-tour.php hero)══════ */
/* -- hero 時鐘膠囊(靜態徽章;深空底上) -- */
.nx-tour__clock { display: inline-flex; align-items: center; gap: 9px; margin: 16px 0 0; padding: 7px 18px; border: 1px solid rgba(233, 238, 247, .28); border-radius: 999px; font-size: 14px; color: rgba(233, 238, 247, .85); }
.nx-tour__clock i { width: 16px; height: 16px; border: 2px solid var(--t-cyan); border-radius: 50%; position: relative; flex: 0 0 auto; }
.nx-tour__clock i::before { content: ""; position: absolute; left: 50%; top: 50%; width: 2px; height: 5px; margin: -5px 0 0 -1px; background: var(--t-cyan); border-radius: 1px; transform-origin: 50% 100%; }
.nx-tour__clock i::after  { content: ""; position: absolute; left: 50%; top: 50%; width: 2px; height: 4px; margin: -1px 0 0 -1px; background: var(--t-cyan); border-radius: 1px; transform: rotate(-100deg); transform-origin: 50% 0; }

/* ⛔ 2026-08-16 清理紀錄(避免再犯):本檔原有三個世代的 nx-sky / nx-tour 區段,
   新版被「加在檔案前面」,而 CSS 後者勝 ⇒ **舊世代反而贏過新世代**。
   實測被覆蓋的兩處:`.nx-sky__veil`(舊 62%×78% .82 蓋掉新 52%×68% .78 ⇒ hero 中央被壓得更黑)
   與 `@keyframes nxTwinkle`。已刪除 Gen B(A5-v3 極光 + 書信體重複)與 Gen C(A5-v2 極光 +
   B8 五段式 nx-tour__cur/__facts/__go/__say/__day/__shots),共 387 行;
   刪除前逐一確認 DOM 使用次數為 0(nx-tourlink 5 次與 nx-tour__clock 1 次故保留)。
   ⭐ 規矩:改版一律**就地改**或**加在檔尾**,不要把新版塞到舊版前面。 */

/* ══════════════════════════════════════════════════════════════════════
   資訊圖表①「步驟鏈對比」+ ②「三層同心防護」(2026-08-16)
   出身:業主判 AI 插畫 0 分「對說明沒有任何意義、反而是干擾」「一張圖要代表更多資訊」
        ⇒ 資訊型一律 DOM+SVG,不用生成圖(生成圖只做氛圍,見 hero 那一段)。
   ⭐ 三張圖各用**不同的結構邏輯**:①垂直鏈條 ②巢狀同心 ③左側組名軌;
      用同一種圓角盒做三次=又變回排排站。
   ══════════════════════════════════════════════════════════════════════ */

/* ── ① 步驟鏈對比 = **兩條軌道**(v3,2026-08-16 業主拍板方向 A)────────────
   ⛔ v2 是兩個等高的圓角白盒。業主 2026-08-16 判「感覺比較僵硬」;
      實測病灶=整封信 2,282px 內有 9 個幾乎同一種的圓角白盒,本圖佔 2 個。
   ⭐ v3 拿掉外框盒,改「兩條軌道」:左=空心號碼 + **斷開的虛線**(一段一段重來),
      右=實心號碼 + **一條連續的軌**(走完就到底)。旅程語彙與 hero「前進」母題同源。
   ⭐⭐ 業主 2026-08-16 **推翻自己 v2 的「兩欄等高」裁示**:「就這樣,短本身就是論據」——
      沒有盒子邊緣就沒有「參差」可看,右欄短一截 = 這條路真的比較短。**不要再改回等高。**
   ⭐ 保留編號圓(v1/v2 就有):11 個編號本身就是「很多步」的證據,換成圓點會弱化論據;
      主從差改由**尺寸與實心/空心**承擔(左 20px 空心灰 / 右 24px 實心藍)。
   ⛔ 出血寬度寫在本規則裡,**不用共用 .bleed class**——元件自己的 `margin:` 簡寫會蓋掉
      它的 margin-left,只剩 transform ⇒ 整塊往左飛 470px(本輪在骨架階段實際踩到)。
   ⭐ 右欄產出物**掛在第 3 步底下**(nested),因為它們是那一步的結果,不是另一個階段。 */
/* ⛔⭐ 業主 2026-08-16 二次回饋:「寬度與整個版面寬度不太一致,感覺可以再緊緻一點」。
      病灶=940px 是**曖昧的中間值**——既沒對齊文字段落(736),也不像圖表②(1100)那樣明顯破格
      ⇒ 讀者只看到「沒對齊」,看不到「刻意出血」。
   ⭐ 處置:**切齊段落 736**。這同時讓 `.nx-shield`(1100 照片)成為全信**唯一**的破格 = 主角更清楚。
      要拉開對比就拉得夠狠,一個曖昧的中間值只會讓畫面顯得猶豫(charter)。 */
.nx-steps {
    margin: 1.7em 0 2em; padding: 0;
    display: grid; grid-template-columns: 1fr 1.15fr; gap: 30px; align-items: start;
}
/* ⛔ 不得再給 .nx-steps__col 加 border / background / border-radius:那就是變回盒子 */
.nx-steps__col { position: relative; padding: 2px 0 0; }
.nx-steps .nx-steps__hd {
    display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
    margin: 0 0 4px; padding-bottom: 11px; border-bottom: 1px solid var(--t-line);
}
.nx-steps__col--system .nx-steps__hd { border-bottom-width: 2px; border-bottom-color: var(--t-accent); }
.nx-steps__tag { font-size: 12.5px; letter-spacing: .05em; white-space: nowrap; color: var(--t-text); }
.nx-steps__col--system .nx-steps__tag { color: var(--t-accent-dn); font-weight: 500; }
/* 主從拉開:17 → 26px。曖昧的中間值只會讓畫面顯得猶豫 */
.nx-steps .nx-steps__hd b { font-size: 17px; font-weight: 500; color: var(--t-text); }
.nx-steps__col--system .nx-steps__hd b { font-size: 26px; font-weight: 700; color: var(--t-ink); }

.nx-steps__list { list-style: none; margin: 12px 0 0; padding: 0; counter-reset: nxstep; }
.nx-steps__list > li {
    counter-increment: nxstep; position: relative;
    padding: 0 0 0 32px; margin: 0 0 11px;
    font-size: 15px; line-height: 1.6;
}
.nx-steps__list > li:last-child { margin-bottom: 0; }
.nx-steps__list > li::before {          /* 編號圓 */
    content: counter(nxstep); position: absolute; left: 0; top: .1em;
    border-radius: 50%; display: grid; place-items: center;
    font-family: var(--t-f-mono); line-height: 1;
}
/* 左:空心細環 + **每段各自起訖的虛線**(斷開=一段一段重來) */
.nx-steps__col--manual .nx-steps__list > li { color: var(--t-text); }
.nx-steps__col--manual .nx-steps__list > li::before {
    width: 20px; height: 20px; font-size: 11px;
    border: 1px solid var(--t-line); background: var(--t-card); color: var(--t-text);
}
.nx-steps__col--manual .nx-steps__list > li::after {
    content: ""; position: absolute; left: 10px; top: calc(.1em + 22px); bottom: -9px;
    width: 0; border-left: 1px dashed var(--t-text-soft); opacity: .5;
}
.nx-steps__col--manual .nx-steps__list > li:last-child::after { display: none; }
/* 右:實心藍圓 + **一條連續的軌**(單一 ::before,不分段)
   ⛔ 軌線掛在 .nx-steps__list 上、不掛在 .nx-steps__col 上——掛在 col 上就得把表頭高度
      算進 top,漏算就會穿過表頭把字切掉(本輪在骨架階段實際踩到)。 */
.nx-steps__col--system .nx-steps__list { position: relative; }
.nx-steps__col--system .nx-steps__list::before {
    content: ""; position: absolute; left: 11.5px; top: calc(.1em + 12px); bottom: 12px;
    width: 1.5px; background: var(--t-accent); opacity: .55;
}
.nx-steps__col--system .nx-steps__list > li { color: var(--t-ink); font-weight: 500; }
.nx-steps__col--system .nx-steps__list > li::before {
    width: 24px; height: 24px; font-size: 12px; font-weight: 700;
    background: var(--t-accent); color: #fff;
    box-shadow: 0 0 0 3px var(--t-card);    /* 讓軌線在號碼處斷開;⛔實測信體底色是純白=--t-card,用 --t-paper 會留一圈淡環 */
}

.nx-steps .nx-steps__foot {
    margin: 16px 0 0; padding-top: 12px; border-top: 1px solid var(--t-line);
    font-size: 13.5px; color: var(--t-text); line-height: 1.75;
}

/* 第 3 步底下的產出物 = 全圖唯一的橫向擴張點(主角)。
   實線=每件都有,虛線淺色=視案件需要(業主指定)。
   引出線改成「貼著產出物左緣的一條細軌」=這些東西從屬於這一步,比孤立的小勾好讀。 */
.nx-steps__list > li.has-outs { padding-bottom: 4px; }
/* ⛔ 這裡曾加過一條自己的引出線,拿掉了:主軌就在左邊 23px 處,兩條平行細線只是雜訊,
      縮排 13px 已足夠表達「這些是第 3 步的產出」。(交付紀律:刪一項且不變差) */
.nx-steps__fan { margin: 11px 0 8px; padding: 2px 0 2px 13px; }
.nx-steps__outs { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
/* ⛔ 原本 flex-wrap 自然流排在 478px 欄寬下變成 5+1 的孤兒 ⇒ 固定 3 欄,兩列各 3 個 */
.nx-steps__outs--opt { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.nx-steps__outs li {
    position: relative; padding: 5px 11px 5px 24px;
    background: var(--t-card); border: 1px solid rgba(30, 108, 255, .28);
    font-size: 13.5px; color: var(--t-ink); line-height: 1.4;
}
.nx-steps__outs li::before {
    content: ""; position: absolute; left: 9px; top: 50%; width: 8px; height: 5px;
    margin-top: -3.5px; border-left: 2px solid var(--t-cyan); border-bottom: 2px solid var(--t-cyan);
    transform: rotate(-45deg); border-radius: 1px;
}
.nx-steps__outs--opt { margin-top: 6px; }
.nx-steps__outs--opt li {
    background: transparent; border-style: dashed; border-color: rgba(110, 122, 142, .45);
    color: var(--t-text);
}
.nx-steps__outs--opt li::before { border-left-color: var(--t-text); border-bottom-color: var(--t-text); opacity: .6; }
.nx-steps__optnote { display: block; margin-top: 8px; font-size: 12.5px; color: var(--t-text); }

/* ⛔ 原本是置中粗體 + 橫跨全寬的線,兩欄之間那塊留白會讓它看起來「斷裂」⇒ 改短起線、靠左 */
.nx-steps__cap {
    grid-column: 1 / -1; position: relative; max-width: 62ch;
    margin: 10px 0 0; padding-top: 15px;
    font-size: 15px; font-weight: 400; color: var(--t-text); line-height: 1.75;
}
.nx-steps__cap::before { content: ""; position: absolute; left: 0; top: 0; width: 44px; height: 2px; background: var(--t-accent); }

/* 兩欄在窄畫布會把產出物擠爛 ⇒ 900px 就堆疊(比全站 767 早,是本元件專屬需求)。
   ⚠️ 媒體查詢不增加具體度 ⇒ 本區塊必須排在上面基礎規則之後才有效。 */
@media (max-width: 900px) {
    .nx-steps { grid-template-columns: 1fr; gap: 26px; }
}

/* ── ② 「資料在你的門內」場景圖 + 真文字疊層(v2,2026-08-16 業主點名重做)──────
   ⛔ v1 是三個上下堆疊的圓角方框,業主:「資訊本身沒問題,但**感覺沒有加分**…這裡是最弱的地方」。
      病灶=我畫的是清單不是圖。v2 改走**場景**:質感交給生成圖,中文交給排版,兩邊都拿最強的。
   ⭐ 滿版出血:圖表掙脫 46em 的信件文字欄——**窄欄本身就會逼出清單式版面**,這是 v1 失敗的結構性原因。
   ⭐ 標籤是絕對定位的**真文字**(可選取、可被螢幕閱讀器讀到、任何解析度清晰);
      手機改為圖下堆疊(絕對定位在窄螢幕必糊),不是兩份內容。 */
.nx-shield { margin: 1.8em 0 1.8em; padding: 0; width: min(1100px, 92vw); margin-left: 50%; transform: translateX(-50%); }
.nx-shield__scene { position: relative; padding: 6px 0 36px; }   /* 下方留白=給工程師那條標籤落腳,避免壓在人物上 */
.nx-shield__img { display: block; width: 100%; height: auto; border: 0; box-shadow: none; }
.nx-shield__notes { list-style: none; margin: 0; padding: 0; }
.nx-shield__note { position: absolute; max-width: 30%; }
.nx-shield__note b {
    display: block; font-size: 16px; font-weight: 700; color: var(--t-ink); line-height: 1.5;
    padding-left: 15px; position: relative;
}
.nx-shield__note b::before {          /* 指向元素的小色標(取代拉線,窄處不會打架) */
    content: ""; position: absolute; left: 0; top: .46em;
    width: 7px; height: 7px; border-radius: 50%; background: var(--t-accent);
}
.nx-shield__note em {
    display: block; margin-top: 3px; padding-left: 15px;
    font-style: normal; font-size: 13.5px; line-height: 1.7; color: var(--t-text);
}
/* 位置以圖面實測為準(1200×509 原圖):室內在左、門在右緣、雲與工程師在門外 */
.nx-shield__note--home   { left: 0;    top: 20%; }
.nx-shield__note--backup { left: 0;    top: 62%; }
.nx-shield__note--net    { left: 63%;  top: 0;   max-width: 36%; }
.nx-shield__note--net b::before    { background: var(--t-cyan); }
.nx-shield__note--eng    { left: 57%;  top: 84%; max-width: 43%; }   /* ⛔ 原 64%/66% 實測壓在工程師身上(白底黑字疊藍工作服) */
.nx-shield__note--eng b::before    { background: var(--t-text-soft); }

@media (max-width: 767px) {
    /* .nx-steps 的堆疊已由上面的 900px 區塊處理;此處只留手機專屬微調 */
    .nx-steps__cap { max-width: none; }
    .nx-shield { width: auto; margin-left: 0; transform: none; }
    .nx-shield__scene { padding-bottom: 0; }   /* 桌機那 36px 是給疊層標籤留的,手機標籤已改堆疊 */
    .nx-shield__note { position: static; max-width: none; margin-top: 14px; }
    .nx-shield__notes { margin-top: 4px; }
}

/* ── ⛔ 母版級缺陷修補:內文清單的字色掉回母版灰(#888)⇒ 不過 AA ──────────────
   出身:2026-08-17 整站對比度掃描(`_core/tools/contrast_probe.js`,991 個元素/15 條路由)。
   母版 `master.css` 有一條全域 `ul li { color: #888 }`。
   段落 `<p>` 有被 `.nx-c-prose { color: var(--t-text) }` 蓋掉,**但 `<li>` 沒有** ⇒
   條款頁與文章內頁的清單項目全部停在 #888:
     · termsOfService / termsOfPrivacy 的 `<li>` 15.5px → **3.54:1**(10 個節點)
     · docs-detail / news-detail 的 `<li>`、`<strong>` 16px → **3.36:1**(35 個節點)
   ⭐ 這不是「配色選得太淺」,是**同一段內文裡段落與清單不同色**的不一致 ——
      改成 `--t-text` 之後清單與它上下的段落一致,順便就過了 AA(11.14:1)。
   ⛔ 範圍:只修 NotaPro 這個租戶(tenant 層)。哈吉/demo/staging 吃各自的 master.css 複本,
      同樣中這條,**已登記待業主裁示**(與 focus 環那次同樣的分站作法,避免一次動三站無法逐站覆驗)。 */
body.nx-theme--tech-trust .nx-c-prose li,
body.nx-theme--tech-trust .news-article li { color: var(--t-text); }

/* ══════════════════════════════════════════════════════════════════════════
   ⭐ AA 對比度批(2026-08-17 業主裁示)——**小於 18px 的字不用品牌藍/橘當前景色**
   ──────────────────────────────────────────────────────────────────────────
   出身:整站掃描 `_core/tools/contrast_probe.js`(991 元素 / 15 條路由)。
   前一批修掉「文字太淺」那四個根之後,剩下 7 個根**全部是同一件事**:
   品牌藍 `--t-accent`(#1e6cff)與品牌橘 `--t-seal`(#e8542f)被拿來當**小字的前景色**。
   兩支色票在淺底上都只有 3.66~4.29,**天生就不夠當內文級小字**。
   ⇒ 業主裁示一條規則(而不是逐點微調):**<18px 的字改用已經存在的深階色票**
     (藍走 `--t-accent-dn`,橘走加深後的 `--t-seal`),大字/色塊/線條不受影響。
   ⇒ 好處是**以後不會再長出來** —— 新元件只要照這條寫就不會再違規。

   ⛔⭐⭐ 這一批裡有 **兩個** 是「寫得出、跑得動、沒生效」(本專案第三、四次):
     · `.nx-btn--primary` 明明寫了 `color:#fff`,但 theme.css 有一條
       `body.nx-theme--tech-trust .nx-sec--cta a`(0,2,1)壓過租戶的(0,2,0)
       ⇒ CTA 區的按鈕字其實是 `--t-paper`(#f7f9fc)= **4.29 不過 AA**。
     · `.faq-group-title` 同理,theme.css 用 `--t-gilt`(在本主題=品牌藍)蓋掉母版值。
   ⇒ 治法一律**補足具體度**,不加 `!important`;**判準是量 computed color,不是看寫了什麼**。
   ══════════════════════════════════════════════════════════════════════════ */

/* ① 小標 eyebrow:品牌藍 → 深階藍(實量 4.02 → 5.55 on --t-paper-soft) */
.nx-eyebrow { color: var(--t-accent-dn); }

/* ② FAQ 群組標題:theme.css 用 --t-gilt(本主題=品牌藍)⇒ 同層覆寫(site.css 載在後面) */
body.nx-theme--tech-trust .faq-group-title { color: var(--t-accent-dn); }

/* ③ 主按鈕字:被 theme.css 的 `.nx-sec--cta a`(0,2,1)壓成 --t-paper
      ⇒ 用 3 個 class + 元素 (0,3,1) 贏回來。實量 4.29 → 4.52(含按鈕內的 → 箭頭) */
body.nx-theme--tech-trust a.nx-btn.nx-btn--primary,
body.nx-theme--tech-trust a.nx-btn.nx-btn--primary:hover,
body.nx-theme--tech-trust a.nx-btn.nx-btn--primary:focus { color: #fff; }

/* ④ docs-detail 深色 CTA 區(母版 inner-pages.css):
      ·「下一步」小標原本是深藍字壓深藍底 = **2.67**,深階藍在深底上只有 3.02 更糟
        ⇒ 深底上不能用藍,改**淺化的藍白**(保留藍的身分,但亮度拉到讀得到)。
      · 主按鈕字被 theme.css 壓成 --t-ink(深藍黑)壓藍底 = 3.84 ⇒ 拉回白。 */
body.nx-theme--tech-trust .svc-cta-section .svc-cta-label { color: #cddcff; }
body.nx-theme--tech-trust .svc-cta-section a.btn-svc-cta-primary,
body.nx-theme--tech-trust .svc-cta-section a.btn-svc-cta-primary:hover { color: #fff; }

/* ⑤ header 品牌字「notarPro」——**只在手機出現**(桌機字級夠大,吃 WCAG 大字 3:1 門檻)。
   色值 `#0d7eba` 出自母版 `master.css`(公證人站的品牌藍殘留,**不是本主題的 token**),
   17px/400 在白底實量 **4.46**,差 AA 一點點(0.04)。
   ⭐ 刻意只壓深 2%(#0d7bb6 = 4.64)而**不換成 `--t-accent-dn`**:
     換色票會改到品牌字的色相、與 logo 圖不搭 —— 這是「過線」不是「配色不對」,
     用最小改動過線即可,不要順手改設計。
   ⚠️ 母版殘留品牌色本來就該整批收斂(2026-07-25 已做過一輪),這是漏網的一顆,已登記。 */
body.nx-theme--tech-trust nav.navbar.bootsnav.navbar-fixed.on .itemXHeaderCpyPreName { color: #0d7bb6; }

/* ⑥ ⛔⭐ `aria-hidden="true"` 的字**照樣要過對比度**。
   出身:我的探針原本把 aria-hidden 一律跳過(理由「裝飾層不是要讀的字」),
   跑 Lighthouse 才發現它照樣算 —— 而且它是對的:`aria-hidden` 只讓**螢幕閱讀器**略過,
   **視覺使用者照樣看得到**。分流卡的序號 01/02/03(21 個節點)與「點一下」提示都屬這類。
   探針已修成「照常量、另外標記」,不再替設計者決定「這個不用看」。
   實量:序號 4.29 → 5.91、點一下 4.02 → 5.55(皆 on --t-paper / --t-paper-soft)。 */
.nx-router__opt .ic { color: var(--t-accent-dn); }
.nx-proof__arrow { color: var(--t-accent-dn); }

/* ⚪ 唯一保留的例外:`.nx-hero__wordmark`(210px、`rgba(255,255,255,.05)` 的巨型浮水印)。
   它是**背景質感**不是要讀的字(5% 不透明度、字級 210px),對比 1.12 屬預期。
   ⇒ 若日後探針又報它,是預期內,不要「修」它 —— 修了就變成一塊搶戲的大字。 */

/* ── ⛔ 母版級缺陷修補:docs-detail 的 CTA 區塊在桌機被切掉 ──────────────────────
   出身:`_core/fe/docs-detail.php:490` 在文章欄內用了 `<div class="container">`,
   而母版 Bootstrap 3 的 `.container` 是**固定寬**(≥1200px 時 width:1170px,
   ≥992 時 970、≥768 時 750),不是 max-width。
   症狀(2026-08-17 實拍坐實):文章欄實寬只有 750px,固定寬 1170 的容器整個溢出被裁,
   標題「想看實際的畫面，還是直接聊聊？」在 1440 只剩「聊？」兩字;991/375 反而正常
   (那兩段的固定寬 970/750 剛好 ≤ 欄寬)。
   治法:只在這個區塊把 `.container` 改回流動,不動母版全域 `.container`(全站都靠它)。
   ⚠️ 跨租戶:`inner-pages.css` 是母版複本,no8 / demo / staging **四站都有這段**,
      同款缺陷應同款修;本輪只修 notarPro,哈吉正式站待業主裁示(交接單 §六)。 */
.svc-cta-section .container { width: auto; max-width: 100%; }

/* ── ⛔ 母版 reset 吃掉清單項目符號:第三次(前兩次=條款頁 .nx-c-prose)────────────
   母版 `assetsFE/css/master.css` 有全域 `ul { padding:0; list-style:none }`,
   而 `inner-pages.css:1147` 只給 `.news-article-body ul` 設了 padding-left,**沒設回 list-style**
   ⇒ docs-detail / news-detail 的 DB 內文清單(實測 news 21 個 <li>、docs 14 個)
     全部沒有項目符號,讀起來像斷掉的散段(2026-08-17 實拍坐實)。
   ⚠️ 這是「同一個根、換一個容器就再犯一次」——治法與 .nx-c-prose 同款,刻意寫成一樣好對照。 */
.news-article-body ul { list-style: disc outside; }
.news-article-body ol { list-style: decimal outside; }
.news-article-body li { display: list-item; }
.news-article-body li::marker { color: var(--t-accent); }

/* ── hero 副標孤行(寡行)治理 ────────────────────────────────────────────────
   出身:security 的副標最後一行只剩「分。」兩字(2026-08-17 實拍 + Range 逐字量測坐實:
        第一行 38 字、第二行 2 字)。
   ⭐ 治法選 `text-wrap: balance` 而不是改字:改字只治這一句,下次換文案又會冒出來;
      balance 讓瀏覽器把行長平均,實測切在語意斷點(破折號前)——
      「當事人的資料放在那、誰看得到、壞了怎麼救 / ——這一頁講清楚，包括我們做不到的部分。」
   ⚠️ 零回歸:不支援的瀏覽器直接忽略此宣告 = 維持現狀,不會壞版。 */
.inner-banner-lead,
.nx-hero-lead { text-wrap: balance; }

/* ── docs / news 列表「無圖」佔位:灰塊 + 破圖 icon → 分類示意圖 ────────────────
   出身:業主 2026-08-17 裁示(缺陷清單 §四-2)。原本是 746×350 的空灰塊配一顆破圖 icon,
        是列表頁**最大的視覺元素**,而且看起來像「這站還沒做完」。
   ⭐ 媒材判斷(media-choice §二/§四):這一塊要傳達的是**分類辨識 + 版面節奏**(情境/質感),
      不是精確資訊 ⇒ 走生成圖,不是 DOM/SVG;並延續全站已建立的宇宙鏡頭語彙(整體感),
      三張**主體與色調都不同**,不是同一張換位置:
        評估與選型 = 三顆錯落的星體、只有一顆被照亮且對焦(從候選裡挑一個)
        案例分享   = 一條連續光帶航跡收束到暖金落點(別人已經走過這條路)
        系統更新   = 偏右一顆新星閃現 + 塵環(剛剛有東西變新了)
   ⭐ 走 CSS background 不走 <img>:裝飾影像進 DOM 等於要各租戶範本加鉤子;
      這裡只需要 `_core` 輸出一個 data-cat 屬性,換站換圖只改本檔十行。
   ⚠️ 分類 id 來自本租戶 sundriestab 種子(docs:評估與選型=10、案例分享=2;news:新訊類別=1),
      **id 是租戶自己的,別的租戶同一個數字意義不同** ⇒ 規則一律先用 .nx-page--* 收窄作用域。
   ⭐ 沒對到 id 的分類會吃該頁的預設圖(不是退回破圖 icon)——新增分類時最差也只是圖不夠貼切。
   ⚠️ 圖檔快取:`nxAssetVer()` 不涵蓋圖檔 ⇒ **要換圖一律換檔名,不要覆蓋同名檔**。 */
/* ⛔ size/position/repeat 也必須放在**同樣帶 body 主題 class** 的層級:
   theme.css 那條 `background` 簡寫連 background-size 一起重設成 auto,
   只把 background-image 提上去、size 留在低具體度規則 ⇒ 圖出得來但不填滿(實測 bgSize=auto)。 */
body.nx-theme--tech-trust .article-card-thumb-placeholder {
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
}
.article-card-thumb-placeholder svg { display: none; }   /* 破圖 icon 拿掉 */

/* ⛔ 必須帶 `body.nx-theme--tech-trust`,不是偷懶:theme.css 有
      `body.nx-theme--tech-trust .article-card-thumb-placeholder { background: var(--t-paper-soft) }`
      ——① `background` **簡寫**會把 background-image 重設成 none
        ② 具體度 (0,2,1) 高過 `.nx-page--docs .article-card-thumb-placeholder` 的 (0,2,0)
      ⇒ site.css 載在最後**也贏不了**。第一版就是這樣「寫得出、跑得動、computed 是 none」。
      判準用 computed 實測,不要用「我的檔載比較後面」推論。 */
body.nx-theme--tech-trust.nx-page--docs .article-card-thumb-placeholder               { background-image: url("images/cat/cat-evaluating_1492x700.webp"); }
body.nx-theme--tech-trust.nx-page--docs .article-card-thumb-placeholder[data-cat="2"] { background-image: url("images/cat/cat-casestudy_1492x700.webp"); }
body.nx-theme--tech-trust.nx-page--news .article-card-thumb-placeholder               { background-image: url("images/cat/cat-update_1492x700.webp"); }

/* ══════════════════════════════════════════════════════════════════════════
   /get-started 「怎麼開始」整頁重寫(2026-08-18,業主口述「我們一般的流程」)
   --------------------------------------------------------------------------
   三個新元件家族,已登記 `___AI-Agent-Area/___extRules/fe-vocab-registry.md`:
     `nx-journey` 兩段一決定點的旅程地圖 / `nx-ask` 訪客直球提問段 / `nx-plan` 導入步驟清單
   ⭐ 媒材判斷(記憶 media-choice-before-craft):旅程 = **關係拓樸** ⇒ DOM/CSS 畫,
      不是生成圖(生成圖讀不出「那一段是虛線、那一點是決定點」)。
   ⭐⭐ 三段軌線一律畫在盒子的 **border 邊緣**,不用 % 絕對定位 ⇒ **由構造保證不會撞到文字**
      (出身:260817_14 流星用 % 定位,1500 過但 1200/991 都撞到文字;
       記憶 one-breakpoint-verified-is-not-verified)。
   ⛔ 刻意**沒有任何圓角白盒**:三段都是無框文字塊,差異全部由「軌線材質」承擔
      —— 沿用 quick-tour `nx-steps` v3 與 `nx-why` 的既有裁示(業主批過「排排站/盒中盒」)。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── ① nx-journey:第一段 → 決定點 → 第二段 ────────────────────────────────
   桌機=一條橫貫的軌,三段材質不同(灰虛線 / 橘節點 / 藍實線);手機=改走左側直軌。
   ⭐ 差異對應內容差異(記憶 order-within-chaos):虛線=還沒承諾、實線=已經開始,
      橘色只用在**決定點**這一個位置(全站橘=節制使用的關鍵標記)。 */
.nx-page--get-started .nx-journey {
    display: grid; grid-template-columns: 1fr 172px 1fr; gap: 0;
    align-items: stretch; max-width: 1000px; margin: 0 auto;
}
.nx-page--get-started .nx-journey__leg { position: relative; padding: 2px 0 26px; }
/* 左段:灰虛線=「這一段還沒有任何承諾」 */
.nx-page--get-started .nx-journey__leg--look {
    padding-right: 30px; border-bottom: 2px dashed rgba(100, 110, 126, .55);
}
/* 右段:藍實線=「決定之後,一條路走到上線」 */
.nx-page--get-started .nx-journey__leg--go {
    padding-left: 30px; border-bottom: 2px solid var(--t-accent);
}
/* 末端箭頭:貼著軌線右端(bottom 定位,不吃 %)⇒ 走完就到「開業上線」 */
.nx-page--get-started .nx-journey__leg--go::after {
    content: ""; position: absolute; right: -1px; bottom: -6px;
    border-top: 5px solid transparent; border-bottom: 5px solid transparent;
    border-left: 9px solid var(--t-accent);
}
.nx-page--get-started .nx-journey__tag {
    margin: 0 0 8px; font-size: 12px; letter-spacing: .18em; font-weight: 600;
    color: var(--t-text-soft);
}
.nx-page--get-started .nx-journey__leg--go .nx-journey__tag { color: var(--t-accent-dn); }
.nx-page--get-started .nx-journey__name {
    margin: 0 0 10px; font-family: var(--t-f-display);
    font-size: 22px; font-weight: 700; color: var(--t-ink); line-height: 1.4;
}
.nx-page--get-started .nx-journey__say {
    margin: 0 0 8px; font-size: 15.5px; line-height: 1.8; color: var(--t-text);
}
/* ⭐ 孤行治理沿用站上既有做法(`.inner-banner-lead` 用 text-wrap: balance)。
   ⛔ 先試 `text-wrap: pretty` **無效**——實測改完仍是「…完全沒 / 問題。」:
      pretty 只治「最後一行單獨一個 word」,而中文沒有 word 邊界 ⇒ CJK 要用 `balance`(平均行長)。 */
.nx-page--get-started .nx-journey__say,
.nx-page--get-started .nx-journey__foot { text-wrap: balance; }
.nx-page--get-started .nx-journey__foot {
    margin: 0; font-size: 14.5px; line-height: 1.8; color: var(--t-text-soft);
}
.nx-page--get-started .nx-journey__foot b { color: var(--t-ink); font-weight: 700; }

/* 決定點:菱形騎在軌線上(bottom 定位)。底色=區塊底色,讓軌線在此**斷開** */
.nx-page--get-started .nx-journey__gate {
    position: relative; display: flex; flex-direction: column;
    justify-content: flex-end; align-items: center; text-align: center;
    padding: 2px 12px 26px; border-bottom: 2px solid var(--t-seal);
}
.nx-page--get-started .nx-journey__mark {
    position: absolute; left: 50%; bottom: -13px; width: 24px; height: 24px;
    margin-left: -12px; transform: rotate(45deg);
    /* ⛔ 實測:母版 master.css 有 `section { background: #fff }` ⇒ `.nx-sec` 的實際底色是**純白**,
       不是 --t-paper(#f7f9fc)。用 --t-paper 會在白底上留一塊看得出來的灰菱形。 */
    background: var(--t-card); border: 2px solid var(--t-seal); border-radius: 2px;
}
.nx-page--get-started .nx-journey__gatetxt { margin: 0; line-height: 1.5; }
.nx-page--get-started .nx-journey__gatetxt b {
    display: block; font-size: 16px; font-weight: 700; color: var(--t-ink);
}
/* ⛔ 這行是 13px 小字 ⇒ **不用 --t-seal 當前景色**(content-decisions §十) */
.nx-page--get-started .nx-journey__gatetxt em {
    display: block; font-style: normal; font-size: 13px; color: var(--t-text-soft); margin-top: 2px;
}

/* 手機:橫軌在 375 會把三段擠成碎片 ⇒ 改左側直軌(材質分段的語意完全保留)。
   ⚠️ 媒體查詢不增加具體度 ⇒ 本區塊必須排在上面基礎規則之後才有效(記憶:整批 RWD token 曾因此失效)。 */
@media (max-width: 860px) {
    .nx-page--get-started .nx-journey { grid-template-columns: 1fr; max-width: 560px; }
    .nx-page--get-started .nx-journey__leg,
    .nx-page--get-started .nx-journey__gate { border-bottom: 0; padding: 0 0 0 24px; }
    .nx-page--get-started .nx-journey__leg--look {
        padding-right: 0; padding-bottom: 26px; border-left: 2px dashed rgba(100, 110, 126, .55);
    }
    .nx-page--get-started .nx-journey__gate {
        display: block; text-align: left; padding-top: 4px; padding-bottom: 26px;
        border-left: 2px solid var(--t-seal);
    }
    .nx-page--get-started .nx-journey__leg--go {
        padding-top: 4px; padding-bottom: 4px; border-left: 2px solid var(--t-accent);
    }
    .nx-page--get-started .nx-journey__leg--go::after {
        right: auto; left: -6px; bottom: -1px; top: auto;
        border-left: 5px solid transparent; border-right: 5px solid transparent;
        border-top: 9px solid var(--t-accent); border-bottom: 0;
    }
    .nx-page--get-started .nx-journey__mark { left: -13px; bottom: auto; top: 2px; margin-left: 0; }
    .nx-page--get-started .nx-journey__gatetxt b { font-size: 15.5px; }
}

/* ⭐ 孤行治理(同上,CJK 只有 balance 有效):本頁多數段落是 2~3 行,
   1~2 個字掉到最後一行特別顯眼(實測「…做的決/定。」「…就可以順利/跑。」)。
   ⚠️ 作用域收在本頁:`.nx-c-voice` 是共用元件,不去動已經交付過的 /contact。 */
/* ⛔ `.nx-plan__txt` 曾加進來,**加了更糟**:balance 為了拉平行長,把粗體詞
   「硬體需求不高」硬切成「硬體需 / 求不高」⇒ 已移除,讓它走自然斷行。
   ⭐ 判準:balance 只適合**沒有內嵌強調詞**的短段落。 */
.nx-page--get-started .nx-stance p,
.nx-page--get-started .nx-plan__lesson span { text-wrap: balance; }

/* ── ② 第一段的事實表(沿用既有 nx-c-fact,只給容器與註腳)────────────────── */
.nx-page--get-started .nx-demo { max-width: 860px; margin: 0 auto; }
.nx-page--get-started .nx-demo__note {
    margin: 18px 0 0; text-align: center; font-size: 14.5px; color: var(--t-text-soft);
}
body.nx-theme--tech-trust.nx-page--get-started .nx-demo__note a {
    color: var(--np-text); font-weight: 600; white-space: nowrap;
}
body.nx-theme--tech-trust.nx-page--get-started .nx-demo__note a:hover { text-decoration: underline; }

/* ── ③ nx-ask:訪客的直球問題 + 我們的正面回答(全頁唯一深色反白段)──────────
   ⛔ eyebrow 在深底上會被 site.css 後段的 `.nx-eyebrow{color:--t-accent-dn}`(0,1,0)壓成深藍
      ⇒ 本規則帶頁面作用域 (0,3,0) 贏回來。**刻意只收本頁**,不去動首頁 #story 的同型既有缺陷
      (那條在交接單上是「待業主裁示要不要修」,不該由這一輪順手改掉一半)。 */
.nx-page--get-started .nx-sec--dark .nx-eyebrow,
.nx-page--pricing .nx-sec--dark .nx-eyebrow { color: var(--t-cyan); }
.nx-page--get-started .nx-ask,
.nx-page--pricing .nx-ask { max-width: 800px; margin: 0 auto; }
.nx-page--get-started .nx-ask__q,
.nx-page--pricing .nx-ask__q {
    margin: 0 0 22px; font-family: var(--t-f-display); color: #fff;
    font-size: clamp(23px, 3.1vw, 31px); font-weight: 700;
    letter-spacing: var(--t-ls-display); line-height: 1.45; text-wrap: balance;
}
.nx-page--get-started .nx-ask__a p,
.nx-page--pricing .nx-ask__a p {
    margin: 0 0 16px; font-size: 16px; line-height: 1.95; color: var(--t-on-dark);
}
.nx-page--get-started .nx-ask__a p:last-child,
.nx-page--pricing .nx-ask__a p:last-child { margin-bottom: 0; }
.nx-page--get-started .nx-ask__a b,
.nx-page--pricing .nx-ask__a b { color: #fff; font-weight: 700; }
/* 這一塊是整段的結論(業主口述的「我們的建議」)⇒ 唯一帶標記的段落 */
/* ⚠️ 要贏過上面的 `.nx-page--get-started .nx-ask__a p`=(0,3,1) ⇒ 多帶一個 class=(0,4,1)。
   ⛔ 站規:一律補足具體度,**不加 `!important`**。 */
.nx-page--get-started .nx-ask__a p.nx-ask__take,
.nx-page--pricing .nx-ask__a p.nx-ask__take {
    padding: 2px 0 2px 20px; border-left: 3px solid var(--t-cyan);
    font-size: 17px;
}
.nx-page--get-started .nx-ask__more,
.nx-page--pricing .nx-ask__more { margin: 24px 0 0; font-size: 14.5px; }
body.nx-theme--tech-trust.nx-page--get-started .nx-ask__more a,
.nx-page--get-started .nx-ask__more a,
body.nx-theme--tech-trust.nx-page--pricing .nx-ask__more a,
.nx-page--pricing .nx-ask__more a { color: var(--t-cyan); font-weight: 600; }
body.nx-theme--tech-trust.nx-page--get-started .nx-ask__more a:hover,
body.nx-theme--tech-trust.nx-page--pricing .nx-ask__more a:hover { text-decoration: underline; }

/* ── ④ 立場段(沿用既有 nx-c-voice,只補寬度與連結列)───────────────────────
   ⚠️ 連結色必須帶 body 主題 class:theme.css 的 `body.nx-theme--tech-trust a`=(0,2,1)
      會壓過單獨的 `.nx-stance__links a`=(0,1,1)(本站第六次撞到同一類覆蓋)。 */
.nx-page--get-started .nx-stance { max-width: 800px; margin: 0 auto; }
.nx-page--get-started .nx-stance__links {
    display: flex; flex-wrap: wrap; gap: 8px 26px;
    margin: 20px 0 0; padding-top: 16px; border-top: 1px solid var(--t-line);
}
body.nx-theme--tech-trust.nx-page--get-started .nx-stance__links a {
    color: var(--np-text); font-weight: 600; font-size: 15px;
}
body.nx-theme--tech-trust.nx-page--get-started .nx-stance__links a:hover { text-decoration: underline; }

/* ── ⑤ nx-plan:第二段的四步(編號圓 + 一條連續的軌;第 3 步分岔出兩堂課)──────
   ⭐ 軌線掛在 `<ol>` 上、不掛在外層容器上——掛外層就得把標題高度算進 top,漏算會穿過表頭
      切掉文字(quick-tour nx-steps 在骨架階段實際踩過)。
   ⛔ 兩堂課刻意**不做成卡片**:各包一個白盒 = 業主批過的排排站;改左側細線。 */
.nx-page--get-started .nx-plan {
    position: relative; list-style: none; max-width: 800px;
    margin: 0 auto; padding: 0; counter-reset: nxplan;
}
.nx-page--get-started .nx-plan::before {
    content: ""; position: absolute; left: 14px; top: 14px; bottom: 16px;
    width: 2px; background: var(--t-accent); opacity: .35;
}
.nx-page--get-started .nx-plan__item {
    counter-increment: nxplan; position: relative;
    margin: 0 0 26px; padding: 0 0 0 48px; list-style: none;
}
.nx-page--get-started .nx-plan__item:last-child { margin-bottom: 0; }
.nx-page--get-started .nx-plan__item::before {
    content: counter(nxplan); position: absolute; left: 0; top: 0;
    width: 30px; height: 30px; border-radius: 50%;
    display: grid; place-items: center;
    background: var(--t-accent); color: #fff;
    font-family: var(--t-f-mono); font-size: 13px; font-weight: 700; line-height: 1;
    /* 讓軌線在號碼處斷開;底色取區塊底(--soft),取錯會留一圈淡環 */
    box-shadow: 0 0 0 4px var(--t-paper-soft);
}
.nx-page--get-started .nx-plan__hd {
    margin: 3px 0 6px; font-family: var(--t-f-display);
    font-size: 17.5px; font-weight: 700; color: var(--t-ink); line-height: 1.5;
}
.nx-page--get-started .nx-plan__txt {
    margin: 0; font-size: 15.5px; line-height: 1.85; color: var(--t-text);
}
.nx-page--get-started .nx-plan__txt strong { color: var(--t-ink); font-weight: 700; }
body.nx-theme--tech-trust.nx-page--get-started .nx-plan__txt a {
    color: var(--np-text); font-weight: 600; white-space: nowrap;
}
body.nx-theme--tech-trust.nx-page--get-started .nx-plan__txt a:hover { text-decoration: underline; }

/* 第 3 步底下的兩堂課 = 全段唯一的橫向展開(它們是那一步的內容,不是另外兩步) */
.nx-page--get-started .nx-plan__sub {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px 24px; margin: 16px 0 0;
}
.nx-page--get-started .nx-plan__lesson {
    padding: 2px 0 2px 16px; border-left: 2px solid var(--t-cyan);
}
.nx-page--get-started .nx-plan__lesson b {
    display: block; font-family: var(--t-f-mono); font-size: 12px;
    letter-spacing: .12em; font-weight: 700; color: var(--t-accent-dn); margin-bottom: 4px;
}
.nx-page--get-started .nx-plan__lesson em {
    display: block; font-style: normal; font-size: 15.5px; font-weight: 700;
    color: var(--t-ink); margin-bottom: 5px;
}
.nx-page--get-started .nx-plan__lesson span {
    display: block; font-size: 14.5px; line-height: 1.8; color: var(--t-text);
}
body.nx-theme--tech-trust.nx-page--get-started .nx-after a {
    color: var(--np-text); font-weight: 600;
}
body.nx-theme--tech-trust.nx-page--get-started .nx-after a:hover { text-decoration: underline; }

@media (max-width: 720px) {
    .nx-page--get-started .nx-plan__sub { grid-template-columns: 1fr; gap: 16px; }
    .nx-page--get-started .nx-plan__item { padding-left: 42px; }
    .nx-page--get-started .nx-plan::before { left: 13px; }
    .nx-page--get-started .nx-plan__item::before { width: 28px; height: 28px; }
    .nx-page--get-started .nx-ask__a p.nx-ask__take,
    .nx-page--pricing .nx-ask__a p.nx-ask__take { font-size: 16px; }
}

/* ══════════════════════════════════════════════════════════════════════════
   /roi-calculator 投資效益試算(2026-08-19 業主規格指示)
   ──────────────────────────────────────────────────────────────────────────
   兩個新元件家族,已登記 `___AI-Agent-Area/___extRules/fe-vocab-registry.md`:
     `nx-roi`(試算器本體:輸入面板 / 結果 / 前後比較條 / 長期軸 / 說明區)
     `nx-tip`(欄位旁的行內說明泡泡)
   ⭐ 媒材判斷(記憶 media-choice-before-craft):
     · 四個主要數字 = **精確資訊** ⇒ 排版(字級/亮度),不畫圖、不生圖。
     · 前後比較 = **量的關係** ⇒ 兩條真實比例的橫條(DOM/CSS),不引圖表套件。
     · 長期累積 = **時間拓樸** ⇒ 一條軸 + 三個節點,不做三張等大卡片。
   ⛔ **全段沒有任何等大卡片矩陣**:業主批過的「排排站/盒中盒」在這一頁最容易復發
      (四個數字 + 八條未量化效益 + 三年期,天生就想排成格子)。治法=每一組都做出
      **主從**:主角=可釋放的時間、配角=人力價值、延伸=5/10 年;八條效益走無框列。
   ⭐ 主從**用亮度做,不只用尺寸**(記憶 asset-job-decides-treatment):
      主角用 --t-ink(最深)、單位與說明用 --t-text-soft(退位)。
   ⚠️ 具體度:凡是顏色類一律多帶 `body.nx-theme--tech-trust`
      —— theme.css 的 `body.nx-theme--tech-trust a`=(0,2,1) 壓得過單 class 規則
      (本站已重複踩到第七次,見 nx-stance__links 註解)。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── ⓪ hero:「開始試算」按鈕(§二十一)────────────────────────────────── */
.nx-page--roi-calculator .nx-roi-hero__cta { margin-top: 24px; margin-bottom: 6px; }
/* 孤行治理:實測 #sec-why 的 sub 兩行、第二行只剩「掉了。」三個字。
   ⛔ `text-wrap: pretty` 對中文無效(沒有 word 邊界)——本站已驗證過,只有 `balance` 有用。
   ⚠️ 作用域收在本頁的 `.nx-sec__sub`(四段都是純文字、無內嵌粗體 ⇒ 不會踩到
      「balance 把粗體詞硬切」那個坑)。 */
.nx-page--roi-calculator .nx-sec__sub { text-wrap: balance; }

/* ── ① 為什麼要算(三條無框橫列;⛔不做卡片)──────────────────────────
   ⭐ 第三條的線改用印章色 = **換人說話了**(前兩條是論據,第三條是我們的立場)。
      沿用首頁 nx-honest__view 已建立的語彙,不新增第二種「立場」表示法。
      ⇒ 差異對應內容差異(記憶 order-within-chaos),不是為了不整齊而不整齊。 */
.nx-page--roi-calculator .nx-roi-why {
    list-style: none; max-width: 900px; margin: 0 auto; padding: 0;
    display: grid; gap: 20px;
}
.nx-page--roi-calculator .nx-roi-why__i {
    list-style: none; padding: 2px 0 2px 20px; border-left: 2px solid var(--t-line);
}
.nx-page--roi-calculator .nx-roi-why__i:last-child { border-left-color: var(--t-seal); }
.nx-page--roi-calculator .nx-roi-why__i b {
    display: block; margin-bottom: 5px; font-family: var(--t-f-display);
    font-size: 17.5px; font-weight: 700; color: var(--t-ink); line-height: 1.5;
}
.nx-page--roi-calculator .nx-roi-why__i span {
    display: block; font-size: 15.5px; line-height: 1.85; color: var(--t-text);
}
.nx-page--roi-calculator .nx-roi-why__i strong { color: var(--t-ink); font-weight: 700; }

/* ── ② 主版面:左條件 / 右結果 ───────────────────────────────────────
   ⭐ sticky 只在「桌機 **且** 視窗夠高」時開啟(min-height 820px)——
      這是**由構造保證**的判準,不是猜一個數字:面板實高約 620px + 上方 100px
      (固定 navbar 80 + 呼吸 20),視窗矮於 820 時 sticky 會把面板底部推出畫面,
      不如讓它正常捲動。⛔ 不用 max-height + overflow(面板內出現第二條捲軸更糟)。 */
.nx-page--roi-calculator .nx-roi {
    display: grid; grid-template-columns: minmax(0, 360px) minmax(0, 1fr);
    gap: 44px; align-items: start;
}
@media (min-width: 992px) and (min-height: 820px) {
    .nx-page--roi-calculator .nx-roi__side { position: sticky; top: 100px; }
}
@media (max-width: 991px) {
    .nx-page--roi-calculator .nx-roi { grid-template-columns: 1fr; gap: 30px; }
}

/* ── ③ 輸入面板(沿用既有 nx-form 白卡語言,不另創一套輸入視覺)────────── */
.nx-page--roi-calculator .nx-roi__panel { padding: 26px 26px 18px; margin-top: 0; }
/* 無 JS 告知:預設顯示,有 JS(html.js 旗標在 <head> 就設好)即隱藏 ⇒ 不會閃 */
.nx-page--roi-calculator .nx-roi__nojs {
    margin: 0 0 18px; padding: 11px 13px; border-radius: var(--t-radius);
    font-size: 13.5px; line-height: 1.75;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi__nojs {
    background: rgba(193, 70, 39, .07); border: 1px solid var(--t-seal); color: var(--t-text);
}
.nx-page--roi-calculator .nx-roi__nojs b { color: var(--t-ink); font-weight: 700; }
html.js .nx-page--roi-calculator .nx-roi__nojs { display: none; }
.nx-page--roi-calculator .nx-form__field { margin-bottom: 22px; }
.nx-page--roi-calculator .nx-form__field--last { margin-bottom: 10px; }
/* ⭐ 業主 2026-08-19:問號**直接接在標題文字後面**——原本共用的 `.nx-form__label-row` 是
   `flex + space-between`,問號被推到欄位最右緣,離標題很遠、容易被忽略。
   ⛔ 不改共用規則(contact 頁也吃它)⇒ 本頁作用域改成**行內流**:
     label 變 `inline`、`.nx-tip` 本來就是 `inline-flex` ⇒ 問號像標點一樣跟在最後一個字後面,
     標題若換行,問號**自動跟著最後一行**(由文字流保證,不是靠算位置)。 */
.nx-page--roi-calculator .nx-form__label-row { position: relative; display: block; margin-bottom: 8px; }
.nx-page--roi-calculator .nx-form__label-row label {
    display: inline; margin: 0 5px 0 0; font-size: 14.5px; line-height: 1.5;
}
/* ⛔⭐ 問號的垂直位置是**量出來的,不是估的**(前一版 `-4px` 方向還搞反了):
   `vertical-align` 的**負值是往下移** ⇒ `-4px` 把偏移從 2.5px 推到 **6.5px**,反而更歪。
   實測(1440 與 390 完全一致,四個欄位也一致):
     baseline → 問號中心低於標題文字中心 **2.5px**;middle → 2.2px;每 +1px 修正 1px
     ⇒ **2.5px 時偏移 = 0**(標題文字的字框中心 = 問號圓心)。
   ⚠️ 這個值跟著 label 的 14.5px 與字型度量走;本頁 label 字級在所有斷點都固定,故用 px 寫死。
      改字級或換字型要重量一次(量法=對 label 的文字節點取 Range 的 boundingRect,不是量 label 盒)。 */
.nx-page--roi-calculator .nx-tip { vertical-align: 2.5px; }

/* 數字欄:輸入框 + 單位在同一列;數字**靠右**貼著單位 ⇒ 讀起來就是「45 分鐘/件」 */
.nx-page--roi-calculator .nx-roi-f { display: flex; align-items: center; }
.nx-page--roi-calculator .nx-roi-f input {
    flex: 1 1 auto; width: auto; min-width: 0;
    text-align: right; font-family: var(--t-f-mono);
    font-size: 17px; font-weight: 700; padding: 11px 13px;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-f input { color: var(--t-ink); }
/* ⭐ min-width 固定 = 三個欄位的**輸入框右緣對齊**。單位字串長度不同
   (分鐘 / 件・件 / 年・元 / 小時),不給下限的話 flex 會讓每個輸入框長度都不一樣,
   實測是一眼看得出來的參差 ⇒ 用最長那一串的寬度當下限,由構造保證對齊。 */
.nx-page--roi-calculator .nx-roi-f__unit {
    flex: none; min-width: 64px; padding-left: 10px;
    font-size: 13.5px; color: var(--t-text-soft); white-space: nowrap;
}
/* 驗證訊息(節點由 JS 產生 ⇒ 沒有 JS 就不會有空的錯誤位)*/
.nx-page--roi-calculator .nx-roi-f__err {
    margin: 7px 0 0; font-size: 13px; line-height: 1.65;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-f__err { color: #8f2c17; }
.nx-page--roi-calculator .nx-roi-f__err[hidden] { display: none; }

/* slider:讀數與滑桿同列;刻度列的 padding-right 對齊讀數寬(76 = 62 + 14 gap)⇒ 構造對齊,不是目測 */
.nx-page--roi-calculator .nx-roi-slider { display: flex; align-items: center; gap: 14px; }
.nx-page--roi-calculator .nx-roi-slider input[type="range"] {
    flex: 1 1 auto; min-width: 0; height: 24px; margin: 0;
    accent-color: var(--t-accent); cursor: pointer;
}
.nx-page--roi-calculator .nx-roi-slider__val {
    flex: none; min-width: 62px; text-align: right;
    font-family: var(--t-f-mono); font-size: 23px; font-weight: 700; color: var(--t-ink); line-height: 1;
}
.nx-page--roi-calculator .nx-roi-slider__scale {
    display: flex; justify-content: space-between; padding-right: 76px;
    margin-top: 3px; font-size: 11.5px; color: var(--t-text-soft);
}

/* 快速鈕:三個尺度位置(⛔字面刻意不寫「一般估計」——那等於 notarPro 判定典型值,見 PHP 檔頭 C022)*/
.nx-page--roi-calculator .nx-roi-chips { display: flex; gap: 8px; margin-top: 13px; }
.nx-page--roi-calculator .nx-roi-chip {
    flex: 1 1 0; min-width: 0; padding: 8px 4px; cursor: pointer;
    border-radius: var(--t-radius); text-align: center; line-height: 1.35;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-chip {
    background: var(--t-paper); border: 1px solid var(--t-line);
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-chip:hover { border-color: var(--t-accent); }
.nx-page--roi-calculator .nx-roi-chip b {
    display: block; font-family: var(--t-f-mono); font-size: 14.5px; font-weight: 700; color: var(--t-ink);
}
.nx-page--roi-calculator .nx-roi-chip em {
    display: block; font-style: normal; font-size: 11.5px; color: var(--t-text-soft); margin-top: 1px;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-chip.is-on {
    border-color: var(--t-accent); background: rgba(30, 108, 255, .07);
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-chip.is-on b { color: var(--np-text); }

/* 回到預設值:**只有 JS 在才出現**(沒有 JS 它按了不會有事 ⇒ 不給死鈕,沿用 nx-cf-pick 的既有裁示)
   ⚠️ `body.nx-js` 與 `.nx-page--roi-calculator` 是**同一個元素** ⇒ 必須寫成 body.nx-js.nx-page--…,
      中間不能有空白(有空白=找 body 的後代,永遠不成立)。 */
.nx-page--roi-calculator .nx-roi__reset { display: none; margin: 4px 0 0; }
body.nx-js.nx-page--roi-calculator .nx-roi__reset { display: block; }
.nx-page--roi-calculator .nx-roi__resetbtn {
    border: 0; background: none; padding: 4px 0; cursor: pointer;
    font-size: 13.5px; font-weight: 600; text-decoration: underline;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi__resetbtn { color: var(--t-text-soft); }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi__resetbtn:hover { color: var(--np-text); }

/* 欄位說明裡的「怎麼填」連結 */
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi__doclink { color: var(--np-text); font-weight: 600; white-space: nowrap; }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi__doclink:hover { text-decoration: underline; }

/* ── ④ nx-tip:欄位旁的說明泡泡 ────────────────────────────────────────
   ⭐ **純 CSS**(:hover 與 :focus-within)⇒ 滑鼠、鍵盤、觸控三種都能開,
      沒有 JS 也完全可用(觸控點按鈕會取得焦點 → focus-within 成立)。
      JS 只多做一件事:按 Esc 讓按鈕失焦把它關掉。 */
/* ⛔⭐ `.nx-tip` **刻意不是** position:relative(2026-08-19 量出來的):
   泡泡要用 `max-width:100%` 撐到欄位寬,而 `max-width` 的百分比是對**定位容器**算的
   —— 只要 `.nx-tip` 自己是 relative,定位容器就是那顆 20px 的問號 ⇒ 實測泡泡只有 **26px 寬**
   (文字被壓成一個字一行)。⇒ 讓 `.nx-tip` 保持 static,定位容器交給
   `.nx-form__label-row`(本頁已設 relative),泡泡寬度才等於欄位寬。
   ⚠️ 因此**小三角改以「按鈕」為定位容器**(`__arrow` 是 `<button>` 的子元素)。 */
.nx-tip { display: inline-flex; flex: none; }
.nx-tip__btn {
    position: relative;   /* 小三角的定位容器(見上方註解) */
    width: 20px; height: 20px; padding: 0; border-radius: 50%; cursor: help;
    font-family: var(--t-f-mono); font-size: 12px; font-weight: 700; line-height: 1;
}
body.nx-theme--tech-trust .nx-tip__btn {
    border: 1px solid var(--t-line); background: var(--t-paper); color: var(--t-text-soft);
}
body.nx-theme--tech-trust .nx-tip__btn:hover { border-color: var(--t-accent); color: var(--np-text); }
/* ⛔⭐ 泡泡**不能錨在問號上**(2026-08-19 改成行內之後才成立的問題):
   問號的 x 位置隨標題字數浮動(實測 106~228px),而泡泡寬 264px、欄位只有 308px
   ⇒ 靠右錨會往左溢出 30px、靠左錨往右溢出 156px、置中也溢出 42px,**三種都撞牆**。
   ⇒ 改錨在**欄位標題列**(`.nx-form__label-row`,已設 position:relative):
     `left:0 + max-width:100%` ⇒ 泡泡寬度天生等於欄位寬,**由構造保證永遠不溢出**,
     與問號在那一格無關。小三角因此改掛在問號自己身上(見下)。 */
.nx-tip__bubble {
    display: none; position: absolute; z-index: 30; left: 0; right: auto; bottom: calc(100% + 10px);
    width: auto; max-width: 100%; padding: 10px 13px;
    border-radius: var(--t-radius); font-size: 13px; font-weight: 400; line-height: 1.7; text-align: left;
}
body.nx-theme--tech-trust .nx-tip__bubble {
    background: var(--t-ink); color: var(--t-on-dark); box-shadow: var(--t-shadow-lift);
}
.nx-tip:hover .nx-tip__bubble,
.nx-tip:focus-within .nx-tip__bubble { display: block; }
/* 小三角改掛在**問號自己**身上(泡泡已錨到整列,三角跟著泡泡就對不到按鈕了)。
   ⇒ 它永遠從問號正上方指下來,無論標題多長。只在泡泡出現時才畫。 */
.nx-tip__bubble::after { content: none; }
.nx-tip__arrow {
    display: none; position: absolute; left: 50%; margin-left: -6px; bottom: calc(100% + 4px);
    border: 6px solid transparent; border-top-color: var(--t-ink);
}
.nx-tip:hover .nx-tip__arrow,
.nx-tip:focus-within .nx-tip__arrow { display: block; }

/* ── ⑤ 結果:主角 = 可釋放的時間 ──────────────────────────────────────
   ⭐ 這是全頁字級最大的東西,而且**只有它一個**大 —— 有第二個大數字,就沒有主角了。 */
.nx-page--roi-calculator .nx-roi-lead__cap { margin: 0 0 8px; font-size: 15px; color: var(--t-text-soft); }
.nx-page--roi-calculator .nx-roi-lead__cap b { color: var(--t-ink); font-weight: 700; }
.nx-page--roi-calculator .nx-roi-lead__big {
    margin: 0; font-family: var(--t-f-display); font-weight: 700; color: var(--t-ink);
    font-size: clamp(54px, 8.6vw, 92px); line-height: 1; letter-spacing: -.03em;
}
.nx-page--roi-calculator .nx-roi-lead__big i {
    font-style: normal; font-size: .27em; font-weight: 700;
    color: var(--t-text-soft); letter-spacing: 0; margin-left: .16em;
}
.nx-page--roi-calculator .nx-roi-lead__sub { margin: 12px 0 0; font-size: 15.5px; color: var(--t-text); }
.nx-page--roi-calculator .nx-roi-lead__sub b { font-family: var(--t-f-mono); font-size: 17px; color: var(--t-ink); }

/* 人力價值 = 配角:**換色不換尺寸**(再放大一個數字就變成兩個主角) */
.nx-page--roi-calculator .nx-roi-money {
    margin-top: 26px; padding-top: 22px; border-top: 1px solid var(--t-line);
}
.nx-page--roi-calculator .nx-roi-money__cap { margin: 0 0 3px; font-size: 14.5px; color: var(--t-text-soft); }
.nx-page--roi-calculator .nx-roi-money__big {
    margin: 0; font-family: var(--t-f-display); font-weight: 700;
    font-size: clamp(28px, 4.2vw, 40px); line-height: 1.2; letter-spacing: -.02em;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-money__big { color: var(--np-text); }

/* ── ⑥ 前後比較條(§八)──────────────────────────────────────────────
   ⭐ 第二條刻意切成兩段:左段=仍要處理的行政時間、右段=釋放出來的
      ⇒ 看得到「省下來那一塊去了那」,不是只看到條變短。
   ⚠️ 寬度是資料驅動 ⇒ inline style(PHP 首屏 / JS 更新同一個屬性);
      ⛔ 因此**不要**在媒體查詢裡改這兩段的 width(inline style 會贏,除非 !important——別走那條路)。 */
.nx-page--roi-calculator .nx-roi-bar { margin-top: 32px; padding-top: 22px; border-top: 1px solid var(--t-line); }
.nx-page--roi-calculator .nx-roi-bar__hd,
.nx-page--roi-calculator .nx-roi-span__hd {
    margin: 0 0 14px; font-family: var(--t-f-mono);
    font-size: 12px; font-weight: 700; letter-spacing: .12em; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-bar__row {
    display: grid; grid-template-columns: 92px minmax(0, 1fr) 128px;
    align-items: center; gap: 14px; margin-bottom: 12px;
}
.nx-page--roi-calculator .nx-roi-bar__lbl { margin: 0; font-size: 14.5px; font-weight: 700; color: var(--t-ink); line-height: 1.35; }
.nx-page--roi-calculator .nx-roi-bar__lbl em {
    display: block; font-style: normal; font-size: 11.5px; font-weight: 400; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-bar__track {
    display: flex; height: 30px; border-radius: 3px; overflow: hidden;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-bar__track { background: var(--t-line); }
.nx-page--roi-calculator .nx-roi-bar__seg { display: block; height: 100%; transition: width .3s ease; }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-bar__seg--now { background: rgba(16, 26, 46, .34); }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-bar__seg--left { background: var(--t-accent-dn); }   /* 與格子圖的「仍要做」同一顆色 */
/* 釋放出來的那一段=**斜紋**,不是另一個實色:實色會讀成「另一種工作」,
   斜紋讀成「空出來的」。⭐ 材質差異承擔語意,不必再加圖例以外的說明。 */
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-bar__seg--saved {
    background: repeating-linear-gradient(135deg,
        rgba(0, 200, 215, .55) 0 5px, rgba(0, 200, 215, .18) 5px 10px);
}
.nx-page--roi-calculator .nx-roi-bar__num { margin: 0; text-align: right; font-size: 13px; color: var(--t-text-soft); }
.nx-page--roi-calculator .nx-roi-bar__num b {
    font-family: var(--t-f-mono); font-size: 16.5px; font-weight: 700; color: var(--t-ink); margin-right: 3px;
}
/* 圖例縮排 106px = 標籤欄 92 + gap 14 ⇒ 與軌道左緣對齊(構造對齊) */
.nx-page--roi-calculator .nx-roi-bar__key {
    display: flex; flex-wrap: wrap; gap: 6px 20px; margin: 10px 0 0; padding-left: 106px;
    font-size: 12.5px; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-bar__k::before {
    content: ""; display: inline-block; width: 11px; height: 11px; border-radius: 2px;
    margin-right: 6px; vertical-align: -1px;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-bar__k--left::before { background: var(--t-accent-dn); }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-bar__k--saved::before {
    background: repeating-linear-gradient(135deg,
        rgba(0, 200, 215, .55) 0 3px, rgba(0, 200, 215, .18) 3px 6px);
}

/* ── ⑦ 長期累積:一條軸 + 三個節點(⛔不是三張卡片)────────────────────
   ⭐ 軸線畫在 <ol> 自己的 border-top 上(不用 % 絕對定位)⇒ 由構造保證不會撞到文字
      (出身:260817_14 流星用 % 定位,1500 過但 1200/991 都撞;記憶
       one-breakpoint-verified-is-not-verified)。
   ⭐ 節點由近到遠**遞增**(點變大、字變深)= 讓「累積」由版面自己說,不必寫「越久越多」。 */
.nx-page--roi-calculator .nx-roi-span { margin-top: 30px; padding-top: 22px; border-top: 1px solid var(--t-line); }
.nx-page--roi-calculator .nx-roi-span__axis {
    list-style: none; margin: 0; padding: 20px 0 0;
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    border-top: 2px solid var(--t-line);
}
.nx-page--roi-calculator .nx-roi-span__n { position: relative; list-style: none; padding-right: 12px; }
/* ⛔ 第一顆點原本用 --t-line,而軸線**也是** --t-line ⇒ 實測整顆看不見(同色)。
   改用 --t-text-soft + 低不透明度:看得見,但仍是三顆裡最弱的一顆(遞增關係保住)。 */
.nx-page--roi-calculator .nx-roi-span__n::before {
    content: ""; position: absolute; left: 0; top: -27px;
    width: 10px; height: 10px; border-radius: 50%;
    background: var(--t-text-soft); opacity: .5;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-span__n--mid::before {
    width: 13px; height: 13px; top: -28px; background: var(--t-accent); opacity: .6;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-span__n--far::before {
    width: 16px; height: 16px; top: -30px; background: var(--t-accent); opacity: 1;
}
.nx-page--roi-calculator .nx-roi-span__yr {
    display: block; font-family: var(--t-f-mono); font-size: 12px; font-weight: 700;
    letter-spacing: .1em; color: var(--t-text-soft); margin-bottom: 4px;
}
.nx-page--roi-calculator .nx-roi-span__n b {
    display: block; font-family: var(--t-f-display); font-weight: 700;
    font-size: 17px; line-height: 1.35; color: var(--t-text-soft); letter-spacing: -.01em;
}
.nx-page--roi-calculator .nx-roi-span__n--mid b { font-size: 20px; color: var(--t-text); }
.nx-page--roi-calculator .nx-roi-span__n--far b { font-size: 23px; color: var(--t-ink); }
.nx-page--roi-calculator .nx-roi-span__note {
    margin: 18px 0 0; font-size: 13px; line-height: 1.75; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-span__note strong { color: var(--t-text); font-weight: 700; }

/* 結果區底部免責 */
.nx-page--roi-calculator .nx-roi__disc {
    margin: 24px 0 0; padding-top: 16px; border-top: 1px dashed var(--t-line);
    font-size: 13px; line-height: 1.8; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi__disc strong { color: var(--t-text); font-weight: 700; }

/* ── ⑧ 未量化效益:兩欄無框列(⛔不做八張卡片)────────────────────────── */
.nx-page--roi-calculator .nx-roi-more {
    list-style: none; max-width: 940px; margin: 0 auto; padding: 0;
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px 40px;
}
/* ⭐ 2026-08-19 業主要求圖像化:原本的 `+` 記號換成線性圖示。
   ⛔ 圖示不是裝飾——八條純文字會變成一面牆,圖示讓人**用掃的**找到跟自己有關的那一條。
   ⚠️ 顏色用 --t-accent 不用 --t-cyan:青在白底只有 2.2:1,達不到 WCAG 1.4.11 非文字 3:1。 */
.nx-page--roi-calculator .nx-roi-more__i {
    list-style: none; display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: 0 13px;
}
.nx-page--roi-calculator .nx-roi-more__ic { display: block; width: 24px; height: 24px; margin-top: 2px; }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-more__ic { color: var(--t-accent); }
.nx-page--roi-calculator .nx-roi-more__i b {
    display: block; font-size: 16px; font-weight: 700; color: var(--t-ink); line-height: 1.55; margin-bottom: 2px;
}
.nx-page--roi-calculator .nx-roi-more__i em {
    display: block; font-style: normal; font-size: 14.5px; line-height: 1.8; color: var(--t-text-soft);
}

/* ── ⑨ 欄位說明區(同時是 modal 的內容來源)──────────────────────────
   ⭐ 這一段**不隱藏**:有 JS 時 modal 複製它的內容,沒有 JS 時連結退化成同頁錨點。
      ⇒ 零內容重複、爬蟲與 LLM 也讀得到完整說明。
   ⚠️ 同一組樣式要在兩種底色上都成立(#sec-doc 是 --t-paper-soft、modal 是 --t-card)
      ⇒ 本組**不設背景色**,只用線與字級分層。 */
.nx-page--roi-calculator .nx-roi-doc { max-width: 860px; margin: 0 auto 26px; }
.nx-page--roi-calculator .nx-roi-doc:last-of-type { margin-bottom: 0; }
.nx-page--roi-calculator .nx-roi-doc__hd {
    margin: 0 0 10px; padding-left: 14px; border-left: 3px solid var(--t-accent);
    font-family: var(--t-f-display); font-size: 18px; font-weight: 700; color: var(--t-ink); line-height: 1.5;
}
.nx-page--roi-calculator .nx-roi-doc__p { margin: 0 0 12px; font-size: 15px; line-height: 1.85; color: var(--t-text); }
.nx-page--roi-calculator .nx-roi-doc__p strong,
.nx-page--roi-calculator .nx-roi-doc__ul strong { color: var(--t-ink); font-weight: 700; }
.nx-page--roi-calculator .nx-roi-doc__warn {
    margin: 0 0 12px; padding: 11px 14px; border-left: 3px solid var(--t-seal);
    font-size: 14.5px; line-height: 1.8; color: var(--t-text);
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-doc__warn { background: rgba(193, 70, 39, .06); }
.nx-page--roi-calculator .nx-roi-doc__warn strong { color: var(--t-ink); font-weight: 700; }
/* 三組作業項目:auto-fit ⇒ 在 #sec-doc(寬)是三欄、在 modal(窄)自動變一~二欄,
   不必為 modal 另寫一套(⛔ 免掉「同一段內容兩套版型」的維護債)。 */
.nx-page--roi-calculator .nx-roi-doc__cols {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(186px, 1fr));
    gap: 8px 28px; margin: 0 0 14px;
}
.nx-page--roi-calculator .nx-roi-doc__g {
    display: flex; align-items: center; gap: 7px;
    margin: 0 0 6px; padding-bottom: 5px; border-bottom: 1px solid var(--t-line);
    font-family: var(--t-f-mono); font-size: 11.5px; font-weight: 700; letter-spacing: .1em;
}
.nx-page--roi-calculator .nx-roi-doc__g svg { width: 16px; height: 16px; flex: none; }
/* ⛔ 原用 --t-accent(#1e6cff):在 --t-paper-soft(#eef2f8)底上實測只有 **4.02:1**,不過 AA。
   (租戶 tokens.css 早就寫了規則:`color:` 一律吃 --np-text、面積才吃 --np-brand ——
    這裡是第一次在 11.5px 的小字上重犯。)改 --np-text 後實測 5.45:1。 */
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-doc__g { color: var(--np-text); }
/* ⛔ 母版 reset 會吃掉項目符號(本站第四次踩到)⇒ 這裡明寫 list-style 與縮排 */
.nx-page--roi-calculator .nx-roi-doc__cols ul,
.nx-page--roi-calculator .nx-roi-doc__ul {
    margin: 0 0 4px; padding-left: 20px; list-style: disc outside;
}
.nx-page--roi-calculator .nx-roi-doc__cols li,
.nx-page--roi-calculator .nx-roi-doc__ul li {
    list-style: disc outside; font-size: 14.5px; line-height: 1.85; color: var(--t-text); margin-bottom: 2px;
}
.nx-page--roi-calculator .nx-roi-doc__ul li { margin-bottom: 9px; }
.nx-page--roi-calculator .nx-roi-doc__ul b { color: var(--t-ink); font-weight: 700; }
.nx-page--roi-calculator .nx-roi-doc__final {
    max-width: 860px; margin: 30px auto 0; padding-top: 18px; border-top: 1px solid var(--t-line);
    font-size: 13.5px; line-height: 1.85; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-doc__final strong { color: var(--t-text); font-weight: 700; }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-doc__final a { color: var(--np-text); font-weight: 600; }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-doc__final a:hover { text-decoration: underline; }

/* modal 面板加寬:說明含三欄清單,580 會把每欄擠成兩個字換一行 */
.nx-page--roi-calculator .nx-modal__panel { max-width: 660px; }
.nx-page--roi-calculator .nx-modal__body { margin-top: 16px; }   /* 表頭與內文之間的呼吸(本 modal 沒用到 nx-modal__sub)*/
.nx-page--roi-calculator .nx-modal__body .nx-roi-doc { margin: 0; }

/* ── ⑩ RWD ──────────────────────────────────────────────────────────
   ⚠️ 媒體查詢**不增加具體度** ⇒ 本區塊必須排在上面基礎規則之後才有效
      (本站曾整批 RWD token 因此失效,記憶 one-breakpoint-verified-is-not-verified)。 */
/* 平板(768–991):單欄之後輸入面板變成整段寬(實測 991 時 928px)
   ⇒ 一個只填「45」的輸入框拉到 800px 寬,看起來就是沒有設計過。
   治法=面板內的欄位改**兩欄**(沿用 contact 的 .nx-form__grid 既有做法),
   比例那一欄因為含滑桿+快速鈕,跨兩欄。⭐ 這個斷點專案過去很少驗,刻意獨立處理。 */
@media (min-width: 768px) and (max-width: 991px) {
    .nx-page--roi-calculator .nx-roi__panel {
        display: grid; grid-template-columns: 1fr 1fr; gap: 0 24px; align-items: start;
    }
    .nx-page--roi-calculator .nx-roi__panel > .nx-roi__field--wide,
    .nx-page--roi-calculator .nx-roi__panel > .nx-roi__reset { grid-column: 1 / -1; }
}

@media (max-width: 767px) {
    .nx-page--roi-calculator .nx-roi__panel { padding: 20px 18px 14px; max-width: 460px; }
    .nx-page--roi-calculator .nx-roi-lead__big { font-size: clamp(46px, 15vw, 66px); }
    .nx-page--roi-calculator .nx-roi-more { grid-template-columns: 1fr; gap: 18px; }
    /* 比較條:窄螢幕把標籤移到軌道上方(三欄硬塞會讓軌道只剩 ~90px,比例就看不出來了) */
    .nx-page--roi-calculator .nx-roi-bar__row { grid-template-columns: 1fr auto; gap: 6px 10px; }
    .nx-page--roi-calculator .nx-roi-bar__lbl { grid-column: 1; grid-row: 1; }
    .nx-page--roi-calculator .nx-roi-bar__num { grid-column: 2; grid-row: 1; }
    .nx-page--roi-calculator .nx-roi-bar__track { grid-column: 1 / -1; grid-row: 2; height: 24px; }
    .nx-page--roi-calculator .nx-roi-bar__lbl em { display: inline; margin-left: 4px; }
    .nx-page--roi-calculator .nx-roi-bar__key { padding-left: 0; }
    /* 長期軸:三欄在 375 會把 NT$ 1,125,000 擠成三行 ⇒ 改直式,節點點改畫在左側 */
    .nx-page--roi-calculator .nx-roi-span__axis {
        grid-template-columns: 1fr; border-top: 0; border-left: 2px solid var(--t-line);
        padding: 0 0 0 22px; gap: 16px;
    }
    .nx-page--roi-calculator .nx-roi-span__n { padding-right: 0; }
    /* ⛔ 實測抓到:這裡原本只改 left 沒改 top ⇒ mid/far 仍吃桌機的 top:-28/-30,
       兩顆點整個飄到**上一個項目**旁邊(390 截圖看得很清楚)。
       ⭐ 教訓:同一個 ::before 在桌機是「騎在橫軸上」(負 top)、手機是「騎在直軸上」(負 left),
          換方向時**兩個座標都要重設**,不能只改一個。
       top 值讓三顆點的**圓心**都對齊年份標籤那一行(標籤行高約 15px ⇒ 圓心 ≈ 8px)。 */
    .nx-page--roi-calculator .nx-roi-span__n::before { left: -27px; top: 3px; }
    body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-span__n--mid::before { left: -28px; top: 1px; }
    body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-span__n--far::before { left: -30px; top: 0; }
    /* 泡泡貼右緣容易被切出畫面 ⇒ 手機改成貼著面板寬度 */
    .nx-tip__bubble { max-width: min(264px, 74vw); }
}
/* 尊重使用者的動態偏好(站規:預設開、用 @media 尊重設定,不是預設關) */
@media (prefers-reduced-motion: reduce) {
    .nx-page--roi-calculator .nx-roi-bar__seg { transition: none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   /pricing 費用方案(2026-08-19 業主指示新建;同日業主看過後**改結構重寫 v2**)
   ──────────────────────────────────────────────────────────────────────────
   ⭐ v2 的三個結構裁示(業主原話):
     ①「內容需要再簡化,資訊太攏雜,過多會失焦」
     ②順序改成:**先給支持感 → 方案卡牌 → 為何不標價 → 反問「值多少」**
     ③「其實是**三種**模式」(買斷/租賃/夥伴;團購收進買斷)——原文先寫「四種卡牌」,
       後半句自己修正成三種,以**後者**為準。
   ⛔ v1 的 `nx-scale`(天秤)與 `nx-ways`(四條路)**整組刪除**,不留死規則:
     · 天秤段的角色由新的 `nx-worth`(反問)承接,而且更強——**反問比陳列強**。
     · 四條路改成三張卡牌 + 詳述,由 `nx-plans` 承接。
   四個元件家族(已登記 `___AI-Agent-Area/___extRules/fe-vocab-registry.md`):
     `nx-plans`(三種取得方式:卡牌 + 詳述)/ `nx-worth`(反問「值多少」)/
     `nx-cost`(帳目三欄)/ `nx-when`(付款 vs 保固)/ `nx-creed`(立場)/ `nx-legacy`(上一代官網原句)
   ⚠️ 具體度:凡顏色類一律多帶 `body.nx-theme--tech-trust`(theme.css 的 `a`=(0,2,1) 壓得過單 class)。
   ⚠️ 小於 18px 的字不得用 `--t-accent`/`--t-seal` 當前景色(content-decisions §十)⇒ 用 `--np-text`。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── ① nx-plans:三張直式卡牌(名稱+簡述)+ 下方詳述 ──────────────────────────
   ⛔⭐ **業主要卡牌,但不可以變成 SaaS 定價表**——那個形狀會誘發比價心理,
      正好與本頁靈魂(不要把長遠大計簡化成價格決勝)衝突。判準式的差別:
        定價表 = 等大 + 每張一個價格 + 一列規格勾選 + 每張一顆按鈕
        本頁   = **零價格、零規格列、零按鈕**,只有「名稱 + 誰適合 + 一句它是什麼」
   ⭐ 三張**刻意不等重**:買斷是主(多數客戶走這條),用實心深底;另兩張是配角,白底細框。
      主從**用亮度做,不只用尺寸**(記憶 asset-job-decides-treatment)。
   ⭐ 卡牌只承擔「一眼看到有三種」,內容由下方詳述承擔 ⇒ 卡牌可以短到只有兩行。 */
/* ⭐ 2026-08-19 業主追加(第二輪):①買斷卡的近黑底 `--t-ink-deep`(#0a1120)太沉 → 改深藍
     ②三張卡可點選切換 ③選中的那一張,下方對應詳述浮現淺藍面 ④詳述標題包成橫式膠囊外框。
   ⭐ **色從那來**:深藍不是隨手挑的,是把主題自己的品牌藍 `--t-accent`(#1e6cff)壓深到
     「白字 10.98:1、青字 5.36:1」都還過 AA 的那一階 ⇒ 與整站同一個色相家族,只是換了明度。
     ⛔ **刻意不用漸層**(業主 2026-07-26 已評過「純色+漸層」是 AI 味的來源)——深底只放一條
        cyan 上緣當唯一重音,能量集中一處。
   ⭐ 狀態色從 `--buy` 修飾子**搬到 `.is-on` 狀態**:誰是主角由「選了誰」決定,不再寫死在結構 class。
     ⛔ 但 RWD 的 `--buy { grid-column: 1/-1 }` **仍綁 `--buy` 不綁 `.is-on`**——那是版面結構,
        綁狀態的話每點一次卡牌整個網格會重排(切換變成版面跳動)。
   ⚠️ 本區局部 token 掛在 `.nx-plans` 不掛 `:root`(跨頁污染),沿用本站既有做法。 */
.nx-page--pricing .nx-plans {
    max-width: 1060px; margin: 0 auto;
    --plan-on:        #123a7a;   /* 選中:深藍實心底(白字 10.98:1 / 青字 5.36:1,皆過 AA) */
    --plan-soft:      #edf3ff;   /* 對應詳述的淺藍面(--t-text-soft 壓上去 4.63:1,過 AA) */
    --plan-pill-line: #bcc8dc;   /* 未選中的膠囊外框線:看得見,但不搶戲 */
}
.nx-page--pricing .nx-plans__cards {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px;
}
.nx-page--pricing .nx-plans__card {
    display: flex; flex-direction: column; min-width: 0;
    padding: 26px 24px 24px; border-radius: var(--t-radius-lg);
    background: var(--t-card); border: 1px solid var(--t-line);
    transition: background-color .32s ease, border-color .32s ease,
                box-shadow .32s ease, transform .32s ease;
}
/* ⚠️具體度:`<div>` 換成 `<a>` 之後會吃到 theme.css 的 `body.nx-theme--tech-trust a`(0,2,1)
   ⇒ 這兩條必須多帶 body 主題 class 才壓得過(見本檔 §⑦ 註解的同一個坑) */
body.nx-theme--tech-trust.nx-page--pricing .nx-plans__card,
body.nx-theme--tech-trust.nx-page--pricing .nx-plans__card:hover {
    color: inherit; text-decoration: none; cursor: pointer;
}
.nx-page--pricing .nx-plans__card:hover {
    border-color: rgba(30, 108, 255, .45); box-shadow: var(--t-shadow-lift); transform: translateY(-2px);
}
/* 主角=被選中的那一張:實心深藍 + 青色上緣。全段唯一一個深色塊 ⇒ 眯眼時它先被看到 */
/* ⚠️ `.is-on` 與 `:hover` 具體度相同(0,3,0)⇒ 誰贏只靠**寫在後面**,那不是機制(本檔 §⑦ 記過)。
   ⇒ 明寫 `.is-on:hover`(0,4,0)把「選中的那張滑過去不變樣、也不上浮」釘死。 */
.nx-page--pricing .nx-plans__card.is-on,
.nx-page--pricing .nx-plans__card.is-on:hover {
    background: var(--plan-on); border-color: var(--plan-on);
    box-shadow: inset 0 3px 0 var(--t-cyan), var(--t-shadow-lift);
    transform: none;
}
.nx-page--pricing .nx-plans__tag {
    font-family: var(--t-f-mono); font-size: 11.5px; letter-spacing: .14em;
    font-weight: 700; color: var(--t-text-soft); margin: 0 0 10px;
}
.nx-page--pricing .nx-plans__card.is-on .nx-plans__tag { color: var(--t-cyan); }
.nx-page--pricing .nx-plans__name {
    font-family: var(--t-f-display); color: var(--t-ink);
    font-size: 25px; font-weight: 700; letter-spacing: var(--t-ls-display); margin: 0 0 10px;
}
.nx-page--pricing .nx-plans__card.is-on .nx-plans__name { color: #fff; }
.nx-page--pricing .nx-plans__brief {
    margin: 0; font-size: 15px; line-height: 1.85; color: var(--t-text);
}
.nx-page--pricing .nx-plans__card.is-on .nx-plans__brief { color: var(--t-on-dark); }
.nx-page--pricing .nx-plans__brief strong { color: var(--t-ink); font-weight: 700; }
.nx-page--pricing .nx-plans__card.is-on .nx-plans__brief strong { color: #fff; }

/* 下方詳述:⛔**不做成第二排卡片**(那會變成盒中盒),走無框列 + 左側軌線
   ⭐「浮現」怎麼做:淺藍面是一層 `::before`,**只有它在動**(opacity + 位移),文字本身
     永遠是實的、位置不變 ⇒ 不會有「字先糊掉再清楚」的廉價感,也不影響選取與螢幕閱讀器。
   ⚠️ `::before` 預設 opacity:0 是**未選中的靜止狀態**,不是「用透明度藏內容」——
     內文一直可見(這條是 skill 硬規則 13 的分界,別誤判成違規)。
   ⚠️ 上下各外擴 12px < 段間距 30px ⇒ 兩段的面不會互相咬到。 */
.nx-page--pricing .nx-plans__detail { margin: 40px 0 0; display: grid; gap: 30px; }
.nx-page--pricing .nx-plans__block {
    position: relative; padding: 2px 18px 0 22px;
    border-left: 3px solid var(--t-line);
    transition: border-color .3s ease;
}
/* ⚠️ 右緣**切齊卡牌列**(right:0),不外擴——外擴 18px 實測看起來像沒對準,不像刻意出血;
   內文的右內距改由 block 自己的 padding-right 給,淺藍面才有呼吸不貼字。 */
.nx-page--pricing .nx-plans__block::before {
    content: ""; position: absolute; z-index: 0; pointer-events: none;
    left: 0; right: 0; top: -12px; bottom: -12px;
    border-radius: 0 var(--t-radius-lg) var(--t-radius-lg) 0;
    background: var(--plan-soft);
    opacity: 0; transform: translateY(6px);
    transition: opacity .38s ease, transform .38s ease;
}
.nx-page--pricing .nx-plans__block > * { position: relative; z-index: 1; }
.nx-page--pricing .nx-plans__block.is-on { border-left-color: var(--plan-on); }
.nx-page--pricing .nx-plans__block.is-on::before { opacity: 1; transform: none; }
.nx-page--pricing .nx-plans__hd {
    font-family: var(--t-f-display); color: var(--t-ink);
    font-size: 18px; font-weight: 700; margin: 0 0 10px;
}
/* ⭐ 業主指定:橫式膠囊外框(橢圓倒角),把原本只是粗體的方案名框起來。
   ⛔ 選中時**仍然是外框不是實心**——業主要的是「外框線」,填滿會讓它變成另一顆按鈕。
   ⚠️ 用 `<span class="nx-plans__pill">` 不用 `<b>`:本檔 §⑦ 記過「外層元素選擇器洩進巢狀元件」
      已踩兩次,新元件一律給自己的 class。 */
.nx-page--pricing .nx-plans__pill {
    display: inline-block; vertical-align: middle;
    padding: 3px 16px; border-radius: 999px;
    border: 1.5px solid var(--plan-pill-line); background: transparent;
    color: var(--t-ink); font-size: 16px; font-weight: 700;
    letter-spacing: .04em; line-height: 1.65;
    transition: border-color .3s ease, color .3s ease, background-color .3s ease;
}
.nx-page--pricing .nx-plans__block.is-on .nx-plans__pill {
    border-color: var(--plan-on); color: var(--plan-on); background: #fff;
}
.nx-page--pricing .nx-plans__hd em {
    font-style: normal; font-weight: 400; font-size: 14.5px;
    color: var(--t-text-soft); margin-left: 10px;
}
.nx-page--pricing .nx-plans__block p {
    margin: 0 0 .7em; font-size: 15.5px; line-height: 1.9; color: var(--t-text);
}
.nx-page--pricing .nx-plans__block p:last-child { margin-bottom: 0; }
.nx-page--pricing .nx-plans__block strong { color: var(--t-ink); font-weight: 700; }
.nx-page--pricing .nx-plans__note { margin: 26px 0 0; font-size: 14.5px; color: var(--t-text-soft); }
body.nx-theme--tech-trust.nx-page--pricing .nx-plans__note a,
body.nx-theme--tech-trust.nx-page--pricing .nx-plans__block a { color: var(--np-text); font-weight: 600; }
body.nx-theme--tech-trust.nx-page--pricing .nx-plans__note a:hover,
body.nx-theme--tech-trust.nx-page--pricing .nx-plans__block a:hover { text-decoration: underline; }

/* ── ② nx-worth:反問「值多少」(業主 v2 指定的收尾論點)──────────────────────
   ⭐ 這一段是本頁最重要的一手:**把「我們不標價」翻成「你自己標價」**。
      形式是**問句**不是宣稱 ⇒ 主體是訪客自己在算,notarPro 沒有宣稱能省多少。
   ⚠️ 與 C022「效益推估禁用」的關係:同 `/roi-calculator` 的降風險做法——
      用「假設/如果」的語氣、答案留白、明說「這個數字我們算不出來」。
   ⭐ 媒材=**排版**(問句放大、單獨成行),⛔不畫圖、不放數字動畫。 */
.nx-page--pricing .nx-worth { max-width: 46em; margin: 0 auto; }
/* ⛔⭐⭐ **元素選擇器洩進巢狀元件——本站第二次踩**(第一次=260818_07 的 `.nx-layers__unit b`
   把示意圖裡的 `.nx-mock__bar b` 撐成 15.5px)。這裡是:下面那條 `.nx-worth p`=(0,2,1)
   **具體度高過** `.nx-worth__q`=(0,2,0) ⇒ 放大的問句被打回 **16px**,實測 computed 坐實。
   ⚠️ 「寫得出、跑得動、就是沒生效」——而且它是這一段的主角,16px 等於整個手勢消失。
   ⇒ 治法照上次:**把 `__q` 補足具體度到 (0,3,1) 明確勝出**,⛔不靠「我的規則寫在後面」。 */
.nx-page--pricing .nx-worth p.nx-worth__q {
    margin: 0 0 22px; font-family: var(--t-f-story);
    font-size: clamp(20px, 2.6vw, 27px); line-height: 1.75; color: var(--t-ink);
}
.nx-page--pricing .nx-worth__q b { font-weight: 700; }
.nx-page--pricing .nx-worth p { margin: 0 0 1em; font-size: 16px; line-height: 1.9; color: var(--t-text); }
.nx-page--pricing .nx-worth p:last-child { margin-bottom: 0; }
.nx-page--pricing .nx-worth strong { color: var(--t-ink); font-weight: 700; }
.nx-page--pricing .nx-worth__more { margin: 22px 0 0; font-size: 14.5px; color: var(--t-text-soft); }
body.nx-theme--tech-trust.nx-page--pricing .nx-worth__more a { color: var(--np-text); font-weight: 600; }
body.nx-theme--tech-trust.nx-page--pricing .nx-worth__more a:hover { text-decoration: underline; }

/* ── ③ nx-legacy:上一代官網的原句(帳本 F059 / F060 實抓)──────────────────
   ⭐ 說服力**完全來自出處**(十幾年前就寫在站上,不是為這一頁寫的)⇒ `cite` 是論據不是裝飾,
      **不可為了版面拿掉**。用襯線體=全站既有的「這是過去/別人的聲音」語彙。
   ⚠️ v2 已把 F060 那則**砍到只留關鍵句**(業主:內容再簡化)。 */
/* ⛔ `master.css` 有 `blockquote { background: #fff }` ⇒ 引述在 `nx-sec--soft`(淺灰)段上
   變成一個**白色方框**,眯眼測試時比該段的主角(放大問句)更抓眼。
   ⚠️ v1 時這一則放在白底段,白框看不出來;v2 移到淺灰段才暴露 —— **換了底色就要重看一次**。
   ⇒ 收掉底色,讓它回到「只有一條左線」的引述語彙。 */
.nx-page--pricing .nx-legacy {
    max-width: 44em; margin: 34px auto 0; padding: 0 0 0 22px;
    border-left: 3px solid var(--t-line); background: transparent;
}
/* ⚠️ 與 `.nx-worth p` **同具體度 (0,2,1)**,目前只靠「寫在後面」贏 —— 那不是機制。
   多帶一層 `blockquote` 補到 (0,2,2),順序改變也不會壞。 */
.nx-page--pricing blockquote.nx-legacy p {
    margin: 0 0 8px; font-family: var(--t-f-story);
    font-size: 16.5px; line-height: 1.9; color: var(--t-text);
}
.nx-page--pricing .nx-legacy cite {
    font-style: normal; display: block; font-size: 13.5px;
    line-height: 1.75; color: var(--t-text-soft);
}
.nx-page--pricing .nx-legacy--in { margin: 22px 0; max-width: none; }

/* ── ④ nx-cost:把帳講清楚(三欄不等量)────────────────────────────────────
   ⭐ 「不用另外付」是主角:粗一階的軌線 + 大半級的字。訪客真正不安的不是價格,
      是「以後還會不會再冒出什麼」⇒ 讓那一欄先被讀到。
   ⭐ 三欄**三種軌線材質對應三種性質**:實線青=一定有 / 虛線=你決定要不要 / 實線灰=之後才有。
   ⛔ 三欄都是無框文字塊,只靠左側軌線分隔(沿用 quick-tour `nx-why` 與 get-started `nx-plan` 的既有裁示)。 */
.nx-page--pricing .nx-cost {
    display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr) minmax(0, .95fr);
    gap: 0 42px; max-width: 1150px; margin: 0 auto;
}
.nx-page--pricing .nx-cost__col { padding: 2px 0 0 22px; border-left: 2px solid var(--t-line); }
.nx-page--pricing .nx-cost__col--free { border-left-width: 3px; border-left-color: var(--t-cyan); }
.nx-page--pricing .nx-cost__col--opt {
    border-left-style: dashed; border-left-color: rgba(100, 110, 126, .5);
}
.nx-page--pricing .nx-cost__hd {
    font-family: var(--t-f-display); color: var(--t-ink);
    font-size: 15.5px; font-weight: 700; margin: 0 0 16px;
}
.nx-page--pricing .nx-cost__col--free .nx-cost__hd { font-size: 19px; }
.nx-page--pricing .nx-cost__col ul { list-style: none; margin: 0; padding: 0; }
.nx-page--pricing .nx-cost__col li {
    font-size: 15px; line-height: 1.7; color: var(--t-ink); padding: 0 0 12px;
}
.nx-page--pricing .nx-cost__col--free li { font-size: 16.5px; padding-bottom: 14px; }
.nx-page--pricing .nx-cost__col--later li { font-size: 14.5px; }
.nx-page--pricing .nx-cost__col li i {
    font-style: normal; display: block; margin-top: 2px;
    font-size: 14px; line-height: 1.75; color: var(--t-text-soft);
}
.nx-page--pricing .nx-cost__col--free li i { font-size: 14.5px; }
.nx-page--pricing .nx-cost__col li i strong { color: var(--t-text); font-weight: 700; }
.nx-page--pricing .nx-cost__say {
    margin: 16px 0 0; font-family: var(--t-f-story);
    font-size: 14.5px; line-height: 1.9; color: var(--t-text);
}
.nx-page--pricing .nx-cost__say--plain { font-family: var(--t-f-body); color: var(--t-text-soft); }
/* 維護費計算機示意圖:⭐它的工作是**證明**不是**讀** ⇒ 刻意退位(收窄 + 邊框淡一階),
   否則模糊後它會比主欄更重(眯眼測試實證)。 */
.nx-page--pricing .nx-cost__mock { margin: 16px 0 0; max-width: 250px; }
.nx-page--pricing .nx-cost__mock.nx-mock { border-color: rgba(221, 228, 238, .8); }
.nx-page--pricing .nx-cost__mock .nx-mock__bar { background: rgba(238, 242, 248, .55); }
.nx-page--pricing .nx-cost__mock figcaption {
    padding: 9px 12px 10px; border-top: 1px solid var(--t-line);
    background: var(--t-paper-soft); font-size: 11.5px; line-height: 1.6; color: var(--t-text-soft);
}

/* ── ⑤ nx-when:付款時機(彈性)/ 保固起算(肯定)───────────────────────────
   ⭐⭐ content-decisions §十四 的核心分工:**付款講彈性、保固講肯定**。
      ⛔ 不得寫「主要都是開業以後才開始算」——那把「延後付款」講成了必然。
   ⭐ 兩欄**刻意等大**(兩件事對稱、差異在性質不在權重),差異改由**軌線材質**承擔:
      付款=虛線(可談)、保固=實線(確定)。 */
.nx-page--pricing .nx-when {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0 52px; max-width: 1000px; margin: 0 auto;
}
.nx-page--pricing .nx-when__b { padding: 2px 0 0 22px; }
.nx-page--pricing .nx-when__b--pay { border-left: 2px dashed rgba(100, 110, 126, .5); }
.nx-page--pricing .nx-when__b--warranty { border-left: 2px solid var(--t-accent); }
.nx-page--pricing .nx-when__tag {
    font-family: var(--t-f-mono); font-size: 11.5px; letter-spacing: .12em;
    font-weight: 700; color: var(--t-text-soft); margin: 0 0 10px;
}
.nx-page--pricing .nx-when__b h3 {
    font-family: var(--t-f-display); color: var(--t-ink);
    font-size: 19.5px; font-weight: 700; line-height: 1.45; margin: 0 0 14px;
}
.nx-page--pricing .nx-when__b p { margin: 0 0 1em; font-size: 15.5px; line-height: 1.9; color: var(--t-text); }
.nx-page--pricing .nx-when__b p:last-child { margin-bottom: 0; }
.nx-page--pricing .nx-when__b strong { color: var(--t-ink); font-weight: 700; }
body.nx-theme--tech-trust.nx-page--pricing .nx-when__b a { color: var(--np-text); font-weight: 600; white-space: nowrap; }
body.nx-theme--tech-trust.nx-page--pricing .nx-when__b a:hover { text-decoration: underline; }
/* 業主親筆的那一句:全段唯一的大字,單獨成行 ⇒ 情緒交給排版,不交給圖 */
.nx-page--pricing .nx-when__pull {
    max-width: 40em; margin: 46px auto 0; text-align: center;
    font-family: var(--t-f-story); font-size: clamp(18px, 2.1vw, 21px);
    line-height: 1.75; color: var(--t-ink);
}

/* ── ⑥ nx-creed:立場(先講做法、後引那句話)──────────────────────────────
   ⭐ 順序是刻意的(§二十六 副作用 2):價值觀要用**做法**講,不要用形容自己的形容詞講;
      自稱誠實正直反而降低可信度。所以做法在前,十幾年前那句放最後**當註腳**並寫出出處。 */
.nx-page--pricing .nx-creed { max-width: 48em; margin: 0 auto; }
/* ⛔ `__body`(原段6「以退為進」的文字塊)6 條規則已於 2026-08-19 隨該段移除,不留死規則。 */
.nx-page--pricing .nx-creed__do { list-style: none; margin: 0; padding: 0; }
.nx-page--pricing .nx-creed__do li {
    position: relative; padding: 0 0 11px 22px;
    font-size: 16px; line-height: 1.85; color: var(--t-text);
}
.nx-page--pricing .nx-creed__do li::before {
    content: ""; position: absolute; left: 0; top: .84em;
    width: 10px; height: 1px; background: var(--t-cyan);
}
.nx-page--pricing .nx-creed__foot { margin: 0; font-size: 15.5px; line-height: 1.9; color: var(--t-text); }
.nx-page--pricing .nx-creed__foot strong { color: var(--t-ink); font-weight: 700; }

/* ══════════════════════════════════════════════════════════════════════════
   ⭐⭐ 2026-08-20 段3~6 節奏校正 —— 業主拍板「**明暗 + 景別一起換**」
   ──────────────────────────────────────────────────────────────────────────
   病灶(量出來的,不是感覺):段3~6 **四段同亮度、同形狀**——都是「置中 eyebrow +
     置中 h2 + 一大片文字」,底色只在 白/淺灰 之間換。眯眼看過去是四塊一樣的磚,
     而段2 剛做完的電影感到這裡就斷掉。
   ⭐ 治法不是「把每一段都弄暗」,是讓**版面的差異對應內容的差異**
     (記憶 order-within-chaos:答不出「為什麼是這裡不是隔壁」就拿掉):

     段3 反問  亮 · 大特寫   全頁唯一直接問讀者的一段 ⇒ 畫面裡只留那個問句
     段4 帳目  最亮 · 全景   資訊密度最高、最需要讀 ⇒ 視野拉寬,證據帶放大
     段5 時間  暗 · 雙人鏡   從「你要付多少」轉向「我們對你的承諾」⇒ 全頁最沉、最靜的一段
     段6 立場  半暗 · 獨白   全頁最像「人在說話」⇒ **燈打在說話的人身上**,比周圍亮一階

   ⚠️ 段5/段6 的明暗**不是一路遞減**:實測發現 CTA 的實際底色就是 `--t-ink-deep`(#0a1120,
     被本檔後段的 `background-color` 覆寫,不是 `--t-ink`)⇒ 若段6 也用最深就會與 CTA
     **相鄰同底**。對調之後不只解掉同底,戲也更好:承諾最沉 → 說話的人被打亮 → 行動再沉下去,
     是**起伏**不是斜坡。

   ⭐ 明暗四階**全部取自主題既有 token**,一個新顏色都沒發明:
     --t-paper-soft(段3) / #fff(段4) / --t-ink-mid(段5) / --t-ink-deep(段6)。
   ⭐ 段5、段6 直接掛全站既有的 `.nx-sec--dark` ⇒ 標題/內文/連結/焦點環的深底規則
     (都已驗過 AA)整套沿用,本檔只補**元件級**的深底覆寫,不另造一套深色主題。
   ⛔ 相鄰同底(實測 computed):段4 #fff → 段5 #0a1120 → 段6 #17233c → CTA #0a1120,
     相鄰兩兩皆不同;段2(#0a1120)與段5 同色但**不相鄰**,不成立同底。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── 段3 = 亮 · 大特寫 ────────────────────────────────────────────────────
   ⭐ 「特寫」的定義是**畫面裡只有一件事**。這一段的 h2「也許你可以先算一件事」
     與那個問句講的是同一件事 ⇒ 兩個都放大等於講兩次、互相稀釋。
     ⇒ h2 退成**場記板式的小標**(靠左、去掉雙線),真正的主角是問句本身。
   ⚠️ h2 只是**視覺**退位,文字與標題階層一個字都沒動(SEO/無障礙不受影響)。
   ⭐ 字級跨距從 27→20px 標題 vs 44px 問句 = **2.2×**,眯眼時主角唯一。 */
.nx-page--pricing #sec-worth { padding-top: 116px; padding-bottom: 116px; }
.nx-page--pricing #sec-worth .nx-sec__head {
    text-align: left; max-width: 46em; margin: 0 auto 30px;
}
.nx-page--pricing #sec-worth .nx-sec__title {
    font-size: 20px; line-height: 1.5; color: var(--t-text-soft); font-weight: 700;
}
.nx-page--pricing #sec-worth .nx-sec__title::after { display: none; }
/* ⛔ 具體度要贏過上面那條 `.nx-page--pricing .nx-worth p.nx-worth__q`(0,3,1);
   多帶一層 id ⇒ (1,3,1),⛔不靠「寫在後面」(本檔已記過三次)。 */
.nx-page--pricing #sec-worth .nx-worth p.nx-worth__q {
    font-size: clamp(26px, 4vw, 44px); line-height: 1.5; margin: 0 0 32px;
    /* ⚠️ 中文可以在**任何兩個字之間**斷行 ⇒ 大字時很容易把詞拆開。
       實測:只加 `text-wrap: balance` **沒有解掉** —— 它把三行長度拉勻了,
       但斷點仍然落在「假設你打 / 算做十年」,硬生生把「打算」剖成兩半。
       ⛔⭐⭐ **`text-wrap: balance` 本身就是罪魁禍首**(三組對照實測,不是推論):
           balance + auto-phrase → 「假設你打 / 算做十年」⛔ 拆詞
           balance + normal      → 「假設你打 / 算做十年」⛔ 同樣拆詞
           **拿掉 balance** + auto-phrase → 「假設你打算 / 做十年」✅ 零拆詞
         ⇒ balance 為了把各行長度**拉勻**,會主動把斷點往前推,在中文大字就是**把詞剖開**。
         ⚠️ 這與英文直覺相反(英文有空白,balance 不可能拆字)⇒ **中文大字標題不要用 balance**。
       ⛔⭐ **`word-break: auto-phrase` 對繁中是「寫得出、跑得動、就是沒生效」**(本站同型第 N 次):
         實測 390 與 1440 兩個寬度,`auto-phrase` 與 `normal` 的斷行**逐字完全相同**
         (探針比對 JSON 相等)⇒ Chrome 的詞組切分目前只對日文有實作,`lang="zh-TW"` 拿不到。
         ⇒ **已刪除**,不留一條看起來有做事、其實沒有的規則。
         ⚠️ 也就是說:這一句的改善**100% 來自拿掉 balance**,與 auto-phrase 無關 —— 別記錯因果。
       ⛔ 也不用 `word-break: keep-all`:中文沒有空白,那會把整段當成一個字直接溢出。
       ⚠️ 手機(390)因為欄窄,仍然會出現「假 / 設」這種拆詞 —— 中文本來就可以任意斷行,
         禁則只管標點不管詞;要再治只能靠 `<span nowrap>` 之類的標記硬鎖,成本與脆弱度都不划算。 */
}
/* 上一代官網那句退成註腳感:它是**論據**不是主角,不可與問句搶(cite 仍不可拿掉) */
.nx-page--pricing #sec-worth .nx-legacy { margin-top: 44px; margin-bottom: 8px; }
/* 引述的 cite 與下一行連結原本黏在一起(實測貼齊),補一階間距讓它讀得出是兩件事 */
.nx-page--pricing #sec-worth .nx-worth__more { margin-top: 30px; }
.nx-page--pricing #sec-worth blockquote.nx-legacy p { font-size: 15px; }
.nx-page--pricing #sec-worth .nx-legacy cite { font-size: 12.5px; }

/* ── 段4 = 最亮 · 全景 ────────────────────────────────────────────────────
   ⭐ 純白=全頁最亮的一階,理由在內容:這是資訊密度最高、訪客最需要**讀**的一段。
   ⭐ 「全景」=視野變寬:三欄容器 1150 → 1240,欄距 42 → 56。
   ⛔ 三欄的**左側軌線與三種材質不動**(實線青/虛線/實線灰 = 三種性質,
     而且是與 quick-tour `nx-why`、get-started `nx-plan` 的跨頁一致裁示)。 */
.nx-page--pricing #sec-cost { background: var(--t-card); }
.nx-page--pricing #sec-cost .nx-cost { max-width: 1240px; gap: 0 56px; }
/* ⛔⭐⭐ 2026-08-20 **「證據帶」已由業主否決並還原,不要再做一次。**
   本輪一度把維護費計算機示意圖與它的引導句拉出三欄之外、放大到 460px 並加一條灰底帶
   (理由是「素材的工作沒被兌現」)。業主看過畫面後裁示:
   「**在現在把它獨立放在那個會有點分開的感覺,這種配置不好,就把它再調整回去**」。
   ⇒ 已放回 `.nx-cost__col--later` 內、接在年度系統維護費下面,**樣式回原本的 250px**
     (見下方 `.nx-cost__mock` 原規則,那組從頭到尾沒動過)。
   ⭐⭐ **判準教訓(比這次的改動有價值)**:**素材的「工作」也包含它的上下文**。
     這張圖是在解釋**年度系統維護費**這一條;把它抽離那一欄,它就從「這一條的證據」
     降格成「一張浮在段尾的圖」——**放大反而讓脫節更明顯**。
     ⛔ 下次看到「asset-job-decides-treatment」想放大素材時,先問**它離開原位之後還說得通嗎**。
   ⚠️ `nx-cost__proof` 這個 class 已全數移除(DOM 與 CSS 皆無殘留),不留死規則。 */

/* ── 段5 = 半暗 · 雙人鏡 ──────────────────────────────────────────────────
   ⭐ 「雙人鏡」=兩個人同框、**對等**,鏡頭往前推:兩塊仍然**等大**
     (⛔ §十四 的裁示:兩件事對稱、差異在性質不在權重,由軌線材質承擔),
     改的是**收窄 + 拉開 + 浮在暗場上** ⇒ 換的是景別,不是權重。 */
/* 半暗底(現在掛在段6):⛔具體度寫成 `.nx-sec--dark.nx-sec--dim`(0,2,0)明確勝出,不靠載入順序 */
.nx-page--pricing .nx-sec--dark.nx-sec--dim { background: var(--t-ink-mid); }
.nx-page--pricing #sec-when .nx-when { max-width: 880px; gap: 0 72px; }
.nx-page--pricing #sec-when .nx-when__b--pay { border-left-color: rgba(255,255,255,.34); }
.nx-page--pricing #sec-when .nx-when__b--warranty { border-left-color: var(--t-cyan); }
.nx-page--pricing #sec-when .nx-when__tag { color: var(--t-on-dark-soft); }
.nx-page--pricing #sec-when .nx-when__b h3 { color: #fff; }
.nx-page--pricing #sec-when .nx-when__b p { color: var(--t-on-dark-soft); }
.nx-page--pricing #sec-when .nx-when__b strong { color: var(--t-on-dark); }
.nx-page--pricing #sec-when .nx-when__pull { color: #fff; }
/* ⛔ 連結:深底上不用 `--t-accent`(#1e6cff 在 #17233c 上只有 2.5:1)⇒ 用站上既有的
   「深色區連結=青」語彙(#00c8d7 對 #17233c 實量 7.7:1)。具體度多帶 body 主題層,
   因為原規則就是 `body.nx-theme--tech-trust.nx-page--pricing .nx-when__b a`(0,4,0)。 */
body.nx-theme--tech-trust.nx-page--pricing #sec-when .nx-when__b a { color: var(--t-cyan); }

/* ── 段6 = 暗 · 獨白 ──────────────────────────────────────────────────────
   ⭐ 「獨白」=一個人、一盞燈,其他都暗下去:收窄到 40em、去掉卡面(暗場上不需要
     面板來分界)、三條做法放大成一句一行。
   ⚠️ `.nx-c-voice` 是**共用元件**(/contact 也在用)⇒ 這裡**只在本頁的深底作用域覆寫外觀**,
     不動共用規則本身,也不從 DOM 拿掉 class(要退回亮底時原樣還在)。
   ⭐ 段6 比 CTA 亮一階 ⇒ 交界本身就是分界,**不需要**再畫一條 hairline(少一個元素)。 */
.nx-page--pricing #sec-creed .nx-creed { max-width: 40em; }
.nx-page--pricing #sec-creed .nx-c-voice {
    background: transparent; border: 0; border-left: 2px solid var(--t-line-ink);
    border-radius: 0; box-shadow: none; padding: 4px 0 4px 30px;
}
.nx-page--pricing #sec-creed .nx-creed__do li {
    font-size: 19px; line-height: 1.8; color: var(--t-on-dark); padding-bottom: 16px;
}
.nx-page--pricing #sec-creed .nx-creed__do li::before { top: .92em; width: 12px; }
.nx-page--pricing #sec-creed .nx-creed__foot { color: var(--t-on-dark-soft); }
.nx-page--pricing #sec-creed .nx-creed__foot strong { color: #fff; }
.nx-page--pricing #sec-creed .nx-legacy--in { border-left-color: var(--t-line-ink); margin: 30px 0; }
.nx-page--pricing #sec-creed blockquote.nx-legacy p { color: var(--t-on-dark); font-size: 17.5px; }
.nx-page--pricing #sec-creed .nx-legacy cite { color: var(--t-on-dark-soft); }

/* ── ⑦ 平台級既有缺陷的本頁修補:eyebrow 與 h2 在窄螢幕併排同一行 ──────────
   出身:`theme.css:116` 的 `.nx-sec__title{display:inline-block}` 是**刻意的**
     (`::after` 雙線要只跟標題一樣寬 ⇒ 必須 shrink-to-fit)⇒ ⛔**不可以改它**。
   真正的根因是「**兩個 inline-block 相鄰**」(`.nx-eyebrow` 也是 inline-block)
   ⇒ 讓 eyebrow 變 block 自己一行,**由結構保證不併行**,不靠「標題剛好夠長」。
   ⚠️ 實測同型缺陷:`/get-started` 1 處、`/system` 1 處、`/roi-calculator` **2 處**、`/security` 0 處。
      通用修法只要把 `.nx-page--pricing` 拿掉,但那是改三頁已驗收的手機版面 ⇒ 等業主裁示。 */
.nx-page--pricing .nx-sec__head .nx-eyebrow { display: block; }

/* ── ⑧ 手機 / 窄斷點 ───────────────────────────────────────────────────
   ⚠️ 媒體查詢**不增加具體度**,裡面的選擇器一律與上方同構(踩過:RWD token 整批失效)。 */
@media (max-width: 991px) {
    /* 三張卡牌在中斷點改 2+1:主角(買斷)獨佔一列,另兩張並排 ⇒ 主從關係在窄螢幕仍成立 */
    .nx-page--pricing .nx-plans__cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .nx-page--pricing .nx-plans__card--buy { grid-column: 1 / -1; }
    .nx-page--pricing .nx-cost { grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); gap: 30px 34px; }
    .nx-page--pricing .nx-cost__col--later { grid-column: 1 / -1; }
}
/* ⭐ 2026-08-20 **這組規則一度被我刪掉(因為示意圖搬走了),業主否決搬移後已原樣補回**。
   出身:「之後才會有的」跨滿兩欄時內容不足、右側大片空白 ⇒ 內部再分兩欄(文字左、示意圖右)。 */
@media (max-width: 991px) and (min-width: 721px) {
    .nx-page--pricing .nx-cost__col--later {
        display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 280px);
        gap: 0 34px; align-items: start;
    }
    .nx-page--pricing .nx-cost__col--later .nx-cost__hd { grid-column: 1 / -1; }
    .nx-page--pricing .nx-cost__col--later .nx-cost__mock {
        grid-column: 2; grid-row: 2 / span 2; margin-top: 0; max-width: none;
    }
}
@media (max-width: 991px) {
    /* 段5 半暗場在窄螢幕:兩塊疊起來之後間距要拉開,否則兩條軌線會讀成同一塊 */
    .nx-page--pricing #sec-when .nx-when { max-width: none; gap: 34px 0; }
}
@media (max-width: 860px) {
    .nx-page--pricing .nx-when { grid-template-columns: 1fr; gap: 32px; }
    .nx-page--pricing .nx-when__pull { margin-top: 34px; }
}
@media (max-width: 720px) {
    .nx-page--pricing .nx-plans__cards { grid-template-columns: 1fr; gap: 14px; }
    .nx-page--pricing .nx-plans__card { padding: 22px 20px 20px; }
    .nx-page--pricing .nx-plans__name { font-size: 23px; }
    .nx-page--pricing .nx-cost { grid-template-columns: 1fr; gap: 32px; }
    .nx-page--pricing .nx-cost__col--later { grid-column: auto; display: block; }
    .nx-page--pricing .nx-cost__mock { max-width: none; }
    /* 段3 大特寫在手機:問句仍是主角,但上下留白收一些,免得一屏只剩一句話 */
    .nx-page--pricing #sec-worth { padding-top: 72px; padding-bottom: 72px; }
    /* 詳述的小標與其說明在窄螢幕容易黏在一起 */
    .nx-page--pricing .nx-plans__hd em { display: block; margin: 4px 0 0; }
    /* 膠囊在窄螢幕縮一階,免得三個字的方案名把整行撐開 */
    .nx-page--pricing .nx-plans__pill { padding: 2px 14px; font-size: 15.5px; }
    /* 窄螢幕壓縮上下外擴,免得兩段的面靠太近 */
    .nx-page--pricing .nx-plans__block { padding-right: 14px; }
    .nx-page--pricing .nx-plans__block::before { top: -10px; bottom: -10px; }
}

/* 尊重使用者的動態偏好(站規:預設開、用 @media 尊重設定,不是預設關)
   ⭐ 只關掉「動」,不關掉「狀態」——選中的卡牌一樣變深藍、對應段落一樣亮起淺藍面,
     只是不淡入、不位移、不上浮。⛔ 不可以在這裡把 opacity 也一起停掉。 */
@media (prefers-reduced-motion: reduce) {
    .nx-page--pricing .nx-plans__card,
    .nx-page--pricing .nx-plans__block,
    .nx-page--pricing .nx-plans__block::before,
    .nx-page--pricing .nx-plans__pill { transition: none; }
    .nx-page--pricing .nx-plans__card:hover { transform: none; }
    .nx-page--pricing .nx-plans__block::before { transform: none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   /pricing 段2「為什麼不直接標價?」——聚光燈電話(2026-08-19 業主指示,二輪定版)
   ──────────────────────────────────────────────────────────────────────────
   業主一輪:「字稍微靠右,大概佔頁寬的三分之二;左邊放一個圖檔但要有動態,
     畫面是 spotlight 打在一個電話上,電話要很醒目,有電影的強烈視覺印象,
     暗示客戶聯絡我們取得實際價格;spotlight 要飄動、光影搖曳、偶爾被遮蔽;
     電話會反光,光亮塑膠的光澤感會飄動;場景盡量簡單。」
   業主二輪:「黑電話沒有神秘感也沒有反差 ⇒ 改紅或橘紅,要很吸睛、有點違和;
     圖被裁切邊緣感覺怪 ⇒ 做成背景,光線只疊在上層;電話再小一點約 2/3,
     要有距離感,神秘但可達。」

   ⭐⭐ **媒材判斷(憲章「媒材先於畫法」)——為什麼是「圖 + CSS」不是純圖或純 CSS**:
     要傳達的是**情緒氛圍**,不是資訊。
       · **質感**(漆面反光、體積光、桌面光暈、景深)⇒ 生成圖,CSS 畫不出來。
       · **變化**(光搖曳、偶爾被遮蔽、機身高光流動)⇒ CSS 疊層,圖是靜的畫不出來。
     ⇒ 各拿最強的(記憶 media-choice:最強解通常是混合)。

   ⭐⭐ **朱紅是算出來的,不是挑出來的**:錨在主題**既有**的 `--t-seal #c14627`
     (tokens.css 寫明「暖橘朱:誠實區、關鍵警示,**節制使用**」)。
     · 符合整頁=用的是站上本來就有的色票,不是外來色。
     · 「節制使用」在這裡是**正解**:全頁唯一一次,而且只落在**一個物件**上,不是一片面積。
       ⚠️ 記憶 260725_13 記過的反例是「把 seal 當**常態 UI 色**」,與此處相反。
     · 冷藍底 × 暖朱紅=**冷暖對比**,業主要的「有點違和」就是它;
       而紅色電話在電影語彙裡本來就是**熱線**,直接對上「打這通電話問價格」。
   ⭐ **主從用彩度與亮度做,不是用尺寸**(記憶 asset-job-decides-treatment)
     ⇒ 電話刻意**小**、離得遠(業主要的距離感),靠顏色跳出來,不靠佔面積。

   ⭐⭐ **底圖走 `mix-blend-mode: screen`** —— 這是「不會有裁切邊」的根本解:
     screen 對黑色像素**完全不作用** ⇒ 圖的黑=段落底色,**不管容器多大多小都不可能出現邊界**。
     ⛔ 因此底圖層**不可以**放任何暗色裝飾(screen 會讓它消失);遮蔽帶必須另立一層。

   ⛔⭐ **`.nx-ask` 與 `/get-started` 共用**(本檔 §③ 逗號擴收)⇒ 一律走 `--split` 修飾子;
      要壓過既有 `.nx-page--pricing .nx-ask`(0,2,0) 的,寫 `.nx-ask.nx-ask--split`(0,3,0)。
      ⛔**不可靠「寫在後面」**(本檔已記過三次)。已實測 `/get-started` 零變動。
   ⚠️ 效能:兩張 webp 合計 **22KB**(900w=15KB / 560w=7KB);三層是純 CSS 漸層,零圖檔。
   ══════════════════════════════════════════════════════════════════════════ */
/* ⭐ 場景回到**格線第 1 欄**(不是絕對定位貼齊段落左緣)——業主圈的位置就是「左欄的正中」。
   ⭐⭐ 定位方式是**實測出來的**:量出電話在原圖的重心=(50.5%, 78.2%),
     然後**把畫布往下補純黑**到 1809×3755,讓重心正好落在畫布正中(覆驗 50.1% / 50.0%)。
     ⇒ 之後只要 `background-position: center` + `contain`,電話就**永遠**落在舞台正中,
       任何斷點、任何欄寬都不用再調參數。⭐ 補黑的成本是零——screen 混合下黑=不作用。
   ⛔ 不要改回「用 background-position 百分比硬喬」:那個做法每換一個斷點就要重調一次。 */
.nx-page--pricing #sec-why { position: relative; isolation: isolate; }

.nx-page--pricing .nx-ask.nx-ask--split {
    max-width: 1060px; margin: 0 auto; width: 100%;
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
    gap: 48px; align-items: center;
}
.nx-page--pricing .nx-ask__body { grid-column: 2; position: relative; z-index: 2; }

/* 舞台=第 1 欄;本身不設 blend(設了會變成 stacking context,裡面的層就只能跟它自己混合) */
.nx-page--pricing .nx-ask__stage {
    position: relative; grid-column: 1; align-self: stretch;
    min-height: 430px; pointer-events: none;

    /* ⭐⭐ 燈的座標系一次講清楚,下面兩盞燈只引用,不各自算:
       · 兩盞燈的盒子都是 `inset:-25%` ⇒ 盒子 0%~100% 對應 stage 的 -25%~125%
         ⇒ stage 內 p% 換算到盒內 = (p+25)/150 %。
       · `--ph-x/--ph-y` = **實測的電話中心**換算成盒內座標(桌機 stage 內 51.2% / 65.3%)。
       · 光心一律寫成 `calc(var(--ph-x) + 位移px)` ⇒ **光永遠黏著電話**,換斷點不會漂。
       ⛔ `--pool*` 用 **px 不用 %**:百分比是對盒子算的,而 991 的舞台又寬又扁
         (943×250 vs 390 的 327×250)⇒ 同一個 24.5% 在 390 是 120px、在 991 變 346px,
         會從「一池光」變成「橫向一整片洗光」。實測抓到,不要改回 %。 */
    --ph-x: 50.8%;   --ph-y: 60.2%;
    --pool: 190px;   --pool-fill: 240px;
    --key-dx: 52px;  --key-dy: -52px;
    --fill-dx: -132px; --fill-dy: -98px;
}
/* 底圖:出血到欄外(黑=不作用 ⇒ 出血零成本),場景才不會被欄寬框住 */
.nx-page--pricing .nx-ask__stage::before {
    /* ⭐ 業主二輪:電話再大 1.5 倍、稍微下移約一個電話高。
       ⚠️ `contain` 是「塞進盒子」⇒ **盒子越高圖越大**;實測 -25% 得到約 180px 寬的電話
         (前一版 120px,1.5x)。下移用 translateY,不用改 inset(改 inset 會同時動到大小)。 */
    content: ""; position: absolute; inset: 6% -12%;
    transform: translateY(17.5%);   /* 換圖後重心上移 25px,補回業主已認可的落點(實測 y=370) */
    background-image: url("images/ask/ask5-880.webp");
    background-repeat: no-repeat; background-position: center center;
    background-size: contain;
    mix-blend-mode: screen;                 /* ⭐ 黑=不作用 ⇒ 無邊界、無裁切感 */
    /* ⚠️ 實測修正:生成圖的「黑」其實是 (17,20,27) 不是 0,screen 下會把段落底色整片提亮
       ⇒ 畫面上出現一個淺色方塊。已在**資產端**把黑點壓到真正的 0(逐通道 -21/-24/-31);
       這層遮罩是雙保險:就算還有殘留,也是**淡出去**而不是收在一條直線上。 */
    /* ⛔⭐ 2026-08-20 **刪掉原本的橢圓 mask**(交付紀律 15「刪一項」,而且刪了會**變好**):
       它寫 `48% 46% ... #000 34%` ⇒ **只有 16% 半徑內是全不透明**,電話外緣與整片桌面反光
       都被它乘掉,正是「光打不到、畫面發灰」的其中一個來源。
       它當初的職責是防裁切痕的**雙保險**,但該職責現在由**資產端**保證並已實測:
       `ask15-880/540` 的**最外圈一整圈 max channel = 0**(ring@8px 也是 0)⇒ 前提成立,mask 只剩副作用。
       ⛔ 要加回來的唯一時機=換了一張最外圈非 0 的圖。 */
}
/* 三層光效共同體 */
.nx-page--pricing .nx-ask__beam,
.nx-page--pricing .nx-ask__gobo,
.nx-page--pricing .nx-ask__gleam {
    position: absolute; pointer-events: none; z-index: 1;
    will-change: transform, opacity;
}

/* ① 兩盞燈(業主二輪:「光線不直接從頂部下,右上一盞、左上一盞,左邊那盞距離比右邊遠、
     位置更高,比較漫射」)
   ⭐ 因此**不再用「頂端支點的擺動光柱」** —— 那是單一劇場燈的語彙,與兩盞漫射燈相反。
     改成兩團柔光:近燈(右上,暖、亮、範圍小)+ 遠燈(左上,冷、暗、範圍大、位置更高)。
   ⭐ 兩者**週期不同**(15s / 21s),與高光 9s、遮蔽 17s 互不整除
     ⇒ 疊起來的節奏不會有明顯循環,才像光自己在動,而不是在跑動畫。
   ⛔ 只動 transform / opacity。 */
/* ⛔⭐⭐ 2026-08-20 業主:「光線有點不自然」——病灶是**量出來的**,不是調感覺:
     舊值的光心在 stage 內座標 **(88.2%, -5.8%)** 與 **(-2.1%, -29%)**,兩盞都在**舞台上緣之外**,
     半徑只有 143px,而電話中心在 **(51.2%, 65.3%)**,垂直距離 305px
     ⇒ **兩盞燈根本照不到電話**,畫面上那團霧只是它們的下襬 = 光在沒有東西的地方亮、
       被照亮的東西旁邊沒有光源,大腦立刻讀出假。
   ⭐ 新值讓光心落在**圖裡烤進去的光源方位上**:資產的 key 來自右上前方、rim 來自左後,
     所以近燈心 = stage 內 (78%, 42%)(電話的右上),遠燈心 = (14%, 26%)(更左更高更散)。
   ⭐ 兩層都用 `inset:-25%` 統一出血,光心改由 gradient 的百分比表達
     ⇒ 換斷點時只要重算兩個百分比,不必再各自喬 right/top/width/height 四個值。
   ⭐ 半徑放大到能真的罩住電話(近燈 ~230px、遠燈 ~310px,皆大於各自到電話的距離)。 */
.nx-page--pricing .nx-ask__beam {          /* 近燈(key):電話的右上,暖 —— 對齊圖裡烤進去的主光 */
    inset: -25%;
    background: radial-gradient(var(--pool) var(--pool)
        at calc(var(--ph-x) + var(--key-dx)) calc(var(--ph-y) + var(--key-dy)),
        rgba(255, 224, 186, .13) 0%,
        rgba(255, 196, 145, .055) 46%,
        transparent 80%);
    filter: blur(10px); mix-blend-mode: screen;
    animation: nxAskKey 15s ease-in-out infinite;
}
.nx-page--pricing .nx-ask__beam--fill {    /* 遠燈(fill):更左更高、更冷更弱更散 */
    inset: -25%;
    background: radial-gradient(var(--pool-fill) var(--pool-fill)
        at calc(var(--ph-x) + var(--fill-dx)) calc(var(--ph-y) + var(--fill-dy)),
        rgba(198, 220, 255, .05) 0%,
        rgba(168, 200, 245, .022) 48%,
        transparent 82%);
    filter: blur(16px); mix-blend-mode: screen;
    animation: nxAskFill 21s ease-in-out infinite;
}
@keyframes nxAskKey {
    0%   { transform: translate3d(0, 0, 0) scale(1);       opacity: .82; }
    28%  { transform: translate3d(-2.5%, 1.5%, 0) scale(1.05); opacity: 1; }
    61%  { transform: translate3d(1.5%, -1%, 0) scale(.97);   opacity: .72; }
    100% { transform: translate3d(0, 0, 0) scale(1);       opacity: .82; }
}
@keyframes nxAskFill {
    0%   { transform: translate3d(0, 0, 0) scale(1);        opacity: .70; }
    35%  { transform: translate3d(2.5%, -1.5%, 0) scale(1.07); opacity: 1; }
    72%  { transform: translate3d(-1.5%, 1%, 0) scale(.96);    opacity: .62; }
    100% { transform: translate3d(0, 0, 0) scale(1);        opacity: .70; }
}

/* ② 遮蔽帶:一條柔邊暗帶偶爾斜掃過(業主說的「偶爾會被遮蔽」)
   ⭐ 週期 17s 但**只有約 1/3 的時間在畫面內** —— 偶爾才發生,才叫「偶爾」;
     常態掃過會變成廉價的 loading 動畫。
   ⛔ 這一層**不可以**併進底圖層:底圖是 screen,暗色在那裡會完全消失。 */
.nx-page--pricing .nx-ask__gobo {
    inset: -20% -34%;
    background: linear-gradient(102deg,
        transparent 0%, transparent 38%,
        rgba(3, 7, 16, .55) 50%,
        transparent 62%, transparent 100%);
    filter: blur(12px);
    animation: nxAskGobo 17s ease-in-out infinite;
}
@keyframes nxAskGobo {
    0%, 62%  { transform: translate3d(-135%, 0, 0); opacity: 0; }
    68%      { opacity: 1; }
    92%      { opacity: 1; }
    100%     { transform: translate3d(135%, 0, 0); opacity: 0; }
}

/* ③ 機身高光:壓在電話上的橢圓亮斑,screen 疊加 ⇒ 只提亮不改色
   ⭐ 電話已經被釘在舞台正中 ⇒ 這層也只要對準正中,換圖不必再重對。
   ⚠️ 週期 9s 與光錐的 13s **刻意不同** —— 同週期會一起呼吸、看起來像在閃;
     不同週期才會有「光自己在動」的不規則感。 */
/* ⛔⭐ 2026-08-20 由「正圓亮斑」改成**沿曲面的細長條**:
     真的漆面反光是**被拉長的一條**,不是一顆圓點——舊值 40%×16% 的橢圓讀起來像
     有人拿手電筒點了一下,是「AI 感」的來源之一。
   ⭐ 位置用**量出來的電話中心 (51.2%, 65.3%)** 往上挪到機殼上緣(60%),
     長度 32% ≈ 108px 對上實測機身寬 124px;`rotate` 跟著機殼由左下往右上的走向。
   ⚠️ `translate` / `rotate` 是**獨立變換屬性**,套用順序在 `transform` 之前
     ⇒ keyframes 動 `transform` 不會把定位與角度洗掉。 */
.nx-page--pricing .nx-ask__gleam {
    left: 51.2%; top: 60%; width: 36%; height: 5.6%;
    translate: -50% -50%; rotate: -7deg;
    background: radial-gradient(closest-side ellipse at 50% 50%,
        rgba(255, 230, 210, .34) 0%,
        rgba(230, 150, 110, .13) 52%,
        transparent 100%);
    mix-blend-mode: screen; filter: blur(5px);
    animation: nxAskGleam 9s ease-in-out infinite;
}
@keyframes nxAskGleam {
    0%   { transform: translate3d(-4%, 1%, 0) scale(1);    opacity: .50; }
    30%  { transform: translate3d(3%, -1%, 0) scale(1.08); opacity: 1;   }
    62%  { transform: translate3d(5%, 2%, 0)  scale(.96);  opacity: .64; }
    100% { transform: translate3d(-4%, 1%, 0) scale(1);    opacity: .50; }
}

/* ── RWD ──────────────────────────────────────────────────────────────────
   ⚠️ 媒體查詢不增加具體度 ⇒ 選擇器與上方同構(本檔已記過的坑)。 */
@media (max-width: 991px) {
    /* 疊成一欄:場景改成標題上方的一條氛圍帶,不去跟內文搶高度 */
    .nx-page--pricing .nx-ask.nx-ask--split { grid-template-columns: 1fr; gap: 18px; }
    .nx-page--pricing .nx-ask__stage { grid-column: 1; grid-row: 1; min-height: 250px; }
    .nx-page--pricing .nx-ask__body { grid-column: 1; grid-row: 2; }
    .nx-page--pricing .nx-ask__stage::before {
        /* ⚠️ contain 是「塞進盒子」：盒子**越高**圖才越大。實測 -22% 只得 68px 寬的電話（太小），
           拉到 -55% 後約 100px。出血的部分是黑的，screen 下等於不存在，不會壓到下方標題。 */
        /* ⚠️ 新圖比例變寬(0.646 → 0.823)，沒改盒子的話手機版電話會變 149px 並被切底
           ⇒ 盒高從 -30% 收到 -5%(電話回到 ~105px) */
        inset: -5% -8%;
        transform: translateY(6%);
        background-image: url("images/ask/ask5-540.webp");
    }
    /* ⛔⭐⭐ 2026-08-20 **原本這裡是靜默壞的**:桌機改用 `inset:-25%` 之後,這裡只覆寫
         right/top/width/height ⇒ left/bottom 還留著 -25% ⇒ **left+width+right 同時成立
         = over-constrained**,瀏覽器直接丟掉 `right`。實測燈盒 x = -58~171,
         而**電話中心在 x=191** ⇒ 手機版的燈整個落在電話外面,一點都沒照到。
       ⭐ 現在**只覆寫變數**,結構值(inset)與 gradient 寫法一行都不重複
         ⇒ 這一類 over-constrained 由構造保證不可能再發生。
       量測基準(390 實測):stage 327×250、電話中心 stage 內 (50.9%, 56.4%)、機身寬 90px
       ⇒ 盒內座標 (50.6%, 54.3%);位移與光池依機身縮小比(90/124≈0.73)等比收。 */
    .nx-page--pricing .nx-ask__stage {
        --ph-x: 50.6%;   --ph-y: 54.3%;
        --pool: 138px;   --pool-fill: 172px;
        --key-dx: 38px;  --key-dy: -38px;
        --fill-dx: -97px; --fill-dy: -71px;
    }
    /* 機身高光:手機版電話較小、落點較高 ⇒ 長度收到 27%(≈88px,對上實測機身寬 90px) */
    .nx-page--pricing .nx-ask__gleam { left: 50.9%; top: 51.6%; width: 31%; height: 6.5%; }
}
/* 尊重使用者的動態偏好:只關「動」,不關「看得見」——關掉之後仍是完整的靜態畫面 */
@media (prefers-reduced-motion: reduce) {
    .nx-page--pricing .nx-ask__beam,
    .nx-page--pricing .nx-ask__beam--fill,
    .nx-page--pricing .nx-ask__gobo,
    .nx-page--pricing .nx-ask__gleam { animation: none; }
    .nx-page--pricing .nx-ask__gobo { opacity: 0; }
}

/* ══════════════════════════════════════════════════════════════════════════
   /roi-calculator 圖像化補充(2026-08-19 業主:「增加些圖示、圖表的圖像式表達」)
   ──────────────────────────────────────────────────────────────────────────
   ⭐ 媒材判斷(記憶 media-choice-before-craft),三樣東西各有各的理由:
     · **圖示**=功能性標記 ⇒ 線性 SVG sprite、`currentColor`、統一 24×24 / stroke 1.6
       ⇒ 換主題自動跟著換、任何解析度都清晰、零圖檔請求。⛔不用生成圖、⛔不用 icon font
         (站上 Ionicons 變豆腐字的前例還在)。
     · **計算鏈路**=關係拓樸(四步是因果順序)⇒ DOM/CSS 一條鏈 + 箭頭,⛔不是四張卡片。
     · **工作天格子**=尺度感 ⇒ 一格一個工作天的點陣,**資料驅動**。
       「450 小時」沒有體感,「一年 260 個工作天裡有 56 天」有 —— 這才是它存在的理由。
   ⛔ **刻意不做圓餅圖**:文書時間裡「請求書佔幾成、登記簿佔幾成」我們沒有真實數據,
      畫出來就是編的 —— 那正是 C022 禁止的效益推估。**沒有資料就不要畫那張圖。**
   ⭐ 色彩語意全頁一致:**藍=仍要做的、青=釋放出來的、灰=其他**;
      材質隨尺度變(長條用斜紋、9px 格子用實色——那個尺寸畫不出斜紋),但色相不變。
   ══════════════════════════════════════════════════════════════════════════ */

/* sprite 容器:不佔版面、不可見,但 <use> 仍然找得到 */
.nx-roi-sprite { position: absolute; width: 0; height: 0; overflow: hidden; }

/* 圖示統一規格(描邊掛在外層 <svg>,<use> 進來的 <g> 自己不宣告 ⇒ 全部繼承)
   ⛔ **尺寸與描邊要分開寫**(踩過):把 `width:100%` 也套到 `.nx-roi-doc__g svg`,
      會蓋掉上面那條 16px(同具體度、寫在後面)⇒ 圖示被撐成 **268px**。
      ⇒ 這裡只宣告「長相」,尺寸交給各自的容器。 */
.nx-page--roi-calculator .nx-roi-chain__ic svg,
.nx-page--roi-calculator .nx-roi-more__ic svg,
.nx-page--roi-calculator .nx-roi-doc__g svg {
    display: block;
    fill: none; stroke: currentColor; stroke-width: 1.6;
    stroke-linecap: round; stroke-linejoin: round;
}
.nx-page--roi-calculator .nx-roi-chain__ic svg,
.nx-page--roi-calculator .nx-roi-more__ic svg { width: 100%; height: 100%; }

/* ── ⑪ 計算鏈路圖 nx-roi-chain ────────────────────────────────────────
   ⛔ 沒有外框盒:四段靠「圖示 + 算式 + 結果詞」與一支箭頭串起來,讀起來像一條算式。
   ⭐ 差異對應內容差異(記憶 order-within-chaos):**只有最後一步是有色的**——
      它是這條鏈的終點,不是因為想讓版面不整齊。 */
.nx-page--roi-calculator .nx-roi-chain {
    max-width: 940px; margin: 36px auto 0; padding-top: 26px; border-top: 1px solid var(--t-line);
}
.nx-page--roi-calculator .nx-roi-chain__hd {
    margin: 0 0 18px; font-family: var(--t-f-mono);
    font-size: 12px; font-weight: 700; letter-spacing: .12em; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-chain__steps {
    list-style: none; margin: 0; padding: 0;
    display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0 34px;
}
.nx-page--roi-calculator .nx-roi-chain__s { position: relative; list-style: none; }
/* 連接箭頭:畫在自己右側的間隙裡(gap 34 的正中),⛔不用 % 定位 ⇒ 由構造保證不撞文字 */
/* top 8px 是量出來的:箭頭是 8×8 旋轉 45°,視覺中心 = top + 5.66;
   圖示 28px 的中心 = 14 ⇒ 8 + 5.66 ≈ 14。原本填 11 實測差 3px。 */
.nx-page--roi-calculator .nx-roi-chain__s::after {
    content: ""; position: absolute; right: -21px; top: 8px;
    width: 8px; height: 8px; transform: rotate(45deg);
    border-top: 2px solid var(--t-line); border-right: 2px solid var(--t-line);
}
.nx-page--roi-calculator .nx-roi-chain__s--last::after { content: none; }
.nx-page--roi-calculator .nx-roi-chain__ic { display: block; width: 28px; height: 28px; margin-bottom: 12px; }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-chain__ic { color: var(--t-accent-dn); opacity: .78; }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-chain__s--last .nx-roi-chain__ic { opacity: 1; }   /* 主從仍在:最後一顆滿不透明 */
.nx-page--roi-calculator .nx-roi-chain__s b {
    display: block; margin-bottom: 5px;
    font-size: 13.5px; font-weight: 600; line-height: 1.6; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-chain__s b i {
    font-style: normal; font-family: var(--t-f-mono); margin: 0 4px; opacity: .8;
}
.nx-page--roi-calculator .nx-roi-chain__s em {
    display: block; font-style: normal; font-family: var(--t-f-display);
    font-size: 16.5px; font-weight: 700; line-height: 1.5; color: var(--t-ink);
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-chain__s--last em { color: var(--np-text); }
.nx-page--roi-calculator .nx-roi-chain__note {
    margin: 20px 0 0; font-size: 13.5px; line-height: 1.8; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-chain__note strong { color: var(--t-ink); font-weight: 700; }

/* ── ⑫ 工作天格子圖 nx-roi-days ───────────────────────────────────────
   一格 = 一個工作天。⭐ 格子大小由 `auto-fill + minmax` 決定 ⇒ 任何寬度都自動排滿、
   不會出現「最後一列剩兩格」的破碎感;`aspect-ratio:1` 保證是正方形不是長條。
   ⚠️ 「其他工作」的灰格是**畫布**不是資訊主體(資訊由藍/青兩段承擔),
      但仍調到看得出邊界的深度,不讓整張圖在淺底上消失。 */
.nx-page--roi-calculator .nx-roi-days {
    margin-top: 30px; padding-top: 22px; border-top: 1px solid var(--t-line);
}
.nx-page--roi-calculator .nx-roi-days__hd {
    margin: 0 0 14px; font-family: var(--t-f-mono);
    font-size: 12px; font-weight: 700; letter-spacing: .12em; color: var(--t-text-soft);
}
/* ⛔ 欄數**不能交給 auto-fill**:實測 1440 時排出 64 欄 ⇒ 260 = 4 列 + **孤零零的第 5 列 4 格**,
   看起來像壞掉。⭐ 改用固定 52 欄(= 一年 52 週)⇒ 260 / 52 = **整整 5 列,零孤格**;
   手機 26 欄 ⇒ 整整 10 列。由構造保證,不是調參數調到剛好。
   讀法=由左至右、由上到下的連續時間軸。
   ⚠️ 2026-08-19 曾隨「佔全年工作天」換算改成 250 格 / 50 欄(扣國定假日),
      **同日業主裁示撤回**(「這樣的表示沒有加分」)⇒ 回 260 格 / 52 欄。 */
.nx-page--roi-calculator .nx-roi-days__grid {
    display: grid; grid-template-columns: repeat(52, 1fr); gap: 3px;
}
.nx-page--roi-calculator .nx-roi-days__c {
    display: block; aspect-ratio: 1; border-radius: 1px;
    transition: background-color .25s ease;
}
/* ⛔⭐⭐ 實測坐實的無障礙問題(WCAG 1.4.1 使用顏色 / 1.4.11 非文字對比):
   原本三種狀態**只靠色相**分辨——青 #00c8d7 與淺灰的亮度幾乎一樣,實量對比 **1.29:1**,
   在灰階或色覺缺陷下等於同一格。而「三種狀態彼此都到 3:1」在淺色底上**數學上做不到**
   (要 1 : 3 : 9 的亮度階梯,最後一階會超過純白)。
   ⇒ 治法不是硬調顏色,是**多給一條非顏色的通道**:
     · 仍要做 = **實心**深藍(--t-accent-dn,對淺灰實量 3.95:1)
     · 可釋放 = **空心**(只有青色細框)——⭐ 這同時是最貼切的隱喻:**釋放 = 空出來的格子**
     · 其他   = 平的淺灰
   ⇒ 灰階下依然是「實心方 / 空心框 / 平色塊」三種**形狀**,不依賴顏色。
   ⭐ 與前後比較條同一套語彙:那裡的「釋放」也是**沒被填滿**的斜紋,不是第二種實色。
   ⚠️ 另外,格數與天數在下方圖例是**文字**寫死的(38 天 / 56 天)⇒ 圖看不清楚也拿得到資訊。 */
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-days__c { background: rgba(16, 26, 46, .13); }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-days__c.is-busy { background: var(--t-accent-dn); }
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-days__c.is-free {
    background: transparent; box-shadow: inset 0 0 0 2px var(--t-cyan);
}
.nx-page--roi-calculator .nx-roi-days__key {
    display: flex; flex-wrap: wrap; gap: 6px 20px; margin: 14px 0 0;
    font-size: 12.5px; line-height: 1.7; color: var(--t-text-soft);
}
.nx-page--roi-calculator .nx-roi-days__k::before {
    content: ""; display: inline-block; width: 11px; height: 11px; border-radius: 2px;
    margin-right: 6px; vertical-align: -1px;
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-days__k--busy::before { background: var(--t-accent-dn); }
/* 圖例的「可釋放」也必須是**空心**——圖例跟圖不一致,圖例本身就在說謊 */
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-days__k--free::before {
    background: transparent; box-shadow: inset 0 0 0 2px var(--t-cyan);
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-days__k--rest::before { background: rgba(16, 26, 46, .13); }
.nx-page--roi-calculator .nx-roi-days__k b {
    font-family: var(--t-f-mono); font-size: 14px; font-weight: 700; color: var(--t-ink); margin: 0 2px;
}
.nx-page--roi-calculator .nx-roi-days__over {
    margin: 12px 0 0; padding: 10px 13px; border-left: 3px solid var(--t-seal);
    font-size: 13px; line-height: 1.75; color: var(--t-text);
}
body.nx-theme--tech-trust.nx-page--roi-calculator .nx-roi-days__over { background: rgba(193, 70, 39, .06); }
.nx-page--roi-calculator .nx-roi-days__over[hidden] { display: none; }

/* ── ⑬ 新元件的 RWD ───────────────────────────────────────────────────
   ⚠️ 媒體查詢不增加具體度 ⇒ 必須排在上面基礎規則之後。 */
@media (max-width: 991px) {
    /* 平板:四步擠在一列會讓每欄只剩 ~200px,算式硬換行 ⇒ 改兩欄兩列 */
    .nx-page--roi-calculator .nx-roi-chain__steps { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 26px 34px; }
    /* 第 2 步右側的箭頭要拿掉(它是每一列的最後一個) */
    .nx-page--roi-calculator .nx-roi-chain__s:nth-child(2)::after { content: none; }
}
@media (max-width: 620px) {
    /* 手機:改直式一欄,箭頭轉向下、畫在自己下緣 */
    .nx-page--roi-calculator .nx-roi-chain__steps { grid-template-columns: 1fr; gap: 22px; }
    .nx-page--roi-calculator .nx-roi-chain__s { padding-left: 40px; min-height: 30px; }
    .nx-page--roi-calculator .nx-roi-chain__ic { position: absolute; left: 0; top: 0; margin: 0; }
    .nx-page--roi-calculator .nx-roi-chain__s::after,
    .nx-page--roi-calculator .nx-roi-chain__s:nth-child(2)::after {
        content: ""; right: auto; left: 13px; top: auto; bottom: -18px;
        border-top: 0; border-right: 2px solid var(--t-line); border-bottom: 2px solid var(--t-line);
    }
    .nx-page--roi-calculator .nx-roi-chain__s--last::after { content: none; }
    .nx-page--roi-calculator .nx-roi-chain__s em { font-size: 16px; }
    /* 格子縮一點,讓 260 格在 327px 寬還排得成矩形 */
    .nx-page--roi-calculator .nx-roi-days__grid { grid-template-columns: repeat(26, 1fr); gap: 2.5px; }
}

/* 尊重使用者的動態偏好 */
@media (prefers-reduced-motion: reduce) {
    .nx-page--roi-calculator .nx-roi-days__c { transition: none; }
}

/* ── ⑭ eyebrow 與 h2 在窄螢幕併排(平台級既有缺陷)—— 本頁一併收 ──────────
   ⭐ 根因與修法**沿用並行作業線在 `/pricing` 的診斷**(見本檔 §⑦ 的長註解):
     `theme.css` 的 `.nx-sec__title{display:inline-block}` 是刻意的(::after 雙線要 shrink-to-fit)
     ⇒ ⛔不可改;真正的根因是「兩個 inline-block 相鄰」⇒ 讓 eyebrow 變 block。
   ⚠️ 那一輪實測 `/roi-calculator` 有 **2 處**,但**刻意沒動本頁**——因為當時本頁正在被另一條線編輯。
      本頁是本輪的交付標的、且業主 2026-08-19 追加「整體視覺考量」⇒ **由本頁自己收**。
   ⛔ 仍**不擴及** `/get-started`(1 處)與 `/system`(1 處):那是改兩頁已驗收的手機版面,等業主一句話。 */
.nx-page--roi-calculator .nx-sec__head .nx-eyebrow { display: block; }
