:root{
  --paper:#F6F6F4; --paper-2:#FAFAF8; --card:#FFFFFF;
  --ink:#1C1B19; --ink-soft:#4A4742; --muted:#8B877E;
  --accent:#E85820; --accent-deep:#D14E1A; --teal:#15625A; --gold:#B8862F; --blue:#2C5E8A; --red:#C0392B;
  --line:#E7E5E0; --line-strong:#D6D3CC;
  --side:#FFFFFF; --side-w:212px;
  --shadow:0 1px 2px rgba(28,27,25,.04),0 6px 20px -12px rgba(28,27,25,.10);
  --serif:"Noto Serif TC",serif; --sans:"Noto Sans TC",sans-serif; --mono:"IBM Plex Mono",monospace;
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:var(--sans);background:var(--paper);color:var(--ink);line-height:1.65;font-weight:400;-webkit-font-smoothing:antialiased;font-size:14.5px}
a{color:inherit;text-decoration:none}

/* ===== app shell:左側欄 + 主內容 ===== */
.shell{display:flex;min-height:100vh}
.sidebar{flex:0 0 var(--side-w);display:flex;flex-direction:column;gap:18px;background:var(--side);border-right:1px solid var(--line);padding:22px 14px 16px;position:sticky;top:0;height:100vh;overflow-y:auto}
.brand{font-family:var(--serif);font-weight:900;font-size:21px;letter-spacing:-.01em;padding:0}
.brand:hover{color:var(--accent-deep)}

.side-nav{display:flex;flex-direction:column;gap:18px;flex:1}
.nav-group{display:flex;flex-direction:column;gap:1px}
.nav-title{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:#6E6A61;padding:0 10px;margin-bottom:6px}
.side-nav a{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:8px;font-size:13.5px;color:var(--ink-soft);border-left:2px solid transparent}
.nav-ico{width:18px;height:18px;flex:none}
.brand{display:flex;align-items:center;gap:9px}
.brand-ico{width:28px;height:28px;flex:none;object-fit:contain;display:block}
.brand-full{height:28px;line-height:28px}
.nav-toggle-btn,.nav-scrim,.topbar,.rail-toggle{display:none}
.side-nav a:hover{background:var(--paper);color:var(--ink)}
.side-nav a.on{background:rgba(232,88,32,.07);color:var(--accent-deep);font-weight:500;border-left-color:var(--accent)}
/* super-admin 專屬項目的辨識徽章(放 .nav-label 內,收合時隨 label 一起隱藏)。 */
.nav-super-tag{display:inline-block;margin-left:6px;padding:0 5px;border-radius:5px;font-family:var(--mono);font-size:8.5px;font-weight:500;letter-spacing:.03em;line-height:16px;vertical-align:middle;background:rgba(184,134,47,.15);color:var(--gold)}
.side-nav a.super-only{color:var(--gold)}
.side-nav a.super-only:hover{background:rgba(184,134,47,.08);color:var(--gold)}
.side-nav a.super-only.on{background:rgba(184,134,47,.1);color:var(--gold);border-left-color:var(--gold)}
.side-nav a.super-only.on .nav-super-tag{background:rgba(184,134,47,.22)}
.side-foot{padding:10px 10px 0;border-top:1px solid var(--line)}
.env{font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;color:var(--muted);text-transform:uppercase}

/* 側欄內團隊切換器 */
.team-switch{position:relative;font-size:13px;margin:0 2px}
.team-switch>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--line);border-radius:9px;background:var(--paper);color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500}
.team-switch>summary .caret{margin-left:auto;color:var(--muted);font-size:11px}
.team-switch>summary::-webkit-details-marker{display:none}
.team-switch>summary:hover{border-color:var(--accent)}
.team-switch[open]>summary{border-color:var(--accent);color:var(--accent-deep)}
.team-switch-menu{position:absolute;left:0;right:0;top:calc(100% + 6px);max-height:50vh;overflow:auto;background:var(--card);border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 28px rgba(0,0,0,.10);padding:6px;z-index:30;display:flex;flex-direction:column;gap:2px}
.team-switch-menu .team-filter{flex:none;margin:2px 2px 6px;padding:7px 10px;border:1px solid var(--line);border-radius:7px;background:var(--paper);color:var(--ink);font:inherit;font-size:13px;position:sticky;top:0}
/* flex:none 不能省:menu 是 flex column,a 又因 ellipsis 帶 overflow:hidden,
   min-height:auto 會歸零 → 清單超過 max-height 時整批被壓扁成碎片(super admin 長清單實際踩過) */
.team-switch-menu a{flex:none;display:block;padding:8px 12px;border-radius:7px;color:var(--ink-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.team-switch-menu a[hidden]{display:none}
.team-switch-menu a:hover{background:var(--paper);color:var(--accent-deep)}
.team-switch-menu a.on{color:var(--ink);font-weight:700;background:var(--paper)}

.wrap{flex:1;min-width:0;max-width:1120px;margin:0 auto;padding:34px 36px 64px}
.shell.chromeless .wrap{max-width:640px;padding-top:64px}

/* streaming 失敗的 inline 錯誤 */
.stream-error{background:var(--card);border:1px solid rgba(209,78,26,.35);border-left:3px solid var(--accent-deep);border-radius:10px;padding:18px 22px;margin:18px 0}
.stream-error h2{margin-bottom:6px}

/* 設定頁 */
.settings-section{margin-bottom:34px}
.settings-section>h2{margin-bottom:14px}
.account-card{display:flex;align-items:center;justify-content:space-between;gap:16px;max-width:560px}
.team-head h3,.empty-panel h3{font-family:var(--serif);font-size:18px}
/* 活動卡上的商店標籤(多店) */
.shop-tag{background:var(--paper-2);color:var(--ink-soft);border:1px solid var(--line)}
/* 資料來源頁「需要處理」清單 */
.hint-strip.ing-need{border-left-color:var(--accent-deep);background:rgba(209,78,26,.06)}
/* 全站「未綁定蝦皮」引導列:每頁內容最上方常駐,引導去連結賣場。沿用 .hint-strip 家族的
   左橘邊框 + 淡橘底(反卡片、淡視覺區隔),但比一般提示顯眼一階(品牌橘 + 實心 CTA)。 */
.bind-banner{display:flex;align-items:center;gap:16px;flex-wrap:wrap;background:rgba(232,88,32,.07);border-left:3px solid var(--accent);border-radius:0 8px 8px 0;padding:13px 18px;margin-bottom:22px;color:var(--ink);font-size:14px}
.bind-banner-text{flex:1 1 300px;min-width:240px}
.bind-banner-note{color:var(--ink-soft);margin-left:6px}
.bind-banner-cta{margin-top:0;white-space:nowrap}
.bind-banner-ntag{color:var(--muted);font-size:13px;white-space:nowrap}

/* 平板(≤1024px):sidebar 收成迷你 icon 欄(垂直常駐、只剩圖示)。
   標籤用 clip 視覺隱藏(保留無障礙名稱);title 屬性提供 tooltip。 */
/* 平板(≤1024px):迷你 icon 欄常駐(fixed),內容留 62px 邊距(不跳版);
   點欄上方漢堡 .rail-toggle 把欄展開成完整 icon+文字(overlay 蓋在內容上),
   點遮罩或再按漢堡收回 → 關閉時維持小 sidebar。 */
@media(max-width:1024px){
  .shell{padding-left:62px}
  .sidebar{position:fixed;top:0;left:0;height:100vh;width:62px;flex-basis:auto;padding:14px 8px 12px;align-items:center;gap:12px;overflow:visible;z-index:130;background:var(--side);border-right:1px solid var(--line);transition:width .18s ease}
  .rail-toggle{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:9px;border:1px solid var(--line);background:var(--paper);color:var(--ink);cursor:pointer;flex:none}
  .rail-toggle svg{width:20px;height:20px}
  .brand{justify-content:center;padding:0}
  .brand-full{display:none}
  .side-nav{align-items:stretch;gap:14px;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}
  .nav-group{gap:4px}
  .side-nav a{justify-content:center;gap:0;padding:10px 8px;border-left:none;border-radius:9px}
  .side-nav a.on{background:rgba(232,88,32,.12);border-left:none;color:var(--accent-deep)}
  .nav-label,.team-switch .team-name,.team-switch .caret{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
  /* 收合時:nav-title 小字置中顯示(廣告營運/自動化/系統);展開時恢復正常(base 樣式)。 */
  .nav-toggle-cb:not(:checked) ~ .sidebar .nav-title{text-align:center;font-size:9px;letter-spacing:.02em;padding:0;margin:2px 0 1px;color:var(--muted);white-space:nowrap;overflow:hidden;line-height:1.3}
  /* 收合時:team-switch 顯示成 40px 圖示鈕(team-name/caret clip 隱藏),點開選單往右 flyout。 */
  .nav-toggle-cb:not(:checked) ~ .sidebar .team-switch>summary{height:40px;padding:0 10px;justify-content:center}
  .side-foot{display:none}
  .team-switch>summary{justify-content:center;padding:9px 0}
  .team-switch-menu{left:calc(100% + 8px);right:auto;top:0;width:210px;max-width:none}
  .wrap{padding:34px 24px 64px}
  /* 展開:加寬成完整 sidebar、還原文字、出現遮罩 */
  .nav-toggle-cb:checked ~ .sidebar{width:212px;align-items:stretch;padding:16px 14px 16px;box-shadow:0 10px 40px rgba(0,0,0,.18)}
  .nav-toggle-cb:checked ~ .sidebar .rail-toggle{align-self:flex-start}
  .nav-toggle-cb:checked ~ .sidebar .brand{justify-content:flex-start;padding:0 6px}
  .nav-toggle-cb:checked ~ .sidebar .brand-full{display:inline}
  .nav-toggle-cb:checked ~ .sidebar .nav-label,
  .nav-toggle-cb:checked ~ .sidebar .nav-title,
  .nav-toggle-cb:checked ~ .sidebar .team-switch .team-name,
  .nav-toggle-cb:checked ~ .sidebar .team-switch .caret{position:static;width:auto;height:auto;margin:0;clip:auto;overflow:visible}
  .nav-toggle-cb:checked ~ .sidebar .side-nav a{justify-content:flex-start;gap:10px;padding:7px 10px}
  .nav-toggle-cb:checked ~ .sidebar .team-switch>summary{justify-content:flex-start;padding:8px 10px}
  .nav-toggle-cb:checked ~ .sidebar .team-switch .caret{margin-left:auto}
  .nav-toggle-cb:checked ~ .sidebar .team-switch-menu{left:0;right:0;top:calc(100% + 6px);width:auto}
  .nav-scrim{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:125}
  .nav-toggle-cb:checked ~ .nav-scrim{display:block}
}
/* 手機(≤640px):漢堡 → 滑出式 sidebar 抽屜(覆蓋平板規則,還原完整 icon+文字)。 */
@media(max-width:640px){
  .topbar{display:flex;align-items:center;gap:12px;position:fixed;top:0;left:0;right:0;height:52px;padding:0 12px;background:var(--card);border-bottom:1px solid var(--line);z-index:120}
  .topbar .nav-toggle-btn{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:9px;border:1px solid var(--line);background:var(--paper);color:var(--ink);cursor:pointer;flex:none}
  .topbar .nav-toggle-btn svg{width:22px;height:22px}
  .topbar-brand{display:flex;align-items:center;gap:8px;font-family:var(--serif);font-weight:900;font-size:18px;color:var(--ink)}
  .topbar-brand img{width:24px;height:24px;object-fit:contain;display:block}
  .wrap{padding:64px 18px 48px}
  .shell{padding-left:0}
  .rail-toggle{display:none}
  .sidebar{position:fixed;top:0;left:0;height:100vh;width:248px;flex-basis:248px;transform:translateX(-100%);transition:transform .2s ease;z-index:130;align-items:stretch;gap:18px;padding:22px 14px 16px;overflow-y:auto;border-right:1px solid var(--line);box-shadow:0 10px 40px rgba(0,0,0,.18)}
  .nav-toggle-cb:checked ~ .sidebar{transform:translateX(0);width:248px}
  .nav-scrim{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:125}
  .nav-toggle-cb:checked ~ .nav-scrim{display:block}
  .side-nav{overflow:visible;min-height:auto}
  .brand{justify-content:flex-start;padding:0}
  .brand-full{display:inline}
  .side-nav a{justify-content:flex-start;gap:10px;padding:7px 10px;border-left:2px solid transparent;border-radius:8px}
  .side-nav a.on{border-left-color:var(--accent);background:rgba(232,88,32,.07)}
  .nav-label,.nav-title,.team-switch .team-name,.team-switch .caret{position:static;width:auto;height:auto;margin:0;clip:auto;overflow:visible}
  .team-switch .caret{margin-left:auto}
  .side-foot{display:block}
  .team-switch>summary{justify-content:flex-start;padding:8px 10px}
  .team-switch-menu{left:0;right:0;top:calc(100% + 6px);width:auto}
}


/* page head */
.page-head{margin-bottom:26px}
.kicker{font-family:var(--mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:#6E6A61;font-weight:500}
.kicker a{color:var(--muted)}
.kicker a:hover{color:var(--accent-deep)}
h1{font-family:var(--serif);font-weight:700;font-size:clamp(21px,2.6vw,27px);line-height:1.2;margin:8px 0 0;letter-spacing:-.01em}
.lede{color:var(--ink-soft);max-width:64ch;margin-top:10px;font-size:14px}
h2{font-family:var(--serif);font-weight:700;font-size:17px;margin-bottom:12px}

/* buttons */
.btn{display:inline-block;margin-top:18px;background:var(--accent);color:#fff;font-size:14px;font-weight:500;padding:9px 18px;border-radius:8px;border:none;cursor:pointer;font-family:var(--sans)}
.btn:hover{background:var(--accent-deep)}
.btn.ghost{background:transparent;color:var(--ink);border:1px solid var(--line-strong)}
.btn.ghost:hover{border-color:var(--accent);color:var(--accent-deep)}

/* dashboard toolbar: search + status toggle */
.dash-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:18px}
.dash-search{flex:1 1 280px;min-width:200px;background:var(--card);border:1px solid var(--line-strong);border-radius:8px;padding:9px 12px;font-family:var(--sans);font-size:14px;color:var(--ink)}
.dash-search:focus{outline:none;border-color:var(--accent)}
.dash-go{background:var(--accent);color:#fff;font-size:14px;font-weight:500;padding:9px 16px;border-radius:8px;border:none;cursor:pointer;font-family:var(--sans)}
.dash-go:hover{background:var(--accent-deep)}
.dash-link{font-family:var(--mono);font-size:12px;color:var(--muted)}
.dash-link:hover{color:var(--accent-deep)}
.dash-shop{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--muted)}
.dash-shop select{font-family:var(--sans);font-size:13px;color:var(--ink);background:var(--card);border:1px solid var(--line-strong);border-radius:8px;padding:7px 10px}
.dash-shop select:focus{outline:none;border-color:var(--accent)}
.dash-inputs{margin-left:auto}
/* 狀態藥丸:提醒「只看到正在跑的」+各狀態筆數+一鍵切換(取代舊的文字切換) */
.status-pills{display:flex;flex-wrap:wrap;gap:8px;margin:-4px 0 16px}
.pill{display:inline-flex;align-items:center;gap:7px;font-size:13px;padding:5px 13px;border-radius:999px;border:1px solid var(--line-strong);background:var(--card);color:var(--ink-soft);white-space:nowrap}
.pill:hover{border-color:var(--accent);color:var(--accent-deep)}
.pill .pill-n{font-family:var(--mono);font-size:12px;color:var(--muted)}
.pill.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:500}
.pill.on:hover{color:#fff}
.pill.on .pill-n{color:#FFE2D8}

/* dashboard grid
   活動 | 花費 | 銷售額 | ROAS | 點擊成本(曲線) | 廣告淨利
   head/row 同 box model（透明邊框對齊 1px border 的 row），數字欄表頭右對齊。 */
.grid-head,.grid-row{
  display:grid;
  /* 名稱欄寬；數字欄窄且欄距緊，字也略小 */
  grid-template-columns:
    minmax(260px, 3.4fr)
    minmax(52px, 0.48fr)
    minmax(52px, 0.48fr)
    minmax(40px, 0.36fr)
    minmax(84px, 0.72fr)
    minmax(56px, 0.48fr);
  align-items:center;
  column-gap:8px;
  row-gap:0;
  padding:12px 16px;
  border:1px solid transparent; /* 與 .grid-row 邊框同寬，欄位才對得齊 */
  box-sizing:border-box;
}
.grid-head{
  padding-top:8px;
  padding-bottom:8px;
  margin:0 0 2px;
  font-family:var(--sans);
  font-size:11px;
  font-weight:500;
  color:var(--muted);
  border-bottom:1px solid var(--line);
  border-radius:0;
}
.grid-head .sort-link{
  color:var(--muted);
  display:inline-flex;
  align-items:center;
  gap:3px;
  min-width:0;
  line-height:1.3;
  white-space:nowrap;
}
/* 第 1 欄活動靠左；其餘數字欄靠右，對齊 cell-metric */
.grid-head > :first-child{justify-self:start}
.grid-head > :not(:first-child){justify-self:end}
.grid-head .sort-link:hover{color:var(--accent-deep)}
.grid-head .sort-link.on{color:var(--accent-deep);font-weight:700}
.sort-arrow{font-size:9px;line-height:1;opacity:.85}
.dash-count{margin-top:18px;font-family:var(--mono);font-size:12px;color:var(--muted)}
.grid-row{
  background:var(--card);
  border-color:var(--line);
  border-radius:12px;
  padding-top:14px;
  padding-bottom:14px;
  margin-top:10px;
  box-shadow:var(--shadow);
  transition:border-color .15s, box-shadow .15s;
}
.grid-row:hover{border-color:var(--accent);box-shadow:0 2px 12px rgba(40,30,18,.06)}
.cell-name{display:flex;flex-direction:column;gap:5px;min-width:0;align-self:start;padding-top:2px}
/* 不 ellipsis、允許多行換行；長中文/無空格 SEO 名靠 overflow-wrap 拆開 */
.cname{
  font-weight:500;
  font-size:13px;
  line-height:1.4;
  color:var(--ink);
  overflow-wrap:anywhere;
  word-break:break-word;
  white-space:normal;
}
.cmeta{
  font-family:var(--mono);
  font-size:10.5px;
  color:var(--muted);
  line-height:1.45;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:4px 2px;
}
.cell-name .cmeta .tag{margin-left:0;vertical-align:baseline}
.cell-metric{
  font-family:var(--mono);
  font-size:12.5px;
  text-align:right;
  font-variant-numeric:tabular-nums;
  min-width:0;
}
.cell-metric .num-strong{
  font-weight:600;
  font-size:12.5px;
  color:var(--accent-deep);
  font-variant-numeric:tabular-nums;
}
.cell-profit .num-strong{letter-spacing:-.01em}
/* CPC：數字在上、sparkline 在下（不再 absolute 疊圖） */
.cell-chart{
  display:flex;
  flex-direction:column;
  align-items:stretch;
  justify-content:center;
  gap:2px;
  min-height:0;
}
.cell-chart .last{
  position:static;
  font-size:12.5px;
  font-weight:600;
  color:var(--accent-deep);
  line-height:1.2;
}
.cell-chart .chart{width:100%;height:28px;display:block;opacity:.9}

/* svg charts (detail cards keep taller default below) */
.chart{width:100%;height:56px;display:block}
.cell-chart .chart{height:28px}

/* ===== 廣告總覽 /dashboard ===== */
.ov-filters{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:18px}
.ov-range{margin:0}
.ov-kpi-row{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:14px}
.ov-kpi{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px 18px;box-shadow:var(--shadow);position:relative;overflow:hidden}
.ov-kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;border-radius:14px 0 0 14px}
.ov-orders::before{background:var(--teal)}
.ov-gmv::before{background:var(--blue)}
.ov-spend::before{background:var(--gold)}
.ov-lbl{font-size:12px;color:var(--muted);font-weight:500;margin-bottom:6px}
.ov-val{font-family:var(--mono);font-size:26px;font-weight:600;letter-spacing:-.02em;line-height:1.15}
.ov-pair{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-top:10px}
.ov-sec-v{font-family:var(--mono);font-size:15px;font-weight:600;color:var(--ink-soft)}
.ov-sec-l{font-size:11px;color:var(--muted)}
.ov-right{text-align:right}
.ov-charts{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px}
.ov-card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px 18px;box-shadow:var(--shadow)}
.ov-card h2{font-size:14px;font-weight:600;margin-bottom:2px}
.ov-hint{font-size:11.5px;color:var(--muted);margin-bottom:10px}
.ov-card .chart{height:120px}
.ov-bottom{display:grid;grid-template-columns:1.1fr 0.85fr 1fr;gap:12px}
.ov-profit{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:20px 16px;box-shadow:var(--shadow);text-align:center;display:flex;flex-direction:column;align-items:center}
.ov-ring{width:156px;height:156px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;margin:6px 0 12px}
.ov-ring::after{content:"";position:absolute;inset:16px;border-radius:50%;background:var(--card)}
.ov-ring-inner{position:relative;z-index:1;text-align:center}
.ov-pct{font-family:var(--mono);font-size:28px;font-weight:700;color:var(--teal);letter-spacing:-.03em}
.ov-pct-l{font-size:12px;color:var(--muted);font-weight:500}
.ov-side-metrics{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}
.ov-sm{background:var(--paper-2);border:1px solid var(--line);border-radius:10px;padding:10px 14px;min-width:110px}
.ov-sm-v{font-family:var(--mono);font-size:15px;font-weight:600}
.ov-sm-l{font-size:11px;color:var(--muted)}
.ov-note{margin-top:12px;font-size:11.5px;color:var(--muted);max-width:28ch;line-height:1.55}
.ov-cost-stack{display:flex;flex-direction:column;gap:10px}
.ov-cost{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 16px;box-shadow:var(--shadow);display:flex;align-items:center;gap:12px}
.ov-cost.on{border-color:rgba(232,88,32,.4)}
.ov-cost-ico{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;flex:none}
.ov-cost-ico.ad{background:rgba(232,88,32,.12)}
.ov-cost-ico.goods{background:rgba(44,94,138,.1)}
.ov-cost-body{flex:1;min-width:0}
.ov-cost-name{font-size:13px;font-weight:600}
.ov-cost-nums{text-align:right;font-family:var(--mono)}
.ov-cost-big{font-size:17px;font-weight:600}
.ov-cost-sub{font-size:11px;color:var(--muted)}
.ov-pie-wrap{display:flex;align-items:center;gap:16px;margin-top:6px}
.ov-pie{width:140px;height:140px;border-radius:50%;flex:none}
.ov-pie-legend{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
.ov-pie-row{display:flex;align-items:center;gap:8px;font-size:12px}
.ov-sw{width:9px;height:9px;border-radius:2px;flex:none}
.ov-pie-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-soft)}
.ov-pie-pc{font-family:var(--mono);font-size:12px;font-weight:600}
@media(max-width:900px){
  .ov-kpi-row,.ov-charts,.ov-bottom{grid-template-columns:1fr}
  .ov-pie-wrap{flex-direction:column;align-items:flex-start}
}

/* campaign detail */
.charts-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:18px}
.chart-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px 18px;box-shadow:var(--shadow)}
.chart-card-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:8px}
.chart-card-head span{font-size:13px;color:var(--ink-soft)}
.chart-card-head b{font-family:var(--mono);font-size:15px;font-weight:500}
.chart-card .chart{height:90px}
.hist-title{font-size:17px;margin:26px 0 4px}
.hist-title+.muted-note{margin:0 0 12px}
.status-strip{width:100%;height:28px;display:block;cursor:help}
.strip-legend{margin-top:8px;font-size:12px;color:var(--ink-soft)}
.strip-legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin:0 4px 0 10px;vertical-align:-1px}
.strip-legend i:first-child{margin-left:0}

/* strategy list */
.strat-list{display:flex;flex-direction:column;gap:10px}
.badge{font-family:var(--mono);font-size:12px;font-weight:500;padding:5px 11px;border-radius:20px;white-space:nowrap}
.badge.ok{background:rgba(21,98,90,.10);color:var(--teal)}

/* blocks, sql, results */
.block{margin-top:34px}
.sql,.sqlerr{font-family:var(--mono);font-size:13px;line-height:1.6;background:#211B14;color:#F4EEE3;padding:18px 20px;border-radius:12px;overflow-x:auto;white-space:pre}
.sqlerr{background:#3a1410;color:#ffd9d0}
/* 策略自帶測試狀態徽章 */
.selftest{display:inline-block;padding:8px 14px;border-radius:10px;font-size:14px;font-weight:600}
.selftest.ok{background:#e6f4ea;color:#1d6b34;border:1px solid #b7dcc2}
.selftest.fail{display:block;background:#3a1410;color:#ffd9d0;border:1px solid #6b2018;font-weight:500}
.selftest.fail .st-head{font-weight:700;margin-bottom:6px}
.selftest.fail .st-fails{margin:0;padding-left:20px}
.selftest.fail .st-err{margin:6px 0 0;white-space:pre-wrap;font-family:var(--mono);font-size:12px}
.selftest.warn{background:#fdf3e0;color:#8a5a00;border:1px solid #e8cf9a}
.selftest.none{background:#eee;color:#777;border:1px solid #ddd}
.selftest-fields{margin:10px 0 6px}
.selftest-fields summary{cursor:pointer;font-weight:600}


/* 詳情頁「自我驗證測試」面板 */
.selftest-panel{margin-top:34px}
.selftest-panel .st-actions{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:8px}
.selftest-panel .btn{margin-top:0}
.st-result{font-size:14px}
.st-result:empty{display:none}
.selftest.warn .st-head{font-weight:700;margin-bottom:6px}
.st-drawer{margin-top:14px;border:1px dashed var(--line-strong);border-radius:12px;padding:0 16px;background:transparent}
.st-drawer summary{cursor:pointer;font-family:var(--sans);font-size:12.5px;font-weight:500;color:var(--muted);padding:11px 0;list-style:none;user-select:none}
.st-drawer summary::-webkit-details-marker{display:none}
.st-drawer summary::before{content:"▸ ";color:var(--muted)}
.st-drawer[open] summary::before{content:"▾ "}
.st-drawer[open] summary{border-bottom:1px solid var(--line);margin-bottom:12px}
.st-drawer h4{font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:10px 0 4px}
.st-drawer .sql{margin-bottom:12px}

/* AI 右窗「④ 自我驗證」卡片 */
.ai-selftest .ai-verified{display:inline-flex;align-items:center;gap:7px;font-size:13.5px;font-weight:600;color:var(--teal);background:rgba(21,98,90,.1);border:1px solid rgba(21,98,90,.3);border-radius:8px;padding:8px 13px}
table.result{width:100%;border-collapse:collapse;background:var(--card);border:1px solid var(--line);border-radius:12px;overflow:hidden;font-size:14px}
table.result th{text-align:left;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:11px 16px;background:var(--paper-2);border-bottom:1px solid var(--line)}
table.result td{padding:11px 16px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}
table.result tr:last-child td{border-bottom:none}
table.result td.empty{color:var(--muted);text-align:center;font-style:italic}

/* editor */
.editor{display:flex;flex-direction:column;gap:16px;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:24px;box-shadow:var(--shadow)}
.field{display:flex;flex-direction:column;gap:6px}
.field label{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.field input,.field textarea{font-family:var(--sans);font-size:14px;border:1px solid var(--line-strong);border-radius:8px;padding:10px 12px;background:var(--paper-2);color:var(--ink)}
.field textarea{font-family:var(--mono);font-size:13px;line-height:1.6;resize:vertical}
.field input:focus,.field textarea:focus{outline:none;border-color:var(--accent)}
.actions{display:flex;gap:12px}
.actions .btn{margin-top:0}
.ar-preview-note{flex-shrink:0;font-family:var(--mono);font-size:11px;color:var(--muted)}

/* action chips + tags */
.act{display:inline-block;font-size:12.5px;font-weight:500;padding:4px 11px;border-radius:7px;white-space:nowrap}
.act-up{background:rgba(21,98,90,.12);color:var(--teal)}
.act-down{background:rgba(184,134,47,.14);color:var(--gold)}
.act-warn{background:rgba(44,94,138,.12);color:var(--blue)}
.act-stop{background:rgba(190,52,23,.12);color:var(--accent-deep)}
.tag{font-family:var(--mono);font-size:10.5px;font-weight:500;letter-spacing:.04em;padding:2px 7px;border-radius:5px;vertical-align:middle;margin-left:6px;white-space:nowrap}
/* 列上狀態徽章:凡非進行中就掛淡標籤,色沿用 statusDisplay(暫停金/結束灰/排程藍) */
.stat-paused{background:rgba(184,134,47,.14);color:var(--gold)}
.stat-ended{background:rgba(146,136,118,.16);color:#7D7568}
.stat-sched{background:rgba(44,94,138,.12);color:var(--blue)}

/* apply button */
.btn.sm{margin-top:0;padding:6px 13px;font-size:13px;white-space:nowrap}
.load-more{text-align:center;margin-top:18px}
table.result td.mono,.mono{font-family:var(--mono);font-size:13px}
.muted-note{color:var(--muted);font-size:14px}

/* action rows (建議動作) — 兩行：第一行活動名＋動作＋按鈕，第二行證據 */
.act-rows{background:var(--card);border:1px solid var(--line);border-radius:12px;overflow:hidden;box-shadow:var(--shadow)}
.act-row{display:flex;flex-direction:column;gap:8px;padding:14px 20px;border-bottom:1px solid var(--line)}
.act-row:last-child{border-bottom:none}
.ar-main{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.ar-camp{flex:0 1 auto;min-width:0;font-weight:500;font-size:15px}
.ar-camp:hover{color:var(--accent-deep)}
.act-row .act{flex-shrink:0}
.ar-detail{flex:1;min-width:0;color:var(--ink-soft);font-size:14px}
.ar-apply{margin:0;flex-shrink:0}
.ar-main .ar-apply{margin-left:auto}
.ar-evi{display:flex;align-items:center;gap:10px;min-width:0}
.lede code{font-family:var(--mono);font-size:13px;background:rgba(40,30,18,.06);padding:1px 6px;border-radius:5px;color:var(--ink)}

/* control strip (campaign knobs) */
.control-strip{display:flex;gap:14px;margin-bottom:26px;flex-wrap:wrap}
.ctrl{display:flex;flex-direction:column;gap:2px;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 22px;box-shadow:var(--shadow);min-width:150px}
.ctrl span{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.ctrl b{font-family:var(--serif);font-size:24px;font-weight:700;line-height:1.2}
.ctrl small{color:var(--muted);font-size:11px}
.daypart-ctrl{min-width:auto}
/* 廣告標籤 chip 區(零 JS:✕ 與「+ 新增」都是純 form POST + datalist 自動完成) */
.tags-section{display:flex;align-items:baseline;gap:12px;margin:-8px 0 26px;flex-wrap:wrap}
.tags-label{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.tag-chips{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.tag-chip{display:inline-flex;align-items:center;gap:5px;background:var(--paper-2);color:var(--ink-soft);border:1px solid var(--line-strong);border-radius:6px;padding:3px 5px 3px 9px;font-size:12.5px;line-height:1.4}
.tag-remove{display:inline-flex;margin:0}
.tag-remove-btn{border:none;background:none;color:var(--muted);cursor:pointer;font-size:11px;line-height:1;padding:1px 2px;border-radius:4px}
.tag-remove-btn:hover{color:var(--red);background:rgba(192,57,43,.08)}
.tag-add{display:inline-flex;margin:0}
.tag-add-input{font-size:12.5px;border:1px dashed var(--line-strong);border-radius:6px;padding:3px 9px;background:transparent;color:var(--ink);width:120px}
.tag-add-input:focus{outline:none;border-style:solid;border-color:var(--accent)}
.daypart-cells{display:flex;gap:6px;margin-top:2px}
.daypart-cells .dp{display:flex;flex-direction:column;align-items:center;gap:1px;background:var(--paper-2);border:1px solid var(--line);border-radius:7px;padding:5px 9px}
.daypart-cells .dp em{font-style:normal;font-size:10px;color:var(--muted)}
.daypart-cells .dp b{font-family:var(--mono);font-size:14px;font-weight:600}
.sched-form{display:flex;align-items:center;gap:6px;margin-top:8px}
.sched-form input[type=date]{font-family:var(--mono);font-size:12px;border:1px solid var(--line-strong);border-radius:6px;padding:4px 7px;background:var(--paper-2);color:var(--ink)}
.sched-form .btn.sm{padding:5px 11px;font-size:12px}

/* built-in settings form (新手表單) */
.settings{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:22px 24px;box-shadow:var(--shadow);display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:18px 24px}
.setting{display:flex;flex-direction:column;gap:6px}
.setting label{font-size:14px;font-weight:500;color:var(--ink)}
.setting .unit{color:var(--muted);font-weight:400;font-size:12px}
.setting select,.setting input{font-family:var(--sans);font-size:14px;border:1px solid var(--line-strong);border-radius:8px;padding:9px 11px;background:var(--paper-2);color:var(--ink)}
.setting select:focus,.setting input:focus{outline:none;border-color:var(--accent)}
.setting small{color:var(--muted);font-size:12px;line-height:1.5}
.settings-actions{grid-column:1/-1;display:flex;justify-content:flex-end;border-top:1px solid var(--line);padding-top:16px;margin-top:2px}
.settings-actions .btn{margin-top:0}
.sql-details summary{font-family:var(--mono);font-size:12px;color:var(--muted);cursor:pointer;letter-spacing:.04em}
.sql-details summary:hover{color:var(--accent-deep)}
.sql-details .sql{margin-top:12px}

/* 表單驅動(guided)策略的基本設定表單:逐行為一個開關 + 一個數字,SQL 對使用者隱藏 */
.guided-form .gf-row{display:flex;align-items:center;gap:18px;padding:10px 0;border-bottom:1px solid var(--line)}
.guided-form .gf-toggle{display:flex;align-items:center;gap:8px;min-width:240px;font-weight:600}
.guided-form .gf-toggle input{width:16px;height:16px}
.guided-form .gf-num{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:14px}
.guided-form .gf-num input{width:64px}
.guided-form .actions{margin-top:16px}
.guided-form .gf-pace-title{min-width:120px;font-weight:600}
.guided-form .gf-pace{flex-wrap:wrap}
.guided-form .gf-pace .gf-toggle{min-width:0}
.guided-form .gf-camps-title{margin-top:28px}
.gf-camps{width:100%;border-collapse:collapse;margin-top:8px}
.gf-camps th,.gf-camps td{padding:6px 8px;border-bottom:1px solid var(--line);text-align:left;font-weight:400}
.gf-camps th{color:var(--muted);font-size:12.5px;white-space:nowrap}
.gf-camps input{width:110px}

/* 逐檔 grid(grid.js 以 markup 慣例掛上;樣式在 chrome,markup 在存 DB 的 FormTemplate) */
.gf-gridbox{max-height:520px;overflow-y:auto;border:1px solid var(--line);border-radius:9px;margin-top:8px}
.gf-gridbox .gf-camps{margin-top:0}
.gf-gridbox thead th{position:sticky;top:0;background:#F4F1EA;z-index:2}
.gf-camps th.num,.gf-camps td.num{text-align:right}
.gf-camps td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
.gf-camps td.gf-name{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gf-camps td.num input{width:84px;text-align:right}
.gf-camps th.gf-sortable{cursor:pointer;user-select:none}
.gf-camps th.gf-sortable:hover{color:var(--accent-deep)}
.gf-camps .gf-arr{font-size:10px;color:var(--accent-deep);margin-left:3px}
.gf-st{font-size:11px;padding:1px 7px;border-radius:999px;border:1px solid var(--line);color:var(--muted);white-space:nowrap}
.gf-st-active{color:var(--teal);border-color:rgba(21,98,90,.35);background:rgba(21,98,90,.05)}
.gf-st-paused{color:var(--gold);border-color:rgba(184,134,47,.35);background:rgba(184,134,47,.05)}
.gf-st-ended,.gf-st-closed{color:#7D7568;border-color:rgba(146,136,118,.35);background:rgba(146,136,118,.06)}
.gf-st-scheduled{color:var(--blue);border-color:rgba(44,94,138,.35);background:rgba(44,94,138,.05)}
.gf-camps tr.gf-joined td:first-child{box-shadow:inset 3px 0 var(--teal)}
.gf-camps tr.gf-dirty{background:#FFF8EC}
.gf-camps tr.gf-dirty td:first-child{box-shadow:inset 3px 0 var(--gold)}
.gf-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:14px}
.gf-toolbar input[type=search]{padding:7px 11px;border:1px solid var(--line);border-radius:8px;font:inherit;font-size:13.5px;width:240px;background:var(--paper)}
.gf-chip{font:inherit;font-size:12.5px;padding:4px 11px;border:1px solid var(--line);border-radius:999px;background:var(--paper);cursor:pointer;color:var(--ink-soft)}
.gf-chip:hover{border-color:var(--accent)}
.gf-chip.on{background:rgba(232,88,32,.08);border-color:var(--accent);color:var(--accent-deep);font-weight:500}
.gf-count{font-size:12.5px;color:var(--muted);margin-left:auto;white-space:nowrap}
.gf-bulk{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:8px;padding:9px 12px;border:1px dashed var(--line);border-radius:9px;font-size:13.5px;color:var(--ink-soft)}
.gf-bulk label{display:flex;align-items:center;gap:6px}
.gf-bulk input{width:74px;padding:4px 8px;border:1px solid var(--line);border-radius:7px;font:inherit;font-size:13px;text-align:right}
.gf-bulk-conv{font-family:var(--mono);font-size:12px;color:var(--teal);min-width:84px}
/* 多策略管理清單的每列動作(設定/啟用停用/刪除)。 */
.strat-row-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.strat-row-actions form{margin:0}
.gf-bulk .muted-note{margin:0;font-size:12px}
.gf-savebar{display:none;position:sticky;bottom:12px;z-index:3;align-items:center;gap:14px;margin-top:10px;padding:10px 16px;border-radius:10px;background:var(--ink);color:#fff;font-size:13.5px;box-shadow:0 4px 14px rgba(28,27,25,.25)}
.gf-savebar.show{display:flex}
.gf-savebar .btn{background:#fff;color:var(--ink);border-color:#fff}
.gf-save-msg{color:#8FD3A8}
.gf-save-msg.err{color:#F2A09B}
/* 活動資料 grid(成本與保本 ROAS):輸入欄多,框窄一點;保本欄突出,hover 看驗算算式 */
.ci-grid td.num input{width:72px}
.ci-grid .ci-roas{cursor:help}
.ci-grid .ci-roas-v{font-weight:600;font-variant-numeric:tabular-nums;color:var(--accent-deep)}
.ci-grid .ci-roas-v.loss{color:#B3261E}
/* 例外廣告欄:勾選列整列弱化(一眼看出哪些是系統不管的),checkbox 欄本身不弱化 */
.ci-grid .ci-exc{cursor:pointer}
.ci-grid .ci-exc-cb{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}
.ci-grid tr.ci-excluded td:not(.ci-exc){opacity:.5}
/* 驗算 tooltip:fixed + JS 算座標(表格在 .gf-gridbox 滾動容器內,absolute 會被裁掉) */
.ci-grid .ci-tip{display:none;position:fixed;z-index:6;width:360px;padding:10px 13px;background:var(--ink);color:#fff;border-radius:9px;font-size:12.5px;font-weight:400;line-height:1.75;text-align:left;white-space:pre-line;box-shadow:0 4px 14px rgba(28,27,25,.3)}
.ci-grid .ci-tip.show{display:block}
.gf-bulk select{padding:4px 8px;border:1px solid var(--line);border-radius:7px;font:inherit;font-size:13px;background:var(--paper)}
/* 逐檔 ROAS 範圍收進「進階」摺疊(預設收合;引擎預設用保本 ROAS,多數人不用展開) */
.gf-adv>summary{cursor:pointer;user-select:none;list-style:none}
.gf-adv>summary::before{content:'▸ ';color:var(--muted)}
.gf-adv[open]>summary::before{content:'▾ '}
.gf-adv>summary::-webkit-details-marker{display:none}

/* 賣家導向:突出金額 / ROAS 數字、低調說明條、安靜標籤 */
.num-strong{font-weight:600;font-variant-numeric:tabular-nums;color:var(--accent-deep)}
.hint-strip{margin-top:12px;padding:9px 14px;background:rgba(40,30,18,.045);border-left:3px solid var(--accent);border-radius:0 8px 8px 0;font-size:13px;color:var(--ink-soft);line-height:1.65;max-width:66ch}
.hint-strip a{color:var(--accent-deep);text-decoration:underline}
.tag-quiet{background:transparent;color:var(--muted);border:1px solid var(--line)}


/* product workspace */
.auth-panel,.empty-panel,.team-block,.shop-card{background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow)}
.auth-panel,.empty-panel{padding:24px}
.workspace-list{display:flex;flex-direction:column;gap:28px}
.team-block{padding:20px}
/* 設定頁的 team 分組:不要卡片,只用標題 + 縮排的淡淡左軌把店歸到 team 底下。
   (team_picker 仍用上面的 .team-block 卡片,兩者刻意分開。) */
.team-group{display:flex;flex-direction:column}
.team-group .shop-table{padding-left:16px;border-left:2px solid var(--line)}
.team-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;margin-bottom:16px}
.shop-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}
.billing-grid{align-items:start}
.shop-card{padding:16px}
.shop-card.focused{border-color:var(--accent);box-shadow:0 0 0 2px rgba(232,88,32,.10),var(--shadow)}
.shop-title{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px}
.shop-title h3{font-family:var(--serif);font-size:18px}
.billing-status{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:8px;font-size:13px}
.billing-status small{color:var(--muted)}
.badge.ok{background:rgba(21,98,90,.12);color:var(--teal)}
.badge.warn{background:rgba(184,134,47,.15);color:var(--gold)}
.badge.bad{background:rgba(190,52,23,.13);color:var(--accent-deep)}
.badge.neutral{background:rgba(147,136,118,.16);color:var(--muted)}
.badge.info{background:rgba(44,94,138,.13);color:var(--blue)}
.badge.new{background:rgba(232,88,32,.12);color:var(--accent-deep)}
.sub-details{margin-top:10px;font-size:13px}
.sub-details summary{cursor:pointer;color:var(--muted);font-size:12.5px;user-select:none}
.sub-details summary:hover{color:var(--ink-soft)}
.sub-details[open] summary{margin-bottom:8px}
.sub-table{width:100%;border-collapse:collapse;margin-bottom:10px}
.sub-table th,.sub-table td{padding:5px 8px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;font-weight:400}
.sub-table th{width:110px;color:var(--muted);white-space:nowrap}
.sub-table td{color:var(--ink-soft);font-family:var(--mono);font-size:12.5px;word-break:break-all}
.billing-actions{margin-top:12px;display:grid;gap:10px}
.billing-form{display:grid;gap:10px}
.plan-choices{display:flex;flex-wrap:wrap;gap:8px;border:0;padding:0;margin:0}
.plan-choices legend{padding:0;margin:0 0 2px;font-size:12px;color:var(--muted)}
.plan-choice{display:flex;align-items:center;gap:6px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--panel)}
.plan-choice small{color:var(--muted);font-family:var(--mono);font-size:12px}
.billing-button-row{display:flex;flex-wrap:wrap;gap:8px}
.billing-button-row form{margin:0}
.billing-pending{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:10px 0 16px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--ink-soft);font-size:13px}
.billing-pending .spin{width:14px;height:14px;border:2px solid var(--line-strong);border-top-color:var(--ink-soft);border-radius:50%;animation:billing-spin .8s linear infinite;flex:none}
/* 付款完成的確認(payuni_return=paid 且訂閱已生效):綠調、無轉圈,同 .selftest.ok 配色。 */
.billing-pending.ok{background:#e6f4ea;color:#1d6b34;border-color:#b7dcc2}
@keyframes billing-spin{to{transform:rotate(360deg)}}
.auth-warning{color:var(--red)}
.remove-warning{color:var(--red);background:rgba(192,57,43,.08);border:1px solid rgba(192,57,43,.25);border-radius:8px;padding:10px 14px}
.shop-table{display:flex;flex-direction:column;gap:8px}
.shop-row{display:grid;grid-template-columns:minmax(220px,1fr) auto auto auto;align-items:center;gap:12px;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px 14px}
/* 設定頁的店列:沿用 team_shops 已上線的 .shop-table/.shop-row 非卡片原語,只把固定 grid 覆寫成 flex-wrap。
   狀態一律用既有 .badge(與 team_shops 同一套詞彙),不再有 .status-dot/.status-line 兩套視覺。
   純狀態:店名 / 授權 badge+到期 / 訂閱 badge / 管理訂閱;同步與 campaign 數字屬 dashboard,不放這。 */
.shop-row-settings{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px}
.shop-row-settings .row-name{flex:1 1 200px;min-width:160px;display:flex;align-items:baseline;gap:8px}
.shop-row-settings .row-meta{font-size:13px;color:var(--muted)}
.shop-row-settings .row-manage{margin-left:auto}
.shop-row-settings .row-sub{flex-basis:100%;margin-top:2px;border-top:1px solid var(--line);padding-top:8px}
.member-form{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.member-form input,.member-form select{font-family:var(--sans);font-size:14px;border:1px solid var(--line-strong);border-radius:8px;padding:8px 10px;background:var(--paper-2);color:var(--ink)}
.feedback-list{display:flex;flex-direction:column;gap:14px}
.feedback-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;box-shadow:var(--shadow);transition:border-color .15s}
.feedback-card:hover{border-color:var(--line-strong)}
.ops-form{display:grid;grid-template-columns:180px minmax(220px,1fr) auto;gap:10px;align-items:start}
.ops-form input,.ops-form select,.ops-form textarea,.feedback-card select,.comment-form input{font-family:var(--sans);font-size:14px;border:1px solid var(--line-strong);border-radius:8px;padding:8px 10px;background:var(--paper-2);color:var(--ink)}
.ops-form textarea{grid-column:1 / span 2;min-height:82px;resize:vertical}
/* 直向表單(自訂策略 / SOP 選配)：不要套 ops-form 三欄 grid */
.stack-form{display:flex;flex-direction:column;gap:14px;max-width:48rem}
.stack-form>label{display:flex;flex-direction:column;gap:6px;font-weight:600;font-size:14px;color:var(--ink)}
.stack-form input[type=text],.stack-form input[type=number],.stack-form select,.stack-form textarea{
  font-family:var(--sans);font-size:14px;font-weight:400;border:1px solid var(--line-strong);border-radius:8px;padding:8px 10px;background:var(--paper-2);color:var(--ink);width:100%;max-width:100%;box-sizing:border-box
}
.stack-form textarea.code{font-family:var(--mono);font-size:12.5px;line-height:1.45;min-height:10rem;resize:vertical}
.stack-form .row-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.stack-form .toggle-row{display:flex;flex-direction:row;align-items:center;gap:10px;font-weight:600;cursor:pointer}
.stack-form .toggle-row input{width:16px;height:16px;flex:0 0 auto}
.stack-form .toggle-row.compact{font-weight:500;font-size:13px}
.stack-form .inline-num{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:8px;font-weight:600}
.stack-form .inline-num input{width:5.5rem}
.stack-form .sop-hours{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.4rem;max-width:36rem}
/* 主題一預算增減選配 —— 純 CSS 漸進強化(:has,與本檔既有用法一致;no-JS 也能送出) */
.sop-config-form .sop-add-mode{display:flex;flex-direction:column;gap:6px}
.sop-config-form .sop-add-mode .toggle-row input[type=number]{width:4.5rem}
/* 未選中的金額模式輸入淡化,提示「這欄現在不生效」(值仍送出,由 radio 決定採用哪個) */
.sop-config-form:not(:has(input[name=sop_add_mode][value=mult]:checked)) .sop-am-mult input[type=number]{opacity:.4}
.sop-config-form:not(:has(input[name=sop_add_mode][value=fixed]:checked)) .sop-am-fixed input[type=number]{opacity:.4}
.sop-config-form .sop-force-slots{display:flex;flex-direction:column;gap:8px;transition:opacity .15s}
/* 未勾「啟用強制加碼時段」→ 整組灰化 */
.sop-config-form:not(:has(input[name=sop_force_on]:checked)) .sop-force-slots{opacity:.45}
.sop-config-form .sop-force-x{display:none;align-items:center;gap:6px}
/* 需求②:選「3 個」才顯示第 2、3 時段輸入 */
.sop-config-form:has(input[name=sop_force_count][value="3"]:checked) .sop-force-x{display:inline-flex}
/* 主題三促日豁免(#時段開關促日):未勾主開關 → 整組灰化(值仍送出,由主開關決定生效) */
.sop-config-form .sop-promo{display:flex;flex-direction:column;gap:8px;transition:opacity .15s}
.sop-config-form:not(:has(input[name=sop_promo_skip]:checked)) .sop-promo{opacity:.45}
.sop-config-form .sop-promo-dates{display:flex;flex-wrap:wrap;gap:.4rem;max-width:36rem}
.sop-config-form .sop-promo-dates input[type=date]{width:10.5rem}
.stack-form details{margin-top:4px}
.stack-form .muted-note{font-weight:400;margin:0}
.feedback-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin-bottom:10px}
.feedback-head h3{font-family:var(--serif);font-size:18px;line-height:1.35}
/* 卡片頁尾:分類 chip + 提案人,super admin 的狀態選單靠右(meta 與描述之間留淡軌分隔)。 */
.feedback-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.feedback-cat{font-family:var(--mono);font-size:11px;letter-spacing:.04em;padding:2px 9px;border-radius:20px;background:var(--paper-2);color:var(--ink-soft);border:1px solid var(--line);white-space:nowrap}
.feedback-cat.cat-bug{color:var(--accent-deep);border-color:rgba(209,78,26,.28);background:rgba(209,78,26,.06)}
.feedback-cat.cat-feature{color:var(--teal);border-color:rgba(21,98,90,.28);background:rgba(21,98,90,.06)}
.feedback-cat.cat-improvement{color:var(--blue);border-color:rgba(44,94,138,.28);background:rgba(44,94,138,.06)}
.feedback-author{font-size:13px;color:var(--muted);overflow-wrap:anywhere}
.feedback-status{margin-left:auto}
.comment-form{display:flex;gap:8px;margin-top:12px}
.comment-form input{flex:1}
.notice-row{display:grid;grid-template-columns:minmax(240px,1fr) auto auto auto;gap:12px;align-items:center;border:1px solid var(--line);border-radius:10px;padding:12px;background:var(--card)}
.notice-row.unread{border-color:var(--accent);background:rgba(232,88,32,.04)}
/* 通知 body(notifMarkdown 輸出的白名單 HTML):列高要緊湊,壓掉 block 元素的預設邊距。 */
.notification-body p{margin:0 0 6px}
.notification-body>:last-child{margin-bottom:0}
.notification-body h1,.notification-body h2,.notification-body h3,.notification-body h4{margin:8px 0 4px;font-size:15px}
.notification-body ul,.notification-body ol{margin:4px 0;padding-left:20px}
.notification-body li{margin:2px 0}
.notification-body blockquote{margin:6px 0;padding:2px 10px;border-left:3px solid var(--line);color:var(--muted)}
.notification-body hr{border:0;border-top:1px solid var(--line);margin:8px 0}
.notification-body code{font-family:var(--mono);font-size:12.5px;background:rgba(0,0,0,.05);border-radius:4px;padding:1px 4px}
.notification-body pre{background:rgba(0,0,0,.05);border-radius:8px;padding:8px 10px;overflow-x:auto;margin:6px 0}
.notification-body pre code{background:none;padding:0}
.notification-table-wrap{overflow-x:auto;margin:6px 0;border:1px solid var(--line);border-radius:8px}
.notification-body table{border-collapse:collapse;font-size:13px;min-width:240px}
.notification-body th,.notification-body td{padding:4px 10px;border-bottom:1px solid var(--line);text-align:left}
.notification-body thead th{background:rgba(0,0,0,.03)}
.notification-body tbody tr:last-child td{border-bottom:0}

/* Admin Center:總覽統計列(錨點)+ 全寬分段表格。
   各資料集筆數差很大(teams 數十、users/notifications 上百),改用上限高度
   內捲的表格,任何一張表都撐不爆頁面。 */
.admin-stats{margin-bottom:8px}
.admin-stats .ctrl{min-width:118px;padding:12px 18px}
.admin-stats .ctrl b{font-size:22px}
.admin-stats .ctrl:hover{border-color:var(--accent)}
.admin-stats .ctrl.alert b{color:var(--accent-deep)}
.admin-section{margin-top:34px}
.admin-section>h2{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.admin-note{font-family:var(--mono);font-size:12px;font-weight:400;color:var(--muted)}
.admin-links{margin-left:auto;font-family:var(--mono);font-size:12px;font-weight:400;color:var(--muted)}
.admin-links a:hover{color:var(--accent-deep)}
/* width:0 + min-width:100%:斬斷 table min-content 往上傳播 —— 否則寬表格會把
   .wrap 撐到 ~700px,行動瀏覽器跟著把 layout viewport 撐大(即使有 viewport meta),
   整頁縮小到不可讀。desktop 上兩者抵銷等價於 width:100%。 */
.admin-scroll{width:0;min-width:100%;max-height:420px;overflow:auto;border:1px solid var(--line);border-radius:12px;background:var(--card);box-shadow:var(--shadow)}
.admin-scroll table.result{border:none;border-radius:0}
.admin-scroll th,.admin-scroll td{white-space:nowrap} /* 儲存格不折行,寬度交給容器橫向捲動;長文欄(.admin-msg)例外 */
/* min-width:其他欄 nowrap 後,可換行的長文欄會被擠到剩幾十 px、一字一行;
   給下限讓表格寬度超出容器去橫向捲動。 */
.admin-scroll td.admin-msg{white-space:normal;min-width:200px}
.admin-scroll th{position:sticky;top:0;z-index:1}
.admin-scroll td b{font-weight:500}
.admin-msg{overflow-wrap:anywhere}
@media(max-width:720px){
  .admin-stats .ctrl{min-width:calc(33.3% - 10px);flex:1 1 auto;padding:9px 12px}
  .admin-stats .ctrl b{font-size:18px}
  .admin-section h2 .admin-note,.admin-section h2 .admin-links{display:block;margin:4px 0 0;font-size:11px}
  table.result th,table.result td{padding:8px 10px}
}

@media(max-width:720px){
  .team-head{flex-direction:column}
  .shop-row{grid-template-columns:1fr}
  .shop-row-settings{align-items:flex-start}
  .shop-row-settings .row-name{flex-basis:100%}
  .shop-row-settings .row-manage{margin-left:0}
  .notice-row,.ops-form{grid-template-columns:1fr}
  .ops-form textarea{grid-column:auto}
}

/* mobile 列表:
   活動名
   花費：xx    銷售額：xx
   ROAS：xx    淨利：xx
   點擊成本：數字 + 曲線整列 */
@media(max-width:820px){
  .grid-head{display:none}
  .chart-hint{font-size:12px;line-height:1.55}
  .grid-row{
    grid-template-columns:1fr 1fr;
    grid-template-areas:
      "name name"
      "exp gmv"
      "roas profit"
      "cpc cpc";
    column-gap:10px;
    row-gap:8px;
    padding:12px 14px;
    align-items:start;
  }
  .grid-row > .cell-name{grid-area:name;padding-top:0}
  /* DOM: name, expense, gmv, roas, cpc, profit */
  .grid-row > .cell-metric:nth-child(2){grid-area:exp}
  .grid-row > .cell-metric:nth-child(3){grid-area:gmv}
  .grid-row > .cell-metric:nth-child(4){grid-area:roas}
  .grid-row > .cell-chart{grid-area:cpc}
  .grid-row > .cell-profit{grid-area:profit}

  .cell-metric{
    text-align:left;
    display:flex;
    flex-direction:row;
    flex-wrap:wrap;
    align-items:baseline;
    justify-content:flex-start;
    gap:2px 4px;
    font-size:12px;
  }
  .cell-metric .num-strong{font-size:12.5px}
  .cell-metric[data-label]::before{
    content:attr(data-label) "：";
    font-family:var(--sans);
    font-size:11px;
    font-weight:500;
    color:var(--muted);
    flex:none;
  }
  .cell-chart{
    flex-direction:row;
    flex-wrap:wrap;
    align-items:center;
    gap:4px 8px;
  }
  .cell-chart .last{font-size:12.5px}
  .cell-chart .chart{
    flex:1 1 100%;
    width:100%;
    height:36px;
    order:3; /* 曲線在標籤+數字下方整列 */
  }
}

/* 整週每小時預算 heatmap (週一..週日 × 0..23) */
.weekgrid{display:flex;flex-direction:column;gap:2px;max-width:580px}
.wg-row{display:grid;grid-template-columns:24px repeat(24,1fr);gap:2px;align-items:center}
.wg-head{height:12px}
.wg-day{font-family:var(--mono);font-size:10px;color:var(--muted);text-align:center}
.wg-h{font-family:var(--mono);font-size:9px;color:var(--muted)}
.wg-c{height:13px;border-radius:2px;border:1px solid rgba(40,30,18,.05)}
.wg-edit .wg-row{grid-template-columns:24px repeat(24,1fr)}
.wg-in{height:20px;width:100%;min-width:0;border:1px solid var(--line);border-radius:3px;font-family:var(--mono);font-size:9px;text-align:center;padding:0;color:var(--ink)}
.wg-in:focus{outline:1px solid var(--accent);border-color:var(--accent)}
.weekedit{max-width:640px}
.weekedit-actions{margin-top:12px;display:flex;gap:8px}

/* per-campaign weekly fine-tune (collapsible) */
.wh-camp{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 16px;margin-bottom:8px;box-shadow:var(--shadow)}
.wh-camp summary{display:flex;align-items:center;gap:16px;cursor:pointer;list-style:none}
.wh-camp summary::-webkit-details-marker{display:none}
.wh-camp summary .ar-camp{flex:0 0 150px}
.wh-camp[open]{padding-bottom:16px}
.wh-camp .weekedit{margin-top:14px}

/* weekly proposal row */
.act-row-wide{flex-wrap:wrap}
.ar-heat{flex:1 1 100%;display:flex;flex-direction:column;gap:5px;order:3}
.ar-hint{font-size:12px;color:var(--muted)}

/* per-campaign target ROAS form */
.roas-form{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-left:auto}
.roas-form label{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:5px}
.roas-form input{width:62px;font-family:var(--mono);font-size:13px;border:1px solid var(--line-strong);border-radius:6px;padding:5px 6px;background:var(--paper-2);color:var(--ink)}
.roas-form input:focus{outline:none;border-color:var(--accent)}
.ctrl .ctrl-date{font-size:15px;font-family:var(--mono)}

/* check-frequency selector */
.freq-form{display:inline-flex;align-items:center;gap:8px;margin-top:14px}
.freq-form label{font-size:13px;color:var(--muted)}
.freq-form select{font-family:var(--sans);font-size:13px;border:1px solid var(--line-strong);border-radius:7px;padding:6px 9px;background:var(--paper-2);color:var(--ink)}
.freq-form select:focus{outline:none;border-color:var(--accent)}
.freq-form .btn.sm{margin-top:0}

/* 今日建議 — 衝突彙整；每列固定兩行（.sg-main 控制列 / .sg-evi 證據列） */
.sg-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 18px;margin-bottom:12px;box-shadow:var(--shadow)}
.sg-conflict{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent),var(--shadow)}
.sg-head{display:flex;align-items:center;gap:12px;margin-bottom:10px;flex-wrap:wrap}
.sg-camp{font-family:var(--serif);font-weight:700;font-size:16px;color:var(--ink);text-decoration:none}
.sg-camp:hover{color:var(--accent)}
.sg-badge{font-size:12px;font-weight:500;color:#fff;background:var(--accent);border-radius:20px;padding:2px 10px;white-space:nowrap;flex:none}
.sg-rows{display:flex;flex-direction:column;gap:7px}
.sg-row{display:flex;flex-direction:column;gap:6px;padding:8px 10px;border-radius:8px;background:var(--paper-2)}
.sg-main{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.sg-main .sg-by{margin-left:auto}
.sg-evi{display:flex;align-items:center;gap:10px;padding-left:44px;min-width:0}
.sg-top{background:rgba(232,88,32,.07)}
.sg-rank{font-size:11px;font-weight:700;color:var(--accent);flex:0 0 32px}
.sg-rank-alt{color:var(--muted);font-weight:500}
.sg-detail{font-size:13px;color:var(--ink);flex:1 1 auto}
.sg-by{font-size:12px;color:var(--muted);font-family:var(--mono)}
@media(max-width:640px){.sg-evi{padding-left:0}}

/* 策略頁控制列(改名 / 刪除) */
.head-controls{display:flex;flex-wrap:wrap;gap:10px 24px;align-items:center;margin-top:14px}

/* 證據圖(取代文字說明) */
.sg-chart{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0}
.ev-chart{width:140px;height:36px;flex:0 0 auto;border-radius:4px;background:var(--paper-2)}
.sg-cap{font-size:12px;color:var(--muted)}

/* 自動套用總開關 */
.pilot-strip{display:flex;align-items:center;gap:12px;margin-top:16px;padding:10px 14px;border-radius:10px;border:1px solid var(--line);background:var(--card);flex-wrap:wrap}
.pilot-label{font-size:13px;color:var(--muted)}
.pilot-strip b{font-family:var(--serif);font-size:16px}
.pilot-note{font-size:12px;color:var(--muted)}
.pilot-strip form{margin-left:auto}
.pilot-observe b{color:var(--muted)}
.pilot-live{border-color:var(--accent);background:rgba(232,88,32,.06)}
.pilot-live b{color:var(--accent)}

/* tags */
.auto-tag{background:var(--accent);color:#fff;border:none}
.prio-tag{background:var(--paper-2);color:var(--muted);border:1px solid var(--line)}
.manual-tag{background:var(--paper-2);color:var(--muted);border:1px solid var(--line)}

/* 圖表 hover 提示:chart.js 的逐點 tooltip + 跟隨圓點;.chart-tip 掛在 body 上 */
.chart,.ev-chart{cursor:help}
.chart-tip{position:fixed;z-index:60;display:none;pointer-events:none;background:var(--ink);color:var(--paper);font-family:var(--mono);font-size:11.5px;line-height:1.6;padding:5px 10px;border-radius:6px;white-space:pre;box-shadow:var(--shadow)}
.hover-dot{pointer-events:none;fill:var(--ink);opacity:.85}
/* 圖表說明:dashboard 圖例一行 + campaign 卡片的資料範圍標註 */
.chart-hint{font-size:12px;color:var(--muted);margin:-6px 0 14px}
.chart-range{font-style:normal;font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-left:6px}

/* ===== 新增策略:wizard 單頁四步(左 1/2 設定、右 3/4 成果,零卡片) ===== */
.wz-lede{color:var(--ink-soft);max-width:64ch;margin-top:10px;font-size:14px}
.wz{display:grid;grid-template-columns:minmax(0,1.04fr) minmax(0,.96fr);margin-top:26px;align-items:start}
.wz-left{padding-right:48px}
.wz-right{border-left:1px solid var(--line);padding-left:48px;position:sticky;top:34px}
.wz-locked{color:var(--muted);padding:24px 0;line-height:1.8}
.wz-locked[hidden],#aiPanes[hidden]{display:none}

/* 步驟原語:大號 serif 數字 + 標題,數字下方一條淡 rail 串到下一步 */
.step{position:relative;padding-left:74px;padding-bottom:46px}
.step::before{content:"";position:absolute;left:23px;top:58px;bottom:14px;width:1px;background:var(--line)}
.step.last{padding-bottom:0}
.step.last::before{display:none}
.step-no{position:absolute;left:0;top:-8px;width:48px;text-align:center;font-family:var(--serif);font-weight:900;font-size:38px;line-height:1.35;color:var(--ink);font-variant-numeric:lining-nums}
.step.quiet .step-no{color:var(--muted)}
.step.now .step-no{color:var(--accent)}
.step-head{display:flex;align-items:baseline;gap:12px;margin-bottom:4px}
.step-head h2{font-family:var(--serif);font-weight:700;font-size:19px;letter-spacing:-.01em;margin:0;border:none;padding:0}
.step-state{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--muted)}
.step-state.done::before{content:"✓ ";color:var(--teal)}
.step-state.live{color:var(--accent-deep)}
.step-lede{color:var(--muted);font-size:13px;margin-bottom:14px}

/* 第 1 步:打法三選一(整列可點,選中列亮起) */
.pace{display:flex;flex-direction:column}
.pace label{display:flex;align-items:baseline;gap:11px;padding:11px 2px;border-top:1px solid var(--line);cursor:pointer}
.pace label:first-child{border-top:none}
.pace input{width:16px;height:16px;flex:none;accent-color:var(--accent);position:relative;top:3px}
.pace .p-name{font-weight:600;font-size:15px;flex:0 0 7.5em;color:var(--ink-soft)}
.pace .p-desc{color:var(--muted);font-size:13px}
.pace label:has(input:checked) .p-name{color:var(--accent-deep)}
.pace label:has(input:checked) .p-desc{color:var(--ink-soft)}

/* 第 2 步:行為勾選(勾了的醒目、未勾退灰、停用降透明;說明文吊在標籤下) */
.beh{border-top:1px solid var(--line);padding:14px 2px 16px}
.beh:first-of-type{border-top:none;padding-top:2px}
.beh-row{display:flex;align-items:center;gap:10px}
.beh-row input[type=checkbox]{width:17px;height:17px;flex:none;accent-color:var(--accent)}
.beh-row .b-name{font-weight:600;font-size:15.5px;cursor:pointer}
.beh-row2{padding-top:11px}
.beh-row2.disabled{opacity:.45}
.beh-knob{margin-left:auto;display:flex;align-items:center;gap:7px;color:var(--muted);font-size:13px;white-space:nowrap}
.beh-knob select{font-family:var(--sans);font-size:13.5px;padding:5px 9px;border:1px solid var(--line-strong);border-radius:8px;background:var(--card);color:var(--ink);cursor:pointer}
.beh-hint{margin:7px 0 0 27px;font-size:13px;color:var(--muted);line-height:1.7;max-width:56ch}
.beh-hint b{color:var(--ink-soft);font-weight:600}
.beh.off .b-name{color:var(--ink-soft);font-weight:500}
.beh.off .beh-hint{color:#A8A49B}
.beh.disabled{opacity:.45}
.beh.disabled .b-name{cursor:not-allowed}
/* 促銷日保護:第 2 步裡的小節,不另起卡片 */
.beh-sub{margin:2px 0 10px;font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.beh.promo2{border-top:1px dashed var(--line)}

/* 第 3 步:試算(命中做成對帳單列:活動名+引線+動作章+右對齊數字) */
.wz-hits{min-height:24px}
.ai-muted{color:var(--muted);font-size:13px}
/* 每日總預算旁的「近 7 天每日花費」設定參考:小標 + mini 柱狀圖(每柱 native <title> 顯示
   台北日期 + 金額,零 JS hover)。單店列縮排深一階,呈現「合計 → 各店」層級。 */
.spend7{display:inline-flex;align-items:center;gap:8px;color:var(--muted);font-size:12px;white-space:nowrap}
.spend7-lbl{font-size:11.5px}
.spend7-lbl b{color:var(--ink-soft);font-weight:600}
.spend-bars{display:inline-flex;align-items:flex-end;gap:2px;width:104px;height:30px;flex:none}
.spend-bars .sb-col{position:relative;flex:1;display:flex;align-items:flex-end;height:100%;cursor:default}
.spend-bars .sb-bar{width:100%;min-height:1px;background:var(--accent);opacity:.78;border-radius:2px 2px 0 0}
.spend-bars .sb-col:hover .sb-bar{opacity:1}
.spend-bars .sb-col:hover::after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 5px);transform:translateX(-50%);background:var(--ink);color:#fff;font-size:11px;line-height:1.5;padding:3px 8px;border-radius:5px;white-space:nowrap;z-index:30;pointer-events:none;box-shadow:0 2px 8px rgba(0,0,0,.2)}
.beh-shopcap{padding-left:26px}
/* 行為說明裡的引導連結(去「成本與保本 ROAS」填成本算保本 ROAS):醒目可點 */
.gf-link{color:var(--accent-deep);text-decoration:underline;text-underline-offset:2px}
.gf-link:hover{color:var(--accent)}
.hits-line{font-size:14px;color:var(--ink-soft);margin-bottom:4px}
.hits-line b{font-family:var(--serif);font-size:19px;font-weight:900;color:var(--accent-deep);padding:0 2px}
.hits-line.zero{color:var(--muted)}
.hits{list-style:none;margin:6px 0 0;padding:0}
.hits li{display:flex;align-items:center;gap:11px;padding:11px 2px;border-top:1px solid var(--line)}
.hits .h-camp{font-weight:600;font-size:14.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hits .h-dots{flex:1;min-width:16px;border-bottom:1px dotted var(--line-strong);position:relative;top:4px}
.hits .h-num{font-variant-numeric:tabular-nums;font-size:13px;color:var(--ink-soft);white-space:nowrap}
.sum-cap{margin:26px 0 2px;font-weight:600;font-size:14.5px}
.sum-sub{font-size:12.5px;color:var(--muted);margin-bottom:6px}
.sum{list-style:none;margin:0;padding:0;counter-reset:s}
.sum li{counter-increment:s;display:flex;gap:10px;align-items:baseline;padding:9px 2px;border-top:1px solid var(--line);font-size:14px;color:var(--ink-soft)}
.sum li::before{content:counter(s);font-family:var(--serif);font-weight:900;font-size:13px;color:var(--muted);flex:none;width:14px;text-align:center}

/* 第 4 步:存檔(名字下拉 + 按鈕,正下方墊「驗不過不放行」安心線) */
.save-row{display:flex;gap:10px;align-items:center;margin-top:4px}
.save-name{flex:1;min-width:0;font-family:var(--sans);font-size:14px;padding:9px 12px;border:1px solid var(--line-strong);border-radius:8px;background:var(--card);cursor:pointer;color:var(--ink)}
.save-row .btn{margin-top:0}
.save-verify{display:flex;align-items:baseline;gap:8px;margin-top:14px;padding-top:12px;border-top:1px dashed var(--line);font-size:12.5px;color:var(--muted);line-height:1.6;max-width:46ch}
.save-verify .v-check{flex:none;color:var(--teal);font-weight:700;font-size:13px}
.save-verify b{color:var(--ink-soft);font-weight:600}

.ai-prev-err{font-family:var(--mono);font-size:12px;color:var(--red);background:rgba(192,57,43,.07);border:1px solid rgba(192,57,43,.25);border-radius:8px;padding:10px 12px;line-height:1.5}
.ai-toast{margin-top:12px;font-size:13px;padding:10px 13px;border-radius:8px;line-height:1.5}
.ai-toast.ok{background:rgba(62,124,75,.1);border:1px solid rgba(62,124,75,.3);color:var(--teal)}
.ai-toast.ok a{color:var(--accent-deep);font-weight:600}
.ai-toast.err{background:rgba(192,57,43,.08);border:1px solid rgba(192,57,43,.25);color:var(--red)}

/* 成本頁「同步蝦皮售價」工具列:緊湊卡片,不要大段 h2 + 散落 radio */
.price-sync-card{margin:4px 0 18px;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 16px;box-shadow:var(--shadow)}
.price-sync-form{display:flex;flex-direction:column;gap:12px}
.price-sync-main{display:flex;align-items:flex-start;justify-content:space-between;gap:14px 18px;flex-wrap:wrap}
.price-sync-copy{flex:1 1 220px;min-width:0}
.price-sync-title{font-family:var(--serif);font-size:15px;font-weight:700;margin:0 0 4px;color:var(--ink);line-height:1.3}
.price-sync-hint{margin:0;font-size:12.5px;line-height:1.5;color:var(--muted);max-width:52ch}
.price-sync-main .btn{margin-top:0;flex:none;white-space:nowrap}
.price-sync-opts{display:flex;flex-wrap:wrap;gap:10px 18px;align-items:center;padding-top:10px;border-top:1px dashed var(--line)}
.price-sync-field{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.price-sync-label{font-size:12px;font-weight:600;color:var(--muted);letter-spacing:.02em;min-width:2.5em}
.price-sync-seg{display:inline-flex;flex-wrap:wrap;gap:0;border:1px solid var(--line-strong);border-radius:8px;overflow:hidden;background:var(--paper-2)}
.price-sync-choice{display:inline-flex;align-items:center;gap:0;margin:0;padding:0;cursor:pointer;font-size:12.5px;color:var(--ink-soft);user-select:none}
.price-sync-choice input{position:absolute;opacity:0;pointer-events:none}
.price-sync-choice{padding:6px 11px;border-right:1px solid var(--line)}
.price-sync-choice:last-child{border-right:none}
.price-sync-choice:has(input:checked){background:var(--card);color:var(--ink);font-weight:600;box-shadow:inset 0 0 0 1px rgba(232,88,32,.35)}
.price-sync-choice:hover{color:var(--ink)}
@media(max-width:560px){
  .price-sync-main{flex-direction:column;align-items:stretch}
  .price-sync-main .btn{align-self:flex-start}
}

@media(max-width:880px){.wz{grid-template-columns:1fr}.wz-left{padding-right:0}.wz-right{border-left:none;padding-left:0;position:static;margin-top:40px}}

/* ingest dashboard */
.ing-headline{display:flex;align-items:center;gap:11px;padding:14px 18px;border-radius:12px;margin:22px 0;font-size:15px;border:1px solid var(--line)}
.ing-headline b{font-family:var(--serif);font-weight:700}
.ing-dot{width:10px;height:10px;border-radius:50%;flex:0 0 auto}
.ing-headline.ok{background:rgba(21,98,90,.07);border-color:rgba(21,98,90,.3);color:var(--ink-soft)}
.ing-headline.ok .ing-dot{background:var(--teal);box-shadow:0 0 0 3px rgba(21,98,90,.18)}
.ing-headline.blocked{background:rgba(232,88,32,.07);border-color:rgba(232,88,32,.35);color:var(--ink)}
.ing-headline.blocked .ing-dot{background:var(--accent);box-shadow:0 0 0 3px rgba(232,88,32,.18)}
.ing-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}
.ing-card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:20px 22px;box-shadow:var(--shadow)}
.ing-card h3{font-family:var(--serif);font-weight:700;font-size:15px;margin-bottom:14px;color:var(--ink)}
.ing-big{font-size:26px;font-weight:700;color:var(--ink);font-family:var(--serif);display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;line-height:1.2}
.ing-big.bad{color:var(--accent)}
.ing-big .ing-sub{font-size:13px;font-weight:400;font-family:var(--sans);color:var(--muted)}
.gauge{height:8px;border-radius:99px;background:var(--paper-2);margin:13px 0 2px;overflow:hidden;border:1px solid var(--line)}
.gauge-fill{height:100%;background:var(--teal);border-radius:99px}
.gauge-fill.bad{background:var(--accent)}
.ing-kv{list-style:none;margin:14px 0 0;padding:0}
.ing-kv li{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 0;border-top:1px solid var(--line);font-size:13.5px}
.ing-kv li span{color:var(--muted)}
.ing-kv li b{color:var(--ink);font-weight:600;text-align:right}
.ing-kv b.err{color:var(--accent);font-weight:500;font-size:12.5px}
.ing-note{font-size:12.5px;color:var(--muted);line-height:1.55;margin-bottom:10px}
.ing-rules{margin:0;padding-left:18px}
.ing-rules li{font-size:13px;color:var(--ink-soft);margin-bottom:7px;line-height:1.5}
.ing-headline.warn{background:rgba(184,134,47,.08);border-color:rgba(184,134,47,.4);color:var(--ink)}
.ing-headline.warn .ing-dot{background:#B8862F;box-shadow:0 0 0 3px rgba(184,134,47,.18)}
.ing-headtext{line-height:1.6}
.ing-statusline{font-size:12.5px;color:var(--muted)}
.ing-row-bad td{background:rgba(232,88,32,.06)}
.ing-err{color:var(--accent);font-size:12.5px}
.ing-wide{margin-top:18px}
.ing-fold>summary{cursor:pointer;font-family:var(--serif);font-weight:700;font-size:15px;color:var(--ink)}
.ing-sparkform{display:flex;gap:8px;align-items:center;font-size:13px;margin-bottom:10px}
.ing-sparks{display:flex;gap:28px;flex-wrap:wrap}
.ing-spark{display:flex;align-items:center;gap:10px}
.ing-spark .chart{width:240px;height:56px}
/* ingest 覆蓋格(coverage cells):今日小時覆蓋條 + 七日整日格 */
.cov-bar{display:inline-block;width:90px;height:8px;border-radius:99px;background:var(--paper-2);border:1px solid var(--line);overflow:hidden;vertical-align:middle}
.cov-fill{height:100%;background:var(--teal)}
.cov-cells{display:inline-flex;gap:3px;vertical-align:middle}
.cov-cell{width:12px;height:12px;border-radius:3px;border:1px solid var(--line);background:var(--paper-2)}
.cov-cell.on{background:var(--teal);border-color:var(--teal)}
.cov-cell.off{background:rgba(232,88,32,.18)}
@media(max-width:720px){.ing-grid{grid-template-columns:1fr}}

/* 自動排隊中(ledger 可觀測性) */
.ledger{margin-top:20px;border-top:1px solid var(--line);padding-top:12px}
.ledger summary{cursor:pointer;font-size:13px;color:var(--muted)}
.ledger table{margin-top:10px}
.ledger .lg-win td{background:rgba(232,88,32,.05)}

/* 目標狀態(desired-state 仲裁原型) */
.ds-summary{display:flex;flex-direction:column;gap:10px;margin-top:18px;padding:14px 16px;border:1px solid var(--line);border-radius:10px;background:var(--paper-2)}
.ds-summary-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.ds-summary-row .ds-run{margin-left:auto}
.ds-stat{font-size:14px;color:var(--ink-soft)}
.ds-stat b{font-family:var(--serif);font-size:20px;font-weight:900;color:var(--teal);margin-right:3px}
.ds-stat-blocked b{color:var(--gold)}
.ds-run{margin-left:auto}
.ds-run .btn{margin-top:0}
.ds-card{background:var(--card);border:1px solid var(--line);border-radius:12px;margin-top:16px;box-shadow:var(--shadow);overflow:hidden}
.ds-head{padding:14px 20px;border-bottom:1px solid var(--line);background:var(--paper-2)}
.ds-camp{font-family:var(--serif);font-weight:700;font-size:17px}
.ds-camp:hover{color:var(--accent-deep)}
.ds-fields{display:flex;flex-direction:column}
.ds-field{display:flex;align-items:center;gap:14px;padding:13px 20px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.ds-field:last-child{border-bottom:none}
.ds-field.ds-drift{background:rgba(232,88,32,.035)}
.ds-field.ds-blocked{background:rgba(184,134,47,.05)}
.ds-fname{font-weight:500;min-width:88px}
.ds-vals{display:flex;align-items:center;gap:10px}
.ds-actual{font-family:var(--mono);font-size:13px;color:var(--muted)}
.ds-arrow{color:var(--line-strong)}
.ds-by{margin-left:auto;font-size:12px;color:var(--muted)}
.ds-ok{background:rgba(147,136,118,.14);color:var(--muted)}
.ds-go{background:rgba(21,98,90,.14);color:var(--teal)}
.ds-hold{background:rgba(184,134,47,.16);color:var(--gold)}

/* 仲裁政策編輯 */
.policy-form{margin-top:20px;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:8px 24px 20px;box-shadow:var(--shadow);max-width:640px}
.policy-row{padding:16px 0;border-bottom:1px solid var(--line)}
.policy-row:last-of-type{border-bottom:none}
.policy-label{display:block;font-weight:500;margin-bottom:6px}
.policy-unit{color:var(--muted);font-family:var(--mono);font-size:12px;font-weight:400}
.policy-input{font-family:var(--mono);font-size:15px;width:180px;padding:8px 10px;border:1px solid var(--line-strong);border-radius:8px;background:var(--paper-2)}
.policy-input:focus{outline:none;border-color:var(--accent)}
.policy-hint{color:var(--muted);font-size:12px;margin-left:8px}
.policy-actions{display:flex;gap:12px;align-items:center;margin-top:20px}
.policy-actions .btn{margin-top:0}

/* LINE 客服浮動鈕(全站 app chrome,layout_bottom;Chromeless 頁不渲染)。
   z-index 88:高於 chart-tip(60)與 gf-savebar(3),低於手機 topbar(120)/nav-scrim(125)/
   sidebar(130)/lightbox(200)/tour(1000)——抽屜、燈箱、導覽蓋得住它。手機 tour-bubble.sheet
   底部已預留 88px(16+52=68 < 88),不互疊;小螢幕縮小並讓開 iOS safe-area。 */
.support-bubble{position:fixed;right:24px;bottom:24px;z-index:88;display:flex;align-items:center;justify-content:center;width:58px;height:58px;border-radius:50%;background:#06C755;color:#fff;box-shadow:0 6px 20px rgba(0,0,0,.22);transition:transform .15s,box-shadow .15s}
.support-bubble:hover{transform:scale(1.06);box-shadow:0 8px 26px rgba(0,0,0,.28)}
.support-bubble svg{width:30px;height:30px}
@media (max-width:720px){.support-bubble{right:calc(16px + env(safe-area-inset-right));bottom:calc(16px + env(safe-area-inset-bottom));width:52px;height:52px}.support-bubble svg{width:27px;height:27px}}

/* 許願描述(description_html 富文字,對齊 clouddesk admin.ejs 的 .wish-description;
   配色改用 goresku 變數)。 */
.wish-description{color:var(--ink-soft);font-size:14px;line-height:1.75;overflow-wrap:anywhere}
.wish-description p{margin:0 0 12px}
.wish-description>:last-child{margin-bottom:0}
.wish-description ul,.wish-description ol{margin:0 0 12px 22px;padding:0}
.wish-description li{margin-bottom:5px}
.wish-description a{color:var(--blue);font-weight:700}

/* 使用說明 /guides(hub 卡片)+ /guides/{slug}(章節頁:側邊 TOC + 長文)。 */
.guide-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}
.guide-card{display:block;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;box-shadow:var(--shadow);transition:border-color .15s}
.guide-card:hover{border-color:var(--accent)}
.guide-card .gc-step{font-family:var(--mono);font-size:11px;letter-spacing:.12em;color:var(--muted);text-transform:uppercase}
.guide-card h3{font-family:var(--serif);font-size:17px;margin:6px 0 6px}
.guide-card p{color:var(--ink-soft);font-size:13.5px;line-height:1.6}
.docs-callout{display:flex;gap:12px;align-items:flex-start;background:rgba(232,88,32,.06);border:1px solid rgba(209,78,26,.28);border-radius:10px;padding:14px 16px;margin:18px 0}
.docs-callout .ico{font-size:18px;line-height:1.4;flex:none}
.docs-callout b{color:var(--accent-deep)}
.docs-callout p{margin:2px 0 0;color:var(--ink-soft);font-size:13.5px;line-height:1.7}
.docs-layout{display:grid;grid-template-columns:200px 1fr;gap:32px;align-items:start}
.docs-nav{position:sticky;top:24px;display:flex;flex-direction:column;gap:2px;border-left:1px solid var(--line);padding-left:2px}
.docs-nav a{padding:6px 12px;border-radius:7px;font-size:13.5px;color:var(--ink-soft);border-left:2px solid transparent;margin-left:-2px}
.docs-nav a:hover{background:var(--paper);color:var(--ink)}
.docs-nav a.on{background:rgba(232,88,32,.07);color:var(--accent-deep);font-weight:500;border-left-color:var(--accent)}
.docs-prose{color:var(--ink-soft);font-size:14.5px;line-height:1.8;max-width:68ch}
.docs-prose h2{font-family:var(--serif);font-size:19px;color:var(--ink);margin:30px 0 12px}
.docs-prose h2:first-child{margin-top:0}
.docs-prose h3{font-size:15px;color:var(--ink);margin:22px 0 8px;font-weight:700}
.docs-prose p{margin:0 0 14px}
.docs-prose ul,.docs-prose ol{margin:0 0 14px 22px}
.docs-prose li{margin-bottom:8px}
.docs-prose a{color:var(--blue);font-weight:700}
.docs-prose strong{color:var(--ink)}
.docs-prose code{font-family:var(--mono);font-size:13px;background:rgba(40,30,18,.06);padding:1px 6px;border-radius:5px;color:var(--ink)}
.docs-steps{counter-reset:step;list-style:none;margin:0 0 14px;padding:0}
.docs-steps>li{position:relative;padding-left:40px;margin-bottom:18px}
.docs-steps>li::before{counter-increment:step;content:counter(step);position:absolute;left:0;top:-2px;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;font-family:var(--mono);font-size:13px;display:flex;align-items:center;justify-content:center;font-weight:600}
.docs-substeps{counter-reset:sub;list-style:none;margin:12px 0 4px;padding:0;display:flex;flex-direction:column;gap:8px}
.docs-substeps>li{display:flex;gap:11px;align-items:flex-start;background:var(--paper-2);border:1px solid var(--line);border-radius:8px;padding:10px 13px;margin:0}
.docs-substeps>li::before{counter-increment:sub;content:counter(sub);flex:none;width:24px;height:24px;border-radius:50%;background:rgba(232,88,32,.12);color:var(--accent-deep);font-family:var(--mono);font-size:12px;font-weight:600;display:flex;align-items:center;justify-content:center;margin-top:1px}
.docs-substeps .sb-body{flex:1;line-height:1.6}
.docs-substeps .t{color:var(--ink);font-weight:700;font-size:14px;margin-right:8px}
.docs-substeps .d{color:var(--ink-soft);font-size:13px}
.docs-shot{display:block;width:100%;border:1px solid var(--line-strong);border-radius:8px;margin:10px 0 4px}
.docs-shot-link{display:block;cursor:zoom-in}
.docs-shot-link:hover .docs-shot{border-color:var(--accent)}
/* 純 CSS lightbox(:target):點圖全螢幕、點遮罩關閉,無 JS。 */
.lightbox{position:fixed;inset:0;z-index:200;display:none;align-items:center;justify-content:center;background:rgba(0,0,0,.85);padding:24px}
.lightbox:target{display:flex}
.lightbox .lightbox-bg{position:absolute;inset:0;cursor:zoom-out}
.lightbox img{position:relative;max-width:96vw;max-height:92vh;border-radius:8px;box-shadow:0 10px 40px rgba(0,0,0,.5)}
.docs-shot-ph{display:flex;align-items:center;justify-content:center;text-align:center;min-height:200px;background:var(--paper-2);border:1px dashed var(--line-strong);border-radius:8px;color:var(--muted);font-size:13px;margin:10px 0 4px;padding:20px;line-height:1.7}
.docs-cap{font-size:12.5px;color:var(--muted);margin:0 0 16px}
.faq-q{font-weight:700;color:var(--ink);margin:22px 0 6px;font-size:15px}
.faq-q:first-child{margin-top:0}
@media(max-width:780px){.docs-layout{grid-template-columns:1fr}.docs-nav{position:static;flex-direction:row;flex-wrap:wrap;border-left:none;padding-left:0}}

/* ===== Product tour(自架導覽;DOM 由 tour.js 動態建立)===== */
.tour-scrim{position:fixed;inset:0;z-index:1000;display:none}
.tour-scrim.show{display:block}
.tour-hole{position:absolute;border-radius:10px;box-shadow:0 0 0 9999px rgba(28,27,25,.55);transition:all .25s cubic-bezier(.4,0,.2,1);pointer-events:none}
.tour-bubble{position:absolute;z-index:1001;width:300px;max-width:calc(100vw - 32px);background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:0 12px 40px -8px rgba(28,27,25,.35);padding:16px 16px 14px}
.tour-step{font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--muted);margin-bottom:6px}
.tour-bubble .tour-title{font-family:var(--serif);margin:0 0 6px;font-size:16px;color:var(--ink)}
.tour-bubble .tour-body{margin:0 0 14px;font-size:13.5px;line-height:1.6;color:var(--ink-soft)}
.tour-foot{display:flex;align-items:center;gap:8px}
.tour-dots{display:flex;gap:5px;margin-right:auto}
.tour-dots i{width:6px;height:6px;border-radius:50%;background:var(--line-strong)}
.tour-dots i.on{background:var(--accent)}
.tour-btn{border:1px solid var(--line-strong);background:var(--card);border-radius:8px;padding:7px 13px;font:500 13px var(--sans);cursor:pointer;color:var(--ink-soft)}
.tour-btn:hover{background:var(--paper)}
.tour-btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.tour-btn.primary:hover{background:var(--accent-deep)}
.tour-btn.skip{border:none;background:none;color:var(--muted);padding:7px 6px}
.tour-btn[disabled]{opacity:.4;cursor:default;background:var(--card)}
.tour-arrow{position:absolute;width:12px;height:12px;background:var(--card);border:1px solid var(--line);transform:rotate(45deg)}
/* 手機:氣泡改釘在畫面底部(sheet),spotlight 仍框住上方錨點。bottom 抬高避開
   右下角 PostHog support 浮動鈕(near-max z-index,壓不過 → 改讓出空間不重疊)。 */
.tour-bubble.sheet{position:fixed;left:12px;right:12px;bottom:88px;top:auto;width:auto;max-width:none}
.tour-bubble.sheet .tour-arrow{display:none}
