/* =====================================================================
   bhb-web.css —— /websites 這一頁專用（2026-08-30 新增）
   共用的排版、顏色、頁首頁尾都在 bhb-home.css，這裡只加這一頁自己的東西。
   ===================================================================== */

/* ── 首屏（2026-08-30 第二版）────────────────────────────────────────
   用戶要的：照片放進首屏這塊區域本身、斜向**左下到右上**、比例可以長方配正方、
   放大一點、一直滑；左邊的字純白，上面加一層漸變灰蒙版。

   三層疊起來：
     .hero-reel-layer  最底,一直滑的膠片帶
     .hero-scrim       中間,漸變灰——左濃右淡,左邊要壓得住白字,右邊留亮讓照片看得見
     .hero-copy        最上,純白文字
   膠片帶用 rotate(-4deg)：負角度 = 逆時針 = 帶子從左下抬向右上，
   動畫仍然向左，所以視覺上是沿着那條斜線往左下滑。 */
.web-hero {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  min-height: min(92svh, 820px);
  display: flex;
  align-items: center;
  background: #14181a;
}

/* ── 首屏照片牆（2026-08-30 第四版）─────────────────────────────────
   這一版按用戶最後一輪要求改的三件事：
   1. **不要糊、要高清** —— 圖不再預先模糊,質量提到 q86,CSS 也不加 blur。
   2. **磚要更多更大** —— 之前只有 16 張,同屏會看到重複。現在每個虛構站
      切首屏/中段/下段三段,48 張互不重樣,尺寸也放大約一倍。
   3. **比例回到電腦屏 16:10** —— 之前的 2:3 海報比例被指出「像一個很寬的手機」。

   蒙版的改法最關鍵：**不再把整頁壓黑**。用戶原話是「只給他們加上背板,
   而不是把網頁都弄成這樣子黑黑的看不見」。所以深色只做成文字後面的一塊
   背板(.hero-copy 上的漸層),牆本身保持明亮。 */
.hero-reel-layer {
  position: absolute;
  top: 50%; left: 50%;
  width: 152%;
  height: 175%;
  transform: translate(-50%, -50%) rotate(-8deg);
  z-index: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: clamp(12px, 1.4vw, 22px);
}

.hero-wall { display: flex; flex-direction: column; gap: clamp(12px, 1.4vw, 22px); }
.wall-row { display: flex; width: max-content; }
.wall-track { display: flex; gap: clamp(12px, 1.4vw, 22px); padding-right: clamp(12px, 1.4vw, 22px); }
.wall-row img {
  display: block;
  width: clamp(260px, 26vw, 440px);
  height: auto;
  border-radius: 8px;
  box-shadow: 0 20px 44px -24px rgba(0, 0, 0, 0.7);
}

/* 五排共用同一條動畫 —— 速度或相位只要有一排不同,錯開 6 格的保證就失效了。
   要改速度請五排一起改（HTML 那邊沒有 inline 的 animation-duration）。 */
.wall-row--0 { animation: wall-left 430s linear infinite; }
.wall-row--1 { animation: wall-right 270s linear infinite; margin-left: -8%; }
@keyframes wall-left  { from { transform: translateX(0);    } to { transform: translateX(-50%); } }
@keyframes wall-right { from { transform: translateX(-50%); } to { transform: translateX(0);    } }
@media (prefers-reduced-motion: reduce) { .wall-row--0, .wall-row--1 { animation: none; } }

/* ── 首屏文案（誤刪後補回,2026-08-30）──
   上一版重寫照片牆時我把替換範圍切太大,連 .hero-copy / 標題 / 按鈕的規則
   一起刪了——結果字掉到牆後面還變成黑色。這一段是那些規則。 */
.hero-copy {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: var(--content);
  margin: 0 auto;
  padding: clamp(46px, 8vh, 96px) var(--page-pad);
  color: #fff;
}
/* 文字背板：圍着字「發黑光」。
   上一版用線性漸層,結果是一塊方形色板——左右淡出,但上下停在 .hero-copy 的
   邊界上被直直切斷(老闆的原話：「上下直接割裂」)。改成徑向漸層之後,深色從
   文字中心往四面八方衰減到全透明,邊界不存在,照片牆右半邊照樣是亮的。
   inset 給負值是為了讓光暈有地方淡出去;.web-hero 有 overflow:hidden,溢出會被裁掉。 */
.hero-copy::before {
  content: "";
  position: absolute;
  inset: -22% -30% -22% -26%;
  z-index: -1;
  background:
    radial-gradient(56% 50% at 27% 47%,
      rgba(8, 10, 12, 0.94) 0%,
      rgba(8, 10, 12, 0.88) 30%,
      rgba(8, 10, 12, 0.62) 52%,
      rgba(8, 10, 12, 0.28) 72%,
      rgba(8, 10, 12, 0.08) 88%,
      rgba(8, 10, 12, 0) 100%),
    radial-gradient(38% 30% at 22% 73%,
      rgba(8, 10, 12, 0.72) 0%,
      rgba(8, 10, 12, 0.34) 56%,
      rgba(8, 10, 12, 0) 100%);
  pointer-events: none;
}
.hero-copy .eyebrow { color: rgba(255, 255, 255, 0.78); }
.hero-copy .eyebrow::before { background: rgba(255, 255, 255, 0.6); }

.web-hero-title {
  margin: 18px 0 0;
  max-width: 15ch;
  font-size: clamp(38px, 7vw, 92px);
  line-height: 0.98;
  letter-spacing: -0.03em;
  font-weight: 800;
  color: #fff;
  text-wrap: balance;
  /* 三層無偏移陰影 = 貼着每個字母的黑光,近實遠虛 */
  text-shadow: 0 0 16px rgba(0, 0, 0, 0.88), 0 0 44px rgba(0, 0, 0, 0.72), 0 0 92px rgba(0, 0, 0, 0.5);
}
.web-hero-intro {
  margin: 22px 0 0;
  max-width: 48ch;
  font-size: clamp(16px, 1.5vw, 20px);
  line-height: 1.55;
  color: rgba(255, 255, 255, 0.92);
  text-shadow: 0 0 14px rgba(0, 0, 0, 0.88), 0 0 36px rgba(0, 0, 0, 0.62);
}
.web-hero-cta { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 30px; }

.hero-disclosure {
  margin: 30px 0 0;
  max-width: 58ch;
  font-size: 12.5px;
  line-height: 1.55;
  color: rgba(255, 255, 255, 0.66);
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.8);
}
.hero-disclosure strong { color: rgba(255, 255, 255, 0.92); font-weight: 600; }

.btn-solid, .btn-line {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 14px 26px; border-radius: 999px;
  font-size: 13px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  text-decoration: none; cursor: pointer;
  transition: background-color 0.18s ease, color 0.18s ease, border-color 0.18s ease;
}
.btn-solid { background: var(--brand); color: #fff; border: 1px solid var(--brand); }
.btn-solid:hover { background: #fff; border-color: #fff; color: var(--ink); }
.btn-line { background: transparent; color: var(--ink); border: 1px solid var(--line); }
.btn-line:hover { border-color: var(--brand); color: var(--brand); }
/* 首屏唯一那顆（老闆 2026-08-31：「Buy Now 和 Pricing 合成一個大的按鈕」）。
   只有一顆了，就讓它有一顆主按鈕該有的份量。
   hover **不翻白**：老闆的話是「沿用藍綠色的底和白色的字」，
   共用的 .btn-solid:hover 會把底翻成白、字翻成黑，正好違反那句話。 */
.btn-hero {
  /* min-width 不能省：中文的「開始」只有兩個字，只靠 padding 撐出來的膠囊
     很窄，看起來一點都不像「一個大的按鈕」。英文的 Start 同理。 */
  min-width: 250px;
  padding: 20px 46px;
  font-size: 15px;
  letter-spacing: .1em;
}
.btn-hero:hover {
  background: #2fa295;           /* 同一支青，亮一階 */
  border-color: #2fa295;
  color: #fff;
}
@media (max-width: 520px) {
  /* 手機上讓它撐滿一行，拇指最容易按到的形狀 */
  .btn-hero { width: 100%; padding: 18px 24px; }
}

/* 首屏那些描邊鍵在深底上,描邊和字都要轉白 */
.web-hero .btn-line { color: #fff; border-color: rgba(255, 255, 255, 0.55); }
.web-hero .btn-line:hover { border-color: #fff; color: #fff; background: rgba(255, 255, 255, 0.12); }

/* 按鈕的黑光：用大 blur + 大 spread 的 box-shadow,光暈跟着圓角膠囊的形狀走,
   所以是「圍着按鈕」而不是又一塊方板。描邊按鈕額外給一層很淡的深底,
   免得亮照片剛好滑到按鈕中間、白字糊掉。 */
.web-hero-cta .btn-solid,
.web-hero-cta .btn-line {
  box-shadow: 0 0 20px 8px rgba(6, 8, 10, 0.58), 0 0 54px 24px rgba(6, 8, 10, 0.34);
}
.web-hero-cta .btn-line { background: rgba(8, 10, 12, 0.34); }
.web-hero-cta .btn-line:hover { background: rgba(255, 255, 255, 0.14); }

/* ── 內容區塊 ── */
.web-section { max-width: var(--content); margin: 0 auto; padding: clamp(40px, 7vh, 92px) var(--page-pad); }
.web-section .section-heading h2 {
  margin: 12px 0 0; font-size: clamp(26px, 3.8vw, 48px);
  line-height: 1.08; letter-spacing: -0.02em; font-weight: 800; text-wrap: balance;
}

.feature-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: clamp(22px, 3vw, 42px); margin-top: clamp(28px, 4vh, 52px);
}
.feature h3 { margin: 0 0 8px; font-size: 17px; font-weight: 700; letter-spacing: -0.01em; }
.feature p { margin: 0; color: var(--muted); line-height: 1.62; }

.step-list { list-style: none; margin: clamp(28px, 4vh, 52px) 0 0; padding: 0; }
.step {
  display: grid; grid-template-columns: 70px 1fr; gap: 18px;
  padding: 22px 0; border-top: 1px solid var(--line);
}
.step:last-child { border-bottom: 1px solid var(--line); }
.step-num { font-size: 13px; font-weight: 800; letter-spacing: 0.1em; color: var(--brand); padding-top: 3px; }
.step h3 { margin: 0 0 6px; font-size: 18px; font-weight: 700; letter-spacing: -0.01em; }
.step p { margin: 0; color: var(--muted); line-height: 1.62; max-width: 62ch; }

.price-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: clamp(18px, 2.4vw, 30px); margin-top: clamp(28px, 4vh, 52px);
}
.price-card { border: 1px solid var(--line); border-radius: 14px; padding: clamp(22px, 3vw, 34px); }
/* ⚠️ 價格區實際生效的標題字級**不是這一條**，是下面
   `.price-block .price-card h3`（clamp 30–46px）。這裡只是給價格帶以外
   萬一有人重用 .price-card 時的基準值。要改大小去改那一條。 */
.price-card h3 { margin: 0 0 12px; font-size: 19px; font-weight: 800; letter-spacing: -0.01em; }
/* 首付那張卡的金額（老闆 2026-08-31 第二次調：標題寫「起步」，金額退成
   底下一小行，「400 這三個數字要比那個 US 大一圈，大百分之五十」）。
   17 × 1.5 = 25.5，取 26px。
   baseline 對齊而不是 center：大小不同的兩段文字要坐在同一條底線上，
   置中對齊會讓 US$ 浮在半空。
   tabular-nums 讓 400 跟右邊方案裡的 30/324/1,260 對得齊。 */
.price-amount {
  display: flex; align-items: baseline; gap: 1px;
  margin: -2px 0 20px;
  color: var(--ink); font-weight: 800; letter-spacing: -.02em; line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
.price-cur { font-size: 17px; }
.price-num { font-size: 26px; }
/* 選擇器要帶滿 `.price-block .price-card`，因為那一組的 `p` 規則是
   (0,3,1)：只寫 `.price-block .price-amount` (0,2,0) 會輸，結果就是
   金額變成跟正文一樣的灰、而且被推開 30px 看起來不屬於上面那個標題。
   實測踩過一次，別把選擇器改短。 */
.price-block .price-card .price-amount {
  color: #fff;
  margin: -4px 0 26px;
}
.price-card p { margin: 0 0 22px; color: var(--muted); line-height: 1.62; }
.price-card .pay { width: 100%; }
.price-note, .pay-note { margin: 22px 0 0; color: var(--muted); font-size: 14px; line-height: 1.6; max-width: 66ch; }
.pay-note { font-size: 13px; }
.pay-talk { margin: 14px 0 0; font-size: 14px; }
.pay-talk a { color: var(--brand); }

.faq-list { display: grid; gap: 26px; margin-top: clamp(28px, 4vh, 52px); max-width: 78ch; }
.faq h3 { margin: 0 0 7px; font-size: 17px; font-weight: 700; }
.faq p { margin: 0; color: var(--muted); line-height: 1.62; }

@media (max-width: 720px) {
  .step { grid-template-columns: 46px 1fr; gap: 12px; }
  /* 手機上文字橫跨整屏,左濃右淡的蒙版壓不住右邊的字——改成整片均勻壓暗,
     再把卡片縮小,照片退成背景紋理而不是跟字搶位置。 */
  .hero-scrim {
    background:
      linear-gradient(180deg, rgba(16,19,21,.90) 0%, rgba(16,19,21,.82) 45%, rgba(16,19,21,.92) 100%);
  }
  .reel-tile { width: clamp(150px, 44vw, 190px); }
  .reel-tile:nth-child(3n+2) { width: clamp(135px, 40vw, 172px); }
  .reel-tile:nth-child(3n+3) { width: clamp(125px, 37vw, 160px); }
  .reel { animation-duration: 52s; }
  .reel--b { animation-duration: 64s; }
  .web-hero { min-height: min(88svh, 700px); }
  .web-hero-title { max-width: none; }
}

/* ── 付款前的資料收集彈窗（2026-08-30）──────────────────────────────
   用戶要求：點付款先留姓名/商號/電郵/電話,再勾「我已閱讀並同意用戶條款」,
   右邊兩個鍵——取消是黑底白字,付款是青底白字。 */
.paygate {
  border: 0; border-radius: 16px; padding: 0;
  width: min(520px, calc(100vw - 32px));
  background: var(--paper); color: var(--ink);
  box-shadow: 0 40px 90px -30px rgba(0, 0, 0, 0.55);
}
.paygate::backdrop { background: rgba(10, 12, 14, 0.62); }
.paygate-form { display: flex; flex-direction: column; gap: 14px; padding: clamp(22px, 3.4vw, 34px); }
.paygate-form h2 { margin: 0; font-size: 22px; font-weight: 800; letter-spacing: -0.01em; }
.paygate-intro { margin: -6px 0 4px; color: var(--muted); font-size: 14px; line-height: 1.55; }
.paygate-form label { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 600; }
.paygate-form input[type="text"],
.paygate-form input[type="email"],
.paygate-form input[type="tel"] {
  font: inherit; font-weight: 400; font-size: 15px;
  padding: 11px 13px; border: 1px solid var(--line); border-radius: 9px;
  background: #fff; color: var(--ink);
}
.paygate-form input:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; border-color: var(--brand); }
.paygate-agree { flex-direction: row !important; align-items: flex-start; gap: 10px;
  font-weight: 400; font-size: 13.5px; line-height: 1.5; margin-top: 4px; }
.paygate-agree input { margin-top: 2px; width: 17px; height: 17px; accent-color: var(--brand); flex: none; }
.paygate-agree a { color: var(--brand); }
.paygate-err { margin: 0; color: #9B2C2C; font-size: 13px; }
.paygate-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 6px; }
.paygate-actions button {
  font: inherit; font-size: 13px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  padding: 12px 24px; border-radius: 999px; border: 0; cursor: pointer; color: #fff;
  transition: opacity 0.16s ease;
}
.paygate-cancel { background: #14181a; }          /* 黑底白字 */
.paygate-go     { background: var(--brand); }     /* 青底白字 */
.paygate-actions button:hover { opacity: 0.88; }


/* ══════════════════════════════════════════════════════════════════
   動效（2026-08-30 用戶要求：全站要有豐富效果，按鈕按下去要「彈一下」）
   全部只動 transform / opacity —— 不觸發 layout,滾動時不會掉幀。
   整段包在 prefers-reduced-motion: no-preference 裡：使用者在系統關掉
   動畫時，.reveal 的初始隱藏也一併失效，內容直接是最終狀態。
   ══════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: no-preference) {

  /* ⚠️ 按鈕回彈、.reveal 進場、卡片 hover 這三段 2026-08-31 搬去
     assets/bhb-motion.css 了 —— 老闆要求「全站加一個動畫效果」，而首頁、
     MotiLearn、三頁法律條款都沒有載 bhb-web.css。留在這裡的話那些頁面
     載了 bhb-motion.js 也不會動。**不要搬回來**，會變成兩份定義。
     下面只留跟付款彈窗綁在一起、其他頁面用不到的部分。 */

  /* ── 付款彈窗進場 ── */
  .paygate[open] { animation: paygate-in 280ms cubic-bezier(.2, .8, .3, 1); }
  .paygate[open]::backdrop { animation: paygate-fade 280ms ease; }
  @keyframes paygate-in {
    from { opacity: 0; transform: translateY(16px) scale(.97); }
    to   { opacity: 1; transform: none; }
  }
  @keyframes paygate-fade { from { opacity: 0; } to { opacity: 1; } }

  /* ── 首屏文案載入時淡入上移一次 ── */
  .web-hero-title  { animation: hero-rise 780ms cubic-bezier(.2, .8, .3, 1) both; }
  .web-hero-intro  { animation: hero-rise 780ms cubic-bezier(.2, .8, .3, 1) 120ms both; }
  .web-hero-cta    { animation: hero-rise 780ms cubic-bezier(.2, .8, .3, 1) 220ms both; }
  @keyframes hero-rise {
    from { opacity: 0; transform: translateY(20px); }
    to   { opacity: 1; transform: none; }
  }
}

/* 付款彈窗：姓名兩欄 + 電話前面的國旗區號選單（2026-08-30） */
.paygate-two { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.paygate-two label { min-width: 0; }
.paygate-tel { display: grid; grid-template-columns: minmax(0, 168px) minmax(0, 1fr); gap: 8px; }
.paygate-tel select {
  width: 100%; padding: 11px 10px; border: 1px solid var(--line); border-radius: 10px;
  background: #fff; color: var(--ink); font: inherit; font-weight: 500; line-height: 1.2;
}
.paygate-tel select:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; border-color: var(--brand); }
@media (max-width: 460px) {
  .paygate-two { grid-template-columns: 1fr; }
  .paygate-tel { grid-template-columns: 1fr; }
}

/* 付款彈窗的郵箱登入步驟（2026-08-30） */
.paygate-step { display: flex; flex-direction: column; gap: 14px; }
/* class 選擇器會蓋掉內建的 [hidden]{display:none},所以這裡要明講一次。
   ⚠️ 這一條是三個選擇器共用一個 display:none，插新規則的時候不要插進
   選擇器清單中間 —— 2026-08-31 就這樣把它劈成兩半，結果付款彈窗的兩個
   步驟同時顯示出來（[hidden] 完全失效）。 */
.paygate-step[hidden], .paygate-ok[hidden], .paygate-msg[hidden] { display: none; }

/* ── 「你買的是什麼、多少錢」（2026-08-31）────────────────────────
   老闆：「不要讓用戶點擊那個支付按鈕之後，才彈到了那個支付平台，
   才知道用戶要付多少錢。」所以這一塊在彈窗最上面、兩個步驟之外，
   從打開到按下付款都看得到。
   金額和品名同一行、金額靠右並用等寬數字 —— 這是收據的讀法，
   一眼就知道要付多少。 */
.paygate-order {
  margin: 2px 0 4px;
  padding: 14px 16px;
  border-radius: 12px;
  background: rgba(39, 141, 130, .08);
  border: 1px solid rgba(39, 141, 130, .20);
}
.paygate-order-top {
  display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
}
.paygate-order-name { font-size: 15px; font-weight: 800; color: var(--ink); }
.paygate-order-amt {
  font-size: 20px; font-weight: 800; letter-spacing: -.02em; color: var(--ink);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.paygate-order-desc {
  margin: 5px 0 0; font-size: 13px; line-height: 1.5; color: var(--muted);
}

.paygate-send, .paygate-verify, .paygate-resend {
  align-self: flex-start; padding: 11px 20px; border: 0; border-radius: 999px;
  font: 700 13px/1 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
  letter-spacing: .06em; text-transform: uppercase; color: #fff; background: var(--brand); cursor: pointer;
}
.paygate-resend { background: transparent; color: var(--brand); padding-left: 6px; }
.paygate-coderow { display: flex; align-items: center; gap: 10px; }
.paygate-sent { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--muted); }
.paygate-sent b { color: var(--ink); }
.paygate-msg { margin: 0; padding: 10px 12px; border-radius: 8px;
  background: rgba(155, 44, 44, .08); color: #9B2C2C; font-size: 13px; line-height: 1.55; }
/* 已驗證徽章：用文字,不用打勾 emoji —— 這個站不放 emoji */
.paygate-ok { margin: 0; display: inline-flex; align-items: baseline; gap: 8px;
  padding: 7px 12px; border-radius: 999px; background: rgba(39, 141, 130, .1);
  color: var(--brand); font-size: 12.5px; font-weight: 700; letter-spacing: .04em; }
.paygate-ok b { font-weight: 600; color: var(--ink); letter-spacing: 0; }
.paygate-form input[name="code"] { letter-spacing: .34em; font-weight: 700; font-size: 17px; }
button.is-busy { opacity: .55; cursor: progress; }

/* ══════════════════════════════════════════════════════════════════
   「我的網站」客戶頁（2026-08-30）
   ══════════════════════════════════════════════════════════════════ */
.account-shell { max-width: var(--content); margin: 0 auto; padding: clamp(34px, 6vh, 72px) var(--page-pad) 96px; }
.account-head { display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; margin-bottom: 30px; }
.account-head h1 { margin: 0; font-size: clamp(28px, 4vw, 44px); font-weight: 800; letter-spacing: -.03em; }
.acct-signout { padding: 9px 18px; font-size: 12px; }

.acct-gate { padding: 34px; border: 1px solid var(--line); border-radius: 14px; background: #fff; }
.acct-gate p { margin: 0 0 18px; color: var(--muted); font-size: 15.5px; line-height: 1.6; }

.acct-body { display: grid; gap: 18px; }
.acct-body[hidden], .acct-gate[hidden], .acct-signout[hidden] { display: none; }
.acct-card { padding: clamp(20px, 2.6vw, 30px); border: 1px solid var(--line); border-radius: 14px; background: #fff; }
/* 卡片標題（2026-08-31 老闆：「Password 那裡要改成 Change Password，
   而且要大，就是字要大，不要太小」）。
   原本是 12px 全大寫的小標籤 —— 那是給「欄位名」用的字級，拿來當四張卡的
   標題確實太小。四張一起放大，只放大密碼那一張的話另外三張會顯得像註腳。 */
.acct-card h2 { margin: 0 0 18px; font-size: clamp(19px, 2.2vw, 22px); font-weight: 800;
  letter-spacing: -.01em; color: var(--ink); }

.acct-row { display: grid; grid-template-columns: minmax(0, 150px) minmax(0, 1fr); gap: 12px;
  padding: 11px 0; border-top: 1px solid var(--line); align-items: baseline; }
.acct-row:first-child { border-top: 0; padding-top: 0; }
.acct-row dt { margin: 0; font-size: 13px; font-weight: 600; color: var(--muted); }
.acct-row dd { margin: 0; font-size: 15px; color: var(--ink); overflow-wrap: anywhere; }
.acct-row a { color: var(--brand); }

/* 狀態徽章：顏色編碼狀態,一眼看得出來,不用讀字 */
.acct-pill { display: inline-block; padding: 4px 11px; border-radius: 999px;
  font-size: 12px; font-weight: 700; letter-spacing: .04em; }
.acct-pill--live     { background: rgba(39, 141, 130, .12); color: var(--brand); }
.acct-pill--building { background: rgba(200, 145, 30, .14); color: #8a6112; }
.acct-pill--paused   { background: rgba(23, 26, 25, .08); color: var(--muted); }

.acct-note { margin: 0; color: var(--muted); font-size: 14.5px; line-height: 1.65; }
.acct-cta { margin: 20px 0 0; }

/* 付款清單：日期／說明／金額／收據,金額右對齊並用等寬數字對齊小數點 */
.acct-pays { list-style: none; margin: 0; padding: 0; }
.acct-pays li { display: grid; grid-template-columns: minmax(0, 118px) minmax(0, 1fr) auto auto;
  gap: 14px; align-items: baseline; padding: 13px 0; border-top: 1px solid var(--line); }
.acct-pays li:first-child { border-top: 0; padding-top: 0; }
.acct-pay-date { font-size: 13.5px; color: var(--muted); white-space: nowrap; }
.acct-pay-desc { font-size: 14.5px; color: var(--ink); }
.acct-pay-desc em { font-style: normal; color: var(--muted); font-size: 13px; }
.acct-pay-amt  { font-size: 15px; font-weight: 700; white-space: nowrap;
  font-variant-numeric: tabular-nums; text-align: right; }
.acct-pay-link { font-size: 12.5px; font-weight: 600; color: var(--brand); white-space: nowrap; }

@media (max-width: 620px) {
  .acct-row { grid-template-columns: 1fr; gap: 4px; }
  .acct-pays li { grid-template-columns: 1fr auto; row-gap: 4px; }
  .acct-pay-date { grid-column: 1 / -1; }
  .acct-pay-link { grid-column: 2; }
}

/* ── 「上一級」（2026-08-31 老闆：「真正意義上的上一步」）──────────
   一條指回 /websites 的連結，不是 history.back()。 */
.acct-up { margin: 0 0 14px; }
.acct-back {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 13.5px; font-weight: 600; color: var(--muted); text-decoration: none;
}
.acct-back:hover { color: var(--brand); }
.acct-back-arrow { font-size: 15px; line-height: 1; transition: transform .18s ease; }
.acct-back:hover .acct-back-arrow { transform: translateX(-3px); }

/* ── 可以直接改的個人資料（2026-08-31）────────────────────────────
   信箱那一格是鎖死的灰色。**這裡不要加任何說明文字** ——
   老闆：「你也不用特別說明不能改，就直接灰色的那個郵箱就好了。」 */
.acct-form { display: flex; flex-direction: column; gap: 14px; }
.acct-form label { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 600; }
.acct-form input {
  font: inherit; font-weight: 400; font-size: 15px; width: 100%;
  padding: 11px 13px; border: 1px solid var(--line); border-radius: 9px;
  background: #fff; color: var(--ink);
}
.acct-form input:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; border-color: var(--brand); }
/* ── 唯讀 vs 編輯（2026-08-31）──────────────────────────────────
   老闆：「你的資料那裡是不能動的，除非點了那個編輯按鈕。」
   還有：「改不了那個電郵，那個灰度要再淺一點，搞得好像能輸入一樣。」

   所以唯讀狀態下**整張表單沒有框**：一個有邊框的方格看起來就是可以打字的，
   再淺的灰底也蓋不過那個訊號。拿掉框、底色壓到幾乎看不見，它才讀起來像
   一行資料而不是一個空欄位。按「編輯」之後框才長出來。
   信箱那一格是唯一一個在編輯模式下**仍然沒有框**的，不需要再寫一句說明。 */
.acct-form.is-locked input,
.acct-form .is-locked {
  background: rgba(23, 26, 25, .022);
  border-color: transparent;
  color: var(--ink);
  cursor: default;
}
.acct-form .is-locked { color: var(--muted); }     /* 信箱那格再淡一階 */
/* 唯讀時不要有對焦框在那裡閃 —— 可以選取複製，但不是可以改的 */
.acct-form.is-locked input:focus-visible,
.acct-form .is-locked:focus-visible {
  outline: none; border-color: transparent;
}

/* 登出：紅底白字（老闆 2026-08-31）。這一頁只有它會把你踢出去，
   跟其他描邊鍵長一樣只會被誤按。用的紅跟表單驗證那個紅是同一支，
   不引進新顏色。 */
.acct-signout {
  font: inherit; font-size: 13px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase;
  padding: 11px 22px; border: 1px solid #b52d1a; border-radius: 999px;
  background: #b52d1a; color: #fff; cursor: pointer;
  transition: background-color .18s ease, border-color .18s ease;
}
.acct-signout:hover { background: #9b2413; border-color: #9b2413; }
.acct-signout[hidden] { display: none; }
.acct-signout.is-busy::after { border-color: rgba(255,255,255,.34); border-top-color: #fff; }

/* 改密碼的兩步（老闆 2026-08-31：先驗舊密碼才給填新的） */
.acct-pwstep1, .acct-pwstep2 { display: flex; flex-direction: column; gap: 14px; align-items: flex-start; }
.acct-pwstep1[hidden], .acct-pwstep2[hidden] { display: none; }
.acct-pwstep1 label, .acct-pwstep2 label { width: min(100%, 420px); }

.acct-card-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; margin-bottom: 18px;
}
.acct-card-head h2 { margin: 0; }
.acct-edit { padding: 9px 20px; font-size: 11.5px; flex: none; }
.acct-edit[hidden] { display: none; }

.acct-formrow { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.acct-formrow[hidden] { display: none; }
.acct-formrow .btn-line { padding: 12px 22px; }

/* ── 「錢收到了」（2026-08-31）──────────────────────────────────
   老闆付完款回到這一頁，什麼反饋都沒有。最新那一筆先用一句話講清楚，
   下面才是流水帳。 */
.acct-paid {
  display: flex; align-items: flex-start; gap: 14px;
  margin: 0 0 22px; padding: 16px 18px;
  border-radius: 12px;
  background: rgba(39, 141, 130, .09);
  border: 1px solid rgba(39, 141, 130, .22);
}
.acct-paid-mark {
  display: grid; place-items: center; flex: none;
  width: 28px; height: 28px; border-radius: 50%;
  background: var(--brand); color: #fff; font-size: 15px; font-weight: 700;
}
.acct-paid-lead { margin: 2px 0 0; font-size: 16px; font-weight: 800; color: var(--ink); }
.acct-paid-sub { margin: 4px 0 0; font-size: 13.5px; color: var(--muted); line-height: 1.5; }
/* 聯絡方式那一行（老闆 2026-08-31：「你在下面寫我的 WhatsApp 號碼，
   還有我的郵箱」）。手機上號碼和信箱要能各自換行，不要撐破卡片。 */
.acct-paid-help { margin-top: 6px; }
.acct-paid-help a { color: var(--brand); font-weight: 600; white-space: nowrap; }
.acct-paid-help a:hover { text-decoration: underline; }
.acct-two { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.acct-two label { min-width: 0; }
.acct-form button { align-self: flex-start; }
.acct-msg { margin: 0; font-size: 13.5px; font-weight: 600; color: #9B2C2C; }
.acct-msg.is-ok { color: var(--brand); }
.acct-msg[hidden] { display: none; }

/* 月費卡裡的兩個預付選項（2026-08-30）：跟主按鈕拉開層級,
   一條細線 + 小標,不要三個同樣重量的按鈕擠在一張卡上。 */
.price-prepay { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--line);
  display: flex; flex-wrap: wrap; gap: 8px; }
.price-prepay-label { flex: 0 0 100%; margin: 0 0 4px; font-size: 12px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
.price-prepay .btn-line { padding: 9px 16px; font-size: 11.5px; }

/* ══════════════════════════════════════════════════════════════════
   風格預覽器（2026-08-30）
   版面按老闆的描述：切換用的工具列在**黑邊外面**,
   黑邊裡面那一大塊才是真正的網站（iframe）。
   ══════════════════════════════════════════════════════════════════ */
/* 寬度刻意收在 1280（08-31 老闆：16 吋機器上「左右預留的空隙都不夠」）。
   左右留白加大到最多 72px，兩邊才各有一條摸得到的空白可以捲整頁 ——
   黑邊貼著視窗邊的時候，兩指滑動會全部被 iframe 吃掉，外層頁面捲不動。 */
/* 整頁鎖死：只有 iPad 螢幕裡面能捲，頁面本身一動不動。
   overscroll-behavior: none 順便擋掉 macOS 觸控板的橡皮筋回彈。 */
body.pv-page { height: 100dvh; overflow: hidden; margin: 0;
  display: flex; flex-direction: column; overscroll-behavior: none; background: #fff; }

.pv-shell { flex: 1 1 auto; min-height: 0; max-width: none; margin: 0;
  display: flex; flex-direction: column; gap: clamp(10px, 1.2vh, 16px);
  padding: clamp(12px, 1.6vh, 18px) clamp(12px, 2vw, 28px) clamp(12px, 2vw, 26px); }

/* 最上面那一條導覽條 —— 這是頁面上唯一的文字。
   一行橫滑、不換行：換行會排成三排，既吃掉 iPad 的高度，看起來也是一面牆不是一條。 */
.pv-bar { flex: 0 0 auto; display: flex; align-items: center; gap: 10px; width: 100%; }
.pv-nav { position: relative; flex: 1 1 auto; min-width: 0; }
/* min-width: 0 不能省：flex 子項預設不肯縮到內容寬度以下，導覽條會比容器還寬，
   右邊那顆箭頭就被擠到可視區外面（body 是 overflow:hidden，直接被裁掉）。 */
.pv-styles { display: flex; flex-wrap: nowrap; gap: 7px; overflow-x: auto;
  min-width: 0;                      /* 不寫這個，flex 子項不肯縮到內容寬度以下，
                                        overflow 形同虛設，整條會把頁面撐到橫向溢出 */
  scrollbar-width: none; }
.pv-styles::-webkit-scrollbar { display: none; }

/* 兩端的漸層蒙版：邊緣是實心底色、往內漸漸透明，丸子像是滑進霧裡，
   暗示那個方向還有沒看到的。pointer-events: none —— 蒙版不能擋住底下丸子的點擊。 */
.pv-nav::before, .pv-nav::after { content: ""; position: absolute; top: 0; bottom: 0;
  width: 82px; pointer-events: none; opacity: 0; transition: opacity 200ms ease; z-index: 1; }
.pv-nav::before { left: 0; background: linear-gradient(to right, #fff 38%, rgba(255,255,255,0)); }
.pv-nav::after { right: 0; background: linear-gradient(to left, #fff 38%, rgba(255,255,255,0)); }
.pv-nav.can-prev::before, .pv-nav.can-next::after { opacity: 1; }

/* 箭頭坐在蒙版中間，按一下翻一頁。只有那一邊真的還有內容時才出現。 */
.pv-arrow { position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
  display: none; align-items: center; justify-content: center;
  width: 30px; height: 30px; padding: 0; border-radius: 999px;
  border: 1px solid var(--line); background: #fff; color: var(--ink); cursor: pointer;
  box-shadow: 0 1px 3px rgba(11,13,14,.12); transition: transform 160ms ease, color 160ms ease; }
.pv-arrow svg { width: 16px; height: 16px; }
.pv-arrow:hover { color: var(--brand); }
.pv-arrow:active { transform: translateY(-50%) scale(.9); }
.pv-arrow.is-prev { left: 0; }
.pv-arrow.is-next { right: 0; }
.pv-nav.can-prev .pv-arrow.is-prev, .pv-nav.can-next .pv-arrow.is-next { display: flex; }
.pv-pill { flex: 0 0 auto; padding: 7px 14px; border: 1px solid var(--line); border-radius: 999px; background: #fff;
  color: var(--ink); font: 600 12.5px/1 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
  cursor: pointer; transition: transform 180ms cubic-bezier(.34,1.56,.64,1), background-color 160ms ease,
              border-color 160ms ease, color 160ms ease; }
.pv-pill:hover { border-color: var(--brand); color: var(--brand); }
.pv-pill:active { transform: scale(.94); }
.pv-pill.is-on { background: var(--brand); border-color: var(--brand); color: #fff; }
.pv-err { font-size: 13px; color: #9B2C2C; }

/* iPad Pro 的邊框：四邊等寬，外圓角明顯大於內圓角（真機就是這個關係）。
   剩下的高度全給它，所以視窗多高，這台 iPad 就多高。 */
/* 量尺寸用的外層：吃掉按鈕以下的全部空間，黑邊在它裡面置中 */
.pv-fit { flex: 1 1 auto; min-height: 0; display: flex;
  align-items: center; justify-content: center; }
/* 黑邊本身不參與 flex 計算，寬高由 bhb-preview.js 按 4:3 寫成內聯樣式。
   max-* 只是 JS 沒跑起來時的保險。 */
.pv-screen { display: flex; max-width: 100%; max-height: 100%;
  background: #0b0d0e; padding: clamp(9px, .85vw, 14px);
  border-radius: clamp(24px, 2.4vw, 36px);
  box-shadow: 0 24px 60px rgba(11, 13, 14, .28), 0 2px 6px rgba(11, 13, 14, .2); }
/* 螢幕玻璃：負責裁切被放大／縮小的畫面，圓角在這一層 */
.pv-stage { flex: 1 1 auto; position: relative; overflow: hidden; background: #fff;
  border-radius: clamp(15px, 1.5vw, 23px); }
/* iframe 尺寸寫死成 13 吋 iPad 橫放的 CSS 視窗，縮放交給 JS 的 transform。
   寫死是重點：網站因此永遠以桌機版排版，不會因為黑邊變窄就重排成手機版。 */
.pv-frame { position: absolute; top: 0; left: 0; width: 1366px; height: 1024px;
  border: 0; background: #fff; transform-origin: top left; }
/* 載入中蓋在玻璃上的轉圈（老闆 2026-08-31：「沒有加好的時候需要一個加載圖標」）。
   換一套版式要重新載入整套 CSS 和照片，中間那段白屏會讓人以為站壞了。 */
.pv-load { position: absolute; inset: 0; display: none; align-items: center;
  justify-content: center; background: #fff; z-index: 3; }
.pv-load.is-on { display: flex; }
.pv-load span { width: 26px; height: 26px; border-radius: 50%;
  border: 2.5px solid var(--line); border-top-color: var(--brand);
  animation: pv-spin .7s linear infinite; }
@keyframes pv-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .pv-load span { animation: none; opacity: .55; } }

@media (max-width: 720px) {
  /* 手機模式（老闆：「手機打開的話就是手機」）：黑邊撐滿螢幕，
     iframe 回到正常的塊狀元素、不縮放，網站按自己的 RWD 出手機版。
     transform 要加 !important —— 電腦模式那邊是 JS 寫在 style 屬性上的內聯值。 */
  .pv-screen { width: auto !important; height: auto !important;
    flex: 1 1 auto; align-self: stretch; }
  .pv-fit { align-items: stretch; }
  .pv-frame { position: static; width: 100%; height: 100%;
    transform: none !important; }
  /* 按鈕再小一點（老闆指定）—— 手機上這一排要盡量少吃高度 */
  .pv-pill { padding: 5px 11px; font-size: 11.5px; }
  .pv-styles { -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; }
  .pv-pill { scroll-snap-align: center; }
  /* 手機上蒙版和箭頭都收窄，別壓住太多丸子 */
  .pv-nav::before, .pv-nav::after { width: 58px; }
  .pv-arrow { width: 26px; height: 26px; }
  .pv-arrow svg { width: 14px; height: 14px; }
}

/* ── /styles 預覽器入口 ────────────────────────────────────────────
   第 3 步「你挑版式」底下那條鏈接。做成帶下劃線的行動文字,
   而不是又一顆按鈕 —— 這一步不是要人付錢,是要人去看。 */
.step-link { margin-top: .55rem; }
.step-link a {
  font-weight: 600;
  color: var(--ink, #0b0d0e);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1.5px;
}
.step-link a::after { content: " →"; text-decoration: none; }
.step-link a:hover { opacity: .68; }

/* ── 付款彈窗最後一步的「你剛填的」摘要（2026-08-31）────────────
   資料步在最後一步是 hidden 的,人看不到自己填了什麼。
   在掏錢前列一遍,順便給他機會發現電話打錯了。 */
.paygate-recap {
  display: grid; grid-template-columns: auto 1fr; gap: 6px 14px;
  margin: 0; padding: 12px 14px; border-radius: 10px;
  background: rgba(39, 141, 130, .07);
  font-size: .92rem;
}
.paygate-recap dt { color: #5d6664; white-space: nowrap; }
.paygate-recap dd { margin: 0; font-weight: 600; color: #171a19; overflow-wrap: anywhere; }


/* 重寄驗證碼的倒數（2026-08-31）。數字不需要翻譯,所以獨立於按鈕文案。 */
.paygate-cd {
  font-variant-numeric: tabular-nums; font-size: .85rem; font-weight: 600;
  color: var(--muted); align-self: center; min-width: 3ch;
}
.paygate-resend:disabled { opacity: .45; cursor: not-allowed; }

/* Turnstile 容器（2026-08-31）。widget 自己是固定尺寸的 iframe,
   這裡只負責留位置,免得它出現時把底下的按鈕頂下去。 */
.paygate-cf { min-height: 65px; }
.paygate-cf:empty { min-height: 0; }

/* ── 未填欄位的紅框 + 閃兩下（2026-08-31）────────────────────────
   直接沿用回收站 hk-device-recycling/index.html 的那一套：
   紅色 outline 當作「框住它」的長方形，keyframes 讓 outline-color
   在 720ms 內熄滅兩次 = 閃兩下。step-end 讓它是硬切不是漸變。
   照抄而不是重寫，兩個站的錯誤提示才會長得一樣。 */
.paygate-form input[aria-invalid="true"],
.paygate-form select[aria-invalid="true"],
.paygate-form textarea[aria-invalid="true"] {
  outline: 2px solid #b52d1a;
  outline-offset: 3px;
  border-color: #b52d1a;
}
.paygate-form input[aria-invalid="true"]:focus-visible,
.paygate-form select[aria-invalid="true"]:focus-visible,
.paygate-form textarea[aria-invalid="true"]:focus-visible {
  outline-color: #b52d1a;
}
/* 勾選框那一行框的是整個 label，不是那個小方塊 */
.paygate-agree[aria-invalid="true"] {
  outline: 2px solid #b52d1a;
  outline-offset: 5px;
  border-radius: 6px;
}

@keyframes validation-border-blink {
  0%, 20%, 45%, 65%, 90%, 100% { outline-color: #b52d1a; }
  25%, 40%, 70%, 85%           { outline-color: transparent; }
}
.is-validation-flashing { animation: validation-border-blink 720ms step-end 1; }

/* ══ 價格區改版（2026-08-31 老闆逐條指示）═══════════════════════════
   月費不再是三個並排的方案,收成一顆按鈕;談好金額不再是第三塊,
   收成右下角一行。少兩個方塊,首屏一眼就只看到「US$400」這一個數字。 */

.price-grid--two { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }

.plans-toggle { margin-top: auto; }

.plan-options { display: grid; gap: 10px; margin-top: 14px; }
.plan-options[hidden] { display: none; }      /* class 的 display 會蓋掉 UA 的 [hidden] */

/* ── 展開 / 收起的過渡（2026-08-31）──────────────────────────────
   老闆：「絲滑的動畫也沒有。」原本是 hidden 直接開關，等於閃一下。
   .is-collapsible 由 bhb-pricing.js 在啟動時掛上（沒有 JS 就維持 hidden，
   面板收着而不是攤開一整坨）。max-height 的實際數值由 JS 用 scrollHeight
   量出來寫進 style —— 這裡只定義過渡本身。 */
.is-collapsible {
  max-height: 0;
  overflow: hidden;
  opacity: 0;
  transition: max-height .34s cubic-bezier(.2, .8, .3, 1),
              opacity .24s ease,
              margin-top .34s cubic-bezier(.2, .8, .3, 1);
}
.plan-options.is-collapsible { margin-top: 0; }
.plan-options.is-collapsible.is-open { margin-top: 14px; }
.is-collapsible.is-open { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .is-collapsible { transition: none; }
}

.plan {
  position: relative;                          /* 斜切色塊的定位基準 */
  overflow: hidden;                            /* 把色塊多出去的角剪掉 */
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 13px 16px;
  border: 1px solid rgba(23, 26, 25, .16);
  border-radius: 12px;
  text-decoration: none; color: inherit;
  background: #fff;
  transition: border-color .15s ease, transform .12s ease, box-shadow .15s ease;
}
.plan:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(23,26,25,.09); }
.plan:active { transform: translateY(1px); }
.plan-name { font-weight: 700; }
.plan-price { font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.plan-per { display: block; font-weight: 500; font-size: .78em; color: var(--muted); text-align: right; }

/* 右上角斜切過來的折扣色塊 */
.plan-flag {
  position: absolute; top: 0; right: 0;
  width: 96px; padding: 3px 0;
  transform: translate(27px, 15px) rotate(45deg);
  background: var(--brand); color: #fff;
  font-size: .68rem; font-weight: 800; letter-spacing: .04em;
  text-align: center;
  pointer-events: none;
}
/* 五年那條原本是橙色,不在站的色板裡(老闆:「顏色很不協調」)。
   改成 --ink 的深墨色:一樣分得出兩檔,而且不引進新顏色。 */
.plan-flag--best { background: var(--ink); }
/* 有色塊的那兩張要讓開角落,否則「= US$27/month」會被斜切壓到 */
.plan:has(.plan-flag) .plan-price { padding-right: 34px; }
.plan:has(.plan-flag) { padding-right: 20px; }

/* 談好金額:右下角一行,點開才出現 */
.price-other { margin: 18px 0 0; text-align: right; }
.linkish {
  border: 0; background: none; padding: 0;
  font: inherit; font-size: .92rem; font-weight: 600;
  color: var(--brand); cursor: pointer;
  text-decoration: underline; text-underline-offset: 3px;
}
.linkish:hover { opacity: .7; }

.other-pay {
  display: grid; gap: 12px; justify-items: start;
  margin-top: 14px; padding: 18px 20px;
  border: 1px solid rgba(23, 26, 25, .14); border-radius: 14px;
  background: rgba(39, 141, 130, .05);
}
.other-pay[hidden] { display: none; }
.other-pay p { margin: 0; }
.qty-row { display: grid; gap: 6px; font-size: .9rem; font-weight: 600; }
.qty-input {
  width: 160px; padding: 9px 12px; font: inherit;
  border: 1px solid rgba(23,26,25,.24); border-radius: 9px; background: #fff;
}
.qty-hint { font-size: .84rem; color: var(--muted); }

/* 頁腳聯絡:每項一行（老闆要求換行）*/
.footer-links { list-style: none; margin: 0; padding: 0; display: grid; gap: 7px; }
.footer-links a { display: inline-block; }

/* ══ 導覽條跟着捲動 + 縮小（2026-08-31 老闆要求）════════════════════
   position: sticky 而不是 fixed —— fixed 會脫離文件流,底下所有內容
   都得補一段 padding-top,而且行動裝置上鍵盤彈出時位置會跳。
   sticky 佔位是它自己的事,不用動任何別的東西。 */
.site-header {
  position: sticky;
  top: 0;
  /* 原本 88px,老闆說縮小一點 */
  min-height: 68px;
  padding-top: 10px;
  padding-bottom: 10px;
  /* 半透明 + 毛玻璃:捲動時底下的內容會從它後面透出來一點,
     比實色更能讓人感覺到頁面在動。不支持 backdrop-filter 的瀏覽器
     會退回上面那條實色 background,不會變成透明。 */
  background: color-mix(in srgb, var(--paper) 88%, transparent);
  backdrop-filter: saturate(1.6) blur(10px);
  -webkit-backdrop-filter: saturate(1.6) blur(10px);
  transition: min-height .18s ease, box-shadow .18s ease;
}
@supports not (backdrop-filter: blur(1px)) {
  .site-header { background: var(--paper); }
}
/* 捲下去之後再收窄一點,並給一道淺陰影把它和內容分開 */
.site-header.is-stuck {
  min-height: 56px;
  box-shadow: 0 1px 0 rgba(23, 26, 25, .10), 0 6px 20px -12px rgba(23, 26, 25, .35);
}
.site-header.is-stuck .header-mark { width: clamp(76px, 7vw, 108px); }
.header-mark { transition: width .18s ease; }

@media (max-width: 720px) {
  .site-header { min-height: 58px; }
  .site-header.is-stuck { min-height: 50px; }
}

/* 區號選擇器（.dial / .flag-dot）已搬到 assets/bhb-auth.css。
   原因：註冊表單也用它，而註冊彈窗要出現在**每一頁**，包括沒有載
   這支樣式表的首頁。不要在這裡重新加回來。 */

/* 電話那一行:區號固定寬、號碼吃剩下的 */
.paygate-tel { display: grid; grid-template-columns: minmax(122px, 34%) 1fr; gap: 10px; align-items: start; }

/* ══ 價格區整條翻轉成深色（2026-08-31 老闆：「一整行的顏色跟其他都是翻轉的，
   特別是要給付錢的那個按鈕做顯眼一點」）════════════════════════════

   為什麼翻轉的是「價格」這一條而不是別條：整頁只有這裡要人掏錢。
   把唯一一條深色帶放在付款鍵所在的位置，眼睛捲到這裡會停一下，
   而淺色按鈕落在深底上是整頁對比最強的一組——不用再靠加大加粗去搶。

   全寬帶的做法:取消 max-width，改用 padding-inline 把內容推回中線。
   比負 margin 乾淨，也不會在有捲軸時算錯 100vw 溢出橫向捲動。 */
/* 錨點落點要避開吸頂的導覽條（.site-header 是 sticky、約 68px 高），
   不然捲過去之後區塊標題會被壓在導覽條底下。多留一點讓兩張價格卡
   在同一屏裡看得到 —— 老闆要的是「滑到付費按鈕那裡」，
   不是滑到一個只剩標題的畫面。 */
#pricing { scroll-margin-top: 84px; }

.price-block {
  max-width: none;
  padding-inline: max(var(--page-pad), calc((100% - var(--content)) / 2));
  background: #1e2422;
  color: #eef1f0;
}
.price-block .section-kicker { color: #7fd8c4; }
.price-block .section-heading h2 { color: #fff; }
.price-block .price-card {
  background: rgba(255, 255, 255, .05);
  border-color: rgba(255, 255, 255, .14);
}
.price-block .price-card h3 { color: #fff; }
.price-block .price-card p { color: #b9c7c3; }
.price-block .price-note { color: #93a5a1; }

/* 深底上的次要鍵:描邊改成淺色,否則等於隱形 */
.price-block .btn-line {
  color: #eef3f1;
  border-color: rgba(255, 255, 255, .34);
}
.price-block .btn-line:hover {
  border-color: #fff;
  background: rgba(255, 255, 255, .08);
}
.price-block .linkish { color: #7fd8c4; }
/* 「想先聊聊？發 WhatsApp 給我們」那一條（老闆 2026-08-31：「需要亮一點，
   那個亮青色的那個藍色，要亮一點」）。
   它原本吃的是通用規則 .pay-talk a { color: var(--brand) } = #278d82 ——
   那是給白底用的品牌青，放在這一區近黑的底上幾乎讀不出來。
   改成跟上面「其他付款選項」同一支亮薄荷，兩條連結顏色也就一致了。 */
.price-block .pay-talk a { color: #7fd8c4; }
.price-block .pay-talk a:hover { color: #a5e8da; }

/* 方案卡在深底上要回到淺色,不然三張卡糊成一片 */
.price-block .plan { background: #f7faf9; color: #12201d; border-color: transparent; }
.price-block .plan:hover { box-shadow: 0 8px 24px rgba(0, 0, 0, .35); }
.price-block .plan-per { color: #5d6664; }

.price-block .other-pay {
  background: rgba(255, 255, 255, .06);
  border-color: rgba(255, 255, 255, .14);
}
.price-block .qty-input { background: #fff; color: #12201d; border-color: transparent; }
.price-block .qty-hint { color: #93a5a1; }

/* ── 付款鍵（2026-08-31 二版）────────────────────────────────
   一版做成暖黃 + 脈動光暈,老闆看了直接否掉:「那個發光的、還會閃動的
   按鈕就很醜,顏色很不協調,包括這兩個按鈕的大小和顏色都不一樣。」
   他是對的 —— 黃色不在這個站的色板裡,而且我把 padding 和 font-size
   都調大了,結果同一張卡上兩顆兄弟按鈕長得完全不一樣。

   二版:**尺寸完全交還給 .btn-solid / .btn-line 的基準**（14px 26px、
   13px 大寫），只換顏色。深底上用純白,那是這個色盤裡對比最強的一組,
   而且白色本來就在站上到處都是,不需要引進新顏色。 */
.price-block .btn-solid.pay {
  background: #fff;
  color: var(--ink);
  border-color: #fff;
}
.price-block .btn-solid.pay:hover {
  background: var(--brand);
  border-color: var(--brand);
  color: #fff;
}

/* 相鄰的兩條淺色區塊也稍微分一下層次,免得深色帶像憑空插進來 */
#how { background: rgba(39, 141, 130, .045); max-width: none;
       padding-inline: max(var(--page-pad), calc((100% - var(--content)) / 2)); }

/* ══ 兩張價格卡的版式重做（2026-08-31 三版）══════════════════════
   老闆：「US$400 Everything Included 要大一點，要很大，你重新設計排版。
          Keep It Running 也大一點。那個按鈕的長度要長一點，太短了。」

   19px 的標題在一整條深色帶裡完全撐不住 —— 帶子那麼大，字那麼小，
   整塊看起來是空的。改成跟區塊標題同一個量級的展示級字號，
   卡片本身也給更多留白，讓「US$400」自己成為視覺重心。 */
.price-block .price-card {
  display: flex;
  flex-direction: column;
  padding: clamp(30px, 3.4vw, 48px);
  border-radius: 20px;
}
.price-block .price-card h3 {
  margin: 0 0 16px;
  /* 從 19px 拉到接近區塊標題的量級 */
  font-size: clamp(30px, 3.6vw, 46px);
  font-weight: 800;
  line-height: 1.06;
  letter-spacing: -.025em;
  text-wrap: balance;
}
.price-block .price-card p {
  margin: 0 0 30px;
  font-size: clamp(15px, 1.2vw, 17px);
  line-height: 1.66;
  max-width: 46ch;              /* 一行不要拖太長,不然讀起來累 */
}

/* 按鈕拉滿卡片寬度（老闆:太短了）。兩顆一起改,維持同尺寸。 */
.price-block .price-card .btn-solid,
.price-block .price-card .btn-line {
  width: 100%;
  margin-top: auto;             /* 兩張卡不等高時,按鈕仍然對齊在底部 */
  padding: 18px 30px;
  font-size: 14px;
}
/* 「See the plans」按下去之後,方案列表接在按鈕底下,
   所以那顆按鈕不能再吃掉 margin-top:auto */
.price-block .price-card--plans .plans-toggle { margin-top: auto; }
.price-block .plan-options { margin-top: 14px; }

/* 導覽列登入後印的信箱樣式（.is-signedin）已搬到 assets/bhb-home.css：
   每一頁都載得到它，而首頁沒有載這支樣式表。 */

/* 「改用其他資料」（2026-08-31）：已登入時付款彈窗直接跳到最後一步,
   資料是從註冊帶出來的,這顆讓人為這一單改成別的商號/電話。
   [hidden] 那條不能省 —— class 的 display 會蓋掉 UA 的 [hidden]。 */
.paygate-edit {
  align-self: flex-start;
  display: inline-block;
  margin: -2px 0 2px;
  padding: 4px 2px;
  border: 0; background: none;
  font: inherit; font-size: 13px; font-weight: 600;
  color: var(--brand); cursor: pointer;
}
.paygate-edit:hover { text-decoration: underline; }
.paygate-edit[hidden] { display: none; }

/* ══ 帳號頁的改密碼區（2026-08-31）══════════════════════════════════
   「忘記密碼」不另做一套 reset 頁：寄登入信 → 點進來 → 在這裡設新的。
   所以靠郵件進來的人看不到「目前密碼」那一欄（bhb-account.js 按
   /api/me 回的 method 決定），伺服器 api/password.js 用同一條規則放行。 */
.acct-pwform { display: grid; gap: 14px; max-width: 380px; }
.acct-pwform label { display: grid; gap: 6px; font-size: 13px; font-weight: 600; }
.acct-pwform label[hidden] { display: none; }   /* grid 的 display 會蓋掉 UA 的 [hidden] */
.acct-pwform input {
  font: inherit; font-weight: 400; font-size: 15px;
  padding: 11px 13px; border: 1px solid var(--line); border-radius: 9px;
  background: #fff; color: var(--ink);
}
.acct-pwform input:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; border-color: var(--brand); }
.acct-pwform .btn-solid { justify-self: start; }
.acct-hint { font-style: normal; font-weight: 400; font-size: 12px; color: var(--muted); }
.acct-pwmsg {
  margin: 0; padding: 10px 12px; border-radius: 8px;
  background: rgba(181, 45, 26, .08); color: #9B2C2C; font-size: 13px; line-height: 1.5;
}
.acct-pwmsg.is-ok { background: rgba(39, 141, 130, .10); color: var(--brand); }
.acct-pwmsg[hidden] { display: none; }
#acct-pw[hidden] { display: none; }

/* 已登入時付款表單的信箱欄：灰底、不能改（老闆 2026-08-31）。
   灰色本身就是說明，所以旁邊不寫任何「此欄位不可修改」的句子。
   readOnly 而不是 disabled，所以聚焦框還在 —— 但收成中性色，
   不要用青色主色去強調一個改不了的欄位。 */
.paygate-form input[readonly] {
  background: rgba(23, 26, 25, .05);
  color: var(--muted);
  cursor: default;
}
.paygate-form input[readonly]:focus-visible {
  outline-color: var(--line);
  border-color: var(--line);
}

/* 資料步的兩個「可能被藏起來」的區塊（見 bhb-paygate.js 的 paintDetails）。
   .paygate-agree 的 display 來自 `.paygate-form label { display: flex }`，
   會蓋掉 UA 的 [hidden]；.paygate-cf 目前沒有 display 規則，但它有
   min-height，哪天有人給它加 display 就會踩同一個坑，一起寫死。 */
.paygate-agree[hidden] { display: none; }
.paygate-cf[hidden] { display: none; }

/* ── 帳號頁的落地橫幅（2026-08-31）──────────────────────────────
   郵件連結點完之後落在這一頁，第一眼要看到的是「成功了」，
   而不是又一張表單。青色勾 + 一句大字 + 一句說明。 */
.acct-flag {
  display: flex; align-items: flex-start; gap: 14px;
  margin-bottom: 22px; padding: 18px 20px;
  border: 1px solid rgba(39, 141, 130, .30); border-radius: 14px;
  background: rgba(39, 141, 130, .07);
}
.acct-flag[hidden] { display: none; }   /* flex 的 display 會蓋掉 UA 的 [hidden] */
.acct-flag-mark {
  display: grid; place-items: center; flex: none;
  width: 30px; height: 30px; border-radius: 50%;
  background: var(--brand); color: #fff; font-size: 16px; font-weight: 700; line-height: 1;
}
.acct-flag-lead { margin: 2px 0 0; font-size: 17px; font-weight: 800; letter-spacing: -.01em; }
.acct-flag-lead[hidden], .acct-flag-sub[hidden] { display: none; }
.acct-flag-sub { margin: 6px 0 0; font-size: 14.5px; line-height: 1.6; color: var(--muted); }

/* 「設定新密碼」那一版多一句說明；一般的「改密碼」不顯示。 */
.acct-pwsub { margin: -6px 0 16px; }
.acct-pwsub[hidden] { display: none; }
