:root{
  --bg:#F5F2EE; --bg2:#EFEAE4; --card:#FFFFFF; --card2:#FAF8F5;
  --line:#E7E0D8; --line2:#F1ECE6;
  --ink:#3E3A36; --ink2:#6C645E; --ink3:#9C948D;
  --primary:#8C9A93; --primary-d:#74857C; --primary-l:#E8ECE8;
  --danger:#BC7B6C; --danger-l:#F6E9E5; --ok:#879C81; --ok-l:#E9F0E6;
  --warn:#C3A277; --warn-l:#F7EFE2;
  --r:16px; --r-sm:10px;
  --sh:0 1px 2px rgba(62,58,54,.04), 0 6px 20px rgba(62,58,54,.055);
  --sh-hi:0 2px 6px rgba(62,58,54,.06), 0 14px 34px rgba(62,58,54,.08);
  --font:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:var(--font); color:var(--ink); background:var(--bg);
  font-size:15px; line-height:1.6; -webkit-font-smoothing:antialiased;
}
button,input,select,textarea{font-family:inherit; color:inherit}
h1,h2,h3,h4,p{margin:0}
ul{margin:0;padding:0;list-style:none}
a{color:inherit;text-decoration:none}
/* hidden 优先级最高：防止 .btn 这类自带 display 的规则把 hidden 元素显示出来 */
[hidden]{display:none !important}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:#DCD4CB;border-radius:8px}
::-webkit-scrollbar-track{background:transparent}

.app{display:flex;min-height:100vh;align-items:stretch}

/* ============ Sidebar ============ */
.sidebar{
  width:238px; flex:0 0 238px; background:linear-gradient(180deg,#F2EDE6 0%,#EAE4DC 100%);
  border-right:1px solid var(--line); display:flex; flex-direction:column;
  position:sticky; top:0; height:100vh; z-index:40;
}
.brand{padding:22px 20px 14px}
.brand h1{font-size:17px;font-weight:700;letter-spacing:.02em}
.brand p{font-size:11.5px;color:var(--ink3);letter-spacing:.16em;text-transform:uppercase;margin-top:2px}
.nav{padding:6px 12px 12px;overflow-y:auto;flex:1}
.nav-label{font-size:11px;color:var(--ink3);letter-spacing:.12em;padding:12px 8px 6px}
.nav-item{
  display:flex;align-items:center;gap:10px;width:100%;border:0;background:transparent;
  padding:10px 10px;border-radius:var(--r-sm);cursor:pointer;text-align:left;
  font-size:14px;color:var(--ink2);min-height:44px;transition:background .16s,color .16s;
}
.nav-item:hover{background:rgba(255,255,255,.66);color:var(--ink)}
.nav-item.active{background:#fff;color:var(--ink);font-weight:600;box-shadow:var(--sh)}
.dot{width:9px;height:9px;border-radius:50%;flex:0 0 9px}
.nav-item .badge{margin-left:auto;font-size:11px;color:var(--ink3);background:rgba(255,255,255,.8);border-radius:20px;padding:1px 7px;min-width:22px;text-align:center}
.side-foot{padding:12px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:8px}
.side-foot .row{display:flex;gap:8px}
.mini{flex:1;border:1px solid var(--line);background:#fff;border-radius:var(--r-sm);
  padding:8px 6px;font-size:12.5px;cursor:pointer;min-height:38px;color:var(--ink2)}
.mini:hover{border-color:var(--primary);color:var(--ink)}

/* ============ Main ============ */
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{
  position:sticky;top:0;z-index:30;background:rgba(245,242,238,.88);
  backdrop-filter:saturate(160%) blur(10px);border-bottom:1px solid var(--line);
  padding:10px 18px;display:flex;align-items:center;gap:12px;
}
.hamb{display:none;width:44px;height:44px;border:1px solid var(--line);background:#fff;border-radius:var(--r-sm);align-items:center;justify-content:center;cursor:pointer}
.topbar .tb-title{font-size:15px;font-weight:600}
.topbar .tb-sub{font-size:12px;color:var(--ink3)}
.spacer{flex:1}
.sync{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--ink2);
  background:#fff;border:1px solid var(--line);border-radius:20px;padding:5px 11px;white-space:nowrap}
.sync .sd{width:7px;height:7px;border-radius:50%;background:var(--ok)}
.sync.syncing .sd{background:var(--warn);animation:pulse 1s infinite}
.sync.off .sd{background:var(--danger)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}

/* 本地预览提示条：本地文件没连上资料库时，页面只能显示示例数据 */
.ptip{display:flex;align-items:flex-start;gap:8px;margin:12px auto 0;max-width:1180px;width:calc(100% - 36px);
  padding:10px 13px;border-radius:12px;background:#FDF6E9;border:1px solid #EADFC4;color:#7C6640;
  font-size:12.5px;line-height:1.65}
.ptip svg{flex:0 0 auto;margin-top:1px}
.ptip b{color:#8A5A16}
.ptip .ptip-body{flex:1;min-width:0}
.ptip a.ptip-btn{display:inline-flex;align-items:center;gap:5px;margin-top:7px;padding:6px 12px;border-radius:9px;
  background:#B08A3E;color:#fff;font-size:12.5px;font-weight:600;text-decoration:none;word-break:break-all}
.ptip a.ptip-btn:hover{background:#9C7833}
.ptip .ptip-url{display:block;margin-top:7px;font-size:11.5px;color:#8A7350;word-break:break-all;user-select:all}
/* 提示条上的按钮（含「继续填写 / 丢弃」两个动作） */
.ptip button.ptip-btn{display:inline-flex;align-items:center;gap:5px;margin-top:7px;padding:6px 12px;border-radius:9px;
  background:#B08A3E;border:0;color:#fff;font-size:12.5px;font-weight:600;font-family:inherit;cursor:pointer}
.ptip button.ptip-btn:hover{background:#9C7833}
.ptip button.ptip-btn.ghost{background:#fff;color:#8A6A3E;border:1px solid #E0CDA6}
.ptip button.ptip-btn.ghost:hover{background:#FBF3E4}
.ptip button[hidden]{display:none}
/* 提示条上的动作排成一组（本地预览 / 离线都有「重新连接」+「打开在线版」） */
.ptip .ptip-acts{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.ptip a.ptip-btn.ghost{background:#fff;color:#8A6A3E;border:1px solid #E0CDA6}
.ptip a.ptip-btn.ghost:hover{background:#FBF3E4}
/* 提示条右侧的收起按钮：不挡住正文，手指也点得到 */
.ptip .ptip-x{flex:0 0 auto;border:0;background:none;padding:4px 2px 4px 6px;cursor:pointer;line-height:0}

/* 「还有内容没保存」提示条：手机端登录跳转会整页重载，填了一半的内容还在本地草稿里 */
.dtip{background:#FDF1E8;border-color:#EED4BC;color:#7B5B3E}
.dtip b{color:#A05826}
.dtip .ptip-acts{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.dtip button.ptip-btn{background:#B4703F}
.dtip button.ptip-btn:hover{background:#9C5F33}
.dtip button.ptip-btn.ghost{background:#fff;color:#9A6234;border:1px solid #E5C7A9}
.dtip button.ptip-btn.ghost:hover{background:#FCF0E6}

/* 顶栏版本角标 + 重新加载按钮（手机上判断是不是最新版） */
.ver{font-size:11px;color:var(--ink3);letter-spacing:.02em}
/* 同步状态本身也是按钮：手机上连不上时点它就地重连（比整页重载快） */
.sync{cursor:pointer}
.reload{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;
  border:1px solid var(--line);background:#fff;border-radius:9px;cursor:pointer}
.reload:hover{background:#F7F3EE}
.reload:active svg{transform:rotate(-50deg)}
.reload svg{transition:transform .2s ease}

.content{padding:18px;max-width:1180px;width:100%;margin:0 auto;flex:1}

/* ============ Card ============ */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh);padding:18px}
.card + .card{margin-top:16px}
.card-head{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
.card-head h2{font-size:15.5px;font-weight:700}
.card-head h2 .cnt{font-size:12px;color:var(--ink3);font-weight:500;margin-left:6px}
.card-head .spacer{flex:1}
.hint{font-size:11.5px;color:var(--ink3);line-height:1.5;margin-top:4px}

/* ============ Buttons ============ */
.btn{border:1px solid var(--line);background:#fff;border-radius:var(--r-sm);
  padding:9px 14px;font-size:13.5px;cursor:pointer;min-height:38px;display:inline-flex;
  align-items:center;gap:6px;justify-content:center;transition:.16s;color:var(--ink2)}
.btn:hover{border-color:var(--primary);color:var(--ink)}
.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
.btn.primary:hover{background:var(--primary-d);border-color:var(--primary-d);color:#fff}
.btn.ghost{background:transparent}
.btn.sm{padding:6px 10px;font-size:12.5px;min-height:32px}
.btn:disabled{opacity:.5;cursor:not-allowed}
.icon-btn{width:34px;height:34px;border-radius:9px;border:1px solid var(--line);background:#fff;
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--ink3);transition:.16s;flex:0 0 auto}
.icon-btn:hover{border-color:var(--primary);color:var(--primary-d)}
.icon-btn.danger:hover{border-color:var(--danger);color:var(--danger)}

/* ============ Urgent bar ============ */
.urgent{margin-bottom:16px;border-radius:var(--r);border:1px solid var(--line);
  background:var(--card);box-shadow:var(--sh);overflow:hidden}
.urgent .uhead{display:flex;align-items:center;gap:8px;padding:11px 16px;font-size:13.5px;font-weight:600;
  background:var(--warn-l);color:#8A6A3E;border-bottom:1px solid #F0E4D2}
.urgent.calm .uhead{background:var(--ok-l);color:#5E7458;border-bottom-color:#DFE9DB}
.urgent.alert .uhead{background:var(--danger-l);color:#9A5949;border-bottom-color:#F0DDD7}
.urgent .ubody{padding:6px 10px 10px}
.uitem{display:flex;align-items:center;gap:10px;padding:9px 6px;border-radius:var(--r-sm);min-height:44px}
.uitem:hover{background:var(--card2)}
.uitem .utitle{flex:1;min-width:0;font-size:14px}
.uitem .utitle small{display:block;font-size:11.5px;color:var(--ink3);margin-top:1px}
.uitem.overdue .utitle,.uitem.over .utitle{color:#9A5949}
.uitem.overdue .utitle b,.uitem.over .utitle b{font-weight:600}
/* 临近截止的提醒行：只是提醒，不算逾期 */
.uitem.soon .utitle{color:#8A6A3E}
.uitem.soon .utitle b{font-weight:600}
/* 截止日还在更远的地方：中性样式，安静地列着，不催也不隐藏 */
.uitem.later .utitle{color:var(--ink2)}
.uitem.later .utitle b{font-weight:600}

/* ============ Hero (date) ============ */
.hero{display:flex;flex-direction:column;gap:14px}
.hero-top{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}
.hero-date .d1{font-size:13px;color:var(--ink3);letter-spacing:.04em}
.hero-date .d2{font-size:30px;font-weight:700;line-height:1.15;letter-spacing:-.01em}
.hero-date .d3{font-size:13px;color:var(--ink2);margin-top:4px}
.yearbar{margin-top:2px}
.yearbar .yb-top{display:flex;justify-content:space-between;font-size:12px;color:var(--ink3);margin-bottom:6px}
.track{height:8px;border-radius:8px;background:var(--bg2);overflow:hidden}
.track > i{display:block;height:100%;border-radius:8px;background:linear-gradient(90deg,var(--primary),#A8B5AD)}

/* ============ Important dates ============ */
.dlist{display:flex;flex-direction:column;gap:10px;max-height:302px;overflow-y:auto;padding-right:2px}
.ditem{display:flex;align-items:center;gap:12px;padding:11px 12px;border:1px solid var(--line2);
  border-radius:var(--r-sm);background:var(--card2);min-height:60px}
.ditem .dnum{min-width:64px;text-align:center;border-radius:10px;padding:5px 6px;background:#fff;border:1px solid var(--line2)}
.ditem .dnum b{display:block;font-size:19px;line-height:1.15;font-weight:700}
.ditem .dnum span{font-size:10.5px;color:var(--ink3)}
.ditem .dinfo{flex:1;min-width:0}
.ditem .dinfo .dt{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ditem .dinfo .ds{font-size:12px;color:var(--ink3);margin-top:2px}
.ditem.today .dnum{background:var(--danger-l);border-color:#F0DDD7}
.ditem.today .dnum b{color:#9A5949}
.ditem.soon .dnum b{color:var(--primary-d)}
/* 下一个要到的日子（主视图只显示这一个） */
.dnext{display:flex;align-items:center;gap:14px;padding:15px 16px;border:1px solid var(--line2);
  border-radius:var(--r-sm);background:var(--card2)}
.dnext .dnum{min-width:92px;text-align:center;border-radius:12px;padding:8px 10px;background:#fff;border:1px solid var(--line2)}
.dnext .dnum b{display:block;font-size:32px;line-height:1.08;font-weight:700;letter-spacing:-.01em}
.dnext .dnum span{font-size:11px;color:var(--ink3)}
.dnext .dinfo{flex:1;min-width:0}
.dnext .dinfo .dt{font-size:16px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dnext .dinfo .ds{font-size:12px;color:var(--ink3);margin-top:3px}
.dnext .tacts{display:flex;gap:6px;align-items:center;flex:0 0 auto}
.dnext.today .dnum{background:var(--danger-l);border-color:#F0DDD7}
.dnext.today .dnum b{color:#9A5949}
.dnext.soon .dnum b{color:var(--primary-d)}
.dlist[hidden]{display:none}

/* ============ Task panel ============ */
.seg{display:inline-flex;background:#E4DBD2;border-radius:11px;padding:3px;gap:3px;box-shadow:inset 0 1px 2px rgba(62,58,54,.07)}
.seg button{border:0;background:transparent;border-radius:9px;padding:7px 16px;font-size:13.5px;
  cursor:pointer;color:var(--ink2);min-height:34px;transition:.16s}
.seg button.on{background:#fff;color:var(--primary-d);font-weight:700;box-shadow:0 0 0 1.5px rgba(140,154,147,.6),0 2px 7px rgba(62,58,54,.14)}
/* 紧凑版分段开关（表单里用：任务类型 / 重复方式） */
.seg.tiny{padding:2px;border-radius:9px}
.seg.tiny button{padding:5px 12px;font-size:12.5px;min-height:30px;border-radius:7px}
.period{display:flex;align-items:center;gap:8px}
.period .plabel{font-size:13.5px;font-weight:600;min-width:0}
.tsum{display:flex;align-items:center;gap:14px;margin:2px 0 14px;padding:12px 14px;
  background:var(--card2);border:1px solid var(--line2);border-radius:var(--r-sm);flex-wrap:wrap}
.tsum .tnum{font-size:13px;color:var(--ink2)}
.tsum .tnum b{font-size:19px;color:var(--ink);font-weight:700;margin-right:2px}
.ring{width:52px;height:52px;flex:0 0 52px}
.tlist{display:flex;flex-direction:column;gap:8px}
.titem{display:flex;align-items:flex-start;gap:11px;padding:11px 12px;border:1px solid var(--line2);
  border-radius:var(--r-sm);background:#fff;transition:.16s}
.titem:hover{border-color:#DDD4CA;box-shadow:var(--sh)}
.titem .ck{width:24px;height:24px;flex:0 0 24px;margin-top:1px;border-radius:8px;border:1.6px solid #D6CCC2;
  background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.16s}
.titem .ck:hover{border-color:var(--primary)}
.titem.done .ck{background:var(--ok);border-color:var(--ok)}
.titem.done .tt{color:var(--ink3);text-decoration:line-through}
.titem .tbody{flex:1;min-width:0}
.titem .tt{font-size:14.5px;font-weight:500;word-break:break-word}
.titem .tmeta{display:flex;align-items:center;gap:7px;margin-top:5px;flex-wrap:wrap}
.chip{font-size:11px;padding:1.5px 8px;border-radius:20px;background:var(--bg2);color:var(--ink2);white-space:nowrap}
.chip.src-goal{background:var(--primary-l);color:#5C6E64}
.chip.src-adhoc{background:#F2EDE6;color:#8A7B6C}
.chip.pri-高{background:var(--danger-l);color:#9A5949}
.chip.pri-中{background:var(--warn-l);color:#8A6A3E}
.chip.pri-低{background:var(--primary-l);color:#5C6E64}
.chip.cycle{background:#fff;border:1px solid var(--line2);color:var(--ink3)}
.titem .tacts{display:flex;gap:6px;align-items:center}
.mini-date{font-size:12px;color:var(--ink3);white-space:nowrap}

.empty{padding:26px 12px;text-align:center;color:var(--ink3);font-size:13.5px}
.empty svg{opacity:.5;margin-bottom:8px}

/* ============ Module view ============ */
.mhead{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.mhead .mico{width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;flex:0 0 46px}
.mhead h2{font-size:18px;font-weight:700}
.mhead .msub{font-size:12.5px;color:var(--ink3);margin-top:2px}
.stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:16px}
.stat{background:var(--card2);border:1px solid var(--line2);border-radius:var(--r-sm);padding:11px 12px}
.stat .sv{font-size:20px;font-weight:700}
.stat .sl{font-size:11.5px;color:var(--ink3);margin-top:1px}
.glist{display:flex;flex-direction:column;gap:8px}
.gitem{display:flex;align-items:center;gap:11px;padding:11px 12px;border:1px solid var(--line2);
  border-radius:var(--r-sm);background:var(--card2);min-height:52px;flex-wrap:wrap}
.gitem .gt{flex:1;min-width:120px;font-size:14px;font-weight:500}
.switch{position:relative;width:44px;height:26px;flex:0 0 44px;border-radius:20px;background:#DED6CC;
  border:0;cursor:pointer;transition:.2s;padding:0}
.switch:after{content:"";position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;
  background:#fff;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.15)}
.switch.on{background:var(--primary)}
.switch.on:after{transform:translateX(18px)}

/* ============ Modal ============ */
.overlay{position:fixed;inset:0;background:rgba(52,48,45,.36);z-index:80;display:flex;
  align-items:center;justify-content:center;padding:16px;backdrop-filter:blur(2px)}
.overlay[hidden]{display:none}
.modal{background:#fff;border-radius:18px;box-shadow:var(--sh-hi);width:100%;max-width:460px;
  max-height:92vh;display:flex;flex-direction:column;overflow:hidden}
.modal-head{display:flex;align-items:center;padding:11px 14px 9px;border-bottom:1px solid var(--line2)}
.modal-head h3{font-size:15px;font-weight:700;flex:1}
.modal-body{padding:12px 14px;overflow-y:auto}
.mform[hidden],.mpanel[hidden]{display:none}
.field{margin-bottom:6px}
.field label{display:block;font-size:11.5px;color:var(--ink2);margin-bottom:3px;font-weight:600}
.field input,.field select,.field textarea{
  width:100%;border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;
  font-size:15px;background:#fff;outline:none;transition:.16s;min-height:40px}
.field textarea{min-height:48px;height:48px;resize:vertical;font-size:14.5px;line-height:1.5}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-l)}
.field select{appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239C948D' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;padding-right:34px}
.two{display:grid;grid-template-columns:1fr 1fr;gap:8px}
/* 弹窗里的弹性两列：某一项按类型隐藏时，另一项自动占满整行 */
.two.flex2{display:flex;gap:8px}
.two.flex2>.field{flex:1;min-width:0}
.two.flex2>.field[hidden]{display:none}

/* ============ 目标看板 / 子模块 ============ */
.gboard{display:flex;flex-direction:column;gap:12px}
.gp{border:1px solid var(--line2);border-radius:var(--r-sm);background:var(--card2);padding:10px 12px}
.gp-head{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:600;color:var(--ink2)}
.gp-head .cnt{font-size:11.5px;color:var(--ink3);font-weight:400}
.gp-list{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.gp-empty{font-size:12.5px;color:var(--ink3);padding:4px 0}
.gp-more{border:1px dashed var(--line);border-radius:var(--r-sm);background:transparent}
.gp-more.open{border-style:solid}
.gp-more-btn{display:flex;align-items:center;gap:8px;width:100%;border:0;background:transparent;
  font-family:inherit;font-size:13.5px;font-weight:600;color:var(--ink3);text-align:left;
  padding:10px 12px;min-height:44px;cursor:pointer;-webkit-appearance:none;appearance:none;border-radius:var(--r-sm)}
.gp-more-btn:hover{color:var(--ink2)}
.gp-more-btn:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
.gp-more-btn .arw{display:inline-block;font-size:15px;line-height:1;transition:transform .18s}
.gp-more.open .gp-more-btn .arw{transform:rotate(90deg)}
.gp-more-btn .tg{font-size:11.5px;font-weight:400;color:var(--ink3)}
.gp-more-list{display:flex;flex-direction:column;gap:12px;padding:0 12px 12px}
.goalitem{display:flex;align-items:center;gap:7px 9px;padding:9px 10px;border-radius:10px;background:#fff;
  border:1px solid var(--line2);min-height:44px;flex-wrap:wrap}
/* 目标标题：min-width 240px —— 容器放得下就和档期/按钮同行（宽屏紧凑），
   放不下就独占整行（窄容器 / 手机），文字完整换行，不再被挤成 100px 的细长条 */
.goalitem .gt{flex:1 1 auto;min-width:min(100%,240px);font-size:14px;word-break:break-word;overflow-wrap:anywhere}
.goalitem .chip,.goalitem .icon-btn{flex:0 0 auto}
.goalitem .chip{margin-left:auto}
.subcard{border:1px solid var(--line2);border-radius:12px;background:var(--card2);padding:12px}
.sublist-wrap{display:flex;flex-direction:column;gap:12px}
.subhead{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.subhead .sn{font-size:15px;font-weight:600}
.subhead .st{font-size:11.5px;color:var(--ink3)}
.subsec{margin-top:11px;padding-top:11px;border-top:1px dashed var(--line2)}
.subsec .sh{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--ink3);margin-bottom:7px}
.subsec .sh b{color:var(--ink2);font-weight:600;font-size:13px}
.sublist{display:flex;flex-direction:column;gap:6px}
.mini-add{border:1px dashed var(--line);background:#fff;border-radius:999px;padding:4px 11px;
  font-size:12px;color:var(--ink2);cursor:pointer;min-height:30px}
.mini-add:hover{border-color:var(--primary);color:var(--ink)}
@media (max-width:768px){
  .subsec .sh{flex-wrap:wrap;row-gap:6px}
}
.modal-foot{display:flex;gap:10px;padding:10px 14px 12px;border-top:1px solid var(--line2)}
.modal-foot .btn{flex:1;min-height:40px;font-size:13.5px}
.dataarea{width:100%;min-height:150px;font-size:12px;font-family:ui-monospace,Consolas,monospace;
  border:1px solid var(--line);border-radius:var(--r-sm);padding:10px;resize:vertical}
/* 在线版链接：手机上「添加到主屏幕」要用它，所以字号不能太小、要能整段选中 */
.linkbox{width:100%;padding:10px 12px;font-size:12.5px;line-height:1.6;color:var(--ink);
  background:#FBF9F6;border:1px solid var(--line);border-radius:var(--r-sm);
  word-break:break-all;-webkit-user-select:all;user-select:all}
.linkbox:focus{outline:2px solid var(--primary-l)}

/* ============ 模块工作台（紧凑版，一屏看全貌） ============ */
#viewModule .card.modhead,#viewNotes .card.modhead{padding:13px 16px}
#viewModule .mhead,#viewNotes .mhead{gap:12px;flex-wrap:nowrap}
#viewModule .mhead .mico,#viewNotes .mhead .mico{width:40px;height:40px;border-radius:12px;flex:0 0 40px;background:var(--card2)}
#viewModule .mhead h2,#viewNotes .mhead h2{font-size:16.5px;line-height:1.25}
#viewModule .mhead .msub,#viewNotes .mhead .msub{font-size:11.5px;color:var(--ink3);margin-top:1px;line-height:1.4}
#viewModule .mttl,#viewNotes .mttl{min-width:0}
#viewModule .mstats,#viewNotes .mstats{display:flex;gap:6px;margin-left:auto;flex:0 0 auto}
#viewModule .mstat,#viewNotes .mstat{background:var(--card2);border:1px solid var(--line2);border-radius:9px;padding:4px 11px;text-align:center;min-width:56px}
#viewModule .mstat b,#viewNotes .mstat b{display:block;font-size:15px;font-weight:700;line-height:1.2;font-variant-numeric:tabular-nums}
#viewModule .mstat span,#viewNotes .mstat span{font-size:10px;color:var(--ink3);white-space:nowrap}
/* 2×2 排版：目标横跨顶部，下面左子模块、右任务。高度按内容自然撑开
   （不锁一屏、不裁切内容），子模块点开后完整显示 */
#viewModule .mgrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);
  grid-template-rows:auto auto;
  gap:12px;margin-top:12px;align-items:start}
#viewModule .mpane.goalpane{grid-column:1/-1}
#viewModule .goalpane .mscroll{max-height:none}
#viewModule .mgrid>.card+.card{margin-top:0}
#viewModule .mpane{padding:12px;display:flex;flex-direction:column;min-height:0;overflow:visible}
#viewModule .mpane .card-head{margin-bottom:8px;flex:0 0 auto}
#viewModule .mpane .card-head h2{font-size:14.5px}
#viewModule .mpane .card-head .btn.sm{padding:5px 10px;font-size:12px;min-height:30px}
#viewModule .mscroll{flex:0 0 auto;min-height:0;overflow:visible;padding-right:0}
/* —— 目标：chip 列表（留白尽量小，避免目标区占掉半屏） —— */
#viewModule .gboard{gap:5px}
#viewModule .gp{padding:5px 8px;border-radius:9px}
#viewModule .gp-head{font-size:12px;margin-bottom:3px}
#viewModule .gp-empty{font-size:12px;padding:2px 0}
#viewModule .chips{display:flex;flex-wrap:wrap;gap:5px}
#viewModule .gwrap{position:relative;display:flex;max-width:100%;min-width:0}
/* 目标 chip：正文允许换行 —— 文字完整显示。
   ① 圆角由 pill(999px) 改 9px：多行时若还用 pill，文字会被左右圆角切掉；
   ② 宽度上限 100%：长目标自动折行并独占该行，短目标仍可并排，整体留白不变（gap 5px / padding 3px 9px）；
   ③ line-height 1.42 是「两行 ≈ 34px」的紧凑档位，别调大 */
#viewModule .gchip{display:inline-flex;align-items:center;gap:6px;max-width:100%;min-width:0;
  border:1px solid var(--line);background:#fff;border-radius:9px;padding:3px 9px;
  font-family:inherit;font-size:12px;line-height:1.42;color:var(--ink);
  cursor:pointer;transition:.15s;min-height:25px;text-align:left}
#viewModule .gchip:hover{border-color:var(--primary);background:var(--primary-l)}
#viewModule .gchip>span{flex:1 1 auto;min-width:0;white-space:normal;
  overflow-wrap:anywhere;word-break:break-word}
#viewModule .gchip .gsub{font-style:normal;flex:0 0 auto;align-self:center;font-size:10.5px;color:var(--ink3);
  background:var(--bg2);border-radius:6px;padding:1px 6px;white-space:nowrap;
  max-width:104px;overflow:hidden;text-overflow:ellipsis}
#viewModule .gx{position:absolute;top:-5px;right:-5px;width:17px;height:17px;border-radius:50%;
  border:1px solid var(--line);background:#fff;color:var(--ink3);display:flex;align-items:center;
  justify-content:center;cursor:pointer;padding:0;opacity:0;transition:opacity .15s;z-index:2}
#viewModule .gwrap:hover .gx{opacity:1}
#viewModule .gx:hover{background:var(--danger);border-color:var(--danger);color:#fff}
#viewModule .gp-more-btn{padding:6px 9px;min-height:32px;font-size:12.5px}
#viewModule .gp-more-list{padding:0 9px 9px;gap:8px}
/* —— 子模块：卡片网格 + 点开详情 —— */
#viewModule .subgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(176px,1fr));gap:8px}
#viewModule .subcard{padding:0;border-radius:10px;overflow:hidden}
#viewModule .subcard.open{grid-column:1/-1}
#viewModule .sc-top{display:flex;align-items:center;gap:8px;width:100%;border:0;background:transparent;
  padding:9px 11px;cursor:pointer;text-align:left;min-height:44px;font-family:inherit;color:inherit}
#viewModule .sc-top:hover{background:#fff}
#viewModule .sc-top .sn{font-size:13.5px;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#viewModule .sc-nums{display:flex;align-items:center;gap:7px;font-size:10.5px;color:var(--ink3);white-space:nowrap}
#viewModule .sc-nums i{font-style:normal;font-weight:700;color:var(--ink2);font-size:12px}
#viewModule .sc-nums .zero i{color:#C9C1B8;font-weight:400}
#viewModule .sc-top .arw{color:var(--ink3);font-size:14px;line-height:1;transition:transform .18s;flex:0 0 auto}
#viewModule .subcard.open .sc-top .arw{transform:rotate(90deg)}
#viewModule .sc-body{padding:0 10px 9px;border-top:1px dashed var(--line2);margin-top:1px}
#viewModule .sc-body .subsec:first-child{margin-top:8px;padding-top:0;border-top:0}
#viewModule .sc-foot{margin-top:7px;display:flex;justify-content:flex-end;gap:6px;flex-wrap:wrap}
/* —— 任务：紧凑行（定期 / 临时合并在一张列表里） —— */
#viewModule .tlist.compact{gap:4px}
#viewModule .trow{display:flex;align-items:center;gap:8px;padding:5px 8px;border:1px solid var(--line2);
  border-radius:9px;background:#fff;min-height:36px}
#viewModule .trow:hover{border-color:#DDD4CA}
#viewModule .trow .ck{width:21px;height:21px;flex:0 0 21px;border-radius:7px;border:1.6px solid #D6CCC2;
  background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:.15s}
#viewModule .trow .ck:hover{border-color:var(--primary)}
#viewModule .trow.done .ck{background:var(--ok);border-color:var(--ok)}
#viewModule .trow .tt{flex:1;min-width:0;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#viewModule .trow.done .tt{color:var(--ink3);text-decoration:line-through}
#viewModule .trow .d{font-size:11.5px;color:var(--ink3);white-space:nowrap}
#viewModule .trow .tag{font-size:10.5px;border-radius:6px;padding:1px 7px;white-space:nowrap}
#viewModule .trow .tag.sub{background:var(--bg2);color:var(--ink2)}
#viewModule .trow .tag.cy{background:#fff;border:1px solid var(--line2);color:var(--ink3)}
#viewModule .trow .tag.over{background:var(--danger-l);color:#9A5949}
/* 定期任务标记：循环箭头图标 + 重复规则文案 */
#viewModule .trow .tag.rep{display:inline-flex;align-items:center;gap:3px;background:#fff;
  border:1px solid var(--line2);color:var(--ink3);max-width:150px;overflow:hidden}
#viewModule .trow .tag.rep span{overflow:hidden;text-overflow:ellipsis}
#viewModule .trow .tag.rep svg{flex:0 0 auto;color:var(--primary-d)}
#viewModule .trow.off .tt{color:var(--ink3)}
#viewModule .trow .switch{width:32px;height:19px;flex:0 0 32px}
#viewModule .trow .switch:after{width:15px;height:15px;top:2px;left:2px}
#viewModule .trow .switch.on:after{transform:translateX(13px)}
#viewModule .trow .tacts2{display:flex;gap:4px;align-items:center}
#viewModule .trow .tacts2 .icon-btn{width:26px;height:26px;border-radius:7px}
/* 任务卡顶部的周期切换（与总览同一 state.period） */
#viewModule .card-head .seg.tiny{padding:2px;border-radius:8px;gap:2px;flex:0 0 auto}
#viewModule .card-head .seg.tiny button{padding:4px 10px;font-size:11.5px;min-height:26px;border-radius:6px}
/* 「定期任务 · 规则 N 条」分段标签 */
#viewModule .tlist .tsec{padding:9px 2px 4px;margin-top:1px;border-top:1px dashed var(--line2);letter-spacing:.06em}
@media (hover:hover){
  /* 鼠标悬停才占位：不悬停时收成 0 宽，把空间留给任务名 */
  #viewModule .trow .tacts2{opacity:0;max-width:0;overflow:hidden;transition:opacity .15s,max-width .18s}
  #viewModule .trow:hover .tacts2,#viewModule .trow:focus-within .tacts2{opacity:1;max-width:150px}
}
@media (hover:none){#viewModule .gx{opacity:1}}
/* —— 子模块内联编辑：编辑表单就在子模块卡片里展开，不弹窗、不挪位 —— */
#viewModule .iedit{margin:7px 0 3px;border:1px solid var(--primary);background:#fff;border-radius:10px;
  padding:10px;display:flex;flex-direction:column;gap:8px}
#viewModule .iedit .frow{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
#viewModule .iedit .frow>*{flex:1;min-width:0}
#viewModule .iedit .flab{flex:0 0 auto;font-size:11px;color:var(--ink3);white-space:nowrap}
#viewModule .iedit input[type="text"],#viewModule .iedit input[type="date"],#viewModule .iedit input[type="number"],
#viewModule .iedit select,#viewModule .iedit textarea{font-family:inherit;font-size:13px;color:var(--ink);
  border:1px solid var(--line);border-radius:8px;padding:7px 9px;background:#fff;min-width:0;box-sizing:border-box}
#viewModule .iedit input[type="text"]{flex:1}
#viewModule .iedit textarea{resize:vertical;min-height:34px;width:100%}
#viewModule .iedit .seg.tiny{align-self:flex-start}
#viewModule .iedit .wdays{width:100%}
#viewModule .iedit .wdays button{height:28px;min-width:36px;font-size:12px}
#viewModule .iedit .fbtns{display:flex;gap:8px;justify-content:flex-end}
#viewModule .iedit .enlab{display:flex;align-items:center;gap:6px;flex:0 0 auto;font-size:12.5px;color:var(--ink2);cursor:pointer}
#viewModule .iedit .enlab input{width:15px;height:15px;accent-color:var(--primary);padding:0}
/* —— 展开更多 —— */
#viewModule .more-row{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;
  border:1px dashed var(--line);background:transparent;border-radius:9px;padding:7px 10px;margin-top:5px;
  font-family:inherit;font-size:12.5px;color:var(--ink3);cursor:pointer;min-height:34px}
#viewModule .more-row:hover{color:var(--ink2);border-color:var(--ink3)}
.btn.del{flex:0 0 auto}
.btn.danger{color:var(--danger);border-color:#EAD9D2}
.btn.danger:hover{background:var(--danger-l);border-color:var(--danger);color:var(--danger)}
@media (max-width:980px){
  /* minmax(0,1fr)：单列也必须是「可压缩」的，否则内部内容的最小宽度会把整列撑出屏幕 */
  #viewModule .mgrid{grid-template-columns:minmax(0,1fr);grid-template-rows:auto;gap:12px}
  #viewModule .goalpane .mscroll{max-height:none}
  #viewModule .mpane{overflow:visible}
  #viewModule .mscroll{overflow:visible;padding-right:0}
  #viewModule .mhead,#viewNotes .mhead{flex-wrap:wrap}
  #viewModule .mstats,#viewNotes .mstats{width:100%;margin-left:0}
  #viewModule .mstat,#viewNotes .mstat{flex:1;min-width:0}
  #viewModule .subgrid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
}
@media (max-width:520px){
  #viewModule .gchip{min-height:32px;padding:5px 11px}
  /* 窄屏不再限宽：原来的 max-width:52vw 会把目标文字切掉一半，改由折行完整显示 */
  #viewModule .gchip>span{max-width:none}
  /* 窄屏：定期任务的规则文案收短，把宽度让给任务名 */
  #viewModule .trow .tag.rep{max-width:104px}
  #viewModule .trow .tag.sub{max-width:88px;overflow:hidden;text-overflow:ellipsis}
  #viewModule .gp-more-btn{white-space:normal}
  /* 任务行改两行式：第一行标题（可换行），第二行标签 + 日期 + 操作，不再挤成一条 */
  #viewModule .trow{flex-wrap:wrap;row-gap:4px;padding:8px 10px}
  #viewModule .trow .tt{flex:1 1 calc(100% - 60px);white-space:normal;overflow:visible;text-overflow:clip}
  #viewModule .trow .tag.sub,#viewModule .trow .tag.cy{display:none}
  #viewModule .trow .tag.rep{max-width:none}
  #viewModule .trow .d,#viewModule .trow .tacts2{margin-left:auto}
}

/* ============ 灵感记录（笔记本） ============ */
#viewNotes .noteopts{margin-top:12px;padding:11px 12px}
#viewNotes .nrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
#viewNotes .nsearch{flex:1 1 220px;min-width:0;display:flex;align-items:center;gap:7px;
  border:1px solid var(--line);background:#fff;border-radius:var(--r-sm);padding:0 11px;
  min-height:38px;color:var(--ink3);transition:border-color .16s}
#viewNotes .nsearch:focus-within{border-color:var(--primary)}
#viewNotes .nsearch svg{flex:0 0 auto}
#viewNotes .nsearch input{flex:1;min-width:0;border:0;outline:none;background:transparent;
  font-size:13.5px;padding:9px 0;color:var(--ink)}
#viewNotes .nsearch input::-webkit-search-cancel-button{display:none}
#viewNotes .ntags{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
#viewNotes .ntags:empty{display:none}
#viewNotes .ntag{border:1px solid var(--line);background:#fff;border-radius:999px;padding:3px 11px;
  font-family:inherit;font-size:12px;color:var(--ink2);cursor:pointer;min-height:27px;
  display:inline-flex;align-items:center;gap:5px;transition:.15s}
#viewNotes .ntag:hover{border-color:var(--primary);color:var(--ink)}
#viewNotes .ntag.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
#viewNotes .ntag i{font-style:normal;font-size:10.5px;opacity:.72}
#viewNotes .ngrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));
  gap:10px;margin-top:12px}
#viewNotes .ncard{border:1px solid var(--line2);border-radius:12px;background:var(--card);
  box-shadow:var(--sh);overflow:hidden}
#viewNotes .ncard.open{grid-column:1/-1}
#viewNotes .nc-top{display:flex;align-items:center;gap:8px;width:100%;border:0;background:transparent;
  padding:10px 12px 7px;cursor:pointer;text-align:left;font-family:inherit;color:inherit;min-height:44px}
#viewNotes .nc-top:hover{background:var(--card2)}
#viewNotes .nc-title{flex:1;min-width:0;font-size:13.5px;font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#viewNotes .nc-tag{flex:0 0 auto;font-size:11px;color:var(--primary-d);background:var(--primary-l);
  border-radius:6px;padding:1px 7px;white-space:nowrap;max-width:110px;overflow:hidden;text-overflow:ellipsis}
#viewNotes .nc-date{flex:0 0 auto;font-size:11px;color:var(--ink3);white-space:nowrap}
#viewNotes .nc-top .arw{flex:0 0 auto;color:var(--ink3);font-size:14px;line-height:1;transition:transform .18s}
#viewNotes .ncard.open .nc-top .arw{transform:rotate(90deg)}
#viewNotes .nc-body{padding:0 12px 10px;border-top:1px dashed var(--line2);margin-top:1px}
#viewNotes .nc-text{margin:8px 0 0;font-size:13px;color:var(--ink2);line-height:1.72;
  white-space:pre-wrap;word-break:break-word}
#viewNotes .ncard:not(.open) .nc-text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;
  overflow:hidden}
#viewNotes .nc-foot{margin-top:9px;display:flex;align-items:center;gap:8px}
#viewNotes .nc-meta{flex:1;min-width:0;font-size:11.5px;color:var(--ink3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#viewNotes .nc-foot .icon-btn{width:28px;height:28px;border-radius:8px}
@media (max-width:768px){
  #viewNotes .nc-foot .icon-btn{width:36px;height:36px;border-radius:10px}
  #viewNotes .nsearch{flex:1 1 100%}
  #viewNotes .ntag{min-height:32px;padding:4px 12px}
}
/* 笔记表单：标签给一排常用快捷选择 */
#formNote .tagpick{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}
#formNote .tagpick button{border:1px dashed var(--line);background:#fff;border-radius:999px;
  padding:3px 10px;font-family:inherit;font-size:12px;color:var(--ink2);cursor:pointer;min-height:28px}
#formNote .tagpick button:hover{border-color:var(--primary);color:var(--ink)}
#formNote .tagpick button.on{background:var(--primary-l);border-color:var(--primary);color:var(--primary-d);font-weight:600}

/* ============ 富文本编辑器（灵感记录正文） ============
   版面：工具栏（可换行）+ 编辑区。编辑区按「文章排版」渲染，
   支持小标题 / 字号 / 加粗 / 斜体 / 下划线 / 删除线 / 高亮 / 缩进 /
   项目符号 / 编号 / 对齐 / 链接 / 分隔线 / 图片 / 清除格式 / 撤销重做。 */
.rte{border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden;transition:border-color .16s}
.rte:focus-within{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-l)}
.rte-bar{display:flex;align-items:center;gap:3px;flex-wrap:wrap;padding:5px 6px;
  background:var(--card2);border-bottom:1px solid var(--line2)}
/* 工具栏里的下拉：压掉 .field select 的 100% 宽与 min-height，和图标按钮同高
   （用 #rteBar 提高优先级，否则会被下方 .field select 的 min-height:46px 顶高） */
#rteBar select{height:29px;min-height:0;border:1px solid var(--line);border-radius:8px;background:#fff;
  font-size:12.5px;padding:0 6px;color:var(--ink2);max-width:104px;outline:none;flex:0 0 auto;
  appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%239C948D' stroke-width='2.6' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 6px center;padding-right:20px}
.rte-bar select:focus{border-color:var(--primary)}
#rteBar select:focus{border-color:var(--primary)}
.rte-sp{width:1px;height:19px;background:var(--line);margin:0 2px;flex:0 0 auto}
.rte-b{display:inline-flex;align-items:center;justify-content:center;width:29px;height:29px;padding:0;
  border:1px solid transparent;border-radius:8px;background:transparent;color:var(--ink2);
  cursor:pointer;font-family:inherit;font-size:13px;line-height:1;transition:.14s;flex:0 0 auto}
.rte-b:hover{background:#fff;border-color:var(--line);color:var(--ink)}
.rte-b.on{background:var(--primary-l);border-color:var(--primary);color:var(--primary-d)}
.rte-b b{font-weight:800}
.rte-b i{font-style:italic;font-family:Georgia,"Times New Roman",serif;font-size:14px}
.rte-b u{text-decoration:underline}
.rte-b s{text-decoration:line-through}
.rte-b svg{width:15px;height:15px}
.rte-b[data-cmd="bold"] b,.rte-b[data-cmd="italic"] i,
.rte-b[data-cmd="underline"] u,.rte-b[data-cmd="strikeThrough"] s{pointer-events:none}
.rte-area{min-height:238px;max-height:44vh;overflow-y:auto;padding:12px 13px;outline:none;
  font-size:15px;line-height:1.78;color:var(--ink);word-break:break-word;overflow-wrap:anywhere}
.rte-area:empty:before{content:attr(data-ph);color:var(--ink3);font-size:13.5px}
.rte-area.dragover{background:var(--primary-l)}
/* 上传中的图片占位（上传成功后整体替换成 <img>） */
.rte-img{display:inline-flex;align-items:center;gap:7px;margin:6px 0;padding:7px 11px;
  border:1px dashed var(--line);border-radius:10px;background:var(--card2);
  font-size:12.5px;color:var(--ink3);max-width:100%}
.rte-img.err{border-color:var(--danger);color:var(--danger);background:var(--danger-l)}
.rte-img b{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:44vw}

/* 文章级排版：编辑区与渲染出的笔记共用同一套正文样式 */
.rte-area p,.nc-rich p{margin:7px 0}
.rte-area h2,.nc-rich h2{font-size:17.5px;font-weight:700;line-height:1.42;margin:15px 0 5px}
.rte-area h3,.nc-rich h3{font-size:15.5px;font-weight:700;line-height:1.45;margin:12px 0 4px}
.rte-area h4,.nc-rich h4{font-size:14.5px;font-weight:700;line-height:1.5;margin:10px 0 4px}
.rte-area ul,.nc-rich ul{list-style:disc;padding-left:22px;margin:7px 0}
.rte-area ol,.nc-rich ol{list-style:decimal;padding-left:22px;margin:7px 0}
.rte-area li,.nc-rich li{margin:3px 0}
.rte-area blockquote,.nc-rich blockquote{margin:9px 0;padding:5px 11px;color:var(--ink2);
  border-left:3px solid var(--primary);background:var(--card2);border-radius:0 9px 9px 0}
.rte-area mark,.nc-rich mark{background:#FCE38A;color:inherit;padding:0 2px;border-radius:3px}
.rte-area code,.nc-rich code{font-family:ui-monospace,Consolas,monospace;font-size:12.5px;
  background:var(--bg2);border-radius:5px;padding:1px 5px}
.rte-area pre,.nc-rich pre{font-family:ui-monospace,Consolas,monospace;font-size:12.5px;
  background:var(--card2);border:1px solid var(--line2);border-radius:10px;padding:9px 11px;
  margin:8px 0;white-space:pre-wrap;overflow-wrap:anywhere}
.rte-area hr,.nc-rich hr{border:0;border-top:1px solid var(--line);margin:13px 0}
.rte-area a,.nc-rich a{color:var(--primary-d);text-decoration:underline;text-underline-offset:2px}
.rte-area img,.nc-rich img{max-width:100%;height:auto;border-radius:10px;display:block;margin:9px 0}
.rte-area sub,.nc-rich sub,.rte-area sup,.nc-rich sup{font-size:11px}
.rte-area font[size="1"],.nc-rich font[size="1"]{font-size:12px}
.rte-area font[size="2"],.nc-rich font[size="2"]{font-size:13.5px}
.rte-area font[size="3"],.nc-rich font[size="3"]{font-size:15px}
.rte-area font[size="4"],.nc-rich font[size="4"]{font-size:17px}
.rte-area font[size="5"],.nc-rich font[size="5"]{font-size:19.5px}

/* 展开态笔记的正文（文章观感）：卡片里比编辑区略小一档 */
#viewNotes .nc-rich{font-size:13px;line-height:1.75;color:var(--ink2);margin-top:8px}
#viewNotes .nc-rich h2{font-size:15px;margin:12px 0 4px;color:var(--ink)}
#viewNotes .nc-rich h3{font-size:14px;margin:10px 0 3px;color:var(--ink)}
#viewNotes .nc-rich p{margin:6px 0}
#viewNotes .nc-rich img{margin:8px 0}
#viewNotes .nc-rich blockquote{margin:8px 0;padding:4px 10px}
#viewNotes .nc-text{margin:8px 0 0}

/* 笔记编辑：桌面加宽，手机整屏（写文章要地方） */
.modal.wide{max-width:786px}
#formNote .rte-field{margin-bottom:6px}
@media (max-width:768px){
  .overlay.widen{padding:0;align-items:stretch}
  .modal.wide{max-width:none;width:100%;height:100%;max-height:100vh;border-radius:0}
  .modal.wide .modal-body{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}
  .modal.wide #formNote{flex:1;min-height:0;display:flex;flex-direction:column}
  .modal.wide #formNote .rte-field{flex:1;min-height:0;display:flex;flex-direction:column}
  .modal.wide #formNote .rte-field>.field-label{flex:0 0 auto}
  .modal.wide .rte{flex:1;min-height:0;display:flex;flex-direction:column}
  /* 手机工具栏：三个下拉独占第一行，图标按钮自动换行（都能看见，不用横滑找） */
  .modal.wide .rte-bar{flex:0 0 auto;flex-wrap:wrap;overflow:visible;gap:4px;padding:6px 7px}
  .modal.wide .rte-bar>.rte-sp{display:none}
  .modal.wide .rte-bar>.rte-sp:first-of-type{display:block;flex:0 0 100%;height:0;margin:0}
  .modal.wide .rte-area{flex:1;min-height:0;max-height:none}
  .rte-b{width:34px;height:34px}
  .rte-b svg{width:16px;height:16px}
  #rteBar select{height:34px;font-size:16px;max-width:112px}
  .modal.wide .modal-foot{padding-bottom:calc(11px + env(safe-area-inset-bottom))}
}
/* 弹窗打开时锁住背景滚动（手机上尤其明显） */
body.modal-open{overflow:hidden}
/* 正文里的字段标签（用于编辑器，替代 label+for） */
.field-label{display:block;font-size:11.5px;color:var(--ink2);margin-bottom:3px;font-weight:600}

/* ============ Bottom nav (mobile) ============ */
.bnav{display:none;position:fixed;left:0;right:0;bottom:0;z-index:44;background:rgba(255,255,255,.96);
  backdrop-filter:blur(12px);border-top:1px solid var(--line);
  padding:6px 4px calc(6px + env(safe-area-inset-bottom))}
.bnav ul{display:flex}
.bnav li{flex:1}
.bnav button{width:100%;border:0;background:transparent;display:flex;flex-direction:column;
  align-items:center;gap:3px;padding:6px 2px;font-size:11px;color:var(--ink3);cursor:pointer;min-height:52px}
.bnav button.on{color:var(--primary-d);font-weight:600}
.scrim{display:none;position:fixed;inset:0;background:rgba(52,48,45,.34);z-index:50}
.scrim.on{display:block}
/* 宽屏侧边栏常驻显示，不存在抽屉场景：遮罩一律不显示，
   避免误触发 openDrawer 时遮住侧边栏导致导航点不动 */
@media (min-width:901px){.scrim,.scrim.on{display:none}}

/* ============ Toast ============ */
.toast{position:fixed;left:50%;bottom:84px;transform:translateX(-50%) translateY(10px);z-index:95;
  background:rgba(62,58,54,.94);color:#fff;font-size:13.5px;padding:10px 16px;border-radius:24px;
  opacity:0;pointer-events:none;transition:.22s;max-width:86vw;text-align:center}
.toast.on{opacity:1;transform:translateX(-50%) translateY(0)}

@media (max-width:900px){
  /* z-index 必须高于遮罩 .scrim(50)：否则抽屉滑出后被遮罩整层盖住，
     点侧边栏任何一项都会落到遮罩上（表现为「点了没反应 / 抽屉一闪就关」） */
  .sidebar{position:fixed;left:0;top:0;bottom:0;z-index:60;height:auto;transform:translateX(-102%);transition:transform .26s ease;box-shadow:var(--sh-hi)}
  .sidebar.open{transform:none}
  /* 抽屉是全屏的：底部按钮避开 iPhone 的 Home 指示条 */
  .side-foot{padding-bottom:calc(12px + env(safe-area-inset-bottom))}
  .hamb{display:inline-flex}
  .bnav{display:block}
  .content{padding:14px 14px 92px}
  .topbar{padding:9px 14px}
  .card{padding:15px;border-radius:14px}
  .hero-date .d2{font-size:26px}
  .stats{grid-template-columns:repeat(3,1fr);gap:8px}
  .stat .sv{font-size:17px}
  .dlist{max-height:none}
  .dnext{gap:10px;padding:13px 14px}
  .dnext .dnum{min-width:76px}
  .dnext .dnum b{font-size:26px}
  .dnext .dinfo .dt{font-size:15px}
  .two{grid-template-columns:1fr}
  .seg button{padding:7px 14px}
}
@media (max-width:420px){
  .stats{grid-template-columns:1fr 1fr}
}
/* 窄屏（手机）：表单控件恢复舒适尺寸，输入框字号 ≥16px 防 iOS 自动缩放 */
@media (max-width:768px){
  .field input,.field select,.field textarea{font-size:16px;min-height:46px;padding:11px 12px}
  .field textarea{min-height:74px;font-size:15.5px}
  .modal-head{padding:15px 16px 12px}
  .modal-foot{padding:12px 16px calc(14px + env(safe-area-inset-bottom));}
  .modal-foot .btn{min-height:48px}
  .wdays button{height:38px;min-width:42px;font-size:13px}
  .rp{padding:11px}
}
.grid-top{display:grid;grid-template-columns:1.06fr .94fr;gap:16px;margin-bottom:16px}
@media (max-width:960px){.grid-top{grid-template-columns:minmax(0,1fr)}}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* ============ 首页重排（紧凑一屏版） ============ */
#viewHome .card{padding:15px 16px}
#viewHome .card+.card{margin-top:12px}
#viewHome .grid-top>.card+.card{margin-top:0}
#viewHome .grid-top{margin-bottom:12px}
#viewHome .urgent{margin-bottom:12px}
#viewHome .urgent .uhead{padding:8px 14px;font-size:13px}
#viewHome .urgent .uhead svg{width:13px;height:13px}
#viewHome .urgent .ubody{padding:4px 8px 6px}
#viewHome .uitem{padding:6px 6px;min-height:34px;gap:9px}
#viewHome .uitem .utitle{font-size:13.5px}
#viewHome .uitem .utitle small{font-size:11px}
#viewHome .uitem .btn.sm{padding:4px 8px;font-size:12px;min-height:26px}
#viewHome .card-head{margin-bottom:10px}
#viewHome .card-head h2{font-size:15px}

/* 日期条：横排压缩 */
#viewHome .hero{flex-direction:row;align-items:center;gap:18px;flex-wrap:wrap}
#viewHome .hero-top{flex:0 0 auto}
#viewHome .hero-date .d2{font-size:25px}
#viewHome .hero-date .d3{margin-top:2px}
#viewHome .yearbar{flex:1;min-width:140px;margin-top:0}
#viewHome .yearbar .yb-top{margin-bottom:5px}
#viewHome .track{height:6px}

/* 重要日子：略压缩 */
#viewHome .dnext{padding:12px 14px;gap:12px}
#viewHome .dnext .dnum{min-width:84px;padding:6px 9px}
#viewHome .dnext .dnum b{font-size:27px}
#viewHome .dnext .icon-btn{width:30px;height:30px}
#viewHome .dlist{gap:8px}
#viewHome .dlist .ditem{min-height:54px;padding:9px 11px}

/* 任务清单：一行头 + 细统计条 + 单行紧凑条目 + 宽屏多列 */
#viewHome .seg button{padding:6px 13px;font-size:13px;min-height:30px}
#viewHome .period .plabel{font-size:13px}
#viewHome .tsum{margin:0 0 8px;padding:6px 10px;gap:10px;border-radius:8px}
#viewHome .tsum .tnum{font-size:12.5px}
#viewHome .tsum .tnum b{font-size:14px}
#viewHome .tsum .tmuted{color:#9C948D;font-size:11.5px}
#viewHome .ring{width:30px;height:30px;flex:0 0 30px}
#viewHome .tlist{gap:4px}
#viewHome .tlist .nav-label{padding:8px 2px 2px}
#viewHome .titem{position:relative;align-items:center;gap:8px;padding:5px 8px;
  border:1px solid transparent;border-radius:8px;background:#fff;min-height:30px;transition:.14s}
#viewHome .titem:hover{border-color:var(--line2);background:var(--card2)}
#viewHome .titem .ck{width:17px;height:17px;flex:0 0 17px;margin-top:0;border-radius:5px;
  border:1.6px solid #D6CCC2;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.16s}
#viewHome .titem .ck svg{width:10px;height:10px}
#viewHome .titem .ck:hover{border-color:var(--primary)}
#viewHome .titem.done .ck{background:var(--ok);border-color:var(--ok)}
#viewHome .titem .pribar{width:3px;height:13px;border-radius:3px;flex:0 0 3px;opacity:.85}
#viewHome .titem .tdot{width:7px;height:7px;border-radius:50%;flex:0 0 7px}
#viewHome .titem .tbody{flex:1;min-width:0;display:block}
#viewHome .titem .tt{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#viewHome .titem.done .tt{color:var(--ink3);text-decoration:line-through}
#viewHome .titem .mini-date{font-size:11.5px;color:var(--ink3);flex:0 0 auto}
#viewHome .titem .mini-date.od{color:#9A5949;font-weight:600}
#viewHome .titem .tacts{position:absolute;right:5px;top:50%;transform:translateY(-50%);
  display:flex;gap:4px;align-items:center;opacity:0;pointer-events:none;transition:.14s;
  padding-left:16px;background:linear-gradient(90deg,rgba(255,255,255,0),var(--card2) 34%)}
#viewHome .titem:hover .tacts,#viewHome .titem:focus-within .tacts{opacity:1;pointer-events:auto}
#viewHome .titem .tacts .icon-btn{width:26px;height:26px;border-radius:7px}
#viewHome .titem .tacts .icon-btn svg{width:12px;height:12px}
#viewHome .titem .tacts .btn.sm{padding:3px 7px;font-size:11.5px;min-height:24px}
@media (hover:none){
  #viewHome .titem .tacts{position:static;transform:none;opacity:1;pointer-events:auto;background:none;padding-left:0}
}
@media (min-width:960px){
  #viewHome .tlist.tcols{display:block;column-count:2;column-gap:20px}
  #viewHome .tlist.tcols3{display:block;column-count:3;column-gap:16px}
  #viewHome .tlist.tcols .titem{margin-bottom:4px;break-inside:avoid}
  #viewHome .tlist.tcols .nav-label{break-inside:avoid;break-after:avoid}
}
@media (max-width:640px){
  #viewHome .hero{flex-direction:column;align-items:stretch;gap:10px}
  #viewHome .yearbar{min-width:0}
  #viewHome .seg button{padding:6px 10px}
  #viewHome .card-head{gap:8px}
}

/* ============ 收紧：一屏原则 ============ */

/* —— 日期 + 重要日子：整体缩小 —— */
#viewHome .grid-top{grid-template-columns:.56fr 1.44fr;gap:12px;margin-bottom:10px}
#viewHome .hero{gap:14px}
#viewHome .hero-date .d1{font-size:11px}
#viewHome .hero-date .d2{font-size:19px;line-height:1.2}
#viewHome .hero-date .d3{font-size:11px;margin-top:0}
#viewHome .yearbar .yb-top{font-size:10.5px;margin-bottom:4px}
#viewHome .track{height:5px}
#viewHome .dnext{padding:8px 12px;gap:11px;border-radius:10px}
#viewHome .dnext .dnum{min-width:62px;padding:4px 8px;border-radius:10px}
#viewHome .dnext .dnum b{font-size:20px}
#viewHome .dnext .dnum span{font-size:10px}
#viewHome .dnext .dinfo .dt{font-size:14px}
#viewHome .dnext .dinfo .ds{font-size:11px;margin-top:1px}
#viewHome .dnext .icon-btn{width:26px;height:26px}
#viewHome .dnext .tacts{gap:4px}

/* —— 逾期提醒条（并入任务中心卡内，有逾期才出现）—— */
#viewHome .urgent[hidden]{display:none}
#viewHome .taskcard .urgent{margin:0 0 10px;border-radius:10px;box-shadow:none;background:var(--danger-l)}
#viewHome .taskcard .urgent.warn{background:#FDF7EC}
#viewHome .taskcard .urgent .uhead{background:transparent;border-bottom-color:#F0DDD7}
#viewHome .taskcard .urgent.warn .uhead{border-bottom-color:#F0E4D2}
#viewHome .urgent .uhead{padding:7px 13px;font-size:12.5px}
#viewHome .urgent .ubody{padding:4px 7px 6px}
#viewHome .uitem{padding:4px 6px;min-height:28px;gap:8px}
#viewHome .uitem .dot{width:7px;height:7px;flex:0 0 7px}
#viewHome .uitem .utitle{font-size:12.5px;line-height:1.35}
#viewHome .uitem .utitle small{font-size:10.5px;margin-top:0}
#viewHome .uitem .btn.sm{padding:3px 7px;font-size:11.5px;min-height:23px}
@media (min-width:960px){
  #viewHome .ubody.ucols{column-count:2;column-gap:16px}
  #viewHome .ubody.ucols3{column-count:3;column-gap:14px}
  #viewHome .ubody.ucols .uitem,#viewHome .ubody.ucols3 .uitem{break-inside:avoid}
}

/* —— 模块一览：8 个模块一张小卡，逾期 / 今天 / 本周 三个数字 + 完成率条 —— */
#viewHome .ovlegend{font-size:11px;color:var(--ink3)}
#viewHome .ovgrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px}
#viewHome .ovcell{display:block;width:100%;text-align:left;font:inherit;cursor:pointer;
  border:1px solid var(--line2);background:#fff;border-radius:10px;padding:9px 10px;transition:.14s}
#viewHome .ovcell:hover{border-color:var(--primary);background:var(--card2)}
#viewHome .ovcell .ovtop{display:flex;align-items:center;gap:6px;margin-bottom:7px}
#viewHome .ovcell .ovdot{width:8px;height:8px;border-radius:50%;flex:0 0 8px}
#viewHome .ovcell .ovname{flex:1 1 auto;min-width:0;font-size:12.5px;font-weight:500;color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#viewHome .ovnums{display:flex;gap:5px;margin-bottom:7px}
#viewHome .ovn{flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px;
  background:var(--card2);border-radius:7px;padding:5px 2px}
#viewHome .ovn b{font-size:15px;font-weight:500;line-height:1.1;color:#B4B2A9;
  font-variant-numeric:tabular-nums}
#viewHome .ovn i{font-style:normal;font-size:10px;color:var(--ink3);white-space:nowrap}
#viewHome .ovn.od{background:#F6E9E5}
#viewHome .ovn.od b{color:#A5654F}
#viewHome .ovn.td{background:#F7EFE2}
#viewHome .ovn.td b{color:#8A6A3E}
#viewHome .ovn.on b{font-weight:600}
#viewHome .ovcell .ovbar{display:block;height:4px;border-radius:4px;background:var(--bg2);overflow:hidden}
#viewHome .ovcell .ovbar > i{display:block;height:100%;border-radius:4px;transition:.2s}
#viewHome .ovcell .ovsub{display:block;margin-top:5px;font-size:10.5px;color:var(--ink3)}
#viewHome .ovcell .ovnone{display:block;padding:6px 0 3px;font-size:11px;color:var(--ink3)}
#viewHome .ovcell.ovempty .ovname{color:var(--ink2)}
@media (max-width:960px){
  #viewHome .ovgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  #viewHome .ovcell{padding:8px 9px}
  #viewHome .ovcell .ovname{font-size:12px}
  #viewHome .ovn b{font-size:14px}
  #viewHome .ovn{padding:4px 1px}
}
@media (max-width:360px){#viewHome .ovgrid{grid-template-columns:minmax(0,1fr)}}

/* —— 打卡日历（迭代 45）：8 个模块各一行，7 格 = 最近 7 天 / 7 周 ——
   一格里只能放一个状态，所以「全完成 = 对号、做了一部分 = 半对号、一条没做 = 叉」；
   还没到的日子只画空心点，绝不画叉。 */
#viewHome .chkgrid{display:flex;flex-direction:column;gap:2px}
#viewHome .ckrow{
  display:grid;grid-template-columns:92px repeat(7,minmax(0,1fr)) 62px;
  align-items:center;gap:6px;padding:5px 6px;border-radius:9px;cursor:pointer;
  transition:background .14s;
}
#viewHome .ckrow:hover{background:var(--card2)}
#viewHome .ckrow-head{padding:0 6px 4px;cursor:default}
#viewHome .ckrow-head:hover{background:transparent}
#viewHome .ckname{display:flex;align-items:center;gap:6px;min-width:0}
#viewHome .ckdot{width:8px;height:8px;border-radius:50%;flex:0 0 8px}
#viewHome .ckname b{
  font-size:12.5px;font-weight:500;color:var(--ink);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;
}
#viewHome .ckrow.empty .ckname b{color:var(--ink3);font-weight:400}

#viewHome .ckhd{
  font-size:10px;color:var(--ink3);text-align:center;line-height:1.2;
  display:flex;flex-direction:column;gap:1px;white-space:nowrap;
}
#viewHome .ckhd b{font-size:10.5px;font-weight:600;color:var(--ink2)}
#viewHome .ckhd.on b{color:var(--primary-d)}
#viewHome .ckhd.on{color:var(--primary-d)}

/* 格子 */
#viewHome .ck{
  height:26px;border-radius:7px;display:flex;align-items:center;justify-content:center;
  border:1px solid transparent;position:relative;transition:transform .12s;
}
#viewHome .ck svg{width:13px;height:13px;display:block}
#viewHome .ck.done{background:var(--ok-l);border-color:#D5E3D0}
#viewHome .ck.done svg{stroke:#6F8A68}
#viewHome .ck.part{background:#FBF3E4;border-color:#EFE0C4}
#viewHome .ck.part svg{stroke:#B08A3E}
#viewHome .ck.miss{background:var(--danger-l);border-color:#EDD6CF}
#viewHome .ck.miss svg{stroke:#B2725F}
#viewHome .ck.planned{background:transparent;border:1px dashed #DDD6CC}
#viewHome .ck.planned svg{stroke:#C9C1B6}
#viewHome .ck.none{background:#F4F1ED;border-color:#EDE8E2}
#viewHome .ck.none svg{stroke:#D3CCC3}
#viewHome .ck.today{box-shadow:0 0 0 1.5px var(--primary) inset}
#viewHome .ckrow:hover .ck{cursor:pointer}
#viewHome .ck:hover{transform:scale(1.06)}
#viewHome .ck.on{box-shadow:0 0 0 2px var(--primary) inset;transform:scale(1.06)}

/* 行尾小字：这一格做了几件 */
#viewHome .cksum{font-size:10.5px;color:var(--ink3);text-align:right;white-space:nowrap;
  font-variant-numeric:tabular-nums}
#viewHome .cksum b{color:var(--ink2);font-weight:600}
#viewHome .cksum .all{color:#6F8A68}
#viewHome .cksum .non{color:#B2725F}
#viewHome .ckrow-head .cksum{font-weight:500}

#viewHome .chklegend{display:flex;flex-wrap:wrap;gap:14px;margin-top:12px;padding-top:10px;
  border-top:1px solid var(--line2);font-size:11px;color:var(--ink3);align-items:center}
#viewHome .chkl{display:inline-flex;align-items:center;gap:5px}
#viewHome .chkl .ck{width:16px;height:16px;border-radius:4px;flex:0 0 16px}
#viewHome .chkl .ck svg{width:9px;height:9px}
#viewHome .chkl-hint{margin-left:auto;color:var(--ink3)}

/* 点开的明细 */
#viewHome .chkdetail{margin:6px 0 4px;padding:10px 12px;background:var(--card2);
  border:1px solid var(--line2);border-radius:10px}
#viewHome .chkdetail .dh{font-size:12px;color:var(--ink2);margin-bottom:7px;display:flex;align-items:center;gap:8px}
#viewHome .chkdetail .dh b{color:var(--ink);font-weight:600}
#viewHome .chkdetail .dh .dx{margin-left:auto;border:0;background:transparent;cursor:pointer;
  color:var(--ink3);font-size:11.5px;padding:2px 4px}
#viewHome .chkdetail .di{display:flex;align-items:center;gap:7px;font-size:12.5px;
  padding:3px 0;color:var(--ink2)}
#viewHome .chkdetail .di svg{width:12px;height:12px;flex:0 0 12px}
#viewHome .chkdetail .di.done{color:var(--ink3)}
#viewHome .chkdetail .di.done .t{text-decoration:line-through}
#viewHome .chkdetail .di .t{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#viewHome .chkdetail .di .n{font-size:11px;color:var(--ink3);white-space:nowrap}
#viewHome .chkdetail .dempty{font-size:12px;color:var(--ink3)}

@media (max-width:960px){
  #viewHome .ckrow{grid-template-columns:64px repeat(7,minmax(0,1fr)) 46px;gap:4px;padding:4px}
  #viewHome .ckname b{font-size:11.5px}
  #viewHome .ck{height:24px;border-radius:6px}
  #viewHome .ck svg{width:12px;height:12px}
  #viewHome .ckhd{font-size:9px}
  #viewHome .ckhd b{font-size:9.5px}
  #viewHome .cksum{font-size:9.5px}
  #viewHome .chklegend{gap:10px;font-size:10.5px}
  #viewHome .chkl-hint{margin-left:0;width:100%}
}

/* —— 任务清单：虚拟行（定期任务未落地）—— */
#viewHome .titem.virtual{background:transparent;border:1px dashed var(--line)}
#viewHome .titem.virtual:hover{background:#fff;border-color:var(--primary);border-style:solid}
#viewHome .titem.virtual .tt{color:var(--ink2)}

/* —— 子模块：展开后的两段（目标 / 任务），能并排就并排，窄了就自动叠起来 ——
   段内行高与间距压到最小，尽量一眼看完，不用上下滑 */
#viewModule .subsecs{margin-top:8px;display:grid;grid-template-columns:repeat(auto-fit,minmax(206px,1fr));gap:7px 10px}
#viewModule .subsecs .subsec{margin-top:0;padding-top:0;border-top:0;min-width:0}
#viewModule .subsecs .sublist{gap:3px}
#viewModule .subsecs .subsec .sh{margin-bottom:4px;gap:6px}
#viewModule .subsecs .subsec .sh b{font-size:12px}
#viewModule .subsecs .mini-add{padding:3px 9px;font-size:11.5px;min-height:24px}
#viewModule .subsecs .gp-empty{font-size:11.5px;padding:2px 0}
/* 段内目标行：细一号 */
#viewModule .subsecs .goalitem{padding:4px 8px;min-height:30px;gap:7px;border-radius:8px}
#viewModule .subsecs .goalitem .gt{font-size:12.5px}
#viewModule .subsecs .goalitem .chip{font-size:10px;padding:0 6px;border-radius:5px}
/* 段内任务行：细一号（比主任务栏更紧凑） */
#viewModule .subsecs .trow{padding:4px 7px;min-height:30px;gap:6px;border-radius:8px}
#viewModule .subsecs .trow .tt{font-size:12.5px}
#viewModule .subsecs .trow .d{font-size:11px}
#viewModule .subsecs .trow .tag{font-size:10px;padding:0 6px;border-radius:5px}
#viewModule .subsecs .trow .tag.rep{max-width:118px}
#viewModule .subsecs .trow .ck{width:17px;height:17px;flex:0 0 17px;border-radius:5px}
#viewModule .subsecs .trow .switch{width:28px;height:17px;flex:0 0 28px}
#viewModule .subsecs .trow .switch:after{width:13px;height:13px;top:2px;left:2px}
#viewModule .subsecs .trow .switch.on:after{transform:translateX(11px)}
#viewModule .subsecs .trow .icon-btn{width:22px;height:22px;border-radius:6px}
#viewModule .subsecs .trow .btn.sm{padding:2px 8px;font-size:11px;min-height:24px}
@media (max-width:860px){
  #viewModule .subsecs{grid-template-columns:1fr;gap:0}
  #viewModule .subsecs .subsec+.subsec{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line2)}
}
@media (max-width:640px){
  #viewHome .grid-top{grid-template-columns:1fr;gap:10px}
  #viewHome .hero-date .d2{font-size:17px}
}

/* ============ 定期任务：重复方式 ============ */
.rp{display:flex;flex-direction:column;gap:6px;padding:7px;border:1px solid var(--line2);
  border-radius:var(--r-sm);background:var(--card2)}
.rp .seg.tiny{align-self:flex-start;padding:2px;border-radius:9px}
.rp .seg.tiny button{padding:4px 12px;font-size:12.5px;min-height:26px;border-radius:7px}
.wdays{display:flex;gap:5px;flex-wrap:wrap}
.wdays button{min-width:34px;height:27px;border:1px solid var(--line);background:#fff;border-radius:7px;
  font-size:12px;color:var(--ink2);cursor:pointer;transition:.16s}
.wdays button:hover{border-color:var(--primary)}
.wdays button.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
.ivl{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--ink2)}
.ivl input{width:66px;padding:6px 8px;border:1px solid var(--line);border-radius:7px;font-size:13.5px;
  background:#fff;color:var(--ink);text-align:center;box-sizing:border-box;min-height:34px}
#cIvlHint{margin:6px 0 0}
.mdpick{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--ink2)}
.mdpick input{width:72px;padding:6px 8px;border:1px solid var(--line);border-radius:7px;font-size:13.5px;
  background:#fff;color:var(--ink);text-align:center;box-sizing:border-box;min-height:34px}
.mdpick[hidden]{display:none}
#tDlWrap{margin-bottom:14px}
#tDlWrap[hidden]{display:none}
#tDlWrap .rp{padding:0;border:0;background:none}
#tDlHint{margin:6px 0 0}
.wdays[hidden]{display:none}
.seg.tiny[hidden]{display:none}
/* 资产条目：金额币种开关（只有三个美元类目显示）。
   .rp 自带 display:flex，会把 hidden 顶掉，所以必须自己再写一条 [hidden]。 */
#aCurWrap{margin:0 0 14px}
#aCurWrap[hidden]{display:none}
#aCurWrap .plabel{font-size:12.5px;color:var(--ink2)}

/* ============ 财富资产工作台 ============ */
#viewWealth .card.modhead{padding:13px 16px}
#viewWealth .card+.card{margin-top:12px}

/* 1) 资产看板 */
.wboard{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px}
.wstat{background:var(--card2);border:1px solid var(--line2);border-radius:var(--r-sm);padding:12px 13px;
  display:flex;flex-direction:column;gap:3px;min-height:84px}
.wstat .wl{font-size:11.5px;color:var(--ink3);display:flex;align-items:center;gap:5px}
.wstat .wv{font-size:19px;font-weight:700;letter-spacing:-.2px;line-height:1.15;
  font-variant-numeric:tabular-nums;word-break:break-all}
.wstat .wv.hero{color:#A98F55}
.wstat .wd{font-size:11px;color:var(--ink3);line-height:1.35}
.wstat .wd b{color:var(--ink2);font-weight:600}
.wstat.behind .wv{color:var(--danger)}
.wstat.ahead .wv{color:var(--ok)}
.wbar{height:6px;border-radius:999px;background:#EDE7DF;overflow:hidden;margin-top:5px}
.wbar>i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#D8C79A,#A98F55);width:0%}
.wbar.done>i{background:linear-gradient(90deg,#A6C09B,#7D9A75)}

/* 2) 资产进度图 */
.wchart{width:100%;overflow:hidden;border-radius:10px}
.wchart svg{display:block;width:100%;height:auto;min-height:180px;touch-action:manipulation}
.wchart .wpt{cursor:pointer}
.wchart .wpt:hover,.wchart .wpt.sel{fill:rgba(140,154,147,.14)}
.wlegend{display:flex;flex-wrap:wrap;gap:14px;margin-top:10px;font-size:11.5px;color:var(--ink2)}
.wlegend span{display:inline-flex;align-items:center;gap:6px}
.wlegend i{width:16px;height:0;border-top-width:2px;border-top-style:solid;display:inline-block}
.wlegend i.area{height:9px;width:14px;border:0;border-radius:3px;background:rgba(198,177,131,.28)}
.wlegend i.ms{width:8px;height:8px;border-radius:50%;border:0;background:#fff;
  box-shadow:inset 0 0 0 2px #A98F55;display:inline-block}
/* 计划概要：把「计划线」用一句人话讲清楚 + 里程碑节点 */
.wplan{margin-top:10px;padding:10px 12px;border:1px dashed var(--line2);border-radius:var(--r-sm);
  font-size:12px;color:var(--ink2);line-height:1.6}
.wplan .wp-line{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px}
.wplan .wp-line b{color:#A98F55;font-weight:700;font-variant-numeric:tabular-nums}
.wplan .wp-k{color:var(--ink3)}
.wplan .wp-ms{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.wplan .wms{display:inline-flex;align-items:baseline;gap:5px;padding:3px 9px;border-radius:999px;
  background:var(--card2);border:1px solid var(--line2);font-size:11.5px;color:var(--ink2);white-space:nowrap}
.wplan .wms em{font-style:normal;color:var(--ink3);font-size:11px}
.wplan .wms b{color:#A98F55;font-variant-numeric:tabular-nums}
.wplan .wms.final{border-color:#C39B93;background:rgba(195,155,147,.12)}
.wplan .wms.final b{color:#B07F73}
.wplan .wms.done{border-color:#A6C09B;background:rgba(166,192,155,.16);color:#7D9A75}
.wplan .wms.done b{color:#6E8C66}
.wchartTip{font-size:11.5px;color:var(--ink3);margin-top:8px;line-height:1.5}

/* 月份详情面板（点图表里任意一个月展开） */
.wmonth{margin-top:12px;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.wmonth .wm-head{display:flex;align-items:center;gap:8px;padding:9px 12px;background:var(--card2);
  border-bottom:1px solid var(--line2);flex-wrap:wrap}
.wmonth .wm-head b{font-size:13.5px}
.wmonth .wm-head .spacer{flex:1}
.wmonth .wm-body{padding:10px 12px}
.wmonth .wm-num{font-size:12px;color:var(--ink2)}
.wmonth .wm-num b{font-size:14px;color:var(--ink)}

/* 3) 资产信息 */
.wmpick{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink3)}
.wmpick select{padding:5px 9px;border:1px solid var(--line);border-radius:8px;background:#fff;
  font-size:13px;color:var(--ink);min-height:34px;max-width:150px}
/* 任意年月跳转面板（月份下拉末尾「↗ 选择其它月份…」展开它）：年份前后翻 + 12 个月格，
   想补录几年前的账、或提前规划明年的额度，从这里直达 */
.wjump{margin-bottom:12px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--card2);padding:10px 12px}
.wjump[hidden]{display:none}
.wjump .wj-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.wjump .wj-nav{width:28px;height:28px;flex:none;border:1px solid var(--line);border-radius:8px;
  background:#fff;color:var(--ink2);font-size:15px;line-height:1;cursor:pointer;padding:0}
.wjump .wj-nav:hover{border-color:var(--primary);color:var(--ink)}
.wjump .wj-yr{font-size:14px;font-variant-numeric:tabular-nums;min-width:70px;text-align:center}
.wjump .wj-hint{font-size:11.5px;color:var(--ink3)}
.wjump .wj-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:6px;margin-top:10px}
.wjump .wj-m{position:relative;padding:9px 0 12px;border:1px solid var(--line);border-radius:8px;
  background:#fff;font-size:12.5px;color:var(--ink2);cursor:pointer;
  font-variant-numeric:tabular-nums}
.wjump .wj-m:hover{border-color:var(--primary);color:var(--ink)}
.wjump .wj-m.has{color:var(--ink);font-weight:600}
.wjump .wj-m.now{border-color:var(--primary)}
.wjump .wj-m.on{background:var(--primary-d);border-color:var(--primary-d);color:#fff}
.wjump .wj-m>i{position:absolute;left:50%;bottom:4px;width:4px;height:4px;margin-left:-2px;
  border-radius:50%;background:currentColor;opacity:.5}
.wjump .wj-x{border:0;background:none;color:var(--ink3);font-size:14px;line-height:1;
  cursor:pointer;padding:4px 6px;display:inline-flex;align-items:center}
/* 四大类配置概览（货币类 / 固收类 / 权益类 / 另类资产） */
.walloc{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px;margin-bottom:12px}
.walloc[hidden]{display:none}
.wac{background:var(--card2);border:1px solid var(--line2);border-radius:var(--r-sm);
  padding:9px 11px;display:flex;flex-direction:column;gap:2px;min-width:0}
.wac .wa-k{font-size:11.5px;color:var(--ink3);display:flex;align-items:center;gap:5px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wac .wa-k i{width:7px;height:7px;border-radius:50%;flex:none}
.wac .wa-v{font-size:15px;font-weight:700;letter-spacing:-.2px;font-variant-numeric:tabular-nums;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wac .wa-p{font-size:11px;color:var(--ink3);font-variant-numeric:tabular-nums}
.wac .wa-bar{height:4px;border-radius:999px;background:#EDE7DF;overflow:hidden;margin-top:3px}
.wac .wa-bar>i{display:block;height:100%;border-radius:999px;width:0%}
.wac.empty{opacity:.5}
.wassets{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px}
/* 资产配比表（迭代 42）：表头 / 目标 / 实际 三行六列 —— 第一列是行标签，其余五格是槽位。
   窄版（.wt-narrow）由 CSS 在手机上顶上来，两份 DOM 是同一份数据生成的 */
.wtgt{margin-top:14px;padding-top:12px;border-top:1px solid var(--line2)}
.wtgt[hidden]{display:none}
.wtgt .wt-top{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-bottom:8px}
.wtgt .wt-title{font-size:13px}
.wtgt .wt-hint{font-size:11.5px;color:var(--ink3);line-height:1.5}
.wtgt .wt-hint-narrow{display:none}
.wt-wide{display:grid;grid-template-columns:50px repeat(5,minmax(0,1fr));
  border:1px solid var(--line2);border-radius:var(--r-sm);overflow:hidden;background:#fff}
.wt-wide .wt-c,.wt-wide .wt-lab{padding:9px 6px;text-align:center;min-width:0}
.wt-wide .wt-lab{font-size:11.5px;color:var(--ink3);background:var(--card2);
  display:flex;align-items:center;justify-content:center}
.wt-wide .wt-hc{font-size:11.5px;color:var(--ink3);background:var(--card2);
  border-bottom:1px solid var(--line2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wt-wide .wt-tc,.wt-wide .wt-ac{border-top:1px solid var(--line2)}
.wt-c{display:flex;align-items:baseline;justify-content:center;gap:1px}
.wt-in{width:100%;max-width:62px;padding:5px 4px;border:1px solid var(--line2);border-radius:7px;
  background:var(--card2);color:var(--ink);font:inherit;font-size:13.5px;font-weight:600;text-align:center;
  font-variant-numeric:tabular-nums}
.wt-in:focus{outline:none;border-color:var(--primary);background:#fff}
.wtgt .wt-c em,.wtgt .wt-n em{font-style:normal;font-size:11px;color:var(--ink3);flex:none}
.wt-ac b,.wt-na b{font-size:14px;font-weight:700;font-variant-numeric:tabular-nums}
.wt-d{font-style:normal;font-size:10.5px;color:var(--ink3);font-variant-numeric:tabular-nums;white-space:nowrap}
.wt-d.near{color:#A98F55}
.wt-d.far{color:#BC7B6C}
/* 金额（迭代 44）：比例后面的折算金额，万元口径弱化小字 */
.wt-m{font-style:normal;font-size:10.5px;color:var(--ink3);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.wt-foot{display:flex;align-items:baseline;gap:6px 12px;flex-wrap:wrap;margin-top:8px;
  font-size:11.5px;color:var(--ink3);line-height:1.5}
.wt-foot .wt-sumv{color:var(--ink2);font-variant-numeric:tabular-nums}
.wt-foot .wt-sumv.warn{color:#A98F55;font-weight:600}
.wt-narrow{display:none}
.wgroup{border:1px solid var(--line2);border-radius:var(--r-sm);overflow:hidden;background:#fff}
.wgroup>.wg-head{display:flex;align-items:center;gap:8px;padding:9px 12px;background:var(--card2);
  border-bottom:1px solid var(--line2)}
.wgroup>.wg-head b{font-size:13px}
.wgroup>.wg-head .cnt{font-size:11.5px;color:var(--ink3);font-weight:400}
.wgroup>.wg-head .spacer{flex:1}
.wgroup>.wg-head .wg-sum{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums}
.wg-body{padding:4px 0}
.wcat{padding:6px 12px 2px}
.wcat .wc-head{display:flex;align-items:baseline;gap:8px;font-size:12px;color:var(--ink3)}
.wcat .wc-head .spacer{flex:1}
.wcat .wc-head .wc-sum{font-size:12.5px;color:var(--ink2);font-variant-numeric:tabular-nums}
.wrow{display:flex;align-items:center;gap:8px;padding:6px 12px;border-radius:8px}
.wrow:hover{background:var(--card2)}
.wrow .wn{flex:1;min-width:0;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wrow .wv{font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.wrow .wsub{font-size:11px;color:var(--ink3);white-space:nowrap}
.wrow .wa{display:flex;gap:2px;opacity:0;transition:.15s}
.wrow:hover .wa{opacity:1}
@media (hover:none){.wrow .wa{opacity:1}}
.wrow .icon-btn{width:28px;height:28px}
.wempty{padding:18px 12px;text-align:center;color:var(--ink3);font-size:13px}
.wprevbox{margin-top:4px;padding:9px 11px;border-radius:9px;background:var(--card2);
  border:1px solid var(--line2);font-size:12.5px;color:var(--ink2)}
.wprevbox b{font-size:14px;color:#A98F55;font-variant-numeric:tabular-nums}
/* 参数弹窗里的「计划起点」小盒：显示当前起点 + 两个改法按钮 */
.wbasebox{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;padding:9px 11px;border-radius:9px;
  background:var(--card2);border:1px solid var(--line2);font-size:12.5px;color:var(--ink2)}
.wbasebox b{font-size:13.5px;color:#A98F55;font-variant-numeric:tabular-nums}
.wbasebox .btn{margin-left:auto}
.wbasebox .btn+.btn{margin-left:0}

@media (max-width:1100px){
  .wboard{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:768px){
  .wboard{grid-template-columns:repeat(2,minmax(0,1fr))}
  .walloc{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .wac .wa-v{font-size:14px}
  .wassets{grid-template-columns:minmax(0,1fr)}
  /* 资产配比表：六列在手机上挤成一条线，换成竖排槽位卡（名称 / 目标 / 实际） */
  .wt-wide{display:none}
  .wt-narrow{display:block;border:1px solid var(--line2);border-radius:var(--r-sm);
    overflow:hidden;background:#fff}
  .wtgt .wt-hint-wide{display:none}
  .wtgt .wt-hint-narrow{display:inline}
  .wt-n{display:grid;grid-template-columns:minmax(58px,auto) minmax(0,1fr) minmax(0,1fr);
    align-items:center;gap:8px;padding:7px 10px}
  .wt-n+.wt-n{border-top:1px solid var(--line2)}
  .wt-nk{font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .wt-n .wt-nt,.wt-n .wt-na{display:flex;align-items:baseline;justify-content:flex-end;
    gap:3px;min-width:0}
  .wt-n .wt-in{max-width:56px}
  .wstat .wv{font-size:17px}
  .wrow .wa{opacity:1}
  .wrow{padding:8px 12px}
  .wrow .icon-btn{width:34px;height:34px}
  .wcat .mini-add{min-height:32px;padding:6px 12px}
  #viewWealth .card-head{gap:8px}
  #btnAddAsset,#btnWset,#btnWealthCopy{min-height:38px}
  .ptip{font-size:12px;padding:9px 11px;margin-top:10px}
  .ptip a.ptip-btn,.ptip button.ptip-btn{min-height:44px;padding:9px 14px;font-size:13px}
  .ver{font-size:10.5px}
  .reload{width:34px;height:34px}
}
@media (max-width:420px){
  .wboard{grid-template-columns:minmax(0,1fr)}
}

/* ============ 登录 ============ */
.login{
  position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;
  padding:24px;background:
    radial-gradient(circle at 15% 10%, #F0EAE1 0%, transparent 45%),
    radial-gradient(circle at 85% 90%, #EAE7E1 0%, transparent 45%),
    var(--bg);
}
.login-card{
  width:100%;max-width:360px;background:var(--card);border:1px solid var(--line);
  border-radius:20px;padding:30px 26px 24px;box-shadow:var(--sh-hi);text-align:center;
}
.login-mark{
  width:54px;height:54px;border-radius:16px;margin:0 auto 14px;
  background:linear-gradient(145deg,#93A199 0%,#74857C 100%);
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 8px 22px rgba(116,133,124,.28);
}
.login-mark svg{width:27px;height:27px}
.login-card h1{font-size:20px;font-weight:700;letter-spacing:.01em}
.login-sub{font-size:12.5px;color:var(--ink3);margin-top:4px;letter-spacing:.12em;text-transform:uppercase}
.login-label{display:block;text-align:left;font-size:12.5px;color:var(--ink2);margin:22px 0 6px}
.login-input{
  width:100%;height:46px;padding:0 14px;font-size:16px;
  border:1px solid var(--line);border-radius:11px;background:var(--card2);
  color:var(--ink);outline:none;transition:border-color .16s,background .16s;
}
.login-input:focus{border-color:#CFC5B8;background:#fff}
.login-btn{
  width:100%;height:46px;margin-top:14px;border:0;border-radius:11px;cursor:pointer;
  background:var(--primary-d);color:#fff;font-size:15px;font-weight:600;
  transition:background .16s,opacity .16s;
}
.login-btn:hover{background:#65766E}
.login-btn:disabled{opacity:.6;cursor:default}
.login-err{font-size:12.5px;color:var(--danger);margin-top:10px}
.login-note{font-size:11.5px;color:var(--ink3);margin-top:16px;line-height:1.6}
