/* ─────────────────────────────────────────────────────────
   okross.co 首頁原型 · 方向 B(活體儀表板)+ 一處 A 的氣氛
   單一視覺世界:不隨檢視者主題切換,所有顏色明確指定。
   品牌綠 #19FC95 取自 logo 實際取樣。
   ───────────────────────────────────────────────────────── */
:root{
  --g900:#070B09; --g800:#0C1310; --g700:#121B17; --g600:#1A241F;
  --rule:#22302A; --rule-2:#2E3F38;
  --fg:#EAF2EE; --fg2:#A6B7AF; --fg3:#6D8078;
  --brand:#19FC95; --brand-dim:#0E9E5F; --brand-ink:#04120B;
  --up:#19FC95; --down:#FF6F5E; --warn:#F5B84B;
  --mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  --sans:ui-sans-serif,-apple-system,"Helvetica Neue","PingFang TC","Noto Sans TC",sans-serif;
  --pad:clamp(1.15rem,4vw,2rem);
}
*{box-sizing:border-box}

/* ── 釘住母主題的調色盤 ─────────────────────────────────────
   ⚠ 這一段是上線前才發現的,而且在本機測不出來。

   Blocksy 依自訂器設定產生 uploads/blocksy/css/global.css,裡面是
   `h1{color:var(--theme-headings-color)}`、`table{border-color:...}`
   這類純元素規則,以及區塊編輯器的 .has-palette-color-N 類別。
   而那組設定是 theme_mod —— 跟著主題走。正式站現在這套深色配色
   (含品牌綠 #19FC95)是設在 blocksy-child 上的,啟用 okross-child
   會拿到 Blocksy 的原廠預設值:淺色。

   後果不是「有點怪」,是全站標題變成深色配深色底,直接看不見。

   本機看不出來,因為本機的 global.css 是從正式站複製過來的那一份,
   Blocksy 只在儲存自訂器設定時才重新產生,本機從來沒存過 ——
   本機一直是靠這個巧合在正常。

   下面的值就是正式站現在那套(實測有效),釘進主題檔案裡,
   從此不依賴資料庫,zip 帶得走。
   用 html:root (0,1,1) 而不是 :root (0,1,0),這樣跟載入順序無關 ——
   自訂器的即時預覽會把 Blocksy 的 CSS 重新注入到最後面。

   → 想改配色請改這裡,不要去改自訂器:改自訂器不會跟著 zip 上線。 */
html:root{
  --theme-palette-color-1:#19FC95;   /* 品牌綠,與 --brand 同值 */
  --theme-palette-color-2:#346B5F;   /* 按鈕 hover */
  --theme-palette-color-3:#E0E0E0;   /* 標題 */
  --theme-palette-color-4:#ffffff;
  --theme-palette-color-5:#303030;   /* 框線 */
  --theme-palette-color-6:#292929;
  --theme-palette-color-7:#121212;   /* 頁面底色 */
  --theme-palette-color-8:#252525;   /* 區塊底色 */
  --theme-palette-color-9:#CCCCCC;   /* 內文 */
  --theme-palette-color-10:#0EFB45;
  --theme-palette-color-11:#F7F7F7;
  --theme-palette-color-12:#3F414E;
  --theme-palette-color-13:#3CCBCB;  /* 連結 hover */

  /* 語意變數也一併釘住 —— 預設值裡它們指向不同的調色盤編號,
     只釘調色盤的話仍可能對應到錯的顏色。 */
  --theme-text-color:var(--theme-palette-color-9);
  --theme-headings-color:var(--theme-palette-color-3);
  --theme-heading-1-color:var(--theme-palette-color-3);
  --theme-border-color:var(--theme-palette-color-5);
  --theme-link-initial-color:var(--theme-palette-color-1);
  --theme-link-hover-color:var(--theme-palette-color-13);
  --theme-selection-text-color:var(--theme-palette-color-8);
  --theme-selection-background-color:var(--theme-palette-color-11);
  --theme-button-text-initial-color:#ffffff;
  --theme-button-text-hover-color:#ffffff;
  --theme-button-background-initial-color:var(--theme-palette-color-1);
  --theme-button-background-hover-color:var(--theme-palette-color-2);
  --theme-form-field-border-initial-color:var(--theme-border-color);
  --theme-form-field-border-focus-color:var(--theme-palette-color-1);
  --theme-form-selection-field-initial-color:var(--theme-border-color);
  --theme-form-selection-field-active-color:var(--theme-palette-color-1);
}


/* ⚠ 以下四條刻意寫成 `html X` 而不是 `X`。
   母主題 Blocksy 會依自訂器設定產生 uploads/blocksy/css/global.css，
   裡面有 `body{background-color:var(--theme-palette-color-7)}` 這種
   純元素規則。而 Blocksy 的調色盤是「跟著主題走」的 theme_mod ——
   啟用 okross-child 等於拿到一份全新的預設值(底色是白的)。

   正常載入時 okross.css 排在 global.css 後面,同特異度後來者勝,
   所以看起來沒事。但那是靠順序贏的,而順序不是我們控制得了的:
   自訂器的即時預覽會用 JS 把那份 CSS 重新注入到 <head> 最後面,
   立刻就翻盤 —— 預覽畫面會變成白底配深色標題(h1 沒有自己的 color,
   繼承被蓋掉的 body;而有 class 的元件仍是深色,所以只壞一半)。

   加一層 html 把特異度提到 (0,0,2),就跟載入順序無關了。
   仍然低於主題自己的 class 規則,內部階層不受影響。

   這件事在本機測不出來:本機的 global.css 是從正式站複製過來的
   blocksy-child 版本(深色),Blocksy 只在儲存自訂器設定時才重新產生,
   本機從來沒存過。本機一直是靠這個巧合正常的。 */
html{background:var(--g900)}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
html body{
  margin:0;background:var(--g900);color:var(--fg);font-family:var(--sans);
  font-size:16px;line-height:1.7;letter-spacing:.004em;overflow-x:hidden;
}
html h1,html h2,html h3,html h4{margin:0;line-height:1.16;letter-spacing:-.026em;text-wrap:balance;font-weight:750}
/* ⚠ 標題顏色必須自己指定,而且要帶 html 前綴。
   Blocksy 有一條 `h1{color:var(--theme-heading-color, ...)}`,而它的調色盤
   是跟著主題走的 theme_mod —— 啟用 okross-child 會拿到一份全新的預設值。
   在本機看不出來:本機的 global.css 是從正式站複製過來的 blocksy-child 版本
   (--theme-headings-color:#E0E0E0,淺色),剛好跟深色底相容。
   正式站啟用後那個值會變成深色 → 深底配深標題,全站標題直接消失。
   實測方式:把所有 --theme-* 變數染成洋紅,看哪些元素跟著變色。 */
html h1,html h2,html h3,html h4,html h5,html h6{color:var(--fg)}
/* 表格與引言的框線同理 —— Blocksy 用 `table/th/td{border:1px solid var(--theme-border-color)}`
   這種純元素規則。不指定的話,框線顏色會跟著母主題的調色盤跑。 */
html table,html th,html td,html blockquote{border-color:var(--rule)}
h1{font-size:clamp(2.1rem,6.2vw,4rem)}
h2{font-size:clamp(1.55rem,3.6vw,2.4rem)}
h3{font-size:1.08rem;font-weight:700;letter-spacing:-.012em}
p{margin:0}
html a{color:inherit;text-decoration:none}
html button,html input{font:inherit;color:inherit}
:focus-visible{outline:2px solid var(--brand);outline-offset:3px;border-radius:4px}
.mono{font-family:var(--mono)}
.num{font-family:var(--mono);font-variant-numeric:tabular-nums}
.wrap{max-width:74rem;margin:0 auto;padding:0 var(--pad)}
.lbl{font-family:var(--mono);font-size:.67rem;letter-spacing:.17em;text-transform:uppercase;color:var(--fg3)}
.stack{display:flex;flex-direction:column}

/* ── nav ────────────────────────────────────────── */
.nav{
  position:sticky;top:0;z-index:60;background:rgba(7,11,9,.78);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border-bottom:1px solid var(--rule);
}
.nav .wrap{display:flex;align-items:center;gap:1.5rem;height:4rem}
/* logo 用原檔，不重繪。白字版本，只能放在深色底上。
   原始 PNG 上下有 45% 的透明留白，所以 height 設 1.95rem 時，
   看得見的標誌其實只有 17px —— 在 64px 高的導覽列裡明顯偏小。
   留白已從檔案裁掉（圖形本身未動），現在 height 設多少就是多少。 */
.brand{display:inline-flex;align-items:center}
.brand img{height:1.75rem;width:auto;display:block}
footer .brand img{height:2rem}
.nav ul{display:none;list-style:none;margin:0;padding:0;gap:1.6rem;margin-left:auto;font-size:.9rem}
.nav ul a{color:var(--fg2)}.nav ul a:hover{color:var(--fg)}
@media(min-width:56rem){.nav ul{display:flex}}
.btn{
  display:inline-flex;align-items:center;gap:.4rem;border:0;cursor:pointer;
  background:var(--brand);color:var(--brand-ink);font-weight:700;font-size:.9rem;
  padding:.6rem 1.1rem;border-radius:6px;letter-spacing:-.01em;
  transition:transform .16s ease,filter .16s ease;
}
.btn:hover{filter:brightness(1.09)}
.btn:active{transform:translateY(1px)}
.btn.ghost{background:transparent;color:var(--fg);border:1px solid var(--rule-2)}
.btn.ghost:hover{border-color:var(--brand);color:var(--brand)}
.nav .btn{padding:.5rem .9rem}
/* 手機沒有 ul，所以必須有漢堡鈕，否則除了捲動沒有別的方式到各段 */
.burger{
  margin-left:auto;background:transparent;border:1px solid var(--rule-2);border-radius:6px;
  width:2.4rem;height:2.4rem;display:grid;place-items:center;gap:.22rem;cursor:pointer;padding:0;
}
.burger i{display:block;width:1rem;height:1.5px;background:var(--fg);transition:transform .2s ease,opacity .2s ease}
.burger[aria-expanded="true"] i:nth-child(1){transform:translateY(3.7px) rotate(45deg)}
.burger[aria-expanded="true"] i:nth-child(2){opacity:0}
.burger[aria-expanded="true"] i:nth-child(3){transform:translateY(-3.7px) rotate(-45deg)}
@media(min-width:56rem){.burger{display:none}.nav .btn{margin-left:0}}
.sheet{
  display:none;border-bottom:1px solid var(--rule);background:var(--g800);
  position:sticky;top:4rem;z-index:59;
}
.sheet.open{display:block}
@media(min-width:56rem){.sheet,.sheet.open{display:none}}
.sheet ul{list-style:none;margin:0;padding:.5rem var(--pad) 1rem;display:grid;gap:.1rem}
.sheet a{display:block;padding:.72rem .2rem;border-bottom:1px solid var(--rule);font-size:1rem;color:var(--fg2)}
.sheet li:last-child a{border-bottom:0}

/* ── hero ───────────────────────────────────────── */
.hero{position:relative;overflow:hidden;border-bottom:1px solid var(--rule)}
#field{position:absolute;inset:0;width:100%;height:100%;display:block;opacity:.85;pointer-events:none}
.hero .wrap{position:relative;z-index:2;padding-top:clamp(3rem,8vw,5.5rem);padding-bottom:clamp(3rem,8vw,5rem)}
.hgrid{display:grid;gap:clamp(2rem,5vw,3.5rem);align-items:center}
@media(min-width:62rem){.hgrid{grid-template-columns:minmax(0,1.06fr) minmax(0,.94fr)}}
.eyebrow{display:inline-flex;align-items:center;gap:.5rem;margin-bottom:1.1rem}
.dot{width:.42rem;height:.42rem;border-radius:99px;background:var(--brand);flex:none}
@media(prefers-reduced-motion:no-preference){.dot{animation:pulse 2.4s ease-in-out infinite}}
@keyframes pulse{0%,100%{opacity:1;box-shadow:0 0 0 0 rgba(25,252,149,.5)}50%{opacity:.55;box-shadow:0 0 0 .38rem rgba(25,252,149,0)}}
h1 .hl{color:var(--brand)}
.lede{margin-top:1.3rem;font-size:clamp(1rem,1.9vw,1.14rem);color:var(--fg2);max-width:34rem}
.cta{display:flex;flex-wrap:wrap;gap:.7rem;margin-top:2rem}
/* 四個並排、標籤單行。用 auto-fit 而不是 media query,是因為限制欄數的
   是首屏左欄的寬度(約 560px)而不是視窗寬度 —— 用視窗斷點的話,
   寬螢幕上會把四欄硬塞進 560px。最小欄寬 7rem 在 560px 下剛好排四欄,
   窄螢幕會自動收成兩欄再收成一欄。 */
.trust{
  margin-top:1.5rem;display:grid;gap:1.1rem 1.3rem;
  grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));
}
.trust .n{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:1.7rem;font-weight:650;color:var(--fg);letter-spacing:-.03em;display:block;line-height:1.1}
/* 單位字比數字小一號,數字才會是視線落點 */
.trust .n i{font-style:normal;font-size:.56em;font-weight:600;letter-spacing:0;margin-left:.06em}
.trust .t{display:block;font-size:.73rem;line-height:1.5;color:var(--fg3);margin-top:.25rem;white-space:nowrap}
/* 窄螢幕欄位變窄,單行放不下時允許折行,否則會撐破版面 */
@media(max-width:30rem){.trust .t{white-space:normal}}


/* ── live board ─────────────────────────────────── */
.board{
  background:linear-gradient(180deg,rgba(18,27,23,.95),rgba(12,19,16,.97));
  border:1px solid var(--rule-2);border-radius:12px;overflow:hidden;
  box-shadow:0 24px 60px -20px rgba(0,0,0,.75);
}
.board-hd{
  display:flex;align-items:center;gap:.6rem;padding:.75rem 1rem;
  border-bottom:1px solid var(--rule);background:rgba(7,11,9,.5);
}
.board-hd .lbl{color:var(--brand)}
.board-hd .clock{margin-left:auto;font-family:var(--mono);font-size:.72rem;color:var(--fg3)}
/* ── 物流動線 ────────────────────────────────────── */
.route{padding:1.05rem 1.1rem .4rem}
.modes{display:flex;align-items:center;gap:.35rem;margin-bottom:1.15rem}
.mode{
  background:transparent;border:1px solid var(--rule-2);border-radius:6px;cursor:pointer;
  padding:.3rem .8rem;font-size:.8rem;font-weight:650;color:var(--fg2);
  transition:background .16s ease,color .16s ease,border-color .16s ease;
}
.mode[aria-pressed="true"]{background:var(--brand);border-color:var(--brand);color:var(--brand-ink)}
.total{margin-left:auto;font-family:var(--mono);font-size:.72rem;color:var(--fg3);text-align:right}
.total b{color:var(--brand);font-weight:600}

.track{position:relative}
.stages{position:relative;list-style:none;margin:0;padding:0;display:grid;gap:.4rem}
.stages li{min-width:0}
.stage{
  position:relative;z-index:2;width:100%;background:transparent;border:0;cursor:pointer;
  display:grid;gap:.34rem;justify-items:center;text-align:center;padding:0;
}
.ico{
  width:2.65rem;height:2.65rem;border-radius:99px;display:grid;place-items:center;
  background:var(--g700);border:1px solid var(--rule-2);color:var(--fg3);
  transition:color .2s ease,border-color .2s ease,background .2s ease,transform .2s ease;
}
.ico svg{width:1.3rem;height:1.3rem}
.nm{font-size:.79rem;font-weight:650;color:var(--fg2);line-height:1.3}
.tm{font-family:var(--mono);font-size:.68rem;color:var(--fg3);white-space:nowrap}
.stage:hover .ico{border-color:var(--brand);color:var(--brand)}
.stage[aria-pressed="true"] .ico{
  background:rgba(25,252,149,.12);border-color:var(--brand);color:var(--brand);transform:scale(1.06);
}
.stage[aria-pressed="true"] .nm{color:var(--fg)}
.stage[aria-pressed="true"] .tm{color:var(--brand)}

/* 移動中的貨件：軌道與動畫兩種方向各寫一次 */
.pkgs{position:absolute;pointer-events:none}
.pkg{position:absolute;width:.44rem;height:.44rem;border-radius:99px;background:var(--brand);
     box-shadow:0 0 0 3px rgba(25,252,149,.16)}

@media(min-width:40rem){
  .stages{grid-template-columns:repeat(4,minmax(0,1fr))}
  .stages::before{
    content:"";position:absolute;z-index:1;left:12.5%;right:12.5%;top:1.32rem;
    height:1.5px;background:var(--rule-2);
  }
  .pkgs{left:12.5%;right:12.5%;top:calc(1.32rem - .19rem);height:.44rem}
  .pkg{top:0;left:0}
  @media(prefers-reduced-motion:no-preference){
    .pkg{animation:runx var(--dur,9s) linear infinite;animation-delay:var(--d,0s)}
  }
  @keyframes runx{from{left:0;opacity:0}8%{opacity:1}92%{opacity:1}to{left:100%;opacity:0}}
}
@media(max-width:39.99rem){
  .stages{grid-template-columns:minmax(0,1fr)}
  .stages::before{
    content:"";position:absolute;z-index:1;top:1.32rem;bottom:2.4rem;left:1.32rem;
    width:1.5px;background:var(--rule-2);
  }
  .stage{grid-template-columns:2.65rem minmax(0,1fr);justify-items:start;text-align:left;
         align-items:center;gap:.2rem .85rem;padding:.34rem 0}
  .ico{grid-row:span 2}
  .nm{align-self:end}.tm{align-self:start}
  .pkgs{top:1.32rem;bottom:2.4rem;left:calc(1.32rem - .19rem);width:.44rem}
  .pkg{left:0;top:0}
  @media(prefers-reduced-motion:no-preference){
    .pkg{animation:runy var(--dur,9s) linear infinite;animation-delay:var(--d,0s)}
  }
  @keyframes runy{from{top:0;opacity:0}8%{opacity:1}92%{opacity:1}to{top:100%;opacity:0}}
}

.sdetail{border-top:1px solid var(--rule);padding:.95rem 1.1rem;background:rgba(25,252,149,.035)}
.sd-hd{display:flex;align-items:baseline;gap:.8rem;margin-bottom:.4rem}
.sd-hd .lbl{color:var(--brand)}
.sd-t{margin-left:auto;font-family:var(--mono);font-size:.72rem;color:var(--fg2);white-space:nowrap}
.sdetail p{font-size:.855rem;color:var(--fg2);line-height:1.62}
.sd-risk{margin-top:.45rem;font-size:.79rem;color:var(--warn)}
.sd-risk:empty{display:none}

.metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
.metric{padding:1rem 1.1rem;border-bottom:1px solid var(--rule)}
.metric:nth-child(odd){border-right:1px solid var(--rule)}
.metric .k{font-size:.73rem;color:var(--fg3);letter-spacing:.01em}
.metric .v{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:1.5rem;font-weight:650;letter-spacing:-.03em;margin-top:.2rem;line-height:1.1}
.metric .d{font-family:var(--mono);font-size:.72rem;margin-top:.15rem}
.d.up{color:var(--up)}.d.down{color:var(--down)}
.spark{padding:1rem 1.1rem}
.spark .row{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.5rem}
.spark svg{width:100%;height:52px;display:block;overflow:visible}
.feed{border-top:1px solid var(--rule);padding:.7rem 1.1rem .9rem;max-height:8.4rem;overflow:hidden}
.feed li{
  list-style:none;font-family:var(--mono);font-size:.735rem;color:var(--fg2);
  padding:.24rem 0;display:flex;gap:.6rem;line-height:1.5;
}
.feed ul{margin:0;padding:0}
.feed .ts{color:var(--fg3);flex:none}
.feed .ok{color:var(--brand)}
@media(prefers-reduced-motion:no-preference){.feed li{animation:slidein .45s ease both}}
@keyframes slidein{from{opacity:0;transform:translateY(-.35rem)}to{opacity:1;transform:none}}
.disc{padding:.6rem 1.1rem;border-top:1px solid var(--rule);font-size:.7rem;color:var(--fg3);line-height:1.5}

/* ── sections ───────────────────────────────────── */
section{padding:clamp(3.4rem,8vw,5.4rem) 0;border-bottom:1px solid var(--rule)}
/* 導覽列是 sticky，錨點跳轉必須讓開它的高度，否則標題被蓋住 */
section[id],header[id]{scroll-margin-top:4.6rem}
.shd{margin-bottom:clamp(1.8rem,4vw,2.6rem)}
.shd h2{margin-top:.55rem}
.shd p{margin-top:.7rem;color:var(--fg2);max-width:40rem}
.cards{display:grid;gap:1rem}
@media(min-width:50rem){.cards{grid-template-columns:repeat(3,minmax(0,1fr))}}
.card{
  background:var(--g800);border:1px solid var(--rule);border-radius:10px;padding:1.4rem;
  transition:border-color .18s ease,transform .18s ease;
}
.card:hover{border-color:var(--rule-2);transform:translateY(-2px)}
.card h3{margin-bottom:.55rem}
.card .who{margin-top:.9rem;padding-top:.8rem;border-top:1px solid var(--rule);font-size:.8rem;color:var(--fg3)}
.card p{font-size:.92rem;color:var(--fg2)}
.card .tag{color:var(--brand);font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase}

/* ── calculator ─────────────────────────────────── */
.calc{display:grid;gap:1.1rem}
@media(min-width:58rem){.calc{grid-template-columns:minmax(0,1fr) minmax(0,1.02fr);align-items:start}}
.panel{background:var(--g800);border:1px solid var(--rule);border-radius:11px;overflow:hidden}
.panel-hd{padding:.85rem 1.15rem;border-bottom:1px solid var(--rule);display:flex;align-items:center;gap:.55rem;background:var(--g700)}
.panel-bd{padding:1.15rem}
.ctrl{display:grid;gap:.35rem;padding:.75rem 0;border-bottom:1px solid var(--rule)}
.ctrl:last-child{border-bottom:0;padding-bottom:0}
.ctrl .top{display:flex;justify-content:space-between;align-items:baseline;gap:1rem}
.ctrl label{font-size:.87rem;color:var(--fg2)}
.ctrl .val{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:.95rem;font-weight:650;color:var(--brand);white-space:nowrap}
.ctrl .hint{font-size:.72rem;color:var(--fg3);line-height:1.45}
input[type=range]{
  -webkit-appearance:none;appearance:none;width:100%;height:2px;background:var(--rule-2);
  border-radius:2px;margin:.5rem 0 .1rem;cursor:pointer;
}
input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none;appearance:none;width:1.05rem;height:1.05rem;border-radius:99px;
  background:var(--brand);border:3px solid var(--g800);box-shadow:0 0 0 1px var(--brand);cursor:grab;
}
input[type=range]::-moz-range-thumb{
  width:1.05rem;height:1.05rem;border-radius:99px;background:var(--brand);
  border:3px solid var(--g800);box-shadow:0 0 0 1px var(--brand);cursor:grab;
}
.out{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0;border-top:1px solid var(--rule)}
.out .o{padding:.9rem 1.15rem;border-bottom:1px solid var(--rule)}
.out .o:nth-child(odd){border-right:1px solid var(--rule)}
.out .o.wide{grid-column:1/-1;border-right:0}
.out .k{font-size:.74rem;color:var(--fg3)}
.out .v{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:1.3rem;font-weight:650;letter-spacing:-.03em;margin-top:.15rem}
.out .v.big{font-size:1.75rem}
.out .v.pos{color:var(--brand)}.out .v.neg{color:var(--down)}
.bar{display:flex;height:.42rem;border-radius:99px;overflow:hidden;margin-top:.7rem;background:var(--g700)}
.bar i{display:block;height:100%}
.legend{display:flex;flex-wrap:wrap;gap:.35rem .9rem;margin-top:.6rem;font-size:.72rem;color:var(--fg3)}
.legend b{display:inline-block;width:.5rem;height:.5rem;border-radius:2px;margin-right:.32rem}
.verdict{padding:1.05rem 1.15rem;border-top:1px solid var(--rule);background:rgba(25,252,149,.05)}
.verdict .lbl{color:var(--brand)}
.verdict p{margin-top:.4rem;font-size:.9rem;color:var(--fg2)}
.verdict strong{color:var(--fg)}

/* ── pricing ────────────────────────────────────── */
.toggle{display:inline-flex;background:var(--g700);border:1px solid var(--rule);border-radius:8px;padding:.22rem;gap:.22rem}
.toggle button{background:transparent;border:0;cursor:pointer;padding:.42rem .95rem;border-radius:6px;font-size:.85rem;color:var(--fg2);font-weight:600}
.toggle button[aria-pressed="true"]{background:var(--brand);color:var(--brand-ink)}
.plans{display:grid;gap:1rem;margin-top:1.6rem}
@media(min-width:52rem){.plans{grid-template-columns:repeat(3,minmax(0,1fr))}}
.plan{background:var(--g800);border:1px solid var(--rule);border-radius:11px;padding:1.4rem;display:flex;flex-direction:column;gap:.85rem}
.plan.hot{border-color:var(--brand);box-shadow:0 0 0 1px rgba(25,252,149,.22)}
.plan .hash{font-family:var(--mono);font-size:.7rem;color:var(--brand);letter-spacing:.05em}
.plan .price{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:1.85rem;font-weight:700;letter-spacing:-.035em;line-height:1}
.plan .price small{font-size:.8rem;font-weight:500;color:var(--fg3);letter-spacing:0}
.plan .cut{font-size:.78rem;color:var(--fg3)}
.plan ul{margin:0;padding:0;list-style:none;display:grid;gap:.4rem;font-size:.86rem;color:var(--fg2)}
.plan li{display:flex;gap:.5rem;align-items:flex-start}
.plan li svg{width:.85rem;height:.85rem;flex:none;margin-top:.36rem;color:var(--brand)}
.plan .btn{margin-top:auto;justify-content:center}

/* ── 文章 ───────────────────────────────────────── */
.shd .row{display:flex;flex-wrap:wrap;gap:.8rem 1.5rem;justify-content:space-between;align-items:flex-end}
.more{font-size:.9rem;color:var(--brand);font-weight:650;white-space:nowrap}
.more:hover{text-decoration:underline;text-underline-offset:.25em}
.posts{display:grid;gap:1rem}
@media(min-width:46rem){.posts{grid-template-columns:repeat(2,minmax(0,1fr))}}
.post{
  display:flex;flex-direction:column;gap:.6rem;background:var(--g800);
  border:1px solid var(--rule);border-radius:10px;padding:1.3rem;
  transition:border-color .18s ease,transform .18s ease;
}
.post:hover{border-color:var(--brand);transform:translateY(-2px)}
.post .meta{display:flex;gap:.7rem;align-items:center;font-family:var(--mono);font-size:.7rem;color:var(--fg3)}
.post .cat{color:var(--brand);letter-spacing:.06em}
.post h3{line-height:1.35}
.post p{font-size:.88rem;color:var(--fg2)}
.post .go{margin-top:auto;padding-top:.7rem;font-size:.84rem;color:var(--brand);font-weight:600}
.soon{
  border:1px dashed var(--rule-2);background:transparent;border-radius:10px;padding:1.3rem;
  display:flex;flex-direction:column;justify-content:center;gap:.4rem;
}
.soon p{font-size:.88rem;color:var(--fg3)}

/* ── 多頁：單檔內部路由。每個 .okross-view 是一個「頁面」 ────── */
.okross-view{display:none}
.okross-view.on{display:block}
.phead{padding:clamp(2.6rem,7vw,4.2rem) 0 clamp(1.8rem,4vw,2.6rem);border-bottom:1px solid var(--rule)}
.crumb{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--fg3);margin-bottom:1.2rem}
.crumb a{color:var(--brand);font-weight:600}
.crumb a:hover{text-decoration:underline;text-underline-offset:.25em}
.phead h1{font-size:clamp(1.85rem,4.6vw,3rem)}
.phead .sub{margin-top:1rem;color:var(--fg2);max-width:38rem;font-size:clamp(.98rem,1.7vw,1.08rem)}
/* 關於我們：四項數字 */
.facts{
  margin-top:2.2rem;display:grid;gap:1.3rem 2rem;
  grid-template-columns:repeat(2,minmax(0,1fr));
}
@media(min-width:52rem){.facts{grid-template-columns:repeat(4,minmax(0,1fr))}}
.facts .n{
  font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:clamp(1.5rem,3.4vw,2.05rem);
  font-weight:650;letter-spacing:-.035em;line-height:1.05;color:var(--brand);display:block;
}
.facts .n em{font-style:normal;font-size:.55em;margin-left:.1em}
.facts .t{display:block;font-size:.775rem;color:var(--fg3);margin-top:.35rem;line-height:1.45}

.pillars{display:grid;gap:1rem;margin-top:0}
@media(min-width:52rem){.pillars{grid-template-columns:repeat(2,minmax(0,1fr))}}
.pillar{
  background:var(--g800);border:1px solid var(--rule);border-radius:10px;
  padding:1.5rem;display:flex;flex-direction:column;gap:.55rem;
  transition:border-color .18s ease;
}
.pillar:hover{border-color:var(--rule-2)}
.pillar .n{
  font-family:var(--mono);font-size:.72rem;color:var(--brand);letter-spacing:.1em;
}
.pillar h3{margin-bottom:.15rem}
.pillar p{font-size:.92rem;color:var(--fg2)}
.pillar .hi{
  margin-top:auto;padding-top:.85rem;border-top:1px solid var(--rule);
  color:var(--fg);font-weight:600;font-size:.9rem;line-height:1.6;
}
.creed{
  margin-top:2rem;background:var(--g800);border:1px solid var(--rule);
  border-left:3px solid var(--brand);border-radius:0 11px 11px 0;padding:1.5rem;
}
.creed .big{font-size:clamp(1.15rem,2.4vw,1.5rem);font-weight:700;letter-spacing:-.02em;line-height:1.4}
.creed .sig{margin-top:.7rem;font-family:var(--mono);font-size:.8rem;color:var(--brand);letter-spacing:.08em}

/* 文章內文 */
.article{padding:clamp(2.2rem,5vw,3.4rem) 0}
.article .body{max-width:40rem}
.article .body h3{margin:2rem 0 .7rem;font-size:1.16rem}
.article .body h4{margin:1.5rem 0 .5rem;font-size:.98rem;color:var(--brand);font-weight:700}
.article .body p{margin-top:.85rem;color:var(--fg2);font-size:1rem;line-height:1.85}
.article .body ul{margin:.85rem 0 0;padding-left:1.15rem;color:var(--fg2);font-size:1rem;line-height:1.8}
.article .body li{margin-top:.4rem}
.article .body .callout{
  margin-top:1.2rem;padding:1rem 1.15rem;border:1px solid var(--rule-2);
  border-radius:9px;background:var(--g800);font-size:.9rem;color:var(--fg2);line-height:1.7;
}
.article .body .callout b{color:var(--warn)}
.tw-sm{overflow-x:auto;margin-top:1.2rem;border:1px solid var(--rule);border-radius:9px}
.tw-sm table{border-collapse:collapse;width:100%;min-width:24rem;font-size:.88rem;background:var(--g800)}
.tw-sm th,.tw-sm td{padding:.6rem .85rem;text-align:left;border-bottom:1px solid var(--rule)}
.tw-sm thead th{background:var(--g700);font-size:.72rem;letter-spacing:.07em;color:var(--fg3);font-weight:650}
.tw-sm tbody tr:last-child td{border-bottom:0}
.tw-sm td:first-child{color:var(--fg);font-weight:640}
.byline{margin-top:2rem;padding-top:1.2rem;border-top:1px solid var(--rule);font-size:.9rem;color:var(--fg3)}
.backrow{margin-top:2.2rem;display:flex;flex-wrap:wrap;gap:.7rem}

/* ── quote / faq / cta ──────────────────────────── */
.quote{
  background:var(--g800);border:1px solid var(--rule);border-left:3px solid var(--brand);
  border-radius:0 11px 11px 0;padding:1.6rem;
}
.quote p{color:var(--fg2);font-size:.95rem}
.quote p+p{margin-top:.8rem}
.quote .lead{color:var(--fg);font-size:1.12rem;font-weight:650;letter-spacing:-.015em;line-height:1.45}
.quote .by{margin-top:1.1rem;padding-top:.9rem;border-top:1px solid var(--rule);font-size:.83rem;color:var(--fg3)}
details{border-bottom:1px solid var(--rule)}
details summary{
  cursor:pointer;list-style:none;padding:1.05rem 0;font-weight:650;font-size:1rem;
  display:flex;justify-content:space-between;gap:1rem;align-items:center;
}
details summary::-webkit-details-marker{display:none}
details summary::after{content:"+";font-family:var(--mono);color:var(--brand);font-size:1.3rem;line-height:1;flex:none}
details[open] summary::after{content:"–"}
details .a{padding:0 0 1.15rem;color:var(--fg2);font-size:.93rem;max-width:44rem}
details .a p+p{margin-top:.7rem}
.endcta{text-align:center;padding:clamp(3.4rem,9vw,6rem) 0}
.endcta h2{max-width:22ch;margin:0 auto}
.endcta p{margin:1rem auto 0;color:var(--fg2);max-width:34rem}
.endcta .cta{justify-content:center}
html footer{padding:2.4rem 0 3.4rem;font-size:.8rem;color:var(--fg3)}
footer .cols{display:flex;flex-wrap:wrap;gap:1.4rem 2.6rem;justify-content:space-between;align-items:flex-start}
.proto{
  position:fixed;left:0;right:0;bottom:0;z-index:80;background:var(--brand);color:var(--brand-ink);
  font-family:var(--mono);font-size:.7rem;letter-spacing:.04em;text-align:center;padding:.4rem .8rem;line-height:1.4;
}
body{padding-bottom:2.4rem}
/* 只有在 JS 確定會跑的時候才先藏起來。否則 JS 一掛,整頁是空白的。 */
@media(prefers-reduced-motion:no-preference){
  html.js .rv{opacity:0;transform:translateY(14px);transition:opacity .6s ease,transform .6s cubic-bezier(.22,1,.36,1)}
  html.js .rv.in{opacity:1;transform:none}
}

/* ── 物流時程對照表（伺服器端渲染，給爬蟲與 AI 引擎）─────────
   展開樣式沿用本檔既有的 summary 規則（FAQ 也用同一套），
   不另造一份，否則會出現兩個 +／− 標記。 */
.logi-table{margin-top:1.1rem;padding:0 1.1rem;border:1px solid var(--rule);border-radius:10px;background:var(--g700)}

.logi-table-scroll{overflow-x:auto;border-top:1px solid var(--rule)}
.logi-table table{border-collapse:collapse;width:100%;min-width:38rem;font-size:.82rem}
.logi-table caption{
  text-align:left;padding:.8rem 1.1rem .2rem;color:var(--fg3);font-size:.75rem;line-height:1.6;
}
.logi-table th,.logi-table td{
  padding:.6rem .9rem;text-align:left;border-bottom:1px solid var(--rule);
  font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--fg2);
}
.logi-table thead th{color:var(--fg3);font-size:.72rem;font-weight:500;letter-spacing:.04em}
.logi-table tbody th{color:var(--fg);font-weight:600;font-family:var(--sans)}
.logi-table tbody tr:last-child td,.logi-table tbody tr:last-child th{border-bottom:0}
.logi-table td strong{color:var(--brand);font-weight:600}
.logi-note{
  padding:.75rem 1.1rem 0;font-size:.8rem;line-height:1.75;color:var(--fg2);
  border-top:1px solid var(--rule);margin:0;
}
.logi-note:first-of-type{margin-top:.3rem}
.logi-note:last-child{padding-bottom:1.1rem}
.logi-note strong{color:var(--fg)}
.logi-risk{display:block;margin-top:.25rem;color:var(--warn)}
@media(max-width:640px){
  
}

/* ── FAQ 頁 ──────────────────────────────────────────── */
.faq-page{padding:5.5rem 0 4rem;background:var(--g800)}
.faq-hd{max-width:44rem;margin-bottom:2.4rem}
.faq-hd h1{margin:.7rem 0 .9rem;font-size:clamp(1.7rem,3.6vw,2.5rem);line-height:1.25}
.faq-hd .lede{color:var(--fg2);font-size:1rem;line-height:1.85}
.faq-hd .lede a{color:var(--brand)}

.faq-toc{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:3rem}
.faq-toc a{
  display:inline-flex;align-items:center;gap:.45rem;
  padding:.45rem .85rem;border:1px solid var(--rule);border-radius:99px;
  background:var(--g700);color:var(--fg2);text-decoration:none;font-size:.83rem;
  transition:border-color .16s ease,color .16s ease;
}
.faq-toc a:hover{border-color:var(--brand-dim);color:var(--fg)}
.faq-toc a span{
  font-family:var(--mono);font-size:.7rem;color:var(--fg3);
  background:var(--g600);padding:.05rem .38rem;border-radius:99px;
}

.faq-group{margin-bottom:3rem;scroll-margin-top:5rem}
.faq-group>h2{
  font-size:1.05rem;color:var(--brand);margin-bottom:.9rem;
  padding-bottom:.6rem;border-bottom:1px solid var(--rule);
}

.faq-more{margin-top:1.6rem}
.faq-cta{
  margin-top:1rem;padding:2.4rem;border:1px solid var(--rule);border-radius:12px;
  background:var(--g700);text-align:center;
}
.faq-cta h2{font-size:1.3rem;margin-bottom:.6rem}
.faq-cta p{color:var(--fg2);margin-bottom:1.3rem;font-size:.94rem}
@media(max-width:640px){
  .faq-page{padding-top:4rem}
  .faq-cta{padding:1.6rem}
}

/* 區塊說明文字裡的連結要看得出是連結 —— 預設繼承 --fg2，
   跟內文同色又沒有底線，訪客不會知道可以點。 */
.shd p a,.faq-hd .lede a{
  color:var(--brand);text-decoration:underline;text-decoration-thickness:1px;
  text-underline-offset:.22em;text-decoration-color:color-mix(in srgb,var(--brand) 45%,transparent);
  transition:text-decoration-color .16s ease;
}
.shd p a:hover,.faq-hd .lede a:hover{text-decoration-color:var(--brand)}

/* ── 內頁（服務、聯絡）─────────────────────────────────
   首頁的 hero 是滿版深色大字，內頁不需要那麼重。這裡用一個
   統一的 .page-hd 當頁首，讓兩個內頁與 FAQ 頁的節奏一致。 */
.sub-page{background:var(--g800)}
.page-hd{padding:5.5rem 0 2.8rem;border-bottom:1px solid var(--rule)}
.page-hd h1{margin:.75rem 0 0;font-size:clamp(1.8rem,4vw,2.7rem);line-height:1.22;letter-spacing:-.02em}
.page-hd .lede{margin-top:1.1rem;max-width:42rem;color:var(--fg2);font-size:1rem;line-height:1.85}
.page-hd .lede b{color:var(--fg);font-weight:650}
.page-hd .cta{margin-top:1.7rem}
.plan-note{
  margin-top:1.3rem;padding:.85rem 1rem;border-radius:9px;font-size:.88rem;color:var(--fg2);
  background:rgba(25,252,149,.06);border:1px solid color-mix(in srgb,var(--brand) 28%,transparent);
}
.plan-note b{color:var(--brand)}

/* ── 服務範圍（五大類）─────────────────────────────────
   欄數隨寬度長：手機一欄、平板兩欄、桌機三欄。刻意不用四或五欄 ——
   各類的項目數落差不小（B 類 5 項、A 類 8 項），欄數一多，
   卡片高度差就明顯到像壞掉。 */
.scope{display:grid;gap:1rem}
.scope-g{
  background:var(--g700);border:1px solid var(--rule);border-radius:12px;
  padding:1.4rem;display:flex;flex-direction:column;gap:1rem;
}
.scope-g header{display:grid;gap:.4rem}
.scope-l{
  font-family:var(--mono);font-size:.7rem;font-weight:700;letter-spacing:.1em;
  color:var(--brand-ink);background:var(--brand);border-radius:5px;
  width:1.5rem;height:1.5rem;display:grid;place-items:center;
}
.scope-g h3{font-size:1.1rem;margin:.25rem 0 0}
.scope-g header p{font-size:.86rem;color:var(--fg3);line-height:1.65}
.scope-g ul{margin:0;padding:0;list-style:none;display:grid;gap:.45rem;font-size:.88rem;color:var(--fg2)}
.scope-g li{display:flex;gap:.55rem;align-items:flex-start}
.scope-g li svg{width:.85rem;height:.85rem;flex:none;margin-top:.34rem;color:var(--brand)}
.paid{
  margin-left:.45rem;font-style:normal;font-size:.66rem;letter-spacing:.04em;
  color:var(--warn);border:1px solid color-mix(in srgb,var(--warn) 45%,transparent);
  border-radius:4px;padding:.06rem .3rem;vertical-align:.08em;
}
.scope-note{
  margin-top:auto;padding-top:.85rem;border-top:1px solid var(--rule);
  font-size:.78rem;color:var(--fg3);line-height:1.65;
}
@media(min-width:44rem){.scope{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:66rem){.scope{grid-template-columns:repeat(3,minmax(0,1fr))}}

/* ── 服務邊界 ─────────────────────────────────────────
   用提醒色的小圓點，不是紅色警告框 —— 這不是壞消息，是誠實。 */
.limits{
  margin-top:1.6rem;padding:1.5rem;border-radius:12px;
  background:var(--g800);border:1px solid var(--rule);
}
.limits h3{font-size:1.02rem;margin:.55rem 0 .9rem}
.limits ul{margin:0;padding:0;list-style:none;display:grid;gap:.6rem}
.limits li{position:relative;padding-left:1.1rem;font-size:.87rem;color:var(--fg2);line-height:1.7}
.limits li::before{
  content:"";position:absolute;left:0;top:.62em;
  width:.36rem;height:.36rem;border-radius:99px;background:var(--warn);
}

/* ── 方案：無 JavaScript 時兩組都顯示 ────────────────────
   .has-plan-toggle 由 okross.js 掛在 <html> 上。沒有 JS 就沒有這個
   class，兩組方案與各自的小標都留著，訪客仍然看得到完整價格。 */
.plans-nojs{font-size:.95rem;color:var(--fg3);margin:1.4rem 0 .2rem;grid-column:1/-1}
.has-plan-toggle .plans-nojs{display:none}
.plans[hidden]{display:none}

/* ── 聯絡頁 ─────────────────────────────────────────── */
#contact-form{padding:clamp(2.6rem,6vw,4rem) 0}
.contact-grid{display:grid;gap:2rem}
.contact-form h2{margin:.55rem 0 1.4rem;font-size:1.45rem}
.form-slot{background:var(--g700);border:1px solid var(--rule);border-radius:12px;padding:clamp(1.2rem,3vw,1.9rem)}
/* ── Forminator 深色底覆寫 ─────────────────────────────
   Forminator 的 material 設計是為淺色底做的：輸入框淺灰底黑字、
   送出鈕是它自己的藍色。放在深色頁面上會像貼了一張別的網站進來。

   必須加 !important —— Forminator 自己的規則就帶 !important，
   單靠選擇器順序蓋不過去（實測過，不加就完全沒有效果）。
   只改顏色，不動它的版面與間距，這樣外掛更新時不容易打架。

   select 是 select2 元件：原生 <select> 被隱藏，畫面上是另外渲染的
   div，所以要分開寫一組。 */

/* ⚠ 表單容器自己也有底色,而且是每張表單各自產生的樣式表給的
   （style-<表單ID>.css 裡的 `#forminator-module-<ID>`）。那來自
   Forminator 後台的「外觀」設定,住在資料庫裡,不會跟著 zip 走。

   正式站 867 那張設的是 #3F414E（藍灰）。疊在 .form-slot 的
   --g700 卡片上,就變成深色站上貼了一塊淺藍灰的板子,而且圓角與
   內距都是雙層的。

   拿掉它,讓 .form-slot 這張卡片自己當表面就好。
   選擇器是 ID（1,0,0）,class 蓋不過去,所以這裡的 !important 是必要的。

   本機測不出來:本機用的是自建替身表單（ID 23）,沒有這層設定。
   這是 2026-09-10 上線後在正式站上實際看到才發現的。 */
.form-slot .forminator-custom-form{
  background:transparent !important;
  padding:0 !important;
  border-radius:0 !important;
  box-shadow:none !important;
}

.form-slot .forminator-input,
.form-slot .forminator-textarea,
.form-slot input[type="text"],
.form-slot input[type="email"],
.form-slot input[type="url"],
.form-slot input[type="tel"],
.form-slot input[type="date"],
.form-slot textarea{
  background:var(--g600) !important;color:var(--fg) !important;
  border-color:var(--rule-2) !important;border-radius:8px !important;
}
.form-slot .forminator-input:focus,
.form-slot .forminator-textarea:focus,
.form-slot textarea:focus{border-color:var(--brand) !important;box-shadow:0 0 0 1px var(--brand) !important}
.form-slot ::placeholder{color:var(--fg3) !important;opacity:1}

/* 標籤原本是 #777，在深色底上對比只有 3.9，低於 WCAG AA 的 4.5 */
.form-slot .forminator-label,
.form-slot label{color:var(--fg2) !important}
.form-slot .forminator-required{color:var(--down) !important}
.form-slot .forminator-description{color:var(--fg3) !important}

/* ── select2 下拉 ───────────────────────────────────────
   兩件事要分開處理：
   1. 頁面上那顆「顯示框」在表單裡，可以用 .form-slot 限定。
   2. 展開後的「選單面板」被 select2 掛到 <body> 底下，不在表單裡 ——
      所以那組選擇器不能加 .form-slot 前綴，否則永遠不會匹配。
      這正是先前白底白字的原因：字色套到了，底色沒有。 */
.form-slot .select2-selection{
  background:var(--g600) !important;border-color:var(--rule-2) !important;border-radius:8px !important;
}
.form-slot .select2-selection__rendered{color:var(--fg) !important}
.form-slot .select2-selection__placeholder{color:var(--fg3) !important}
.form-slot .select2-selection__arrow b{border-top-color:var(--fg3) !important}

/* 展開後的面板類別是 .forminator-select-dropdown —— Forminator 用的是
   改名過的 select2 分支（jQuery 上掛的是 FUIselect2），原版的
   .select2-dropdown 在這裡根本不存在。先前只有字色套上去、底色沒有，
   結果就是淺字配淺底，整個選單讀不到。 */
.forminator-select-dropdown,
.forminator-select-dropdown .select2-results,
.forminator-select-dropdown .select2-results__options{
  background:var(--g700) !important;border-color:var(--rule-2) !important;
}
.forminator-select-dropdown{border-radius:8px !important;overflow:hidden}
.forminator-select-dropdown .select2-results__option{
  background:transparent !important;color:var(--fg) !important;
}
.forminator-select-dropdown .select2-results__option--highlighted,
.forminator-select-dropdown .select2-results__option--selected,
.forminator-select-dropdown .select2-results__option[aria-selected="true"]{
  background:var(--brand) !important;color:var(--brand-ink) !important;
}
.forminator-select-dropdown .select2-search__field{
  background:var(--g600) !important;color:var(--fg) !important;border-color:var(--rule-2) !important;
}
.forminator-select-dropdown .select2-results__message{color:var(--fg3) !important}

/* ── 是非題清單 ─────────────────────────────────────────
   表單後半有八題「是／否」的準備度清單。Forminator 預設把題目放一列、
   兩個選項放下一列,每題 50px 再加 30px 列距 —— 八題就吃掉 640px,
   訪客滑到這裡只會看到一片重複的圓圈,是整張表單最容易放棄的地方。

   改成題目與選項同一列、選項靠右對齊成一直行,變成可以一眼掃完的清單。
   實測表單總高 1721px → 1204px。

   :has() 用來只挑出含 radio 的欄位 —— 不能用欄位順序或 nth-child,
   那會在表單改題目時默默錯位。 */
.form-slot .forminator-row:has(.forminator-radio-inline){margin-bottom:.5rem !important}
.form-slot .forminator-field:has(.forminator-radio-inline){
  display:flex !important;align-items:center;gap:.35rem .9rem;flex-wrap:wrap;
  padding:.5rem 0;border-bottom:1px solid var(--rule);
}
.form-slot .forminator-field:has(.forminator-radio-inline) > .forminator-label{
  flex:1 1 13rem;min-width:0;margin:0 !important;line-height:1.5;
}
.form-slot .forminator-radio-inline{margin:0 !important}
/* 選項推到最右邊,八題的「是」對齊成一直行才掃得快 */
.form-slot .forminator-field:has(.forminator-radio-inline) .forminator-radio-inline:nth-of-type(1){
  margin-left:auto !important;
}

/* 選項圈原本是 #E04562（紅）—— Forminator 的預設強調色,在深色底上
   像在報錯。checkbox 早就覆寫過了,radio 一直沒有。 */
.form-slot .forminator-radio-bullet{
  background:var(--g600) !important;border-color:var(--rule-2) !important;
}
.form-slot input[type="radio"]:checked + .forminator-radio-bullet{border-color:var(--brand) !important}
.form-slot input[type="radio"]:checked + .forminator-radio-bullet::before,
.form-slot input[type="radio"]:checked + .forminator-radio-bullet::after{
  background:var(--brand) !important;border-color:var(--brand) !important;
}

/* ── 同意條款 ───────────────────────────────────────────
   ⚠ 這一段在 2026-09-11 重寫過。舊版把 __wrapper 鎖成 width:20px,
   在本機的替身表單（ID 23）上沒問題,因為那張表的 __wrapper 只裝打勾
   方塊。但正式站 867 的 __wrapper 同時裝著方塊「與」同意文字 ——
   被鎖成 20px 之後,文字被擠成 70px 寬、折成六行,直接蓋在中文標籤上。

   現在不鎖寬度,改成讓欄位本身當 flex 容器:方塊在前、中文標籤在後。

   英文那句 "Yes, I agree with the privacy policy and terms and
   conditions." 不顯示 —— 它與中文標籤講的是同一件事,兩句並排是雜訊。
   ⚠ 但它仍然是 Forminator 記錄下來的同意文字（存在資料庫裡）。
     要讓「看到的」與「記錄的」一致,得到 Forminator → 表單 867 →
     那個 consent 欄位把英文句改掉。CSS 只能改顯示,改不了紀錄。 */
.form-slot .forminator-field-consent .forminator-field{
  display:flex !important;align-items:flex-start;gap:.6rem;flex-wrap:nowrap;
}
.form-slot .forminator-field-consent .forminator-checkbox__wrapper{
  order:0 !important;flex:none !important;
  width:auto !important;min-width:0 !important;margin:.1rem 0 0 !important;
}
.form-slot .forminator-field-consent .forminator-checkbox__label{display:none !important}
.form-slot .forminator-field-consent .forminator-label{
  order:1;flex:1 1 auto;min-width:0;margin:0 !important;line-height:1.6;
}
.form-slot .forminator-field-consent .forminator-required{order:2;flex:none}

/* 送出鈕原本 margin-top 是 0,緊貼在同意條款那一列下面 ——
   最後一個動作與上面的欄位之間需要呼吸空間,否則會像誤觸的按鈕。 */
.form-slot .forminator-button-submit{margin-top:1.2rem !important}
.form-slot .forminator-field-consent .forminator-consent{margin:0 !important}
.form-slot .forminator-field-consent .forminator-label{
  margin:0 !important;line-height:1.6;cursor:pointer;
}
.form-slot .forminator-checkbox span,
.form-slot .forminator-consent span{color:var(--fg2) !important}

/* 方塊本身原本是淺灰底，在深色表單裡是整頁最亮的一塊，很搶眼。
   勾選後轉成品牌綠，讓「已同意」一眼看得出來。 */
.form-slot .forminator-checkbox-box{
  background:var(--g600) !important;border-color:var(--rule-2) !important;border-radius:4px !important;
}
.form-slot input[type="checkbox"]:checked + .forminator-checkbox-box,
.form-slot input[type="radio"]:checked + .forminator-checkbox-box{
  background:var(--brand) !important;border-color:var(--brand) !important;color:var(--brand-ink) !important;
}
.form-slot input[type="checkbox"]:checked + .forminator-checkbox-box::before,
.form-slot input[type="checkbox"]:checked + .forminator-checkbox-box::after{
  color:var(--brand-ink) !important;border-color:var(--brand-ink) !important;
}
.form-slot input[type="checkbox"]:focus-visible + .forminator-checkbox-box{
  outline:2px solid var(--brand);outline-offset:2px;
}

/* 送出鈕換成品牌綠。這是整頁唯一的主要動作，不該是外掛的預設藍。 */
.form-slot .forminator-button-submit{
  background:var(--brand) !important;color:var(--brand-ink) !important;
  border:0 !important;font-weight:700 !important;border-radius:8px !important;
}
.form-slot .forminator-button-submit:hover{filter:brightness(1.09)}

/* 錯誤訊息 */
.form-slot .forminator-error-message,
.form-slot .forminator-response-message.forminator-error{color:var(--down) !important}
.form-fallback{background:var(--g700);border:1px solid var(--rule);border-radius:12px;padding:1.6rem}
.form-fallback p{color:var(--fg2);font-size:.94rem;margin-bottom:1.1rem}

.contact-side{display:grid;gap:1rem;align-content:start}
.info-card{background:var(--g700);border:1px solid var(--rule);border-radius:12px;padding:1.4rem}
.info-card .muted{font-size:.88rem;margin:.7rem 0 0}
.info-card .cta{margin-top:1rem}
.info-list{list-style:none;margin:.9rem 0 0;padding:0;display:grid;gap:.85rem}
.info-list .k{display:block;font-size:.74rem;color:var(--fg3);margin-bottom:.2rem}
.info-list .v{font-size:.94rem;color:var(--fg);word-break:break-word}
.info-list a.v:hover{color:var(--brand)}
.steps{list-style:none;margin:.9rem 0 0;padding:0;display:grid;gap:1rem;counter-reset:step}
.steps li{display:flex;gap:.85rem;align-items:flex-start}
.steps .n{color:var(--brand);font-size:.78rem;flex:none;padding-top:.15rem}
.steps b{display:block;font-size:.92rem;margin-bottom:.25rem}
.steps p{font-size:.85rem;color:var(--fg2);line-height:1.7}
@media(min-width:62rem){
  .contact-grid{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);gap:2.6rem;align-items:start}
}

/* ── 頁尾 ───────────────────────────────────────────── */
.foot-cols{display:grid;gap:2rem;padding-bottom:2rem}
.foot-brand .muted{font-size:.85rem}
.foot-links{list-style:none;margin:.85rem 0 0;padding:0;display:grid;gap:.5rem;font-size:.88rem}
.foot-links a{color:var(--fg2)}
.foot-links a:hover{color:var(--brand)}
.foot-links .muted{font-size:.85rem}
.foot-btm{padding-top:1.2rem;border-top:1px solid var(--rule)}
.foot-btm .muted{font-size:.8rem}
@media(min-width:52rem){
  .foot-cols{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) minmax(0,1fr);gap:3rem}
}
@media(max-width:640px){
  .page-hd{padding:4rem 0 2.2rem}
}

/* ── 一鍵複製 ───────────────────────────────────────────
   mailto:／tel: 對沒設定預設程式的人是無效的，複製才是保底的那條路。 */
.v-row{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap}
.copy{
  flex:none;cursor:pointer;font:inherit;font-size:.72rem;line-height:1;
  padding:.34rem .55rem;border-radius:6px;
  background:transparent;color:var(--fg3);border:1px solid var(--rule-2);
  transition:color .15s ease,border-color .15s ease,background .15s ease;
}
.copy:hover{color:var(--brand);border-color:var(--brand)}
.copy:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.copy.is-copied{color:var(--brand-ink);background:var(--brand);border-color:var(--brand)}
/* 失敗不能長得像成功 —— 用提醒色，並提示改用手動選取 */
.copy.is-failed{color:var(--warn);border-color:var(--warn);background:transparent}
.form-fallback .info-list{margin-top:1.1rem}

/* 方案切換鈕下方的補充說明（6 個月選項沒有公開價格） */
.term-note{margin-top:.9rem;font-size:.82rem;color:var(--fg3);line-height:1.7}

/* ── 服務平台列 ─────────────────────────────────────────
   層次靠字級與顏色，不靠標誌 —— 主力平台亮、其他暗，
   一眼看得出主次，又不會讓準備填表的人分心去想別的平台。 */
/* 間距刻意收緊:加了站點列之後,首屏那三個數字(50+/200+/7+)會被推到
   摺線以下。那是最重要的社會證明,不能掉出第一畫面。 */
.platforms{
  display:flex;align-items:center;flex-wrap:wrap;gap:.45rem .7rem;
  margin-top:1.1rem;padding-top:.85rem;border-top:1px solid var(--rule);
}
.pf-lead{font-family:var(--mono);font-size:.68rem;letter-spacing:.14em;text-transform:uppercase;color:var(--fg3)}
.pf{font-size:.92rem;color:var(--fg2);letter-spacing:.01em}
.pf-main{
  font-size:1.12rem;font-weight:700;color:var(--fg);letter-spacing:-.01em;
}
.pf-sep{width:1px;height:.9rem;background:var(--rule-2);margin:0 .25rem}
@media(max-width:520px){
  .pf-sep{display:none}
  .platforms{gap:.4rem .6rem}
}

/* 看板上的站點標籤 —— 讓看板從「通用儀表板」變成「某個真實帳號」 */
.site{
  font-family:var(--mono);font-size:.68rem;letter-spacing:.06em;
  color:var(--brand);border:1px solid color-mix(in srgb,var(--brand) 38%,transparent);
  border-radius:4px;padding:.1rem .4rem;
}

/* feed 的標題：把「AI 驅動」從形容詞變成看得見的證據 */
.feed-hd{
  display:flex;align-items:baseline;gap:.6rem;
  padding:.75rem 1.1rem .1rem;border-top:1px solid var(--rule);
}
.feed-hd-note{margin-left:auto;color:var(--fg3);text-transform:none;letter-spacing:.02em}

/* 站點列 —— 與平台列同一套層次語彙，但上方不再畫分隔線，
   兩行視覺上屬於同一組資訊。 */
.platforms.sites{margin-top:.5rem;padding-top:0;border-top:0}
.pf-site-main{color:var(--fg) !important;font-weight:650}
/* 主力站的小標籤 */
.pf-site-main em{
  font-style:normal;margin-left:.3rem;font-size:.66rem;letter-spacing:.06em;
  color:var(--brand);border:1px solid color-mix(in srgb,var(--brand) 38%,transparent);
  border-radius:4px;padding:.06rem .28rem;vertical-align:.1em;
}
/* 次要平台後面掛的站點範圍,用暗色小字避免搶掉主力平台 */
.pf i{font-style:normal;margin-left:.32rem;font-size:.74rem;color:var(--fg3)}

/* ── 服務平台與站點 ─────────────────────────────────── */
.mkts{margin-top:1.6rem;padding:1.5rem;border-radius:12px;background:var(--g700);border:1px solid var(--rule)}
.mkts h3{font-size:1.02rem;margin:.55rem 0 1.2rem}
.mkt-row{padding:1rem 0;border-top:1px solid var(--rule)}
.mkt-row:first-of-type{border-top:0;padding-top:0}
.mkt-pf{display:flex;align-items:center;gap:.55rem;margin-bottom:.75rem}
.mkt-pf .nm{font-size:1rem;color:var(--fg2);font-weight:650}
.mkt-row.main .mkt-pf .nm{font-size:1.14rem;color:var(--fg)}
.mkt-pf em{
  font-style:normal;font-size:.68rem;letter-spacing:.06em;color:var(--brand);
  border:1px solid color-mix(in srgb,var(--brand) 38%,transparent);border-radius:4px;padding:.06rem .3rem;
}
.mkts ul{margin:0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:.5rem .6rem}
.mkts li{display:inline-flex;align-items:center;gap:.4rem;font-size:.88rem;color:var(--fg2)}
.mkts li.main{color:var(--fg)}
.mkts .c{
  font-family:var(--mono);font-size:.66rem;letter-spacing:.08em;color:var(--fg3);
  border:1px solid var(--rule-2);border-radius:4px;padding:.12rem .34rem;
}
.mkts li.main .c{color:var(--brand-ink);background:var(--brand);border-color:var(--brand)}
.mkts li.main .n{font-weight:650}
.mkts-note{margin-top:1.1rem;padding-top:.9rem;border-top:1px solid var(--rule);font-size:.83rem;color:var(--fg3);line-height:1.75}

/* ── 關於頁 ─────────────────────────────────────────── */
/* 數字在關於頁不需要跟首屏一樣緊湊，給它多一點呼吸 */
.about-trust{margin-top:2.4rem;padding-top:1.8rem;border-top:1px solid var(--rule)}

/* 「我們不做的事」沿用服務頁的 .limits 版型，只多一個標題行 */
.limits li b{color:var(--fg);font-weight:650;display:inline-block;margin-bottom:.2rem}

/* 客戶回饋 */
.voice{
  margin:0;padding:clamp(1.4rem,3vw,2rem);border-radius:12px;
  background:var(--g700);border:1px solid var(--rule);
  border-left:2px solid var(--brand);
}
.voice blockquote{margin:0}
.voice .q{
  font-size:clamp(1.05rem,2.2vw,1.28rem);font-weight:650;color:var(--fg);
  line-height:1.5;margin-bottom:.9rem;
}
.voice blockquote p{color:var(--fg2);font-size:.92rem;line-height:1.85}
.voice figcaption{
  margin-top:1.1rem;padding-top:.85rem;border-top:1px solid var(--rule);
  font-family:var(--mono);font-size:.72rem;letter-spacing:.08em;color:var(--fg3);
}

/* ── 社群 / 通訊連結 ─────────────────────────────────────
   圖示吃 currentColor，所以顏色與 hover 由連結本身決定，
   不必為每個平台各寫一組顏色。 */
.soc{display:inline-flex;align-items:center;gap:.45rem}
.soc svg{width:1.05rem;height:1.05rem;flex:none;color:currentColor}
.foot-links .soc{color:var(--fg2)}
.foot-links .soc:hover{color:var(--brand)}
.chan{list-style:none;margin:.9rem 0 0;padding:0;display:grid;gap:.7rem}
.chan li{display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap}
.chan .soc{color:var(--fg);font-size:.94rem}
.chan .soc:hover{color:var(--brand)}
.chan em{font-style:normal;font-size:.76rem;color:var(--fg3)}

/* ── 文章內頁 ───────────────────────────────────────── */
.article .art-hd{padding-bottom:2.2rem}
.art-cat{
  display:inline-block;color:var(--brand) !important;text-decoration:none;
  border:1px solid color-mix(in srgb,var(--brand) 38%,transparent);
  border-radius:5px;padding:.16rem .5rem;
}
.art-cat:hover{background:var(--brand);color:var(--brand-ink) !important}
.art-hd h1{max-width:32ch}
.art-meta{
  display:flex;flex-wrap:wrap;gap:.4rem 1.1rem;margin-top:1.2rem;
  font-family:var(--mono);font-size:.74rem;color:var(--fg3);
}
.art-wrap{padding:clamp(2.2rem,5vw,3.2rem) var(--pad)}

/* 內文排版。WordPress 產出的是一般 HTML，所以這裡要把 h2/h3/p/ul/圖片
   等等全部定義一次 —— 沒定義的話會吃到瀏覽器預設值，在深色底上
   會出現藍色連結、過小的行高、貼在一起的段落。 */
.entry-content{max-width:44rem;margin:0 auto;color:var(--fg2);font-size:1.02rem;line-height:1.95}
.entry-content > * + *{margin-top:1.3rem}
.entry-content h2{
  margin-top:2.6rem;font-size:clamp(1.3rem,2.6vw,1.6rem);color:var(--fg);
  line-height:1.4;scroll-margin-top:5rem;
}
.entry-content h3{margin-top:2rem;font-size:1.12rem;color:var(--fg);line-height:1.5}
.entry-content h4{margin-top:1.7rem;font-size:1rem;color:var(--fg)}
.entry-content a{color:var(--brand);text-decoration:underline;text-underline-offset:.2em;text-decoration-thickness:1px}
.entry-content a:hover{text-decoration-color:var(--brand)}
.entry-content strong,.entry-content b{color:var(--fg);font-weight:650}
.entry-content ul,.entry-content ol{padding-left:1.3rem;display:grid;gap:.55rem}
.entry-content li::marker{color:var(--brand)}
.entry-content img,.entry-content figure img{
  max-width:100%;height:auto;border-radius:10px;display:block;
}
.entry-content figure{margin-left:0;margin-right:0}
.entry-content figcaption{margin-top:.6rem;font-size:.8rem;color:var(--fg3);text-align:center}
.entry-content blockquote{
  margin-left:0;margin-right:0;padding:1rem 1.2rem;border-left:2px solid var(--brand);
  background:var(--g700);border-radius:0 8px 8px 0;color:var(--fg2);
}
.entry-content blockquote p{margin:0}
.entry-content code{
  font-family:var(--mono);font-size:.88em;background:var(--g700);
  border:1px solid var(--rule);border-radius:4px;padding:.1em .35em;color:var(--fg);
}
.entry-content pre{
  background:var(--g900);border:1px solid var(--rule);border-radius:10px;
  padding:1rem;overflow-x:auto;
}
.entry-content pre code{background:none;border:0;padding:0}
.entry-content hr{border:0;border-top:1px solid var(--rule);margin:2.4rem 0}
.entry-content table{width:100%;border-collapse:collapse;font-size:.92rem;display:block;overflow-x:auto}
.entry-content th,.entry-content td{border:1px solid var(--rule);padding:.6rem .8rem;text-align:left}
.entry-content th{background:var(--g700);color:var(--fg);font-weight:650}

/* ── 文章列表 / 分類頁 ──────────────────────────────── */
#post-list{padding:clamp(2.2rem,5vw,3.4rem) 0}
#post-list .posts{margin-top:0}
.empty{color:var(--fg3);font-size:.94rem}
.pagination,.nav-links{
  display:flex;flex-wrap:wrap;gap:.5rem;margin-top:2.2rem;
  font-family:var(--mono);font-size:.82rem;
}
.pagination .page-numbers,.nav-links .page-numbers{
  padding:.45rem .75rem;border:1px solid var(--rule);border-radius:7px;
  color:var(--fg2);text-decoration:none;
}
.pagination .page-numbers:hover,.nav-links .page-numbers:hover{border-color:var(--brand);color:var(--brand)}
.pagination .page-numbers.current,.nav-links .page-numbers.current{
  background:var(--brand);border-color:var(--brand);color:var(--brand-ink);
}
.screen-reader-text{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ── 客戶案例輪播 ───────────────────────────────────────
   用原生 scroll-snap，不引輪播套件。軌道刻意超出 .wrap，
   靠 padding 對齊 —— 卡片能一路滑到螢幕邊緣，那個「右邊還有東西」
   的視覺線索是讓人知道可以滑的關鍵。 */
.rail{
  display:flex;gap:1rem;overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory;scroll-padding-left:max(var(--pad),(100vw - 74rem)/2 + var(--pad));
  padding:0 var(--pad) .5rem;margin-top:.4rem;
  scrollbar-width:thin;scrollbar-color:var(--rule-2) transparent;
}
@media(min-width:calc(74rem + 2 * 1.25rem)){
  .rail{padding-left:calc((100vw - 74rem)/2 + var(--pad));padding-right:calc((100vw - 74rem)/2 + var(--pad))}
}
.rail::-webkit-scrollbar{height:6px}
.rail::-webkit-scrollbar-thumb{background:var(--rule-2);border-radius:99px}
.rail::-webkit-scrollbar-track{background:transparent}
.rail:focus-visible{outline:2px solid var(--brand);outline-offset:3px}

/* 卡片：數字先行。第一版把數字排在最底下,讀者掃過去先看到的
   全是鋪陳 —— 視覺層級是反的。 */
.case-card{
  /* flex-grow 讓卡片在桌機延展填滿容器,右緣才會與下方引言區切齊;
     手機上沒有多餘空間可分配,所以仍維持 80vw 並可橫向捲動。 */
  flex:1 0 min(21rem,80vw);scroll-snap-align:start;
  background:var(--g700);border:1px solid var(--rule);border-radius:12px;
  padding:1.5rem;display:flex;flex-direction:column;
}
.case-top{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:1.1rem}
.case-no{font-family:var(--mono);font-size:.66rem;letter-spacing:.12em;color:var(--fg3)}
.case-site{
  font-family:var(--mono);font-size:.64rem;letter-spacing:.08em;color:var(--brand);
  border:1px solid color-mix(in srgb,var(--brand) 32%,transparent);
  border-radius:4px;padding:.08rem .34rem;
}
/* 整張卡唯一該被一眼看到的東西 */
.case-hero{display:flex;align-items:baseline;gap:.5rem}
.case-hero .v{
  font-size:clamp(2.1rem,4.5vw,2.6rem);font-weight:700;color:var(--brand);
  letter-spacing:-.035em;line-height:1;
}
.case-hero .k{font-size:.8rem;color:var(--fg3)}
.case-detail{
  margin-top:.55rem;font-size:.82rem;color:var(--fg2);letter-spacing:-.01em;
}
.case-card h3{
  margin-top:1.2rem;padding-top:1.1rem;border-top:1px solid var(--rule);
  font-size:1.05rem;color:var(--fg);
}
/* 起點 → 解法。方向感靠顏色與箭頭,不靠「起點」「我們做了」這些標籤 ——
   一張卡上六七個灰色小標籤會互相搶注意力,結果誰都不突出。 */
.case-arc{margin-top:.7rem;display:grid;gap:.45rem}
.case-arc .from{font-size:.86rem;color:var(--fg3);line-height:1.7}
.case-arc .did{font-size:.86rem;color:var(--fg2);line-height:1.7}
.case-arc .did span{color:var(--brand);font-weight:700;margin-right:.15rem}
.case-foot{
  margin-top:auto;padding-top:1.1rem;display:flex;flex-wrap:wrap;gap:.3rem .9rem;
  font-family:var(--mono);font-size:.7rem;color:var(--fg3);
}

/* ── 案例卡的 3D 懸浮與玻璃質感 ─────────────────────────────
   兩件事分開設閘，因為成本落在完全不同的地方。

   傾斜：純 transform，走合成器，不觸發版面重算。門檻是「有沒有
   精確指標」而不是螢幕寬度 —— 觸控裝置根本沒有 hover 這個狀態，
   寫了也不會觸發，但寫在媒體查詢外面會讓每張卡都多一層合成層。

   玻璃：門檻用 56rem(≈900px)，跟 okross.js 那片 WebGL 的桌機門檻
   同一個數字。不是新發明的斷點,是沿用已經做過的判斷。

   ⚠ 這裡刻意「沒有」backdrop-filter。實測過 18px / 8px / 完全不模糊
   三種,在這個版面上看不出任何差別 —— 因為卡片背後只有 #cases::before
   那片已經模糊過的漸層,模糊沒有東西可以抹。模糊真正的工作是「當背後
   有細節時保護卡片內容的可讀性」,把文字放到卡片後面就立刻看得出差別。
   所以:只要背後維持是受控的平滑漸層,就不需要 backdrop-filter,
   省下每幀重新取樣整張卡的成本。
   → 若之後有人在案例區背後放圖片或任何有細節的東西,必須把
     backdrop-filter:blur(12px) 加回來,否則卡片內容會讀不了。 */

@media (hover:hover) and (pointer:fine){
  .case-card{
    --rx:0deg; --ry:0deg; --mx:50%; --my:50%; --lift:0;
    position:relative;
    transform:perspective(900px) rotateX(var(--rx)) rotateY(var(--ry))
              translate3d(0,calc(var(--lift) * -6px),0)
              scale(calc(1 + var(--lift) * .012));
    transform-style:preserve-3d;
    /* 只轉場 transform 與陰影 —— 兩者都不會觸發版面重算 */
    transition:transform .35s cubic-bezier(.22,.8,.3,1),
               box-shadow .35s cubic-bezier(.22,.8,.3,1),
               border-color .35s ease;
  }
  /* will-change 只在 hover 期間掛著。一直掛等於永久佔用一層合成層,
     三張卡就是三層,那是純粹的記憶體浪費。 */
  .case-card:hover{will-change:transform}

  /* 深色底上不用黑影 —— 在 #070B09 上黑影看不見,只會讓卡片變髒。
     用品牌綠的暈,亮度差才做得出「浮起來」的錯覺。 */
  .case-card:hover{
    border-color:color-mix(in srgb,var(--brand) 30%,var(--rule));
    box-shadow:
      0 1px 0 0 color-mix(in srgb,var(--brand) 14%,transparent) inset,
      0 18px 40px -22px color-mix(in srgb,var(--brand) 40%,transparent),
      0 4px 14px -8px rgba(0,0,0,.55);
  }

  /* 跟著游標的鏡面高光。疊一層 ::after,不動卡片本身的背景 */
  .case-card::after{
    content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
    background:radial-gradient(38rem 22rem at var(--mx) var(--my),
      color-mix(in srgb,var(--brand) 9%,transparent), transparent 62%);
    opacity:0;transition:opacity .3s ease;
  }
  .case-card:hover::after{opacity:1}

  /* 內容浮起一層。3D 的說服力來自層次差,不是傾斜角度 —— 角度再大
     只會露出卡片邊緣的破綻,而且從「精緻」變成「花俏」。 */
  .case-top{transform:translateZ(34px)}
  .case-hero, .case-card h3{transform:translateZ(26px)}
  .case-detail{transform:translateZ(16px)}

  /* .rail 是 overflow-x:auto,垂直方向一樣會裁切 —— 卡片浮起來的
     6px 與綠暈會被切掉。補上內距讓它有地方可浮,再用外距與下方
     .voices 的間距各扣回來,版面位置一模一樣。 */
  .rail{padding-top:1.25rem;margin-top:-.85rem;padding-bottom:1.75rem}
  .voices{margin-top:.35rem}
}

/* 減少動態偏好:傾斜與轉場全部關掉,只留靜態的邊框變化。
   玻璃不是動態,可以留著。 */
@media (prefers-reduced-motion:reduce){
  .case-card{transform:none !important;transition:border-color .2s ease !important}
  .case-card::after{display:none}
  .case-top,.case-hero,.case-card h3,.case-detail{transform:none}
}

/* ── 玻璃：桌機限定 ─────────────────────────────────────
   玻璃要有東西可以折射才成立。案例區原本的背景是純色 --g900,
   蓋上半透明只會變成「比較淡的深灰」,看不出玻璃感 ——
   所以要先在後面鋪一層有明暗變化的光暈。玻璃是兩個東西的成本。

   光暈強度 7% 是量出來的,不是挑好看的:小字 --fg3 疊在光暈最亮處
   的對比度,7% 是 4.21、10% 是 4.09、16% 是 3.82。實心卡現況是 4.19。
   7% 是唯一「不讓現有可讀性變差」的強度。 */
@media (min-width:56rem) and (hover:hover) and (pointer:fine){
  #cases{position:relative;isolation:isolate}
  #cases::before{
    content:"";position:absolute;inset:-8% -4%;z-index:-1;pointer-events:none;
    background:
      radial-gradient(30rem 20rem at 18% 24%, color-mix(in srgb,var(--brand) 7%,transparent), transparent 70%),
      radial-gradient(26rem 18rem at 80% 40%, color-mix(in srgb,#3AA0FF 6%,transparent), transparent 70%),
      radial-gradient(34rem 22rem at 52% 86%, color-mix(in srgb,var(--brand) 5%,transparent), transparent 72%);
    filter:blur(38px);
  }

  .case-card{
    background:color-mix(in srgb,var(--g700) 52%,transparent);
    border-color:color-mix(in srgb,#FFFFFF 9%,transparent);
  }
  /* 玻璃的厚度是靠邊緣那條亮線表現的,不是靠模糊。
     用 mask-composite 只留 1px 的框,不遮住卡片內容。 */
  .case-card::before{
    content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
    padding:1px;
    background:linear-gradient(160deg,
      color-mix(in srgb,#FFFFFF 10%,transparent) 0%,
      transparent 32%, transparent 68%,
      color-mix(in srgb,#FFFFFF 4%,transparent) 100%);
    mask:linear-gradient(#000,#000) content-box, linear-gradient(#000,#000);
    mask-composite:exclude;-webkit-mask-composite:xor;
  }
}

.rail-nav{display:none;gap:.4rem}
@media(min-width:52rem){.rail-nav{display:flex}}
/* JS 在捲不動時會設 hidden；[hidden] 的預設值贏不過上面的 display:flex */
.rail-nav[hidden]{display:none !important}
.rail-btn{
  width:2.2rem;height:2.2rem;border-radius:8px;cursor:pointer;
  background:transparent;border:1px solid var(--rule-2);color:var(--fg2);
  font-size:.95rem;line-height:1;transition:color .15s ease,border-color .15s ease;
}
.rail-btn:hover:not(:disabled){border-color:var(--brand);color:var(--brand)}
.rail-btn:disabled{opacity:.35;cursor:default}
.rail-btn:focus-visible{outline:2px solid var(--brand);outline-offset:2px}

/* 引言區兩欄:左邊回饋、右邊行動卡片。等寬,與上方三張卡切齊 */
/* 兩欄等高。案例背景移到滿版四格條之後,左右高度差只剩 113px,
   這時 stretch 才成立 —— 先前左欄長 271px,硬拉齊會讓右欄中間裂開。
   多出來的空間交給引言:內文置頂、署名沉到底部,空白變成刻意的留白
   而不是尾巴上的缺口。 */
.voices{display:grid;gap:1rem;margin-top:1.6rem;align-items:stretch}
@media(min-width:58rem){.voices{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.2rem}}
#cases .voice{margin-top:0;max-width:none;display:flex;flex-direction:column}
#cases .voice blockquote{flex:1}
.metric-note{
  background:var(--g800);border:1px solid var(--rule);border-radius:12px;
  padding:clamp(1.4rem,3vw,2rem);display:flex;flex-direction:column;
}
.metric-note h3{margin:.6rem 0 1.1rem;font-size:clamp(1.15rem,2.3vw,1.38rem);line-height:1.45;color:var(--fg)}
.metric-note dl{margin:0;display:grid;gap:.95rem}
/* 小標用等寬字 —— 與下方 .voice-context dt 同一套標籤語彙,讓兩區看起來是同一個系統 */
.metric-note dt{font-family:var(--mono);font-size:.8rem;letter-spacing:.02em;color:var(--brand)}
.metric-note dd{margin:.3rem 0 0;font-size:.88rem;color:var(--fg2);line-height:1.8}
.metric-foot{
  margin-top:auto;padding-top:1.2rem;border-top:1px solid var(--rule);
  font-size:.84rem;color:var(--fg3);line-height:1.8;
}

/* 品類圖示：小、低調、吃 currentColor。它的工作是分辨品類，不是當主視覺 */
.case-id{display:inline-flex;align-items:center;gap:.5rem}
.case-ico{
  display:inline-grid;place-items:center;width:1.8rem;height:1.8rem;flex:none;
  border:1px solid var(--rule-2);border-radius:7px;color:var(--fg2);
  transition:color .18s ease,border-color .18s ease;
}
.case-ico svg{width:1.05rem;height:1.05rem}
.case-card:hover .case-ico{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 45%,transparent)}

/* 案例背景：歐可的敘述，不是客戶的話 —— 用比引言更小、更中性的
   排版把兩者分開，讀者一眼就知道說話的人換了。
   橫排四格：這四項是一個時序（樣態 → 難題 → 做了什麼 → 結果）。 */
.voice-context{
  margin:1.2rem 0 0;padding:1.4rem;border:1px solid var(--rule);border-radius:12px;
  background:var(--g800);display:grid;gap:1.1rem;
}
.voice-context dt{font-family:var(--mono);font-size:.7rem;letter-spacing:.06em;color:var(--brand)}
.voice-context dd{margin:.35rem 0 0;font-size:.85rem;color:var(--fg2);line-height:1.75}
@media(min-width:46rem){.voice-context{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.2rem 2rem}}
@media(min-width:70rem){.voice-context{grid-template-columns:repeat(4,minmax(0,1fr))}}

/* ── 文章 pattern 元件 ───────────────────────────────────
   給 patterns/*.php 用。文章是會一直長出來的內容，每篇都手工排
   重點框、步驟、比較表的話，寫到第三篇就會開始長得不一樣。

   ⚠️ 一律用單一 class 選擇器，不要寫成 `.entry-content .ok-xxx`。
   同一份 okross.css 會被 add_editor_style() 餵進區塊編輯器，而編輯器
   畫布裡沒有 .entry-content 那層包裝 —— 後代選擇器會整組失效，
   pattern 插進去就是一堆沒有樣式的白框，作者根本看不出自己在編什麼。
   ─────────────────────────────────────────────────────── */

.ok-hd{
  font-family:var(--mono);font-size:.67rem;letter-spacing:.17em;
  text-transform:uppercase;color:var(--fg3);
}

/* 本文重點 —— 開頭的 TL;DR。同時也是 AI 引擎最容易整段引用的一塊。 */
.ok-tldr{
  background:var(--g800);border:1px solid var(--rule-2);border-left:3px solid var(--brand);
  border-radius:10px;padding:1.25rem 1.4rem;
}
.ok-tldr > * + *{margin-top:.7rem}
.ok-tldr .ok-hd{color:var(--brand)}
.ok-tldr ul,.ok-tldr ol{margin:0;color:var(--fg2)}

/* 提示 / 風險。兩者只差一個顏色，但語氣差很多：綠色是「這樣做比較好」，
   琥珀色是「不這樣做會出事」。合規、政策、管制品類的內容用後者。 */
.ok-note,.ok-warn{
  background:var(--g700);border:1px solid var(--rule);border-radius:10px;
  padding:1.1rem 1.25rem;
}
.ok-note{border-left:3px solid var(--brand)}
.ok-warn{border-left:3px solid var(--warn)}
.ok-note > * + *,.ok-warn > * + *{margin-top:.45rem}
.ok-note-hd,.ok-warn-hd{
  margin-top:0;font-size:.95rem;font-weight:700;color:var(--fg);
  display:flex;align-items:center;gap:.45rem;line-height:1.5;
}
.ok-note-hd::before,.ok-warn-hd::before{
  content:"";width:.42rem;height:.42rem;border-radius:99px;flex:none;
}
.ok-note-hd::before{background:var(--brand)}
.ok-warn-hd::before{background:var(--warn)}

/* 步驟流程。用 CSS counter 而不是把序號打進文字裡 ——
   中間插一步的時候，作者不必回頭重編後面每一個號碼。 */
.ok-steps{
  list-style:none;padding-left:0;counter-reset:okstep;display:grid;gap:.95rem;
}
.ok-steps li{
  counter-increment:okstep;position:relative;padding-left:2.5rem;color:var(--fg2);
}
.ok-steps li::marker{content:""}
.ok-steps li::before{
  content:counter(okstep,decimal-leading-zero);
  position:absolute;left:0;top:.15rem;width:1.7rem;height:1.7rem;
  display:grid;place-items:center;border-radius:99px;
  background:var(--brand);color:var(--brand-ink);
  font-family:var(--mono);font-size:.7rem;font-weight:700;letter-spacing:.02em;
}
.ok-steps li strong{display:block;color:var(--fg);margin-bottom:.2rem}

/* 表格的橫向捲動要放在外層 figure 上，不要放在 table 上。
   okross.css 上面的 .entry-content table 是 display:block —— 那會讓 table
   失去表格排版，欄位不再撐滿，width:100% 只是把框拉開，右邊留下一塊空白。
   區塊編輯器插入的表格一律包在 figure.wp-block-table 裡，正好可以接手捲動。 */
.wp-block-table{overflow-x:auto}
.wp-block-table table{display:table;width:100%}

/* 比較表。第一欄是列標題，數字對齊，方便掃「哪個比較便宜／比較快」。 */
.ok-table table{font-variant-numeric:tabular-nums}
.ok-table th:first-child,.ok-table td:first-child{
  color:var(--fg);font-weight:650;white-space:nowrap;
}

/* 內文 CTA。放在文章中段而不是只放結尾 —— 讀者是在讀到痛點那一段
   才想找人問，捲到最後才給按鈕就晚了。 */
.ok-cta{
  background:linear-gradient(180deg,var(--g800),var(--g700));
  border:1px solid var(--rule-2);border-radius:12px;padding:1.6rem;text-align:center;
}
.ok-cta > *{margin-top:.65rem}
.ok-cta > :first-child{margin-top:0}
.ok-cta h3,.ok-cta .ok-cta-hd{
  margin-top:0;font-size:1.15rem;font-weight:750;color:var(--fg);
  letter-spacing:-.02em;line-height:1.4;
}
.ok-cta p{color:var(--fg2);font-size:.95rem}
.ok-cta .wp-block-buttons{
  display:flex;flex-wrap:wrap;gap:.6rem;justify-content:center;margin-top:1.1rem;
}
.ok-cta .wp-block-button__link{
  background:var(--brand);color:var(--brand-ink);font-weight:700;font-size:.9rem;
  padding:.6rem 1.1rem;border-radius:6px;text-decoration:none;
  display:inline-flex;align-items:center;
}
.ok-cta .wp-block-button.is-style-outline .wp-block-button__link,
.ok-cta .wp-block-button__link.has-transparent-background-color{
  background:transparent;color:var(--fg);border:1px solid var(--rule-2);
}

/* 資料來源。歐可的定位是「查證過的」，那就要看得到出處 ——
   對 AI 引擎來說，標明出處的頁面也比較容易被當成可引用的來源。 */
.ok-sources{
  border-top:1px solid var(--rule);padding-top:1.1rem;font-size:.88rem;
}
.ok-sources > * + *{margin-top:.55rem}
.ok-sources ol,.ok-sources ul{margin:0;color:var(--fg3)}
.ok-sources a{color:var(--fg2)}

/* ── 搜尋表單 ───────────────────────────────────────────
   searchform.php 用，搜尋結果頁與 404 頁共用。 */
.ok-search{display:flex;gap:.5rem;max-width:32rem;margin-top:1.4rem}
.ok-search input[type=search]{
  flex:1;min-width:0;background:var(--g800);border:1px solid var(--rule-2);
  border-radius:6px;padding:.62rem .85rem;color:var(--fg);font-size:.95rem;
  -webkit-appearance:none;appearance:none;
}
.ok-search input[type=search]::placeholder{color:var(--fg3)}
.ok-search input[type=search]:focus{outline:none;border-color:var(--brand)}
.ok-search .btn{flex:none}

/* 404 的出口卡片沒有分類與日期，.post 的 meta 間距會留下一塊空白。 */
.sub-page .posts .post > h3:first-child{margin-top:0}
