/* settings.css —— 系统设置页样式，移植自 opc-os v0.10.3 src/web/opc/settings.html 的内联 <style>（150 行）。
   仅做两处适配：① 补一段「令牌补丁」（官方 tokens.css 里 opc.css 未复刻的几项）
   ② header 的语言/主题按钮取色沿用本站 opc.css（与 opc.html 一致）。
   变量依赖本页已引入的 opc.css（--bg/--fg/--muted/--card/--border/--accent/--accent-soft/
   --green/--danger/--radius-*，见 docs/DEVELOPMENT.md §4）。
   ⚠️ 改动本文件必须同步 settings.html 的 ?v= 戳与 DEVELOPMENT.md §4 缓存戳表。 */

/* ── 令牌：唯一源 assets/css/tokens.css（本页不重声明）────────────────────────────
   官方 settings.html 同时引 `/tokens.css` 与 `/ui.css`；本站的等价物是 assets/css/tokens.css
   （1:1 seed 自 admin/tokens.css，含 --amber #b45309）—— 原先在本文件里就地补 --amber 的
   「令牌补丁」已删除，见 docs/DESIGN-SYSTEM.md §1.1/§4#1。
   ⚠️ 不要顺手补 --text-secondary / --bg-3 / --line：官方 tokens.css 里**没有**这三个，
   它们只作为 `.av-thumb` 规则里的内联 fallback 出现（`var(--bg-3, rgba(127,127,127,.14))`）；
   `color: var(--text-secondary)` 在官方是**无效声明**（var 未定义 ⇒ 继承 --fg 色）。
   我们照抄该效果，不擅自给值，否则头像首字母颜色会比官方浅一档。 */

/* S3 设置页: 与 OPC 同色(唯一权威源 tokens.css), 零硬编码 hex; 移动端 ≤640px 单栏 */
html.i18n-pending body { visibility: hidden; }
* { box-sizing: border-box; margin: 0; padding: 0; }
body { background: var(--bg); color: var(--fg); font-family: -apple-system, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif; font-size: 14px; line-height: 1.6; }
.wrap { max-width: 1280px; margin: 0 auto; padding: 8px 24px 32px; }
a { color: var(--accent); }
header { display: flex; align-items: center; justify-content: space-between; padding: 12px 0; border-bottom: 1px solid var(--border); margin-bottom: 18px; flex-wrap: wrap; gap: 4px 12px; }
.logo { display: flex; align-items: center; gap: 10px; font-weight: 600; }
.logo svg { width: 26px; height: 26px; color: var(--accent); }
.logo .sub { color: var(--muted); font-weight: 400; font-size: 13px; margin-left: 4px; }
.hdr-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; }
.back { font-size: 13px; color: var(--muted); text-decoration: none; display: inline-flex; align-items: center; gap: 5px; }
.back:hover { color: var(--fg); }

.hero { padding: 6px 0 2px; }
.hero h1 { font-size: 25px; font-weight: 700; letter-spacing: .01em; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.hero .en { font-family: ui-monospace, Menlo, monospace; font-size: 12px; color: var(--muted); font-weight: 500; margin-top: 6px; }
.hero p { color: var(--muted); font-size: 14px; margin-top: 10px; line-height: 1.7; word-break: break-word; max-width: 860px; }
.hero .ts { color: var(--muted); font-size: 12px; margin-top: 10px; font-variant-numeric: tabular-nums; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

.err-bar { display: none; margin: 10px 0; padding: 9px 12px; border-radius: var(--radius-md, 8px); font-size: 13px; }
.err-bar.on { display: block; }
.err-bar.bad { color: color-mix(in srgb, var(--danger) 65%, var(--fg)); background: color-mix(in srgb, var(--danger) 9%, var(--card)); border: 1px solid color-mix(in srgb, var(--danger) 35%, var(--border)); }
.err-bar.good { color: color-mix(in srgb, var(--green) 65%, var(--fg)); background: color-mix(in srgb, var(--green) 9%, var(--card)); border: 1px solid color-mix(in srgb, var(--green) 35%, var(--border)); }

/* 登录门(非超管) */
.authwall { display: none; background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-lg, 14px); padding: 42px 20px; text-align: center; margin: 26px 0; }
.authwall.on { display: block; }
.authwall .aw-ico { width: 44px; height: 44px; border-radius: 50%; background: var(--accent-soft); color: var(--accent); display: inline-flex; align-items: center; justify-content: center; margin-bottom: 12px; }
.authwall p { color: var(--muted); margin-bottom: 16px; }

main { display: none; }
main.on { display: block; }

/* 区块卡 */
.card { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-lg, 14px); padding: 18px 20px; margin-top: 18px; }
.card-h { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.card-h h2 { font-size: 16px; font-weight: 700; }
.card-h .tag { font-family: ui-monospace, Menlo, monospace; font-size: 11px; color: var(--muted); font-weight: 500; }
.card-h .hint { font-size: 12px; color: var(--muted); margin-inline-start: auto; text-align: end; }
.card-b { display: flex; flex-direction: column; gap: 12px; }

.row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.row .grow { flex: 1; min-width: 220px; }
.lbl { font-size: 12.5px; color: var(--muted); margin-bottom: 4px; display: flex; align-items: center; gap: 6px; }
input[type="text"], select, textarea { font: inherit; color: var(--fg); background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-md, 8px); padding: 7px 10px; outline: none; width: 100%; }
input[type="text"]:focus, textarea:focus { border-color: var(--accent); }
input[type="text"]:disabled { opacity: .55; }
textarea { resize: vertical; min-height: 30px; }
button.btn { font: inherit; color: var(--fg); background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-md, 8px); padding: 7px 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
button.btn svg { width: 14px; height: 14px; stroke: currentColor; flex-shrink: 0; }
button.btn:hover { border-color: var(--accent); }
button.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--bg); }
button.btn.primary:hover { filter: brightness(1.06); }
button.btn.danger { color: color-mix(in srgb, var(--danger) 65%, var(--fg)); border-color: color-mix(in srgb, var(--danger) 45%, var(--border)); }
button.btn:disabled { opacity: .5; cursor: not-allowed; }
.hintline { font-size: 12px; color: var(--muted); }
.okline { font-size: 12.5px; color: color-mix(in srgb, var(--green) 65%, var(--fg)); display: none; align-items: center; gap: 5px; }
.okline.on { display: inline-flex; }
.warnline { font-size: 12.5px; color: color-mix(in srgb, var(--danger) 65%, var(--fg)); display: none; }
.warnline.on { display: block; }

/* 成员表 */
table { width: 100%; border-collapse: collapse; font-size: 13px; }
thead th { text-align: start; font-size: 11.5px; font-weight: 600; color: var(--muted); padding: 8px 10px; border-bottom: 1px solid var(--border); white-space: nowrap; }
tbody td { padding: 8px 10px; border-bottom: 1px solid var(--border); vertical-align: middle; }
tbody tr:last-child td { border-bottom: none; }
.tblwrap { overflow-x: auto; }
.tblrow-role { font-size: 12px; color: var(--muted); }
.tblrow-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
/* 成员头像（0917）：缩略图 + 姓名同格（列数不变，移动端不挤） */
.av-cell { display: flex; align-items: center; gap: 10px; }
.av-thumb { width: 34px; height: 34px; flex: 0 0 34px; border-radius: 50%; overflow: hidden;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--bg-3, rgba(127,127,127,.14)); border: 1px solid var(--line, rgba(127,127,127,.22)); }
.av-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.av-thumb i { font-style: normal; font-size: 14px; font-weight: 600; color: var(--text-secondary); }
.av-field { flex: 1 1 auto; min-width: 0; }
@media (max-width: 640px) {
  .tblrow-actions { gap: 6px; }
  .tblrow-actions .btn { padding: 6px 8px; }
  .av-thumb { width: 30px; height: 30px; flex-basis: 30px; }
}
.tblrow-actions .okline { white-space: nowrap; }
td .fld { min-width: 130px; }
td .fld.en { min-width: 150px; }
/* 尺寸胶水（卡 t_13dae45f）：cron 成员下拉改用站内共享自定义下拉（.c-select*），
   形制对齐本页裸 select 规则（7px 10px / 13px / --radius-md），组件本身只管弹层视觉。 */
.cron-detail .c-select { min-width: 130px; }
/* 字号不写死：原 select 走 `font: inherit` 继承 .cron-row 的 12.5px，胶水同样让它继承（保持一致）。 */
.cron-detail .c-select-btn { padding: 7px 10px; padding-inline-end: 28px; font-size: inherit; border-radius: var(--radius-md, 8px); background: var(--bg); }

/* ── cron 归因表：**回到原版 4 列 grid 表格**（2026-10-01 t_aff3d282，撤销上一版新造样式）─────
   列 = 调度任务 | 成员 | 动作 | 描述（原版 4 列，不膨胀）；行内第一行 = 原版单元格文本，
   新增信息一律挂 **原版就有的 .j-sub 次级行**（11px / var(--muted)）：
     · 调度任务列次级行 = 人话周期 · 下次运行（原始 cron 表达式进 title，不占版面）
     · 动作列次级行     = 成本口径（零token / LLM）· 最近结果
   状态 = 作业名的**行首一个字符**（✓ 正常 / ✗ 失败 / · 未跑），失败行整格标红 ——
   不新建徽章 / 状态灯 / 汇总卡组件（上一版的 .cron-led/.cron-badge/.cron-sum* 已删；
   汇总条与图例改用本页既有的 .hintline，角标改用既有的 .tag）。
   行高对齐同页「AI 成员」表：两行内容 37.6px + padding 8px×2 + 1px 边框 ≈ 54.6px（成员行实测 53.8px）
   ⇒ 行 padding 取成员表单元格同值 8px（原版 12px 是给**单行**内容的，仍用它会把两行行撑到 62px，
   与成员行目视不一致）。点行 → 展开 .cron-detail 编辑态（成员下拉 / 动作 / 描述 → 保存归因）；
   窄屏 ≤640px 回原版单列。 */
.cron-head, .cron-row { display: grid; grid-template-columns: minmax(130px, 1.1fr) minmax(130px, 1fr) minmax(120px, .9fr) minmax(180px, 2fr); gap: 10px; align-items: center; }
.cron-head { padding: 2px 0 6px; font-size: 11.5px; font-weight: 600; color: var(--muted); border-bottom: 1px solid var(--border); }
.cron-row { padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 12.5px; cursor: pointer; }
.cron-row:last-child { border-bottom: none; }
.cron-job { font-family: ui-monospace, Menlo, monospace; font-size: 12.5px; color: var(--fg); word-break: break-all; }
.cron-job .j-sub, .cron-row .j-sub { display: block; font-family: inherit; font-size: 11px; color: var(--muted); }
.cron-row.is-fail .cron-job { color: color-mix(in srgb, var(--danger) 65%, var(--fg)); }
.cron-row .tag { font-family: ui-monospace, Menlo, monospace; font-size: 11px; color: var(--muted); }
.cron-desc { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.cron-detail { display: none; grid-column: 1 / -1; }
.cron-row.open .cron-detail { display: block; cursor: auto; }
.cron-detail .row { align-items: flex-start; }
.cron-empty { color: var(--muted); font-size: 13px; padding: 12px 0; }
.hintline .bad { color: color-mix(in srgb, var(--danger) 65%, var(--fg)); }

/* 口令 */
.token-box { display: none; margin-top: 6px; }
.token-box.on { display: block; }
.token-line { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.token-val { font-family: ui-monospace, Menlo, monospace; font-size: 13px; background: var(--bg); border: 1px dashed var(--border); border-radius: var(--radius-md, 8px); padding: 7px 10px; word-break: break-all; flex: 1; min-width: 240px; }

/* 服务 */
.svc-state { display: inline-flex; align-items: center; gap: 6px; }
.svc-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex-shrink: 0; }
.svc-active .svc-dot { background: var(--green); }
.svc-inactive .svc-dot { background: var(--muted); }
.svc-not-found { color: color-mix(in srgb, var(--danger) 65%, var(--fg)); }
.svc-not-found .svc-dot { background: var(--danger); }
.svc-empty { color: var(--muted); font-size: 13px; padding: 10px 0; }

/* traffic 开关 */
.traffic-state { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; }
.traffic-state .on { color: color-mix(in srgb, var(--green) 65%, var(--fg)); }
.traffic-state .off { color: var(--muted); }

/* toast */
#toast { position: fixed; bottom: 22px; inset-inline-start: 50%; transform: translateX(-50%); background: var(--fg); color: var(--bg); padding: 9px 16px; border-radius: var(--radius-pill, 999px); font-size: 13px; box-shadow: 0 6px 22px rgba(0,0,0,.18); z-index: 99; display: none; max-width: 86vw; }
#toast.bad { background: var(--danger); color: var(--bg); }
#toast.on { display: block; animation: toast-in .18s ease-out; }
@keyframes toast-in { from { opacity: 0; transform: translate(-50%, 8px); } to { opacity: 1; transform: translate(-50%, 0); } }
[dir="rtl"] #toast { transform: translateX(50%); }
[dir="rtl"] #toast.on { animation-name: toast-in-rtl; }
@keyframes toast-in-rtl { from { opacity: 0; transform: translate(50%, 8px); } to { opacity: 1; transform: translate(50%, 0); } }

@media (max-width: 640px) {
  .card { padding: 14px; }
  .cron-head { display: none; }                        /* 单列时表头没有意义（原版同款：只留行） */
  .cron-row { grid-template-columns: 1fr; gap: 4px 0; }
  .row { align-items: flex-start; flex-direction: column; gap: 8px; }
  .row .grow { min-width: 0; width: 100%; }
  td .fld { min-width: 0; }
}
@media (max-width: 375px) {
  .card-h .hint { margin-inline-start: 0; text-align: start; width: 100%; }
}

/* ── 本站补丁（不改官方观感，仅为站内约定） ───────────────────────────────── */
/* 演示口径提示行：#updatedTs 跟在演示说明之后 */
.hero .ts #updatedTs:not(:empty)::before { content: "·"; margin-inline-end: 6px; }
/* 2026-10-01 t_7bcedfe0：「修改登录密码」表单的密码输入框。
   官方页没有 password 控件（上面逐字移植的规则只覆盖 input[type="text"]），故单列一条，
   值与官方 text 输入框逐项一致，观感不引入新样式。 */
input[type="password"] { font: inherit; color: var(--fg); background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-md, 8px); padding: 7px 10px; outline: none; width: 100%; }
input[type="password"]:focus { border-color: var(--accent); }
input[type="password"]:disabled { opacity: .55; }
