/* ══════════════════════════════════════════════════════════════════════
   目标中心(2026-10-09 需求 M)
   跟项目主题走(浅色 iOS 风 + 11 套皮肤),所以颜色一律用 CSS 变量,
   不要写死 —— 换皮肤时这里会跟着变。
   ══════════════════════════════════════════════════════════════════════ */

/* ---------- ★ 子页面(新建 / 详情)独立容器 ----------
   #goalPage 追加在 #tab-exam 末尾;给 #tab-exam 挂 .gd-sub 时,
   把这一格里除 #goalPage 以外的所有东西(目标列表 #goalCenter + 整块考试区)藏起来。
   这样列表和考试区的 DOM 一直活着 —— 早先直接重写 innerHTML 会把它们铲掉,返回就点不动了。 */
#tab-exam.gd-sub > *:not(#goalPage){display:none !important}
.gd-page{animation:gdIn .2s ease-out}
@keyframes gdIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* ---------- 顶部 ---------- */
.gd-head{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;
  padding:2px 2px 12px}
.gd-head h2{margin:0;font-size:21px;font-weight:800;letter-spacing:.4px}
.gd-head .gd-sub{margin-top:3px}
.gd-new{flex:none;border:none;border-radius:14px;padding:9px 14px;font-size:13px;font-weight:700;
  color:#fff;background:linear-gradient(135deg,#8B6BFA,#5B8CFF);cursor:pointer;
  box-shadow:0 6px 18px rgba(139,107,250,.32)}
.gd-new:active{transform:scale(.96)}

.gd-sub{font-size:12px;color:var(--text2);line-height:1.5}

/* ---------- 卡片 ---------- */
.gd-card{background:var(--card);border:1px solid var(--border);border-radius:18px;
  padding:14px;margin-bottom:12px;box-shadow:0 4px 16px rgba(24,32,64,.05)}
.gd-today-hd{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:10px}
.gd-today-hd b{font-size:15px}
.gd-rest-big{text-align:center;padding:20px 0;font-size:14px;color:var(--text2)}

/* ---------- 今日任务 ---------- */
.gd-task{display:flex;align-items:center;gap:10px;padding:11px 0;
  border-top:1px solid var(--border)}
.gd-task:first-of-type{border-top:none}
.gd-task.done{opacity:.5}
.gd-task-main{flex:1;min-width:0}
.gd-task-main b{display:block;font-size:14px;font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gd-task-main .gd-sub{margin-top:2px}

.gd-tag{flex:none;font-size:11.5px;font-weight:700;padding:4px 9px;border-radius:9px}
.gd-tag.ok{background:#E8F8EF;color:#1F9D55}
.gd-tag.rest{background:var(--iconbg);color:var(--text2)}
/* ★ 2026-10-12(需求 AS):还没到的日子 —— 详情页「每天安排」里替代打卡按钮的灰标签 */
.gd-tag.soon{background:var(--progress-bg,#EEF0F6);color:var(--text2);font-weight:600}
.gd-warn{color:#E5484D;font-weight:700}

.gd-btn{flex:none;border:none;border-radius:12px;padding:8px 16px;font-size:13px;font-weight:700;
  color:#fff;background:linear-gradient(135deg,#8B6BFA,#5B8CFF);cursor:pointer}
.gd-btn:active{transform:scale(.96)}
.gd-btn.ghost{background:var(--card);color:var(--primary);
  border:1px solid var(--border);box-shadow:none}
.gd-btn.danger{background:transparent;color:#E5484D;border:1px solid rgba(229,72,77,.35)}
.gd-btn.big{width:100%;padding:13px;font-size:15px;border-radius:14px;margin-top:10px}
.gd-btn:disabled{opacity:.6}

/* ---------- 逾期 ---------- */
.gd-overdue{border-color:rgba(229,72,77,.25);background:linear-gradient(180deg,rgba(229,72,77,.06),transparent)}

/* ---------- 目标卡片 ---------- */
.gd-sec{font-size:13px;font-weight:800;color:var(--text2);padding:6px 2px 8px;letter-spacing:.5px}
.gd-goal{background:var(--card);border:1px solid var(--border);border-radius:18px;
  padding:14px;margin-bottom:10px;cursor:pointer;transition:transform .16s ease;
  box-shadow:0 4px 16px rgba(24,32,64,.05)}
.gd-goal:active{transform:scale(.985)}
.gd-goal.draft{border-style:dashed;border-color:var(--primary)}
.gd-goal-hd{display:flex;align-items:center;justify-content:space-between;gap:8px}
.gd-goal-hd b{font-size:15px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gd-kind{flex:none;font-size:11px;font-weight:700;padding:3px 9px;border-radius:9px;
  background:var(--iconbg);color:var(--text2)}
.gd-bar{height:7px;border-radius:4px;background:var(--progress-bg);overflow:hidden;margin:10px 0 6px}
.gd-bar i{display:block;height:100%;border-radius:4px;
  background:linear-gradient(90deg,#8B6BFA,#5B8CFF);transition:width .4s ease}
.gd-goal-ft{display:flex;align-items:center;justify-content:space-between;gap:6px;
  font-size:11.5px;color:var(--text2)}

/* ---------- 空态 ---------- */
.gd-empty{text-align:center;padding:30px 18px}
.gd-empty-ico{font-size:34px;margin-bottom:8px}
.gd-empty b{font-size:15px;display:block;margin-bottom:6px}
.gd-empty-btns{display:flex;gap:8px;justify-content:center;margin-top:14px}

/* ---------- 表单 ---------- */
.gd-back{border:none;background:none;color:var(--primary);font-size:13.5px;font-weight:700;
  padding:6px 2px 12px;cursor:pointer}
.gd-panel{background:var(--card);border:1px solid var(--border);border-radius:18px;
  padding:16px;margin-bottom:12px}
.gd-panel h3{margin:0 0 12px;font-size:17px;font-weight:800}
.gd-lab{display:block;font-size:12px;font-weight:700;color:var(--text2);margin:12px 0 6px}
.gd-inp,.gd-ta{width:100%;box-sizing:border-box;border:1px solid var(--border);border-radius:13px;
  padding:11px 13px;font-size:14px;background:var(--input-bg,#fff);color:var(--text);
  font-family:inherit;outline:none}
.gd-inp:focus,.gd-ta:focus{border-color:var(--primary)}
.gd-ta{resize:vertical;line-height:1.5}

.gd-kinds{display:flex;flex-wrap:wrap;gap:7px}
.gd-kinds button{border:1px solid var(--border);background:var(--card);color:var(--text2);
  border-radius:11px;padding:8px 13px;font-size:12.5px;font-weight:700;cursor:pointer}
.gd-kinds button.on{background:linear-gradient(135deg,#8B6BFA,#5B8CFF);color:#fff;border-color:transparent}

/* ★ 2026-10-11 修:flex 项默认 min-width:auto,而 <input type="date"> 自带一个
   比半屏还宽的最小内容宽度 → 右边那个"结束"日期框直接撑出白卡片(负责人截图反馈)。
   光写 flex:1 不够,必须让「外层 div」和「input 自己」都能被压到比内容更窄。 */
.gd-dates{display:flex;gap:10px}
.gd-dates>div{flex:1 1 0;min-width:0}
.gd-dates .gd-inp{width:100%;min-width:0;padding:11px 10px;font-size:13.5px}
.gd-dates .gd-lab{margin-top:10px}

.gd-week{display:flex;gap:6px;flex-wrap:wrap}
.gd-week button{flex:1;min-width:40px;border:1px solid var(--border);background:var(--card);
  color:var(--text2);border-radius:11px;padding:9px 0;font-size:12.5px;font-weight:700;cursor:pointer}
.gd-week button.on{background:linear-gradient(135deg,#8B6BFA,#5B8CFF);color:#fff;border-color:transparent}

.gd-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.gd-actions .gd-btn{flex:1;min-width:120px;text-align:center}

.gd-from-thought{margin:10px 0;padding:11px 13px;border-radius:13px;
  background:linear-gradient(135deg,rgba(139,107,250,.12),rgba(91,140,255,.1));
  border:1px solid rgba(139,107,250,.25);font-size:13px;line-height:1.5}
.gd-note{margin:10px 0;font-size:12px;color:var(--text2);line-height:1.6}
.gd-err{margin-top:10px;font-size:13px;color:#E5484D}

/* ---------- 拆分结果预览 ---------- */
.gd-prow{display:flex;align-items:center;gap:8px;padding:7px 0;border-top:1px solid var(--border)}
.gd-prow.rest{opacity:.6}
.gd-pdate{flex:none;font-size:12px;font-weight:700;color:var(--text2);width:64px}
.gd-pinp{flex:1;min-width:0;border:1px solid var(--border);border-radius:10px;
  padding:8px 10px;font-size:13px;background:var(--input-bg,#fff);color:var(--text);
  font-family:inherit;outline:none}
.gd-pnum{flex:none;width:66px;border:1px solid var(--border);border-radius:10px;
  padding:8px 10px;font-size:13px;background:var(--input-bg,#fff);color:var(--text);
  font-family:inherit;outline:none;text-align:center}

/* ---------- 详情:逐日 ---------- */
.gd-days{background:var(--card);border:1px solid var(--border);border-radius:18px;
  overflow:hidden}
.gd-day{display:flex;align-items:center;gap:10px;padding:11px 14px;
  border-top:1px solid var(--border)}
.gd-day:first-child{border-top:none}
.gd-day.done{opacity:.5}
.gd-day.rest{opacity:.6}
.gd-day.over{background:rgba(229,72,77,.05)}
.gd-day-l{flex:none;width:64px}
.gd-day-l .gd-pdate{display:block;width:auto}
.gd-day-m{flex:1;min-width:0;font-size:13.5px;
  overflow:hidden;text-overflow:ellipsis}
.gd-day-m b{font-weight:600}
.gd-day-r{flex:none;display:flex;gap:6px}
.gd-mini{border:1px solid var(--border);background:var(--card);color:var(--text2);
  border-radius:9px;padding:5px 10px;font-size:12px;font-weight:700;cursor:pointer}
.gd-mini.on{background:linear-gradient(135deg,#8B6BFA,#5B8CFF);color:#fff;border-color:transparent}

/* ---------- 汇总条 ---------- */
.gd-sum{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--text2);
  padding:2px 4px 10px}
.gd-sum b{color:var(--text);font-size:13px}

/* ---------- 轻提示 ---------- */
.gd-toast{position:fixed;left:50%;top:18%;transform:translate(-50%,-8px);z-index:90;
  display:flex;align-items:center;gap:8px;max-width:82vw;
  padding:11px 16px;border-radius:14px;font-size:13.5px;font-weight:600;
  background:rgba(22,28,45,.94);color:#fff;backdrop-filter:blur(10px);
  -webkit-backdrop-filter:blur(10px);opacity:0;transition:opacity .22s ease,transform .22s ease;
  pointer-events:none;box-shadow:0 10px 30px rgba(0,0,0,.28)}
.gd-toast.on{opacity:1;transform:translate(-50%,0)}
.gd-toast span{font-size:16px}

@media (max-width:360px){
  .gd-head h2{font-size:19px}
  .gd-pdate{width:56px}
}


/* ══════════════════════════════════════════════════════════════════════
   新建目标 · 弹窗(2026-10-11,需求 AN)

   ★ 为什么从"子页面"改成弹窗:原来它挂在 #goalPage 上、靠 #tab-exam 的 .gd-sub 撑场面,
     .gd-sub 一摘就露馅(表单跟目标列表叠着显示),真机上表现为"点返回没反应"。
     换成弹窗后跟那套机制彻底解耦,也不怕 renderExamHome() 重建 #tab-exam。

   ★★ 关闭态必须 opacity:0 + visibility:hidden + pointer-events:none **三样一起写**。
      只写 opacity:0 的话,一层全屏透明遮罩照样吃点击,真机上底下啥都点不动
      —— 2026-10-09 闪念星系页踩过同一个坑,别再犯。
   ══════════════════════════════════════════════════════════════════════ */
.gd-mask{
  position:fixed;left:0;right:0;top:0;
  bottom:var(--kb,0px);                 /* iOS 键盘弹起时整块抬到键盘上方 */
  z-index:9000;display:flex;align-items:flex-end;justify-content:center;
  background:rgba(22,18,44,.44);
  backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .22s ease,visibility .22s ease;
}
.gd-mask.on{opacity:1;visibility:visible;pointer-events:auto}

.gd-sheet{
  width:100%;max-width:520px;max-height:90vh;overflow-y:auto;
  -webkit-overflow-scrolling:touch;
  background:var(--card,#fff);color:var(--text);
  border-radius:24px 24px 0 0;
  padding:16px 16px calc(18px + env(safe-area-inset-bottom));
  box-sizing:border-box;
  transform:translateY(16px);
  transition:transform .26s cubic-bezier(.34,1.4,.64,1);
  box-shadow:0 -12px 44px -12px rgba(20,16,50,.4);
}
.gd-mask.on .gd-sheet{transform:none}

.gd-sheet-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.gd-sheet-hd b{font-size:17px;font-weight:800}
.gd-x{border:0;background:var(--tint,rgba(0,0,0,.06));color:var(--text2);
  width:30px;height:30px;border-radius:50%;font-size:15px;line-height:1;cursor:pointer;
  display:flex;align-items:center;justify-content:center}
.gd-x:active{transform:scale(.92)}

/* 弹窗开着时锁住页面滚动,免得底下的目标列表跟着滑 */
body.gd-lock{overflow:hidden}


/* ══════════════════════════════════════════════════════════════════════
   界面 A · 新建目标表单(2026-10-11 AI 目标规划优化)
   字段顺序按需求文档走:名称 → 说明 → 类型 → 周期 → 日期 → 总量 → 每周安排 → 主按钮。
   每一步前面给个序号,主播一眼知道"还有几件事要填"。
   ══════════════════════════════════════════════════════════════════════ */
.gd-form .gd-lab{margin-top:16px}
.gd-form .gd-lab:first-child{margin-top:2px}
/* 序号小圆点 */
.gd-lab i{display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;margin-right:6px;border-radius:50%;font-style:normal;
  font-size:10.5px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,#8B6BFA,#5B8CFF);vertical-align:1px}
.gd-opt{font-weight:600;color:var(--text2);opacity:.75}
.gd-tip{font-size:11.5px;color:var(--text2);opacity:.85;align-self:center}
.gd-hint{margin-top:8px;font-size:12px;line-height:1.6;color:var(--text2)}
.gd-hint b{color:var(--text)}
.gd-hint.bad{color:#E5484D}
.gd-hint.bad b{color:#E5484D}
/* ★ emoji 裹在 <b> 里时,粗体会去选一套没有彩色 emoji 的字体,
   结果渲染成一个单色轮廓方块(截图里一眼就能看出来)。给它单独复位成常规字重。 */
.gd-em{font-weight:400;font-style:normal}

/* 目标类型 7 类 —— 两列网格,带 emoji + 名字 */
.gd-types{display:grid;grid-template-columns:repeat(4,1fr);gap:7px}
.gd-types button{display:flex;flex-direction:column;align-items:center;gap:4px;
  border:1px solid var(--border);background:var(--card);color:var(--text2);
  border-radius:13px;padding:9px 4px;font-size:11.5px;font-weight:700;cursor:pointer;
  transition:transform .14s ease}
.gd-types button i{font-style:normal;font-size:17px;line-height:1}
.gd-types button:active{transform:scale(.95)}
.gd-types button.on{border-color:transparent;color:#fff;
  background:linear-gradient(135deg,#8B6BFA,#5B8CFF);
  box-shadow:0 6px 16px rgba(139,107,250,.3)}

/* 每周安排快捷 */
.gd-wmodes{display:flex;gap:7px;flex-wrap:wrap}
.gd-wmodes button{flex:1;min-width:70px;border:1px solid var(--border);background:var(--card);
  color:var(--text2);border-radius:11px;padding:9px 6px;font-size:12.5px;font-weight:700;cursor:pointer}
.gd-wmodes button.on{border-color:var(--primary);color:var(--primary);
  background:var(--iconbg)}

/* 单位快捷 */
.gd-units{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;align-items:center}
.gd-units button{border:1px solid var(--border);background:var(--card);color:var(--text2);
  border-radius:9px;padding:5px 11px;font-size:12px;font-weight:700;cursor:pointer}
.gd-units button.on{background:linear-gradient(135deg,#8B6BFA,#5B8CFF);color:#fff;border-color:transparent}

.gd-dates .gd-dash{flex:none;align-self:center;font-size:13px;color:var(--text2);padding-top:2px}


/* ══════════════════════════════════════════════════════════════════════
   界面 B · 计划预览 / 详情(2026-10-11)
   ★ 需求 §7 的硬要求:顶部摘要 + 任务区**独立滚动**、底部按钮**固定且不遮挡**。
     做法:预览态把 .gd-sheet 变成 flex 竖列 + 固定高度,中间 .gd-plan-scroll 独占滚动,
     头和尾都不参与滚动;底部再补 safe-area,刘海屏不会被挡。
   ══════════════════════════════════════════════════════════════════════ */
.gd-sheet.plan{
  height:92vh;max-height:92vh;overflow:hidden;
  display:flex;flex-direction:column;padding-bottom:0;
}
#gdPreview{flex:1;min-height:0;display:flex}
.gd-plan{flex:1;min-width:0;display:flex;flex-direction:column;min-height:0}

.gd-plan-hd{flex:none;display:flex;align-items:center;gap:8px;padding:2px 0 10px}
.gd-plan-hd b{font-size:16px;font-weight:800}
.gd-plan-hd .gd-sub{flex:1;text-align:right}
.gd-back2{flex:none;border:0;background:none;color:var(--primary);font-size:13.5px;
  font-weight:700;padding:4px 0;cursor:pointer}

/* ★ min-height:0 不能省 —— flex 子项默认 min-height:auto,不写就撑破容器、滚不动 */
.gd-plan-scroll{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;
  padding-bottom:12px}

.gd-plan-ft{flex:none;border-top:1px solid var(--border);
  padding:10px 0 calc(10px + env(safe-area-inset-bottom));background:var(--card)}
.gd-ft-sum{font-size:12.5px;color:var(--text2);margin-bottom:8px}
.gd-ft-sum b{font-size:14px}
.gd-ft-sum b.ok{color:#1F9D55}
.gd-ft-sum b.bad{color:#E5484D}
.gd-ft-btns{display:flex;gap:8px}
.gd-ft-btns .gd-btn{flex:1;min-width:0;margin-top:0}
.gd-ft-btns .gd-btn.big{padding:12px 10px;font-size:14.5px;border-radius:14px}

/* 摘要卡 */
.gd-sumcard{background:var(--card);border:1px solid var(--border);border-radius:18px;
  padding:14px;margin-bottom:10px;box-shadow:0 4px 16px rgba(24,32,64,.05)}
.gd-sumcard-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.gd-sumcard-hd b{font-size:14.5px;font-weight:800}
.gd-diff{font-size:11.5px;font-weight:800;padding:4px 10px;border-radius:10px}
.gd-diff.easy{background:#E8F8EF;color:#1F9D55}
.gd-diff.ok{background:var(--iconbg);color:var(--primary)}
.gd-diff.tight{background:rgba(229,72,77,.1);color:#E5484D}
.gd-diffdesc{font-size:12px;color:var(--text2);line-height:1.6;margin:2px 0 6px}
.gd-reasons{display:flex;flex-direction:column;gap:3px}
.gd-reasons span{font-size:11.5px;color:var(--text2);line-height:1.5}

.gd-kv{display:grid;grid-template-columns:repeat(2,1fr);gap:8px 10px}
.gd-kv-i{min-width:0}
.gd-kv-i.span2{grid-column:1/-1}
.gd-kv-i span{display:block;font-size:11px;color:var(--text2);margin-bottom:2px}
.gd-kv-i b{display:block;font-size:13px;font-weight:700;line-height:1.35;word-break:break-word}

/* 校验 / 提示条 */
.gd-alert{margin:0 0 8px;padding:10px 12px;border-radius:13px;font-size:12px;line-height:1.6}
.gd-alert.info{background:rgba(91,140,255,.1);color:var(--text)}
.gd-alert.ok{background:#E8F8EF;color:#17703C}
.gd-alert.warn{background:rgba(245,165,36,.14);color:#8A5A00}
.gd-alert.bad{background:rgba(229,72,77,.1);color:#B3242A}
.gd-alert.tip{background:var(--iconbg);color:var(--text2)}
.gd-sec2{font-size:12.5px;font-weight:800;color:var(--text2);padding:10px 2px 6px}

/* 周历概览 —— 7 列小方格,一眼看出哪几天有量、哪天休息 */
.gd-wg{background:var(--card);border:1px solid var(--border);border-radius:16px;
  padding:10px;margin-bottom:10px}
.gd-wg-head{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:5px}
.gd-wg-head span{text-align:center;font-size:11px;color:var(--text2);font-weight:700}
.gd-wg-row{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:4px}
.gd-wg-c{min-width:0;border-radius:9px;padding:5px 1px;text-align:center;
  display:flex;flex-direction:column;gap:1px;align-items:center}
.gd-wg-c i{font-style:normal;font-size:9.5px;color:var(--text2);line-height:1}
.gd-wg-c b{font-size:10.5px;font-weight:800;line-height:1.2;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.gd-wg-c.on{background:linear-gradient(135deg,rgba(139,107,250,.16),rgba(91,140,255,.14))}
.gd-wg-c.on b{color:var(--primary)}
.gd-wg-c.rest{background:var(--iconbg)}
.gd-wg-c.rest b{color:var(--text2);font-weight:700}
.gd-wg-c.off{background:transparent}

/* 每日任务卡片 */
.gd-days .gd-prow{display:flex;align-items:flex-start;gap:9px;padding:11px 0;
  border-top:1px solid var(--border)}
.gd-days .gd-prow:first-child{border-top:none}
.gd-days .gd-prow.rest{opacity:.65}
.gd-days .gd-prow.done{opacity:.5}
.gd-pr-d{flex:none;width:56px;display:flex;flex-direction:column;gap:1px;padding-top:2px}
.gd-pr-d b{font-size:12px;font-weight:800}
.gd-pr-d span{font-size:10.5px;color:var(--text2)}
.gd-pr-m{flex:1;min-width:0}
.gd-pr-m .gd-pinp{width:100%;box-sizing:border-box;border:1px solid var(--border);
  border-radius:10px;padding:8px 10px;font-size:13px;background:var(--input-bg,#fff);
  color:var(--text);font-family:inherit;outline:none}
.gd-pr-rest{font-size:13px;font-weight:600;color:var(--text2)}
.gd-pr-meta{display:flex;align-items:center;gap:6px;margin-top:6px;flex-wrap:wrap}
.gd-pr-meta .gd-pnum{flex:none;width:64px;border:1px solid var(--border);border-radius:9px;
  padding:6px 8px;font-size:12.5px;background:var(--input-bg,#fff);color:var(--text);
  font-family:inherit;outline:none;text-align:center}
.gd-pr-u{font-size:12px;color:var(--text2);font-weight:700}
.gd-pr-min{font-size:11.5px;color:var(--text2)}
.gd-tag.lock{background:rgba(91,140,255,.14);color:#2B5FD9}
.gd-pr-r{flex:none;display:flex;gap:5px;align-items:center;padding-top:2px}
.gd-prow.skip .gd-pr-m{opacity:.6}


/* ══════════════════════════════════════════════════════════════════════
   轻量底部抽屉(改一天 / 重新拆解 / 改休息日)
   ★ 和弹窗同一套 .gd-mask 三件套(opacity + visibility + pointer-events 一起写)。
   ══════════════════════════════════════════════════════════════════════ */
.gd-mask-drawer{z-index:9100}
.gd-drawer{width:100%;max-width:520px;max-height:86vh;overflow-y:auto;
  -webkit-overflow-scrolling:touch;background:var(--card,#fff);color:var(--text);
  border-radius:22px 22px 0 0;padding:16px 16px calc(16px + env(safe-area-inset-bottom));
  box-sizing:border-box;transform:translateY(16px);
  transition:transform .26s cubic-bezier(.34,1.4,.64,1);
  box-shadow:0 -12px 44px -12px rgba(20,16,50,.4)}
.gd-mask.on .gd-drawer{transform:none}
.gd-drawer-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.gd-drawer-hd b{font-size:16px;font-weight:800}
.gd-drawer .gd-lab{margin-top:14px}
.gd-drawer .gd-actions{margin-top:16px}
.gd-check{display:flex;align-items:flex-start;gap:8px;margin-top:14px;
  font-size:12.5px;line-height:1.5;color:var(--text2);cursor:pointer}
.gd-check input{flex:none;width:17px;height:17px;margin:1px 0 0;accent-color:#8B6BFA}

/* 重新拆解:新旧差异 */
.gd-regen{margin-top:10px}
.gd-difflist{margin-top:6px}
.gd-diff-i{display:flex;align-items:center;gap:8px;padding:8px 10px;margin-bottom:6px;
  border-radius:11px;background:var(--iconbg);font-size:12.5px}
.gd-diff-i span{flex:1;min-width:0;color:var(--text2)}
.gd-diff-i b{font-weight:800}
.gd-diff-i i{font-style:normal;color:var(--text2)}
.gd-diff-i b.new{color:var(--primary)}

@media (max-width:360px){
  .gd-types{grid-template-columns:repeat(3,1fr)}
  .gd-pr-d{width:50px}
}


/* ══════════════════════════════════════════════════════════════════════
   ★ 历史目标 + 目标日历(2026-10-20 需求 AU 模块⑤)
   已到期的目标不再挂「进行中的目标」里,统一进历史;日历口径是
   「那天完成了几条目标任务」,4 档用实色递进(不用透明度 —— 浅底上三档会看成一个色)。
   ══════════════════════════════════════════════════════════════════════ */

/* 头部右侧:历史目标(浅玻璃)+ 新建目标(品牌渐变) */
.gd-head-r{flex:none;display:flex;align-items:center;gap:8px}
.gd-hist{flex:none;display:flex;align-items:center;gap:4px;white-space:nowrap;
  border:1px solid var(--border);border-radius:13px;padding:8px 11px;line-height:1.15;
  font-size:12.5px;font-weight:700;color:var(--primary);background:var(--card);cursor:pointer;
  box-shadow:0 4px 14px rgba(24,32,64,.05)}
.gd-hist:active{transform:scale(.96)}
.gd-hist em{font-style:normal;font-size:11px;font-weight:800;color:#fff;
  background:var(--primary);border-radius:8px;padding:1px 5px;min-width:15px;text-align:center}

/* 历史页顶部:累计战绩 */
.gd-hhero{position:relative;overflow:hidden;border-radius:20px;padding:16px 16px 15px;margin-bottom:12px;
  color:#fff;background:linear-gradient(135deg,#6D6BFA 0%,#B45CF6 55%,#FF7EB3 100%);
  box-shadow:0 12px 26px -12px rgba(109,107,250,.62)}
.gd-hhero:after{content:"";position:absolute;right:-40px;top:-52px;width:150px;height:150px;
  border-radius:50%;background:rgba(255,255,255,.16)}
.gd-hhero-t{font-size:11.5px;font-weight:700;opacity:.92;letter-spacing:.3px}
.gd-hhero-n{display:flex;align-items:baseline;gap:5px;margin:6px 0 4px}
.gd-hhero-n b{font-size:30px;font-weight:800;letter-spacing:-.6px;line-height:1}
.gd-hhero-n span{font-size:12px;opacity:.9}
.gd-hhero-s{font-size:12px;line-height:1.5;opacity:.94;position:relative;z-index:1}

/* 目标日历 */
.gd-cal{padding:16px 14px 14px}
.gd-cal-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.gd-cal-hd b{font-size:15px;font-weight:700}
.gd-cal-hd button{width:30px;height:30px;border:none;border-radius:50%;
  background:var(--card2);color:var(--text2);font-size:16px;line-height:1;
  display:flex;align-items:center;justify-content:center;cursor:pointer}
.gd-cal-hd button:disabled{opacity:.32}
.gd-cal-w{display:grid;grid-template-columns:repeat(7,1fr);gap:5px;
  font-size:11px;color:var(--text2);text-align:center;margin-bottom:6px}
.gd-cal-g{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}
.gd-day{aspect-ratio:1/1;border-radius:10px;display:flex;align-items:center;justify-content:center;
  font-size:12px;color:var(--text2);background:var(--card2)}
.gd-day.blank{background:transparent}
.gd-day.on{color:#fff;font-weight:700}
.gd-day.lv1{background:#DCCFFF;color:#5B3FD0}
.gd-day.lv2{background:#B79CFF;color:#fff}
.gd-day.lv3{background:#8B5CF6;color:#fff}
.gd-day.lv4{background:linear-gradient(135deg,#6D6BFA 0%,#B45CF6 55%,#FF7EB3 100%)}
.gd-day.today{box-shadow:0 0 0 2px var(--card),0 0 0 4px var(--primary)}
.gd-cal-lg{display:flex;align-items:center;gap:6px;justify-content:flex-end;
  margin-top:11px;font-size:11px;color:var(--text2)}
.gd-cal-lg i{width:11px;height:11px;border-radius:4px;display:block}
.gd-cal-sum{display:flex;gap:14px;flex-wrap:wrap;margin-top:12px;padding-top:12px;
  border-top:1px solid var(--border);font-size:12px;color:var(--text2)}
.gd-cal-sum b{color:var(--text);font-size:14px;font-weight:700;margin-left:3px}

/* 历史目标卡片 */
.gd-hcard{background:var(--card);border:1px solid var(--border);border-radius:18px;
  padding:14px;margin-bottom:10px;box-shadow:0 4px 16px rgba(24,32,64,.05);cursor:pointer}
.gd-hcard:active{transform:scale(.99)}
.gd-hcard-hd{display:flex;align-items:flex-start;gap:8px;margin-bottom:9px}
.gd-hcard-hd b{flex:1;min-width:0;font-size:14.5px;font-weight:700;line-height:1.35}
.gd-hcard .gd-bar{margin:0 0 9px}
.gd-hcard-ft{display:flex;gap:12px;flex-wrap:wrap;font-size:12px;color:var(--text2)}
.gd-res{flex:none;font-size:10.5px;font-weight:800;padding:3px 8px;border-radius:9px;white-space:nowrap}
.gd-res.win{background:#E8F8EF;color:#1F9D55}
.gd-res.mid{background:var(--iconbg);color:var(--text2)}
.gd-res.drop{background:rgba(229,72,77,.1);color:#E5484D}

/* 「进行中」空了但历史里还有东西时,给一条安静的去处 */
.gd-none{display:flex;align-items:center;gap:10px;padding:14px;margin-bottom:12px;
  border-radius:18px;border:1px dashed var(--border);background:var(--card)}
.gd-none-ico{font-size:20px;line-height:1}
.gd-none-b{flex:1;min-width:0}
.gd-none-b b{display:block;font-size:13.5px;font-weight:700}
.gd-none-b .gd-sub{margin-top:2px}
.gd-none button{flex:none;border:none;border-radius:12px;padding:8px 13px;font-size:12.5px;
  font-weight:700;color:var(--primary);background:var(--iconbg);cursor:pointer}

@media (max-width:360px){
  .gd-hist{padding:7px 9px;font-size:12px}
  .gd-new{padding:9px 12px;font-size:12.5px}
}

/* ★ 深色皮肤:body 的背景渐变里写死了浅色(pro.css 的老问题,还没修),所以页面底色实际是浅的,
   而字色也是浅的 → 分区小标题直接看不见("目标日历"看着像禁用)。
   这类小标题会飘在浅底/深底之间,靠调字色救不了,只能让它自带一块近黑玻璃底,放哪都读得出。 */
body.theme-galaxy .gd-sec,
body.theme-tech .gd-sec{
  display:inline-block;margin:2px 0 8px;padding:5px 10px;border-radius:9px;
  color:#DCE4F5;background:rgba(14,19,34,.80);border:1px solid rgba(255,255,255,.10)}
/* ★ 副标题别用 text-wrap:balance —— 这一行窄,均衡反而把「拆成每天」断在词中间(真机看过) */
.gd-head .gd-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
