/* ===== 主题 Token 契约 =====
   全站唯一的变量声明处。规范见同目录 THEME.md。

   这个文件里的 :root 是「纸白」主题的取值，同时也是**契约本身**：
   一个新主题 = themes/<id>.css 里把下面标了「必填」的 55 个变量全部重新声明一遍。
   漏写不会报错，会静默继承这里的纸白值——在深色面上就是一块无法解释的白。

   ⚠️ 加载顺序：tokens.css → base.css → topic/trip/home/admin.css → themes.css
   base.css 之后的所有样式表都只准 var()，不准再声明变量。 */

:root{

  /* ---------- 面（必填 4）依次远离页底色，层级不能颠倒 ---------- */
  --paper:#F4F1EA;      /* 页面底色：body、首页统计条格子 */
  --paper-2:#FBF9F4;    /* 次级面：区块底、hover 态、表头、日历补位日与休息日 */
  --card:#FFFFFF;       /* 最上层面：卡片、输入框、日历格子、甘特底 */
  --night:#1F221F;      /* 照片未加载时的占位底 */

  /* ---------- 字（必填 5）---------- */
  --ink:#26231D;        /* 标题、正文 */
  --ink-2:#5F594D;      /* 次要正文、说明 */
  --ink-3:#8A8272;      /* 元信息 11–13px。全站 63 处，量最大。
                         P1 从 #938C7C 压深：原值在 --paper 上只有 2.96，连 3:1 都没过 */
  --ink-4:#B9B1A0;      /* 最弱：未开放专题的编号 */
  --on-ink:#FFFFFF;     /* 压在 --ink 实底上的字：分段控件选中态、跳转链接、编辑 fab */

  /* ---------- 线（必填 2）---------- */
  --line:#DED7C8;       /* 主分隔线、输入框边框、卡片边 */
  --line-2:#ECE6DA;     /* 次分隔线；也是日历/九宫格 1px gap 造出来的网格线底色 */

  /* ---------- 行程色策略（必填 4）---------- */
  /* ⚠️ 主题只能声明这四个「怎么适配」，不能声明颜色本身——见文件末尾那一段。 */
  --accent-fallback:#8A6A3A;   /* 数据没给色时的默认强调色 */
  --accent-mix:100%;           /* 行程色保留比例。100% = 原样用 */
  --accent-toward:#FFFFFF;     /* 剩余比例混向哪个字面色。深色主题往暖白提 */
  --wash-mix:0%;               /* accent 混向 --card 生成浅底的比例。0% = 用数据自带的 wash */

  /* ---------- 语义色（必填 10）---------- */
  --ok-ink:#41603F;     /* 已完成 / 成功：chip.done、后台 flash */
  --ok-bg:#EDF2EA;
  --ok-line:#5B7A5E;
  --warn-ink:#8C5A18;   /* 待核实 + 错误条 + 危险操作。⚠️ 语气必须是「需要人处理」 */
  --warn-bg:#FAF2E3;
  --warn-line:#B4762A;  /* 强：chip.warn 边、后台必填星号、删除按钮边 */
  --warn-line-2:#C9A45E;/* 弱：.unk 的虚下划线、前端错误条边 */
  --warn-bg-soft:#FDF7EC;  /* 比 warn-bg 更淡：硬约束卡片底 */
  --alert:#b23b3b;         /* 「要留意」的红：日历「休」角标的字、顶栏待审批红点的底 */
  --alert-wash:rgba(178,59,59,.10);  /* 同一个红的浅底：「休」角标的底 */
  --on-alert:#FFFFFF;      /* 压在 --alert 实底上的字：待审批红点的数字 */

  /* ---------- 浮层与叠加（必填 6）---------- */
  --scrim:rgba(38,35,29,.35);                    /* 模态遮罩 */
  --shadow-menu:0 10px 30px rgba(38,35,29,.18);  /* 顶栏用户菜单 */
  --shadow-fab:0 8px 24px rgba(38,35,29,.25);    /* 行程页的编辑悬浮按钮 */
  --shadow-modal:0 16px 48px rgba(38,35,29,.25); /* 快速创建 / 模块编辑器 */
  --topbar-bg:rgba(244,241,234,.92);  /* 滚动后粘顶栏。⚠️ 必须带透明度且与 --paper 同色系，
                                         否则 backdrop-filter 的毛玻璃失效、顶栏像块补丁 */
  --bar-inset:rgba(0,0,0,.08);        /* 甘特色条内描边，把亮色条从底上分离 */

  /* ---------- 材质（必填 3）用于主题化表面，不改变布局 ---------- */
  --paper-image:none;                 /* 页面底层的氛围纹理/渐变 */
  --surface-filter:none;              /* 卡片表面的 backdrop-filter 值 */
  --surface-shadow:none;              /* 卡片表面阴影；默认主题保持原样 */

  /* ---------- 照片上的文字（必填 8）---------- */
  /* 行程封面是用户真实照片，主题控制不了它的明暗，所以这一组永远按「压在深色照片上」设计。 */
  --hero-bg:#0A1A20;
  --hero-shade:linear-gradient(180deg,rgba(8,20,26,.5),rgba(8,20,26,.05) 45%,rgba(8,20,26,.9));
  --on-photo:#fff;                         /* 标题 */
  --on-photo-2:rgba(255,255,255,.9);       /* 日期 */
  --on-photo-3:rgba(255,255,255,.75);      /* 面包屑 */
  --on-photo-line:rgba(255,255,255,.4);    /* 面包屑下划线 */
  --on-photo-line-2:rgba(255,255,255,.3);  /* chip 边框 */
  --on-photo-fill:rgba(255,255,255,.12);   /* chip 底 */

  /* ---------- 字体（必填 3）每条 stack 必须以中文可用字体收尾 ---------- */
  --serif:"Songti SC",STSong,"Noto Serif SC","Source Han Serif SC",Georgia,serif;
  --sans:-apple-system,BlinkMacSystemFont,"PingFang SC","Noto Sans SC","Microsoft YaHei",sans-serif;
  --num:Georgia,serif;  /* 数字与日期：日历日号、时间表时刻、甘特刻度、倒计时大字 */

  /* ---------- 形状（必填 4）---------- */
  --radius-1:3px;       /* chip / 按钮 / 输入框。区间 0–10px */
  --radius-2:4px;       /* 卡片 / 模态。区间 0–10px */
  --radius-pill:999px;  /* 只能取 0 或 999px */
  /* ⚠️ 没有 --border-w，边框粗细不可主题化：站内所有细线是「1px gap + 底色」伪造出来的
     网格线，而不是真 border，还配着 margin-bottom:-1px 这类补偿。改成 2px 会让真 border
     和伪网格线对不齐。这是结构限制，不是遗漏。 */

  /* ---------- 动效（必填 2）已自动尊重 prefers-reduced-motion ---------- */
  --dur-1:.15s;         /* hover / focus。区间 0–.3s */
  --dur-2:.7s;          /* 进场 reveal。区间 0–1.2s */

  /* ---------- 密度（必填 2）---------- */
  --pad:clamp(20px,5vw,88px);  /* 页边距。上下界不超出 12px–120px */
  --max:1320px;                /* 内容最大宽。区间 1080px–1600px */

  /* ---------- 地图（必填 1）---------- */
  --map-style:amap://styles/normal;  /* 高德官方样式串。深色主题用 amap://styles/dark */

  /* ---------- 元信息（必填 1 + 1 真属性）---------- */
  --theme-name:"纸白";
  color-scheme:light;   /* ⚠️ 主题块里唯一允许写的真实 CSS 属性 */

  /* ===== CONTRACT-END ===== 上面是契约（主题必须全部声明），下面是内容色兜底（主题禁止声明）。
     ⚠️ 这行是给 lint_theme.py / build_themes.py 用的机器标记，不要删也不要改字。 */

  /* ---------- 内容色兜底 ⚠️ 主题禁止声明这四个 ----------
     行程/专题各自的颜色存在 trip_v2 / collection 表里，由 Vue 内联注入到页面元素上；
     下面只是「数据没给色时」的兜底。主题一旦声明它们，全站行程会被染成同一个颜色，
     专题辨识度直接归零。要影响它们只能通过上面的行程色策略四件套。
     P2 起 adaptAccent() 会按 --accent-fallback + 策略在运行时重算这四个值。 */
  --accent:var(--accent-fallback);   /* ← 跟着主题走。自定义属性在声明处求值，
                                          这里和 --accent-fallback 都在 :root 上，所以拿得到主题的值；
                                          行程页在后代元素上内联覆盖 --accent，照样赢。 */
  --accent-d:#6B5029;      /* 这两个的主题化由 useTheme 的 applyToDom() 在运行时补，
  --accent-wash:#F1EADC;      纯 CSS 推不出来（要按亮度算）。首帧用纸白值，差一帧不影响观感。 */
  --on-accent:#FFFFFF;  /* 压在 accent 实底上的字。⚠️ 不是常量：银杏黄 #B4862A 上白字只有 3.29，
                           P1 起由 JS 按行程色亮度逐条算出来内联覆盖 */
}
