/* ============================================================
   映丞周易平台 · 应用壳样式（app.css）
   依赖：brand-tokens.css / site.css（先加载）
   ============================================================ */

/* ---------- 壳布局：侧栏 + 内容 ---------- */
.shell {
  display: grid; grid-template-columns: 216px 1fr;
  /* dvh（动态视口）优先，vh 兜底 —— 老 WebView/微信内置浏览器不认 dvh 会整条失效 */
  min-height: calc(100vh - 64px);
  min-height: calc(100dvh - 64px);
}
.side {
  background: var(--surface); border-right: 1px solid var(--line);
  padding: var(--sp-4) var(--sp-3);
  display: flex; flex-direction: column;
  /* 侧栏独立吸顶滚动：否则顶栏 + 协议横幅的高度差会让侧栏比视口高，
     底部用户信息被切掉、整页出现多余纵向滚动条 */
  position: sticky; top: 0; align-self: start;
  max-height: 100vh;
  max-height: 100dvh;
  overflow-y: auto;
}
.side nav { display: grid; gap: 2px; }
.side nav a {
  display: flex; align-items: center; gap: 10px;
  font-size: var(--fs-14); color: var(--ink-2);
  padding: 10px 12px; border-radius: var(--r-md);
  border-left: 3px solid transparent;
}
.side nav a:hover { background: var(--surface-2); color: var(--ink); }
.side nav a.is-on {
  background: var(--brand-indigo-soft); color: var(--brand-indigo);
  font-weight: 600; border-left-color: var(--brand-indigo);
}
.side nav a .ic { flex: 0 0 auto; opacity: .8; }

/* 用户区（侧栏底部）*/
.user-box { margin-top: auto; padding-top: var(--sp-4); border-top: 1px solid var(--line); }
.u-name { font-size: var(--fs-14); font-weight: 600; color: var(--ink); }
.u-role { font-size: var(--fs-12); color: var(--ink-3); margin: 2px 0 var(--sp-2); }
.u-out {
  font-size: var(--fs-12); color: var(--ink-3); background: none;
  border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 10px; cursor: pointer;
}
.u-out:hover { color: var(--danger); border-color: var(--danger); }

/* 内容区 */
.content { padding: var(--sp-6) clamp(var(--sp-4), 4vw, var(--sp-12)); min-width: 0; }
.page-title { font-family: var(--font-serif); font-size: var(--fs-28); color: var(--brand-indigo); margin-bottom: var(--sp-1); }
.page-sub { font-size: var(--fs-13); color: var(--ink-3); margin-bottom: var(--sp-5); }

/* 嵌入的排盘工具（#/new-paipan）
   ⚠️ 之前这条规则**完全缺失** → iframe 退回浏览器默认的 300×150，
   于是「新建排盘」页只剩一个滚动条小框、下方大片空白。 */
.paipan-frame {
  display: block;
  width: 100%;
  height: calc(100vh - 210px);
  height: calc(100dvh - 210px);
  min-height: 620px;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--surface);
  color-scheme: light;
}
@media (max-width: 860px) {
  .paipan-frame { height: calc(100vh - 150px); height: calc(100dvh - 150px); min-height: 560px; }
}

/* 403/404 提示页 */
.block-page { max-width: 560px; margin: clamp(24px, 8vw, 80px) auto; text-align: center; padding: clamp(var(--sp-5), 6vw, 48px); }
.block-tag { font: 700 var(--fs-13)/1 var(--font-num); letter-spacing: .16em; margin-bottom: var(--sp-3); }
.block-page h1, .block-page h2 { font-family: var(--font-serif); font-size: var(--fs-22); color: var(--ink); }
.block-desc { font-size: var(--fs-14); color: var(--ink-2); line-height: 1.8; margin: var(--sp-3) 0 var(--sp-5); }

/* 占位模块卡 */
.mod-grid { display: grid; gap: var(--sp-4); grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); }
.mod-card { padding: var(--sp-5); }
.mod-card h3 { font-size: var(--fs-16); color: var(--ink); }
.mod-card p { font-size: var(--fs-13); color: var(--ink-2); margin-top: var(--sp-2); line-height: 1.75; }
.mod-soon { display: inline-block; margin-top: var(--sp-3); font-size: var(--fs-12); color: var(--brand-bronze); }

/* ---------- 响应式：窄屏侧栏折叠为顶部横排 ---------- */
@media (max-width: 860px) {
  .shell { grid-template-columns: 1fr; }
  .side { border-right: 0; border-bottom: 1px solid var(--line); flex-direction: column; }
  .side nav { grid-template-columns: repeat(auto-fit, minmax(96px, 1fr)); gap: 4px; }
  .side nav a { flex-direction: column; gap: 4px; text-align: center; padding: 8px 4px; border-left: 0; font-size: var(--fs-12); }
  .side nav a.is-on { border-left: 0; }
  .user-box { display: flex; align-items: center; gap: var(--sp-3); margin-top: var(--sp-3); }
  .u-role { margin: 0; }
  .content { padding: var(--sp-5) var(--sp-4); }
}

/* 引擎状态页（批次②）：键值表 */
.eng-loading { font-size: var(--fs-14); color: var(--ink-3); }
table.kv { width: 100%; border-collapse: collapse; margin-top: var(--sp-3); }
table.kv th, table.kv td { text-align: left; padding: 8px 4px; border-bottom: 1px solid var(--line); font-size: var(--fs-13); }
table.kv th { width: 120px; color: var(--ink-3); font-weight: 600; white-space: nowrap; }
table.kv td { color: var(--ink-2); }
table.kv code { font-family: var(--font-num); background: var(--surface-2); padding: 2px 6px; border-radius: var(--r-sm); }

/* ============================================================
   解读工作台（批次③，原型 P02）
   ============================================================ */
.wb-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-4);
  padding-bottom: var(--sp-3); border-bottom: 1px solid var(--line); margin-bottom: var(--sp-4); }
.wb-case { font-size: var(--fs-13); color: var(--ink-2); display: flex; align-items: center; gap: var(--sp-2); }
.wb-case select { height: 34px; padding: 0 8px; font: 400 var(--fs-14)/1 var(--font-sans);
  border: 1px solid var(--line-strong); border-radius: var(--r-md); background: var(--surface); color: var(--ink); }
.wb-meta { font-size: var(--fs-13); color: var(--ink-3); }
.wb-meta b { color: var(--ink); font-family: var(--font-num); letter-spacing: .04em; }

/* 五步流程条 */
.wb-steps { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin: 0 0 var(--sp-4); }
.wb-steps li { display: flex; align-items: center; gap: 6px; font-size: var(--fs-12); color: var(--ink-3);
  padding: 5px 12px; border: 1px solid var(--line); border-radius: var(--r-full); background: var(--surface); }
.wb-steps li .n { width: 18px; height: 18px; border-radius: 50%; background: var(--surface-2); color: var(--ink-3);
  font: 700 11px/18px var(--font-num); text-align: center; }
.wb-steps li.done { color: var(--brand-indigo); border-color: var(--brand-indigo-soft); background: var(--brand-indigo-soft); }
.wb-steps li.done .n { background: var(--brand-indigo); color: #fff; }
.wb-steps li.on { color: #fff; border-color: var(--brand-indigo); background: var(--brand-indigo); }
.wb-steps li.on .n { background: rgba(255,255,255,.25); color: #fff; }

/* 三栏 */
.wb { display: grid; grid-template-columns: 288px minmax(0,1fr) 300px; gap: var(--sp-4); align-items: start; }
.wb-left, .wb-right { position: sticky; top: 76px; display: grid; gap: var(--sp-3); }
.wb-h { font-size: var(--fs-13); color: var(--ink-2); letter-spacing: .04em; margin-top: var(--sp-2); }
.wb-h .wb-count { font: 700 var(--fs-12)/1 var(--font-num); color: var(--brand-cinnabar); }
.wb-hint { font-size: var(--fs-12); color: var(--ink-3); padding: var(--sp-3) 0; }

/* 排盘快照 */
.snap-box { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--r-md); padding: var(--sp-3); }
.snap-p { text-align: center; }
.snap-p b { display: block; font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); }
.snap-p .ss { font-size: 10px; color: var(--ink-3); }
.snap-ver { font: 600 var(--fs-12)/1.6 var(--font-num); color: var(--brand-bronze); }
.snap-note { font-size: var(--fs-12); color: var(--ink-3); }

/* 命中规则清单 */
.hits { display: grid; gap: 4px; max-height: 40vh; overflow: auto; }
.hit { display: flex; align-items: center; gap: 6px; font-size: var(--fs-12);
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 6px 8px; }
.hit .rid { font: 700 var(--fs-12)/1 var(--font-num); color: var(--brand-indigo); }
.hit .hname { color: var(--ink); flex: 1; }
.hit .hcat { font-size: 10px; color: var(--ink-3); }

/* 中栏：底稿 */
.wb-title { font-family: var(--font-serif); font-size: var(--fs-22); color: var(--brand-indigo); }
.wb-sub { font-size: var(--fs-13); color: var(--ink-3); margin-bottom: var(--sp-4); }
.wb-empty { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: clamp(var(--sp-5),6vw,48px); text-align: center; }
.wb-empty h3 { font-family: var(--font-serif); color: var(--ink); }
.wb-empty p { font-size: var(--fs-13); color: var(--ink-2); margin: var(--sp-2) 0 var(--sp-4); }
.wb-sec { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: var(--sp-4); margin-bottom: var(--sp-3); }
.wb-sec h3 { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo);
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.wb-sec .badges { display: inline-flex; flex-wrap: wrap; gap: 4px; }
.para { border-top: 1px dashed var(--line); padding-top: var(--sp-3); margin-top: var(--sp-3); }
.para-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.para-head .pname { font-size: var(--fs-12); color: var(--ink-3); }
.para-edit { width: 100%; font: 400 var(--fs-14)/1.7 var(--font-sans); color: var(--ink);
  border: 1px solid var(--line); border-radius: var(--r-md); padding: 8px 10px; resize: vertical; }
.para-edit:focus { outline: 2px solid var(--brand-indigo); outline-offset: -1px; }
.para.bad { background: var(--brand-cinnabar-soft); border-radius: var(--r-md); padding: var(--sp-2); }
.para-warn { font-size: var(--fs-12); color: var(--brand-cinnabar); margin-top: 4px; }
.para.dis p { font-size: var(--fs-12); color: var(--ink-3); line-height: 1.8; }

/* 右栏：闸卡 */
.gate-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: var(--sp-4); }
.gate-card h4 { font-size: var(--fs-13); color: var(--brand-indigo); margin-bottom: var(--sp-2); }
.gate-card p { font-size: var(--fs-12); color: var(--ink-2); line-height: 1.7; }
.gate-card.rule3 { background: var(--brand-indigo-soft); border-color: var(--brand-indigo-soft); }
.gate-card.ok { border-color: var(--ok-soft); background: var(--ok-soft); }
.gate-card.bad { border-color: var(--danger-soft); background: var(--danger-soft); }
.ok-line { color: var(--ok); font-weight: 600; }
.bad-line { color: var(--danger); font-weight: 600; }
.scan-words { display: flex; flex-wrap: wrap; gap: 4px; margin: var(--sp-2) 0; }
.st-badge { display: inline-block; font: 600 var(--fs-12)/1 var(--font-sans); color: var(--brand-indigo);
  background: var(--brand-indigo-soft); padding: 5px 10px; border-radius: var(--r-full); }
.log { display: flex; justify-content: space-between; font-size: var(--fs-12); color: var(--ink-2); padding: 4px 0; border-bottom: 1px dashed var(--line); }
.log .ltime { color: var(--ink-3); font-family: var(--font-num); }
.wb-msg { font-size: var(--fs-12); color: var(--brand-indigo); background: var(--brand-indigo-soft);
  padding: 8px 10px; border-radius: var(--r-md); }

/* 响应式：窄屏单栏 */
@media (max-width: 1100px) {
  .wb { grid-template-columns: 1fr; }
  .wb-left, .wb-right { position: static; }
}

/* ============================================================
   业务模块（批次④）：命例档案 / 客户 / 排期
   ============================================================ */
.mod-bar { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between;
  gap: var(--sp-3); padding-bottom: var(--sp-3); border-bottom: 1px solid var(--line); margin-bottom: var(--sp-4); }
.mod-title { font-family: var(--font-serif); font-size: var(--fs-22); color: var(--brand-indigo); margin: 0; line-height: 1.35; }
.mod-sub { font-size: var(--fs-13); color: var(--ink-3); margin-top: 2px; }
.mod-tools { display: flex; gap: var(--sp-2); align-items: center; }
.mod-search { height: 34px; width: 220px; padding: 0 10px; font: 400 var(--fs-14)/1 var(--font-sans);
  border: 1px solid var(--line-strong); border-radius: var(--r-md); background: var(--surface); color: var(--ink); }
.mod-search:focus { outline: 2px solid var(--brand-indigo); outline-offset: -1px; }

/* 列表行（命例/客户共用） */
.ml-list { display: grid; gap: var(--sp-2); }
.ml-row { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; }
.ml-row.open { border-color: var(--brand-indigo-soft); box-shadow: var(--shadow-1); }
.ml-head { display: grid; grid-template-columns: minmax(0,1.6fr) minmax(0,1.2fr) minmax(0,1fr) auto;
  gap: var(--sp-3); align-items: center; padding: var(--sp-3) var(--sp-4); }
.ml-name { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
.ml-name b { font-size: var(--fs-15); color: var(--ink); }
.ml-sex { font-size: var(--fs-12); color: var(--ink-3); }
.tag { font-size: 10px; color: var(--brand-bronze); background: var(--brand-bronze-soft);
  padding: 2px 7px; border-radius: var(--r-full); }
.ml-pillars { font-family: var(--font-num); font-size: var(--fs-14); color: var(--brand-indigo); letter-spacing: .04em; }
.ml-gego { font-size: var(--fs-12); color: var(--ink-2); }
.ml-ops { display: flex; gap: var(--sp-3); }
.lnk { background: none; border: 0; font-size: var(--fs-12); color: var(--brand-indigo); cursor: pointer; padding: 2px; }
.lnk:hover { text-decoration: underline; }
.lnk.danger { color: var(--brand-cinnabar); }

/* 详情区 */
.ml-detail { padding: var(--sp-4); border-top: 1px dashed var(--line); background: var(--surface-2); }
.kv2 { display: flex; gap: var(--sp-3); font-size: var(--fs-13); padding: 3px 0; }
.kv2 span { width: 72px; flex: 0 0 auto; color: var(--ink-3); }
.kv2 b { font-weight: 500; color: var(--ink-2); }
.ml-h4 { font-size: var(--fs-12); color: var(--ink-3); letter-spacing: .06em; margin: var(--sp-4) 0 var(--sp-2); }
.fu { display: flex; gap: var(--sp-3); font-size: var(--fs-13); color: var(--ink-2); padding: 4px 0; }
.fud { flex: 0 0 auto; font-family: var(--font-num); color: var(--ink-3); font-size: var(--fs-12); }
.fu-add { display: flex; gap: var(--sp-2); margin-top: var(--sp-3); flex-wrap: wrap; }
.fu-input { flex: 1 1 200px; height: 34px; padding: 0 10px; font: 400 var(--fs-13)/1 var(--font-sans);
  border: 1px solid var(--line-strong); border-radius: var(--r-md); background: var(--surface); color: var(--ink); }
.fu-sel { height: 34px; padding: 0 8px; font: 400 var(--fs-13)/1 var(--font-sans);
  border: 1px solid var(--line-strong); border-radius: var(--r-md); background: var(--surface); color: var(--ink); }

/* 新建表单 */
.mod-form { background: var(--surface); border: 1px solid var(--brand-indigo-soft);
  border-radius: var(--r-lg); padding: var(--sp-4); margin-top: var(--sp-4); }
.mod-form h3 { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); margin-bottom: var(--sp-3); }
.fgrid { display: grid; gap: var(--sp-3); grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); }
.fgrid label { display: grid; gap: 4px; font-size: var(--fs-12); color: var(--ink-3); }
.fgrid input, .fgrid select { height: 34px; padding: 0 10px; font: 400 var(--fs-14)/1 var(--font-sans);
  border: 1px solid var(--line-strong); border-radius: var(--r-md); background: var(--surface); color: var(--ink); }
.fbtns { display: flex; gap: var(--sp-2); margin-top: var(--sp-4); }
.fmsg { font-size: var(--fs-12); color: var(--brand-cinnabar); margin-top: var(--sp-2); min-height: 18px; }

/* 排期订单 */
.stat-row { display: grid; gap: var(--sp-3); grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); margin-bottom: var(--sp-4); }
.stat { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: var(--sp-3); text-align: center; }
.stat b { display: block; font-family: var(--font-num); font-size: var(--fs-22); color: var(--brand-indigo); }
.stat span { font-size: var(--fs-12); color: var(--ink-3); }
.od-list { display: grid; gap: var(--sp-2); }
.od-row { display: grid; grid-template-columns: 110px minmax(0,1.3fr) minmax(0,1.3fr) 90px auto;
  gap: var(--sp-3); align-items: center; background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: var(--sp-3) var(--sp-4); }
.od-row.done { opacity: .72; }
.od-row.cancel { opacity: .5; text-decoration: line-through; }
.od-date b { display: block; font-family: var(--font-num); font-size: var(--fs-14); color: var(--ink); }
.od-date span, .od-cust span, .od-svc span { font-size: var(--fs-12); color: var(--ink-3); }
.od-cust b, .od-svc b { display: block; font-size: var(--fs-14); color: var(--ink); font-weight: 500; }

@media (max-width: 860px) {
  .ml-head { grid-template-columns: 1fr; gap: var(--sp-1); }
  .od-row { grid-template-columns: 1fr; gap: var(--sp-1); }
  .mod-search { width: 100%; }
  .mod-bar { align-items: stretch; }
}

/* ============================================================
   批次⑤：万年历 + 提醒中心 + 增值服务
   ============================================================ */

/* ---------- 通用小件 ---------- */
.yc-btn.tiny { padding: 5px 10px; font-size: var(--fs-12); border-radius: var(--r-sm); }
.yc-input {
  width: 100%; height: 36px; padding: 0 10px;
  font: 400 var(--fs-14)/1 var(--font-sans);
  color: var(--ink); background: var(--surface);
  border: 1px solid var(--line-strong); border-radius: var(--r-md);
}
textarea.yc-input { height: auto; padding: 8px 10px; line-height: 1.6; resize: vertical; }
select.yc-input { cursor: pointer; }
.yc-seg { flex-wrap: wrap; }
.yc-seg button.is-on { background: var(--brand-indigo); color: #fff; }

/* ---------- 万年历 ---------- */
.cal-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); margin-bottom: var(--sp-4); }
.cal-title { font-family: var(--font-serif); font-size: var(--fs-22); color: var(--brand-indigo); margin: 0 var(--sp-2); }

.cal-today {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
  gap: var(--sp-4); background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: var(--sp-4); margin-bottom: var(--sp-4);
}
.cal-today-date { font-family: var(--font-num); font-size: var(--fs-22); color: var(--ink); }
.cal-week { font-family: var(--font-sans); font-size: var(--fs-13); color: var(--ink-3); margin-left: 6px; }
.cal-today-lunar { font-size: var(--fs-14); color: var(--ink-2); margin-top: 4px; }
.cal-today-gz { font-size: var(--fs-14); color: var(--brand-indigo); margin-top: 4px; }
.cal-today-side { display: grid; gap: var(--sp-2); }
.cal-kv { display: grid; grid-template-columns: 84px minmax(0, 1fr); gap: 4px var(--sp-2);
  font-size: var(--fs-13); align-items: baseline; }
.cal-kv span { color: var(--ink-3); }
.cal-kv b { color: var(--ink); font-weight: 600; }
.cal-kv em { grid-column: 2; font-style: normal; font-size: var(--fs-12); color: var(--ink-3); }

.cal-week-head { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; margin-bottom: 4px; }
.cal-week-head span { text-align: center; font-size: var(--fs-12); color: var(--ink-3); padding: 4px 0; }

.cal-grid { display: grid; gap: 4px; }
.cal-row { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.cal-cell {
  min-height: 76px; padding: 6px 4px; border-radius: var(--r-md);
  background: var(--surface); border: 1px solid var(--line);
  cursor: pointer; transition: border-color .15s, background .15s;
}
.cal-cell:hover { border-color: var(--brand-indigo); }
.cal-cell.is-out { opacity: .38; }
.cal-cell.is-weekend .cal-d { color: var(--brand-cinnabar); }
.cal-cell.is-today { background: var(--brand-indigo-soft); border-color: var(--brand-indigo); }
.cal-cell.is-today .cal-d { color: var(--brand-indigo); font-weight: 700; }
.cal-cell.is-term { background: var(--brand-bronze-soft); border-color: var(--brand-bronze); }
.cal-d { font-family: var(--font-num); font-size: var(--fs-15); color: var(--ink); }
.cal-l { font-size: var(--fs-12); color: var(--ink-3); margin-top: 2px; }
.cal-gz { font-size: var(--fs-12); color: var(--brand-indigo); margin-top: 2px; }
.cal-jq { margin-top: 3px; font-size: var(--fs-12); font-weight: 600; color: var(--brand-bronze); }

.cal-tip {
  position: fixed; right: 20px; bottom: 20px; z-index: 70; display: none;
  max-width: 300px; background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--r-lg); padding: var(--sp-3); box-shadow: 0 8px 28px rgba(27,59,111,.16);
}
.cal-tip b { display: block; font-family: var(--font-num); color: var(--ink); margin-bottom: 4px; }
.cal-tip span { display: block; font-size: var(--fs-12); color: var(--ink-2); }
.cal-tip span.is-term { color: var(--brand-bronze); }
.cal-tip button { margin-top: var(--sp-2); }

.cal-jq-list { margin-top: var(--sp-4); background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: var(--sp-4); }
.cal-jq-list h3 { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); margin-bottom: var(--sp-2); }
.cal-jq-list ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.cal-jq-list li { display: flex; justify-content: space-between; font-size: var(--fs-13);
  border-bottom: 1px dashed var(--line); padding-bottom: 5px; }
.cal-jq-list li b { color: var(--ink); }
.cal-jq-list li span { font-family: var(--font-num); color: var(--ink-3); }

.cal-diff { margin-top: var(--sp-4); background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: var(--sp-4); }
.cal-diff h3 { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); margin-bottom: var(--sp-2); }
.cal-hint { font-size: var(--fs-12); color: var(--ink-3); margin: var(--sp-2) 0; }
.cal-case-select { max-width: 320px; }
.cal-diff-row { display: flex; justify-content: space-between; font-size: var(--fs-13);
  padding: 6px 0; border-bottom: 1px dashed var(--line); }
.cal-diff-row span { color: var(--ink-3); }
.cal-diff-row b { color: var(--ink); }
.cal-node-list { list-style: none; margin: var(--sp-2) 0 0; padding: 0; display: grid; gap: 4px; }
.cal-node-list li { display: grid; grid-template-columns: 130px 1fr auto; gap: var(--sp-2);
  font-size: var(--fs-13); padding: 5px 8px; border-radius: var(--r-sm); background: var(--surface-2); }
.cal-node-list li.is-next { background: var(--brand-indigo-soft); }
.cal-node-list li b { color: var(--brand-indigo); }
.cal-node-list li span { font-family: var(--font-num); color: var(--ink-2); }
.cal-node-list li em { font-style: normal; color: var(--ink-3); font-size: var(--fs-12); }

/* ---------- 提醒中心 ---------- */
.rem-layout { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: var(--sp-4); align-items: start; }
.rem-main h3, .rem-side h3 { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); margin-bottom: var(--sp-3); }
.rem-h3 { margin-top: var(--sp-4) !important; }
.rem-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-2); }
.rem-item { border: 1px solid var(--line); border-left: 3px solid var(--brand-indigo);
  border-radius: var(--r-md); padding: var(--sp-3); background: var(--surface); }
.rem-item.is-birthday  { border-left-color: var(--brand-cinnabar); }
.rem-item.is-anniversary { border-left-color: var(--brand-bronze); }
.rem-item.is-jieqi { border-left-color: var(--ok); }
.rem-item.is-dayun, .rem-item.is-liunian { border-left-color: var(--brand-indigo); }
.rem-item.is-period { border-left-color: #8E6BB5; }
.rem-item.is-todo { border-left-color: var(--ink-3); }
.rem-item-head { display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-2); }
.rem-item-head b { color: var(--ink); font-size: var(--fs-14); }
.rem-badge { font: 600 var(--fs-12)/1 var(--font-sans); color: var(--brand-indigo);
  background: var(--brand-indigo-soft); border-radius: var(--r-full); padding: 3px 9px; }
.rem-text { font-size: var(--fs-13); color: var(--ink-2); margin: 4px 0 0; }
.rem-detail { font-size: var(--fs-12); color: var(--ink-3); margin: 2px 0 0; }
.rem-date { font-family: var(--font-num); font-size: var(--fs-12); color: var(--ink-3); display: block; margin-top: 4px; }
.rem-sub-row { display: flex; justify-content: space-between; align-items: center;
  gap: var(--sp-2); padding: 7px 0; border-bottom: 1px dashed var(--line); }
.rem-sub-name { font-size: var(--fs-13); color: var(--ink-2); }
.rem-hint { font-size: var(--fs-12); color: var(--ink-3); margin: 0 0 var(--sp-3); }
.rem-quote { margin: 0; padding: var(--sp-3); background: var(--brand-bronze-soft);
  border-radius: var(--r-md); font-family: var(--font-serif); font-size: var(--fs-15); color: var(--ink); }
.rem-quote cite { display: block; margin-top: 6px; font-family: var(--font-sans);
  font-size: var(--fs-12); color: var(--ink-3); font-style: normal; }
.rem-blocked { font-size: var(--fs-12); color: var(--brand-cinnabar); margin-top: var(--sp-3); }
.rem-side .yc-btn.ghost { width: 100%; margin-top: var(--sp-3); }

/* ---------- 增值服务 ---------- */
.extras-tabs { margin-bottom: var(--sp-4); }
.extras-body { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: var(--sp-4); }
.extras-toolbar { display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: center; justify-content: space-between; margin-bottom: var(--sp-3); }

.todo-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-2); }
.todo-item { display: grid; grid-template-columns: 26px minmax(0, 1fr) auto; gap: var(--sp-3);
  align-items: start; padding: var(--sp-3); border: 1px solid var(--line); border-radius: var(--r-md); }
.todo-item.is-important { border-left: 3px solid var(--brand-cinnabar); }
.todo-item.is-done { opacity: .6; }
.todo-item.is-done .todo-title { text-decoration: line-through; }
.todo-item.is-overdue { border-left: 3px solid var(--brand-cinnabar); background: var(--brand-cinnabar-soft); }
.todo-check { width: 22px; height: 22px; border-radius: 50%; border: 1.5px solid var(--line-strong);
  background: var(--surface); cursor: pointer; color: var(--ok); font-size: var(--fs-13); line-height: 1; }
.todo-item.is-done .todo-check { border-color: var(--ok); background: var(--ok-soft); }
.todo-title { font-size: var(--fs-14); color: var(--ink); }
.todo-note { font-size: var(--fs-12); color: var(--ink-3); margin-top: 2px; }
.todo-meta { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: 5px; font-size: var(--fs-12); color: var(--ink-3); }
.todo-cat { background: var(--surface-2); border-radius: var(--r-full); padding: 2px 8px; }
.todo-due.is-over { color: var(--brand-cinnabar); font-weight: 600; }
.todo-status { color: var(--brand-indigo); }
.todo-flag { color: var(--brand-cinnabar); font-weight: 600; }

.extras-form { display: grid; gap: var(--sp-3); max-width: 560px; }
.extras-field { display: grid; gap: 4px; font-size: var(--fs-12); color: var(--ink-3); }
.extras-check { display: flex; align-items: center; gap: 8px; font-size: var(--fs-13); color: var(--ink-2); }
.extras-dates { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: var(--sp-3); }
.extras-form-actions { display: flex; gap: var(--sp-2); margin-top: var(--sp-2); }

.extras-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-2); }
.extras-item { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--sp-2);
  align-items: center; padding: var(--sp-3); border: 1px solid var(--line); border-radius: var(--r-md); }
.extras-item-main { display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: baseline; }
.extras-item-main b { color: var(--ink); font-size: var(--fs-14); }
.extras-rel { font-size: var(--fs-12); color: var(--brand-indigo); background: var(--brand-indigo-soft);
  border-radius: var(--r-full); padding: 2px 8px; }
.extras-when { font-size: var(--fs-13); color: var(--ink-2); }
.extras-year { font-family: var(--font-num); font-size: var(--fs-12); color: var(--ink-3); }
.extras-note { font-size: var(--fs-12); color: var(--ink-3); }
.extras-item-side { display: flex; gap: var(--sp-2); align-items: center; }
.extras-lead { font-size: var(--fs-12); color: var(--ink-3); }

.period-stat { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: var(--sp-3); margin-bottom: var(--sp-3); }
.period-stat div { background: var(--surface-2); border-radius: var(--r-md); padding: var(--sp-3); text-align: center; }
.period-stat span { display: block; font-size: var(--fs-12); color: var(--ink-3); }
.period-stat b { font-family: var(--font-num); font-size: var(--fs-16); color: var(--brand-indigo); }
.extras-disclaim { font-size: var(--fs-12); color: var(--ink-2); background: var(--brand-bronze-soft);
  border-radius: var(--r-md); padding: var(--sp-3); margin: var(--sp-3) 0; line-height: 1.7; }
.extras-disclaim.is-warn { background: var(--brand-cinnabar-soft); color: var(--brand-cinnabar); }
.extras-hint { font-size: var(--fs-12); color: var(--ink-3); margin-top: var(--sp-2); }
.extras-quote { margin: 0; padding: var(--sp-4); background: var(--brand-bronze-soft);
  border-radius: var(--r-lg); font-family: var(--font-serif); font-size: var(--fs-18); color: var(--ink); line-height: 1.8; }
.extras-quote cite { display: block; margin-top: 8px; font-family: var(--font-sans);
  font-size: var(--fs-12); color: var(--ink-3); font-style: normal; text-align: right; }

/* ---------- 响应式 ---------- */
@media (max-width: 860px) {
  .cal-today { grid-template-columns: 1fr; }
  .cal-cell { min-height: 62px; }
  .cal-gz { display: none; }
  .rem-layout { grid-template-columns: 1fr; }
  .cal-node-list li { grid-template-columns: 1fr; gap: 2px; }
  .extras-item { flex-direction: column; align-items: flex-start; }
}
.rem-overdue { font-size: var(--fs-12); color: var(--ink-3); margin-top: var(--sp-3);
  padding-top: var(--sp-3); border-top: 1px dashed var(--line); }
.rem-type { display: inline-block; font-size: var(--fs-11, 11px); color: var(--ink-3);
  background: var(--surface-2); border-radius: var(--r-full); padding: 1px 8px; margin-right: 6px; }

/* ============================================================
   批次⑥：我的档案 + 账号注销
   ============================================================ */
.profile-block { margin-top: var(--sp-4); }
.profile-block h3 { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); margin-bottom: var(--sp-3); }
.profile-note { font-size: var(--fs-12); color: var(--ink-3); line-height: 1.8; margin-top: var(--sp-3); }
.profile-note strong { color: var(--brand-cinnabar); }
.profile-acts { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-3); }
.profile-msg { font-size: var(--fs-13); margin-top: var(--sp-3); min-height: 18px; }
.profile-msg.is-ok { color: var(--ok); }
.profile-msg.is-err { color: var(--brand-cinnabar); }

.profile-danger { border-color: rgba(192, 57, 43, .3); }
.profile-danger h3 { color: var(--brand-cinnabar); }

/* 注销数据清单 */
.purge-inv {
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: var(--r-md); padding: var(--sp-3); margin: var(--sp-3) 0;
}
.purge-inv h4 { font-size: var(--fs-13); color: var(--ink); margin-bottom: var(--sp-2); }
.purge-inv ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 5px; }
.purge-inv li { display: flex; justify-content: space-between; gap: var(--sp-2);
  font-size: var(--fs-12); color: var(--ink-2); }
.purge-inv li b { font-family: var(--font-num); color: var(--brand-cinnabar); white-space: nowrap; }
.purge-empty { font-size: var(--fs-12); color: var(--ink-3); margin: 0; }

/* ============================================================
   批次⑦：客户预约页
   ============================================================ */
.bk-intent {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-3);
  background: var(--brand-indigo-soft); border-radius: var(--r-md);
  padding: var(--sp-3) var(--sp-4); margin-bottom: var(--sp-4);
}
.bk-intent b { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); }
.bk-intent span { font-size: var(--fs-13); color: var(--ink-2); }
.bk-form { max-width: 560px; }
.bk-note { font-size: var(--fs-12); color: var(--ink-3); line-height: 1.8; margin-top: var(--sp-3); }
.bk-note strong { color: var(--brand-cinnabar); }
.bk-done {
  background: var(--surface); border: 1px solid var(--ok);
  border-radius: var(--r-lg); padding: var(--sp-4); margin-top: var(--sp-4);
}
.bk-done h3 { font-family: var(--font-serif); font-size: var(--fs-18); color: var(--ok); margin-bottom: var(--sp-2); }
.bk-done p { font-size: var(--fs-14); color: var(--ink-2); line-height: 1.8; }

/* ============================================================
   角色工作台 · 学员端与师傅端界面模块（批次④ 角色工作台）
   ------------------------------------------------------------
   只追加新规则，不改动已有规则。
   ============================================================ */

/* 学习路径步骤卡 */
.lp-step { display: flex; gap: var(--sp-3); align-items: flex-start; }
.lp-num {
  flex: 0 0 auto; width: 26px; height: 26px; border-radius: var(--r-full);
  background: var(--brand-indigo-soft); color: var(--brand-indigo);
  font: 700 var(--fs-13)/26px var(--font-num); text-align: center;
}
.lp-step h3 { margin-top: 0; }

/* 术语表 */
.gs-tools { margin-bottom: var(--sp-4); }
.gs-cat { color: var(--brand-bronze); }
.gs-detail { font-size: var(--fs-13); color: var(--ink-2); line-height: 1.9; }
.gs-note {
  margin-top: var(--sp-3); padding-top: var(--sp-3);
  border-top: 1px dashed var(--line);
  font-size: var(--fs-12); color: var(--ink-3); line-height: 1.8;
}
.gs-list { margin: 0; padding-left: 1.2em; font-size: var(--fs-13); color: var(--ink-2); line-height: 1.9; }

/* 状态徽标变体（待审核 / 已通过 / 已驳回） */
.st-badge.is-warn { color: var(--warn); background: var(--warn-soft); }
.st-badge.is-ok { color: var(--ok); background: var(--ok-soft); }
.st-badge.is-bad { color: var(--danger); background: var(--danger-soft); }

/* 禁忌词（规则库） */
.tag.is-bad { color: var(--brand-cinnabar); background: var(--brand-cinnabar-soft); }

/* 学员审核 / 团队：宽屏表格化行 */
.ml-head > .st-badge { vertical-align: middle; }

/* ============================================================
   今日卡三行（阳历 / 农历 / 干支）—— 公共万年历页与工作台共用
   ============================================================ */
.cal-line { display: flex; align-items: baseline; gap: var(--sp-2); flex-wrap: wrap; margin-top: 6px; }
.cal-line .cal-k { flex: 0 0 auto; min-width: 3.4em; color: var(--ink-3); font-size: var(--fs-13); }
.cal-line .cal-v { color: var(--ink); font-size: var(--fs-16); font-weight: 600; }
.cal-line .cal-s { color: var(--ink-2); font-size: var(--fs-14); }

/* ============================================================
   排盘详解盘面矩阵（左侧标签列 + 四柱按列对齐 + 五行着色）
   ============================================================ */
.pp-matrix { width: 100%; border-collapse: collapse; font-size: var(--fs-13); margin-top: var(--sp-2); }
.pp-matrix thead th { padding: 4px 8px 8px; font-size: var(--fs-12); font-weight: 400; color: var(--ink-3); text-align: center; }
.pp-matrix thead th.is-dm { color: var(--brand-indigo); }
.pp-matrix tbody th { width: 4.6em; padding: 7px 8px; text-align: left; font-weight: 400; font-size: var(--fs-12); color: var(--ink-3); background: var(--surface-2); border-top: 0.5px solid var(--line); }
.pp-matrix tbody td { padding: 7px 8px; border-top: 0.5px solid var(--line); vertical-align: top; line-height: 1.75; }
.pp-matrix tbody td.is-dm { background: var(--brand-indigo-soft); }
.pp-matrix .pp-r-gz .pp-gz { font-size: var(--fs-22); }
.pp-matrix .pp-r-zhi .pp-gz { font-size: var(--fs-22); }
.pp-matrix .pp-ss { margin-left: 6px; font-size: var(--fs-12); white-space: nowrap; }
.pp-matrix .pp-r-hidden td, .pp-matrix .pp-r-shen td { font-size: var(--fs-12); }
.pp-matrix .pp-r-extra td { color: var(--ink-2); }

/* 要素胶囊 */
.pp-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: var(--sp-4); }
.pp-chip { font-size: var(--fs-12); color: var(--ink-2); background: var(--surface-2); border-radius: 20px; padding: 4px 10px; }
.pp-chip.is-blue { color: var(--brand-indigo); background: var(--brand-indigo-soft); }
.pp-chip.is-gold { color: var(--brand-bronze); background: var(--brand-bronze-soft); }
.pp-chip.is-red { color: var(--brand-cinnabar); background: var(--brand-cinnabar-soft); }

/* 干支留意（跨柱关系） */
.pp-rel-row { margin-top: var(--sp-3); padding-top: var(--sp-3); border-top: 0.5px solid var(--line); font-size: var(--fs-12); color: var(--ink-2); }
.pp-rel-k { color: var(--ink-3); margin-right: var(--sp-2); }

/* 补充明细（格局依据 / 强弱说明 / 胎元命宫） */
.pp-facts { margin-top: var(--sp-4); display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--sp-3); }
.pp-fx-k { display: block; font-size: var(--fs-12); color: var(--ink-3); margin-bottom: 2px; }
.pp-fx-i { font-size: var(--fs-12); color: var(--ink-2); line-height: 1.8; }
.pp-fx-i b { color: var(--ink); font-weight: 400; margin-right: 6px; }

/* 称骨 */
.pp-cg { margin-top: var(--sp-4); padding-top: var(--sp-3); border-top: 0.5px solid var(--line); }
.pp-cg-head { display: flex; align-items: baseline; gap: var(--sp-2); flex-wrap: wrap; }
.pp-cg-t { font-size: var(--fs-16); color: var(--brand-bronze); }
.pp-cg-d { font-size: var(--fs-12); color: var(--ink-3); }
.pp-cg-song { margin: var(--sp-2) 0 0; padding: var(--sp-3) var(--sp-4); border-left: 3px solid var(--brand-bronze); background: var(--surface-2); font-size: var(--fs-13); line-height: 1.9; color: var(--ink); }

/* ============================================================
   十年大运（工作台「排盘详解 · 十年大运」区块）
   ============================================================ */
.pp-dy { margin-top: var(--sp-6); border-top: 1px solid var(--line); padding-top: var(--sp-4); }
.pp-dy-head { display: flex; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-3); flex-wrap: wrap; }
.pp-dy-meta { font-size: var(--fs-12); color: var(--ink-3); }
.pp-dy-table { width: 100%; border-collapse: collapse; font-size: var(--fs-13); }
.pp-dy-table thead th {
  text-align: left; font-weight: 500; color: var(--ink-3); font-size: var(--fs-12);
  padding: 6px 8px; border-bottom: 1px solid var(--line); white-space: nowrap;
}
.pp-dy-table td { padding: 8px; border-bottom: 1px dashed var(--line); color: var(--ink-2); vertical-align: top; }
.pp-dy-table tbody tr:hover { background: var(--surface-2); }
.pp-dy-table .dy-no { font-family: var(--font-num); color: var(--ink-3); width: 34px; }
.pp-dy-table .dy-gz b { font-family: var(--font-serif); font-size: var(--fs-16); color: var(--brand-indigo); }
.pp-dy-table .dy-ss { display: block; font-size: var(--fs-12); color: var(--ink-3); }
.pp-dy-table .dy-extra { color: var(--ink-3); font-size: var(--fs-12); white-space: nowrap; }
@media (max-width: 700px) {
  .pp-dy-table { font-size: var(--fs-12); }
  .pp-dy-table th, .pp-dy-table td { padding: 6px 5px; }
}

/* 工作台内的次级区块（万年历下方的排盘详解） */
.wb-sub-sec { margin-top: var(--sp-7); border-top: 1px solid var(--line); padding-top: var(--sp-5); }
.wb-sub-title { font-family: var(--font-serif); font-size: var(--fs-22); color: var(--brand-indigo); margin-bottom: var(--sp-2); }
.wb-sub-desc { font-size: var(--fs-13); color: var(--ink-3); margin-bottom: var(--sp-4); line-height: 1.8; }

/* 十年大运：十二长生列 + 表注 */
.pp-dy-table .dy-cs {
  font-family: var(--font-serif); color: var(--brand-bronze); font-weight: 600; white-space: nowrap;
}
.pp-dy-note {
  margin-top: var(--sp-3); font-size: var(--fs-12); color: var(--ink-3); line-height: 1.85;
}

/* 时辰口径提示（真太阳时校正说明） */
.pp-shichen-note {
  background: var(--surface-2); border-left: 3px solid var(--brand-bronze);
  padding: var(--sp-3) var(--sp-4); border-radius: 0 var(--r-sm, 6px) var(--r-sm, 6px) 0;
  margin: var(--sp-3) 0 var(--sp-4);
}

/* 极简页脚备案条（工作台 / 登录页 / 排盘工具页 —— 监管要求所有对外页面展示备案号） */
.yc-mini-foot {
  margin-top: auto; padding: var(--sp-4) var(--sp-5);
  text-align: center; border-top: 1px solid var(--line);
  background: var(--surface-2);
}
.yc-mini-foot p { margin: 0; font-size: var(--fs-12); color: var(--ink-3); }
.yc-mini-foot a { color: var(--ink-3); text-decoration: none; }
.yc-mini-foot a:hover { color: var(--brand-indigo); text-decoration: underline; }
