/* laogu 设计令牌 + 基础样式 —— v0.6 现代精简版
   原则：主干信息大而清楚，次要信息收进 pill/备注折叠；留白多、层次浅、圆角柔。 */
:root {
  --pv-card-r: 10px;   /* 灰底上的白卡统一圆角（用户 2026-11-04：原来 14 / 16 太圆）；所有白卡片都用它，要调只改这里 */
  /* 左上角 logo 字体：优先用苹果系统自带的「华文圆体」（Yuanti SC，Mac/iPhone/iPad 本机就有，
     不用下载/嵌入字体文件，也没有版权问题）；非苹果设备退回站酷快乐体、再退回系统黑体 */
  --title-font: "Yuanti SC", "STYuanti-SC", "华文圆体", "ZCOOL KuaiLe", "PingFang SC",
    "HarmonyOS Sans SC", "Microsoft YaHei UI", "Microsoft YaHei", system-ui, -apple-system, sans-serif;
  --pv-primary: #E8960C;
  --pv-primary-dark: #C97D07;
  --pv-primary-soft: #FBEED2;
  /* 品牌黄的固定副本：给「不该跟着容器换主题」的东西用（左栏选中态）。主人手记把 --pv-primary* 换成了海军蓝，
     但左栏那一列全站要长一样（用户 2026-09-12：那里也用黄） */
  --pv-brand-soft: #FBEED2;
  --pv-brand-dark: #C97D07;
  --pv-brand: #E8960C;
  --pv-accent: #F59E0B;          /* 里程碑/高亮 */
  --pv-accent-soft: #FEF3E2;
  --pv-brand-glow: rgba(232, 150, 12, .2);      /* 主色的柔光（选中的卡片、今天那格的投影） */
  /* 左上角那块门牌的三档底色（黄色主题是搪瓷红，另外两套跟着主色走） */
  --pv-plate-1: #A63E31; --pv-plate-2: #8C2F26; --pv-plate-3: #6E2119; --pv-plate-h1: #B34637; --pv-plate-h2: #99342A; --pv-plate-h3: #7A2620;
  --pv-unread: #EF6C4D;          /* 未读红点 / 未读数胶囊 */
  /* 全站基础底色。想换回原来的中性灰，把下面这行改回 #f6f6f9 即可（全站 60+ 处
     都引用这一个 token，改这一行就够，不用满仓库找）。
     选的是低饱和冷蓝：主色是暖橙(var(--pv-primary))，蓝橙互为补色，底色一旦饱和就会跟主色
     打架、卡片也压不住；这个明度把白卡片顶起来，橙色反而更跳。 */
  --pv-bg: #f6f6f9;
  /* 页面大底。跟 --pv-bg 分开是有原因的：--pv-bg 全站 60+ 处当"浅填充"用
     （进度条底槽、hover 态、chip 背景），把它本身改成白，那些填充就全看不见了。
     所以只把大底单拎出来。想换回灰底：把下面这行改成 var(--pv-bg)。 */
  --pv-page-bg: #ffffff;
  --pv-surface: #ffffff;
  --pv-border: #e8e9f0;
  --pv-text: #191b23;
  --pv-text-soft: #676c7e;
  --pv-text-faint: #9ca1b3;
  --pv-danger: #e5252d;        /* 正红（用户 2026-09-10：不要 #ef4444 那种偏橘的珊瑚红） */
  --pv-success: #16a34a;
  --pv-warning: #f59e0b;
  --pv-info: #2563eb;
  /* 语义色的浅底/描边/文字三件套——pill/徽章统一从这取，不再各写各的十六进制 */
  --pv-success-soft: #e5f5e6;
  --pv-success-border: #bfe4c4;
  --pv-success-text: #1f7a2d;
  --pv-warning-soft: #fdf3d9;
  --pv-warning-border: #f3e2b3;
  --pv-warning-text: #b07908;
  --pv-danger-soft: #fde9e9;
  --pv-danger-border: #f3c8c8;
  --pv-danger-text: #c0151e;
  --pv-info-soft: #e8f0fe;
  --pv-info-border: #bcd3f7;
  --pv-info-text: #1d4ed8;
  /* 分类调色板：收支看板的堆叠柱 / 归因分段靠它区分类目（JS 运行时读这几个变量，
     组件里不再另写一份 hex）。暖色打头呼应主色，其余取自各模块既有配色，保证
     12 类之间色相拉得开。--pv-cat-other 是「其它」那一段的中性灰。 */
  /* 所有左侧竖排导航（文件夹页 / 其他清单 / 影视书籍 / 主人手记 / 项目管理「跳到」/ 股票「谁的账本」/ 后台）
     条目之间的间距只在这一处定 —— 原来各写各的（2px / 3px / 6px），同一个范式在不同页面松紧不一样
     （用户 2026-09-03）。 */
  --pv-nav-gap: 6px;
  --pv-cat-1:  var(--pv-brand);   /* 品牌橙黄（= --pv-primary） */
  --pv-cat-2:  #2A69B0;   /* 蓝（travel） */
  --pv-cat-3:  #1F7A45;   /* 绿（tips） */
  --pv-cat-4:  #AE3A55;   /* 玫红（gifts） */
  /* 总览上「这是什么事」的四种颜色（用户 2026-09-23）：颜色只标事，圈子和兴趣一律不上色。
     日期方块、种类小字、热力格、图例色点、「下次联系」的数字——只有这几处用它们。 */
  --pv-ev-plan: var(--pv-brand-dark);  --pv-ev-plan-soft: var(--pv-brand-soft);   /* 安排 */
  --pv-ev-fest: #AE3A55;  --pv-ev-fest-soft: #F8E6EA;   /* 节日 */
  --pv-ev-gift: #177268;  --pv-ev-gift-soft: #DFF0ED;   /* 礼品节点 */
  --pv-ev-bday: #4F7FD9;  --pv-ev-bday-soft: #E8EFFB;   /* 生日（2026-10-28 从深紫换成浅一点的蓝：用户嫌紫太扎眼） */
  --pv-cat-5:  #6B4BA8;   /* 紫（growth） */
  --pv-cat-6:  #EF6C4D;   /* 橙红（= --pv-unread） */
  --pv-cat-7:  #177268;   /* 青（finance） */
  --pv-cat-8:  #9A5B12;   /* 暖褐（diary_hub） */
  --pv-cat-9:  #5B6FB8;   /* 蓝紫（= --pv-mp-dinner） */
  --pv-cat-10: #B08A00;   /* 橄榄黄 */
  --pv-cat-11: #C2568A;   /* 粉紫 */
  --pv-cat-12: #3F7F8C;   /* 灰青 */
  --pv-cat-other: #D3D6E0;      /* 「其它」段 */
  --pv-cat-other-text: #565D73; /* 「其它」段上的字 */
  /* 饭菜计划的餐次圆点：早/午同色系深浅拉开，晚餐换冷色，一眼分得清三餐 */
  --pv-mp-breakfast: #F2A93B;
  --pv-mp-lunch: var(--pv-primary);
  --pv-mp-dinner: #5B6FB8;
  /* 页面左右固定留白。**只管左右**，上下从来不用它（三处引用都是左右位）——
     所以不用拆成两个变量，改这一个就是改左右。
     从 32px 收到 16px：这个站的主体是卡片、表格、清单，左右各让 32px 等于每屏
     少一列内容，而边距本身不承载任何信息。顶部「当前重点」条共用它，保证左右对齐。 */
  --pv-page-pad: 16px;
  /* 内容宽度上限：只留固定边距，其余全跟着屏幕走。
     原来卡在 1680px —— 3440 的屏上两边各空掉近 900px，而这个站的主体是卡片、
     表格、清单，它们是**越宽越好用**的东西（一行多摆两张卡，表格少横向滚一次）。
     当初设上限是怕正文一行拉到两三千像素没法读 —— 那个担心是对的，但它只对
     **正文**成立，所以改成在 .pv-md 上单独限一道（见下面「markdown 渲染」那节），
     而不是把整个页面一起勒住。
     真要收窄就改这一个数，页面、顶部重点条、项目管理三栏会一起跟上。 */
  --pv-page-max: none;
  /* 顶部「当前重点 + Highlights」那条的实际高度。由 app.js 实测后写进来 ——
     它会随 Highlights 换行而变，写死的话边栏和滚动让位迟早对不上。这里给个兜底值。 */
  --pv-topbar-h: 112px;
  --pv-radius: 14px;
  --pv-radius-sm: 10px;
  --pv-radius-btn: 9px;      /* 按钮 / 标签统一小圆角 */
  --pv-radius-pill: 999px;   /* 胶囊形状统一引用，别再各处裸写 999px */
  --pv-ctrl-h-sm: 38px;      /* small 尺寸控件统一高度——按钮/输入框/下拉/日期选择器同一排不再高矮不齐 */
  --pv-ctrl-h-sm-mobile: 42px;
  --pv-shadow: 0 1px 2px rgba(25, 27, 35, .04), 0 8px 24px rgba(25, 27, 35, .06);
  --pv-shadow-sm: 0 1px 2px rgba(25, 27, 35, .05);
  --pv-header-h: 56px;
  /* 间距刻度：新组件从这取值，别再随手挑一个像素数 */
  --pv-space-1: 4px;
  --pv-space-2: 8px;
  --pv-space-3: 12px;
  --pv-space-4: 16px;
  --pv-space-5: 24px;

  /* 首页模块色（两层信息架构）：浅底 oklch(0.94 0.035 H) / 文字 oklch(0.50 0.11 H) /
     展开描边 oklch(0.80 0.07 H)，跟主橙同一明度彩度体系，只换色相 H。 */
  --pv-mod-travel-soft:  #E1EEFB; --pv-mod-travel-text:  #2A69B0; --pv-mod-travel-line:  #BBD7F2; /* H250 */
  --pv-mod-tips-soft:    #DFF3E6; --pv-mod-tips-text:    #1F7A45; --pv-mod-tips-line:    #B7E0C4; /* H155 */
  --pv-mod-finance-soft: #DBF2F0; --pv-mod-finance-text: #177268; --pv-mod-finance-line: #AFDEDA; /* H190 */
  --pv-mod-gifts-soft:   #FBE6EA; --pv-mod-gifts-text:   #AE3A55; --pv-mod-gifts-line:   #F2C4CE; /* H10  */
  --pv-mod-growth-soft:  #EEE8FA; --pv-mod-growth-text:  #6B4BA8; --pv-mod-growth-line:  #D8CBF0; /* H300 育儿 */
  --pv-mod-family-soft:  #FBE8D3; --pv-mod-family-text:  #8A5600; --pv-mod-family-line:  #DBB68D; /* H70  */
  --pv-mod-conflict-soft: #FBE6E6; --pv-mod-conflict-text: #B33A3A; --pv-mod-conflict-line: #F2C4C4; /* H10  */
  --pv-mod-blank-soft:   #ECEDF2; --pv-mod-blank-text:   #565D73; --pv-mod-blank-line:   #D3D6E0; /* 中性 */
  --pv-mod-diary_hub-soft: #FBEEDD; --pv-mod-diary_hub-text: #9A5B12; --pv-mod-diary_hub-line: #EAD1A8; /* H35 暖褐，手记感 */
  --pv-mod-focus_projects-soft: #DFF0FA; --pv-mod-focus_projects-text: #1D6FA0; --pv-mod-focus_projects-line: #B9DEF2; /* H205 */
}

* { box-sizing: border-box; }
/* 不要给 html/body 写 height:100%，也不要给 body 写 overflow-x。
   overflow-x:hidden 会把 overflow-y 一并算成 auto，于是那个元素就成了滚动容器。
   root（html）的 overflow 会上抛给视口、它自己按 visible 处理，所以挡横向溢出只写 html 这一条就够；
   可 body 的 overflow 只在 root 是 visible 时才上抛 —— 这里 root 不是，body 就自己变成了滚动盒。
   它高度 auto、永远滚不动，但 .pv-sidebar 的 position:sticky 会认它当参照系，
   于是侧栏跟着页面一起滚走（右侧内容一长就能看见）。去掉 body 这条，sticky 重新认视口。 */
html { overflow-x: hidden; }
html, body { margin: 0; padding: 0; }
/* Element 的弹窗 / 抽屉打开时会给 body 挂 .el-popup-parent--hidden { overflow:hidden } 锁滚动。
   同一个原因（root 不是 visible），这一下又把 body 变成滚动盒、侧栏的 sticky 改认 body，
   页面本来滚到哪儿侧栏就跟着"滚上去"露出一截空白（用户 2026-09-08 截图，BUG-006）。
   改成 body 不锁、锁 html：视口一样不动，sticky 继续认视口。 */
body.el-popup-parent--hidden { overflow: visible !important; }
html:has(body.el-popup-parent--hidden) { overflow: hidden; }
/* 装到主屏幕全屏跑（PWA）时，顶上是刘海/灵动岛、底下是那条 home indicator。
   给这两处让出安全区，否则左边栏顶部和悬浮球会被压在下面点不到。
   浏览器里打开时 safe-area-inset-* 都是 0，不影响。 */
body {
  padding-top: env(safe-area-inset-top);
  padding-bottom: env(safe-area-inset-bottom);
}
@media (max-width: 640px) {
  .pv-ai-fab { bottom: calc(16px + env(safe-area-inset-bottom)); }
  .pv-devlog-fab { bottom: calc(78px + env(safe-area-inset-bottom)); }
}
/* 手机端全站小字放大（用户 2026-09-16：手机上字太小）。全站 13.5px 及以下的字号都写成
   calc(Npx + var(--pv-fz-add))、14–15px 写成 calc(Npx + var(--pv-fz-add2))，桌面端两个变量都是 0，
   手机端各加 2px / 1px —— 一处改，几百条规则一起动；以后新写的小字号也照这个写法。 */
:root { --pv-fz-add: 0px; --pv-fz-add2: 0px; }
@media (max-width: 640px) {
  :root { --pv-fz-add: 2px; --pv-fz-add2: 1px; }
  /* Element 自己的 14px 那几样也跟上 */
  .el-checkbox__label, .el-radio__label, .el-radio-button__inner, .el-select-dropdown__item,
  .el-tag, .el-table, .el-dropdown-menu__item, .el-message-box__content, .el-dialog__body { font-size: 15px; }
  .el-input--small .el-input__inner, .el-select--small .el-input__inner, .el-textarea__inner { font-size: 15px; }
}
body {
  background: var(--pv-page-bg);
  color: var(--pv-text);
  font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  font-size: 16px;
  -webkit-font-smoothing: antialiased;
}
#app { min-height: 100dvh; }
a { color: var(--pv-primary); text-decoration: none; }

/* Element-UI 主题微调 */
.el-button--primary { background: var(--pv-primary); border-color: var(--pv-primary); }
/* 单选分段（el-radio-button，状态 / 类型 / 优先级那种拼在一起的）选中态跟全站主色走，不用 Element 的蓝（用户 2026-09-20） */
.el-radio-button__orig-radio:checked + .el-radio-button__inner { background: var(--pv-primary); border-color: var(--pv-primary); box-shadow: -1px 0 0 0 var(--pv-primary); color: #fff; }
.el-radio-button__orig-radio:focus + .el-radio-button__inner { box-shadow: -1px 0 0 0 var(--pv-primary); }
.el-radio-button__inner:hover { color: var(--pv-primary-dark); }
/* 禁用态的分段（比如子项目的「范围」跟着上级走）：Element 默认是浅灰字浅灰底、根本看不清（用户 2026-09-21）——
   选中的用主色浅底 + 主色深字，没选中的浅灰字白底；只是不能点，不是看不见 */
.el-radio-button__orig-radio:disabled + .el-radio-button__inner { color: var(--pv-text-faint); background: var(--pv-surface); border-color: var(--pv-border); cursor: not-allowed; }
.el-radio-button__orig-radio:disabled:checked + .el-radio-button__inner { color: var(--pv-primary-dark); background: var(--pv-primary-soft); border-color: var(--pv-primary); box-shadow: -1px 0 0 0 var(--pv-primary); font-weight: 600; }
.el-button--primary:hover, .el-button--primary:focus {
  background: var(--pv-primary-dark); border-color: var(--pv-primary-dark);
}
.el-button--text { color: var(--pv-primary); }
.el-button, .el-tag { border-radius: var(--pv-radius-btn); }
.el-dialog { border-radius: var(--pv-radius); }
/* 弹窗永远装进视口（用户 2026-09-08，当前重点那张撑破了底边）：
   头 / 脚钉住，只有 body 在里面滚。以前是弹窗比屏高就让整层遮罩滚，看起来像"整页被拉动了"，
   而且第一眼弹窗就伸出屏幕底。--pv-dlg-top 是离顶距离，长弹窗把它调小，多出来的都给 body。 */
.el-dialog {
  --pv-dlg-top: 15vh;
  display: flex; flex-direction: column;
  max-height: calc(100dvh - var(--pv-dlg-top) - 24px); margin-bottom: 24px;
}
.el-dialog__header, .el-dialog__footer { flex-shrink: 0; }
.el-dialog__body { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.el-dialog.pv-focus-dialog { --pv-dlg-top: 4vh; margin-top: var(--pv-dlg-top) !important; }   /* 用户 2026-09-08：再靠上一点 */
.el-drawer { border-radius: var(--pv-radius) 0 0 var(--pv-radius); }
/* 老年友好：绝大多数按钮/标签用的是 small 尺寸，Element 默认字号偏小，这里统一放大一档 + 加大触控区域。
   按钮跟输入框/下拉/日期选择器共用同一个 --pv-ctrl-h-sm 显式高度——两边都用 padding 撑高度的话，
   字号/边框细微差异会让同一排看着高矮不齐，所以都改成"定高 + flex 居中"，不再各算各的。 */
.el-button { font-size: calc(15px + var(--pv-fz-add2, 0px)); }
.el-button--small, .el-button--small.is-round {
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); height: var(--pv-ctrl-h-sm); padding: 0 17px;
  box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
}
/* mini 按钮（评论 / 回复 / 采用 / 打卡 / 记下）：28 高 13 字，跟抽屉、弹窗底部的按钮一个尺码（用户 2026-09-20：确认类按钮统一） */
.el-button--mini, .el-button--mini.is-round { font-size: calc(13px + var(--pv-fz-add, 0px)); height: 28px; line-height: 26px; padding: 0 12px; box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; }
.el-tag { font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.el-tag--small { font-size: calc(13px + var(--pv-fz-add, 0px)); height: 25px; line-height: 23px; }
.el-tag--mini { font-size: calc(12.5px + var(--pv-fz-add, 0px)); height: 22px; line-height: 20px; }
.el-input__inner, .el-textarea__inner { font-size: calc(15px + var(--pv-fz-add2, 0px)); }
.el-input__inner, .el-select .el-input__inner { border-radius: var(--pv-radius-btn); }
.el-input--small .el-input__inner, .el-select--small .el-input__inner,
.el-date-editor--small.el-input .el-input__inner {
  height: var(--pv-ctrl-h-sm); line-height: var(--pv-ctrl-h-sm); box-sizing: border-box;
}
.el-select-dropdown__item, .el-dropdown-menu__item { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); }
.el-dialog__title { font-size: 18px; }
.el-message { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); }
/* 消息提示（用户 2026-10-05：淡黄 / 浅绿压在白页面上看不出来）：实底 + 白字 + 投影，一种一个颜色；待多久在 util.js 末尾。
   ===== 锁定 v1（用户 2026-10-12：「样式非常好，存好锁死」）——规范见 docs/TOAST_STYLE.md，要改先改文档，再改这里 ===== */
.el-message { min-width: 320px; padding: 13px 18px; border: 0; border-radius: 10px; box-shadow: 0 8px 28px rgba(20, 24, 40, .22); top: 24px; }
.el-message .el-message__content, .el-message .el-message__icon, .el-message .el-message__closeBtn, .el-message .pv-msg { color: #fff !important; }
/* .pv-msg：带链接的提示，正文是一段 VNode，Element 不给它套 .el-message__content——字要单独给，不然是默认的深色（BUG-062） */
.el-message .el-message__content, .el-message .pv-msg { font-weight: 600; line-height: 1.5; }
.el-message .el-message__icon { font-size: 18px; }
.el-message--success { background: #1F8A4C; }
.el-message--warning { background: #C2620A; }
.el-message--error { background: #C73535; }
.el-message--info { background: #2B3245; }
.el-message .el-message__closeBtn { opacity: .85; font-size: 15px; }
@media (max-width: 640px) { .el-message { min-width: 0; width: calc(100vw - 32px); } }
/* 提示里的链接（「去打卡那一块 ›」）：白字下划线，跟正文同号同粗，前面空一格；悬停不透明度降一点 */
.el-message .pv-msg-link { margin-left: 10px; color: #fff !important; text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; cursor: pointer; }
.el-message .pv-msg-link:hover { opacity: .85; }
@media (max-width: 640px) {
  /* 各处弹窗/抽屉写的是固定 px 宽度，手机屏幕装不下——统一按视口宽度收窄 */
  .el-dialog { --pv-dlg-top: 6vh; width: 92vw !important; margin-top: var(--pv-dlg-top) !important; }
  .el-drawer { width: 92vw !important; }
  /* 手机端是老人主要使用场景，按钮再放大一档，方便点按 */
  .el-button--small, .el-button--small.is-round { font-size: 15px; height: var(--pv-ctrl-h-sm-mobile); padding: 0 18px; }
  .el-button--mini, .el-button--mini.is-round { font-size: 14px; padding: 9px 15px; }
  .el-input--small .el-input__inner, .el-select--small .el-input__inner,
  .el-date-editor--small.el-input .el-input__inner { height: var(--pv-ctrl-h-sm-mobile); line-height: var(--pv-ctrl-h-sm-mobile); }
}

/* ---------- 布局：左侧 sidebar（经典布局）+ 主内容区 ---------- */
.pv-shell { display: flex; min-height: 100dvh; }
/* 宽度和内边距抽成变量：底部那个弹出菜单要按侧栏的宽度来算自己的宽度和居中量，
   两处各写一个数的话，哪天调了侧栏宽度，菜单就悄悄偏了。 */
.pv-shell { --pv-side-w: 222px; --pv-side-pad: 14px; }   /* 两列试过一天又改回单列（用户 2026-09-13） */
.pv-sidebar {
  width: var(--pv-side-w); flex: none;
  display: flex; flex-direction: column;
  background: rgba(255, 255, 255, .85);
  backdrop-filter: blur(10px);
  border-right: 1px solid var(--pv-border);
  padding: 18px var(--pv-side-pad);
  position: sticky; top: 0; overflow: hidden;   /* 滚动交给中间那段 */
  height: 100vh;
  height: 100dvh;      /* 手机浏览器地址栏收起/展开时 vh 不跟着变，dvh 才是真实可视高度 */
}
/* 品牌钉在顶、人名钉在底，只有中间的导航列表滚动 —— 空间一多，
   原来整条侧栏一起滚，自己的名字就被滚出视野了。
   nav 独占剩余高度（所以它前后不能再有别的 flex:1 元素，否则会平分）。 */
.pv-side-nav {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  /* 滚动条画在内容盒右边缘，而侧栏有 14px 右内边距 —— 不抵消的话滚动条会浮在
     菜单文字上、右边还空一条。负 margin 让 nav 撑到侧栏边缘，再用等量 padding
     把菜单项推回原位：滚动条贴边，内容位置不变。 */
  margin-right: -14px; padding-right: 14px;
}
.pv-brand {
  display: flex; align-items: center; gap: 9px; cursor: pointer;
  padding: 0 6px; margin-bottom: 22px; flex: none;
}
/* 品牌整块用一张锁定图（图标 + 手写「管家老顾」是一套设计，不拆开重排） */
.pv-brand-lockup { display: block; width: 100%; max-width: 182px; height: auto; }
.pv-side-nav { display: flex; flex-direction: column; gap: 2px; }
.pv-side-settings { flex: none; }   /* 底部这块永远钉住，不跟着导航滚 */
.pv-side-link {
  display: flex; align-items: center; gap: 11px;
  padding: 10px 12px; border-radius: var(--pv-radius-sm);
  color: var(--pv-text-soft); font-size: calc(15px + var(--pv-fz-add2, 0px)); cursor: pointer;
  transition: background .12s, color .12s;
}
.pv-side-link i { font-size: 17px; flex: none; width: 17px; text-align: center; }
.pv-side-link:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-side-link.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
/* 左侧导航「大项目」分组小标题 */
.pv-side-group {
  padding: 4px 12px 2px; margin-top: 10px;
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .4px;
  color: var(--pv-primary-dark); text-transform: none; user-select: none;
}
.pv-side-group:first-of-type { margin-top: 6px; }
.pv-side-emoji { flex: none; width: 17px; text-align: center; font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1; }
.pv-spacer { flex: 1; }

/* ---------- 细滚动条（.pv-scroll-slim）----------
   系统默认滚动条又粗又抢眼，接了鼠标的 Mac / Windows 上还是常驻的。这里做成
   6px 常态透明、鼠标移进容器才浮现；轨道全透明，所以它平时不占视觉位置。
   注意：滚动条画在**内容盒的右边缘**，想让它贴住容器最右边，容器自己就不能有
   右内边距 —— 见 .pv-side-nav 那个负 margin 的写法。 */
.pv-scroll-slim { scrollbar-width: thin; scrollbar-color: transparent transparent; }
.pv-scroll-slim:hover { scrollbar-color: rgba(25, 27, 35, .2) transparent; }
.pv-scroll-slim::-webkit-scrollbar { width: 6px; height: 6px; }
.pv-scroll-slim::-webkit-scrollbar-track { background: transparent; }
.pv-scroll-slim::-webkit-scrollbar-thumb { background: transparent; border-radius: 999px; }
.pv-scroll-slim:hover::-webkit-scrollbar-thumb { background: rgba(25, 27, 35, .2); }
.pv-scroll-slim::-webkit-scrollbar-thumb:hover { background: rgba(25, 27, 35, .34); }
.pv-side-user {
  display: flex; align-items: center; gap: 9px;
  padding: 10px 8px 4px; margin-top: 8px; flex: none;
  border-top: 1px solid var(--pv-border);
}
.pv-side-user-name {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); color: var(--pv-text);
}
.pv-side-logout { cursor: pointer; color: var(--pv-text-faint); font-size: 17px; padding: 4px; }
.pv-side-logout:hover { color: var(--pv-danger); }
.pv-avatar {
  width: 30px; height: 30px; border-radius: 50%; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  color: #fff; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600;
}
.pv-mobile-bar { display: none; }
.pv-main { flex: 1; min-width: 0; }
/* 左右留固定的一段白，宽度跟着屏幕走 —— 原来卡死 1200px 居中，屏幕一宽
   两侧就空出一大片，内容却挤在中间那一条里。 */
.pv-page { max-width: var(--pv-page-max); margin: 0 auto; padding: 24px var(--pv-page-pad) 60px; }
/* 单空间 folder 页正在直达空间：内容全部藏起来，别闪一屏文件夹页（加载态交给顶部进度条） */
.pv-page-opening { min-height: 120px; }

/* ---------- 空间主页：左边栏 + 一列内容（滚动导航，不换页） ---------- */
.pv-home-wrap.has-rail { display: flex; align-items: flex-start; gap: 20px; }
.pv-home-cols { flex: 1; min-width: 0; }
/* 滚到某个模块时，给顶部那条 sticky「当前重点」让出高度，否则标题正好被压在底下。
   交给 scroll-margin-top 而不是在 JS 里减像素——浏览器自己算，换了顶栏高度也不用改代码。 */
.pv-home-block { scroll-margin-top: calc(var(--pv-topbar-h) + 16px); }
/* 整页只有一个板块时，把板块自己那层卡片壳和标题去掉。
   典型现场：「中国海运」页面 —— 标题写着中国海运，下面一个白框，框里又写一遍
   「中国海运清单」，然后才是内容。两层嵌套什么信息也没多给。
   20 个空间里有 16 个是单板块，所以这不是给某一页开的特例。 */
.pv-home-cols.solo .pv-home-block > .pv-block {
  background: none; border: none; box-shadow: none; padding: 0; border-radius: 0;
}
.pv-home-cols.solo .pv-home-block > .pv-block > .pv-block-title { display: none; }
/* **外面那层也一起脱掉。** 上面只扒了里面那层，外面的 .pv-home-block 还是一张
   白卡片 —— 于是「假期安排」是「页面标题 + 横线 → 白框 → 内容」，那个白框
   什么也没多说，只是把内容往里挤了一圈（避免容器嵌套那条规矩）。
   只在单板块时这么做：多板块的页面靠这层卡片才分得出哪块是哪块。 */
.pv-home-cols.solo .pv-home-block {
  background: none; border: none; box-shadow: none;
  border-radius: 0; padding: 0; margin-bottom: 0;
}
/* 边栏钉在「当前重点」条下面（那条是 sticky top:0，高约 52px） */
.pv-home-rail {
  position: sticky; top: calc(var(--pv-topbar-h) + 12px); flex: none; width: 168px;
  /* 不再套白框（用户 2026-10-29：各模块页左栏「模块」那列要一个样）：跟财务状况 / 日记本一样，光板一列、右边一道竖线，顶上不留内边距 */
  background: none; border: 0; border-right: 1px solid var(--pv-border);
  border-radius: 0; padding: 0 16px 14px 0;
  max-height: calc(100dvh - var(--pv-topbar-h) - 32px); overflow-y: auto;
}
/* 左栏小标题（模块 / 清单 / 分类）不加粗、往左靠一点（用户 2026-09-03） */
.pv-home-rail-title {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; letter-spacing: .04em; color: var(--pv-text-faint);
  padding: 2px 4px 8px;
}
/* 小厨房页顶部的「粘进来识别」框（pv-kitchen-ai）。复用海运那套 .pv-ship-ai 外观，
   只补页面级该有的下边距和收起后的回执行。 */
.pv-kai { margin-bottom: 18px; }
.pv-kai-last {
  padding: 8px 14px 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-success-text);
  border-top: 1px solid var(--pv-border);
}

/* 模块导航只有文字，不带图标：一个空间里的块多半是同一类（小厨房那四块全是表视图），
   图标全落到同一个兜底字符，一列一模一样的 📄 纯属噪音。 */
.pv-home-rail-item {
  display: flex; align-items: center; gap: 8px; cursor: pointer;
  padding: 8px 10px; border-radius: var(--pv-radius-sm); margin-bottom: var(--pv-nav-gap);
  font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); transition: background .12s, color .12s;
}
.pv-home-rail-item:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-home-rail-item.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-home-rail-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ---------- 空间页（/s/<id>）：整页不滚，只有右边内容滚 ----------
   跟项目管理（.pv-work）和后台（.pv-page.pv-adm）同一套壳，不再各长各的。
   原来是整页一起滚：标题和左边那列「模块」跟着往上跑，滚两屏就完全看不见
   自己在哪一块；左栏虽然 sticky 钉着，可它钉的位置在标题**下面**，
   标题一走，两者的关系就散了。现在标题和左栏都固定，内容从横线底下流过去。 */
.pv-page.pv-sp {
  display: flex; flex-direction: column;
  height: calc(100dvh - var(--pv-topbar-h, 0px));
  padding-top: 24px; padding-bottom: 0; overflow: hidden;
}
/* 抽屉、弹窗这些不可见的尾巴也是 flex 子项，不钉死会跟着分高度 */
.pv-page.pv-sp > * { flex: none; }
.pv-page.pv-sp > .pv-sp-top {
  padding-bottom: 14px; border-bottom: 1px solid var(--pv-border);
}
.pv-page.pv-sp > .pv-sp-top .pv-section-head { margin-bottom: 0; }
.pv-page.pv-sp > .pv-sp-body {
  flex: 1; min-height: 0; display: flex; flex-direction: column;
  /* 兜底：主页模式下真正在滚的是右边的 .pv-home-cols，这里的内容正好装满、
     不会多出第二条滚动条；但「数据表」模式没有那一层，得有人接着滚，
     否则表格会被固定高度的外壳直接裁掉。 */
  overflow-y: auto;
}
.pv-page.pv-sp .pv-home-root { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.pv-page.pv-sp .pv-home-wrap { flex: 1; min-height: 0; }
.pv-page.pv-sp .pv-home-wrap.has-rail { align-items: stretch; gap: 0; }
/* 左栏：脱掉那层白卡片。外面已经是一块区域了，里面再套个白框就是框里画框 ——
   那层框什么也没多说，还把四条模块名往里挤了一圈。改成跟项目管理左栏一样，
   靠留白和右边那条竖线分栏。 */
.pv-fold-main .pv-home-rail,
.pv-page.pv-sp .pv-home-rail {
  position: static; top: auto; max-height: none; min-height: 0; overflow-y: auto;
  background: none; border: none; border-radius: 0;
  width: 186px; flex: none;
  padding: 14px 16px 14px 0; margin-right: 16px;
  border-right: 1px solid var(--pv-border);
}
/* 「模块」这个小标题：12px / 不加粗 / 淡一档 / 往左靠（padding-left 4px）。
   其他清单的「清单」、影视书籍的「分类」（.pv-pmo-nav-gtitle）都按这一个来（用户 2026-09-03：以模块为准） */
.pv-fold-main .pv-home-rail-title,
.pv-page.pv-sp .pv-home-rail-title {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; letter-spacing: .04em; padding: 0 4px 10px;
}
/* 条目对齐 .pv-pmo-nav-btn —— 两边都是"一条一条可以点的东西"，
   长得不一样只会让人以为是两类东西 */
/* 条目照文件夹页左栏那套（.pv-adm-nav-btn，用户 2026-09-03 点名喜欢旅行助手那列）：
   14px 正常字重、平时不铺底、悬停浅底、选中主色浅底片。原来每条都铺一块灰底，一列灰块 */
.pv-fold-main .pv-home-rail-item,
.pv-page.pv-sp .pv-home-rail-item {
  font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 400; padding: 8px 10px; border-radius: var(--pv-radius-sm);
  background: none; margin-bottom: var(--pv-nav-gap);
}
.pv-fold-main .pv-home-rail-item:hover,
.pv-page.pv-sp .pv-home-rail-item:hover { background: var(--pv-bg); color: var(--pv-text); }
/* 选中不加粗：加粗会让这一条比旁边的宽出一点，整列跟着晃 */
.pv-fold-main .pv-home-rail-item.active,
.pv-page.pv-sp .pv-home-rail-item.active {
  background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 400;
}
/* 右边内容自己滚。底部留白给足，最后一行不至于贴着视口边 */
.pv-page.pv-sp .pv-home-cols {
  min-height: 0; overflow-y: auto; padding: 14px 0 48px 12px;   /* 左边留 12px，卡片别贴着左栏那条线（用户 2026-09-14：小厨房）*/
}
.pv-page.pv-sp .pv-home-wrap:not(.has-rail) .pv-home-cols { padding-left: 0; }   /* 没左栏的页由页面自己留白 */
/* 没左栏的页：上下留白只由里面的 .pv-home-cols 给（它已经是 14 / 48），这层不再叠一份 ——
   原来两层各 14px，单板块页比有左栏的页高出一截（用户 2026-09-07） */
.pv-page.pv-sp .pv-home-wrap:not(.has-rail) {
  overflow-y: auto; padding-top: 0; padding-bottom: 0;
}
/* 滚的是右栏自己、不是视口，所以不用再给顶栏让高度 */
.pv-page.pv-sp .pv-home-block { scroll-margin-top: 8px; }
@media (max-width: 900px) {
  /* 手机上不玩双滚动区：一根手指分不清自己在滚哪一块，整页滚更顺手 */
  .pv-page.pv-sp { height: auto; overflow: visible; padding-bottom: 40px; }
  .pv-page.pv-sp .pv-home-rail {
    width: auto; margin-right: 0; padding: 12px 0 10px;
    border-right: none; border-bottom: 1px solid var(--pv-border);
  }
  .pv-page.pv-sp .pv-home-cols,
  .pv-page.pv-sp .pv-home-wrap:not(.has-rail) { overflow: visible; padding: 0 0 8px; }
  .pv-page.pv-sp .pv-home-block { scroll-margin-top: calc(var(--pv-topbar-h) + 64px); }
}

/* 手机端：边栏变成顶部一条横滑的胶囊，不占宽度 */
@media (max-width: 900px) {
  .pv-home-wrap.has-rail { display: block; }
  .pv-home-rail {
    position: sticky; top: var(--pv-topbar-h); width: auto; display: flex; gap: 6px;
    overflow-x: auto; padding: 8px; margin-bottom: 14px; max-height: none;
  }
  .pv-home-rail-title { display: none; }
  .pv-home-rail-item { flex: none; margin-bottom: 0; padding: 6px 12px; border-radius: var(--pv-radius-pill); }
  /* 手机端边栏自己也 sticky 在上面，再多让一截 */
  .pv-home-block { scroll-margin-top: calc(var(--pv-topbar-h) + 64px); }
}
/* 空间标题骨架：占住 crumb + 标题的位置，等 /spaces/<id> 回来原地换成真标题，
   页面不会先白一屏、也不会因为标题晚到而把下面的内容往下顶 */
/* 顶部细进度条（取代原来的骨架屏）。骨架的毛病是它必然跟真实页面对不上——
   每个页面的模块高矮宽窄都不同，画出来的灰块只会像"画错了的页面"。进度条跟页面
   形状完全无关，也不占布局，切多快的页都不会抖。 */
.pv-progress {
  position: fixed; top: 0; left: 0; height: 2px; z-index: 200;
  background: linear-gradient(90deg, var(--pv-primary), var(--pv-accent));
  border-radius: 0 2px 2px 0;
  opacity: 0; pointer-events: none;
  transition: width .18s ease, opacity .2s ease;
}
.pv-progress.on { opacity: 1; }
.pv-progress.done { transition: width .16s ease, opacity .26s ease .1s; opacity: 0; }
/* 内容到位时淡进来，比"啪"地出现柔和 */
.pv-fade-in { animation: pv-fade-in .16s ease-out both; }
@keyframes pv-fade-in { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  .pv-progress { transition: none; }
  .pv-fade-in { animation: none; }
}
@media (max-width: 640px) {
  .pv-sidebar {
    /* 高于右下/左下悬浮球（z-index:50）——不然展开的抽屉会被 AI 助手/开发记录
       两个 FAB 盖住一角，看着像抽屉没关严实。 */
    position: fixed; top: 0; left: 0; bottom: 0; z-index: 60;
    width: 78vw; max-width: 280px;
    transform: translateX(-100%); transition: transform .2s ease;
    box-shadow: var(--pv-shadow);
  }
  .pv-sidebar.open { transform: translateX(0); }
  .pv-sidebar-scrim {
    position: fixed; inset: 0; background: rgba(20, 26, 38, .4); z-index: 55;
  }
  .pv-mobile-bar {
    display: flex; align-items: center; gap: 14px;
    height: var(--pv-header-h); padding: 0 16px; flex: none;
    background: rgba(255, 255, 255, .9); backdrop-filter: blur(10px);
    border-bottom: 1px solid var(--pv-border);
    position: sticky; top: 0; z-index: 20;
  }
  .pv-mobile-bar .pv-menu-btn { font-size: 22px; color: var(--pv-text-soft); cursor: pointer; }
  .pv-mobile-bar .pv-brand { margin-bottom: 0; padding: 0; }
  /* 顶栏只有 56px 高，锁定图按高度收，别把整条栏撑开 */
  .pv-mobile-bar .pv-brand-lockup { width: auto; max-width: none; height: 28px; }
  .pv-shell { flex-direction: column; }
  :root { --pv-page-pad: 14px; }   /* 手机上再收一点点 */
}

/* ---------- 登录页（2026-10-25 改版 2a）：白卡两栏——左边深绿品牌栏带背景动效，右边表单；<768 只留表单 ---------- */
.pv-auth { min-height: 100dvh; display: flex; align-items: center; justify-content: center; padding: 24px; box-sizing: border-box; background: #eef1ef; }
.pv-auth-box { display: grid; grid-template-columns: 400px minmax(0, 1fr); width: 1040px; max-width: 100%; min-height: 640px; border-radius: 16px; overflow: hidden;
               background: #fff; box-shadow: 0 24px 64px rgba(20, 45, 35, .12), 0 2px 8px rgba(20, 45, 35, .05); }
.pv-auth-brand { position: relative; overflow: hidden; display: flex; flex-direction: column; justify-content: space-between; padding: 52px 44px; background: #1f3a2f; color: #fff; }
.pv-auth-brand > .pv-auth-lay { position: relative; z-index: 1; }
.pv-auth-mark { margin: 0; font-family: 'Arvo', Georgia, serif; font-weight: 700; font-size: 54px; line-height: 1; letter-spacing: 1px; color: #fff; }
.pv-auth-h { margin: 40px 0 0; font-size: 24px; line-height: 34px; font-weight: 600; color: #fff; }
.pv-auth-tag { margin: 12px 0 0; font-size: 15px; line-height: 24px; color: #c3d3ca; }
.pv-auth-points { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.pv-auth-points li { display: flex; align-items: center; gap: 12px; font-size: 14px; line-height: 20px; color: #d6e2db; }
.pv-auth-points li::before { content: ''; flex: none; width: 5px; height: 5px; border-radius: 50%; background: #7fa892; }
/* 背景动效：全在内容下层，不吃点击 */
.pv-auth-fx { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.pv-auth-dots { position: absolute; inset: 0; background-image: radial-gradient(rgba(190, 225, 205, .16) 1px, transparent 1px); background-size: 22px 22px;
                -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 30%, #000 70%, transparent 100%); mask-image: linear-gradient(180deg, transparent 0%, #000 30%, #000 70%, transparent 100%); }
.pv-auth-glow { position: absolute; border-radius: 50%; filter: blur(10px); }
.pv-auth-glow.a { width: 320px; height: 320px; left: -80px; top: 40px; background: radial-gradient(circle, rgba(92, 196, 150, .35), transparent 65%); animation: pvAuthGlowA 14s ease-in-out infinite alternate; }
.pv-auth-glow.b { width: 280px; height: 280px; right: -90px; bottom: 80px; background: radial-gradient(circle, rgba(120, 170, 220, .22), transparent 65%); animation: pvAuthGlowB 18s ease-in-out infinite alternate; }
.pv-auth-scan { position: absolute; left: 0; right: 0; top: 0; height: 120px; background: linear-gradient(180deg, transparent, rgba(160, 230, 195, .07) 85%, rgba(160, 230, 195, .18));
                animation: pvAuthScan 7s linear infinite; }
.pv-auth-node { position: absolute; width: 5px; height: 5px; border-radius: 50%; background: #9fe0bd; box-shadow: 0 0 10px #9fe0bd; opacity: .25; animation: pvAuthNode 3s ease-in-out infinite; }
@keyframes pvAuthGlowA { to { transform: translate(60px, 80px); } }
@keyframes pvAuthGlowB { to { transform: translate(-70px, -50px); } }
@keyframes pvAuthScan { from { transform: translateY(-120px); } to { transform: translateY(760px); } }
@keyframes pvAuthNode { 0%, 100% { opacity: .25; transform: scale(1); } 50% { opacity: 1; transform: scale(1.6); } }
@media (prefers-reduced-motion: reduce) {
  .pv-auth-glow, .pv-auth-scan, .pv-auth-node { animation: none; }
  .pv-auth-scan { display: none; }
}
/* 右栏表单 */
.pv-auth-card { position: relative; display: flex; flex-direction: column; justify-content: center; gap: 22px; padding: 0 88px; min-width: 0; }   /* relative：右下角的备案号靠它定位 */
.pv-auth-card h1 { margin: 0; font-size: 28px; line-height: 36px; font-weight: 700; color: #1d1d1f; }
.pv-auth-card .sub { margin: 6px 0 0; font-size: 14.5px; line-height: 22px; color: #6e6e73; }
.pv-auth-tabs { display: flex; gap: 28px; border-bottom: 1px solid #e8ebe9; }
.pv-auth-tab { flex-shrink: 0; white-space: nowrap; margin: 0 0 -1px; padding: 0 0 10px; border: 0; border-bottom: 2px solid transparent; background: none; cursor: pointer;
               font: inherit; font-size: 15px; line-height: 22px; color: #8e8e93; }
.pv-auth-tab.on { color: #1f3a2f; font-weight: 600; border-bottom-color: #2f6b4f; }
.pv-auth-fields { display: flex; flex-direction: column; gap: 14px; }
.pv-auth-in { display: flex; align-items: center; height: 48px; box-sizing: border-box; border: 1px solid #dfe3e1; border-radius: 10px; background: #fff; transition: border-color .15s, box-shadow .15s; }
.pv-auth-in:focus-within { border-color: #2f6b4f; box-shadow: 0 0 0 3px rgba(47, 107, 79, .12); }
.pv-auth-in.off { background: #f6f7f6; }
.pv-auth-in input { flex: 1; min-width: 0; height: 100%; padding: 0 14px; border: 0; outline: 0; background: transparent; font: inherit; font-size: 15px; color: #1d1d1f; }
.pv-auth-in input::placeholder { color: #a1a5a3; }
.pv-auth-pre { flex: none; display: flex; align-items: center; height: 24px; padding: 0 12px 0 14px; border-right: 1px solid #e8ebe9; font-size: 15px; line-height: 24px; color: #1d1d1f; }
.pv-auth-act { flex: none; white-space: nowrap; height: 100%; padding: 0 14px; border: 0; background: none; cursor: pointer; font: inherit; font-size: 14px; color: #6e6e73; }
.pv-auth-act.go { color: #2f6b4f; font-weight: 500; }
.pv-auth-act:disabled { cursor: not-allowed; color: #b8bcba; }
.pv-auth-go { width: 100%; height: 48px; border: 0; border-radius: 10px; background: #2f6b4f; color: #fff; cursor: pointer; font: inherit; font-size: 15.5px; font-weight: 600; white-space: nowrap; transition: background .15s; }
.pv-auth-go:hover:not(:disabled) { background: #275a42; }
.pv-auth-go:disabled { cursor: not-allowed; background: #9db8aa; }
.pv-auth-note { margin: 0; font-size: 13px; line-height: 20px; color: #8e8e93; }
.pv-auth-note a { color: #2f6b4f; cursor: pointer; }
/* 邀请卡：带邀请链接打开时在表单上方 */
.pv-auth-inv { display: flex; align-items: center; gap: 12px; padding: 14px 16px; border: 1px solid #d5e6dc; border-radius: 12px; background: #f1f7f3; }
.pv-auth-inv.bad { border-color: #f0d6d2; background: #fdf4f2; }
.pv-auth-inv-av { flex: none; width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: #2f6b4f; color: #fff; font-size: 15px; line-height: 36px; font-weight: 600; }
.pv-auth-inv-txt { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pv-auth-inv-who { font-size: 13px; line-height: 20px; color: #6e6e73; }
.pv-auth-inv-sp { display: flex; align-items: center; gap: 8px; font-size: 15px; line-height: 22px; font-weight: 600; color: #1d1d1f; }
.pv-auth-inv-tag { flex-shrink: 0; white-space: nowrap; padding: 0 8px; border-radius: 6px; background: #dcebe2; color: #2f6b4f; font-size: 12px; line-height: 20px; font-weight: 500; }
.pv-auth-inv-tag.work { background: #e1e9f4; color: #3a5f8f; }
.pv-auth-inv-err { font-size: 14px; line-height: 22px; color: #b2463a; }
@media (max-width: 767px) {
  .pv-auth { padding: 16px; align-items: flex-start; padding-top: 10vh; background: #fff; }
  .pv-auth-box { display: block; min-height: 0; border-radius: 0; box-shadow: none; }
  .pv-auth-brand { display: none; }
  .pv-auth-card { padding: 0; gap: 20px; }
  .pv-auth-card h1 { font-size: 26px; line-height: 34px; }
}
@media (min-width: 768px) and (max-width: 1000px) {
  .pv-auth-box { grid-template-columns: 340px minmax(0, 1fr); }
  .pv-auth-card { padding: 0 48px; }
}

/* ---------- 空间卡片 ---------- */
.pv-section-head { display: flex; align-items: center; flex-wrap: wrap; gap: var(--pv-space-2); margin-bottom: 18px; }
.pv-section-head h2 { margin: 0; font-size: 26px; letter-spacing: -.2px; }
/* 间距交给 flex gap 统一管，别让 el-button 自带的 margin-left 叠加出忽宽忽窄 */
.pv-section-head > .el-button, .pv-section-head > .el-dropdown { margin-left: 0; }
/* 「旅游行装收拾」顶栏两个专属按钮：蓝底白字，跟旁边纯边框按钮区分开 */
.pv-packing-btn, .pv-packing-btn:focus { background: var(--pv-info); border-color: var(--pv-info); color: #fff; }
.pv-packing-btn:hover { background: #1d4ed8; border-color: #1d4ed8; color: #fff; }
@media (max-width: 640px) {
  .pv-section-head h2 { flex: 1 1 100%; font-size: 23px; }
}
.pv-grid-cards {
  display: grid; gap: 16px;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
}
.pv-card {
  background: var(--pv-surface);
  border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius);
  padding: 18px;
  cursor: pointer;
  transition: transform .14s ease, box-shadow .14s ease;
  box-shadow: var(--pv-shadow-sm);
  position: relative;
}
.pv-card:hover { transform: translateY(-2px); box-shadow: var(--pv-shadow); }
.pv-card .icon {
  width: 46px; height: 46px; border-radius: var(--pv-radius-sm);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 26px; margin-bottom: 12px;
}
.pv-card .title { font-weight: 600; font-size: 17px; margin-bottom: 7px; }
.pv-card .desc { color: var(--pv-text-soft); font-size: calc(14.5px + var(--pv-fz-add2, 0px)); min-height: 18px; }
.pv-card.new {
  border-style: dashed; display: flex; flex-direction: column;
  align-items: center; justify-content: center; color: var(--pv-text-soft);
  min-height: 128px; box-shadow: none;
}
/* 分类徽章——中性灰，不跟着分类换色（换了反而看着乱），字号比普通 pv-pill 小一档。
   首页模块卡内的空间卡不再用它（分类已经由模块表达），只有 views-space.js 顶栏还在用。 */
.pv-trash-item {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 0; border-bottom: 1px solid var(--pv-border);
}
.pv-trash-item:last-child { border-bottom: none; }

/* ---------- 首页两层信息架构：模块卡（第一层）+ 空间卡（第二层，手风琴展开） ---------- */
.pv-mod-list { display: flex; flex-direction: column; gap: 12px; }
@media (max-width: 640px) { .pv-mod-list { gap: 10px; } }
/* 首页顶栏：家庭背景 bullet 摘要（不进 Folder 列表） */
.pv-home-brief {
  margin-bottom: 18px; padding: 16px 18px;
  background: linear-gradient(180deg, #fffdf8, var(--pv-surface));
  border: 1px solid var(--pv-mod-family-line, var(--pv-border));
  border-radius: var(--pv-radius);
  box-shadow: var(--pv-shadow-sm);
}
.pv-home-brief.clickable { cursor: pointer; transition: border-color .12s, box-shadow .12s; }
.pv-home-brief.clickable:hover {
  border-color: var(--pv-mod-family-text, var(--pv-primary));
  box-shadow: var(--pv-shadow);
}
.pv-home-brief-head { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.pv-home-brief-icon { font-size: 22px; }
.pv-home-brief-title { font-size: 17px; font-weight: 700; color: var(--pv-mod-family-text, var(--pv-text)); }
.pv-home-brief-link {
  margin-left: auto; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600;
  color: var(--pv-mod-family-text, var(--pv-text-soft)); opacity: .75;
}
.pv-home-brief.clickable:hover .pv-home-brief-link { opacity: 1; }
.pv-home-brief-list {
  margin: 0; padding-left: 20px; color: var(--pv-text-soft);
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); line-height: 1.65;
}
.pv-home-brief-list li + li { margin-top: 4px; }
.pv-mod-card.dragging { opacity: .55; }
.pv-folder-edit {
  flex: none; border: none; background: transparent; padding: 2px 6px; border-radius: 6px;
  color: var(--pv-text-faint); cursor: pointer; line-height: 1;
}
.pv-folder-edit:hover { background: var(--pv-bg); color: var(--pv-text-soft); }
/* Element el-icon-edit 默认就是「笔尖左下、笔帽右上」的自然朝向——之前 rotate(-42deg)
   反而把笔立得快竖起来、看着方向不对，去掉旋转即可。 */
.pv-icon-pen {
  display: inline-block;
}
.pv-icon-pen-btn { padding: 4px 6px !important; }
.pv-folder-del { color: var(--pv-danger) !important; font-size: calc(13px + var(--pv-fz-add, 0px)) !important; padding: 0 4px !important; margin-left: 4px; }
/* 空间卡：顶行类型标签 + ⋯，下方图标与标题左对齐 */
.pv-space-card { padding: 14px 16px 16px !important; }
.pv-space-card-top {
  display: flex; align-items: center; justify-content: space-between;
  gap: 8px; min-height: 22px; margin-bottom: 12px;
}
.pv-space-card-top .pv-card-type-tag {
  position: static; flex: none;
  font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 2px 8px; line-height: 1.35;
}
.pv-space-card-top .pv-card-more {
  position: static; flex: none;
  width: 28px; height: 28px; margin: 0;
}
.pv-space-card-main .icon {
  width: 46px; height: 46px; margin-bottom: 10px;
}
.pv-space-card-main .body .title {
  font-size: 17px; font-weight: 600; margin-bottom: 3px; line-height: 1.3;
}
.pv-space-card-main .body .desc {
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.4; margin-top: 0;
}
/* 「全部手记」聚合卡：固定排最前，虚线边框跟普通空间卡区分开 */
.pv-all-notes-card {
  border-style: dashed !important;
  border-color: var(--pv-mod-diary_hub-line, var(--pv-border)) !important;
}
@media (max-width: 640px) {
  .pv-mod-panel-bg .pv-space-card {
    padding: 12px 14px !important;
  }
  .pv-space-card-top { margin-bottom: 10px; min-height: 20px; }
  .pv-space-card-main {
    display: flex; align-items: center; gap: 13px; width: 100%;
  }
  .pv-space-card-main .icon {
    width: 46px; height: 46px; font-size: 25px; margin-bottom: 0; flex: none;
  }
  .pv-space-card-main .body { flex: 1; min-width: 0; }
  .pv-space-card-main .body .title { font-size: 16.5px; margin-bottom: 2px; }
  .pv-space-card-main .body .desc {
    font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
}
.pv-mod-card {
  background: var(--pv-surface);
  border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius);
  box-shadow: var(--pv-shadow-sm);
}
.pv-mod-card:hover { transform: translateY(-2px); box-shadow: var(--pv-shadow); }
.pv-mod-card.is-link .pv-mod-chevron { opacity: .35; }
.pv-mod-card.expanded {
  border-color: var(--pv-mod-line, var(--pv-border));
  box-shadow: var(--pv-shadow);
}
.pv-mod-head {
  padding: 16px 20px; display: flex; align-items: center; gap: 16px; cursor: pointer;
}
@media (max-width: 640px) { .pv-mod-head { padding: 14px 16px; gap: 13px; } }
.pv-mod-icon {
  width: 52px; height: 52px; border-radius: var(--pv-radius-sm); flex: none;
  display: flex; align-items: center; justify-content: center; font-size: 28px;
  background: var(--pv-mod-soft, var(--pv-bg));
}
@media (max-width: 640px) { .pv-mod-icon { width: 46px; height: 46px; font-size: 25px; } }
.pv-mod-body { flex: 1; min-width: 0; }
.pv-mod-title-row { display: flex; align-items: center; gap: 10px; }
@media (max-width: 640px) { .pv-mod-title-row { gap: 9px; } }
.pv-mod-name {
  font-family: var(--title-font); font-weight: 700; font-size: 19px; color: var(--pv-text);
}
@media (max-width: 640px) { .pv-mod-name { font-size: 17.5px; } }
.pv-mod-badge {
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap;
  border-radius: var(--pv-radius-pill); padding: 2px 10px;
  background: var(--pv-mod-soft, var(--pv-bg)); color: var(--pv-mod-text, var(--pv-text-soft));
}
@media (max-width: 640px) { .pv-mod-badge { font-size: 12.5px; padding: 2px 9px; } .pv-mod-badge-suffix { display: none; } }
.pv-mod-preview {
  /* 5px→3px 太挤，小字贴着标题像是标题自己换了行。拉开到 7px，两行才读得出主次 */
  font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-faint); margin-top: 7px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
@media (max-width: 640px) { .pv-mod-preview { display: none; } }
.pv-mod-chevron {
  flex: none; opacity: .45; transition: transform .2s ease, opacity .2s ease;
}
.pv-mod-card.expanded .pv-mod-chevron {
  opacity: .6; transform: rotate(180deg); color: var(--pv-mod-text, var(--pv-text-soft));
}
.pv-mod-panel { overflow: hidden; max-height: 0; opacity: 0; transition: max-height .2s ease, opacity .2s ease; }
.pv-mod-panel.open { max-height: 4000px; opacity: 1; }
.pv-mod-panel-inner { padding: 0 16px 16px; }
@media (max-width: 640px) { .pv-mod-panel-inner { padding: 0 10px 10px; } }
/* Folder 页：卡片头部隐藏，面板直接充当内容区，补上顶部内边距 */
.pv-mod-card.folder-page .pv-mod-panel-inner { padding-top: 16px; }
@media (max-width: 640px) { .pv-mod-card.folder-page .pv-mod-panel-inner { padding-top: 10px; } }
/* Folder 页（小厨房、影视书籍…）：底下那几页摆成**左边一列**，照搬项目管理
   和后台那一套（.pv-work / .pv-page.pv-adm）。整页不滚，只有右边内容区滚。

   原来是顶上一排横页签。两个毛病：页一多就占掉两行，把真正的内容往下顶；
   而且切页签时整页滚回顶部，得再滚下来找刚才那个位置。左栏钉住之后，
   来回切"买菜清单 / 小黑板 / 餐厅"，左边那列纹丝不动。 */
.pv-page.pv-fold {
  display: flex; flex-direction: column;
  height: calc(100dvh - var(--pv-topbar-h, 0px));
  padding-top: 0; padding-bottom: 0; overflow: hidden;
}
/* 模块页（/folder/<key>，用户 2026-10-29）：顶栏照项目管理 / 日记本那条 .pv-work-top——21px 标题 + 底下一道横线，
   线下 14px 才是内容；左栏「模块」那个小标题和右边内容顶在同一条线上。原来是 26px 的 .pv-section-head、
   底下 18px 再加嵌进来那页自己的 24px，每页量出来都不一样。 */
.pv-page.pv-modpage { padding-top: 0; }
.pv-page.pv-modpage > .pv-work-top { margin-bottom: 0; min-height: 65px; box-sizing: border-box; }   /* 项目管理那条里有 34 高的搜索框撑到 65；这里没有，也撑到 65，横线落在同一条线上 */
.pv-page.pv-modpage .pv-bh-layout { padding-top: 0; }                                                  /* 身体健康：线下那 14px 已由上一条给了 */
.pv-page.pv-modpage > .pv-page:has(.pv-soc-layout) { padding-top: 0; }                                 /* Let's connect：它的布局自己带 14（全出血时由左栏补），这里不再叠一层 */
.pv-page.pv-modpage > .pv-page { padding: 14px 0 48px; }        /* 单空间直接嵌进来的那页：自己不再留 24px 顶边和左右边 */
.pv-page.pv-modpage > .pv-work-body { padding-top: 14px; }
/* 分类页是三层：最左边一列挑「哪一页」，右边是内容，内容里如果还有多个板块，
   那一列「模块」摆到**最右边**（跟项目管理的「跳到」同一个位置）——
   两列都堆在左边的话，左边一半屏幕全是导航，真正要看的东西被挤到最右边一条。 */
.pv-fold-layout {
  display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0;   /* 左栏是 <pv-rail>（默认 186） */
  flex: 1; min-height: 0;      /* 不给 0，grid 子项会撑破容器，滚动条落回整页 */
  align-items: start;          /* 左栏只占内容高度 —— 那条竖线才不会一路通到底 */
}
/* 左栏：自己滚（页数多到装不下时），顶上不留内边距，第一项跟右边内容齐平。
   右边一条**短竖线**：它只跟内容一样高，是"这两块是分开的"的一个轻提示，
   通到底的那种反而像把页面劈成两半。 */
.pv-fold-side {
  min-height: 0; max-height: 100%; overflow-y: auto;
  gap: var(--pv-nav-gap); padding: 14px 16px 14px 0; margin-right: 16px;
  border-right: 1px solid var(--pv-border);
}
.pv-fold-side .pv-adm-nav-btn { font-size: calc(14px + var(--pv-fz-add2, 0px)); }
/* 「＋ 新建 / 改名」沉到列底，跟上面那串页分开 —— 它们不是"另一页" */
.pv-fold-side-foot {
  margin-top: auto; padding-top: 12px; border-top: 1px dashed var(--pv-border);
  display: flex; flex-wrap: wrap; gap: 6px;
}
.pv-fold-side-foot .pv-mini-btn + .pv-mini-btn { margin-left: 0; }
/* 右边内容区自己滚。底部留白给足，最后一行不至于贴着视口边 */
.pv-fold-main { min-width: 0; min-height: 0; overflow-y: auto; padding: 14px 0 48px; }
.pv-fold-main > .pv-page { padding: 0; }
/* 嵌在分类页里的空间主页：左边那列「模块」是 sticky，而现在滚的是 .pv-fold-main
   而不是视口 —— 原来那个 top（顶栏高度 + 12px）在这里量错了对象，会让它浮在
   容器顶边下面一大截。改成贴着容器顶边。 */
/* 分类页里的「模块」列**排到右边**：左边已经有一列挑页面了，两列并排在左侧
   等于左半屏全是导航。order 就够了 —— .pv-home-wrap.has-rail 是 flex。 */
.pv-fold-main .pv-home-wrap.has-rail { align-items: flex-start; }
.pv-fold-main .pv-home-rail {
  order: 2;
  /* 钉在**滚动容器**（.pv-fold-main）的顶边，不是视口的 —— 原来那个
     top（顶栏高 + 12px）在这里量错了对象，会让它浮在容器顶边下面一大截。 */
  position: sticky; top: 0; max-height: calc(100dvh - var(--pv-topbar-h, 0px) - 120px);
  /* 比外层那一列窄一档：这一页已经有一列了，两列同宽会把内容挤没 */
  width: 150px; margin: 0 0 0 16px; padding: 0 0 0 14px;
  border-right: none; border-left: 1px solid var(--pv-border);
}
/* 分类页里（小厨房这种）：右边内容跟左栏同一条起跑线 —— 左栏 padding-top 14px，
   内容这边也给 14px，并把第一块那 8px 的额外上边距去掉（用户 2026-09-07：只有左栏有 padding-top） */
.pv-fold-main .pv-home-cols { order: 1; padding-top: 14px; }
.pv-fold-main .pv-home-cols:not(.solo) > .pv-home-block:first-child { margin-top: 0; }
@media (max-width: 900px) {
  /* 窄屏本来就把这一列摊成顶部一排胶囊，order 得跟着回到最前面 */
  .pv-fold-main .pv-home-rail { order: 0; margin: 0 0 14px; padding: 0 0 10px;
    border-left: none; border-bottom: 1px solid var(--pv-border); }
}
@media (max-width: 860px) {
  /* 手机上不玩双滚动区：一根手指分不清自己在滚哪一块，整页滚更顺手。
     左栏排成一行小片，竖着占半屏太浪费。 */
  .pv-page.pv-fold { height: auto; overflow: visible; padding-bottom: 40px; }
  .pv-fold-layout { grid-template-columns: 1fr; row-gap: 12px; }
  .pv-page.pv-fold .pv-fold-side {
    flex-direction: row; flex-wrap: wrap; align-items: center;
    overflow: visible; padding: 12px 0 10px; margin-right: 0;
    max-height: none; border-right: none;
    border-bottom: 1px solid var(--pv-border);
  }
  .pv-fold-side .pv-adm-nav-btn { width: auto; }
  .pv-fold-side-foot { margin: 0 0 0 auto; padding-top: 0; border-top: none; }
  .pv-fold-main { overflow: visible; padding: 0 0 8px; }
}

/* 老的横页签样式留着：只有一页的 Folder 不画左栏，另外别处还在用 .pv-ship-tab */
.pv-folder-tabs { margin: -2px 0 14px; }
.pv-folder-tab-new, .pv-folder-tab-edit { font-weight: 600; }
.pv-folder-tab-edit { margin-left: auto; }

/* 弹窗底部的危险区：删除按钮 + 一句说明，跟表单之间用一条分隔线断开 */
.pv-folder-danger {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 4px; padding-top: 12px; border-top: 1px dashed var(--pv-border);
}
.pv-folder-danger .pv-muted { font-size: calc(12.5px + var(--pv-fz-add, 0px)); }

.pv-ml-for { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; margin-top: 5px; }
.pv-ml-for-label { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ml-for-chip {
  font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1.6; padding: 0 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-mod-gifts-soft, var(--pv-bg)); color: var(--pv-mod-gifts-text, var(--pv-text-soft));
  white-space: nowrap; flex-shrink: 0;      /* 标签里的字永远不许被挤成竖排 */
}

.pv-avatar-img { object-fit: cover; padding: 0; }

.pv-mp-blank {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 10px 14px; margin-bottom: 10px; font-size: calc(13.5px + var(--pv-fz-add, 0px));
  background: var(--pv-bg); border-radius: var(--pv-radius-sm); color: var(--pv-text-soft);
}
.pv-mp-blank-text { flex: 1; min-width: 0; }
.pv-mp-blank-btn {
  border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft);
  border-radius: var(--pv-radius-sm); padding: 3px 11px; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer;
  white-space: nowrap; flex-shrink: 0;
}
.pv-mp-blank-btn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-mp-blank-btn.primary { background: var(--pv-primary-soft); border-color: var(--pv-primary-soft); color: var(--pv-primary-dark); }

/* 财务状况顶上的「该记账了」提醒条。没拖就是安静的中性色，拖了才变红 —— 
   一上来就红的话，红色很快就没意义了。 */
/* 统一提醒条 <pv-remind-bar> —— 小厨房、财务状况，以后所有「到点戳你一下」的模块
   都用这一套。原来各画各的：一条灰底一条白底、按钮位置也不一样，可它们其实是同一件事。

   红色只在**真的欠着**的时候给。平时是安静的中性色，只有左边那道竖杠是红的。
   一上来就整条红，红色很快就没意义了 —— 那时候真出事反而看不出来。
   左边那道是强调色边，所以左侧两个角不做圆角。 */
.pv-remind {
  display: flex; align-items: center; gap: 9px; flex-wrap: wrap;
  padding: 9px 14px; margin-bottom: 14px; font-size: calc(13.5px + var(--pv-fz-add, 0px));
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-left: 3px solid var(--pv-danger);
  border-radius: 0 var(--pv-radius) var(--pv-radius) 0;
  color: var(--pv-text);
}
.pv-remind.hot { background: rgba(229, 37, 45, .06); border-color: rgba(229, 37, 45, .3); border-left-color: var(--pv-danger); }
.pv-remind.off { border-left-color: var(--pv-border); color: var(--pv-text-faint); }
.pv-remind-ico { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1; flex-shrink: 0; }
.pv-remind-title { font-weight: 700; white-space: nowrap; flex-shrink: 0; }
.pv-remind-text { color: var(--pv-text-soft); min-width: 0; }
.pv-remind-hint {
  margin-left: 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
  white-space: nowrap; flex-shrink: 0;
}
.pv-remind-n {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; padding: 1px 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-danger-soft); color: var(--pv-danger); white-space: nowrap; flex-shrink: 0;
}
.pv-remind-act {
  border: 1px solid var(--pv-danger); background: var(--pv-surface); color: var(--pv-danger);
  border-radius: var(--pv-radius-sm); padding: 3px 11px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer;
  white-space: nowrap; flex-shrink: 0; font-weight: 600;
}
.pv-remind-act:hover { background: var(--pv-danger); color: #fff; }
.pv-remind-gear {
  width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--pv-border);   /* 原来 22px 太小（用户 2026-09-11） */
  background: var(--pv-surface); color: var(--pv-text-soft); cursor: pointer;
  font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1; flex-shrink: 0; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
}
.pv-remind-gear:hover { background: var(--pv-danger); border-color: var(--pv-danger); color: #fff; }

/* Folder 页标题左侧「← 首页」返回 */
.pv-crumb-back {
  border: none; background: none; cursor: pointer; flex: none;
  color: var(--pv-text-soft); font-size: calc(14px + var(--pv-fz-add2, 0px)); padding: 4px 10px 4px 0;
}
.pv-crumb-back:hover { color: var(--pv-primary-dark); }
.pv-mod-panel-bg {
  background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 14px;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 14px;
}
@media (max-width: 640px) {
  .pv-mod-panel-bg { padding: 10px; display: flex; flex-direction: column; gap: 10px; }
}
/* 空间卡右上角常驻「⋯ 更多操作」——不再用 opacity:0 hover 显示 */
.pv-card-more {
  position: absolute; top: 10px; right: 10px; width: 32px; height: 32px;
  border-radius: 8px; display: flex; align-items: center; justify-content: center;
  color: var(--pv-text-faint); font-weight: 700; letter-spacing: 1px; font-size: calc(15px + var(--pv-fz-add2, 0px));
  background: transparent; cursor: pointer; transition: background .12s, color .12s;
}
.pv-card-more:hover, .pv-card-more.is-active { background: var(--pv-bg); color: var(--pv-text-soft); }
@media (max-width: 640px) { .pv-card-more { width: 36px; height: 36px; } }
.pv-more-menu.el-dropdown-menu { width: 170px; border-radius: var(--pv-radius-sm); padding: 6px; }
.pv-more-menu .el-dropdown-menu__item { border-radius: 7px; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); padding: 9px 12px; line-height: 1.4; }
.pv-more-menu .el-dropdown-menu__item.is-danger { color: var(--pv-danger-text); }
.pv-more-menu .el-dropdown-menu__item.is-danger:hover { background: var(--pv-danger-soft); }
/* 空间类型标签（空间卡标题旁：模板类型 / 出行子类型） */
.pv-trip-tag,
.pv-type-tag {
  flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 500; color: var(--pv-text-soft);
  background: var(--pv-bg); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius-pill); padding: 1px 8px; white-space: nowrap;
}
@media (max-width: 640px) { .pv-trip-tag, .pv-type-tag { font-size: 11.5px; padding: 1px 7px; } }
/* 模块尾部「＋ 在这个模块里新建」虚线卡 */
.pv-mod-new {
  border: 1px dashed #d3d6e0; border-radius: var(--pv-radius);
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  color: var(--pv-text-soft); cursor: pointer; min-height: 128px;
  transition: border-color .12s, color .12s, background .12s;
}
.pv-mod-new:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-mod-new .plus { font-size: 24px; line-height: 1; }
.pv-mod-new .label { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); }
@media (max-width: 640px) {
  .pv-mod-new { min-height: 52px; flex-direction: row; }
  .pv-mod-new .plus { font-size: 19px; }
}
/* 手机端：模块面板里的空间卡（无 pv-space-card 的旧卡兜底） */
@media (max-width: 640px) {
  .pv-mod-panel-bg .pv-card:not(.pv-space-card) {
    display: flex; align-items: center; gap: 13px; padding: 14px 16px;
  }
  .pv-mod-panel-bg .pv-card:not(.pv-space-card) .icon { width: 46px; height: 46px; font-size: 25px; margin-bottom: 0; flex: none; order: 1; }
  .pv-mod-panel-bg .pv-card:not(.pv-space-card) .body { flex: 1; min-width: 0; order: 2; }
  .pv-mod-panel-bg .pv-card:not(.pv-space-card) .title { font-size: 16.5px; margin-bottom: 0; }
  .pv-mod-panel-bg .pv-card:not(.pv-space-card) .desc {
    font-size: 14px; margin-top: 2px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .pv-mod-panel-bg .pv-card:not(.pv-space-card) .pv-card-more { position: static; order: 3; }
}

/* ---------- 空间 / 表格页 ---------- */
.pv-subnav { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; }
.pv-tab {
  padding: 6px 14px; border-radius: var(--pv-radius-pill); cursor: pointer;
  color: var(--pv-text-soft); border: 1px solid transparent;
  display: inline-flex; align-items: center; gap: 6px;
}
.pv-tab:hover { background: var(--pv-surface); }
.pv-tab.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
/* 数据表条：跟主页明确区分开——原始网格模式下的次级提示条，弱化处理不抢主页风头 */
.pv-datatable-bar {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 12px; margin-bottom: 10px;
  background: var(--pv-bg); border: 1px dashed var(--pv-border);
  border-radius: var(--pv-radius-sm);
}
.pv-datatable-label { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); }
.pv-crumb { color: var(--pv-text-faint); }
.pv-crumb a { color: var(--pv-text-soft); }
.pv-crumb a:hover { color: var(--pv-primary-dark); text-decoration: underline; }

.pv-toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; }
.pv-toolbar .pv-spacer { flex: 1; }

.pv-table-wrap {
  background: var(--pv-surface);
  border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius);
  overflow-x: auto;   /* 表格本身够宽就在自己容器内横向滚动，别把整个页面顶开 */
}
/* 表头空间留大、加粗，跟 body 背景一致（不单独刷灰底），弱化"表格感"、更像列表的分区标题 */
.pv-table-wrap .el-table th {
  background: var(--pv-surface); font-weight: 700; font-size: 15.5px; color: var(--pv-text);
  padding: 14px 0;
}
.pv-table-wrap .el-table td { padding: 10px 0; }
.pv-table-wrap .el-table .cell { line-height: 1.4; padding-left: 12px; padding-right: 12px; }
.pv-table-wrap .el-table::before { display: none; }
.pv-table-wrap .pv-row-actions {
  display: inline-flex; flex-wrap: nowrap; align-items: center; gap: 2px; white-space: nowrap;
}
.pv-table-wrap .pv-row-actions .el-button { margin: 0; padding: 4px 10px; font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-row-actions .el-button { font-size: 18px; padding: 4px 8px; }
.pv-empty { padding: 60px 20px; text-align: center; color: var(--pv-text-faint); }
.pv-empty .big { font-size: 36px; margin-bottom: 10px; }
/* 嵌在板块里的空状态（任务列表这种）：整页空状态那个 36px 图标在这儿太抢，
   它只是"这一小块暂时没内容"，不是"整页没东西" */
.pv-task .pv-empty { padding: 28px 20px; }
.pv-task .pv-empty .big { font-size: 22px; margin-bottom: 6px; opacity: .75; }

.pv-chip-picker { display: flex; flex-wrap: wrap; gap: 6px; }
.pv-chip-opt {
  padding: 5px 12px; border-radius: var(--pv-radius-pill); cursor: pointer; user-select: none;
  font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); background: var(--pv-bg); border: 1px solid var(--pv-border);
}
.pv-chip-opt:hover { color: var(--pv-text); }
.pv-chip-opt.active { background: var(--pv-primary); color: #fff; border-color: var(--pv-primary); font-weight: 600; }

/* Markdown 编辑器（pv-md-editor）：工具条 + 实时预览 */
/* Markdown 编辑器（版式照搬 growth-ledger 的 .md-editor / .md-panes，用户 2026-09-09；
   规范见 Little Jelly comp-markdown-split-editor）：工具条一排 → 左写右预览两栏等宽 */
/* container：左右排还是上下排，看的是编辑器自己有多宽，不是屏幕有多宽（见下面 @container 那条） */
.pv-mde { display: flex; flex-direction: column; gap: 6px; container-type: inline-size; }
.pv-mde-bar { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.pv-mde-bar button {
  border: 1px solid var(--pv-border); background: transparent; color: var(--pv-text-soft);
  border-radius: 6px; min-height: 30px; min-width: 30px; padding: 4px 8px;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1; cursor: pointer; white-space: nowrap; font-family: inherit;
  display: inline-flex; align-items: center; gap: 4px;
}
.pv-mde-bar button:hover { color: var(--pv-text); background: rgba(31, 36, 48, .07); }
.pv-mde-bar button.mono { font-family: ui-monospace, "SF Mono", Menlo, monospace; }
.pv-mde-bar button i { font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-mde-hint { margin-left: auto; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
/* 左写右预览。两栏等宽，盒模型必须一致，否则同样写 100% 也会差出 padding 与边框的宽度 */
.pv-mde-panes { display: grid; grid-template-columns: 1fr; gap: 10px; position: relative; }   /* relative：@ 名单贴在底下 */
.pv-mde-panes.split { grid-template-columns: 1fr 1fr; }
.pv-mde-panes > * { box-sizing: border-box; min-width: 0; }
.pv-mde-panes .el-textarea { width: 100%; }
.pv-mde .el-textarea__inner { font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; font-family: inherit; resize: both; max-width: 100%; min-width: 240px; }   /* 右下角能拉宽拉高（用户 2026-09-13） */
.pv-mde-preview {
  box-sizing: border-box; width: 100%; overflow-y: auto;
  border: 1px dashed var(--pv-border); border-radius: var(--pv-radius-sm);
  padding: 5px 15px; background: var(--pv-bg);
  /* 字号、行高跟左边输入框**一样**：预览是"打出来会是什么样"，不是另一篇正文（用户 2026-09-04 / 09-09） */
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7;
}
@media (max-width: 760px) {
  /* 手机上左右分栏两边都太窄，改成上下 */
  .pv-mde-panes.split { grid-template-columns: 1fr; }
}
/* 编辑器自己不到 520 宽就上写下预览（用户 2026-09-28）。输入框最窄 240，两栏并排至少要 240 × 2 + 间距 10 = 490；
   再窄的话输入框会伸到预览那一栏底下去，两块叠在一起——抽屉里的评论框就是这样。
   上面那条按屏幕宽度的只管得了手机；电脑上抽屉才四五百宽，屏幕再宽也没用，所以得按容器量 */
@container (max-width: 520px) {
  .pv-mde-panes.split { grid-template-columns: 1fr; }
}
/* 预览区字号必须压过全站 .pv-md 的 16.5px（同为单类名、它排在后面会赢）：双类名提优先级，跟左边输入框一样 13.5 / 1.7（用户 2026-09-09） */
.pv-mde-preview.pv-md { font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; max-width: none; }
.pv-mde-preview.pv-md p, .pv-mde-preview.pv-md li { font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; }
.pv-mde-preview.pv-md p { margin: 3px 0; }
.pv-mde-preview.pv-md ul, .pv-mde-preview.pv-md ol { margin: 3px 0; padding-left: 20px; }
.pv-mde-preview.pv-md h2, .pv-mde-preview.pv-md h3, .pv-mde-preview.pv-md h4 { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); margin: 6px 0 2px; border: none; padding: 0; }
.pv-mde-preview.pv-md > :first-child { margin-top: 0; }
.pv-mde-preview.pv-md > :last-child { margin-bottom: 0; }

.pv-field-head { display: inline-flex; align-items: center; gap: 5px; }
.pv-field-type { color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-muted { color: var(--pv-text-faint); }
.pv-pill {
  display: inline-block; padding: 1px 9px; border-radius: var(--pv-radius-pill);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: calc(14px + var(--pv-fz-add2, 0px));
}
.pv-pill.solid {
  font-weight: 600; padding: 2px 11px; letter-spacing: .3px;
  box-shadow: 0 1px 2px rgba(25, 27, 35, .12);
}

/* 人生日记顶部 AI 速记框：虚线 + 浅底，textarea 比单行输入宽松，按钮独立一列；
   手机端按钮挪到下面一整行，更好点。
   （清单原来那条 .pv-check-addbar 用的是同一套语言，后来改成按钮+弹窗撤掉了；
     日记这个留着 —— 它是"说一段话让 AI 整理"，不是"填一行字段"，值得一直摊开。） */
/* 主人手记（想法收集箱）专属主色：世界银行海军蓝，只作用在日记工具内，
   靠容器级 CSS 变量覆盖 --pv-primary*，不动全站橙色主色。.pv-diary-dialog 给
   append-to-body 的编辑弹窗用（弹窗渲染到 body 外、拿不到容器变量，单独点名）。 */
.pv-diary-root, .pv-diary-dialog {
  --pv-primary: #002244;
  --pv-primary-dark: #001628;
  --pv-primary-soft: #e7ebf1;
}
/* 记一笔速记区：整宽输入框在上、按钮组右对齐在下，比挤成一行更舒展。 */
/* 顶上那块常驻的 AI 速记框撤了（用户 2026-09-03）：改成一行 —— 左边「＋ 记一笔」拉右侧抽屉，
   右边 时间轴 / 待办 / 待复盘 三个小片当筛选。AI 速记搬进了抽屉顶上那一块。 */
.pv-diary-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-diary-ai .el-textarea { width: 100%; }
.pv-diary-ai-act { display: flex; justify-content: flex-end; margin-top: 6px; }

/* ---------- 首页顶部「当前重点」条（pv-focus-bar）---------- */
/* 常驻在右侧内容区最顶上，翻到哪一页都在——它回答的是「现在精力该往哪放」，
   不该翻页就消失。sticky 而不是 fixed：宽度跟着内容区走，不用手算侧栏宽度。 */
.pv-focus-bar {
  position: sticky; top: 0; z-index: 30;
  background: rgba(255, 255, 255, .92); backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--pv-border);
  /* 下边比上边宽：Highlights 是这条里最靠下的一块，贴着分隔线会显得挤 */
  padding: 10px 0 18px;
}
/* 里面再套一层限宽：让「当前重点」的左右边缘跟页面内容严格对齐。
   右边多留 44px 给收起按钮，免得雪弗龙链子铺到它底下 */
.pv-focus-inner {
  width: 100%; max-width: var(--pv-page-max); margin: 0 auto;
  padding: 0 calc(var(--pv-page-pad) + 44px) 0 var(--pv-page-pad);
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px;
}
.pv-focus-left { display: flex; align-items: center; gap: 8px; }

/* ---- 收起 ---- */
/* 收起态：整条塌成 0 高，只留顶边挂着的一枚「心态」标签。
   样式取自 wbhrd 那个 filter 侧栏的收起态（贴边小红标签 + 三角），
   区别是它贴左边所以标签竖排，这条贴顶边，文字保持横排。 */
.pv-focus-bar { transition: padding .18s ease; }
.pv-focus-bar.collapsed {
  padding: 0; border-bottom: none; background: none; backdrop-filter: none;
  pointer-events: none;                 /* 塌掉之后别挡住下面的内容 */
}
.pv-focus-bar.collapsed .pv-focus-inner > *:not(.pv-focus-fold) { display: none; }
.pv-focus-bar.collapsed .pv-focus-inner { padding: 0; gap: 0; }

/* 展开态钉在整条的右上角。跟着 flex 排的话，Highlights 那行是整宽的，
   按钮会被挤到下一行去，落在条子中间不上不下。 */
.pv-focus-fold {
  position: absolute; top: 8px; right: 22px; z-index: 2;
  flex: none; pointer-events: auto; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
  height: 24px; padding: 0 10px;
  border: none; border-radius: 6px; font-family: inherit;
  background: var(--pv-danger); color: #fff;
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .06em;
  white-space: nowrap;                  /* 标签里的字永远不许被挤成换行 */
  transition: background .15s;
}
.pv-focus-fold:hover { background: #b91c1c; }
.pv-focus-fold-label { display: none; }          /* 展开时只露一个三角，别占地方 */
.pv-focus-bar.collapsed .pv-focus-fold-label { display: block; }
/* 收起后挂在顶边正中偏右，圆角只留下面两个 —— 它是从上面"垂"下来的 */
.pv-focus-bar.collapsed .pv-focus-fold {
  position: fixed; top: 0; right: 40px; z-index: 31;
  height: auto; padding: 5px 13px 11px; border-radius: 0 0 8px 8px;
}
.pv-focus-fold-chev {
  display: block; width: 0; height: 0; flex: none;
  border-left: 5px solid transparent; border-right: 5px solid transparent;
  border-bottom: 6px solid #fff;        /* 展开态：朝上，意思是"收上去" */
  transition: transform .2s ease;
}
.pv-focus-bar.collapsed .pv-focus-fold-chev {
  border-bottom: none; border-top: 6px solid #fff;   /* 收起态：朝下，"拉下来" */
}
@media (max-width: 640px) {
  .pv-focus-bar.collapsed .pv-focus-fold { right: 12px; }
}
.pv-focus-title { font-weight: 700; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text); white-space: nowrap; }
/* 只剩一个靶心，所以给足尺寸 —— 它现在要独自扛起"这一条是干嘛的" */
.pv-focus-mark { font-size: 22px; line-height: 1; flex: none; cursor: default; }
/* Priorities 弹窗顶上那排头像（用户 2026-10-01）：点谁看谁的；旁边那句说明现在看的是谁的 */
.pv-focus-dlg-who { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-focus-dlg-who .pv-focus-dlg-note { margin: 0; }
.pv-focus-item.is-static { cursor: default; }
.pv-focus-dlg-creed { white-space: pre-wrap; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; color: var(--pv-text); }
.pv-focus-stage { width: 120px; }
/* 只有一个阶段时，下拉换成一枚静态胶囊——还是告诉你"现在按哪个阶段排"，
   但不再假装有得选 */
.pv-focus-stage-one {
  flex: none; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 4px 12px;
  border: none; cursor: pointer; font-family: inherit;
  border-radius: var(--pv-radius-pill);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark);
}
.pv-focus-stage-one:hover { background: var(--pv-accent-soft); }
/* 链子不换行（用户 2026-09-08：窄屏折成两行难看）：放不下就在右端截断、盖一层渐白 + 「…」，
   鼠标停上去在底下弹一条完整的（绝对定位，不把页面内容顶下去）。 */
.pv-focus-chainwrap { flex: 1; min-width: 0; position: relative; display: flex; align-items: center; }
.pv-focus-chain { display: flex; align-items: center; flex: 1; min-width: 0; flex-wrap: nowrap; overflow: hidden; }
.pv-focus-chain .pv-focus-chev { flex: none; }
.pv-focus-more {
  position: absolute; right: 0; top: 0; bottom: 0; display: flex; align-items: center;
  padding: 0 6px 0 34px; font-size: 16px; font-weight: 700; letter-spacing: 1px; color: var(--pv-text-soft);
  background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .96) 55%);
  cursor: default; user-select: none;
}
.pv-focus-chain-pop {
  position: absolute; z-index: 5; left: 0; right: 0; top: calc(100% + 8px);
  display: flex; flex-wrap: wrap; align-items: center; row-gap: 6px;
  padding: 10px 12px; background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: 10px; box-shadow: var(--pv-shadow);
}
.pv-focus-chain-pop .pv-focus-chev { cursor: default; }
/* 雪弗龙：右边切出箭头尖，左边切出同形状的缺口，负 margin 让它们咬在一起。
   底色由 JS 按位次插值（深绿 → 灰），所以这里只管形状，不写颜色。 */
.pv-focus-chev {
  display: inline-flex; align-items: center; gap: 7px; white-space: nowrap;
  /* 高度写死、行高归一：原来靠 padding + 行盒撑高，纯英文那段（World Bank HR）的行盒比中文的矮，
     整条链上就它上下缩进去一截（用户 2026-09-07：没对齐）。 */
  height: 34px; line-height: 1; box-sizing: border-box;
  padding: 0 22px 0 30px; margin-left: -12px;
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: #fff;
  clip-path: polygon(0 0, calc(100% - 12px) 0, 100% 50%, calc(100% - 12px) 100%, 0 100%, 12px 50%);
  cursor: grab; user-select: none; transition: opacity .12s, filter .12s;
}
.pv-focus-chev:active { cursor: grabbing; }
.pv-focus-chev.dragging { opacity: .4; }
/* 落点提示：整段提亮一档，比画条插入线简单，而且雪弗龙是咬合的、插入线画不干净 */
.pv-focus-chev.over { filter: brightness(1.35); }
/* 第一段左边是平口（没有上一段可咬），最后一段收成圆头当终点 */
.pv-focus-chev.first {
  margin-left: 0; padding-left: 22px;
  clip-path: polygon(0 0, calc(100% - 12px) 0, 100% 50%, calc(100% - 12px) 100%, 0 100%);
  border-radius: var(--pv-radius-btn) 0 0 var(--pv-radius-btn);
}
.pv-focus-chev.last {
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 12px 50%);
  border-radius: 0 999px 999px 0; padding-right: 26px;
}
.pv-focus-chev.first.last { clip-path: none; border-radius: var(--pv-radius-pill); }
.pv-focus-name { overflow: hidden; text-overflow: ellipsis; }
.pv-focus-rank {
  display: inline-flex; align-items: center; justify-content: center; flex: none;
  width: 17px; height: 17px; border-radius: 50%; font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 700;
  background: rgba(255, 255, 255, .26); color: #fff;
}
.pv-focus-edit {
  margin-left: auto; flex: none; border: 1px solid var(--pv-border); background: var(--pv-surface);
  color: var(--pv-text-soft); border-radius: var(--pv-radius-btn);
  width: 30px; height: 30px; padding: 0; font-size: calc(14px + var(--pv-fz-add2, 0px)); cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; line-height: 1;
}
/* 铅笔左右翻转。emoji 翻不了字形，只能整个元素镜像——所以它得单独包一层，
   不能直接翻按钮（那样连边框圆角一起镜像了）。 */
.pv-focus-edit-ico { display: inline-block; transform: scaleX(-1); }
.pv-focus-edit:hover { color: var(--pv-primary); border-color: var(--pv-primary); }

/* 变更记录：哪段时间按什么优先级过 */
.pv-focus-hist { margin-top: 16px; border-top: 1px solid var(--pv-border); padding-top: 12px; }
/* 折叠头：整条可点，右边跟一句说明。收起时不占地方，「保存」按钮也就不会被推很远 */
.pv-focus-hist-head {
  display: flex; align-items: center; gap: 7px; width: 100%;
  border: none; background: none; padding: 2px 0; cursor: pointer; text-align: left;
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-soft);
}
.pv-focus-hist-head:hover { color: var(--pv-primary-dark); }
.pv-focus-hist-chev { display: inline-block; transition: transform .15s; font-size: calc(11px + var(--pv-fz-add, 0px)); }
.pv-focus-hist-head.open .pv-focus-hist-chev { transform: rotate(90deg); }
.pv-focus-hist-cnt {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-faint);
}
.pv-focus-hist-sub { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-focus-hist-body { margin-top: 8px; }
.pv-focus-hist-row { padding: 7px 0; border-bottom: 1px dashed var(--pv-border); }
.pv-focus-hist-row:last-child { border-bottom: none; }
.pv-focus-hist-when {
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); font-variant-numeric: tabular-nums;
  display: flex; align-items: center; gap: 8px;
}
.pv-focus-hist-dur { color: var(--pv-text-faint); }
.pv-focus-hist-what { display: flex; align-items: baseline; gap: 8px; margin-top: 3px; flex-wrap: wrap; }
.pv-focus-hist-stage {
  flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700; padding: 1px 8px;
  border-radius: var(--pv-radius-pill);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark);
}
.pv-focus-hist-order { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); word-break: break-word; }
.pv-focus-hist-row.now .pv-focus-hist-when { color: var(--pv-primary-dark); font-weight: 600; }
/* 信条：整行占满、排在重点链下面。左边一道主色竖条 —— 按「强调色边不做圆角」的规矩，
   那一侧的两个角保持直角，其余角留圆。 */
.pv-focus-creed {
  flex: 1 1 100%; min-width: 0;
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  /* 颜色由 AI 测出的语气温度决定（见 focus-bar.js 的 creedStyle）：越积极向上越暖、
     越冷静思考越冷。这里写的是**测不出温度时的兜底**——冷蓝，跟暖橙主题区分开。
     inline style 会盖掉这三条，所以改主题不会影响已测温的那版。 */
  border-left: 4px solid #2563EB;
  border-radius: 0 var(--pv-radius-sm) var(--pv-radius-sm) 0;
  background: linear-gradient(90deg, #DCE8FD, #EAF1FE 60%, transparent);
  padding: 9px 14px; margin-top: 4px;
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); line-height: 1.65; letter-spacing: .01em;
  color: #1B4AC0;
}
.pv-focus-creed-label {
  /* color 继承父级 —— 父级的字色由 JS 按语气温度算（creedStyle），标签跟着一起冷暖，
     不能写死颜色，否则暖色块里杵着一个蓝标签。层次靠字号/字重/字距拉开，不靠颜色。 */
  flex: none; display: inline-flex; align-items: center; gap: 10px;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 800; color: inherit;
  letter-spacing: .04em; white-space: nowrap;
}
/* 标签和正文之间的小竖杠。用 ::after 而不是再加个 span——它是分隔符不是内容，
   不该进 DOM，也不该被复制粘贴带走。currentColor 让它同样跟着语气色走。 */
.pv-focus-creed-label::after {
  content: ''; display: block; width: 2px; height: 15px;
  border-radius: 1px; background: currentColor; opacity: .45;
}
.pv-focus-creed-text { flex: 1; min-width: 0; font-weight: 600; }
/* 句末的小 AI 备注：这块为什么是这个颜色。安静一档，别跟正文抢 */
.pv-focus-tone {
  flex: none; display: inline-flex; align-items: center; gap: 5px;
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 600; opacity: .72; white-space: nowrap;
  padding-left: 10px;
}
.pv-focus-tone-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
/* Highlights 可以换行写几条（弹窗里是 textarea），顶栏按原样换行显示 */
.pv-focus-creed-text { white-space: pre-line; }
/* 「当前重点」弹窗：四段（阶段 / 优先级 / Highlights / 变更记录），段与段之间一条虚线 */
/* 标题和这句说明之间原来空一大截（Element body 默认 padding-top 30px），用户 2026-09-08：行距太大 */
.pv-focus-dialog .el-dialog__body { padding: 4px 20px 16px; }
.pv-focus-dlg-note { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin: 0 0 10px; }
.pv-focus-sec { padding: 10px 0 12px; border-top: 1px dashed var(--pv-border); }
.pv-focus-sec-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.pv-focus-sec-title { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); white-space: nowrap; }
.pv-focus-sec-hint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 每行末尾的删除：跟 ↑↓ 同一排、同一副样子，悬停才变红 —— 它是偶尔用的，不该比排序按钮显眼 */
.pv-focus-item-moves button.del:hover { color: var(--pv-danger-text); border-color: var(--pv-danger); background: var(--pv-danger-soft); }
@media (max-width: 640px) {
  /* 手机上一行塞不下，备注换行到下面，别把正文挤成一列 */
  .pv-focus-tone { flex: 1 1 100%; padding-left: 0; white-space: normal; }
}
/* 手机端：链条横滑，别把 6 段挤成 6 行 */
@media (max-width: 640px) {
  .pv-focus-bar { padding: 8px 0 14px; }
  .pv-focus-inner { gap: 8px; }
  .pv-focus-mark { font-size: 19px; }
  .pv-focus-chain { flex-wrap: nowrap; overflow-x: auto; }
  .pv-focus-chev { font-size: 12.5px; padding: 6px 16px 6px 24px; }
  .pv-focus-creed { font-size: 13px; padding: 7px 11px; }
}
.pv-focus-stagebar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.pv-focus-stagebar .pv-chip-opt .el-icon-close { margin-left: 4px; opacity: .5; }
.pv-focus-stagebar .pv-chip-opt .el-icon-close:hover { opacity: 1; color: var(--pv-danger); }
.pv-focus-newstage { display: inline-flex; gap: 4px; align-items: center; margin-left: 4px; }
.pv-focus-list { display: flex; flex-direction: column; gap: 6px; }
.pv-focus-item {
  display: flex; align-items: center; gap: 10px; padding: 9px 12px;
  background: var(--pv-bg); border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  cursor: grab;
}
.pv-focus-item.dragging { opacity: .5; }
.pv-focus-item-rank { width: 20px; height: 20px; border-radius: 50%; background: var(--pv-primary); color: #fff; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; display: inline-flex; align-items: center; justify-content: center; }
.pv-focus-grip { color: var(--pv-text-faint); cursor: grab; }
.pv-focus-item-name { flex: 1; font-size: calc(15px + var(--pv-fz-add2, 0px)); }
/* 名字那一格是输入框，但平时要看着像纯文本：只有指上去 / 点进去才显出可改 */
.pv-focus-item-input {
  min-width: 0; font: inherit; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text);
  padding: 3px 7px; background: transparent; cursor: text;
  border: 1px solid transparent; border-radius: var(--pv-radius-btn);
}
.pv-focus-item-input:hover { border-color: var(--pv-border); background: var(--pv-surface); }
.pv-focus-item-input:focus {
  outline: none; background: var(--pv-surface); border-color: var(--pv-primary);
}
.pv-focus-item-moves button {
  border: 1px solid var(--pv-border); background: var(--pv-surface); border-radius: 6px;
  width: 26px; height: 26px; cursor: pointer; color: var(--pv-text-soft); margin-left: 2px;
}
.pv-focus-item-moves button:disabled { opacity: .35; cursor: default; }
@media (max-width: 640px) {
  .pv-focus-edit { margin-left: 0; }
  .pv-focus-stage { width: 100px; }
}

/* ---------- 股票模拟 (pv-stock-view) ---------- */
.pv-stock-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 14px; }
/* 占总盈亏那列：总盈亏接近 0 时表头挂个小叹号（用户 2026-09-21） */
/* 树上就地改：文件夹图标换颜色、状态角标切推进中（用户 2026-09-21）——都是按钮，悬停给点提示 */
.pv-pmo-row .pv-pmo-ico { border: 0; background: none; padding: 0; cursor: pointer; border-radius: 5px; }
.pv-pmo-row .pv-pmo-ico:hover { background: rgba(31, 36, 48, .08); }
button.pv-pmo-badge { border: 0; font-family: inherit; cursor: pointer; }
button.pv-pmo-badge:hover { filter: brightness(.94); }
.pv-pmo-badge.idle { background: var(--pv-bg); color: var(--pv-text-faint); font-weight: 400; }
.pv-pmo-tags { display: inline-flex; align-items: center; gap: 4px; flex-shrink: 0; }
/* 今天面板：PMO 那几类按项目归堆（用户 2026-09-22）——项目名一行小标题，底下是这个项目今天的几条；里程碑后面写还有几个子任务 */
.pv-cal-brief-proj { display: block; width: fit-content; max-width: 100%; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-soft); margin: 10px 0 3px; padding-bottom: 3px; border-bottom: 1px solid var(--pv-border); cursor: pointer; }   /* 顶上多留 4px（用户 2026-09-22） */
.pv-cal-brief-proj:hover { color: var(--pv-primary-dark); border-bottom-color: var(--pv-primary); }
/* 项目名就用灰字（用户 2026-09-23）：按类上色跟上面那枚大标签重复，读起来太花 */
.pv-cal-brief-sub:first-child > .pv-cal-brief-proj { margin-top: 4px; }
.pv-cal-brief-sub:has(> .pv-cal-brief-proj) { display: block; width: 100%; }
.pv-cal-brief-subn { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; margin-left: 2px; }
/* Best Practice（用户 2026-09-21）：日记里一个标记，不是分类——顶上一键只看这些，卡片上挂个星标小签 */
.pv-diary-best.active { background: var(--pv-accent-soft); border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-diary-best b { margin-left: 4px; font-weight: 700; }
.pv-gt-cat.pv-gt-best { background: var(--pv-primary); color: #fff; font-weight: 600; }
.pv-diary-bestck { margin-left: auto; }
/* 类型那行右边并排的几个勾（用户 2026-09-28：Best Practice / Improvement / 已分享） */
.pv-diary-marks { display: inline-flex; align-items: center; gap: 14px; margin-left: auto; letter-spacing: 0; }
.pv-diary-marks .pv-diary-bestck { margin: 0; white-space: nowrap; flex-shrink: 0; }
/* Improvement：跟 Best Practice 并排的另一个标记，用全站的蓝；「已分享」是它后面的完成态，绿 */
.pv-gt-cat.pv-gt-improve { background: var(--pv-cat-2); color: #fff; font-weight: 600; }
.pv-gt-cat.pv-gt-shared { background: var(--pv-success-soft); color: var(--pv-success); font-weight: 600; gap: 3px; }
.pv-gt-cat.pv-gt-shared i { font-size: 12px; }
/* Team Culture 小签：浅底同色字、方角 —— 跟实底圆角的分类签分开，一眼看出是另一个维度。颜色按四条的顺序发 */
.pv-cult-tag { --c: var(--pv-text-soft); display: inline-flex; align-items: center; height: 22px; box-sizing: border-box; padding: 0 8px; border-radius: 4px;
               font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1; font-weight: 500; white-space: nowrap; flex-shrink: 0;
               background: var(--pv-bg); color: var(--c); }
@supports (background: color-mix(in srgb, red 10%, white)) { .pv-cult-tag { background: color-mix(in srgb, var(--c) 13%, #fff); } }
.pv-cult-tag.c1 { --c: var(--pv-cat-1); } .pv-cult-tag.c2 { --c: var(--pv-cat-2); } .pv-cult-tag.c3 { --c: var(--pv-cat-3); }
.pv-cult-tag.c4 { --c: var(--pv-cat-4); } .pv-cult-tag.c5 { --c: var(--pv-cat-5); } .pv-cult-tag.c6 { --c: var(--pv-cat-7); }
.pv-cult-tag.na { --c: var(--pv-text-faint); }
.pv-cult-tags { display: flex; flex-wrap: wrap; gap: 6px; }
/* ---- Focus 面板（用户 2026-09-28）：数字卡 k / v / s 一排 + 按日子分组的任务卡 ---- */
.pv-gt-fstats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 18px; }
.pv-gt-fgroup + .pv-gt-fgroup { margin-top: 22px; }
.pv-gt-fgt { display: flex; align-items: center; gap: 8px; margin: 0 0 10px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px;
             font-weight: 700; color: var(--pv-text-soft); white-space: nowrap; }
.pv-gt-fgt b { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 700; color: var(--pv-text-faint); }
.pv-gt-fgt::after { content: ''; flex: 1; height: 1px; background: var(--pv-border); }
.pv-gt-focus .pv-task-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); }
/* 卡片照任务卡，只改两处：标题区两行高（任务卡是四行），底下多一段三行的正文；两段都定高，一排卡的横线才对得齐 */
.pv-tc.pv-gt-fc:not(.pv-wc) .pv-tc-head { height: calc(2 * 1.5 * (15px + var(--pv-fz-add2, 0px))); }   /* :not 是为了压过任务卡那条四行高的规则 */
.pv-tc.pv-gt-fc:not(.pv-wc) .pv-tc-title { -webkit-line-clamp: 2; font-weight: 600; }
.pv-tc.pv-gt-fc .pv-gt-flag { margin-right: 6px; }
.pv-gt-fc-body { height: calc(3 * 1.6 * (13px + var(--pv-fz-add, 0px))); font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text-soft);
                 display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; word-break: break-word; }
.pv-tc.pv-gt-fc .pv-tc-row .v.tags { display: inline-flex; justify-content: flex-end; gap: 4px; flex-wrap: wrap; white-space: normal; }
.pv-tc.pv-gt-fc .pv-tc-row .v.ok { color: var(--pv-success); font-weight: 600; }
.pv-tc.pv-gt-fc .pv-tc-check:disabled { cursor: default; }
@media (max-width: 640px) {
  .pv-gt-fstats { gap: 8px; }
  .pv-gt-fstats .pv-stat-card { padding: 10px; }
  .pv-gt-fstats .pv-stat-card .sub { display: none; }   /* 手机上只留标签和数 */
  .pv-tc.pv-gt-fc:not(.pv-wc) .pv-tc-head, .pv-gt-fc-body { height: auto; }
  .pv-gt-fc-body:empty { display: none; }
}
.pv-diary-bestck .el-checkbox__label { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); padding-left: 5px; }
/* 项目树：自己没被筛中、只是撑着层级的那一行（用户 2026-09-21）——名字淡一档，角标写它真实状态 */
.pv-pmo-row.ghost .pv-pmo-label { color: var(--pv-text-faint); font-weight: 400; }
.pv-pmo-row.ghost .pv-pmo-ico { opacity: .45; }
.pv-pmo-badge.ghost { background: var(--pv-bg); color: var(--pv-text-faint); font-weight: 400; }
.pv-stock-shaky { display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; margin-left: 4px; border-radius: 50%; background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: 10px; font-weight: 700; vertical-align: 1px; }
/* 顶部四颗按钮收一档（用户 2026-09-17：小一点但别太小，这是主操作）：38 → 32 高，字 13 */
.pv-stock-toolbar .el-button--small { height: 32px; line-height: 30px; padding: 0 14px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
/* 标题右边的小字备注：竖杠隔开，底边跟标题对齐 */
.pv-sp-title-note { align-self: flex-end; margin-left: 2px; padding: 0 0 5px 12px; border-left: 1px solid var(--pv-border); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.4; color: var(--pv-text-faint); white-space: nowrap; }
@media (max-width: 640px) { .pv-sp-title-note { display: none; } }
/* Element 给相邻 el-button 自带 10px 左外边距，跟上面的 gap 叠成 18px（用户 2026-09-08：间距太大）——只留 gap */
.pv-stock-toolbar .el-button + .el-button { margin-left: 0; }
/* 个股盈亏 / 交易流水两张表不要外层白框（用户 2026-09-08）：页面本身就是一块区域，只留行间横线 */
.pv-stock .pv-table-wrap { background: none; border: none; border-radius: 0; box-shadow: none; }
/* 去掉外框之后两块之间只剩一条行线贴着下一块的标题（用户 2026-09-08：间距太小）——标题上方拉开到 34px */
.pv-stock .pv-stock-sec-title { margin-top: 34px; }
.pv-stock .pv-stock-toolbar + .pv-stock-sec-title, .pv-stock .pv-stock-cards + .pv-stock-sec-title { margin-top: 26px; }
.pv-stock-quote-at { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 现价刷新闪动（雅虎风）：涨绿闪、跌红闪，底色 + 文字色短暂脉冲后自动褪去 */
.pv-stock-price { display: inline-block; padding: 1px 5px; border-radius: 4px; font-variant-numeric: tabular-nums; }
.pv-stock-price.flash-up { animation: pv-price-up .75s ease-out; }
.pv-stock-price.flash-down { animation: pv-price-down .75s ease-out; }
@keyframes pv-price-up {
  0% { background: rgba(34,197,94,.38); color: #16a34a; }
  100% { background: transparent; color: inherit; }
}
@keyframes pv-price-down {
  0% { background: rgba(229,37,45,.38); color: #dc2626; }
  100% { background: transparent; color: inherit; }
}
@media (prefers-reduced-motion: reduce) {
  .pv-stock-price.flash-up, .pv-stock-price.flash-down { animation: none; }
}
.pv-stock-float { font-size: calc(10px + var(--pv-fz-add, 0px)); color: var(--pv-warning-text); background: var(--pv-warning-soft); border-radius: 4px; padding: 0 3px; margin-left: 3px; }
.pv-stock-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-bottom: 18px; }
/* 竖向 flex、数字 margin-top:auto：大数字沉到卡片下半部（用户 2026-09-08：数字靠下）。
   「账户总盈亏（已实现 + 浮动）」那行小字撤了，右边几张卡对齐横线用的那个高度也归零。 */
.pv-stat-card {
  background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm); padding: 12px 14px;
  display: flex; flex-direction: column; --pv-stat-deltak-h: 0px;
}
.pv-stat-card .v { margin-top: auto; }
.pv-stat-card.wide { grid-column: span 2; }
.pv-stat-card .k { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-stat-card .v { font-size: 24px; font-weight: 700; color: var(--pv-text); margin: 2px 0; letter-spacing: -.3px; }
.pv-stat-card .v .unit { font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 500; color: var(--pv-text-soft); }
/* 说明行跟主卡片底下那行同一个待遇：空开一档、压一条细线。
   原来紧贴在大数字下面，一堆「现价 − 均价成本」挤在卡片上半部分，整排卡看着头重脚轻。

   横线要跟左边大卡片的那条**对齐到同一高度**。两种卡片上半部分的差别只有一处：
   大卡片在大数字底下多一行「账户总盈亏（已实现 + 浮动）」的小标签。
   所以右边这些卡要把那一行的高度补回来 —— 用变量写死这层关系，
   以后改小标签的字号只用改 --pv-stat-deltak-h 一处，不会又对不齐。 */
.pv-stock-cards { --pv-stat-deltak-h: 14px; }   /* = .pv-stat-deltak 的 line-height 16 + margin-top -2 */
.pv-stat-card .sub {
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  margin-top: calc(12px + var(--pv-stat-deltak-h)); padding-top: 10px;
  border-top: 1px solid var(--pv-border);
}
/* 风控那块是另一组卡，自己内部对齐就行，不用跟上面那排凑 */
.pv-risk-item .sub {
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--pv-border);
}
/* 账户总盈亏：跟在总资产后面，同一行。一大一小回答的是同一个问题，
   拆成两张卡反而要来回看。 */
.pv-stat-delta {
  font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; margin-left: 10px; letter-spacing: 0;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.pv-stat-delta em { font-style: normal; font-weight: 600; opacity: .75; margin-left: 4px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-stat-card .v .pv-stat-delta.up { color: var(--pv-success); }
.pv-stat-card .v .pv-stat-delta.down { color: var(--pv-danger); }
/* 高度写死成 16px：右边那几张卡要靠这个数把横线对齐（见 --pv-stat-deltak-h）。
   不写的话它跟着继承的 line-height 走，改一次正文行高两边就错开了。 */
.pv-stat-deltak {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 16px; color: var(--pv-text-faint); margin-top: -2px;
}
/* 主卡片底下那行「现金 / 持仓 / 本金」：账户的三个底数，是拿来对照上面那个总数的。
   跟总数之间空开一档、上面压一条细线 —— 它们是同一张卡里的第二层，不是并列的第二个结论。
   数字给主色：一眼看得出这三个是**基础量**，不是盈亏（盈亏是红绿）。 */
.pv-stat-base {
  display: flex; flex-wrap: wrap; gap: 6px 22px;
  margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--pv-border);
}
.pv-stat-base span { display: inline-flex; align-items: baseline; gap: 6px; }
.pv-stat-base i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-stat-base b {
  font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-primary-dark);
  font-variant-numeric: tabular-nums; letter-spacing: -.2px;
}

/* 交易规则公告栏：钉在总资产上面。原来折在页面最底下 ——
   一套自己给自己定的纪律，收在看不见的地方等于没定。
   做得克制（浅底、小字、一条一行），它是提醒不是主角。 */
.pv-stock-board {
  background: var(--pv-warning-soft); border: 1px solid var(--pv-warning-border);
  border-radius: var(--pv-radius-sm); padding: 10px 14px; margin-bottom: 14px;
}
.pv-stock-board-head {
  display: flex; align-items: baseline; gap: 8px;
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-warning-text); margin-bottom: 5px;
}
.pv-stock-board-head span { font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; opacity: .8; }
.pv-stock-board ul { margin: 0; padding-left: 18px; }
.pv-stock-board li {
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.85; color: var(--pv-text-soft);
}
.pv-stock-board li b { color: var(--pv-text); margin-right: 6px; }

/* 风控：跟股价关注同一套版式的一块。它不是"赚了多少"，是"今天还能亏多少" */
.pv-risk-grid {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
.pv-risk-item {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius-sm); padding: 10px 13px;
}
.pv-risk-item .k { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-risk-item .v {
  font-size: 20px; font-weight: 700; color: var(--pv-text);
  margin: 2px 0; letter-spacing: -.3px; font-variant-numeric: tabular-nums;
}
.pv-risk-item .v.up { color: var(--pv-success); }
.pv-risk-item .v.down { color: var(--pv-danger); }
.pv-risk-item .sub { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
/* 触线：整块转红底，这是条红线，不该只把数字改个颜色 */
.pv-risk-item.hot { background: var(--pv-danger-soft); border-color: var(--pv-danger-border); }
.pv-risk-item.hot .k { color: var(--pv-danger-text); font-weight: 700; }
.pv-stat-card .v.up, .pv-stat-card .sub.up, .pv-stock-table .pnl.up { color: var(--pv-success); }
.pv-stat-card .v.down, .pv-stat-card .sub.down, .pv-stock-table .pnl.down { color: var(--pv-danger); }
.pv-stock-table { width: 100%; border-collapse: collapse; font-size: calc(14px + var(--pv-fz-add2, 0px)); white-space: nowrap; }
.pv-stock-table th { text-align: right; padding: 8px 10px; color: var(--pv-text-faint); font-weight: 600; font-size: calc(12.5px + var(--pv-fz-add, 0px)); border-bottom: 1px solid var(--pv-border); }
.pv-stock-table th:first-child, .pv-stock-table td:first-child { text-align: left; }
.pv-stock-table td { text-align: right; padding: 9px 10px; border-bottom: 1px solid var(--pv-border); color: var(--pv-text-soft); }
.pv-stock-table td.code { font-weight: 600; color: var(--pv-text); }
.pv-stock-table td.pnl { font-weight: 600; }
.pv-stock-table tr.clickable { cursor: pointer; }
.pv-stock-table tr.clickable:hover td { background: var(--pv-bg); }
.pv-stock-badge { display: inline-block; font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 1px 8px; border-radius: var(--pv-radius-pill); }
.pv-stock-badge.open { background: var(--pv-warning-soft); color: var(--pv-warning-text); }
.pv-stock-badge.closed { background: var(--pv-bg); color: var(--pv-text-faint); }
/* 流水方向 chip：买入=蓝、卖出=橙 */
.pv-stock-dir { display: inline-block; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 9px; border-radius: var(--pv-radius-pill); white-space: nowrap; }
.pv-stock-dir.buy { background: var(--pv-info-soft); color: var(--pv-info-text); }
.pv-stock-dir.sell { background: var(--pv-accent-soft); color: var(--pv-primary-dark); }
.pv-stock-table td.muted { color: var(--pv-text-faint); }
.pv-stock-table td.note { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-stock-table td.nowrap { white-space: nowrap; }
/* 个股盈亏表分两段：「持仓中」/「已清仓」各一行小标签当分隔；已清仓那段整体淡一档，代码后挂一枚灰片 */
.pv-stock-table tr.pv-stock-seg td {
  text-align: left; padding: 10px 10px 4px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .04em;
  color: var(--pv-text-faint); border-bottom: none; background: none;
}
.pv-stock-table tr.closed td { color: var(--pv-text-faint); }
.pv-stock-table tr.closed td.code { color: var(--pv-text-soft); font-weight: 600; }
.pv-stock-tag {
  display: inline-block; margin-left: 6px; padding: 0 6px; height: 16px; line-height: 16px;
  border-radius: var(--pv-radius-pill); background: var(--pv-bg); color: var(--pv-text-faint);
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 600; vertical-align: 1px; white-space: nowrap;
}
.pv-stock-sec-sub { font-weight: 400; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-left: 6px; }
/* 持仓汇总 / 交易流水 小标题 */
/* 改成 flex：标题右边要放「＋ 关注」那颗按钮（靠一个弹性留白顶到最右） */
.pv-stock-sec-title {
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-soft); margin: 18px 0 8px;
}

/* ---------- 股价关注（苹果股市 App 关注区那种卡片）---------- */
.pv-watch-hint { font-weight: 500; color: var(--pv-text-faint); margin-left: 8px; }
/* 加代码那一行：点了「＋ 关注」才出来 */
.pv-watch-add { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
/* 卡片右上角的移除。只在「＋ 关注」打开时露出来 —— 平时一屏几十张卡，
   每张挂个 ✕ 太吵，而且手一滑就把在看的股票删了。 */
.pv-watch-del {
  flex: none; border: none; background: none; cursor: pointer; padding: 0;
  width: 18px; height: 18px; border-radius: 5px; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 1;
  color: var(--pv-text-faint); display: inline-flex; align-items: center; justify-content: center;
}
.pv-watch-del:hover { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-watch-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px; }
/* 卡底下的键值行（照飞书卡）：灰标签靠左、值靠右，跟上面价格行之间一道横线 */
.pv-watch-kv { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--pv-border); display: flex; flex-direction: column; gap: 4px; }
.pv-watch-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); min-width: 0; }
.pv-watch-row .k { flex: none; color: var(--pv-text-faint); }
.pv-watch-row .v { min-width: 0; color: var(--pv-text); font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-watch-row .v.up { color: var(--pv-success); font-weight: 600; }
.pv-watch-row .v.down { color: var(--pv-danger); font-weight: 600; }
/* 值 + 右侧百分比药丸（用户 2026-09-08）：药丸沿用价格行那颗的深色样式，缩小一号塞进 12px 的行里 */
.pv-watch-row .vv { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pv-watch-row .pv-watch-pill { min-width: 56px; font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 1px 6px; border-radius: 5px; }
/* 现价左边那 5px 是闪动底色的内边距，抵掉它让数字跟上面的代码左对齐 */
.pv-watch-price .pv-stock-price { margin-left: -5px; }
.pv-watch-card {
  background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-card-r);
  padding: 12px 14px 11px; display: flex; flex-direction: column; gap: 6px;
}
/* 持仓中：原来只有一圈浅蓝描边，跟已清仓的卡几乎分不出。
   改成左边一道实心蓝 + 浅蓝底 —— 强调边那两个角不做圆角（站内统一规矩）。 */
.pv-watch-card.hold {
  border-color: var(--pv-info-border); background: var(--pv-info-soft);
  border-left: 4px solid var(--pv-info); border-radius: 0 14px 14px 0;
}
.pv-watch-card.hold .pv-watch-code { color: var(--pv-info-text); }
.pv-watch-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.pv-watch-code { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); letter-spacing: .3px; }
.pv-watch-chip { font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 1px 8px; border-radius: var(--pv-radius-pill); white-space: nowrap; }
.pv-watch-chip.hold {
  background: var(--pv-info); color: #fff; font-weight: 700;
  /* 卡片底已经是浅蓝了，胶囊再用浅蓝就糊进去 —— 实心蓝才立得住 */
}
.pv-watch-chip.out { background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-watch-price { display: flex; align-items: baseline; gap: 6px; font-size: 22px; font-weight: 700; color: var(--pv-text); letter-spacing: -.3px; }
.pv-watch-chg { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; font-variant-numeric: tabular-nums; }
.pv-watch-chg.up { color: var(--pv-success); }
.pv-watch-chg.down { color: var(--pv-danger); }
.pv-watch-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.pv-watch-sub { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 涨跌胶囊：实心绿/红，跟苹果那颗一样是整张卡的视觉落点 */
.pv-watch-pill { flex: none; min-width: 62px; text-align: center; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; padding: 2px 8px; border-radius: 6px; font-variant-numeric: tabular-nums; }
.pv-watch-pill.up { background: var(--pv-success); color: #fff; }
.pv-watch-pill.down { background: var(--pv-danger); color: #fff; }
.pv-watch-pill.flat { background: var(--pv-bg); color: var(--pv-text-faint); }
@media (max-width: 640px) {
  .pv-watch-grid { grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); gap: 8px; }
  .pv-watch-card { padding: 10px 11px 9px; }
  .pv-watch-price { font-size: 19px; }
  .pv-watch-chg { display: none; }   /* 手机上只留胶囊里的涨跌%，少一个数字 */
}
.pv-stock-holdings { margin-top: 4px; }
.pv-stock-form-row { display: flex; gap: 10px; }
.pv-stock-form-row .el-form-item { flex: 1; }
@media (max-width: 640px) {
  .pv-stat-card .v { font-size: 20px; }
  .pv-stat-card.wide { grid-column: span 2; }
  .pv-stock-form-row { flex-direction: column; gap: 0; }
}

/* ---------- 主页板块 ---------- */
/* 横向快速切换：一次只看一块，不用滚穿整页 */
.pv-home-nav {
  display: flex; gap: 8px; flex-wrap: wrap;
  margin-bottom: 16px; padding-bottom: 12px;
  border-bottom: 1px solid var(--pv-border);
}
.pv-home-nav-pill {
  padding: 7px 16px; border-radius: var(--pv-radius-pill); cursor: pointer;
  font-size: 15.5px; color: var(--pv-text-soft);
  background: var(--pv-bg); border: 1px solid var(--pv-border);
  white-space: nowrap; user-select: none;
}
.pv-home-nav-pill:hover { color: var(--pv-text); }
.pv-home-nav-pill.active {
  background: var(--pv-primary); color: #fff; border-color: var(--pv-primary);
  font-weight: 600;
}
/* 多板块的空间页（小厨房那种一页四块）不再一块一个白框（用户 2026-09-03：不喜欢那些框）。
   块与块之间靠**标题 + 标题下面一道线**分开：标题放大一档、用主色（橙黄的深一档，浅底上读得清），
   线是全站那支边框灰。框没了，四块内容直接铺在页面上，一眼扫得到。
   编辑主页时给每块描一圈虚线（outline 不占位），好看出块的边界在哪。 */
.pv-home-block {
  position: relative;
  padding: 0;
  margin: 0 0 48px;     /* 块与块之间松一点：标题上面要有喘气的空（用户 2026-09-03） */
}
/* 第一块的标题离页面顶上那条线也远一点 */
.pv-home-cols:not(.solo) > .pv-home-block:first-child { margin-top: 8px; }   /* 28 太空（用户 2026-09-03） */
.pv-home-block > .pv-block { background: none; border: none; box-shadow: none; padding: 0; }
.pv-home-block.is-editing { outline: 1px dashed var(--pv-border); outline-offset: 10px; border-radius: var(--pv-radius); }
.pv-block-title {
  font-family: var(--title-font); font-weight: 700; font-size: 20px; letter-spacing: -.2px;
  color: var(--pv-primary-dark);
  padding-bottom: 8px; margin-bottom: 14px; border-bottom: 1px solid var(--pv-border);
}
.pv-block-bar {
  display: flex; align-items: center; gap: 4px;
  margin: -4px -4px 10px; padding: 4px 6px;
  background: var(--pv-bg); border-radius: var(--pv-radius-sm);
  font-size: calc(14px + var(--pv-fz-add2, 0px));
}
.pv-note { white-space: pre-wrap; line-height: 1.75; color: var(--pv-text); }
.pv-stat { padding: 6px 2px; }
.pv-stat-value { font-size: 36px; font-weight: 700; color: var(--pv-primary-dark); line-height: 1.1; }
.pv-stat-label { color: var(--pv-text-soft); margin-top: 4px; }

/* ---------- 公开只读页 ---------- */
.pv-public {
  min-height: 100dvh;
  background: radial-gradient(1000px 420px at 50% -8%, var(--pv-primary-soft), var(--pv-bg));
  padding: 32px 14px 60px;
}
.pv-public-inner { max-width: 760px; margin: 0 auto; }
.pv-public-head { display: flex; align-items: center; gap: 14px; margin-bottom: 22px; }
.pv-public-icon {
  width: 54px; height: 54px; border-radius: var(--pv-radius);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 30px; background: var(--pv-surface); box-shadow: var(--pv-shadow-sm);
}
.pv-public-head h1 { margin: 0; font-size: 25px; letter-spacing: -.3px; }
.pv-public-head .pv-muted { font-size: calc(15px + var(--pv-fz-add2, 0px)); margin-top: 3px; }
.pv-public-foot { text-align: center; color: var(--pv-text-faint); margin-top: 30px; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); }
@media (max-width: 640px) {
  .pv-public { padding-top: 20px; }
  .pv-public-head h1 { font-size: 22px; }
  .pv-home-block { padding: 14px; }
}

/* ---------- 快照 ---------- */
.pv-snap-row {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 0; border-bottom: 1px solid var(--pv-border);
}
.pv-snap-row:last-child { border-bottom: none; }
.pv-diff-table {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  padding: 10px 12px; margin-bottom: 10px;
}
.pv-diff-head { font-weight: 600; display: flex; align-items: center; gap: 6px; }
.pv-diff-change { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); padding: 3px 0; border-top: 1px dashed var(--pv-border); }

/* ============================================================
   日程视图 pv-schedule（回国日程 · 父母手机端友好）
   ============================================================ */
.pv-sched { max-width: none; }
.pv-sched-month {
  /* 桌面端 sidebar 布局没有横向顶栏遮住内容顶部，粘性定位只需要一点呼吸间距；
     手机端换回顶部窄条（pv-mobile-bar），粘性偏移要让开它的高度。 */
  position: sticky; top: 4px; z-index: 5;
  display: inline-block;
  margin: 18px 0 10px;
  padding: 4px 14px; border-radius: var(--pv-radius-pill);
  background: var(--pv-text); color: #fff;
  font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; letter-spacing: .5px;
}
@media (max-width: 640px) { .pv-sched-month { top: calc(var(--pv-header-h) + 4px); } }
.pv-public .pv-sched-month { top: 8px; }
.pv-sched-day {
  display: flex; gap: 14px;
  padding: 12px 12px;
  border-radius: var(--pv-radius-sm);
  border: 1px solid transparent;
  align-items: flex-start;
}
.pv-sched-day + .pv-sched-day { margin-top: 4px; }
.pv-sched-day.weekend { background: var(--pv-warning-soft); border-color: var(--pv-warning-border); }
.pv-sched-day.weekend .d { color: var(--pv-warning-text); }
/* 周六/周日徽章：weekend 行的星期标签做成实心小按钮，一眼区分 */
.pv-sched-day.weekend .pv-sched-date .w {
  display: inline-block; background: var(--pv-warning); color: #fff;
  font-weight: 600; padding: 1px 8px; border-radius: var(--pv-radius-pill); margin-top: 2px;
}
.pv-sched-day.past { opacity: .55; }
.pv-sched-day.today {
  background: var(--pv-primary-soft);
  border-color: #d6cfff;
}
.pv-sched-date { width: 46px; flex: none; text-align: center; }
.pv-sched-date .d { font-size: 23px; font-weight: 700; line-height: 1.1; }
.pv-sched-date .w { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-top: 1px; }
.pv-sched-day.today .d { color: var(--pv-primary-dark); }
.pv-sched-main { flex: 1; min-width: 0; }
.pv-sched-title { font-size: 17px; line-height: 1.55; white-space: pre-wrap; word-break: break-word; }
.pv-sched-title.empty { color: var(--pv-text-faint); }
.pv-loc-hl {
  color: #fff; background: var(--pv-danger); font-weight: 700; font-size: 21px;
  padding: 0 8px; border-radius: var(--pv-radius-sm); display: inline-block;
}
.pv-sched-tags { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 7px; }
.pv-sched-tag {
  display: inline-flex; align-items: center; gap: 3px;
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); padding: 1px 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-soft);
  border: 1px solid var(--pv-border);
}
.pv-sched-tag .dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }
/* 语义色：不上班（请假/周末）绿，上班（远程工作等）红 */
.pv-sched-tag.off  { background: var(--pv-success-soft); color: var(--pv-success-text); border-color: var(--pv-success-border); font-weight: 500; }
.pv-sched-tag.work { background: var(--pv-danger-soft); color: var(--pv-danger-text); border-color: var(--pv-danger-border); font-weight: 500; }
/* 地点变化标记（右侧） */
.pv-sched-loc {
  flex: none; align-self: flex-start;
  font-size: 16px; font-weight: 600; color: var(--pv-text-soft);
  background: var(--pv-bg); border: 1px solid var(--pv-border);
  padding: 5px 14px; border-radius: var(--pv-radius-pill); white-space: nowrap;
}
.pv-sched-note {
  display: block; max-width: 100%;
  margin-top: 8px; padding: 0;
  background: transparent; border: none;
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); line-height: 1.7;
  white-space: pre-wrap;
}
.pv-sched-note > div + div { margin-top: 4px; }
.pv-sched-note b { color: var(--pv-text); font-weight: 600; }
.pv-today-chip {
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); background: var(--pv-primary); color: #fff;
  padding: 1px 7px; border-radius: var(--pv-radius-pill); margin-top: 3px; display: inline-block;
}
.pv-sched-addbar {
  display: flex; gap: 8px; align-items: center;
  padding: 10px 12px; margin-bottom: 6px;
  background: var(--pv-bg); border: 1px dashed var(--pv-border);
  border-radius: var(--pv-radius-sm);
}
.pv-sched-addbar .pv-addbar-text { flex: 1; }
.pv-past-toggle {
  cursor: pointer; user-select: none; display: flex; align-items: center;
  width: fit-content; margin: 18px auto 22px;
  font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text-soft);
  padding: 6px 14px;
  background: var(--pv-bg); border: 1px solid var(--pv-border); border-radius: var(--pv-radius-pill);
  transition: background .12s, border-color .12s, color .12s;
}
.pv-past-toggle:hover {
  color: var(--pv-primary-dark); border-color: var(--pv-primary); background: var(--pv-primary-soft);
}
.pv-sched-actions { flex: none; opacity: 0; transition: opacity .15s; }
.pv-sched-actions .el-button { padding: 4px; margin-left: 2px; }
.pv-sched-day:hover .pv-sched-actions,
.pv-check-row:hover .pv-sched-actions { opacity: 1; }   /* 清单的行是 .pv-check-row，漏了它 */
@media (hover: none) { .pv-sched-actions { opacity: .6; } }

/* ============================================================
   清单视图 pv-checklist（待办事项 / 打包清单 · 按负责人分组的勾选列表）
   ============================================================ */
.pv-checklist { max-width: none; padding: 0 14px; }
/* 两栏：按类别/负责人分组时（没有截止日期）用双栏浏览更快；手机端收回单栏，更简洁。 */
.pv-check-groups.two-col { column-count: 2; column-gap: 28px; }
.pv-check-groupblock {
  break-inside: avoid; -webkit-column-break-inside: avoid;
  margin: 0 10px 18px; padding: 4px 4px 10px;
  border-radius: var(--pv-radius-sm);
  transition: background .12s, outline-color .12s;
}
.pv-check-groupblock.drop {
  background: var(--pv-primary-soft);
  outline: 1.5px dashed var(--pv-primary);
}
@media (max-width: 720px) { .pv-check-groups.two-col { column-count: 1; } }
/* 页面放开上限之后（--pv-page-max: none），超宽屏上两栏会变成两根一千七百像素的
   巨柱 —— 一条待办横跨大半个屏幕，比原来留白还难读。宽到一定程度就再劈一栏。 */
@media (min-width: 2000px) { .pv-check-groups.two-col { column-count: 3; } }
@media (min-width: 2900px) { .pv-check-groups.two-col { column-count: 4; } }
/* 分组标题有两副面孔，分岔点是「这个分组有没有自己的颜色」。
   原来一律是 20px 白字实心大胶囊 —— 那套是给**分区**用的（打包清单的行李箱、
   日记的观察区、按日期分的待办），颜色本身在传达信息。
   可一旦没有分区色，background 就退回 var(--pv-text-soft)：一颗又大又像按钮、
   其实点不动的灰块。功能开发记录（新功能 / Bug修复 / 优化改进 / 想法待定）
   正好撞在这个退化分支上，四颗灰胶囊排下来比条目本身还抢眼。
   所以默认改成安静的小标题，彩色胶囊留给真的有颜色可说的那几种。 */
.pv-check-group {
  display: inline-flex; align-items: center; gap: 7px;
  margin: 22px 0 8px; padding: 0; font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 700;
  color: var(--pv-text); letter-spacing: .15px;
  background: none; border-radius: 0;
}
.pv-check-group[class*="zone-"],
.pv-check-group.normal, .pv-check-group.soon, .pv-check-group.overdue {
  margin: 36px 0 16px; padding: 8px 16px; font-size: 20px;
  color: #fff; background: var(--pv-zone, var(--pv-text-soft));
  border-radius: var(--pv-radius-pill);
}
.pv-check-icon { font-size: calc(15px + var(--pv-fz-add2, 0px)); color: inherit; opacity: .9; flex: none; }
.pv-check-group[class*="zone-"] .pv-check-icon, .pv-check-group.normal .pv-check-icon,
.pv-check-group.soon .pv-check-icon, .pv-check-group.overdue .pv-check-icon { font-size: 18px; }
.pv-check-groupblock:first-child .pv-check-group:first-child { margin-top: 14px; }
.pv-check-group.soon { color: #fff; background: var(--pv-warning-text); }
.pv-check-group.overdue { color: #fff; background: var(--pv-danger-text); }
/* 观察分区 / 行李分区：标题 + 记录内容共用一套色变量 */
.pv-check-groupblock.zone-fun,
.pv-chip-box.zone-fun,
.pv-check-row.zone-fun,
.pv-chip.zone-fun {
  --pv-zone: #2A69B0; --pv-zone-soft: #E1EEFB; --pv-zone-border: #BBD7F2; --pv-zone-text: #245f9e;
}
.pv-check-groupblock.zone-best,
.pv-chip-box.zone-best,
.pv-check-row.zone-best,
.pv-chip.zone-best {
  --pv-zone: #1F7A45; --pv-zone-soft: #DFF3E6; --pv-zone-border: #B7E0C4; --pv-zone-text: #1a6b3c;
}
.pv-check-groupblock.zone-experiment,
.pv-chip-box.zone-experiment,
.pv-check-row.zone-experiment,
.pv-chip.zone-experiment {
  --pv-zone: #8A5600; --pv-zone-soft: #FBE8D3; --pv-zone-border: #DBB68D; --pv-zone-text: #7a4c00;
}
.pv-check-groupblock.zone-challenge-no,
.pv-chip-box.zone-challenge-no,
.pv-check-row.zone-challenge-no,
.pv-chip.zone-challenge-no {
  --pv-zone: #AE3A55; --pv-zone-soft: #FBE6EA; --pv-zone-border: #F2C4CE; --pv-zone-text: #9a334b;
}
.pv-check-groupblock.zone-challenge-yes,
.pv-chip-box.zone-challenge-yes,
.pv-check-row.zone-challenge-yes,
.pv-chip.zone-challenge-yes {
  --pv-zone: #6B4BA8; --pv-zone-soft: #EEE8FA; --pv-zone-border: #D8CBF0; --pv-zone-text: #5c4094;
}
.pv-check-groupblock.zone-bag-check,
.pv-check-row.zone-bag-check,
.pv-chip.zone-bag-check {
  --pv-zone: #2A69B0; --pv-zone-soft: #E1EEFB; --pv-zone-border: #BBD7F2; --pv-zone-text: #245f9e;
}
.pv-check-groupblock.zone-bag-cabin,
.pv-check-row.zone-bag-cabin,
.pv-chip.zone-bag-cabin {
  --pv-zone: #177268; --pv-zone-soft: #DBF2F0; --pv-zone-border: #AFDEDA; --pv-zone-text: #14665d;
}
.pv-check-groupblock.zone-bag-school,
.pv-check-row.zone-bag-school,
.pv-chip.zone-bag-school {
  --pv-zone: #8A5600; --pv-zone-soft: #FBE8D3; --pv-zone-border: #DBB68D; --pv-zone-text: #7a4c00;
}
.pv-check-groupblock.zone-bag-personal,
.pv-check-row.zone-bag-personal,
.pv-chip.zone-bag-personal {
  --pv-zone: #6B4BA8; --pv-zone-soft: #EEE8FA; --pv-zone-border: #D8CBF0; --pv-zone-text: #5c4094;
}
.pv-check-groupblock.zone-sub-top, .pv-chip-box.zone-sub-top, .pv-chip.zone-sub-top {
  --pv-zone: #2A69B0; --pv-zone-soft: #E1EEFB; --pv-zone-border: #BBD7F2; --pv-zone-text: #245f9e;
}
.pv-check-groupblock.zone-sub-main, .pv-chip-box.zone-sub-main, .pv-chip.zone-sub-main {
  --pv-zone: #1F7A45; --pv-zone-soft: #DFF3E6; --pv-zone-border: #B7E0C4; --pv-zone-text: #1a6b3c;
}
.pv-check-groupblock.zone-sub-laptop, .pv-chip-box.zone-sub-laptop, .pv-chip.zone-sub-laptop {
  --pv-zone: #8A5600; --pv-zone-soft: #FBE8D3; --pv-zone-border: #DBB68D; --pv-zone-text: #7a4c00;
}
.pv-check-groupblock.zone-sub-left, .pv-chip-box.zone-sub-left, .pv-chip.zone-sub-left {
  --pv-zone: #177268; --pv-zone-soft: #DBF2F0; --pv-zone-border: #AFDEDA; --pv-zone-text: #14665d;
}
.pv-check-groupblock.zone-sub-right, .pv-chip-box.zone-sub-right, .pv-chip.zone-sub-right {
  --pv-zone: #AE3A55; --pv-zone-soft: #FBE6EA; --pv-zone-border: #F2C4CE; --pv-zone-text: #9a334b;
}
.pv-check-groupblock.zone-sub-front, .pv-chip-box.zone-sub-front, .pv-chip.zone-sub-front {
  --pv-zone: #6B4BA8; --pv-zone-soft: #EEE8FA; --pv-zone-border: #D8CBF0; --pv-zone-text: #5c4094;
}
.pv-check-group[class*="zone-"] { color: #fff; background: var(--pv-zone); }
.pv-chip-box-title[class*="zone-"] {
  color: #fff; background: var(--pv-zone);
  display: inline-flex; padding: 4px 12px; border-radius: var(--pv-radius-pill);
  border-bottom: none; margin-bottom: 12px;
}
.pv-check-groupblock[class*="zone-"] .pv-check-tags .pv-sched-tag {
  color: var(--pv-zone-text); background: var(--pv-zone-soft);
  border-color: var(--pv-zone-border);
}
.pv-check-groupblock[class*="zone-"] .pv-sched-note {
  background: transparent; border: none; color: var(--pv-text-soft);
}
.pv-check-groupblock[class*="zone-"] .pv-sched-note b { color: var(--pv-text); }
.pv-check-groupblock[class*="zone-"] .pv-check-dot {
  background: var(--pv-zone);
}
.pv-check-groupblock[class*="zone-"] .pv-check-dot:hover { opacity: .85; }
.pv-check-groupblock[class*="zone-"] .pv-check-dot.on {
  background: var(--pv-zone);
}
.pv-chip[class*="zone-"] {
  border-color: var(--pv-zone-border);
  color: var(--pv-zone-text);
  background: #fff;
}
.pv-chip[class*="zone-"]:hover { border-color: var(--pv-zone); }
.pv-chip-box[class*="zone-"] {
  background: var(--pv-zone-soft);
  border-color: var(--pv-zone-border);
}
.pv-check-row {
  display: flex; gap: 9px; align-items: flex-start;
  padding: 8px 10px; border-radius: var(--pv-radius-sm);
  transition: background .12s, box-shadow .12s;
}
.pv-check-row.draggable { cursor: grab; }
.pv-check-row.draggable:active { cursor: grabbing; }
.pv-check-row.dragging { opacity: .45; }
.pv-check-row + .pv-check-row { margin-top: 4px; }
.pv-check-row.done { opacity: .5; }
/* 整行点击编辑：直接 hover 高亮这一行自己的框，不用负 margin 撑出一个额外的框——
   之前 .pv-row-editable 那种「内层元素负 margin 往外扩」的做法，在分区容器内边距
   很小的时候会顶到分区边缘，看着很挤。有分区色（zone-*）就顺着分区色高亮，没有就
   退回主橙色，跟其它清单（比如打包清单）保持一致。 */
.pv-check-row.editable { cursor: pointer; }
.pv-check-row.editable:hover {
  background: var(--pv-zone-soft, var(--pv-primary-soft));
  box-shadow: inset 0 0 0 1px var(--pv-zone-border, var(--pv-primary-border, rgba(42, 105, 176, .22)));
}
.pv-check-drop-hint {
  margin: 4px 10px 8px; padding: 14px 12px;
  border: 1px dashed var(--pv-border); border-radius: var(--pv-radius-sm);
  color: var(--pv-text-faint); font-size: calc(13.5px + var(--pv-fz-add, 0px)); text-align: center;
}
.pv-check-groupblock.drop .pv-check-drop-hint {
  border-color: var(--pv-primary); color: var(--pv-primary-dark); background: #fff;
}
.pv-check-dot {
  flex: none; width: 12px; height: 12px; margin-top: 7px;
  border-radius: 50%; border: none;
  background: var(--pv-zone, var(--pv-text-faint));
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; color: #fff; font-size: calc(10px + var(--pv-fz-add, 0px));
  transition: background .12s, transform .12s, opacity .12s;
}
.pv-check-dot:hover { opacity: .85; transform: scale(1.08); }
.pv-check-dot.on {
  width: 18px; height: 18px; margin-top: 4px;
  background: var(--pv-zone, var(--pv-primary));
  font-size: calc(12px + var(--pv-fz-add, 0px));
}
.pv-check-dot.disabled { cursor: default; }
.pv-check-dot.disabled:hover { opacity: 1; transform: none; }
.pv-check-main { flex: 1; min-width: 0; }
/* 备注在清单里收一档：功能开发记录那种条目的备注里带着整段四层留痕，
   14.5px 摊开会把标题整个压下去。日程那边不动（.pv-sched-note 两处共用）。 */
.pv-check-row .pv-sched-note { margin-top: 5px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.65; }
.pv-check-row .pv-sched-note > div + div { margin-top: 2px; }
/* 标题 + 行内评分星 同一行，星靠右 */
.pv-check-titlerow { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 3px; }
.pv-check-titlerow .pv-check-title { margin-bottom: 0; }
.pv-check-rate { flex-shrink: 0; line-height: 1; }
.pv-check-rate .el-rate { height: auto; }
/* 17px/650 是照分区卡片定的（一屏就几条、标题当主角）。可清单动辄几十条，
   那个字号让每一条都在喊，而且行与行之间要靠 10px 外边距才分得开，越拉越长。
   收到 15px/600 + 紧凑间距：一屏能多看进去一倍，条目之间靠 hover 底色分，不靠留白。 */
.pv-check-title {
  font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; line-height: 1.55;
  word-break: break-word; margin-bottom: 3px;
  color: var(--pv-zone-text, var(--pv-text));
}
.pv-check-row.done .pv-check-title { text-decoration: line-through; opacity: .75; }
/* 整卡点击编辑：保留展示样式，hover 时提示可点 */
.pv-row-editable {
  cursor: pointer; border-radius: var(--pv-radius-sm);
  margin: -10px -12px; padding: 12px 14px;
  transition: background .12s, box-shadow .12s;
}
.pv-row-editable:hover {
  background: var(--pv-primary-soft);
  box-shadow: inset 0 0 0 1px var(--pv-primary-border, rgba(42, 105, 176, .22));
}
.pv-check-tags {
  display: flex; flex-wrap: nowrap; align-items: center; gap: 6px;
  margin-top: 0; margin-bottom: 3px; overflow-x: auto;
}
.pv-check-tags .pv-sched-tag { flex: none; }
/* 标签模式（chipMode）：条目铺成可点的标签；组内有 subField 值（比如书包分区）的
   再套一层小容器，没有的直接摊平铺标签（.pv-chip-loose）——不是每个包都有内部分区，
   没有就不分，硬塞一个「未分类」容器反而多余。 */
.pv-chip-box {
  margin: 4px 6px 16px; padding: 14px 14px 16px;
  background: var(--pv-bg); border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
}
.pv-chip-box-title {
  display: flex; align-items: center; gap: 5px;
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-soft);
  margin-bottom: 12px; padding-bottom: 10px;
  border-bottom: 1px dashed var(--pv-border);
}
.pv-chip-loose { margin: 4px 6px 16px; }
.pv-chip-list { display: flex; flex-wrap: wrap; gap: 7px; }
.pv-chip {
  display: inline-flex; align-items: center; gap: 3px;
  font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1.4; padding: 5px 11px; border-radius: var(--pv-radius-pill);
  background: #fff; color: var(--pv-text); border: 1px solid var(--pv-border);
  cursor: pointer; transition: background .12s, border-color .12s, opacity .12s;
}
.pv-chip:hover { border-color: var(--pv-primary); }
.pv-chip.static { cursor: default; }
.pv-chip.static:hover { border-color: var(--pv-border); }
.pv-chip.done { opacity: .5; text-decoration: line-through; background: var(--pv-bg); }
.pv-chip.dragging { opacity: .45; }
.pv-chip-tag-icon { margin-right: 2px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); flex: none; }
.pv-chip-note-dot { color: var(--pv-primary); font-weight: 700; margin-left: -1px; }
.pv-chip-edit { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-left: 1px; }
.pv-chip-edit:hover { color: var(--pv-primary); }
.pv-edit-footer { display: flex; justify-content: space-between; align-items: center; }

/* ============================================================
   成长时间轴 pv-growth（Eason · 中轴左右交替 + 月份刻度 + 里程碑高亮）
   ============================================================ */
/* 筛选条：不用虚线框/浅底那套"盒中盒"视觉，紧贴内容、只留必要间距 */
.pv-gt-toolbar {
  display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
  padding: 0 0 10px; margin-bottom: 4px;
}
.pv-gt-toolbar-kw { min-width: 160px; }   /* 长相走全站 .pv-search */
.pv-gt-toolbar-sel { width: 140px; flex: none; }
@media (max-width: 640px) { .pv-gt-toolbar-sel { width: calc(50% - 4px); } }

/* 两栏：左边分类导航（照搬 watchlist/项目管理那套 .pv-wl-layout/.pv-pmo-nav-btn），
   右边搜索 + 时间轴。分类原来是顶上一排片，家人相关的记录常有十几个，横着摊平要占
   好几行；竖着排不占内容的横向空间，条数再多也只是往下长。没有分类字段的表
   （.has-side 不加）就是单栏，跟改之前一样。 */
.pv-gt-layout { display: grid; gap: 18px; align-items: start; grid-template-columns: minmax(0, 1fr); }
.pv-gt-layout.has-side { grid-template-columns: 178px minmax(0, 1fr); }   /* 148 → 178：窄了放不下（用户 2026-09-22） */
.pv-gt-side {
  display: flex; flex-direction: column; gap: var(--pv-nav-gap);
  position: sticky; top: calc(var(--pv-topbar-h) + 12px);
  max-height: calc(100vh - var(--pv-topbar-h) - 40px); overflow-y: auto;
}
/* 条目照文件夹页左栏那套 .pv-adm-nav-btn（14px、平时不铺底、选中主色浅底片），条数靠右当小角标 */
.pv-gt-side .pv-adm-nav-btn { font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-gt-side .pv-adm-nav-btn b { margin-left: auto; flex: none; font-weight: 700; opacity: .65; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
/* ---- 左栏分类树（核桃 → 孩子 → 家人）----
   行的长相照 .pv-adm-nav-btn（平时不铺底、选中主色浅底片、不加粗），三层字号 14 / 13 / 12.5，
   二三级往右缩 24px / 40px，缩进那段画一道竖线把一枝串起来（跟 .pv-adm-nav-sub::before 一个做法），
   三级再多一小横杠接到竖线上。三角只管折叠，名字才是筛选。 */
.pv-gt-tree { display: flex; flex-direction: column; gap: var(--pv-nav-gap); }
.pv-gt-tnode {
  position: relative; display: flex; align-items: center; gap: 2px;
  padding: 0 8px 0 3px; min-height: 30px; border-radius: 8px;
  color: var(--pv-text); font-size: calc(14px + var(--pv-fz-add2, 0px));
}
.pv-gt-tnode:hover { background: var(--pv-bg); }
.pv-gt-tnode.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-gt-tnode.lv2 { font-size: calc(13px + var(--pv-fz-add, 0px)); margin-left: 24px; }
.pv-gt-tnode.lv3 { font-size: calc(12.5px + var(--pv-fz-add, 0px)); margin-left: 40px; }
.pv-gt-tnode.lv2::before, .pv-gt-tnode.lv3::before {
  content: ""; position: absolute; left: -12px; top: calc(var(--pv-nav-gap) * -1); bottom: 0;
  border-left: 2px solid var(--pv-border);
}
.pv-gt-tnode.lv3::after {
  content: ""; position: absolute; left: -12px; top: 50%; width: 8px;
  border-top: 2px solid var(--pv-border);
}
.pv-gt-tnode.active::before, .pv-gt-tnode.active::after { border-color: var(--pv-primary); }
.pv-gt-tri {
  flex: none; width: 18px; height: 18px; border: none; background: none; padding: 0;
  display: grid; place-items: center; cursor: pointer; color: var(--pv-text-faint); border-radius: 4px;
}
.pv-gt-tri:hover { background: var(--pv-border); color: var(--pv-text); }
.pv-gt-tri::before {
  content: ""; border: 4px solid transparent; border-left: 5px solid currentColor; border-right-width: 0;
  transform: translateX(1px); transition: transform .15s;
}
.pv-gt-tri.open::before { transform: rotate(90deg) translateX(1px); }
.pv-gt-tri.ph { cursor: default; pointer-events: none; }
.pv-gt-tri.ph::before { display: none; }
.pv-gt-tname {
  flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px;
  border: none; background: none; font: inherit; color: inherit; text-align: left;
  padding: 5px 0 5px 2px; cursor: pointer;
}
.pv-gt-tname .pv-adm-nav-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-gt-tname b { margin-left: auto; flex: none; font-weight: 700; opacity: .65; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-gt-side .pv-pmo-nav-gtitle { margin-top: 6px; }
.pv-gt-side-mobile { display: none; }
/* 抽屉分类下面那行灰字：「↳ 自动归入 孩子 · 家人」 */
.pv-cat-hint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 4px; line-height: 1.5; }
.pv-gt-main { min-width: 0; }
@media (max-width: 860px) {
  /* 手机：竖栏躺平成一条横向滚动的片，不吸顶（页面本来就短） */
  .pv-gt-layout.has-side { grid-template-columns: 1fr; gap: 12px; }
  .pv-gt-side {
    position: static; max-height: none; flex-direction: row; gap: 6px;
    overflow-x: auto; padding-bottom: 2px;
  }
  .pv-gt-side .pv-pmo-nav-gtitle { display: none; }
  .pv-gt-side .pv-pmo-nav-group { display: flex; gap: 6px; margin: 0 !important; padding: 0 !important; border: none !important; }
  .pv-gt-side .pv-adm-nav-btn { width: auto; flex: none; border-radius: var(--pv-radius-pill); }
  .pv-gt-side .pv-adm-nav-btn b { margin-left: 5px; }
  /* 手机：树收起来，只横排叶子片 */
  .pv-gt-tree { display: none; }
  .pv-gt-side-mobile { display: contents; }
}

.pv-gt { position: relative; padding: 10px 0 30px; }
.pv-gt::before {
  content: ""; position: absolute; top: 0; bottom: 0; left: 50%;
  width: 2px; margin-left: -1px;
  background: linear-gradient(var(--pv-border), var(--pv-primary-soft));
  border-radius: 2px;
}
.pv-gt-month {
  position: relative; z-index: 2;
  width: fit-content; margin: 26px auto 14px;
  padding: 4px 16px; border-radius: var(--pv-radius-pill);
  background: var(--pv-text); color: #fff;
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 600; letter-spacing: 1px;
}
.pv-gt-row { position: relative; display: flex; margin-bottom: 18px; }
.pv-gt-row .pv-gt-card { width: calc(50% - 26px); }
.pv-gt-row.left { justify-content: flex-start; }
.pv-gt-row.right { justify-content: flex-end; }
.pv-gt-dot {
  position: absolute; left: 50%; top: 18px;
  width: 11px; height: 11px; margin-left: -5.5px; border-radius: 50%;
  background: var(--pv-surface); border: 3px solid var(--pv-primary);
  z-index: 2;
}
.pv-gt-row.hl .pv-gt-dot { border-color: var(--pv-accent); width: 13px; height: 13px; margin-left: -6.5px; }
.pv-gt-card {
  background: var(--pv-surface);
  border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius);
  box-shadow: var(--pv-shadow-sm);
  padding: 13px 16px;
  position: relative;
}
.pv-gt-row.hl .pv-gt-card {
  border-color: #f7ce8d;
  background: linear-gradient(180deg, #fffdf7, var(--pv-surface));
  box-shadow: 0 2px 8px rgba(245, 158, 11, .12);
}
.pv-gt-card.clickable { cursor: pointer; transition: box-shadow .12s, border-color .12s; }
.pv-gt-card.clickable:hover { border-color: var(--pv-primary); box-shadow: var(--pv-shadow); }
.pv-gt-card-del {
  position: absolute; top: 10px; right: 12px; font-size: calc(14px + var(--pv-fz-add2, 0px));
  color: var(--pv-text-faint); opacity: 0; transition: opacity .12s, color .12s;
}
.pv-gt-card:hover .pv-gt-card-del { opacity: 1; }
.pv-gt-card-del:hover { color: var(--pv-danger); }
/* 日期行（用户 2026-09-23：左边多了本子栏、卡片变窄，「9月22日 星期二」被劈成两行）：
   每一段自己不折行，整行放不下就整段掉到下一行；复盘小签永远贴右边 */
.pv-gt-date { font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-faint); display: flex; align-items: center; flex-wrap: wrap; gap: 2px 6px; }
.pv-gt-day, .pv-gt-lunar { white-space: nowrap; flex-shrink: 0; }
.pv-gt-title { font-size: 17px; font-weight: 650; margin: 11px 0 9px; letter-spacing: -.2px; }
.pv-gt-row.hl .pv-gt-title { font-size: 18px; }
.pv-gt-star { font-size: calc(15px + var(--pv-fz-add2, 0px)); }
/* 正文/备注现在渲染的是 Markdown（块级 HTML），不能再用 white-space:pre-wrap——
   否则 renderMarkdown 用 '\n' 连接的标签间换行会被当成真实空行，列表/段落全被撑开。 */
.pv-gt-body { font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); line-height: 1.7; word-break: break-word; }
.pv-gt-body > :first-child, .pv-gt-note > :first-child { margin-top: 0; }
.pv-gt-body > :last-child, .pv-gt-note > :last-child { margin-bottom: 0; }
/* 卡片正文比通用 .pv-md（1.85 行高 / 16.5px，给报告聊天用）更紧凑：行高小、段/项间距小。
   用 .pv-gt-body.pv-md 双类提高优先级压过后面的 .pv-md，否则会被它的宽松排版盖掉。 */
.pv-gt-body.pv-md { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1.55; }
.pv-gt-body.pv-md p { margin: 3px 0; }
.pv-gt-body.pv-md ul, .pv-gt-body.pv-md ol { margin: 3px 0; padding-left: 20px; }
.pv-gt-body.pv-md li { margin: 1px 0; }
.pv-gt-body.pv-md h2, .pv-gt-body.pv-md h3, .pv-gt-body.pv-md h4 { margin: 8px 0 3px; border: none; padding: 0; font-size: 15.5px; }
/* 卡片上的分类：只画最里那层（核桃），样式还是原来那枚按钮样的标签 —— 深色底白字
   （用户 2026-09-04：不要色点灰字，用回原来的）；完整路径在 title 里悬停看 */
/* ============================================================
   日记本三栏（用户 2026-09-28）：左「模块」（日记 / 知识 / 单词 / 全局，日记底下挂 Best Practice / Improvement 两个 Focus 面板）
   → 中间内容（时间轴 / Focus 卡片 / 卡片墙 / 词表）→ 右边 Team Culture + 这一本的分类树。
   2026-09-23 那版最左是一条 60px 的图标窄栏：左边有页面留白（16）、右边离分割线只有 5，两边明显不一样宽。
   现在左栏右边留的就是页面留白那个数，条目两侧一样宽。
   ============================================================ */
.pv-diary-left { flex: none; width: 228px; box-sizing: border-box; min-height: 0; overflow-y: auto;   /* 196 → 228（用户 2026-09-28：再宽一点） */
                 padding: 0 var(--pv-page-pad) 14px 0; margin-right: 20px; border-right: 1px solid var(--pv-border); }
/* 左栏的字跟右栏一样大（用户 2026-09-28）：Best Practice / Improvement 是缩进的二级条目，全站默认小一号（13），
   可右栏 Team Culture 那几条是 14，左右对着看一大一小 */
.pv-diary-left .pv-snav-item.d1, .pv-diary-left .pv-snav-item.d2 { font-size: calc(14px + var(--pv-fz-add2, 0px)); }   /* 左右两栏字一样大（用户 2026-09-28） */
/* 抽屉里的「标记」：Best Practice / Improvement 两颗胶囊（用户 2026-09-28），图标和字之间留一点 */
.pv-diary-markrow .pv-ct-type { display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0; }
.pv-diary-markrow .pv-ct-type i { font-size: 13px; }
/* 抽屉里的「分享给」：一排头像 + 分享时间，放不下就折行 */
.pv-diary-share { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; }
.pv-diary-share .el-date-editor { width: 150px; flex: none; }
.pv-drawer .pv-cult-pick .pv-ct-plan-types { margin-bottom: 2px; }
/* 收起 / 展开（用户 2026-09-28）：标题行右边一颗 26 的图标钮；收起后整栏只剩 44 宽，一颗图标一个本子 */
.pv-diary-foldbtn { flex: none; margin-left: auto; width: 26px; height: 26px; padding: 0; border: 0; border-radius: 6px; background: none;
                    color: var(--pv-text-faint); font-size: 16px; line-height: 1; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.pv-diary-foldbtn:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-snav-title .pv-diary-foldbtn { margin-right: -8px; }     /* 展开时贴到这一栏的右边缘（用户 2026-10-05）；高度不动 */
.pv-snav-title:has(.pv-diary-foldbtn) { display: flex; align-items: center; padding-right: 0; }
.pv-snav-title .pv-diary-foldbtn { margin-top: -5px; margin-bottom: -4px; }   /* 26 高的钮不把「模块」那行撑高：第一项跟别的模块页落在同一条线上（用户 2026-10-29） */
.pv-diary-foldbtn i { font-size: 14px; }
.pv-diary-left.fold { width: 44px; padding-right: 8px; margin-right: 16px; overflow: visible; }
.pv-diary-mini { display: flex; flex-direction: column; align-items: center; gap: 6px; }
.pv-diary-mini .pv-diary-foldbtn { margin: 0 0 6px; }
.pv-diary-mini-btn { width: 34px; height: 34px; padding: 0; border: 0; border-radius: var(--pv-radius-sm); background: none; cursor: pointer;
                     font-family: inherit; font-size: 17px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; }
.pv-diary-mini-btn:hover { background: var(--pv-bg); }
.pv-diary-mini-btn.on { background: var(--pv-brand-soft); }
/* 这本还没有分类：左栏只留管理入口 + 一句话 */
.pv-gt-side-empty p { margin: 10px 2px 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.7; color: var(--pv-text-faint); }
.pv-diary-bookname { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-left: 4px; white-space: nowrap; flex-shrink: 0; }
/* 知识本：卡片墙 */
.pv-gt-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; align-items: start; }
.pv-gt-card { border: 1px solid var(--pv-border); border-radius: 12px; background: var(--pv-surface); padding: 12px 14px; cursor: pointer;
              transition: border-color .12s, box-shadow .12s; }
.pv-gt-card:hover { border-color: var(--pv-primary); box-shadow: 0 6px 18px rgba(17, 24, 39, .06); }
.pv-gt-card-cats { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 6px; }
.pv-gt-card-cat { display: inline-flex; align-items: center; gap: 4px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 16px;
                  color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }
.pv-gt-card-cat .dot { width: 6px; height: 6px; border-radius: 50%; flex: none; }
.pv-gt-card-title { font-size: calc(14.5px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 1.45; color: var(--pv-text); }
.pv-gt-card-body { margin-top: 5px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text-soft);
                   display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.pv-gt-card-foot { display: flex; align-items: center; gap: 8px; margin-top: 9px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-gt-card-src { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-gt-card-date { margin-left: auto; flex: none; }
/* 单词本：一行一个词 */
.pv-gt-words { min-width: 0; }
.pv-gt-word { display: flex; align-items: center; gap: 10px; padding: 9px 10px; margin: 0 -10px; border-radius: 8px; cursor: pointer;
              border-bottom: 1px dashed var(--pv-border); }
.pv-gt-word:hover { background: var(--pv-bg); }
.pv-gt-word-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.pv-gt-word-w { font-size: calc(15px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 1.35; color: var(--pv-text); }
.pv-gt-word-def { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.4; color: var(--pv-text-faint);
                  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-gt-word-lv { flex: none; height: 20px; display: inline-flex; align-items: center; padding: 0 8px; border-radius: 4px;
                 font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1; white-space: nowrap; background: var(--pv-bg); color: var(--pv-text-soft); }
.pv-gt-word-lv.lv-新词 { background: #FDECEC; color: #B3261E; }
.pv-gt-word-lv.lv-熟悉 { background: #FCF0DC; color: #8A6516; }
.pv-gt-word-lv.lv-掌握 { background: #E6F4EA; color: #1E6B38; }
.pv-gt-word-lv.due { background: #FDECEC; color: #B3261E; }
/* 全局视图里卡片上的类型小签 */
.pv-gt-cat.pv-gt-kind { background: var(--pv-bg); color: var(--pv-text-soft); }
.pv-gt-cat.pv-gt-kind.k-知识 { background: #F0EBFA; color: #5B3FA8; }
.pv-gt-cat.pv-gt-kind.k-单词 { background: #E2F4F3; color: #10635E; }
@media (max-width: 860px) {
  /* 手机：左栏躺平成一排小片（pv-side-nav 自己会横过来），底下一道线 */
  .pv-work-body.pv-diary-body { display: block; }
  .pv-diary-left, .pv-diary-left.fold { width: auto; overflow: visible; border-right: 0; border-bottom: 1px solid var(--pv-border);
                   margin: 0 0 10px; padding: 0 0 8px; }
  /* 手机上这一栏本来就只占一行，不用收起：钮不画，收起态照样横着排 */
  .pv-diary-foldbtn { display: none; }
  .pv-diary-mini { flex-direction: row; justify-content: flex-start; }
}

/* 日记本左栏顶上只剩分类管理（用户 2026-09-22）：整宽、30 高，跟全站 .pv-addbtn 那一档齐 */
.pv-diary-cfg { display: block; margin-bottom: 8px; }
.pv-diary-cfg .pv-pmo-secbtn { width: 100%; height: 30px; justify-content: center; border-radius: 8px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
/* 右边这一排：记一笔和筛选胶囊同高（30），字号也拉齐 */
.pv-diary-modebar .pv-task-addbtn { font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
/* 这一排放不下就整组掉到下一行（用户 2026-09-28：多了一颗 Improvement，窄一点「Best Practice」就被挤成两行）；
   筛选片自己不换行、不压缩，实在太多就在这一组里横着滚 */
.pv-diary-modebar { flex-wrap: wrap; row-gap: 8px; }
.pv-diary-modebar .pv-filter-row { flex: none; max-width: 100%; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
.pv-diary-modebar .pv-filter-row::-webkit-scrollbar { display: none; }
.pv-diary-modebar .pv-ship-tab { white-space: nowrap; flex: none; }
/* 选中用全站那套浅黄（用户 2026-10-05：跟别的页统一）。日记容器里 --pv-primary* 被换成了海军蓝，所以这里用品牌黄的固定副本 --pv-brand* */
.pv-diary-root .pv-filter-row .pv-ship-tab.active, .pv-diary-root .pv-diary-kinds .pv-ship-tab.active { background: var(--pv-brand-soft); border-color: var(--pv-brand-soft); color: var(--pv-brand-dark); font-weight: 600; }
.pv-diary-root .pv-filter-row .pv-ship-tab.active b, .pv-diary-root .pv-diary-kinds .pv-ship-tab.active b { background: none; color: inherit; }
/* 分类 / Best Practice 小签：上下只有 1px padding 时字顶着边（用户 2026-09-22），
   改成固定 22 高再居中——不靠 padding 凑，行高压到 1 免得字被行距顶偏 */
.pv-gt-cat {
  display: inline-flex; align-items: center; height: 22px; box-sizing: border-box;
  font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1; color: #fff; white-space: nowrap; flex-shrink: 0;
  padding: 0 10px; border-radius: var(--pv-radius-pill); font-weight: 600;
}
/* ---- 日记卡片下的评论小卡片 ----
   正文是当时记下来的，评论是后来回头说的一句 —— 两层不能混，所以评论不进正文，
   而是贴在主卡片下面各成一张小卡，缩进 + 左边一道细线表示"从属于上面那条"。 */
.pv-gt-cmts { margin-top: 10px; padding-left: 10px; border-left: 2px solid var(--pv-border); }
/* 一条评论：左边头像（复用项目管理评论区那枚 .pv-pmo-face），右边 名字 · 时间 + 正文 */
.pv-gt-cmt {
  display: flex; align-items: flex-start; gap: 8px;
  background: var(--pv-bg); border-radius: var(--pv-radius-sm);
  padding: 7px 10px; margin-bottom: 6px;
}
.pv-gt-cmt-main { flex: 1; min-width: 0; }
.pv-gt-cmt-head {
  display: flex; align-items: center; gap: 8px; margin-bottom: 2px;
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint);
  font-variant-numeric: tabular-nums;
}
.pv-gt-cmt-who { color: var(--pv-text); font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap; }
.pv-gt-cmt-who-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; flex-wrap: wrap; }
.pv-gt-cmt-del {
  margin-left: auto; border: none; background: none; cursor: pointer; padding: 0;
  width: 18px; height: 18px; border-radius: 50%; color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px));
  display: inline-flex; align-items: center; justify-content: center;
}
.pv-gt-cmt-del:hover { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-gt-cmt-body { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text); white-space: pre-wrap; }
.pv-gt-cmt-add {
  border: 1px dashed var(--pv-border); background: none; color: var(--pv-text-faint);
  border-radius: var(--pv-radius-sm); padding: 4px 11px; font-size: calc(12px + var(--pv-fz-add, 0px));
  cursor: pointer; font-family: inherit; white-space: nowrap; flex-shrink: 0;
}
.pv-gt-cmt-add:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-gt-cmt-new textarea {
  width: 100%; box-sizing: border-box; resize: vertical; display: block;
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-btn);
  padding: 7px 9px; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6;
  color: var(--pv-text); background: var(--pv-surface);
}
.pv-gt-cmt-new textarea:focus { outline: none; border-color: var(--pv-primary); }
.pv-gt-cmt-act { display: flex; align-items: center; justify-content: flex-end; gap: 8px; margin-top: 6px; }
.pv-gt-cmt-hint { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }

.pv-gt-note {
  margin-top: 8px; padding: 7px 10px; background: var(--pv-bg);
  border-radius: var(--pv-radius-sm); font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft);
}
@media (max-width: 640px) {          /* 手机：轴靠左，单列 */
  .pv-gt::before { left: 14px; }
  .pv-gt-month { margin-left: 0; }
  .pv-gt-dot { left: 14px; margin-left: -4.5px; }
  .pv-gt-row.hl .pv-gt-dot { margin-left: -5.5px; }
  .pv-gt-row .pv-gt-card { width: calc(100% - 40px); }
  .pv-gt-row.left, .pv-gt-row.right { justify-content: flex-end; }
}

/* ============================================================
   AI 助手抽屉 pv-ai-chat + 右下角悬浮入口 pv-ai-fab
   ============================================================ */
.pv-ai-fab {
  position: fixed; right: 26px; bottom: 26px; z-index: 50;
  width: 54px; height: 54px; border-radius: 50%;
  background: linear-gradient(135deg, #FFC94A, var(--pv-primary-dark));
  color: #fff; font-size: 25px;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 16px rgba(201, 125, 7, .35), 0 1px 4px rgba(25, 27, 35, .15);
  cursor: pointer; transition: transform .15s ease, box-shadow .15s ease;
}
.pv-ai-fab:hover { transform: translateY(-2px) scale(1.05); box-shadow: 0 8px 22px rgba(201, 125, 7, .4); }
.pv-ai-fab.active { transform: scale(.92); }
@media (max-width: 640px) { .pv-ai-fab { right: 16px; bottom: 16px; width: 50px; height: 50px; font-size: 23px; } }

/* ============================================================
   开发需求小组件 pv-devlog-fab —— 跟 AI 助手竖排成右下角一组（它在上，AI 在下）。
   原来钉在左下角：那儿正好压住内容左下方，看着碍事。横排会在手机上把屏幕底部
   占掉一大条，所以竖排。尺寸跟 AI 那颗**完全一致**（54/50），两颗大小不一会显得
   像做歪了；靠配色区分主次就够（--pv-info 蓝 vs 主橙）。
   right 必须跟 AI 同值，否则两颗中心对不齐、竖着看是错开的。
   ============================================================ */
.pv-devlog-fab {
  position: fixed; right: 26px; bottom: 92px; z-index: 50;   /* 26 + 54(AI) + 12 间距 */
  width: 54px; height: 54px; border-radius: 50%;
  background: linear-gradient(135deg, #6EA8FF, var(--pv-info));
  color: #fff; font-size: 22px;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 16px rgba(37, 99, 235, .35), 0 1px 4px rgba(25, 27, 35, .15);
  cursor: pointer; transition: transform .15s ease, box-shadow .15s ease;
}
.pv-devlog-fab:hover { transform: translateY(-2px) scale(1.05); box-shadow: 0 8px 22px rgba(37, 99, 235, .4); }
.pv-devlog-fab.active { transform: scale(.92); }
.pv-devlog-fab i { font-size: 23px; }
@media (max-width: 640px) {
  /* 手机上跟着 AI 那颗一起往边上收，尺寸也照抄（AI: right16/bottom16/50px） */
  .pv-devlog-fab { right: 16px; bottom: 78px; width: 50px; height: 50px; }
  .pv-devlog-fab i { font-size: 21px; }
}
/* 拖动中：不要 hover 那个上浮动画（会跟手指对不上），光标也换成"抓着" */
.pv-devlog-fab.dragging, .pv-devlog-fab.dragging:hover {
  transform: none; cursor: grabbing; transition: none; box-shadow: 0 10px 26px rgba(37, 99, 235, .45);
}
.pv-devlog-fab { touch-action: none; }   /* 手机上按住拖时别让页面跟着滚 */
/* 抽屉里那条说明：写进去的东西去哪了 */
.pv-devlog-note {
  margin: 0 18px 12px; padding: 9px 12px; background: var(--pv-info-soft);
  border: 1px solid var(--pv-info-border); border-radius: var(--pv-radius-sm);
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.7; color: var(--pv-info-text); overflow: hidden;
}
.pv-devlog-note a { color: var(--pv-info-text); font-weight: 600; text-decoration: underline; }
/* 手机端这两颗都不出现：底部左右各钉一颗会压住内容两角，滑动老是先碰到它们。
   入口合并进右下角一颗 .pv-fabdock-main（见下），点开向上拉出一列动作。 */
@media (max-width: 640px) {
  .pv-devlog-fab, .pv-ai-fab { display: none !important; }
}

/* ============================================================
   手机端合并悬浮球 pv-fab-dock —— 一颗主球 + 向上拉出的动作列。
   主球尺寸/配色沿用 AI 那颗（54→手机 52、品牌橙），用户认得出它还是"老顾"；
   展开时主球转成 ✕，动作项从下往上依次淡入（40ms 一档），像从球里长出来。
   ============================================================ */
.pv-fabdock-scrim {
  position: fixed; inset: 0; z-index: 49;
  background: rgba(25, 27, 35, .28); backdrop-filter: blur(1.5px);
}
.pv-fabdock {
  position: fixed; right: 16px; bottom: calc(16px + env(safe-area-inset-bottom)); z-index: 50;
  display: flex; flex-direction: column; align-items: flex-end; gap: 10px;
}
.pv-fabdock-menu { display: flex; flex-direction: column; align-items: flex-end; gap: 10px; }
.pv-fabdock-act {
  display: flex; align-items: center; gap: 9px; border: none; background: none; padding: 0;
  font-family: inherit; cursor: pointer;
  opacity: 0; transform: translateY(10px) scale(.9); pointer-events: none;
  transition: opacity .16s ease, transform .16s ease;
}
.pv-fabdock.open .pv-fabdock-act { opacity: 1; transform: none; pointer-events: auto; }
.pv-fabdock-act-label {
  background: var(--pv-surface); color: var(--pv-text); font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600;
  padding: 6px 12px; border-radius: var(--pv-radius-pill);
  box-shadow: 0 2px 10px rgba(25, 27, 35, .18); white-space: nowrap;
}
.pv-fabdock-act-btn {
  width: 42px; height: 42px; border-radius: 50%; color: #fff; font-size: 19px;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 3px 12px rgba(25, 27, 35, .22);
}
.pv-fabdock-act-btn.ai { background: linear-gradient(135deg, var(--pv-primary), var(--pv-primary-dark)); }
.pv-fabdock-act-btn.devlog { background: linear-gradient(135deg, #6EA8FF, var(--pv-info)); }
.pv-fabdock-main {
  width: 52px; height: 52px; border-radius: 50%; border: none; padding: 0;
  background: linear-gradient(135deg, var(--pv-primary), var(--pv-primary-dark));
  color: #fff; font-size: 24px; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 16px rgba(201, 125, 7, .35), 0 1px 4px rgba(25, 27, 35, .15);
  transition: transform .18s ease;
}
.pv-fabdock-main.open { transform: rotate(90deg) scale(.94); }

.pv-devlog-drawer .el-drawer__body { padding: 0; height: 100%; overflow: hidden; }
.pv-devlog-body { height: 100%; overflow-y: auto; padding-bottom: 20px; }
.pv-devlog-head {
  display: flex; align-items: center; gap: 8px;
  padding: 16px 16px 12px; position: sticky; top: 0; z-index: 2;
  background: rgba(255, 255, 255, .92); backdrop-filter: blur(6px);
  border-bottom: 1px solid var(--pv-border);
}
.pv-devlog-title { font-weight: 700; font-size: 17px; }
/* 抽屉只有 440px 宽，checklist 的双栏布局在这么窄的空间里会挤得很难看——强制单栏 */
.pv-devlog-drawer .pv-check-groups.two-col { column-count: 1; }
/* AI 助手抽屉整体：左侧栏（历史对话）+ 右侧对话，仿 ChatGPT */
.pv-ai-drawer .el-drawer__body { padding: 0; height: 100%; overflow: hidden; }
.pv-chat-shell { display: flex; height: 100%; position: relative; }
.pv-chat-sidebar {
  width: 220px; flex: none; border-right: 1px solid var(--pv-border);
  padding: 14px 12px; display: flex; flex-direction: column; overflow: hidden;
  background: var(--pv-bg);
}
.pv-chat-conv-list { flex: 1; overflow-y: auto; margin: 0 -4px; }
.pv-chat-conv-item {
  display: flex; align-items: center; gap: 6px;
  padding: 8px 10px; border-radius: var(--pv-radius-sm); cursor: pointer;
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); margin-bottom: 2px;
}
.pv-chat-conv-item .t { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-chat-conv-item .del { opacity: 0; padding: 2px; color: var(--pv-danger); flex: none; }
.pv-chat-conv-item:hover { background: var(--pv-surface); }
.pv-chat-conv-item:hover .del { opacity: 1; }
.pv-chat-conv-item.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-chat-main { flex: 1; min-width: 0; display: flex; flex-direction: column; height: 100%; }
.pv-chat-mobile-bar { display: none; padding: 6px 10px; border-bottom: 1px solid var(--pv-border); }
@media (max-width: 640px) {
  .pv-chat-mobile-bar { display: block; }
  .pv-chat-sidebar {
    position: absolute; top: 0; left: 0; bottom: 0; width: 78vw; max-width: 280px;
    z-index: 5; box-shadow: var(--pv-shadow);
    transform: translateX(-100%); transition: transform .2s ease;
  }
  .pv-chat-sidebar.open { transform: translateX(0); }
}
.pv-chat { display: flex; flex-direction: column; height: 100%; min-height: 0; }
.pv-chat-msgs { flex: 1; overflow-y: auto; padding: 16px 18px; }
.pv-chat-msg { margin-bottom: 14px; display: flex; }
.pv-chat-msg.user { justify-content: flex-end; }
.pv-chat-bubble {
  max-width: 86%; padding: 10px 14px; border-radius: 14px;
  font-size: 15.5px; line-height: 1.7;
}
.pv-chat-msg.user .pv-chat-bubble {
  background: var(--pv-primary); color: #fff; border-bottom-right-radius: 4px;
}
.pv-chat-msg.ai .pv-chat-bubble {
  background: var(--pv-bg); border: 1px solid var(--pv-border);
  border-bottom-left-radius: 4px;
}
.pv-chat-input {
  border-top: 1px solid var(--pv-border); padding: 12px 14px;
  display: flex; gap: 8px; align-items: flex-end;
}
.pv-chat-hint { text-align: center; color: var(--pv-text-faint); font-size: calc(14px + var(--pv-fz-add2, 0px)); padding: 30px 20px; line-height: 2; }

/* ============================================================
   报告页 pv-report + markdown 渲染 pv-md + 简易图表 pv-bars
   ============================================================ */
.pv-report-card {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius); box-shadow: var(--pv-shadow);
  padding: 28px 30px; margin: 0 auto; max-width: 760px;
}
.pv-report-kicker { color: var(--pv-primary-dark); font-weight: 700; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); letter-spacing: 2px; }
.pv-report-card h1.pv-report-title { margin: 6px 0 2px; font-size: 26px; letter-spacing: -.3px; }
.pv-report-meta { color: var(--pv-text-faint); font-size: calc(14.5px + var(--pv-fz-add2, 0px)); margin-bottom: 18px; }
@media (max-width: 640px) { .pv-report-card { padding: 20px 16px; } }

/* 正文限宽：页面本身放开之后（--pv-page-max: none），只有连续文字这一种内容
   真的会因为太宽而没法读 —— 一行四十来个汉字是舒服的上限，再宽眼睛回不到行首。
   写成 max-width 而不是 width：塞进弹窗、抽屉这些本来就窄的容器里时它自动失效。 */
.pv-md { line-height: 1.85; font-size: 16.5px; max-width: 860px; }
.pv-md h1, .pv-md h2, .pv-md h3 { letter-spacing: -.2px; margin: 20px 0 8px; }
.pv-md h2 { font-size: 19px; border-bottom: 1px solid var(--pv-border); padding-bottom: 6px; }
.pv-md h3 { font-size: 17px; }
.pv-md ul, .pv-md ol { padding-left: 22px; margin: 6px 0; }
.pv-md li { margin: 3px 0; }
.pv-md p { margin: 8px 0; }
.pv-md code {
  background: var(--pv-bg); border: 1px solid var(--pv-border);
  border-radius: 5px; padding: 1px 5px; font-size: calc(14.5px + var(--pv-fz-add2, 0px));
}
/* 引用块照飞书（用户 2026-10-20）：左边一根灰竖条、字色收一档、整块一体；原来竖条是极浅的主色，看不出是引用 */
.pv-md blockquote {
  margin: 8px 0; padding: 2px 0 2px 12px; border-left: 3px solid var(--pv-text-faint);
  color: var(--pv-text-soft);
}
.pv-md blockquote p { margin: 2px 0; }
.pv-md blockquote > br { display: block; content: ""; height: .6em; }

.pv-bars { margin: 14px 0 4px; }
.pv-bars-title { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text-soft); margin-bottom: 8px; }
.pv-bar-row { display: flex; align-items: center; gap: 10px; margin: 5px 0; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); }
.pv-bar-label { width: 130px; flex: none; text-align: right; color: var(--pv-text-soft);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-bar-track { flex: 1; background: var(--pv-bg); border-radius: var(--pv-radius-pill); height: 12px; overflow: hidden; }
.pv-bar-fill { height: 100%; border-radius: var(--pv-radius-pill); background: linear-gradient(90deg, var(--pv-primary), #FFC94A); }
.pv-bar-val { width: 30px; flex: none; color: var(--pv-text-faint); }

/* ============================================================
   财务面板 pv-finance（家庭账单 · KPI + 趋势 + 类别/账户拆解）
   ============================================================ */
/* 录入财务数据快捷入口卡：明显、可点，左侧强调条（强调边不做圆角） */
.pv-fin-link {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin-bottom: 18px; padding: 14px 16px 14px 18px;
  background: var(--pv-info-soft); border: 1px solid var(--pv-info-border);
  border-left: 4px solid var(--pv-info);
  border-radius: 0 var(--pv-radius) var(--pv-radius) 0;
}
.pv-fin-link-info { flex: 1; min-width: 180px; }
.pv-fin-link-title { font-weight: 700; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-info-text); }
.pv-fin-link-sub { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-top: 3px; line-height: 1.4; }
.pv-fin-link-actions { display: flex; align-items: center; gap: 6px; }
.pv-fin-link-hide { color: var(--pv-text-faint); }
.pv-fin-link-hide:hover { color: var(--pv-text); }
/* 收起之后（用户 2026-10-26）：一行小字，没有底色没有框；「展开」回到整块 */
.pv-fin-link-min { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 14px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-fin-link-min .t { font-weight: 600; }
.pv-fin-link-min .pv-pmo-log-act { white-space: nowrap; }
@media (max-width: 640px) { .pv-fin-link-actions { width: 100%; } .pv-fin-link-actions .el-button--primary { flex: 1; } }
/* ===== 其他清单 pv-misc-lists-view（左清单栏 + 右条目）===== */
/* 原来是「左边一栏清单 + 右边条目」的两栏。用户要求改成顶部横排页签：
   清单本来就只有两三个，占掉左边 190px 一整栏不划算，横排一行就够。 */
.pv-ml { display: block; }
/* 其他清单的左栏：外壳套影视书籍的 .pv-wl-layout / .pv-wl-side，条目换成文件夹页那套
   .pv-adm-nav-btn（14px、平时不铺底、选中主色浅底片）—— 用户 2026-09-03 点名喜欢旅行助手那列。
   条数靠右当小角标；「＋ 新建清单」沉到列底（.pv-fold-side-foot 那条虚线）。 */
.pv-wl-side .pv-adm-nav-btn { font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-wl-side .pv-adm-nav-btn b { margin-left: auto; flex: none; font-weight: 700; opacity: .65; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-wl-side .pv-fold-side-foot { margin-top: 8px; }
/* 其他清单左栏穿小厨房那列的壳（.pv-fold-side）：网格里已经有列间距，去掉它自带的右外边距和上内边距 */
/* 不吸顶（position: static）：原来 sticky + 自己限高，右边换一个清单、页面高度一变，
   这列的落点就跟着跳（用户 2026-09-07：切换时按钮位置跳动）。静态排着，换清单纹丝不动。 */
.pv-wl-side.pv-ml-side2 {
  position: static; margin-right: 0; padding: 0 14px 14px 0;
  max-height: none; overflow: visible; align-self: start;
}
/* 购物清单行里「在哪买」那颗小下拉：跟买菜行里的超市一个尺寸 */
.pv-wish-loc { width: 132px; }
.pv-wish-loc .el-input__inner { height: 24px; line-height: 24px; font-size: calc(12px + var(--pv-fz-add, 0px)); text-align: right; padding-right: 22px; }
/* 购物清单卡（壳用任务卡 .pv-tc）：分类圆标、星那一行、买了 / 不要了的状态字 */
.pv-wc-emoji {
  flex: none; width: 28px; height: 28px; border-radius: 50%; background: var(--pv-bg);
  display: inline-flex; align-items: center; justify-content: center; font-size: calc(15px + var(--pv-fz-add2, 0px)); margin-top: -2px;
}
.pv-wc-rate { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding-bottom: 10px; border-bottom: 1px solid var(--pv-border); min-height: 22px; }
.pv-wc-rate .el-rate { height: auto; line-height: 1; }
.pv-wc-stars { color: #F7BA2A; letter-spacing: 2px; font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-wc-status { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-wc-status.bought { color: #2E7D46; font-weight: 600; }
.pv-tc.bought .pv-tc-title { color: var(--pv-text-soft); }
.pv-tc-row .v.over { color: var(--pv-danger); font-weight: 600; }
.pv-tc-row .v .pv-wish-loc { vertical-align: middle; }
/* 卡上「在哪买」那颗下拉（用户 2026-09-08：太丑、箭头还会上下跳）：
   平时像一行右对齐的文字，无边框无底；悬停 / 聚焦才出边框；整体高度钉在 22px，
   后缀区改成 flex 居中，箭头翻转时基线不再变。 */
.pv-wish-loc-card { width: 140px; }
/* 平时（没展开）：文字贴右、右边不给图标留位；展开编辑时才腾出 18px、露出箭头 / 清空叉
   （用户 2026-09-08：悬停就冒出个叉、把字挤离右边，很怪） */
.pv-wish-loc-card .el-input__inner {
  height: 22px; line-height: 22px; padding: 0 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); text-align: right;
  border: 1px solid transparent; background: transparent; color: var(--pv-text); border-radius: 5px;
  transition: padding-right .12s;
}
.pv-wish-loc-card .el-input__inner::placeholder { color: var(--pv-text-faint); }
.pv-wish-loc-card .el-input__suffix { right: 2px; height: 22px; display: none; align-items: center; }
.pv-wish-loc-card .el-input__suffix-inner { display: flex; align-items: center; }
.pv-wish-loc-card .el-input__icon { height: 22px; line-height: 22px; width: 14px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); transition: transform .2s; }
.pv-wish-loc-card .el-input.is-focus .el-input__suffix { display: flex; }
.pv-wish-loc-card .el-input.is-focus .el-input__inner { padding-right: 18px; }
.pv-wish-loc-card .el-input__inner:hover { border-color: var(--pv-border); background: var(--pv-surface); }
.pv-wish-loc-card .el-input.is-focus .el-input__inner { border-color: var(--pv-primary); background: var(--pv-surface); }
.pv-ml-side { width: 190px; flex-shrink: 0; display: flex; flex-direction: column; gap: 3px; }
.pv-ml-side-title { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); padding: 2px 8px 6px; letter-spacing: .04em; }
.pv-ml-item { display: flex; align-items: center; justify-content: space-between; gap: 8px;
  border: none; background: none; text-align: left; cursor: pointer; width: 100%;
  padding: 9px 12px; border-radius: var(--pv-radius); font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); transition: background .12s; }
.pv-ml-item .label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ml-item .count { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; flex-shrink: 0; }
.pv-ml-item:hover { background: var(--pv-bg); }
.pv-ml-item.active { background: var(--pv-accent-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-ml-item.active .count { color: var(--pv-primary-dark); }
.pv-ml-addlist { border: 1px dashed var(--pv-border); background: none; cursor: pointer; margin-top: 6px;
  padding: 8px 12px; border-radius: var(--pv-radius); font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); text-align: left; }
.pv-ml-addlist:hover { color: var(--pv-primary); border-color: var(--pv-primary); }
.pv-ml-main { flex: 1; min-width: 0; }
.pv-ml-head { font-size: 16px; font-weight: 700; color: var(--pv-text); margin-bottom: 12px; }
/* 左栏清单按钮的间距走全站的 --pv-nav-gap，不在这儿单独调 */
/* 条目之间不画线、悬停亮整行、字号小一档 —— 跟买菜清单同一套（用户 2026-09-03） */
.pv-ml-row {
  display: flex; align-items: center; gap: 12px; padding: 7px 6px;
  border-radius: var(--pv-radius-sm); transition: background .12s;
}
.pv-ml-row:hover { background: var(--pv-bg); }
.pv-ml-info { flex: 1; min-width: 0; }
.pv-ml-info .name { font-weight: 600; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-ml-link { display: inline-flex; align-items: center; gap: 2px; margin-left: 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 500;
  color: var(--pv-info-text); background: var(--pv-info-soft); border-radius: var(--pv-radius-pill); padding: 1px 8px; text-decoration: none; vertical-align: 1px; }
.pv-ml-link:hover { text-decoration: underline; }
.pv-ml-link i { font-size: calc(11px + var(--pv-fz-add, 0px)); }
.pv-ml-info .note { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-top: 2px; }
.pv-ml-rate { flex-shrink: 0; line-height: 1; }
.pv-ml-ops { display: flex; gap: 2px; flex-shrink: 0; }
.pv-ml-op { border: none; background: none; cursor: pointer; color: var(--pv-text-faint); width: 26px; height: 26px; border-radius: 50%; }
.pv-ml-op:hover { background: var(--pv-bg); color: var(--pv-primary); }
.pv-ml-op.del:hover { color: var(--pv-unread); }
@media (max-width: 640px) {
  .pv-ml { flex-direction: column; }
  .pv-ml-side { width: 100%; flex-direction: row; overflow-x: auto; gap: 6px; padding-bottom: 4px; }
  .pv-ml-side-title { display: none; }
  .pv-ml-item { width: auto; flex-shrink: 0; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-pill); padding: 6px 13px; }
  .pv-ml-addlist { margin-top: 0; flex-shrink: 0; white-space: nowrap; border-radius: var(--pv-radius-pill); }
}
/* ============================================================
   收支分析看板 pv-finance-dashboard —— 归到 laogu 的暖黄配色
   ============================================================
   看板整套结构是从 parse-statement 原样搬进来的，那边用的是 Tailwind 的
   slate/indigo/rose 一套冷灰配色，摆进老顾里像另一个应用。这里不去逐行重写
   那几十段模板字符串（改坏交互的风险远大于收益），而是把它用到的 Tailwind
   配色类在 .pv-fd 作用域内重新定义成本站的 token。

   为什么这样一定生效：Tailwind Play CDN 是运行时把样式插进 <head>，顺序上在
   tokens.css 之后；但 `.pv-fd .text-slate-400`（0,2,0）特异性高于 Tailwind 的
   `.text-slate-400`（0,1,0），跟先后无关，稳定压过。hover 变体同理多一级。

   只映射配色/描边/圆角，布局类（flex/grid/gap/w-*）一律不动。 */

/* —— 面板外壳：跟站内其它卡片同一套底色、描边、圆角 —— */
.pv-fd .panel {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius); padding: 20px;
}
.pv-fd .panel-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; flex-wrap: wrap; margin-bottom: .75rem; }
.pv-fd .panel-title { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text); line-height: 1.3; }
.pv-fd .panel-sub { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-fd .panel-hint { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.5; margin-bottom: .75rem; }
.pv-fd .bar { transition: height .3s ease, width .3s ease; }

/* —— 文字灰阶 → 本站三档 —— */
.pv-fd .text-slate-900, .pv-fd .text-slate-800 { color: var(--pv-text); }
.pv-fd .text-slate-700, .pv-fd .text-slate-600 { color: var(--pv-text-soft); }
.pv-fd .text-slate-500 { color: var(--pv-text-soft); }
.pv-fd .text-slate-400, .pv-fd .text-slate-300 { color: var(--pv-text-faint); }

/* —— 收支语义色：支出红 / 收入绿，取站内的 danger / success —— */
.pv-fd .text-rose-600, .pv-fd .text-rose-500 { color: var(--pv-danger-text); }
.pv-fd .text-emerald-600 { color: var(--pv-success-text); }
.pv-fd .text-indigo-600 { color: var(--pv-primary-dark); }

/* —— 描边 / 底色 —— */
.pv-fd .border-slate-300, .pv-fd .border-slate-200 { border-color: var(--pv-border); }
.pv-fd .border-slate-100, .pv-fd .border-slate-50 { border-color: var(--pv-border); }
.pv-fd .border-slate-400 { border-color: var(--pv-primary); }
.pv-fd .border-slate-600 { border-color: var(--pv-primary); }
.pv-fd .bg-white { background: var(--pv-surface); }
.pv-fd .bg-slate-50, .pv-fd .bg-slate-100 { background: var(--pv-bg); }
.pv-fd .rounded-xl { border-radius: var(--pv-radius); }

/* —— 分段控件：直接用全站那套筛选胶囊 .pv-ship-tab（扁平、选中黄底白字）——
   原来是 Tailwind 的连体分段控件（一个描边框里塞几个按钮、靠 border-l 分隔），
   跟站里其它地方的按钮完全不是一套，摆在一起很突兀。 —— */
.pv-fd-seg { display: inline-flex; flex-wrap: wrap; gap: 6px; }
/* 日程页那排：撑满一行，「⏰ 每天早上的提醒」穿着筛选片的壳靠右站（用户 2026-09-04：同一行、同一高度） */
.pv-cal-seg { display: flex; width: 100%; }
/* 「设置」跟这排页签放成一块（用户 2026-09-07），不再靠右飘；齿轮字号跟文字齐 */
.pv-cal-remind .el-icon-setting { font-size: calc(14px + var(--pv-fz-add2, 0px)); margin-right: 4px; }
.pv-fd .pv-ship-tab { white-space: nowrap; }

.pv-fd .bg-slate-600 { background: var(--pv-primary); }
.pv-fd .hover\:bg-slate-100:hover { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-fd .hover\:bg-slate-50:hover { background: var(--pv-primary-soft); }
.pv-fd .hover\:border-slate-400:hover { border-color: var(--pv-primary); }
.pv-fd .bg-slate-600.text-white, .pv-fd .bg-slate-600 { color: #fff; }
/* 分段控件外框：跟站内按钮同一档圆角 */
.pv-fd .rounded-md { border-radius: var(--pv-radius-btn); }

/* —— 柱子一律纯色平涂，不用渐变 ——
   旧版财务面板的柱子是 linear-gradient(180deg, #FFC94A, var(--pv-primary))，
   照搬过来后从上到下有明暗过渡，看着像打了高光的立体柱/玻璃条。这里要的是最
   质朴的平面观感，所以只留单一色值：支出＝品牌黄、收入＝站内绿。
   同理横条也不做左右渐变；按类别/按账户两组共用同一个黄，本来就分属两块面板、
   各有标题，不需要再靠颜色区分（此前那点色差反倒像画错了）。 */
.pv-fd .bg-rose-400 { background: var(--pv-primary); }
.pv-fd .bg-emerald-400 { background: var(--pv-success); }
.pv-fd .bg-indigo-400 { background: var(--pv-primary); }
.pv-fd input[type="range"] { accent-color: var(--pv-primary); }

/* 浮层阴影收到站内那两档，别用 Tailwind 那种大扩散阴影（也是"浮起来"的来源之一） */
.pv-fd .shadow-xl { box-shadow: var(--pv-shadow); }
.pv-fd .shadow-lg { box-shadow: var(--pv-shadow-sm); }

/* —— 悬浮浮窗：站内深色调而非 slate-800 —— */
.pv-fd .bg-slate-800, .pv-fd .bg-slate-900 { background: var(--pv-text); }
.pv-fd .text-rose-300 { color: #FFC94A; }
.pv-fd .text-emerald-300 { color: #6ee7b7; }

/* —— 下钻弹窗遮罩 —— */
.pv-fd .bg-slate-900\/40 { background: rgba(25, 27, 35, .4); }

/* —— KPI 卡：沿用旧版 .pv-fin-kpi 的排版（k/v/s 三行），但底色改白。
   旧版那条 background:var(--pv-bg) 是在白卡里用的；这里 .pv-block 本身透明、
   页面底就是 --pv-bg，同色会糊成一片，所以在看板作用域内改成 surface。 —— */
.pv-fd .pv-fin-kpi {
  background: var(--pv-surface); border-radius: var(--pv-radius);
}
.pv-fd .pv-fin-kpi.clickable { cursor: pointer; transition: border-color .12s; }
.pv-fd .pv-fin-kpi.clickable:hover { border-color: var(--pv-primary); }
/* KPI 卡三段 k / v / s：几张并排时 s 钉在卡底、v 占同样高度（pref 数字卡三段式） */
.pv-fd .pv-fin-kpi { display: flex; flex-direction: column; }
.pv-fd .pv-fin-kpi .v { flex: 1; display: flex; align-items: center; line-height: 1.15; }
.pv-fd .pv-fin-kpi .s { margin-top: auto; padding-top: 4px; }
/* 收入卡上 IMF / WB 两个数各自能点（用户 2026-10-26） */
.pv-fd-kpi-src { cursor: pointer; border-bottom: 1px dashed transparent; }
.pv-fd-kpi-src:hover { color: var(--pv-primary-dark); border-bottom-color: var(--pv-primary); }
/* 支出按类别 / 按账户那两列横条：整行可点，悬停浅底 */
.pv-fd-barrow { padding: 4px 6px; margin: 0 -6px; border-radius: 6px; cursor: pointer; }
.pv-fd-barrow:hover { background: var(--pv-primary-soft); }

/* —— 下钻：账目表（弹窗里、按月关注底下、收入明细里共用一副）—— */
.pv-fd-items-sum { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 8px; }
.pv-fd-items { width: 100%; border-collapse: collapse; font-size: calc(13px + var(--pv-fz-add, 0px)); font-variant-numeric: tabular-nums; }
.pv-fd-items th { text-align: left; font-weight: 500; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); padding: 4px 8px 6px; border-bottom: 1px solid var(--pv-border); white-space: nowrap; }
.pv-fd-items td { padding: 6px 8px; border-bottom: 1px solid var(--pv-border); vertical-align: top; }
.pv-fd-items tr:last-child td { border-bottom: 0; }
.pv-fd-items .d { white-space: nowrap; color: var(--pv-text-faint); }
.pv-fd-items .n { color: var(--pv-text); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-fd-items .a { white-space: nowrap; color: var(--pv-text-soft); }
.pv-fd-items .c { color: var(--pv-text-soft); }
.pv-fd-items .m { color: var(--pv-text-faint); max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-fd-items .r, .pv-fd-items th.r { text-align: right; white-space: nowrap; }
.pv-fd-items .inc { color: var(--pv-success-text); }
.pv-fd-items tr.go { cursor: pointer; }
.pv-fd-items tr.go:hover td { background: var(--pv-primary-soft); }
.pv-fd-items.compact td { padding: 4px 6px; }
.pv-fd-src { display: inline-block; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 6px; border-radius: 9px; background: var(--pv-bg); color: var(--pv-text-soft); }
@media (max-width: 640px) { .pv-fd-items .a, .pv-fd-items .m, .pv-fd-items th:nth-child(3), .pv-fd-items th:nth-child(5) { display: none; } }
/* 收入明细：三块并排，窄了竖排 */
.pv-fd-inc-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 18px; }
.pv-fd-inc-head { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; margin-bottom: 4px; cursor: pointer; display: inline-block; }
.pv-fd-inc-head:hover { text-decoration: underline; }

/* —— 下钻弹窗：站内的卡（圆角 12、细边、头一行标题 + ✕），不再是 Tailwind 那套 —— */
.pv-fd-modal { position: fixed; inset: 0; z-index: 3000; display: flex; align-items: center; justify-content: center; padding: 16px; }
.pv-fd-modal.hidden { display: none; }
.pv-fd-modal-bg { position: absolute; inset: 0; background: rgba(25, 27, 35, .4); }
.pv-fd-modal-card { position: relative; width: 100%; max-width: 900px; max-height: 82vh; display: flex; flex-direction: column; background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; box-shadow: var(--pv-shadow); }
.pv-fd-modal-head { display: flex; align-items: center; gap: 10px; padding: 12px 16px; border-bottom: 1px solid var(--pv-border); }
.pv-fd-modal-head h3 { margin: 0; flex: 1; min-width: 0; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-fd-modal-x { flex: none; width: 26px; height: 26px; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); font-size: 14px; cursor: pointer; }
.pv-fd-modal-x:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-fd-modal-body { padding: 12px 16px 16px; overflow: auto; }
@media (max-width: 640px) { .pv-fd-modal { padding: 0; align-items: flex-end; } .pv-fd-modal-card { max-height: 92vh; border-radius: 12px 12px 0 0; } }

/* 消费明细：从消费分析钻过来的那一行高亮两秒 */
.pv-sg-table tr.pv-sg-hl td { background: var(--pv-primary-soft); transition: background .6s; }
/* 月份胶囊：没数据的月淡掉（仍可点，跟原来一致） */
.pv-fd .pv-ship-tab.fd-empty { color: var(--pv-text-faint); opacity: .6; }
.pv-fd .pv-ship-tab.fd-empty.active { opacity: 1; color: #fff; }
.pv-fin-head { display: flex; align-items: center; margin-bottom: 12px; }
.pv-fin-kpis {
  display: grid; gap: 12px;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
}
.pv-fin-kpi {
  background: var(--pv-bg); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius-sm); padding: 12px 14px;
}
.pv-fin-kpi .k { font-size: calc(13.5px + var(--pv-fz-add, 0px)); letter-spacing: 1px; color: var(--pv-text-faint); }
.pv-fin-kpi .v { font-size: 24px; font-weight: 700; margin-top: 3px; }
.pv-fin-kpi .v.spend { color: var(--pv-danger-text); }
.pv-fin-kpi .v.income { color: var(--pv-success); }
.pv-fin-kpi .s { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 2px; }
.pv-fin-trend {
  display: flex; align-items: flex-end; gap: 6px;
  height: 130px; padding: 8px 2px 0;
}
.pv-fin-trend .col { flex: 1; min-width: 0; cursor: pointer; text-align: center; }
.pv-fin-trend .bars { display: flex; align-items: flex-end; justify-content: center; gap: 2px; height: 100px; }
.pv-fin-trend .bar { width: 45%; max-width: 16px; border-radius: 3px 3px 0 0; min-height: 2px; }
.pv-fin-trend .bar.e { background: linear-gradient(180deg, #FFC94A, var(--pv-primary)); }
.pv-fin-trend .bar.i { background: linear-gradient(180deg, #6ee7b7, #10b981); }
.pv-fin-trend .lbl { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 4px; }
.pv-fin-trend .col.focus .lbl { color: var(--pv-primary-dark); font-weight: 700; }
.pv-fin-trend .col.focus .bars { outline: 2px solid var(--pv-primary-soft); border-radius: 6px; }
.pv-fin-legend { display: flex; gap: 14px; font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-soft); margin: 6px 0 4px; }
.pv-fin-legend .sw { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 4px; }
.pv-fin-legend .sw.e { background: var(--pv-primary); }
.pv-fin-legend .sw.i { background: #10b981; }
.pv-fin-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-top: 16px; }
.pv-bar-fill.acc { background: linear-gradient(90deg, var(--pv-accent), #fbbf24); }
@media (max-width: 640px) { .pv-fin-cols { grid-template-columns: 1fr; } }

/* ============================================================
   饮食规划面板 pv-diet-planner（食堂小黑板 →「🍽️ 饮食规划」）
   ============================================================ */
.pv-dp-ask { display: flex; gap: 10px; align-items: flex-start; }
.pv-dp-ask .el-textarea { flex: 1; }
.pv-dp-ask .el-button { flex: none; }
.pv-dp-tip { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin: 8px 0 2px; }
.pv-dp-h3 {
  font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text);
  margin: 22px 0 10px; padding-top: 16px; border-top: 1px solid var(--pv-border);
}
.pv-dp-h3 .pv-muted { font-weight: 400; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-dp-empty { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); padding: 6px 0 2px; }

/* 一份规划一行；标了满意的整行换暖底 + 左侧一道主色边（强调边不做圆角） */
.pv-dp-item {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  margin-bottom: 8px; background: var(--pv-surface);
}
.pv-dp-item.liked {
  background: var(--pv-primary-soft); border-color: var(--pv-primary);
  border-left: 3px solid var(--pv-primary); border-radius: 0 var(--pv-radius-sm) var(--pv-radius-sm) 0;
}
.pv-dp-row { display: flex; align-items: center; gap: 10px; padding: 10px 12px; }
.pv-dp-star {
  flex: none; border: none; background: none; cursor: pointer; padding: 0;
  font-size: 20px; line-height: 1; color: var(--pv-border); transition: color .12s, transform .12s;
}
.pv-dp-star:hover { color: var(--pv-primary); transform: scale(1.12); }
.pv-dp-star.on { color: var(--pv-primary); }
.pv-dp-main { flex: 1; min-width: 0; cursor: pointer; }
.pv-dp-req { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); color: var(--pv-text); font-weight: 600; }
.pv-dp-meta { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 2px; }
.pv-dp-via {
  margin-left: 6px; padding: 0 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-info-soft); color: var(--pv-info-text); font-size: calc(11.5px + var(--pv-fz-add, 0px));
}
.pv-dp-del {
  flex: none; border: none; background: none; cursor: pointer;
  color: var(--pv-text-faint); font-size: calc(14px + var(--pv-fz-add2, 0px)); padding: 2px 4px;
}
.pv-dp-del:hover { color: var(--pv-danger); }
.pv-dp-body {
  padding: 2px 14px 14px 40px; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); line-height: 1.75; color: var(--pv-text);
  border-top: 1px solid var(--pv-border);
}
.pv-dp-body h1, .pv-dp-body h2, .pv-dp-body h3 { font-size: calc(15px + var(--pv-fz-add2, 0px)); margin: 14px 0 6px; }
.pv-dp-body ul, .pv-dp-body ol { padding-left: 20px; margin: 4px 0; }
.pv-dp-body p { margin: 6px 0; }

.pv-dp-rule { display: flex; align-items: center; gap: 8px; padding: 7px 2px; border-bottom: 1px solid var(--pv-border); }
.pv-dp-addrule { display: flex; gap: 8px; margin-top: 10px; }
.pv-dp-addrule .el-input { flex: 1; }
@media (max-width: 640px) {
  .pv-dp-ask { flex-direction: column; }
  .pv-dp-ask .el-button { width: 100%; }
  .pv-dp-body { padding-left: 14px; }
  /* 手机上一行塞不下四件东西：把「排进小黑板」挪到下一行整行 */
  .pv-dp-row { flex-wrap: wrap; }
  .pv-dp-row .el-button { width: 100%; margin-left: 0; }
}

/* 报告列表 */
.pv-report-row {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 16px; background: var(--pv-surface);
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  margin-bottom: 10px; cursor: pointer; transition: box-shadow .12s;
}
.pv-report-row:hover { box-shadow: var(--pv-shadow-sm); }

/* ============================================================
   想法与记录 pv-thought（数据源：飞书表格）
   ============================================================ */
.pv-thought-input {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius); padding: 14px; margin-bottom: 22px;
  box-shadow: var(--pv-shadow-sm);
}
.pv-thought-group { margin-bottom: 18px; }
.pv-thought-date {
  font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text-faint);
  letter-spacing: 1px; margin: 0 0 8px 2px;
}
.pv-thought-card {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius-sm); padding: 12px 15px; margin-bottom: 8px;
}
.pv-thought-text { line-height: 1.75; white-space: pre-wrap; word-break: break-word; }

/* ============================================================
   本地图标选择器 pv-icon-picker（搜索 + 单选网格）
   ============================================================ */
.pv-icon-picker-kw { margin-bottom: 8px; }
.pv-icon-picker-grid {
  display: flex; flex-wrap: wrap; gap: 4px; max-height: 180px; overflow-y: auto;
  padding: 6px; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
}
.pv-icon-picker-cell {
  cursor: pointer; font-size: 20px; line-height: 1; padding: 5px 7px;
  border-radius: 6px; transition: background .12s;
}
.pv-icon-picker-cell:hover { background: var(--pv-bg); }
.pv-icon-picker-cell.active { background: var(--pv-primary-soft); }

/* ============================================================
   字段管理面板 pv-field-manager（日记）
   ============================================================ */
.pv-fieldmgr-row {
  display: flex; align-items: center; gap: 8px; padding: 7px 4px;
  border-bottom: 1px solid var(--pv-border); font-size: calc(14px + var(--pv-fz-add2, 0px));
}
.pv-fieldmgr-row:last-of-type { border-bottom: none; }
.pv-fieldmgr-row .ficon { width: 20px; text-align: center; color: var(--pv-text-faint); font-size: calc(14px + var(--pv-fz-add2, 0px)); }
/* 表头字段名前那枚类型小图标（字体图标）：淡一档、比字小一号，只是个提示 */
.pv-field-tico { color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); margin-right: 2px; }
/* 文本类型那枚「abc」：小字块，不是 emoji 也不是字体图标，跟别的图标一个颜色一个高度 */
.pv-tico-abc {
  display: inline-block; font: 700 8.5px/12px ui-monospace, Menlo, monospace; letter-spacing: .02em;
  color: var(--pv-text-faint); border: 1px solid currentColor; border-radius: 3px; padding: 0 3px;
  vertical-align: 1px; white-space: nowrap; flex: none;   /* 字段管理那列图标格只有 20px，不许它折成「ab / c」 */
}
.pv-fieldmgr-row .ficon { width: auto; min-width: 20px; flex: none; }
.pv-pmo-secbtn i { font-size: calc(13px + var(--pv-fz-add, 0px)); margin-right: 2px; vertical-align: -1px; }
.pv-fieldmgr-row .fname { font-weight: 600; min-width: 72px; }
.pv-fieldmgr-row .ftype { color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-fieldmgr-row .fopts {
  flex: 1; min-width: 0; color: var(--pv-text-soft); font-size: calc(12.5px + var(--pv-fz-add, 0px));
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pv-fieldmgr-row .factions { margin-left: auto; white-space: nowrap; }
.pv-fieldmgr-add {
  margin-top: 10px; padding: 8px; text-align: center; cursor: pointer;
  border: 1px dashed var(--pv-border); border-radius: var(--pv-radius-sm);
  color: var(--pv-text-soft); font-size: calc(13.5px + var(--pv-fz-add, 0px));
}
.pv-fieldmgr-add:hover { color: var(--pv-primary); border-color: var(--pv-primary); }
/* ---- 字段管理 → 分组层级：左边一张窄表（选项 | 上级 | 完整路径），右边实时预览树 ----
   用户 2026-09-03：表别太宽，选项那列不用留那么宽（标签名都短）。 */
.pv-fh { margin-top: 4px; padding-top: 10px; border-top: 1px dashed var(--pv-border); }
.pv-fh-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
.pv-fh-title { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; }
.pv-fh-hint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-fh-body { display: grid; grid-template-columns: minmax(0, 1fr) 150px; gap: 14px; }
.pv-fh-table { min-width: 0; }
.pv-fh-tr {
  display: grid; grid-template-columns: minmax(88px, 1.1fr) 132px minmax(0, 1.3fr) 26px; gap: 8px;
  align-items: center; padding: 3px 0; font-size: calc(13px + var(--pv-fz-add, 0px));
}
.pv-fh-tr.flat { grid-template-columns: minmax(0, 1fr) 26px; }
.pv-fh-tr:not(.pv-fh-th):hover { background: var(--pv-bg); border-radius: 6px; }
/* 选项名平时是文字，点一下才变输入框（全站两态编辑那一套） */
.pv-fh-optname { cursor: text; border-bottom: 1px dashed transparent; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.pv-fh-tr:hover .pv-fh-optname { border-bottom-color: var(--pv-border); }
.pv-fh-optin { flex: 1; min-width: 0; height: 24px; padding: 0 6px; border: 1px solid var(--pv-primary); border-radius: 6px;
               font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); background: var(--pv-surface); outline: 0; }
.pv-fh-del { display: flex; justify-content: flex-end; }
/* 选项树（用户 2026-09-22）：Element 的 el-tree，拖一下就换层级 */
.pv-fh-tree { max-height: 46vh; overflow: auto; margin-top: 2px; }
.pv-fh-tree .el-tree-node__content { height: 32px; border-radius: 6px; }
.pv-fh-tree .el-tree-node__content:hover { background: var(--pv-bg); }
.pv-fh-node { display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0; padding-right: 4px;
              font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-fh-node .dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
.pv-fh-acts { margin-left: auto; display: flex; gap: 2px; opacity: 0; transition: opacity .12s; }
.el-tree-node__content:hover .pv-fh-acts, .pv-fh-acts:focus-within { opacity: 1; }
.pv-fh-acts .pv-ct-cfg-ib { width: 24px; height: 24px; border: 0; background: none; border-radius: 6px;
                            color: var(--pv-text-faint); cursor: pointer; font-size: 13px; }
.pv-fh-acts .pv-ct-cfg-ib:hover { background: var(--pv-surface); color: var(--pv-text); }
.pv-fh-acts .pv-ct-cfg-ib.danger:hover { background: #FDECEC; color: var(--pv-danger); }
/* 分类级联选择器：多选时标签全摊开、按宽度换行（跟原来那个多选下拉一个脾气） */
.pv-cat-casc .el-cascader__tags { flex-wrap: wrap; }
.pv-cat-casc .el-cascader__tags .el-tag { max-width: 100%; }
.pv-fh-del .pv-ct-cfg-ib { width: 24px; height: 24px; border: 0; background: none; border-radius: 6px; color: var(--pv-text-faint); cursor: pointer; font-size: 13px; }
.pv-fh-del .pv-ct-cfg-ib:hover { background: #FDECEC; color: var(--pv-danger); }
.pv-fh .pv-addrow { margin-bottom: 8px; }
.pv-fh-th { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); border-bottom: 1px solid var(--pv-border); padding-bottom: 4px; margin-bottom: 2px; }
.pv-fh-opt { display: flex; align-items: center; gap: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-fh-opt .dot, .pv-fh-pnode .dot { width: 7px; height: 7px; border-radius: 50%; flex: none; display: inline-block; }
.pv-fh-sel { width: 100%; }
.pv-fh-path { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-fh-preview { border-left: 1px solid var(--pv-border); padding-left: 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); min-width: 0; }
.pv-fh-ptitle { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 6px; }
.pv-fh-pnode { display: flex; align-items: center; gap: 6px; padding: 2px 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-fh-pnode.d1 { padding-left: 14px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-fh-pnode.d2 { padding-left: 28px; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-fh-foot { display: flex; align-items: center; gap: 10px; margin-top: 10px; flex-wrap: wrap; }
@media (max-width: 640px) {
  .pv-fh-body { grid-template-columns: 1fr; }
  .pv-fh-preview { border-left: none; padding-left: 0; border-top: 1px solid var(--pv-border); padding-top: 8px; }
}

/* ============================================================
   分类管理面板（Folder 启用/禁用，见 views-spaces.js）
   ============================================================ */
.pv-folder-admin-row {
  display: flex; align-items: center; gap: 10px; padding: 8px 4px;
  border-bottom: 1px solid var(--pv-border);
}
.pv-folder-admin-row:last-child { border-bottom: none; }
.pv-folder-admin-row .icon { font-size: 20px; width: 28px; text-align: center; }
.pv-folder-admin-row .name { flex: 1; min-width: 0; }
.pv-folder-admin-row.is-disabled .name { color: var(--pv-text-faint); }
.pv-thought-meta { margin-top: 6px; font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-faint); }

/* ===== 孩子视频推荐 pv-kid-videos-view ===== */
.pv-kv-add { display: flex; gap: 8px; margin-bottom: 14px; flex-wrap: wrap; }
.pv-kv-add-input { flex: 1; min-width: 200px; }
/* 顶部筛选工具条：左侧两行同级选择器，右侧工具（隐藏已看 / 编辑孩子）顶部对齐 */
.pv-kv-toolbar { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; flex-wrap: wrap; margin-bottom: 16px; }
.pv-kv-filters { display: flex; flex-direction: column; gap: 8px; flex: 1; min-width: 0; }
.pv-kv-tools { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }
.pv-kv-filter { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pv-kv-filters .pv-kv-filter { margin-bottom: 0; }
/* 两行标签等宽 → 两行的 chip 左边缘对齐 */
.pv-kv-filter-label { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); min-width: 62px; white-space: nowrap; }
/* 大类 Tab（醒目、给孩子选）+ 顶部工具行 */
.pv-kv-top { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-kv-cattabs { display: inline-flex; gap: 6px; flex-wrap: wrap; }
.pv-kv-cattab { border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft);
  font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 600; padding: 7px 18px; border-radius: var(--pv-radius-pill); cursor: pointer; transition: all .12s; }
.pv-kv-cattab:hover { border-color: var(--pv-primary); }
.pv-kv-cattab.active { background: #475569; border-color: #475569; color: #fff; }      /* 全部 */
.pv-kv-cattab.study.active { background: var(--pv-info); border-color: var(--pv-info); }  /* 学习=蓝 */
.pv-kv-cattab.fun.active { background: #22C55E; border-color: #22C55E; }  /* 娱乐=绿（与卡片绿点一致）*/
.pv-kv-statusrow { margin-bottom: 16px; }
/* 全站筛选胶囊：状态页签（.pv-ship-tab）和分类/地点 chip（.pv-kv-chip）本来就是同一个
   东西，共用这一条规则 —— 之前各写各的，同一屏里上下两行 chip 的字号、字重、高度、
   内边距全不一样。要改尺寸改这里，两边一起动。 */
.pv-kv-chip, .pv-ship-tab {
  display: inline-flex; align-items: center; height: var(--pv-ship-ctl-h, 30px);
  border: 1px solid var(--pv-border); background: var(--pv-surface);
  color: var(--pv-text-soft); font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1; cursor: pointer;
  border-radius: var(--pv-radius-pill); padding: 0 13px; transition: all .12s;
}
/* 片子后面那个数做成一枚小角标，而不是仅仅加粗。加粗只是"这两个字重一点"，
   读的时候还得先分辨哪几个字是名字、哪几个是数量；套个底色就一眼分得开了 ——
   「aaa 7」变成「aaa ⑦」那种读法。 */
.pv-kv-chip b, .pv-ship-tab b {
  font-variant-numeric: tabular-nums; margin-left: 7px; margin-right: -4px;
  min-width: 18px; height: 17px; padding: 0 5px; border-radius: 9px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pv-bg); color: var(--pv-text-faint);
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700; transition: inherit;
}
.pv-kv-chip:hover, .pv-ship-tab:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-kv-chip:hover b, .pv-ship-tab:hover b {
  background: var(--pv-primary-soft); color: var(--pv-primary-dark);
}
.pv-kv-chip.active, .pv-ship-tab.active { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; }
/* 选中态整片是实底主题色，角标就不能再用浅灰底（压在黄底上会脏）。
   用一层半透明白：它跟着底色走，换个主题色也不用回来改。 */
.pv-kv-chip.active b, .pv-ship-tab.active b {
  background: rgba(255, 255, 255, .26); color: #fff;
}
.pv-kv-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px;
}
@media (max-width: 640px) { .pv-kv-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; } }
.pv-kv-card {
  position: relative; background: var(--pv-surface);
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius);
  box-shadow: var(--pv-shadow-sm); overflow: hidden; display: flex; flex-direction: column;
  transition: box-shadow .12s, transform .12s;
}
.pv-kv-card:hover { box-shadow: var(--pv-shadow); transform: translateY(-2px); }
.pv-kv-cover {
  display: block; position: relative; aspect-ratio: 16 / 10; background: var(--pv-bg);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.pv-kv-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pv-kv-cover-ph { position: absolute; font-size: 34px; opacity: .35; }
.pv-kv-dur {
  position: absolute; right: 6px; bottom: 6px; z-index: 1;
  background: rgba(0,0,0,.6); color: #fff; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-variant-numeric: tabular-nums;
  padding: 2px 8px; border-radius: 4px; line-height: 1.5;
}
.pv-kv-hide { margin-right: 4px; }
.pv-kv-cover img + .pv-kv-cover-ph { display: none; }
/* 封面左上角：分类胶囊（明显，带彩点：学习=蓝、娱乐=绿）*/
.pv-kv-cat-corner {
  position: absolute; top: 8px; left: 8px; z-index: 1;
  display: inline-flex; align-items: center; gap: 5px;
  background: rgba(255,255,255,.95); border-radius: var(--pv-radius-pill);
  padding: 3px 11px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text);
  box-shadow: 0 1px 4px rgba(0,0,0,.2);
}
.pv-kv-cat-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.pv-kv-cat-corner.cat-study .pv-kv-cat-dot { background: var(--pv-info); }   /* 学习=蓝点 */
.pv-kv-cat-corner.cat-fun .pv-kv-cat-dot { background: #22C55E; }            /* 娱乐=绿点 */
/* 封面左下角：UP主（B站风）*/
.pv-kv-up-corner {
  position: absolute; left: 6px; bottom: 6px; z-index: 1; max-width: 62%;
  display: inline-flex; align-items: center; gap: 3px;
  background: rgba(0,0,0,.6); color: #fff; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.5;
  padding: 2px 8px; border-radius: 4px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pv-kv-up-corner i { font-size: calc(11px + var(--pv-fz-add, 0px)); opacity: .9; flex-shrink: 0; }
.pv-kv-body { padding: 10px 0 12px; display: flex; flex-direction: column; gap: 6px; }
/* body 不再左右留白，改由各行自己带内边距——标题/UP 文字与下面的标签左缘对齐 */
.pv-kv-title, .pv-kv-up, .pv-kv-tags, .pv-kv-status, .pv-kv-note { padding-left: 12px; padding-right: 12px; }
.pv-kv-title {
  font-weight: 600; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); line-height: 1.35; color: var(--pv-text);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  min-height: 2.7em;   /* 固定两行高度：一行标题也占两行位置，超两行 … 截断 */
}
.pv-kv-title:hover { color: var(--pv-primary-dark); }
.pv-kv-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; }
.pv-kv-range {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap;
  background: #E4E9F1; color: #48566B;
  border-radius: var(--pv-radius-pill); padding: 2px 9px;
}
.pv-kv-up { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 每孩子「想看/已看」状态药丸（点一下循环 未看→想看→已看）*/
.pv-kv-status { display: flex; flex-wrap: wrap; gap: 6px; }
.pv-kv-st {
  display: inline-flex; align-items: center; gap: 5px;
  border: 1px solid var(--pv-border); background: var(--pv-surface);
  border-radius: var(--pv-radius-pill); padding: 2px 10px; cursor: pointer;
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); transition: all .12s;
}
.pv-kv-st:disabled { cursor: default; }
.pv-kv-st:not(:disabled):hover { border-color: var(--pv-primary); }
.pv-kv-st-name { font-weight: 600; }
/* 想看/已看：同一状态两个孩子颜色完全一致（不再按适龄淡化） */
.pv-kv-st.st-none { background: #EDEFF3; border-color: transparent; color: var(--pv-text-faint); }
.pv-kv-st.st-want { background: var(--pv-accent-soft); border-color: transparent; color: var(--pv-primary-dark); }
.pv-kv-st.st-watched { background: #E7F6EC; border-color: transparent; color: #2E7D46; }
/* 不在建议年龄内的孩子：颜色保持一致，仅用一圈淡边轻轻区分，不改变胶囊底色 */
.pv-kv-st:not(.fit) { box-shadow: inset 0 0 0 1px var(--pv-border); }
/* 二级状态筛选行贴近上面一行 */
.pv-kv-subfilter { margin-top: -8px; }
/* 想看/已看 快捷筛选：激活时用对应状态色 */
.pv-kv-chip.pick-want.active { background: var(--pv-accent-soft); border-color: transparent; color: var(--pv-primary-dark); }
.pv-kv-chip.pick-watched.active { background: #E7F6EC; border-color: transparent; color: #2E7D46; }
/* 两大类筛选：学习=蓝、娱乐=橙（沿用 token） */
.pv-kv-chip.cat-study.active { background: var(--pv-info); border-color: var(--pv-info); color: #fff; }
.pv-kv-chip.cat-fun.active { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; }
/* 卡片上的分类小徽章 */
.pv-kv-cat-badge { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; padding: 1px 8px; border-radius: var(--pv-radius-pill); }
.pv-kv-cat-badge.cat-study { background: var(--pv-info-soft); color: var(--pv-info-text); }
.pv-kv-cat-badge.cat-fun { background: var(--pv-accent-soft); color: var(--pv-primary-dark); }
.pv-kv-note { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); line-height: 1.45; }
.pv-kv-edit {
  position: absolute; top: 6px; right: 6px; width: 26px; height: 26px;
  border: none; border-radius: 50%; background: rgba(0,0,0,.42); color: #fff;
  cursor: pointer; font-size: calc(13px + var(--pv-fz-add, 0px)); display: flex; align-items: center; justify-content: center;
  opacity: 0; transition: opacity .12s;
}
.pv-kv-card:hover .pv-kv-edit { opacity: 1; }
@media (max-width: 640px) { .pv-kv-edit { opacity: 1; } }
.pv-kv-link-row { display: flex; gap: 8px; }
.pv-kv-link-row .el-input { flex: 1; }
.pv-kv-age-row { display: flex; align-items: center; gap: 8px; }
.pv-kv-age-row .el-input-number { width: 90px; }
.pv-kv-age-sep, .pv-kv-age-hint { color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-kv-cover-preview { max-width: 220px; border-radius: var(--pv-radius-sm); display: block; }
.pv-kv-kid-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }

/* ===== 四域侧边栏（今日 / 我的 / 家事 / 事务往来）===== */
.pv-side-today { position: relative; }
/* 分组标题用门牌那支红（#8C2F26，门牌渐变的中段）。
   页面上唯一一处红本来是顶上那块门牌 —— 让侧栏的分组跟它同色，
   整条侧栏就有了一条自己的调子，而不是"门牌是红的、下面全是灰的"两截。
   只给分组标题，不给下面的具体条目：条目是内容，标题才是骨架。 */
.pv-side-domain {
  display: flex; align-items: center; gap: 11px;
  padding: 10px 12px; margin-top: 6px; border-radius: var(--pv-radius-sm);
  color: #8C2F26; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; cursor: pointer;
  transition: background .12s, color .12s;
}
.pv-side-domain:hover { background: var(--pv-bg); }
/* 展开/选中时更深一档（门牌渐变的底色），不是换成另一种颜色 ——
   同一支色的深浅才读得出"这个被选中了"，换色读出来的是"这是另一类东西" */
.pv-side-domain.active { color: #6E2119; }
.pv-side-domain-name { flex: 1; min-width: 0; }
/* 分组改名（用户 2026-10-28）：铅笔悬停才出、手机上一直在；输入框跟组名同一行同字号 */
.pv-side-rename { display: none; flex: none; align-items: center; border: 0; background: none; padding: 0 2px; margin: 0; color: var(--pv-text-faint); cursor: pointer; font-size: 13px; line-height: 1; }
.pv-side-domain:hover .pv-side-rename { display: inline-flex; }
.pv-side-rename:hover { color: var(--pv-primary-dark); }
@media (hover: none) { .pv-side-rename { display: inline-flex; } }
.pv-side-rename-in { flex: 1; min-width: 0; width: 60px; height: 26px; border: 1px solid var(--pv-primary); border-radius: 6px; padding: 0 6px; font: inherit; font-weight: 600; background: var(--pv-surface); color: var(--pv-text); outline: none; }
.pv-side-caret { flex: none; opacity: .5; transition: transform .18s ease; }
.pv-side-caret.open { transform: rotate(90deg); }
.pv-unread-pill {
  flex: none; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px;
  background: var(--pv-unread); color: #fff; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700;
  line-height: 18px; text-align: center; font-variant-numeric: tabular-nums;
}
.pv-side-subs { display: flex; flex-direction: column; gap: 1px; margin: 1px 0 2px; }
.pv-side-sub {
  display: flex; align-items: center; gap: 9px; min-width: 0;
  padding: 8px 12px 8px 16px; border-radius: var(--pv-radius-sm);
  color: var(--pv-text-soft); font-size: calc(14.5px + var(--pv-fz-add2, 0px)); cursor: pointer; transition: background .12s, color .12s;
}
.pv-side-sub-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-side-sub:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-side-sub.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
/* 还没做好的模块（app.js 里 dev: true，名字带【开发中】）：选中时红底白字，进去之前先看见"这是半成品" */
/* 开发中的模块平时整条压灰（用户 2026-09-08：先灰掉），图标去色；悬停恢复一点，选中时还是红底 */
.pv-side-sub.is-dev:not(.active) { color: var(--pv-text-faint); opacity: .6; }
.pv-side-sub.is-dev:not(.active) .pv-side-sub-emoji { filter: grayscale(1); }
.pv-side-sub.is-dev:not(.active):hover { opacity: .9; }
.pv-side-sub.is-dev.active { background: var(--pv-danger); color: #fff; }
.pv-side-sub.is-dev.active .pv-side-sub-num { color: #fff; }
.pv-side-dot { flex: none; width: 9px; height: 9px; border-radius: 50%; background: var(--pv-border); }
.pv-side-dot.on { background: var(--pv-unread); }
/* 选中那条的点标绿 —— 底色和字色的深浅差本来就不算强，一颗有颜色的点最好认。
   未读数还在右边那颗红数字上，点让给"选中"不丢信息。
   放大一档（7→9px）并且会"呼吸"（用户 2026-09-03：这个绿点非常好，可以来个呼吸效果）：
   慢慢亮起来再暗下去、外面一圈淡绿光晕跟着涨落，3 秒一个来回，慢到不打扰。 */
.pv-side-sub.active .pv-side-dot {
  background: var(--pv-success);
  animation: pv-dot-breathe 3s ease-in-out infinite;
}
@keyframes pv-dot-breathe {
  0%, 100% { transform: scale(1);    opacity: .78; box-shadow: 0 0 0 0 rgba(46, 158, 82, .45); }
  50%      { transform: scale(1.18); opacity: 1;   box-shadow: 0 0 0 5px rgba(46, 158, 82, 0); }
}
@media (prefers-reduced-motion: reduce) { .pv-side-sub.active .pv-side-dot { animation: none; } }
.pv-side-sub-emoji { flex: none; width: 18px; text-align: center; font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1; }
.pv-side-sub-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-side-sub-num { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-unread); }
/* 左下头像=设置菜单入口 */
.pv-side-settings { display: block; width: 100%; margin-top: 8px; cursor: pointer; }
.pv-side-user-trigger, .pv-side-settings .pv-side-user {
  display: flex; align-items: center; gap: 9px;
  padding: 10px 8px; border-top: 1px solid var(--pv-border); width: 100%;
}
.pv-side-settings-caret { color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); flex: none; }
/* 头像那行：左边账号菜单占满，右边一只铃铛。分隔线画在整行上（原来在 .pv-side-user 上），铃铛才不会浮在线外 */
.pv-side-userrow {
  display: flex; align-items: center; gap: 4px; flex: none;
  margin-top: 8px; border-top: 1px solid var(--pv-border); padding-right: 6px;
}
.pv-side-userrow .pv-side-settings { flex: 1; min-width: 0; margin-top: 0; }
/* .pv-side-user 自带的 margin-top:8px 在这行里是多余的（行本身已经有 8px）：它让头像块比铃铛低 4px，
   之前只能靠给铃铛 translateY 硬凑（用户 2026-09-10）。去掉之后两边靠 align-items:center 自然对齐。 */
.pv-side-userrow .pv-side-settings .pv-side-user { border-top: none; margin-top: 0; }
/* ===== 站内消息铃铛（照 legalsnap 的 notification-bell，颜色换成站里的 token） ===== */
.pv-notif-root { position: relative; display: inline-flex; flex: none; }
.pv-notif-trigger {
  position: relative; width: 34px; height: 34px; border-radius: 50%; border: none; background: none;
  display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
  color: var(--pv-text-faint); padding: 0;
}
/* 铃铛图形本身重心偏上（底下那道小弧线很轻），在圆里看着靠上一点：整体下挪 1.5px（用户 2026-09-09） */
/* 铃铛图形重心略偏上，下挪半个像素就够（1.5px 又矮了，用户 2026-09-10） */
.pv-notif-trigger .pv-notif-bell { transform: translateY(.5px); }
/* 悬停 / 键盘聚焦：一圈蓝色描边、不铺底（用户 2026-09-10：喜欢原来那个蓝圈） */
.pv-notif-trigger:hover, .pv-notif-trigger:focus-visible {
  background: none; color: var(--pv-info); box-shadow: inset 0 0 0 2px var(--pv-info); outline: none;
}
.pv-notif-trigger.has { color: var(--pv-text); }
.pv-notif-bell { display: block; }
.pv-notif-badge {
  position: absolute; top: 2px; right: 0; min-width: 16px; height: 16px; padding: 0 4px;
  border-radius: 8px; background: var(--pv-danger); color: #fff;
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 16px; text-align: center;
  font-variant-numeric: tabular-nums; box-shadow: 0 0 0 2px var(--pv-surface);
}
/* 标题和正文左边对齐同一条线（用户 2026-09-11：标签比标题靠右） */
.pv-notif-dialog .el-dialog__header { padding: 18px 20px 6px; }
.pv-notif-dialog .el-dialog__body { padding: 6px 20px 18px; }
.pv-notif-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.pv-notif-markall {
  border: none; background: none; padding: 0; cursor: pointer; font-family: inherit;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-primary-dark);
}
.pv-notif-markall:hover { text-decoration: underline; }
.pv-notif-empty { padding: 36px 0; text-align: center; color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-notif-list { max-height: 440px; overflow-y: auto; margin: 0 -8px; }
.pv-notif-item {
  display: flex; align-items: flex-start; gap: 10px; padding: 10px 8px;
  border-bottom: 1px solid var(--pv-border); cursor: pointer; background: #FFF8E8; border-radius: 8px;
}
.pv-notif-item:hover { background: #FFEDC8; }
.pv-notif-item:last-child { border-bottom: none; }
.pv-notif-kind {
  flex: none; margin-top: 2px; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; color: #fff;
  padding: 1px 7px; border-radius: var(--pv-radius-pill); background: var(--pv-text-faint); white-space: nowrap;
}
.pv-notif-kind.k-reply { background: #3370FF; }
.pv-notif-kind.k-mention { background: #C9302C; }
.pv-notif-kind.k-comment { background: #8B5A3C; }
.pv-notif-kind.k-assigned { background: var(--pv-primary); }
.pv-notif-kind.k-question { background: var(--pv-danger); }
.pv-notif-kind.k-plan, .pv-notif-kind.k-assign { background: #1E6B38; }   /* 快乐社交约你（用户 2026-09-23） */
.pv-notif-kind.k-like { background: #B3261E; }   /* 勤为径点赞（用户 2026-09-24） */
.pv-notif-kind.k-done { background: var(--pv-success); }   /* 有一条任务做完了（用户 2026-09-28） */
.pv-notif-kind.k-project { background: #5B6FB8; }
/* 顶上那一排：分段 28 高，搜索框（全站 .pv-search grow）跟它同高、占掉中间剩下的宽度，「全部归档」靠右 */
.pv-notif-head { flex-wrap: wrap; --pv-search-h: 28px; }
.pv-notif-markall { white-space: nowrap; flex: none; line-height: 28px; }
.pv-notif-item.done { background: var(--pv-surface); }
.pv-notif-item.done:hover { background: var(--pv-bg); }
.pv-notif-main { flex: 1; min-width: 0; line-height: 1.45; }
/* 来源那一行在标题上面：小一号、淡一档，跟飞书卡片标题里「分类 · 来源」对得上 */
.pv-notif-src { font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 16px; color: var(--pv-text-faint); margin-bottom: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-notif-title { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); font-weight: 600; }
.pv-notif-body { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-top: 2px; word-break: break-word; }
.pv-notif-meta { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 3px; }
.pv-notif-done {
  flex: none; width: 24px; height: 24px; border-radius: 50%; border: 1px solid var(--pv-border);
  background: var(--pv-surface); color: var(--pv-text-faint); cursor: pointer; font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 0;
}
.pv-notif-done:hover { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; }

/* ===== 今日 · 消息流 ===== */
.pv-today-group { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); letter-spacing: .3px; margin: 18px 0 6px; }
.pv-today-row {
  display: flex; align-items: center; gap: 10px; padding: 11px 12px;
  border-bottom: 1px solid var(--pv-border); cursor: pointer; transition: background .1s, opacity .15s;
}
.pv-today-row:hover { background: var(--pv-surface); }
.pv-today-row.read { opacity: .55; }
.pv-today-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: transparent; }
.pv-today-dot.on { background: var(--pv-unread); }
.pv-today-ico { flex: none; font-size: 17px; }
.pv-today-title { flex: none; max-width: 40%; font-weight: 600; color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-today-tag {
  flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); padding: 1px 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-soft);
}
.pv-today-sum { flex: 1; min-width: 0; color: var(--pv-text-soft); font-size: calc(14px + var(--pv-fz-add2, 0px)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-today-time { flex: none; color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-variant-numeric: tabular-nums; }
.pv-today-empty { text-align: center; color: var(--pv-text-faint); padding: 80px 20px; }
.pv-today-empty .big { font-size: 40px; color: #2E7D46; margin-bottom: 12px; }
.pv-today-empty .t { font-size: 17px; color: var(--pv-text); font-weight: 600; }
.pv-today-empty .s { font-size: calc(14px + var(--pv-fz-add2, 0px)); margin-top: 4px; }
@media (max-width: 640px) {
  .pv-today-title { max-width: 55%; }
  .pv-today-tag, .pv-today-time { display: none; }
}

/* ===== 买菜 pv-grocery-view ===== */
/* 顶部快填栏（.pv-gro-add）撤了：买菜也改成「＋ 按钮 → 右侧抽屉」填全字段（用户 2026-09-03） */
/* 超市筛选条 */
/* 筛选一行搞定（用户 2026-09-03）：左边分类（全部放最左），一道细竖线，右边二级筛选；
   片子比全站那档矮一点（26px），这一行不该比列表本身还重。
   买菜清单先用，中国海运的状态行也是它（.pv-ship 那边靠 --pv-ship-ctl-h 对齐同一档）。 */
.pv-filter-row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-filter-row .pv-ship-tab, .pv-filter-row .pv-kv-chip { height: 26px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); padding: 0 10px; }
.pv-filter-row .pv-ship-tab b, .pv-filter-row .pv-kv-chip b,
.pv-ship .pv-ship-tab b { height: 15px; min-width: 16px; font-size: calc(11px + var(--pv-fz-add, 0px)); margin-left: 5px; margin-right: -3px; }
.pv-filter-sep { flex: none; width: 1px; height: 16px; background: var(--pv-border); margin: 0 4px; }
.pv-gro-loc { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-primary-dark); background: var(--pv-accent-soft); padding: 1px 8px; border-radius: var(--pv-radius-pill); white-space: nowrap; }
.pv-gro-loc-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
/* 状态带右侧的「飞书记录」入口 */
/* 到日子提醒弹窗底部的现状条：发到哪、今天几样、上次啥时候提醒的 */
.pv-gro-rem-info {
  background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 10px 12px;
  font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); line-height: 1.8;
}
.pv-gro-rem-info b { color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-gro-rem-info .warn { color: var(--pv-unread); }
/* 提醒钟点按用户时区算，这行讲清「按哪个时区、那边现在几点」 */
.pv-gro-rem-tz { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.5; margin-top: 2px; }
.pv-gro-rem-tz b { color: var(--pv-text-soft); font-weight: 600; }
.pv-gro-rem-tz a { color: var(--pv-primary-dark); text-decoration: none; }
.pv-gro-rem-tz a:hover { text-decoration: underline; }
/* 飞书对话流水弹窗：一段 = 一次完整往返（我说的 → 调了哪几次 AI → 它回的） */
.pv-gro-log-dialog .el-dialog__body { padding: 10px 20px 4px; }
.pv-gro-log-bar { display: flex; align-items: center; gap: 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); margin-bottom: 6px; }
.pv-gro-logs { max-height: 58vh; overflow-y: auto; }
.pv-gro-log { padding: 12px 0; border-bottom: 1px dashed var(--pv-border); }
.pv-gro-log:last-child { border-bottom: none; }
.pv-gro-log-head { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; flex-wrap: wrap; }
.pv-gro-log-at { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-gro-log-tag { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 8px; border-radius: var(--pv-radius-pill); background: var(--pv-accent-soft); color: var(--pv-primary-dark); }
.pv-gro-log-tok { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-gro-log-row { display: flex; gap: 8px; align-items: flex-start; margin-bottom: 6px; }
.pv-gro-log-who {
  flex: none; width: 20px; height: 20px; border-radius: 50%; margin-top: 2px;
  display: flex; align-items: center; justify-content: center;
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; color: #fff;
}
.pv-gro-log-who.me { background: var(--pv-info-text); }
.pv-gro-log-who.bot { background: var(--pv-primary); }
/* 原话/回复都原样保留换行——粘一整张清单进来时，看的就是它当时长什么样 */
.pv-gro-log-text {
  flex: 1; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text); white-space: pre-wrap;
  word-break: break-word; background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 7px 10px;
}
.pv-gro-log-text.reply { background: var(--pv-accent-soft); }
/* 中间这条链就是「操作流程」：它当时依次调了哪几次 AI、各烧多少 token */
.pv-gro-log-steps { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 6px 28px; }
.pv-gro-log-step {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); background: var(--pv-surface);
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-pill); padding: 1px 9px;
}
.pv-gro-log-step b { font-variant-numeric: tabular-nums; margin-left: 4px; color: var(--pv-text-faint); font-weight: 600; }
.pv-gro-log-step.none { color: var(--pv-text-faint); border-style: dashed; }
/* 「没处理好」的红标记：故障不该只体现为一条奇怪的回复，得能一眼挑出来 */
.pv-gro-log-bad {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-danger-soft); color: var(--pv-danger-text); border: 1px solid var(--pv-danger-border);
}
.pv-gro-log-bad.done {
  background: var(--pv-success-soft); color: var(--pv-success-text); border-color: var(--pv-success-border);
}
/* 更新记录弹窗 */
.pv-clog-dialog .el-dialog__body { padding: 14px 24px 6px; }
.pv-clog-body { max-height: 60vh; overflow-y: auto; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); line-height: 1.85; }
.pv-clog-body h2 {
  font-size: calc(15px + var(--pv-fz-add2, 0px)); margin: 18px 0 8px; padding-bottom: 6px;
  border-bottom: 1px solid var(--pv-border); color: var(--pv-text);
}
.pv-clog-body h2:first-child { margin-top: 0; }
/* 每条更新常常是两三行的一段话，4px 的行间距把上下两条粘成一坨，
   得先找句号才知道换条了。拉到 8px —— 一条一条读得出来 */
.pv-clog-body ul { padding-left: 21px; margin: 9px 0; }
.pv-clog-body li { margin: 8px 0; color: var(--pv-text-soft); }
.pv-clog-body li::marker { color: var(--pv-text-faint); }
.pv-clog-body p { margin: 8px 0; }
.pv-clog-body strong { color: var(--pv-text); }
@media (max-width: 640px) { .pv-gro-logs { max-height: 62vh; } }
@media (max-width: 640px) {
  .pv-gro-loc { order: 5; }
}
.pv-gro-group { margin-bottom: 18px; }
.pv-gro-date {
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); margin-bottom: 6px;
  display: flex; align-items: center; gap: 8px;
}
.pv-gro-date-cnt {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-accent-soft); color: var(--pv-primary-dark);
}
.pv-gro-date-cnt.done { background: #E7F6EC; color: #2E7D46; }
/* 条目之间不画线（用户 2026-09-03：三样东西之间不用分割线，线不是越多越好）；
   一天一组靠上面那行日期分开就够了。行高也收一档。 */
.pv-gro-item {
  display: flex; align-items: center; gap: 10px; padding: 7px 14px 7px 6px;   /* 右边多留一点：删除那颗 ✕ 原来贴着滚动条（用户 2026-09-08） */
}
.pv-gro-check {
  flex: none; width: 20px; height: 20px; border-radius: 6px; cursor: pointer;
  border: 1.5px solid var(--pv-border); background: var(--pv-surface);
  display: flex; align-items: center; justify-content: center; color: #fff; font-size: calc(13px + var(--pv-fz-add, 0px));
  transition: all .12s;
}
.pv-gro-check:hover { border-color: var(--pv-primary); }
.pv-gro-check.on { background: #2E9E52; border-color: #2E9E52; }
/* 多选（用户 2026-10-01）：顶上「加一条」和「多选」一排；操作条一行（全选框 · 已选 N · 改到 今天 / 明天 / 选一天 · 改去 超市）；
   行右边一个方框是选中标记，选中的行主色浅底 */
.pv-gro-top { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
.pv-gro-top .pv-task-addbtn { margin-bottom: 0; }
.pv-gro-multibtn::before { display: none; }   /* 跟「加一条」同尺寸同样子，但它不是新增钮，不画加号 */
.pv-gro-multibtn.is-on { border-style: solid; border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-gro-batch { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 8px; margin: -4px 0 12px; padding: 8px 10px; border-radius: 10px; background: var(--pv-primary-soft); }
.pv-gro-batch-n { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-primary-dark); white-space: nowrap; }
.pv-gro-batch-k { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-gro-batch .pv-chip-opt.sm { padding: 0 10px; height: 28px; line-height: 26px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); background: var(--pv-surface); }
.pv-gro-batch .pv-chip-opt.sm:disabled { opacity: .5; cursor: default; }
.pv-gro-selbox { flex: none; width: 20px; height: 20px; border-radius: 6px; border: 1.5px solid var(--pv-border); background: var(--pv-surface);
                 display: inline-flex; align-items: center; justify-content: center; color: #fff; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; padding: 0; }
.pv-gro-selbox.on { background: var(--pv-primary); border-color: var(--pv-primary); }
.pv-gro-item.is-sel { background: var(--pv-primary-soft); border-radius: 8px; }
/* 品名/备注太长时只准自己截断，不许把右边那组控件挤走 —— 右边要稳定对齐，
   一行一行扫下来「超市」「日期」得在同一条竖线上。 */
.pv-gro-name { font-weight: 600; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); min-width: 0; flex: 0 1 auto;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 品名 / 备注那两个隐形输入框跟着小一号（用户 2026-09-03：要买的东西字太大） */
.pv-gro-item .pv-gro-edit-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-gro-item .pv-gro-edit-note { font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-gro-qty {
  margin-left: 7px; font-weight: 400; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  background: var(--pv-bg); padding: 1px 7px; border-radius: var(--pv-radius-pill);
}
.pv-gro-note { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-style: italic;
  min-width: 0; flex: 0 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-gro-note::before { content: '·'; margin-right: 6px; font-style: normal; color: var(--pv-border); }
/* 来源那列**定宽**（用户 2026-09-08：左边超市那列一行一行对不齐）——它排在最右，宽度跟着
   「飞书 · 08-22 21:12」里数字的宽度变，左边整组超市 / 日期就被它推得一行一个位置。
   定宽 + 等宽数字，左边那组才钉得住。 */
.pv-gro-src {
  flex: none; width: 138px; text-align: right; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums;
}
.pv-gro-item.bought .pv-gro-name { text-decoration: line-through; color: var(--pv-text-faint); font-weight: 400; }
.pv-gro-item.bought .pv-gro-note, .pv-gro-item.bought .pv-gro-qty { color: var(--pv-text-faint); }
.pv-gro-del {
  flex: none; border: none; background: none; cursor: pointer; color: var(--pv-text-faint);
  width: 24px; height: 24px; border-radius: 50%; opacity: 0; transition: opacity .12s, color .12s;
}
.pv-gro-item:hover .pv-gro-del { opacity: 1; }

/* 行内改超市 / 日期：平时素得像纯文本，指上去或点进去才显出是控件 ——
   这一栏在电脑上很宽，与其每条都点开弹窗改两样，不如就地改。
   （同 .pv-focus-item-input 那套"隐形输入框"的做法，全站保持一致。） */
/* 超市 + 日期是一组，整组靠右钉住；组内两个贴紧（行的 10px 间距在这儿太散） */
.pv-gro-fields { flex: none; display: flex; align-items: center; gap: 2px; margin-left: auto; }
.pv-gro-inline { flex: none; }
.pv-gro-inline-loc { width: 140px; }
.pv-gro-inline-loc .el-input, .pv-gro-inline-loc .el-input__inner { width: 140px; box-sizing: border-box; text-align: left; }
.pv-gro-inline-date { width: 88px; }   /* 「9月10日」六个字，116 太宽、字还偏在左边（用户 2026-09-03） */
.pv-gro-inline .el-input__inner {
  border-color: transparent; background: transparent; padding-left: 8px; padding-right: 20px;
  color: var(--pv-text-soft); font-size: calc(12.5px + var(--pv-fz-add, 0px)); text-overflow: ellipsis;
}
.pv-gro-inline .el-input__inner::placeholder { color: var(--pv-text-faint); }
.pv-gro-inline .el-input__prefix { display: none; }        /* 日期那个小日历图标占地方，去掉 */
.pv-gro-inline-date .el-input__inner { padding: 0 8px; text-align: center; }
/* 悬停亮**整行**（用户 2026-09-03：原来只有右边那两个控件亮，看着像只有它们能点）。
   行里那两个隐形输入框跟着字色变深就行，不再单独铺底；聚焦时才出边框，直接上主题黄。 */
.pv-gro-item { border-radius: var(--pv-radius-sm); transition: background .12s; }
.pv-gro-item:hover { background: var(--pv-bg); }
.pv-gro-item:hover .pv-gro-inline .el-input__inner { color: var(--pv-text); }
.pv-gro-inline .el-input__inner:focus {
  border-color: var(--pv-primary); background: var(--pv-surface); color: var(--pv-text);
}
/* 已买那行整体压暗，控件也跟着退下去 */
.pv-gro-item.bought .pv-gro-inline .el-input__inner { color: var(--pv-text-faint); }

@media (max-width: 640px) {
  /* 手机上一行塞不下两个控件 + 品名：让它们跟备注一样另起一行、并排放，
     宽度按剩余空间分，别把删除按钮挤出屏幕 */
  .pv-gro-fields { order: 6; flex: 1 1 100%; margin-left: 34px; gap: 6px; }
  .pv-gro-inline-loc, .pv-gro-inline-date { width: auto; flex: 1 1 40%; }
  .pv-gro-inline .el-input__inner { border-color: var(--pv-border); background: var(--pv-surface); }
}
/* 就地改品名 / 备注：平时素得跟纯文本一样，聚焦才显出是输入框。
   跟超市/日期同一套做法 —— 一行里四样东西都能直接改，不用再点开弹窗。 */
.pv-gro-edit {
  min-width: 0; border: 1px solid transparent; background: none; font: inherit;
  border-radius: var(--pv-radius-sm); padding: 3px 7px; color: var(--pv-text);
  text-overflow: ellipsis;
}
.pv-gro-edit:hover { background: var(--pv-bg); }
.pv-gro-edit:focus { outline: none; border-color: var(--pv-primary); background: var(--pv-surface); }
.pv-gro-edit-name { flex: 0 1 auto; font-weight: 600; }
.pv-gro-edit-note {
  flex: 0 1 auto; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-style: italic;
}
.pv-gro-edit-note::placeholder { color: var(--pv-border); font-style: normal; }
.pv-gro-item.bought .pv-gro-edit-name { text-decoration: line-through; color: var(--pv-text-faint); font-weight: 400; }
.pv-gro-item.bought .pv-gro-edit-note { color: var(--pv-text-faint); }

.pv-gro-del:hover { color: var(--pv-unread); background: var(--pv-bg); }
/* 手机端：一条就是「勾 + 名字」一行，备注/超市换行跟在下面，来源时间戳不显示。
   站在超市里要的是一眼能扫、拇指点得中，不是把桌面端那排信息等比缩小塞进来。
   这条 media 必须待在本节最后——放前面的话 padding/gap 会被后面的基础规则盖回去。 */
@media (max-width: 640px) {
  .pv-gro-src { display: none; }
  .pv-gro-del { opacity: 1; width: 30px; height: 30px; }
  .pv-gro-item { gap: 8px; padding: 12px 4px; flex-wrap: wrap; align-items: flex-start; }
  .pv-gro-check { width: 26px; height: 26px; }
  .pv-gro-name { flex: 1; font-size: 15.5px; line-height: 1.35; }
  .pv-gro-note { flex: 1 1 100%; margin-left: 34px; }
  .pv-gro-loc { margin-left: 34px; }
}

/* ===== 设置 · 集成 · 飞书机器人 ===== */
.pv-card-plain { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius); padding: 14px 18px; }
.pv-fs-status { margin-bottom: 8px; }
.pv-fs-row { display: flex; align-items: center; gap: 9px; padding: 5px 0; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); }
.pv-fs-dot { flex: none; width: 9px; height: 9px; border-radius: 50%; background: var(--pv-unread); }
.pv-fs-dot.on { background: #2E9E52; }
.pv-fs-h3 { font-size: calc(15px + var(--pv-fz-add2, 0px)); margin: 22px 0 6px; }
.pv-fs-note { font-size: calc(13px + var(--pv-fz-add, 0px)); margin-bottom: 10px; }
/* 可见模块的勾选。分组摆 —— 用户脑子里的分法就是侧栏那个分法，
   另起一套顺序等于让他重新认一遍。 */
/* 标题行的图标、勾选框、顶上那排按钮，左边缘全部对齐到同一条线上。
   写成变量而不是三处各填一个数：改一次就三处一起动，不会又对不齐。 */
.pv-mods-pick, .pv-mods-group-head, .pv-mods-bar { --pv-mods-inset: 4px; }
.pv-mods-bar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-bottom: 6px; padding-left: var(--pv-mods-inset);
}
/* 组与组之间拉开：靠得太近时，上一组的最后一行和下一组的标题读起来像同一块 */
.pv-mods-group + .pv-mods-group { margin-top: 22px; }
/* 分组标题那行给足高度：它要把下面一片勾选框领起来，太扁就压不住 */
.pv-mods-group-head {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 2px 9px var(--pv-mods-inset); margin-bottom: 8px;
  border-bottom: 1px solid var(--pv-border);
  font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
}
.pv-mods-group-head b { color: var(--pv-text); font-weight: 700; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
/* 分组图标单独给字号和行高：emoji 的字形比同字号的汉字高，跟着 13px 的父级走时
   上下会被行盒切掉一点，看着像没显全。给足行高它就完整了。 */
.pv-mods-group-ico { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1.5; flex: none; }

/* 三列。模块名长短不一，两列时长名字老换行，把行高撑得参差不齐 */
.pv-mods-pick {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 11px 12px;                       /* 行距拉开：三列铺下来太密的话眼睛容易串行 */
  padding-left: var(--pv-mods-inset);   /* 跟上面标题里的图标左对齐 */
}
/* 勾选框和它右边的字压到同一条中线上。
   Element 里勾选框是 vertical-align: middle、标签却按基线对齐 —— 两套对齐方式
   撞在一起，字就比框高出一点点。改成一行 flex，两边都交给 align-items: center。 */
.pv-mods-pick .el-checkbox {
  display: flex; align-items: center; line-height: 1.5;
  margin-right: 0; min-width: 0;
}
.pv-mods-pick .el-checkbox__input { line-height: 1; flex: none; }
.pv-mods-pick .el-checkbox__label {
  padding-left: 8px; line-height: 1.5; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
@media (max-width: 900px) { .pv-mods-pick { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .pv-mods-pick { grid-template-columns: 1fr; } }

/* 「差一条权限」那条提示：照实说缺哪条、去哪开。默默显示个空头像最气人。 */
.pv-fs-warn {
  background: var(--pv-warning-soft); border: 1px solid var(--pv-warning-border);
  border-radius: var(--pv-radius-sm); padding: 10px 12px; margin: 8px 0;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.85; color: var(--pv-warning-text);
}
.pv-fs-warn code { background: var(--pv-surface); padding: 1px 5px; border-radius: 4px; }
.pv-fs-empty { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 12px 14px; }
.pv-fs-list { border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm); overflow: hidden; }
.pv-fs-item { display: flex; align-items: center; gap: 10px; padding: 9px 14px; border-bottom: 1px solid var(--pv-border); }
.pv-fs-item:last-child { border-bottom: none; }
/* 一排按钮（选人、重新取）。原来借了 .pv-fs-list 那个框 —— 那是给"一串带分隔线的行"
   用的，里面塞几个按钮就变成一个上下不对称的小盒子，按钮还贴着边。
   这里就该是一排会换行的按钮，靠 gap 撑开，不要外框。 */
.pv-fs-btnrow {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 10px 0 4px;
}
/* .pv-mini-btn 自带 `+ .pv-mini-btn { margin-left: 6px }`，跟这里的 gap 叠起来
   会变成 8px、14px 交替 —— 一排按钮间距不匀就是这么来的。在这一排里关掉它。 */
.pv-fs-btnrow .pv-mini-btn + .pv-mini-btn { margin-left: 0; }
/* 已绑的那一条单独成一行：只有一条的时候不该套那个列表框 */
.pv-fs-me {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  border-bottom: 1px solid var(--pv-border); margin: 10px 0 0;
}
.pv-fs-me .pv-avatar { width: 30px; height: 30px; font-size: calc(14px + var(--pv-fz-add2, 0px)); flex: none; }
.pv-fs-warn a { color: var(--pv-warning-text); font-weight: 700; text-decoration: underline; white-space: nowrap; }
.pv-fs-name { font-weight: 600; }
.pv-fs-oid { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-family: monospace; }
.pv-fs-manual { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }

/* ===== 设置 · AI 调校 pv-tune ===== */
.pv-tune-log {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius-sm); padding: 10px 12px; margin-bottom: 10px;
}
/* 没处理好的那几条要跳出来 —— 翻这个列表就是为了找它们 */
.pv-tune-log.bad { border-left: 3px solid var(--pv-danger); border-radius: 0 var(--pv-radius-sm) var(--pv-radius-sm) 0; }
.pv-tune-log-head { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-bottom: 6px; }
.pv-tune-when { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-tune-route { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-soft); }
.pv-tune-kind {
  font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 1px 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-info-soft); color: var(--pv-info-text); white-space: nowrap;
}
.pv-tune-said { font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text); white-space: pre-wrap; }
.pv-tune-got {
  font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: pre-wrap;
  margin-top: 5px; padding-left: 9px; border-left: 2px solid var(--pv-border);
  max-height: 88px; overflow: hidden;
}
.pv-tune-ops { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.pv-tune-done { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-success-text); }
.pv-tune-bad { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-danger-text); font-weight: 600; }
/* 四层并排列出来 —— 这一块就是"哪层不对一眼看到"的全部意义 */
.pv-tune-layers {
  margin: 8px 0 6px; padding: 8px 10px; background: var(--pv-bg);
  border-radius: var(--pv-radius-sm); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.9;
}
.pv-tune-layer { display: flex; gap: 8px; color: var(--pv-text); }
.pv-tune-layer > span:first-child {
  flex: none; width: 48px; color: var(--pv-text-faint); font-weight: 600;
}

/* 调教页 / 更新记录顶上那条工具栏：分组切换、筛选、计数挤一行 */
.pv-tune-bar {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin: 10px 0;
}
/* 已经写过的反馈：平时就摊着，不要点开才看得见 —— 它是这条最该被看到的东西 */
.pv-tune-fb {
  margin-top: 8px; padding: 8px 11px; border-radius: var(--pv-radius-sm);
  background: var(--pv-primary-soft); color: var(--pv-text);
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; white-space: pre-wrap;
}
.pv-tune-fb-lab {
  display: inline-block; margin-right: 8px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700;
  color: var(--pv-primary-dark); white-space: nowrap; flex-shrink: 0;
}
/* 「这次走了哪四层」折叠开关。做成一句素文字而不是按钮：它是给我排查用的，
   不该跟「给反馈」抢注意力 —— 那颗才是这一行真正想让你按的。 */
.pv-tune-more {
  border: none; background: none; padding: 0; cursor: pointer; font-family: inherit;
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
}
.pv-tune-more:hover { color: var(--pv-primary-dark); }

/* 股票模拟：左边一列挑「看谁的账本」，版式跟项目管理左栏同一套。
   股票默认按人分、谁也看不见谁的，但一家人想互相看看仓位是很自然的事 —— 别人的只读。

   不给这一页套固定高度的壳（见 views-space.js 的 wholePageScroll）：它就该占满
   一整页往下滚。左栏靠 sticky 钉住就够了，再开一条自己的滚动条只会套娃。 */
.pv-stock.split {
  display: grid; grid-template-columns: 176px minmax(0, 1fr);
  align-items: start; gap: 0;
}
.pv-stock-side {
  display: flex; flex-direction: column; gap: var(--pv-nav-gap);
  padding: 2px 14px 14px 0; margin-right: 16px;
  border-right: 1px solid var(--pv-border);
}

/* 页面里那一列要**跟标题一起钉住**，就得让它待在滚动容器**外面**。
   默认那套是「右边整块内容滚」，而这一列长在内容里，会被一起带走。
   办法是把 .pv-sp-body 到 .pv-stock 这一串全都撑成不滚的满高盒子，
   把滚动交给最里面的 .pv-stock-main 一个人。
   每一层都得写 min-height:0 —— 少一层，里面的内容就会把外面顶破，
   滚动条又落回整页（后台那次踩过一模一样的坑）。 */
.pv-page.pv-sp-rail > .pv-sp-body { overflow: visible; }
.pv-page.pv-sp-rail .pv-home-root,
.pv-page.pv-sp-rail .pv-home-wrap,
.pv-page.pv-sp-rail .pv-home-cols,
.pv-page.pv-sp-rail .pv-home-block,
.pv-page.pv-sp-rail .pv-home-block > .pv-block {
  display: flex; flex-direction: column; flex: 1;
  min-height: 0; overflow: visible; padding: 0; margin: 0;
}
.pv-page.pv-sp-rail .pv-stock.split { flex: 1; min-height: 0; align-items: stretch; }
.pv-page.pv-sp-rail .pv-stock-side {
  min-height: 0; overflow-y: auto; padding-top: 14px;
}
.pv-page.pv-sp-rail .pv-stock-main {
  /* 右边留 14px 给滚动条走：原来内容一直铺到最右，「＋ 关注」、表格最后一列都被滚动条压住（用户 2026-09-08） */
  min-height: 0; overflow-y: auto; padding: 14px 14px 64px 0; scrollbar-gutter: stable;
}
.pv-stock-side .pv-adm-nav-btn { font-size: calc(14px + var(--pv-fz-add2, 0px)); }
/* .pv-pmo-side-title 自带 flex:1（在那边是横排里的伸缩项）。搬到这根竖列里，
   flex:1 会让它把整列的高度吃掉，下面几个人名被挤到底部。 */
.pv-stock-side .pv-pmo-side-title { flex: none; padding: 0 9px; margin-bottom: 8px; }
/* 头像。没绑飞书身份的画首字母色块 —— 一排一模一样的通用小人不如没有 */
.pv-stock-face {
  flex: none; width: 20px; height: 20px; border-radius: 50%;
  object-fit: cover; background: var(--pv-bg);
}
.pv-stock-face.is-letter {
  display: inline-flex; align-items: center; justify-content: center;
  color: #fff; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 1;
}
/* 各人的账户总盈亏率，靠右站。涨绿跌红跟站里别处一致 */
.pv-stock-side-n {
  margin-left: auto; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700;
  color: var(--pv-text-faint); font-variant-numeric: tabular-nums;
}
.pv-stock-side-n.up { color: var(--pv-success); }
.pv-stock-side-n.down { color: var(--pv-danger); }
.pv-stock-main { min-width: 0; }
@media (max-width: 860px) {
  /* 窄屏排成一行小片，竖着占半屏太浪费 */
  .pv-stock.split { display: block; }
  .pv-stock-side {
    position: static; flex-direction: row; flex-wrap: wrap; align-items: center;
    margin: 0 0 14px; padding: 0 0 10px;
    border-right: none; border-bottom: 1px solid var(--pv-border);
  }
  .pv-stock-side .pv-adm-nav-btn { width: auto; }
  .pv-stock-side .pv-pmo-side-title { flex: none; margin-right: 4px; }
}
/* 在看别人的账本时挂一条，免得对着一屏不是自己的数字发懵 */
.pv-stock-peertip {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin: -4px 0 14px; padding: 8px 12px;
  background: var(--pv-primary-soft); color: var(--pv-primary-dark);
  border-left: 3px solid var(--pv-primary);
  border-radius: 0 var(--pv-radius-sm) var(--pv-radius-sm) 0;  /* 强调边不做圆角 */
  font-size: calc(12.5px + var(--pv-fz-add, 0px));
}
.pv-stock-peertip .pv-tune-more { color: var(--pv-primary-dark); text-decoration: underline; }

/* 任务抽屉里的项目下拉：按项目结构缩进。缩进给的是内边距而不是空格 ——
   中文空格宽度各字体不一样，用空格填出来的"对齐"换台机器就歪了。 */
.pv-projopt { display: block; }
.pv-projopt-i { color: var(--pv-text-faint); margin-right: 5px; font-size: calc(12px + var(--pv-fz-add, 0px)); }

/* 更新记录：一版一张卡。原来卡内 12px、卡间 8px —— 卡里卡外几乎一样紧，
   一屏挤下七八版，看着像一整块灰。里外都放一档，卡与卡之间比卡内更松，
   才分得出"这是一版"。 */
.pv-clog-item {
  padding: 16px 18px 14px; margin-bottom: 14px; background: var(--pv-bg);
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius);
}
.pv-clog-item:last-child { margin-bottom: 0; }
.pv-clog-item-head {
  display: flex; align-items: baseline; gap: 10px;
  /* 标题和正文之间原来只有 4px，版本号像贴在第一条上。压一条淡线断开 */
  margin-bottom: 10px; padding-bottom: 9px;
  border-bottom: 1px solid var(--pv-border);
  font-size: 15.5px; font-variant-numeric: tabular-nums;
}
.pv-clog-item-head b { color: var(--pv-text); }
.pv-clog-item-head .pv-muted { font-size: calc(12.5px + var(--pv-fz-add, 0px)); }

.pv-tune-group { margin-bottom: 16px; }
/* 只在更新记录这一页放大：同一套类还给 AI 调教用着，那页条目短、不需要这么松 */
.pv-clog .pv-tune-group { margin-bottom: 26px; }
.pv-clog .pv-tune-group-head {
  font-size: calc(15px + var(--pv-fz-add2, 0px)); padding-bottom: 8px; margin-bottom: 12px;
}
.pv-clog .pv-tune-bar { margin-bottom: 12px; }
.pv-clog .pv-wl-filters { margin-bottom: 16px; }
.pv-tune-group-head { font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text);
  padding-bottom: 5px; border-bottom: 1px solid var(--pv-border); margin-bottom: 4px; }
.pv-tune-rule { display: flex; align-items: center; gap: 9px; padding: 7px 2px;
  border-bottom: 1px dashed var(--pv-border); font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-tune-rule-text { color: var(--pv-text); }
.pv-tune-rule-text.off { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-tune-from {
  font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 1px 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark); white-space: nowrap;
}
.pv-tune-ctx {
  background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 10px 12px;
  margin-bottom: 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); line-height: 1.7;
}
.pv-tune-ctx b { display: inline-block; width: 34px; color: var(--pv-text-faint); font-weight: 600; }
.pv-tune-result { margin-top: 12px; padding: 10px 12px; border-radius: var(--pv-radius-sm); font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; }
.pv-tune-result.rule { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-tune-result.dev { background: var(--pv-info-soft); color: var(--pv-info-text); }
.pv-tune-result-rule { margin-top: 6px; font-weight: 700; color: var(--pv-text); }
.pv-tune-cmp { padding: 10px 12px; background: var(--pv-bg); border-radius: var(--pv-radius-sm); margin-bottom: 8px; }
.pv-tune-cmp.now { background: var(--pv-primary-soft); }
.pv-tune-cmp b { display: block; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 4px; }
.pv-tune-cmp div { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); white-space: pre-wrap; line-height: 1.7; }

/* ===== 设置 · 安全 pv-sec ===== */
.pv-sec .el-button--danger.is-plain { margin-top: 10px; }
.pv-sec-exp { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sec-exp.gone { color: var(--pv-danger-text); font-weight: 600; }
.pv-sec-log { margin-top: 8px; max-height: 340px; overflow-y: auto; }
.pv-sec-log-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 6px 2px; border-bottom: 1px dashed var(--pv-border); font-size: calc(12.5px + var(--pv-fz-add, 0px));
}
/* 失败那几行要跳出来 —— 翻这张表就是为了找它们 */
.pv-sec-log-row.bad .pv-sec-log-res { color: var(--pv-danger-text); font-weight: 700; }
.pv-sec-log-when { color: var(--pv-text-faint); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-sec-log-who { font-weight: 600; color: var(--pv-text); min-width: 56px; }
.pv-sec-log-res { color: var(--pv-success-text); }
.pv-sec-log-ip { color: var(--pv-text-soft); font-family: monospace; font-size: calc(12px + var(--pv-fz-add, 0px)); }

/* ===== 闲置自锁遮罩 pv-lock ===== */
.pv-lock {
  position: fixed; inset: 0; z-index: 3000;      /* 盖住一切，包括抽屉和悬浮球 */
  background: rgba(25, 27, 35, .55);
  backdrop-filter: blur(14px);                    /* 糊掉底下的内容 —— 锁了就不该还能读 */
  display: flex; align-items: center; justify-content: center; padding: 24px;
}
.pv-lock-box {
  width: 320px; max-width: 100%; background: var(--pv-surface);
  border-radius: var(--pv-radius); padding: 26px 22px 20px; text-align: center;
  box-shadow: var(--pv-shadow);
}
.pv-lock-icon { font-size: 34px; line-height: 1; margin-bottom: 10px; }
.pv-lock-title { font-size: 17px; font-weight: 700; color: var(--pv-text); }
.pv-lock-sub { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin: 6px 0 16px; line-height: 1.6; }
.pv-lock-err { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-danger-text); margin-top: 8px; }
.pv-lock-out {
  border: none; background: none; cursor: pointer; margin-top: 12px;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
.pv-lock-out:hover { color: var(--pv-primary-dark); }

/* ============================================================
   日历面板 pv-cal（版式参照 wbhrd-roadmap 的 PMO calendar）
   ============================================================ */
.pv-cal-brief {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-left: 4px solid var(--pv-primary);
  border-radius: 0 var(--pv-radius) var(--pv-radius) 0;   /* 强调边不做圆角 */
  padding: 14px 16px; margin-bottom: 18px;
}
/* 「今天」那张牌的头部，版式参考老黄历：左边一个大号的日子，右边竖着堆周几和年月，
   右上角一枚角标。原来是一行「今天 · 2026-08-31」的普通标题 ——
   日期是这张牌上唯一一直会变的东西，值得比正文大一圈。
   （农历和宜忌没做：那要一套农历换算 + 黄历数据，站里没有；
     宁可空着也不能显示错的。空出来的横向位置给了右上角那枚角标。） */
.pv-cal-brief-head {
  display: flex; align-items: center; gap: 12px; margin-bottom: 12px;
  padding-bottom: 10px; border-bottom: 1px solid var(--pv-border);
  flex-wrap: wrap;
}
/* 抬头里日期旁边那几条"这一天本身的事"（假期 / 生日纪念）：类别片 + 名字，点了去那一页 */
.pv-cal-dayassoc { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 16px; margin-left: 10px; }
.pv-cal-dayassoc-item {
  display: inline-flex; align-items: center; gap: 7px; border: none; background: none; padding: 0;
  cursor: pointer; font: inherit; font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text); text-align: left;
}
.pv-cal-dayassoc-item:hover .pv-cal-dayassoc-title { color: var(--pv-primary-dark); text-decoration: underline; }
@media (max-width: 640px) { .pv-cal-dayassoc { margin-left: 0; flex: 1 1 100%; order: 5; } }
.pv-cal-daybig {
  font-size: 40px; line-height: .95; font-weight: 700; color: var(--pv-primary-dark);
  letter-spacing: -2px; font-variant-numeric: tabular-nums; flex: none;
}
.pv-cal-daymeta { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.pv-cal-dayweek { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); line-height: 1.25; }
.pv-cal-dayym { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.3; }
.pv-cal-daybadge {
  flex: none; white-space: nowrap; align-self: flex-start;
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .08em;
  padding: 3px 9px; border-radius: var(--pv-radius-pill);
  background: var(--pv-primary); color: #fff;
}
/* 「接下来」里的周几：假期落在周一还是周六是两件事，得跟日期一样显眼 */
.pv-cal-brief-soon b { color: var(--pv-text); font-weight: 700; }
/* 四栏平分，一类占一栏。
   原来是 flex-wrap 横着排，几类挨着流下来 —— 「PMO 里程碑」和「要买」贴在一起，
   看不出那是两件事。分栏之后每类各占一份宽度，栏与栏之间自然就隔开了。
   手机上四栏每栏只剩几十像素，逐级降到两栏、一栏。 */
.pv-cal-brief-list {
  /* 上下那道沟要比左右宽（用户 2026-09-25）：同一排靠的是竖着的空白分栏，一眼就分得开；
     上下两排之间没有这种分隔，12px 一挤，第二排的类别小签就贴在第一排折行的文字上。 */
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px 20px;
  align-items: start;      /* 每栏各自顶端起笔，不被同排最高的那栏拉着 */
  margin-bottom: 20px;     /* 跟底下「接下来」那道虚线之间再留 20（用户 2026-10-02：先加 10 又加 10） */
}
/* 断点按**内容区**宽度倒推，不是拍脑袋定的：内容区 ≈ 视口 − 侧栏 232 − 左右留白 48。
   四栏各要 160px 打底、三条 20px 的沟 → 内容区 700px → 视口 980px。
   （原来定 1100 太早，1440 以下的窗口就都掉成两栏了。） */
@media (max-width: 980px) { .pv-cal-brief-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px) { .pv-cal-brief-list { grid-template-columns: minmax(0, 1fr); } }
.pv-cal-brief-soon {
  margin-top: 10px; padding-top: 9px; border-top: 1px dashed var(--pv-border);
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
}
/* 今天没安排时上面是空的，这条虚线就没有东西可分隔了 —— 撤掉，别凭空画一道线 */
.pv-cal-brief-soon.bare { margin-top: 2px; padding-top: 0; border-top: none; }
/* 「接下来」一条（用户 2026-09-25 重排）：名字加粗 → 短日期 → 几天 → 还有多久。
   四段用间距分开，不再糊成一长串，也不用读到「2026-」这种对当下毫无信息量的前缀。 */
.pv-cal-soon-item { display: inline-flex; align-items: baseline; gap: 6px; margin-left: 16px; white-space: nowrap; }
.pv-cal-soon-item b { font-weight: 600; color: var(--pv-text); }
.pv-cal-soon-item i { font-style: normal; color: var(--pv-text-soft); font-variant-numeric: tabular-nums; }
.pv-cal-soon-item em { font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 18px;
                       padding: 0 6px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-cal-soon-item u { text-decoration: none; color: var(--pv-text-faint); }
/* 点一条 → 日历翻到那天（用户 2026-09-25）。悬停给整条垫个底、名字转主色，
   让人看出这四段是一个可点的整体，而不是四个各管各的小标签。 */
.pv-cal-soon-item.is-link { cursor: pointer; border-radius: 6px; padding: 1px 6px; margin-left: 10px;
                            transition: background .12s, color .12s; }
.pv-cal-soon-item.is-link:hover { background: var(--pv-bg); }
.pv-cal-soon-item.is-link:hover b { color: var(--pv-primary); }
.pv-cal-soon-item.is-link:hover em { background: var(--pv-surface); }
.pv-cal-soon-item.is-link:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: 1px; }

/* 日历工具条（用户 2026-11-04 定稿，设计稿「首页日历工具条 · 定稿」）：月份标题领头，两颗灰圆钮翻页，
   蓝色小胶囊「回到今天」（不跟主色抢），月 / 周靠右做成灰轨白滑块——不再是五颗一样的白胶囊、选中铺实心橙 */
.pv-cal-bar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-cal-title { margin-right: 8px; font-size: calc(20px + var(--pv-fz-add2, 0px)); line-height: 30px; font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-cal-arrow { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; padding: 0; border: 0; border-radius: 50%; background: var(--pv-bg); color: #4a4f60; cursor: pointer; transition: background .12s, color .12s; }
.pv-cal-arrow:hover { background: #e9ebf1; color: var(--pv-text); }
.pv-cal-today { height: 26px; margin-left: 4px; padding: 0 12px; border: 0; border-radius: var(--pv-radius-pill); background: var(--pv-bg); color: #4a4f60; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; line-height: 26px; white-space: nowrap; cursor: pointer; transition: background .12s, color .12s; }   /* 灰色（用户 2026-11-04：跟两颗翻页圆钮同一种灰，原来是蓝胶囊） */
.pv-cal-today:hover { background: #e9ebf1; color: var(--pv-text); }
.pv-cal-bar-sp { flex: 1; }
.pv-cal-viewseg { display: inline-flex; padding: 3px; border-radius: 10px; background: #f0f1f5; }
.pv-cal-viewseg button { height: 26px; padding: 0 16px; border: 0; border-radius: 7px; background: transparent; color: var(--pv-text-soft); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; transition: background .12s, color .12s, box-shadow .12s; }
.pv-cal-viewseg button:hover:not(.on) { color: var(--pv-text); }
.pv-cal-viewseg button.on { background: var(--pv-surface); color: var(--pv-text); font-weight: 600; box-shadow: 0 1px 3px rgba(25, 27, 35, .12); }

/* 图例就是筛选器：关掉的那类整块淡下去 */
.pv-cal-legend { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 12px; }
/* 两种筛选之间的竖杠。左边那颗管「做完的算不算」，右边一排管「显示哪几类」——
   两个不同维度混在一排里，看着像九个平级的开关，其实第一个跟后面八个不是一回事。 */
.pv-cal-legend-sep {
  width: 1px; height: 18px; background: var(--pv-border);
  margin: 0 6px; flex: none; align-self: center;
}
/* 里面的圆点、文字、计数都用 inline-flex 对齐到同一条中线 ——
   计数那个 <b> 原来是行内元素，靠基线对齐，在 28px 的胶囊里偏上。 */
/* 计数不加粗：它是"这一类有几条"的补充，不该比类别名本身还重。
   （<b> 留着是语义，样式上抹平。） */
.pv-cal-legend-btn b { display: inline-flex; align-items: center; line-height: 1; font-weight: 400; }
.pv-cal-legend-btn {
  display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 11px;
  line-height: 1;
  border: 1px solid var(--pv-border); background: var(--pv-surface); cursor: pointer;
  border-radius: var(--pv-radius-pill); font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  transition: opacity .12s, border-color .12s;
}
/* 选中＝有底色。原来选中和关掉的差别只有 opacity（100% vs 42%），
   在白底上两者都是白胶囊，一眼看不出哪几个开着。现在选中的填一层它自己那类的
   淡色底，关掉的退成白底虚线框 —— 是"填没填色"的差别，不是"深一点浅一点"。 */
.pv-cal-legend-btn { background: var(--pv-bg); }        /* 不支持 color-mix 时的兜底 */
.pv-cal-legend-btn:not(.off):not(.pv-cal-donebtn) {
  background: color-mix(in srgb, var(--pv-k, var(--pv-text-faint)) 13%, #fff);
  border-color: color-mix(in srgb, var(--pv-k, var(--pv-text-faint)) 34%, #fff);
  color: var(--pv-text); font-weight: 600;
}
.pv-cal-legend-btn:hover { border-color: var(--pv-primary); }
.pv-cal-legend-btn.off {
  opacity: 1; background: var(--pv-surface); border-style: dashed;
  color: var(--pv-text-faint); font-weight: 400;
}
.pv-cal-legend-btn.off .pv-cal-dot { background: var(--pv-border); }
.pv-cal-legend-btn.off .pv-cal-dot-flag { opacity: .35; }
.pv-cal-dot { width: 9px; height: 9px; border-radius: 3px; flex: none; }

/* 每一类各一个颜色，全部取自站内既有 token（--pv-cat-*）。
   同一个颜色再挂一份到 --pv-k 上：筛选器要拿它调出一个"选中"的浅底，
   而 background 那份没法被别的属性复用。两份写在一起，改颜色只用改一行。 */
.k-schedule { --pv-k: var(--pv-cat-2); }
.k-anniv    { --pv-k: var(--pv-cat-4); }
.k-habit    { --pv-k: var(--pv-cat-3); }
.k-sports   { --pv-k: var(--pv-cat-10); }
.k-meal     { --pv-k: var(--pv-cat-1); }
.k-holiday  { --pv-k: var(--pv-cat-5); }
.k-holact   { --pv-k: var(--pv-cat-5); }   /* 节前准备：跟假期同一支紫，一看就知道是跟着节日来的（用户 2026-09-28） */
.k-review   { --pv-k: var(--pv-cat-12); }
.k-finance  { --pv-k: var(--pv-cat-7); }
.k-task     { --pv-k: var(--pv-cat-6); }
.k-question { --pv-k: var(--pv-cat-11); }
.k-shared-task { --pv-k: var(--pv-cat-9); }
.k-shared-chore { --pv-k: var(--pv-cat-9); }   /* 跟共享 PMO 同色系（用户 2026-09-24：都是别人的活儿） */
.k-milestone{ --pv-k: #1D4ED8; }
.k-chore    { --pv-k: var(--pv-cat-3); }   /* 日常小事：不挂项目的随手活儿，绿一档，跟 PMO 任务（紫）分开 */
.k-grocery  { --pv-k: var(--pv-cat-12); }   /* 灰青（用户 2026-09-10：红色只给逾期） */
.k-wish     { --pv-k: var(--pv-cat-8); }
.k-schedule .pv-cal-dot, .pv-cal-chip.k-schedule { background: var(--pv-cat-2); }
.k-anniv    .pv-cal-dot, .pv-cal-chip.k-anniv    { background: var(--pv-cat-4); }
.k-habit    .pv-cal-dot, .pv-cal-chip.k-habit    { background: var(--pv-cat-3); }
.k-sports   .pv-cal-dot, .pv-cal-chip.k-sports   { background: var(--pv-cat-10); }
.k-meal     .pv-cal-dot, .pv-cal-chip.k-meal     { background: var(--pv-cat-1); }
.k-holiday  .pv-cal-dot, .pv-cal-chip.k-holiday  { background: var(--pv-cat-5); }
.k-holact   .pv-cal-dot, .pv-cal-chip.k-holact   { background: var(--pv-cat-5); }
/* 心愿购物：填了计划购买日期的那条。取 --pv-cat-8 暖褐 —— 跟买菜那支红拉开 */
.k-wish     .pv-cal-dot, .pv-cal-chip.k-wish     { background: var(--pv-cat-8); }
/* 日记复盘：设了复盘日期的记录，那天提醒回头看看。取 --pv-cat-12 灰青 ——
   它是"回头看"，不是"要做的活儿"，不该跟待办那支橙红抢注意力。 */
.k-review   .pv-cal-dot, .pv-cal-chip.k-review   { background: var(--pv-cat-12); }
/* 财务状况：每月登记那一条。取 --pv-cat-7 青 —— 跟收支看板同一支色系。
   它原来混在「PMO 任务」里，可它跟项目管理没有半点关系。 */
.k-finance  .pv-cal-dot, .pv-cal-chip.k-finance  { background: var(--pv-cat-7); }
/* 待办：项目管理里的任务。没做完就跟着今天走 */
.k-task     .pv-cal-dot, .pv-cal-chip.k-task     { background: var(--pv-cat-6); }
/* 提问：评论区里「标为提问」出来的，谁来答、哪天答。取 --pv-cat-11 粉紫 ——
   跟任务那支橙红、共享那支蓝紫都拉得开，一眼分得出"这是个等人回答的问题"。 */
.k-question .pv-cal-dot, .pv-cal-chip.k-question { background: var(--pv-cat-11); }
/* 共享 PMO：别人负责的活儿。取 --pv-cat-9 蓝紫 —— 跟自己那支橙红拉开，
   一眼分得出"这条不是我要干的"。条目前面写着是谁的。 */
.k-shared-task .pv-cal-dot, .pv-cal-chip.k-shared-task,
.k-shared-chore .pv-cal-dot, .pv-cal-chip.k-shared-chore { background: var(--pv-cat-9); }
/* 里程碑：项目节点。蓝色 + 一面小旗子，两样都照搬 wbhrd roadmap（#1d4ed8 / fo-cal-ms-icon）。
   原来用主题黄，跟站里到处都是的主色撞在一起，"这是个节点"这层意思就没了。 */
.k-milestone .pv-cal-dot, .pv-cal-chip.k-milestone { background: #1D4ED8; }
.k-chore     .pv-cal-dot, .pv-cal-chip.k-chore     { background: var(--pv-cat-3); }
/* 要买：红底。原来是暖褐，混在一堆土色里看不出来 —— 而这一类是"今天出门要办的事"。 */
.k-grocery  .pv-cal-dot, .pv-cal-chip.k-grocery  { background: var(--pv-cat-12); }

/* 月历改成「按周分行」而不是一个 42 格的大网格 —— 跨天假期要画成一条连续的横条，
   而横条必须以周为单位（跨周的假期在每周各画一段）。一个大网格里做不到跨列合并。 */
.pv-cal-wrap {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius); overflow: hidden;
  background: var(--pv-border);      /* 露出来的 1px 缝就是格线 */
}
.pv-cal-head7, .pv-cal-row, .pv-cal-band {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 1px;
}
.pv-cal-head7 { margin-bottom: 1px; }
.pv-cal-week + .pv-cal-week { margin-top: 1px; }
.pv-cal-wd {
  background: var(--pv-bg); text-align: center; padding: 7px 0;
  /* 不加粗：周一到周日是格线的一部分，不是内容。加粗之后它比格子里真正的事还响 */
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint);
}
/* 假期带：贴在这一周日格的正上方，跨几天就横跨几列 */
.pv-cal-band { background: var(--pv-surface); padding: 3px 3px 0; gap: 3px; }
.pv-cal-band-item {
  background: var(--pv-cat-5); color: #fff; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.7;
  padding: 1px 8px; border-radius: 4px; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.pv-cal-band-n { margin-left: 6px; opacity: .8; }
.pv-cal-band-ic { font-style: normal; }
.pv-cal-cell {
  /* 少画一行（6 周→多数月份 5 周）省出来的高度补给每格，格子里能多站一条事件 */
  background: var(--pv-surface); min-height: 118px; padding: 6px 6px 7px;
  display: flex; flex-direction: column; gap: 2px; transition: background .12s;
  min-width: 0;      /* 不给这条，flex 子项的默认 min-width:auto 会把列撑宽 */
  position: relative;   /* 右上角的调休小标（.pv-cal-shift）靠它定位 */
}
.pv-cal-cell > * { max-width: 100%; }
.pv-cal-wrap.v-week .pv-cal-cell { min-height: 200px; }
.pv-cal-cell:hover { background: var(--pv-bg); }
.pv-cal-cell.other { background: var(--pv-bg); }
.pv-cal-cell.other .pv-cal-daynum { color: var(--pv-text-faint); opacity: .55; }
.pv-cal-cell.today .pv-cal-daynum {
  background: var(--pv-primary); color: #fff; border-radius: 50%; width: 22px; justify-content: center;
}
.pv-cal-cell.open { box-shadow: inset 0 0 0 2px var(--pv-primary); }
/* 日期数字那行定高 22px（用户 2026-09-08）：今天那颗橙圆是 22px，普通数字只有一行字高，
   两种格子里第一条事件的起点差了几像素、横着看不齐。现在都占 22px，圆只是画在同一格里。 */
.pv-cal-daynum {
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-soft); margin-bottom: 2px;
  height: 22px; display: flex; align-items: center; flex: none;
}
.pv-cal-chip {
  color: #fff; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.5; padding: 1px 6px;
  border-radius: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pv-cal-chip b { font-weight: 600; opacity: .85; margin-right: 3px; }
/* 「要买」后面跟上去哪买。chip 本来就是 nowrap + 省略号，装不下自己会截成「…」，
   不会把格子撑高 —— 所以这儿不用另设宽度或行数。
   压暗一档：地点是品名的补充，先读的应该是买什么。 */
.pv-cal-chip-at { opacity: .78; margin-left: 5px; }
.pv-cal-chip-at i { margin-right: 2px; font-size: calc(10.5px + var(--pv-fz-add, 0px)); vertical-align: -.5px; }
.pv-cal-more { font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); padding-left: 3px; }

.pv-cal-day {
  margin-top: 14px; background: var(--pv-surface);
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius); padding: 12px 14px;
}
.pv-cal-day-head { display: flex; align-items: center; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700;
  color: var(--pv-text); margin-bottom: 8px; }
.pv-cal-day-row { display: flex; align-items: center; gap: 9px; padding: 6px 0;
  border-bottom: 1px dashed var(--pv-border); font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-cal-day-row:last-child { border-bottom: none; }
.pv-cal-day-title { flex: 1; min-width: 0; color: var(--pv-text); }

@media (max-width: 640px) {
  /* 手机上格子塞不下事件条：只留日期 + 一个小圆点表示"这天有事"，点开看详情 */
  .pv-cal-cell { min-height: 54px; padding: 4px 2px; align-items: center; }
  .pv-cal-chip { display: none; }
  .pv-cal-cell .pv-cal-chip:first-of-type { display: block; width: 6px; height: 6px; padding: 0; border-radius: 50%; text-indent: -999px; }
  .pv-cal-more { display: none; }
  .pv-cal-soon-item { display: block; margin-left: 0; margin-top: 3px; }
  /* 「今天」那张牌：手机上大号日子收一档。年月那行原来省掉了，用户 2026-10-10 要回来：手机上看不出今天是哪年哪月 */
  .pv-cal-daybig { font-size: 32px; }
}

/* ===== 生日与纪念日 pv-anniversary-view ===== */
.pv-ann-item {
  display: flex; align-items: center; gap: 13px; padding: 11px 6px;
  border-bottom: 1px solid var(--pv-border);
}
/* 左边那个大数字就是这个界面的全部重点：还有几天。越近越显眼 */
.pv-ann-days {
  flex: none; width: 62px; text-align: center; line-height: 1.1;
  color: var(--pv-text-faint);
}
.pv-ann-days b { display: block; font-size: 22px; font-weight: 700; color: var(--pv-text-soft); }
.pv-ann-days i { font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
.pv-ann-item.near .pv-ann-days b { color: var(--pv-primary-dark); }
.pv-ann-item.soon .pv-ann-days b { color: var(--pv-primary); }
.pv-ann-item.soon { background: var(--pv-primary-soft); border-left: 3px solid var(--pv-primary); padding-left: 10px; }
.pv-ann-item.now { background: var(--pv-danger-soft); border-left: 3px solid var(--pv-danger); padding-left: 10px; }
.pv-ann-item.now .pv-ann-days b { color: var(--pv-danger-text); font-size: 17px; }
.pv-ann-item.past { opacity: .6; }
/* 整条可点（用户 2026-09-25）：悬停整行浅底 + 名字转主色，说明点哪儿都行 */
.pv-ann-item.is-link { cursor: pointer; transition: background .12s; }
.pv-ann-item.is-link:hover { background: var(--pv-bg); }
.pv-ann-item.is-link.soon:hover { background: var(--pv-primary-soft); }
.pv-ann-item.is-link.now:hover { background: var(--pv-danger-soft); }
.pv-ann-item.is-link:hover .pv-ann-name { color: var(--pv-primary); }
.pv-ann-item.is-link:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: -2px; }
.pv-ann-main { flex: 1; min-width: 0; }
.pv-ann-name { font-weight: 600; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text); }
.pv-ann-type {
  margin-left: 8px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; padding: 1px 8px;
  border-radius: var(--pv-radius-pill); background: var(--pv-bg); color: var(--pv-text-faint);
}
/* 现在多大 · 只有月日：跟类型小签同一副长相，各自换个颜色（用户 2026-09-27）。
   年龄是这一行里真正想看的数，给主色；「只有月日」是一句提醒「这条还缺年份」，淡到底。 */
.pv-ann-age, .pv-ann-noyear {
  margin-left: 6px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; padding: 1px 8px;
  border-radius: var(--pv-radius-pill); white-space: nowrap;
}
.pv-ann-age { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-ann-noyear { border: 1px dashed var(--pv-border); color: var(--pv-text-faint); }
.pv-ann-meta { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 2px; }
/* 刚过去的（还在一个月内）：留在最上面，但别抢正在逼近的那几条的注意力 ——
   左边一道灰竖条说明「这条是回头看的」，数字降到浅灰。 */
.pv-ann-item.gone { background: var(--pv-bg); border-left: 3px solid var(--pv-text-faint); padding-left: 10px; }
.pv-ann-item.gone .pv-ann-days b { font-size: 17px; color: var(--pv-text-faint); }
.pv-ann-item.gone .pv-ann-name { font-weight: 500; }

/* ===== 打卡 pv-habit-view ===== */
.pv-hb-item {
  display: flex; align-items: center; gap: 11px; padding: 11px 6px;
  border-bottom: 1px solid var(--pv-border);
}
.pv-hb-item.overdue { background: var(--pv-danger-soft); border-left: 3px solid var(--pv-danger); padding-left: 10px; }
.pv-hb-item.overdue .pv-hb-meta b { color: var(--pv-danger-text); }
.pv-hb-item.today { background: var(--pv-primary-soft); border-left: 3px solid var(--pv-primary); padding-left: 10px; }
.pv-hb-item.today .pv-hb-meta b { color: var(--pv-primary-dark); }
/* 运动安排整行点开编辑（跟任务列表最新那版一致），打卡本身没有这个交互，只加这一条 */
.pv-hb-item.clickable { cursor: pointer; }
.pv-hb-item.clickable:hover { background: var(--pv-bg); }
.pv-hb-main { flex: 1; min-width: 0; }
.pv-hb-name { font-weight: 600; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text); }
.pv-hb-step {
  margin-left: 8px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; padding: 1px 8px;
  border-radius: var(--pv-radius-pill); background: var(--pv-bg); color: var(--pv-text-faint);
}
.pv-hb-meta { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 2px; }
@media (max-width: 640px) {
  .pv-ann-item, .pv-hb-item { flex-wrap: wrap; gap: 8px; }
  .pv-hb-main { flex: 1 1 100%; }
}

/* ===== 假期安排 pv-holiday-view ===== */
.pv-hol-next {
  display: flex; align-items: baseline; gap: 9px; flex-wrap: wrap;
  background: var(--pv-primary-soft); border-left: 4px solid var(--pv-primary);
  border-radius: 0 var(--pv-radius) var(--pv-radius) 0;   /* 强调边不做圆角 */
  padding: 12px 16px; margin-bottom: 16px;
}
.pv-hol-next-k { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-hol-next b { font-size: 17px; color: var(--pv-text); }
.pv-hol-next-when { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-hol-next-d { margin-left: auto; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-primary-dark); }
/* ---- 一个假期一行（用户 2026-09-28：结构照原来那张通用表格，壳就是 .pv-table-wrap + el-table）----
   电脑上是表；手机上同一份数据画成一列（.pv-hol-list），每个假期：名字 + 还有几天 / 日期 · 地区 / 特殊行动。 */
.pv-hol-name { font-weight: 600; color: var(--pv-text); }
/* 备注那一列窄，靠多折几行放下；按字折、不把「10/10（周六）」这种从中间掰开得太碎 */
.pv-hol-note { display: block; line-height: 1.5; word-break: normal; overflow-wrap: anywhere; color: var(--pv-text-soft); }
.pv-hol-tbl .el-table tr.pv-hol-gone .pv-hol-note { color: var(--pv-text-faint); }
.pv-hol-left { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-hol-left.soon { color: var(--pv-primary-dark); font-weight: 600; }
.pv-hol-left.now { color: var(--pv-danger-text); font-weight: 600; }
/* 今年已经过了、明年的还没录进来：压淡，排在表底 */
.pv-hol-tbl .el-table tr.pv-hol-gone td { color: var(--pv-text-faint); }
.pv-hol-tbl .el-table tr.pv-hol-gone .pv-hol-name { color: var(--pv-text-soft); font-weight: 500; }
.pv-hol-list { display: none; }
.pv-hol-item { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; padding: 11px 2px; border-bottom: 1px solid var(--pv-border);
               font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-hol-item .pv-hol-name { flex: 1; min-width: 0; }
.pv-hol-item .pv-hol-when { flex: 1 1 100%; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-hol-item .pv-hol-cell { flex: 1 1 100%; margin-top: 4px; }
.pv-hol-item.gone .pv-hol-name { color: var(--pv-text-soft); font-weight: 500; }
/* ---- 特殊行动（用户 2026-09-28）：每个假期前要做的事。表里最后一列 = 一排行动名字的小签 + 末尾一颗钮 ---- */
.pv-hol-cell { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
/* 入口：照抽屉标签行右边那颗小钮（22 高、虚线边） */
.pv-hol-actbtn { letter-spacing: 0; background: var(--pv-surface); }
/* 行动只写名字（用户 2026-09-28：不要太多信息），哪天提醒在悬停里 */
.pv-hol-act { display: inline-flex; align-items: center; height: 22px; box-sizing: border-box; padding: 0 9px; border-radius: 4px; background: var(--pv-surface);
              border: 1px solid var(--pv-border); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1; color: var(--pv-text-soft); white-space: nowrap; flex-shrink: 0; }
/* 手机那一列里的问候开关：一行「问候 ○」 */
.pv-hol-greet { display: inline-flex; align-items: center; gap: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 小签可以点：今年做完了打钩、划掉；再点撤回（用户 2026-09-30） */
.pv-hol-act.can { cursor: pointer; } .pv-hol-act.can:hover { border-color: var(--pv-primary); color: var(--pv-text); }
.pv-hol-act.done { color: var(--pv-text-faint); text-decoration: line-through; background: var(--pv-bg); }
.pv-hol-act.done::before { content: '✓ '; text-decoration: none; color: #2E7D46; }
/* 从日历点过来落到的那一行：闪一下 */
.pv-hol-tbl .el-table tr.pv-hol-focus td, .pv-hol-item.pv-hol-focus { animation: pv-hol-flash 2s ease; }
@keyframes pv-hol-flash { 0%, 55% { background-color: var(--pv-primary-soft); } 100% { background-color: transparent; } }
/* 抽屉里的行动名单：一行 = 勾选 + 名字 … 提前几天的小签 + 改 / 拿掉 */
.pv-hol-actrow { gap: 6px; }
.pv-hol-actrow .nm { flex: 1; min-width: 0; display: flex; align-items: center; margin: 0; }
.pv-hol-actrow .nm .el-checkbox__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-hol-actrow .el-input.nm .el-input__inner { height: 28px; line-height: 28px; }
.pv-hol-leadtag { flex: none; display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; background: var(--pv-bg);
                  font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1; color: var(--pv-text-soft); white-space: nowrap; }
.pv-hol-lead { flex: none; display: inline-flex; align-items: center; gap: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-hol-lead .el-input-number { width: 58px; }
.pv-hol-lead .el-input-number .el-input__inner { padding: 0 6px; text-align: center; border-radius: var(--pv-radius-btn); }
.pv-hol-actrow .pv-hol-lead .el-input-number, .pv-hol-actrow .pv-hol-lead .el-input-number .el-input__inner { height: 28px; line-height: 28px; }
.pv-drawer .pv-hol-actadd { margin-top: 0; align-items: center; }
.pv-drawer .pv-hol-actadd > .el-input { flex: 1; min-width: 0; }
@media (max-width: 640px) {
  .pv-hol-tbl { display: none; }
  .pv-hol-list { display: block; }
  .pv-drawer .pv-hol-actadd { flex-wrap: wrap; }
  .pv-drawer .pv-hol-actadd > .el-input { flex: 1 1 100%; }
}

/* ===== 快乐游戏库 pv-gamelib-view ===== */
.pv-gl-group { margin-bottom: 22px; }
.pv-gl-group-head {
  font-size: 16px; font-weight: 700; color: var(--pv-text);
  padding-bottom: 7px; border-bottom: 2px solid var(--pv-primary); margin-bottom: 4px;
}
.pv-gl-group-head .pv-muted { font-weight: 400; font-size: calc(12.5px + var(--pv-fz-add, 0px)); margin-left: 8px; }
.pv-gl-cat-head {
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-soft);
  margin: 12px 0 4px; padding-left: 2px;
}
/* 条目之间不画线、悬停亮整行、字号小一档 —— 跟买菜清单同一套（用户 2026-09-03） */
.pv-gl-item {
  display: flex; align-items: center; gap: 10px; padding: 7px 6px;
  border-radius: var(--pv-radius-sm); transition: background .12s;
}
.pv-gl-item:hover { background: var(--pv-bg); }
.pv-gl-main { flex: 1; min-width: 0; }
.pv-gl-name { font-weight: 600; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-gl-meta { display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 2px;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 「还没玩过」用主色点出来 —— 翻这个库多半就是为了找久没玩/没玩过的 */
.pv-gl-last { color: var(--pv-text-soft); }
.pv-gl-last.never { color: var(--pv-primary-dark); font-weight: 600; }
.pv-gl-histbtn {
  flex: none; border: 1px solid var(--pv-border); background: var(--pv-surface);
  color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 2px 9px;
  border-radius: var(--pv-radius-pill); cursor: pointer;
}
.pv-gl-histbtn:hover, .pv-gl-histbtn.on { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-gl-hist {
  padding: 8px 10px; margin: 0 0 8px 2px; background: var(--pv-bg);
  border-radius: var(--pv-radius-sm); font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); line-height: 1.9;
}
@media (max-width: 640px) {
  .pv-gl-item { flex-wrap: wrap; gap: 8px; }
  .pv-gl-main { flex: 1 1 100%; }
}

/* ===== 影视待看 pv-watchlist-view ===== */
.pv-wl-filters { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0 16px; }
.pv-wl-sec { margin-bottom: 18px; }
.pv-wl-sec-head { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); margin-bottom: 8px; }
.pv-wl-sec-head .pv-muted { font-weight: 400; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-wl-type {
  flex: none; width: 52px; text-align: center; font-size: calc(12px + var(--pv-fz-add, 0px));
  color: var(--pv-text-soft); background: var(--pv-bg);
  padding: 2px 0; border-radius: var(--pv-radius-pill);
}
.pv-wl-main { flex: 1; min-width: 0; }
/* 来龙去脉抽屉里的一行「字段：旧 → 新」 */
.pv-wl-hist-line { margin-top: 4px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; word-break: break-word; }
.pv-wl-name { font-weight: 600; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-wl-meta { display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 2px;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-wl-plat { color: var(--pv-info-text); background: var(--pv-info-soft);
  padding: 0 7px; border-radius: var(--pv-radius-pill); }
/* 第几遍：只在 >1 时出现，所以给它一个真的会被看见的颜色 */
.pv-wl-times { color: var(--pv-primary-dark); background: var(--pv-primary-soft);
  padding: 0 7px; border-radius: var(--pv-radius-pill); font-weight: 600;
  white-space: nowrap; flex-shrink: 0; }
/* 「开始看」绿、「看完了」红。两个动作在卡片同一个位置轮流出现，颜色不一样
   才不会按成惯性 —— 尤其「看完了」按错要回编辑弹窗才改得回来。 */
.el-button.pv-wl-go, .el-button.pv-wl-fin {
  color: #fff; font-weight: 600;
  padding: 5px 11px; font-size: calc(12px + var(--pv-fz-add, 0px));    /* 比 mini 再收一档：卡片里它不该占掉半行 */
}
.el-button.pv-wl-go { background: var(--pv-success); border-color: var(--pv-success); }
.el-button.pv-wl-go:hover, .el-button.pv-wl-go:focus {
  background: var(--pv-success-text); border-color: var(--pv-success-text); color: #fff;
}
.el-button.pv-wl-fin { background: var(--pv-danger); border-color: var(--pv-danger); }
.el-button.pv-wl-fin:hover, .el-button.pv-wl-fin:focus {
  background: var(--pv-danger-text); border-color: var(--pv-danger-text); color: #fff;
}

/* ---- 两栏：左边类型导航 + 右边卡片 ----
   类型原来是顶上一排片，六七个横过去会把「在看」那段挤到首屏之外。竖着排既不吃
   垂直空间，类型再多也只是往下长。按钮样式直接用项目管理那套 .pv-pmo-nav-btn。 */
.pv-wl-layout {
  display: grid; gap: 20px; align-items: start;
  grid-template-columns: auto minmax(0, 1fr);   /* 左栏是 <pv-rail>（默认 148） */
}
.pv-wl-side {
  display: flex; flex-direction: column; gap: var(--pv-nav-gap);
  position: sticky; top: calc(var(--pv-topbar-h) + 12px);
  max-height: calc(100vh - var(--pv-topbar-h) - 40px); overflow-y: auto;
}
.pv-wl-side .pv-pmo-nav-btn b { float: right; font-weight: 700; opacity: .65; }
.pv-wl-body { min-width: 0; }
@media (max-width: 860px) {
  /* 手机：竖栏躺平成一条横向滚动的片，不吸顶（页面本来就短） */
  .pv-wl-layout { grid-template-columns: 1fr; gap: 12px; }
  .pv-wl-side {
    position: static; max-height: none; flex-direction: row; gap: 6px;
    overflow-x: auto; padding-bottom: 2px;
  }
  .pv-wl-side .pv-pmo-nav-gtitle { display: none; }
  .pv-wl-side .pv-pmo-nav-btn { width: auto; flex: none; border-radius: var(--pv-radius-pill); }
  .pv-wl-side .pv-pmo-nav-btn b { float: none; margin-left: 5px; }
  /* 其他清单那列用的是 .pv-adm-nav-btn：手机上同样躺平成一排片，「＋ 新建清单」跟在最后 */
  .pv-wl-side .pv-adm-nav-btn { width: auto; flex: none; border-radius: var(--pv-radius-pill); }
  .pv-wl-side .pv-adm-nav-btn b { margin-left: 5px; }
  .pv-wl-side .pv-fold-side-foot { margin: 0 0 0 auto; padding-top: 0; border-top: none; }
}

/* ---- 卡片网格 ----
   原来是一行一条的列表：一屏放不下十几个，而每条真正要说的（类型 / 平台 / 第几遍）
   都是短标签，横着摆更省地方也更好扫。minmax 的下限按"最长的中文剧名两行放得下"定；
   auto-fill 让窄屏自己掉成一列，不用另写断点。
   卡片留了 --pv-wl-cover 这个位置的余地：以后要加封面图，在 .pv-wl-card 顶部插一张
   16:9 或 2:3 的图即可，下面这套间距不用动。 */
.pv-wl-grid {
  display: grid; gap: 10px; align-items: start;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
}
.pv-wl-card {
  display: flex; flex-direction: column; gap: 6px;
  padding: 11px 12px; background: var(--pv-surface);
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  transition: border-color .12s, box-shadow .12s;
}
.pv-wl-card:hover { border-color: var(--pv-primary); box-shadow: var(--pv-shadow); }
/* 在看的那几张给一道主色左边（强调边不做圆角）—— 一眼看出现在在追什么 */
.pv-wl-card.st-在看 {
  background: var(--pv-primary-soft); border-left: 3px solid var(--pv-primary);
  border-radius: 0 var(--pv-radius-sm) var(--pv-radius-sm) 0;
}
.pv-wl-card.st-看完 .pv-wl-card-name { color: var(--pv-text-faint); }
/* 类型那行跟标题之间拉开：它俩是两层信息（这是什么 / 叫什么），
   贴着的时候读起来像一句被折行的话 */
.pv-wl-card-top { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
/* 影视书籍（用户 2026-09-20）：地区小签跟类型并排；标题后面另一个名字淡一点；顶行左「加进想看」右「配置」；配置抽屉里的「中文名在前」开关 */
.pv-wl-region { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); background: var(--pv-bg); padding: 2px 8px; border-radius: var(--pv-radius-pill); white-space: nowrap; }
.pv-wl-alt { color: var(--pv-text-faint); font-weight: 400; font-size: calc(12.5px + var(--pv-fz-add, 0px)); margin-left: 6px; }
.pv-wl-toolbar { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
/* 两颗同高同字号（虚线钮原来 ~32、配置 28，取中间 30），左边只占自己的宽、右边靠右 */
.pv-wl-toolbar .pv-task-addbtn { flex: none; margin: 0; }
.pv-wl-toolbar .pv-pmo-secbtn { height: 30px; margin-left: auto; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-wl-cfg-first { flex: none; height: 20px; padding: 0 8px; border: 0; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint); font: inherit; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 20px; cursor: pointer; white-space: nowrap; margin-right: 4px; }
.pv-wl-cfg-first.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-wl-cfg-first:disabled { opacity: .5; cursor: default; }
.pv-wl-card-name { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1.45; }
.pv-wl-card-title {
  font-weight: 600; color: var(--pv-text);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
/* 来源（平台）跟在标题后面，一道竖线隔开，浅灰。它是标题的补充说明，
   不是一个能点的东西 —— 所以不给底色、不做胶囊。 */
.pv-wl-src {
  color: var(--pv-text-faint); font-weight: 400; font-size: calc(12.5px + var(--pv-fz-add, 0px));
  white-space: nowrap;
}
.pv-wl-src::before {
  content: ""; display: inline-block; width: 1px; height: 11px; margin: 0 7px -1px 0;
  background: var(--pv-border);
}
.pv-wl-card-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px;
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); min-height: 1px;
}
.pv-wl-note { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
/* 评论：卡片上只露一枚 💬 和条数，悬浮才摊开。
   一屏几十张卡，评论直接摊在卡里会把高度搅乱，真正要扫的名字反而找不着。 */
.pv-wl-cmt-chip {
  cursor: pointer; white-space: nowrap; flex-shrink: 0; font-weight: 600;
  color: var(--pv-info-text); background: var(--pv-info-soft);
  padding: 0 7px; border-radius: var(--pv-radius-pill);
}
.pv-wl-cmt-chip:hover { background: var(--pv-info-border); }
/* 一条都没有时只留一个淡的 💬 —— 是入口，但不该跟真有内容的那枚一样显眼 */
.pv-wl-cmt-chip.empty { background: none; color: var(--pv-text-faint); padding: 0 2px; opacity: .55; }
.pv-wl-cmt-chip.empty:hover { opacity: 1; background: none; }
.pv-wl-cmt-pop { padding: 10px 12px !important; }
.pv-wl-cmt-list { max-height: 260px; overflow-y: auto; }
.pv-wl-cmt { padding: 6px 0; }
.pv-wl-cmt + .pv-wl-cmt { border-top: 1px solid var(--pv-border); }
.pv-wl-cmt-when {
  display: flex; align-items: center; gap: 8px; margin-bottom: 2px;
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .04em; color: var(--pv-text-faint);
}
.pv-wl-cmt-when .pv-gt-cmt-del { margin-left: auto; }
.pv-wl-cmt-text { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text); white-space: pre-wrap; }

/* 看完那一句感受。跟备注分开显示：备注是关于这个片子的，这句是关于这次看完的。 */
.pv-wl-feel {
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text-soft);
  padding-left: 8px; border-left: 2px solid var(--pv-border);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.pv-wl-fin-at { white-space: nowrap; flex-shrink: 0; }
.pv-wl-card-foot { display: flex; align-items: center; gap: 6px; margin-top: 2px; }
/* 卡片里的操作圆钮平时淡一点：一屏几十张卡，三颗按钮 × 几十 = 一片噪点。
   划过那张卡才实起来（不是 opacity:0 —— 淡着也看得出"这儿有东西可按"）。 */
.pv-wl-card .pv-row-ops { opacity: .45; transition: opacity .12s; }
.pv-wl-card:hover .pv-row-ops { opacity: 1; }
@media (hover: none) { .pv-wl-card .pv-row-ops { opacity: 1; } }

/* ---- 来龙去脉抽屉：上半「看的过程」 ---- */
.pv-wl-flow-head {
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-soft);
  margin: 4px 0 10px; letter-spacing: .04em;
}
.pv-wl-flow { border-left: 2px solid var(--pv-border); padding-left: 14px; margin-left: 4px; }
.pv-wl-flow-step { position: relative; padding: 0 0 14px; }
.pv-wl-flow-step:last-child { padding-bottom: 4px; }
.pv-wl-flow-dot {
  position: absolute; left: -21px; top: 5px; width: 9px; height: 9px; border-radius: 50%;
  background: var(--pv-text-faint); box-shadow: 0 0 0 3px var(--pv-surface);
}
.pv-wl-flow-step.go .pv-wl-flow-dot { background: var(--pv-success); }
.pv-wl-flow-step.done .pv-wl-flow-dot { background: var(--pv-danger); }
.pv-wl-flow-step.add .pv-wl-flow-dot { background: var(--pv-primary); }
.pv-wl-flow-label {
  font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text);
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
}
.pv-wl-flow-at { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-wl-flow-more {
  display: block; width: 100%; text-align: left; margin-top: 18px; padding: 8px 0 0;
  border: none; border-top: 1px solid var(--pv-border); background: none; cursor: pointer;
  font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
.pv-wl-flow-more:hover { color: var(--pv-primary-dark); }
.pv-wl-rate { flex: none; }
.pv-wl-rate-ro { flex: none; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (max-width: 640px) {
  /* 手机上卡片掉成一列（auto-fill 自己会做），只把网格间距收一点 */
  .pv-wl-grid { gap: 8px; grid-template-columns: 1fr; }
  .pv-wl-rate { transform: scale(.9); transform-origin: left center; }   /* 购物清单还在用 */
}

/* ===== 购物清单 pv-wishlist-view ===== */
/* 行结构跟影视待看同源（.pv-wl-main/.pv-wl-name/.pv-wl-meta/.pv-wl-rate 直接复用），
   只多一个分类 emoji 圆标和价格胶囊 —— 两个清单看起来是一家人，别各画各的。 */
.pv-wish-item {
  display: flex; align-items: center; gap: 11px; padding: 9px 6px;
  border-bottom: 1px solid var(--pv-border);
}
.pv-wish-item.st-放弃 .pv-wl-name { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-wish-item.st-已买 .pv-wl-name { color: var(--pv-text-faint); }
.pv-wish-emoji {
  flex: none; width: 30px; height: 30px; line-height: 30px; text-align: center;
  font-size: 16px; background: var(--pv-bg); border-radius: 50%;
}
.pv-wish-link { margin-left: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); text-decoration: none; }
/* 名字和下面那行（价格 / 哪天买 / 备注）之间松一点：2px 时日期片几乎贴着标题（用户 2026-09-03） */
.pv-wish-item .pv-wl-meta { margin-top: 6px; align-items: center; }
.pv-wish-item .pv-wl-plat { line-height: 1.8; }
.pv-wish-price {
  color: var(--pv-warning-text); background: var(--pv-warning-soft);
  padding: 0 7px; border-radius: var(--pv-radius-pill); font-variant-numeric: tabular-nums;
}
@media (max-width: 640px) {
  /* 手机上一行塞不下：名字独占一行，emoji/星级/按钮挤在下面一行 */
  .pv-wish-item { flex-wrap: wrap; gap: 8px; }
  .pv-wish-item .pv-wl-main { flex: 1 1 100%; order: -1; }
  .pv-wish-item .pv-wl-rate { transform: scale(.9); transform-origin: left center; }
}

/* ===== 和奶奶聊 pv-topics-view ===== */
.pv-topics-intro { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin: 0 0 14px; }
/* 顶部快填栏（.pv-topics-add）撤了：和老人聊 / 心愿购物都改成「＋ 按钮 → 右侧抽屉」填全字段 */
/* 顶上「跟谁聊」筛选片：跟全站筛选片一个样，计数用小角标 */
.pv-topics-filter { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
/* 筛选片按全站小按钮那一档（跟日历上的类别片一样：28 高、12.5 字），别用 .pv-chip-opt 默认的 15 字大药丸（用户 2026-09-17） */
.pv-topics-filter .pv-chip-opt { display: inline-flex; align-items: center; height: 28px; padding: 0 11px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1; }
.pv-topics-filter .pv-chip-opt b { margin-left: 4px; font-weight: 700; opacity: .65; }
/* 话题名后面跟的人名片：淡底小片，标题里一眼看出是聊给谁的 */
/* 「聊给谁」小签：照主人手记的分类签 .pv-gt-cat——实底色（按名字定）+ 白字（用户 2026-09-17） */
.pv-topic-who {
  display: inline-block; vertical-align: 2px; margin-left: 6px; padding: 1px 8px;
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; line-height: 1.5; border-radius: var(--pv-radius-pill);
  background: var(--pv-info-text); color: #fff; white-space: nowrap;
}
/* 优先级的小旗子：比 el-rate 默认的星小一号、紧一点，放在 meta 行里不抢标题 */
.pv-topic-flags { display: inline-flex; align-items: center; height: 18px; line-height: 18px; }
.pv-topic-flags .el-rate__icon { font-size: calc(15px + var(--pv-fz-add2, 0px)); margin-right: 2px; }
.pv-topic-flags .el-rate__item { vertical-align: middle; }
.pv-topics-list { display: flex; flex-direction: column; gap: 10px; }
/* 待聊按优先级分组（用户 2026-09-17）：组头一行旗子 + 条数，样式照底下「已聊过」那行 */
.pv-topics-groups { display: flex; flex-direction: column; gap: 26px; }
/* 组头要一眼分得出（用户 2026-09-17）：「5 面旗」加粗 + 旗子 + 条数，底下一道线 */
.pv-topics-group-head { display: flex; align-items: center; gap: 10px; padding-bottom: 8px; margin-bottom: 12px; border-bottom: 1px solid var(--pv-border); font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text); }
.pv-topics-group-name { font-weight: 700; }
.pv-topics-group-head .pv-topic-flags .el-rate__icon { cursor: default; }
/* 小卡片（照任务卡 .pv-task-grid / .pv-tc-*）：一片网格，圆勾 + 标题 + 横线 + 键值行；悬停边框变主色 */
.pv-topics-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; }
.pv-topics-grid .pv-topic-card.sm, .pv-tb-col .pv-topic-card.sm { display: flex; flex-direction: column; align-items: stretch; gap: 6px; min-height: 172px; padding: 14px 16px; border-radius: 12px; box-shadow: none; transition: border-color .12s; }
.pv-topic-card.sm.go { cursor: pointer; }   /* 能编辑的卡整张能点（用户 2026-10-28），悬停描主色边 */
.pv-topic-card.sm.go:hover { border-color: var(--pv-primary); }
.pv-topic-card.sm .pv-topic-top { min-height: 46px; }                       /* 标题区留两行的高度，标题一行的卡键值行也不会往上跑 */
.pv-topic-card.sm .pv-topic-foot { margin-top: auto; display: flex; flex-direction: column; gap: 6px; }   /* 钉在卡底 */
.pv-topics-grid .pv-topic-card.sm:hover { border-color: var(--pv-primary); }
.pv-topic-top { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
.pv-topic-card.sm .pv-topic-t { flex: 1; min-width: 0; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; line-height: 1.5; word-break: break-word; }
.pv-topic-ops { flex: none; display: inline-flex; align-items: center; gap: 4px; opacity: 0; transition: opacity .12s; }
.pv-topics-grid .pv-topic-card.sm:hover .pv-topic-ops { opacity: 1; }
@media (max-width: 640px) { .pv-topic-ops { opacity: 1; } .pv-topics-grid { grid-template-columns: 1fr; } }
.pv-topic-card.sm .pv-topic-n { margin-top: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); min-width: 0; overflow-wrap: anywhere; word-break: break-all; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.pv-topic-card.sm .pv-topic-n.link { color: var(--pv-primary-dark); text-decoration: none; }
.pv-topic-card.sm .pv-topic-n.link:hover { text-decoration: underline; }
.pv-topic-hr { height: 1px; background: var(--pv-border); margin: 2px 0; }
.pv-topic-card.sm .pv-tc-row .v.tags { display: inline-flex; justify-content: flex-end; gap: 4px; flex-wrap: wrap; white-space: normal; }
.pv-topic-card.sm .pv-tc-row .v .pv-topic-who { margin-left: 0; vertical-align: 0; }
.pv-topic-card.sm .pv-tc-row .v .pv-topic-flags .el-rate__icon { font-size: calc(14px + var(--pv-fz-add2, 0px)); margin-right: 1px; }
.pv-topic-card {
  position: relative; display: flex; align-items: center; gap: 13px;
  background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-card-r);
  padding: 13px 15px; box-shadow: var(--pv-shadow-sm);
}
.pv-topic-check {
  flex: none; border: 1.5px solid var(--pv-primary); background: var(--pv-surface);
  color: var(--pv-primary-dark); font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; cursor: pointer;
  border-radius: var(--pv-radius-pill); padding: 6px 14px; transition: all .12s; white-space: nowrap;
}
.pv-topic-check:hover { background: var(--pv-primary); color: #fff; }

/* 已聊过＝归档区。话题是一次性的，聊完就从待聊列表拿走，这里只留个底。 */
.pv-topics-done { margin-top: 20px; border-top: 1px solid var(--pv-border); padding-top: 12px; }
.pv-topics-done-head {
  display: flex; align-items: center; gap: 7px;
  border: none; background: none; padding: 2px 0; cursor: pointer;
  font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-soft);
}
.pv-topics-done-head:hover { color: var(--pv-primary-dark); }
.pv-topics-done-chev { display: inline-block; transition: transform .15s; font-size: calc(11px + var(--pv-fz-add, 0px)); }
.pv-topics-done-head.open .pv-topics-done-chev { transform: rotate(90deg); }
.pv-topics-done-cnt {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-success-soft); color: var(--pv-success-text);
}
.pv-topics-done-body { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
/* 归档卡：浅绿底表示"这条已经完成了"，整体压暗一档，视觉上退到待聊列表后面 */
.pv-topic-card.done { background: var(--pv-success-soft); border-color: var(--pv-success-border); }
.pv-topic-card.done .pv-topic-t { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text-soft); }
.pv-topic-fresh.done { color: var(--pv-success-text); }
.pv-topic-undo {
  flex: none; border: 1px solid var(--pv-border); background: var(--pv-surface);
  color: var(--pv-text-soft); font-size: calc(12.5px + var(--pv-fz-add, 0px)); padding: 4px 11px;
  border-radius: var(--pv-radius-btn); cursor: pointer; opacity: 0; transition: opacity .12s, color .12s;
}
.pv-topic-card.done:hover .pv-topic-undo { opacity: 1; }
.pv-topic-undo:hover { color: var(--pv-primary-dark); border-color: var(--pv-primary); }
@media (max-width: 640px) { .pv-topic-undo { opacity: 1; } }   /* 手机没有 hover */
.pv-topic-body { flex: 1; min-width: 0; }
.pv-topic-t { font-weight: 700; font-size: 16px; color: var(--pv-text); }
.pv-topic-n { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-top: 3px; }
.pv-topic-meta { display: flex; flex-wrap: wrap; gap: 6px 12px; margin-top: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-topic-fresh { font-weight: 600; }
/* 行右边那两颗操作圆钮（编辑 / 删除）。
   原来是 opacity:0，靠 `.pv-topic-card:hover` 提亮 —— 可是只有奶奶话题那张卡是
   这个类名。影视待看、心愿单、游戏库、日程、日历里这几颗挂在各自的行容器上，
   那条提亮规则永远匹配不到，于是它们在桌面端**从来就没显示过** —— 看上去就是
   "这条不能编辑、也删不掉"。
   与其给五个容器各补一条 hover，不如让它常驻：一行里就这一两个操作入口，
   藏起来省不下多少视觉，代价却是让人以为功能不存在。
   给一圈浅灰圆底，是为了让它在行里看得出是个"可以按的东西"而不是装饰图标。 */
.pv-topic-log, .pv-topic-edit, .pv-topic-del {
  flex: none; border: none; cursor: pointer; font-family: inherit; padding: 0;
  width: 26px; height: 26px; border-radius: 50%; font-size: calc(13px + var(--pv-fz-add, 0px));
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pv-bg); color: var(--pv-text-faint);
  transition: background .12s, color .12s;
}
.pv-topic-log:hover { color: var(--pv-info-text); background: var(--pv-info-soft); }
.pv-topic-edit:hover { color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-topic-del:hover { color: var(--pv-danger-text); background: var(--pv-danger-soft); }
/* 一行里的操作圆钮成组：贴在一起是一簇，散开会跟前面的内容抢位置 */
.pv-row-ops { display: flex; align-items: center; gap: 4px; flex: none; }
@media (max-width: 640px) {
  .pv-topic-check { padding: 6px 11px; }
}

/* 孩子视频 · 主题标签 chip */
/* 标签单行：放不下的隐藏，行尾用「+X」表示还有几个（JS fitTags 计算） */
.pv-kv-tags { position: relative; display: flex; flex-wrap: nowrap; align-items: center; gap: 5px; overflow: hidden; }
.pv-kv-tags > span { flex-shrink: 0; white-space: nowrap; }   /* 不许压缩换行，超出交给 fitTags 收成 +X */
.pv-kv-tags { margin-top: 10px; }   /* 主标题与下方关键标签之间留够空隙 */
.pv-kv-more { flex-shrink: 0; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-faint);
  background: var(--pv-bg); border-radius: var(--pv-radius-pill); padding: 1px 7px; white-space: nowrap; }
.pv-kv-more:empty { display: none; }
.pv-kv-tag {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 8px; border-radius: var(--pv-radius-pill);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark);
}

/* 侧边栏子项拖拽排序 + 落点指示横线 */
.pv-side-sub { cursor: pointer; }
.pv-side-sub.dragging { opacity: .4; }
/* 落点提示是一道平的主色线（用户 2026-10-29：原来用 inset box-shadow，跟着圆角弯成弧形，不喜欢）；拖着的时候悬停不铺灰底 */
.pv-side-sub.drop-before, .pv-side-sub.drop-after { position: relative; }
.pv-side-sub.drop-before::after, .pv-side-sub.drop-after::after { content: ""; position: absolute; left: 8px; right: 8px; height: 2.5px; background: var(--pv-primary); border-radius: 0; pointer-events: none; }
.pv-side-sub.drop-before::after { top: -1px; }
.pv-side-sub.drop-after::after { bottom: -1px; }
.pv-side-subs.is-dragging .pv-side-sub:hover { background: none; }

/* 域概览卡片拖拽落点指示 */
.pv-mod-card.drop-before { box-shadow: inset 0 3px 0 var(--pv-primary) !important; }
.pv-mod-card.drop-after { box-shadow: inset 0 -3px 0 var(--pv-primary) !important; }

/* ===== 餐厅 pv-restaurant-view ===== */
.pv-rest-intro { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin: 0 0 14px; }
.pv-rest-filter { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.pv-rest-flabel { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 顶部快填栏（.pv-rest-add）撤了：餐厅也改成「＋ 按钮 → 右侧抽屉」填全字段（用户 2026-09-03） */
.pv-rest-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; }
.pv-rest-card {
  position: relative; background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-card-r); padding: 14px 16px; box-shadow: var(--pv-shadow-sm);
}
.pv-rest-top { display: flex; align-items: center; gap: 9px; }
.pv-rest-name { font-weight: 700; font-size: 16.5px; color: var(--pv-text); }
.pv-rest-cui { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 9px; border-radius: var(--pv-radius-pill); background: var(--pv-accent-soft); color: var(--pv-primary-dark); }
.pv-rest-stars { color: #F5A623; font-size: calc(14px + var(--pv-fz-add2, 0px)); letter-spacing: 1px; margin-top: 5px; }
.pv-rest-review { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-top: 5px; line-height: 1.5; }
.pv-rest-meta { display: flex; flex-wrap: wrap; gap: 6px 12px; margin-top: 7px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-rest-actions { position: absolute; top: 10px; right: 10px; display: flex; gap: 2px; opacity: 0; transition: opacity .12s; }
.pv-rest-card:hover .pv-rest-actions { opacity: 1; }
.pv-rest-actions button { border: none; background: none; cursor: pointer; color: var(--pv-text-faint); width: 24px; height: 24px; border-radius: 50%; }
.pv-rest-actions button:hover { background: var(--pv-bg); color: var(--pv-primary-dark); }
@media (max-width: 640px) {
  .pv-rest-actions { opacity: 1; }
}

/* ===== 健康档案 pv-health-view ===== */
.pv-hl-band { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 9px 14px; border-radius: var(--pv-radius-sm); margin-bottom: 14px; background: var(--pv-ok-soft, #E7F6EC); border: 1px solid #CDE9D6; }
.pv-hl-band.off { background: #FDECEA; border-color: #F5C6C0; }
.pv-hl-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: #2E9E52; }
.pv-hl-band.off .pv-hl-dot { background: var(--pv-unread); }
.pv-hl-card { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-card-r); padding: 15px 18px; margin-bottom: 12px; box-shadow: var(--pv-shadow-sm); }
.pv-hl-h { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.pv-hl-title { font-weight: 700; font-size: 16px; color: var(--pv-text); }
.pv-hl-profile { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); line-height: 1.7; color: var(--pv-text); white-space: pre-wrap; background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 12px 14px; }
.pv-hl-fb-row { display: flex; gap: 8px; }
.pv-hl-fb-row .el-input { flex: 1; }
.pv-hl-fb-list { margin-top: 10px; display: flex; flex-direction: column; gap: 5px; }
.pv-hl-fb { display: flex; justify-content: space-between; gap: 10px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); padding: 4px 0; border-bottom: 1px dashed var(--pv-border); }
.pv-hl-add { display: flex; gap: 8px; margin-bottom: 12px; flex-wrap: wrap; }
.pv-hl-add-p { width: 160px; }
.pv-hl-add-c { flex: 1; min-width: 160px; }
.pv-hl-list { display: flex; flex-direction: column; }
.pv-hl-item { display: flex; align-items: center; gap: 10px; padding: 9px 2px; border-bottom: 1px solid var(--pv-border); }
.pv-hl-item:last-child { border-bottom: none; }
.pv-hl-proj { font-weight: 600; color: var(--pv-text); flex: none; }
.pv-hl-content { color: var(--pv-text-soft); font-size: calc(13.5px + var(--pv-fz-add, 0px)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 55%; }
.pv-hl-btn { border: none; background: none; cursor: pointer; color: var(--pv-text-faint); width: 24px; height: 24px; border-radius: 50%; }
.pv-hl-btn:hover { background: var(--pv-bg); color: var(--pv-primary-dark); }
@media (max-width: 640px) { .pv-hl-add-p, .pv-hl-add-c { flex: 1 1 100%; width: 100%; } .pv-hl-content { max-width: 100%; white-space: normal; } }

/* 饮食规划 */
.pv-hl-plan-row { display: flex; gap: 8px; align-items: flex-start; }
.pv-hl-plan-row .el-textarea { flex: 1; }
.pv-hl-plan { margin-top: 12px; background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 12px 14px; }
.pv-hl-plan-body { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1.7; color: var(--pv-text); white-space: pre-wrap; }
@media (max-width: 640px) { .pv-hl-plan-row { flex-direction: column; } .pv-hl-plan-row .el-button { width: 100%; } }

/* ===== 小厨房 · 饭菜计划 pv-mealplan-view =====
   看板列：一天一张卡片，卡里三个餐位。没有表格线——分组靠卡片本身，
   今天那张用描边+投影+暖色卡头顶起来，扫一眼先看见的就是今天。
   菜品是一枚枚标签（打一道回车成签），底层仍是「、」连起来的一段文本。 */
.pv-mp-bar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 4px 0 14px; }
/* 3 天 / 7 天：segmented 控件，选中项白底浮起，比两个描边胶囊安静 */
.pv-mp-seg { display: flex; gap: 2px; padding: 3px; background: #f1f1f5; border-radius: var(--pv-radius-pill); }
.pv-mp-seg button {
  border: none; background: none; cursor: pointer; font-family: inherit;
  font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); padding: 5px 14px;
  border-radius: var(--pv-radius-pill); line-height: 1.2; transition: all .14s;
}
.pv-mp-seg button.on { background: var(--pv-surface); color: var(--pv-text); font-weight: 700; box-shadow: 0 1px 2px rgba(25,27,35,.12); }
.pv-mp-nav { display: flex; align-items: center; gap: 6px; }
.pv-mp-arrow {
  width: 32px; height: 32px; border: none; background: #f6f6f9; cursor: pointer;
  color: var(--pv-text-soft); border-radius: 50%; font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1;
  display: flex; align-items: center; justify-content: center; transition: all .14s;
}
.pv-mp-arrow:hover { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-mp-today {
  height: 30px; border: 1px solid var(--pv-border); background: var(--pv-surface);
  color: var(--pv-text-soft); border-radius: var(--pv-radius-pill); cursor: pointer;
  font-size: calc(13px + var(--pv-fz-add, 0px)); padding: 0 12px; line-height: 1; font-family: inherit;
}
.pv-mp-today:hover:not([disabled]) { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-mp-today[disabled] { opacity: .45; cursor: default; }
/* 进度环 + 两行字：排了多少一眼看出来，比一句纯文字好读 */
.pv-mp-meter { margin-left: auto; display: flex; align-items: center; gap: 9px; }
.pv-mp-ring { flex: none; width: 34px; height: 34px; border-radius: 50%; display: flex; align-items: center; justify-content: center; }
.pv-mp-ring-in {
  width: 26px; height: 26px; border-radius: 50%; background: var(--pv-surface);
  display: flex; align-items: center; justify-content: center;
  font-size: calc(9.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-soft); font-variant-numeric: tabular-nums;
}
.pv-mp-meter-txt { display: flex; flex-direction: column; line-height: 1.35; }
.pv-mp-meter-txt b { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-mp-meter-txt i { font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-style: normal; color: var(--pv-text-faint); }

/* 日卡横向并排：3 天铺满宽度，7 天横滑（卡片最小 190px） */
.pv-mp-days { display: grid; gap: 12px; grid-template-columns: repeat(var(--pv-mp-cols, 3), 1fr); align-items: start; }
.pv-mp-days.wide {
  grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: minmax(190px, 1fr);
  overflow-x: auto; padding: 6px 2px 10px;   /* 留出余量，不然今天那张卡的投影会被裁掉 */
}
.pv-mp-day { background: var(--pv-surface); border: 1px solid #eceef4; border-radius: var(--pv-card-r); overflow: hidden; }
.pv-mp-day-head {
  display: flex; align-items: baseline; gap: 6px; padding: 13px 16px;
  background: #FAFAFC; border-bottom: 1px solid #eceef4;
  flex-wrap: wrap; row-gap: 4px;   /* 7 天视图卡窄，「这天齐了」放不下就换行，别顶出去 */
}
.pv-mp-day-md { font-size: 20px; font-weight: 800; letter-spacing: -.02em; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-mp-day-wk { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-mp-day-when { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-mp-day-body { padding: 10px; display: flex; flex-direction: column; gap: 8px; }
/* 今天：描边 + 投影 + 暖色卡头，一张卡自己就把「今天」说清楚了 */
.pv-mp-day.today { border: 1.5px solid var(--pv-primary); box-shadow: 0 10px 24px rgba(232,150,12,.16); }
.pv-mp-day.today .pv-mp-day-head { background: linear-gradient(180deg, var(--pv-accent-soft), var(--pv-primary-soft)); border-bottom-color: #F3E2B3; }
.pv-mp-day.today .pv-mp-day-wk { color: var(--pv-primary-dark); font-weight: 700; }
.pv-mp-day-now {
  flex: none; align-self: center; height: 19px; display: inline-flex; align-items: center; padding: 0 8px;
  background: var(--pv-primary); color: #fff; font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 800;
  border-radius: var(--pv-radius-pill); letter-spacing: .02em;
}

/* 这天排的都吃完了：整张卡换成绿色版的高亮——跟「今天」是同一套结构，只换色相。
   比「橙框 + 一枚绿章」干净：一张卡一个状态色，不用同时读两种颜色。
   这组必须排在 .today 之后——两者特指度相同，今天且齐了时靠源码顺序让绿色赢。 */
.pv-mp-day.ok { border: 1.5px solid var(--pv-success); box-shadow: 0 10px 24px rgba(22,163,74,.14); }
.pv-mp-day.ok .pv-mp-day-head {
  background: linear-gradient(180deg, #E9F7EC, #DBF0E0); border-bottom-color: var(--pv-success-border);
}
.pv-mp-day.ok .pv-mp-day-wk { color: var(--pv-success-text); font-weight: 700; }
.pv-mp-day.ok .pv-mp-slot.empty { border-color: #C9E3CE; background: #FBFDFB; }
.pv-mp-day-ok {
  flex: none; align-self: center; height: 19px; display: inline-flex; align-items: center; padding: 0 8px;
  background: var(--pv-success); color: #fff; font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 800;
  border-radius: var(--pv-radius-pill); letter-spacing: .02em; white-space: nowrap;
}

/* 餐位：有菜是浅底块，空的是虚线框 */
.pv-mp-slot {
  min-height: 70px; padding: 10px 12px; border-radius: 13px; background: #EEF1F8; border: 1px solid #E1E5F0;   /* 有菜的底色要一眼看得出（用户 2026-09-14） */
  cursor: pointer; transition: background .12s, border-color .12s;
}
.pv-mp-day.today .pv-mp-slot { background: #FFF2DA; border-color: #F0DDB5; }
.pv-mp-slot.empty {
  background: none; border: 1.5px dashed #E3E5EE;
  display: flex; align-items: center; justify-content: center;
  min-height: 44px; padding: 10px 12px;   /* 空着的那条比原来高一倍（用户 2026-09-23）：太扁了点不准 */
}
.pv-mp-day.today .pv-mp-slot.empty { border-color: #EBD7AE; background: #FFFCF5; }
.pv-mp-slot.empty:hover { border-color: var(--pv-primary); background: #FFFCF5; }
.pv-mp-slot-add { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: #b9bdcc; transition: color .12s; }
.pv-mp-slot.empty:hover .pv-mp-slot-add { color: var(--pv-primary-dark); }
.pv-mp-slot.editing, .pv-mp-slot.ro { cursor: default; }
/* 空格子点开编辑时不能再沿用 .empty 的 flex 居中：标题、输入框会挤成一排，「早餐」被压成竖排（用户 2026-09-10） */
.pv-mp-slot.empty.editing { display: block; }
.pv-mp-slot-head {
  display: flex; align-items: center; gap: 6px; margin-bottom: 7px; white-space: nowrap;
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 800; letter-spacing: .05em; color: var(--pv-text-faint);
}
.pv-mp-dot { flex: none; width: 6px; height: 6px; border-radius: 50%; }
.pv-mp-dot.breakfast { background: var(--pv-mp-breakfast); }
.pv-mp-dot.lunch { background: var(--pv-mp-lunch); }
.pv-mp-dot.dinner { background: var(--pv-mp-dinner); }
/* 一道菜一枚标签，右边挂个 × 单独删这一道 */
.pv-mp-tags { display: flex; flex-wrap: wrap; gap: 5px; }
.pv-mp-tag {
  display: inline-flex; align-items: center; gap: 2px; padding: 4px 7px 4px 9px;
  background: #F3F4F8; border-radius: 9px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600;
  color: var(--pv-text); line-height: 1.35; word-break: break-word;
}
.pv-mp-day.today .pv-mp-tag { background: var(--pv-surface); box-shadow: 0 1px 2px rgba(25,27,35,.07); }
.pv-mp-tag-x {
  flex: none; width: 14px; height: 14px; border: none; padding: 0; cursor: pointer;
  background: none; color: var(--pv-text-faint); border-radius: 50%; font-size: calc(13px + var(--pv-fz-add, 0px));
  line-height: 1; display: flex; align-items: center; justify-content: center; font-family: inherit;
}
.pv-mp-tag-x:hover { background: rgba(25,27,35,.08); color: var(--pv-text); }
/* 输入框只留一条橙下划线：它是「接着往下打」的光标位，不该长得像个表单控件 */
.pv-mp-input {
  width: 100%; margin-top: 7px; border: none; border-bottom: 1.5px solid var(--pv-primary);
  background: none; outline: none; font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px));
  color: var(--pv-text); padding: 3px 1px; line-height: 1.5;
}
.pv-mp-input::placeholder { color: #b9bdcc; }
.pv-mp-hint { margin-top: 5px; font-size: calc(10.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }

/* 留言按钮：餐位标题右侧那个对话气泡。平时淡，hover 或已经写过才显眼。
   打卡（✓）已撤 —— 这块黑板是"参考"，记的是打算吃什么，不是逐餐核销。 */
.pv-mp-note-btn {
  flex: none; width: 24px; height: 24px; padding: 0; border-radius: 50%; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  border: none; background: none; color: var(--pv-text-faint);
  opacity: .45; transition: opacity .12s, color .12s, background .12s;
}
.pv-mp-slot:hover .pv-mp-note-btn { opacity: .95; }
.pv-mp-note-btn:hover { background: var(--pv-bg); color: var(--pv-primary-dark); opacity: 1; }
/* 已经留过言：常显，且用主色 —— 一眼看出哪几顿有话说 */
.pv-mp-note-btn.on { opacity: 1; color: var(--pv-primary); }
.pv-mp-note-ico { display: block; }
/* 评价：引一句你自己说过的话，点一下能改 */
.pv-mp-note {
  margin-top: 7px; padding: 5px 8px 5px 9px; border-left: 2px solid var(--pv-border);
  background: var(--pv-bg); border-radius: 0 7px 7px 0; cursor: pointer;
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.5; color: var(--pv-text-soft); word-break: break-word;
}
.pv-mp-note:hover { border-left-color: var(--pv-primary); color: var(--pv-text); }
.pv-mp-slot.done .pv-mp-note { background: var(--pv-surface); border-left-color: var(--pv-success-border); }
.pv-mp-note-dish {
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); margin-bottom: 10px;
  background: var(--pv-bg); border-radius: var(--pv-radius-sm); padding: 8px 11px; line-height: 1.5;
}
/* 右上角「饮食数据库」入口 */
.pv-mp-dbbtn {
  flex: none; height: 30px; padding: 0 12px; cursor: pointer; font-family: inherit;
  border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft);
  border-radius: var(--pv-radius-pill); font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1;
}
.pv-mp-dbbtn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
/* 饮食数据库弹窗：一餐一行的流水表 */
.pv-mp-db-dialog .el-dialog__body { padding: 10px 20px 4px; }
.pv-mp-db-bar { display: flex; align-items: center; gap: 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); margin-bottom: 8px; flex-wrap: wrap; }
.pv-mp-db-wrap { max-height: 56vh; overflow: auto; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm); }
.pv-mp-db { width: 100%; border-collapse: collapse; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-mp-db th {
  position: sticky; top: 0; z-index: 1; background: #FAFAFC; text-align: left;
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); letter-spacing: .03em;
  padding: 8px 10px; border-bottom: 1px solid var(--pv-border); white-space: nowrap;
}
.pv-mp-db td { padding: 8px 10px; border-bottom: 1px solid var(--pv-border); color: var(--pv-text); vertical-align: top; line-height: 1.5; }
.pv-mp-db tr:last-child td { border-bottom: none; }
.pv-mp-db tr.done td { background: #FBFDFB; }
.pv-mp-db .nowrap { white-space: nowrap; }
.pv-mp-db .num { font-variant-numeric: tabular-nums; }
.pv-mp-db .faint { color: var(--pv-text-faint); }
.pv-mp-db .note { color: var(--pv-text-soft); }
@media (max-width: 640px) {
  /* 3 天在手机上改成单列纵向堆叠；7 天仍横滑，卡片定宽 190px */
  .pv-mp-days { grid-template-columns: 1fr; }
  .pv-mp-days.wide { grid-auto-columns: 190px; }
  .pv-mp-bar { gap: 8px; }
  .pv-mp-meter-txt i { display: none; }   /* 手机上只留主行，副行是噪音 */
  .pv-mp-note-btn { width: 30px; height: 30px; opacity: .8; }   /* 手机没 hover，常显大一点，拇指点得中 */
  .pv-mp-note-btn { width: 27px; height: 27px; font-size: 15px; opacity: .9; }
  /* 数据库表在手机上砍掉「什么时候排的」——一屏就那么宽，先保住吃了什么和评价 */
  .pv-mp-db th:nth-child(4), .pv-mp-db td:nth-child(4) { display: none; }
}

/* ===== 小厨房 · 身体记录 pv-bodylog-view ===== */
.pv-bl-add { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 14px; }
.pv-bl-add-type { width: 130px; flex: none; }
.pv-bl-add-text { flex: 1; min-width: 200px; }
.pv-bl-add-date { width: 150px; flex: none; }
.pv-bl-list { display: flex; flex-direction: column; gap: 16px; }
.pv-bl-date { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); margin-bottom: 6px; }
.pv-bl-item {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 10px; border-radius: var(--pv-radius-sm); background: var(--pv-surface);
  border: 1px solid var(--pv-border); margin-bottom: 6px;
}
.pv-bl-item:last-child { margin-bottom: 0; }
.pv-bl-type { flex: none; font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1; }
.pv-bl-type.clickable { cursor: pointer; }
.pv-bl-text { flex: 1; font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1.55; color: var(--pv-text); word-break: break-word; }
.pv-bl-text.editable { cursor: text; }
.pv-bl-edit { flex: 1; }
@media (max-width: 640px) {
  /* 手机上把「类型 + 日期」并成一行、输入框独占一行，别挤成四个小格子 */
  .pv-bl-add-text { flex: 1 1 100%; min-width: 0; order: -1; }
  .pv-bl-add-type, .pv-bl-add-date { flex: 1; width: auto; }
}

/* ===== 中国海运 pv-shipping-view ===== */
/* 状态 tab 和搜索框同处一行，高度走同一个变量，改一处两边一起动，不会一高一矮 */
/* 状态行的片子跟买菜那行同一档（26px / 12.5px），搜索框靠同一个变量跟着矮（用户 2026-09-03） */
.pv-ship { --pv-ship-ctl-h: 26px; }
.pv-ship .pv-ship-tab { font-size: calc(12.5px + var(--pv-fz-add, 0px)); padding: 0 10px; }
.pv-ship-ai { border: 1px solid var(--pv-border); border-radius: var(--pv-radius); margin-bottom: 14px; background: var(--pv-surface); }
.pv-ship-ai-head { display: flex; justify-content: space-between; align-items: center; padding: 11px 15px; cursor: pointer; font-weight: 600; font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-ship-ai.open .pv-ship-ai-head { border-bottom: 1px solid var(--pv-border); }
.pv-ship-ai-caret { color: var(--pv-primary-dark); font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; }
.pv-ship-ai-body { padding: 12px 15px; }
.pv-ship-ai-actions { display: flex; justify-content: space-between; align-items: center; margin-top: 10px; }
.pv-ship-tabs { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-bottom: 12px; }
/* 搜索框顶在这一行的右端，长相走全站 .pv-search（grow：撑满剩下的宽度），高度跟着状态 tab 那个变量 */
.pv-ship-tabs { --pv-search-h: var(--pv-ship-ctl-h, 26px); }
.pv-ship-search { margin-left: auto; }
/* 胶囊本体的样式跟 .pv-kv-chip 合并了，见上面「全站筛选胶囊」那条 */
.pv-ship-wrap { overflow-x: auto; }   /* 外框和圆角撤掉（用户 2026-11-02）：白底页上再框一圈是多余的一层，表头底色 + 行线够分组了 */
.pv-ship-table { width: 100%; border-collapse: collapse; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-ship-table th { text-align: left; padding: 9px 12px; background: #F5F1E9; color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; white-space: nowrap; }
.pv-ship-table td { padding: 8px 12px; border-top: 1px solid var(--pv-border); }
.pv-ship-table td.item { font-weight: 600; color: var(--pv-text); white-space: nowrap; }
.pv-ship-table td.muted { color: var(--pv-text-faint); }
.pv-ship-table td.nowrap { white-space: nowrap; }
.pv-ship-type { font-size: calc(12px + var(--pv-fz-add, 0px)); background: var(--pv-bg); color: var(--pv-text-soft); padding: 1px 8px; border-radius: var(--pv-radius-pill); white-space: nowrap; }
.pv-ship-badge { display: inline-block; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 3px 10px; border-radius: var(--pv-radius-pill); white-space: nowrap; line-height: 1.4; }
/* 只给状态胶囊上色。别把 .pv-ship-tab.s-new.active 也塞进来——那条比 .pv-ship-tab.active
   更具体，会把「发往转运仓」这个选中态单独改成白底蓝字，跟其它选中 tab 的黄底白字不一样 */
.pv-ship-badge.s-new { background: var(--pv-info-soft); color: var(--pv-info-text); }
.pv-ship-badge.s-mid { background: #FDECEA; color: var(--pv-unread); }
.pv-ship-badge.s-ok { background: #E7F6EC; color: #2E7D46; }
.pv-ship-badge.s-lost { background: var(--pv-bg); color: var(--pv-text-faint); text-decoration: line-through; }
/* 可点的状态胶囊（业主视图，点开下拉改状态） */
.pv-ship-badge.clickable { cursor: pointer; }
.pv-ship-badge.clickable i { font-size: calc(11px + var(--pv-fz-add, 0px)); margin-left: 4px; opacity: .55; vertical-align: -1px; }
.pv-ship-badge.clickable:hover { filter: brightness(.97); }
.pv-ship-menu .el-dropdown-menu__item { padding: 5px 12px; line-height: 1; }
.pv-ship-menu .pv-ship-badge.cur { box-shadow: 0 0 0 1.5px currentColor inset; }
/* 整行按状态淡色底 —— 一眼看出这行是什么状态 */
.pv-ship-table tr.row-s-new td { background: #F2F6FE; }
.pv-ship-table tr.row-s-mid td { background: #FEF3F0; }
.pv-ship-table tr.row-s-ok  td { background: #F2FAF4; }
/* 丢了的整行压灰，一眼跟在途/到货的区分开 */
.pv-ship-table tr.row-s-lost td { background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-ship-table tr.row-s-lost td.item { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-ship-table tbody tr:hover td { filter: brightness(.985); }
/* 多选 */
.pv-ship-table th.chk, .pv-ship-table td.chk { width: 30px; padding-right: 0; text-align: center; }
.pv-ship-table tbody tr.selected td { background: var(--pv-info-soft); }
.pv-ship-bulk { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; padding: 8px 12px; background: var(--pv-info-soft); border: 1px solid var(--pv-info-border); border-radius: var(--pv-radius); }
.pv-ship-bulk-n { font-weight: 700; color: var(--pv-info-text); }
.pv-ship-bulk .pv-ship-badge.clickable { border: none; font-family: inherit; }
.pv-ship-bulk .pv-ship-badge.clickable[disabled] { opacity: .5; cursor: default; }
.pv-ship-bulk-sep { width: 1px; align-self: stretch; background: var(--pv-info-border); margin: 0 2px; }
.pv-ship-bulk-btn { border: 1px solid var(--pv-info-border); background: #fff; color: var(--pv-info-text); font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 3px 11px; border-radius: var(--pv-radius-pill); cursor: pointer; }
.pv-ship-bulk-btn:hover { filter: brightness(.97); }
.pv-ship-bulk-btn[disabled] { opacity: .5; cursor: default; }
.pv-ship-bulk-btn.danger { color: var(--pv-unread); border-color: #F3C2B8; }
.pv-ship-bulk-btn.danger:hover { background: #FDECEA; }
.pv-ship-bulk-btn.adv { background: var(--pv-info-text); border-color: var(--pv-info-text); color: #fff; }
/* 一键推进：状态往后走一格，不用点开下拉挑 */
.pv-ship-adv-cell { white-space: nowrap; width: 1%; }   /* 最左一列，按按钮本身的宽度收紧（用户 2026-10-18） */
.pv-ship-adv { border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft); font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 3px 11px; border-radius: var(--pv-radius-pill); cursor: pointer; transition: all .12s; }
.pv-ship-adv:hover { border-color: var(--pv-info-text); background: var(--pv-info-text); color: #fff; }
@media (max-width: 640px) { .pv-ship-adv-to { display: none; } }
/* 数量列：窄、右对齐、等宽数字。空着的（就一件）不占视觉重量 */
.pv-ship-table th.qty, .pv-ship-table td.qty { width: 52px; text-align: right; font-variant-numeric: tabular-nums; }

/* —— 手机端卡片列表（≤640px 用它替掉那张 9 列宽表）——
   整卡可点＝编辑；状态色沿用表格那套 row-s-*，两种布局看起来是同一个东西。 */
.pv-ship-cards { display: flex; flex-direction: column; gap: 10px; }
.pv-ship-card {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius);
  padding: 11px 13px; background: var(--pv-surface); cursor: pointer;
}
.pv-ship-card.row-s-new { background: #F2F6FE; }
.pv-ship-card.row-s-mid { background: #FEF3F0; }
.pv-ship-card.row-s-ok { background: #F2FAF4; }
.pv-ship-card.row-s-lost { background: var(--pv-bg); }
.pv-ship-card.row-s-lost .pv-ship-card-name { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-ship-card-top { display: flex; align-items: flex-start; gap: 10px; }
.pv-ship-card-name { flex: 1; min-width: 0; font-weight: 600; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); color: var(--pv-text); }
.pv-ship-qty {
  margin-left: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; padding: 1px 7px;
  border-radius: var(--pv-radius-pill); background: var(--pv-surface);
  border: 1px solid var(--pv-border); color: var(--pv-text-soft);
  font-variant-numeric: tabular-nums;
}
.pv-ship-card-meta {
  display: flex; flex-wrap: wrap; gap: 3px 10px; margin-top: 4px;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
.pv-ship-card-ops { display: flex; align-items: center; gap: 8px; margin-top: 9px; }
.pv-ship-card-btn {
  border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft);
  font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600;
  padding: 4px 12px; border-radius: var(--pv-radius-pill); cursor: pointer;
}
.pv-ship-card-btn.danger { color: var(--pv-unread); border-color: #F3C2B8; }

.pv-ship-bulk-clear { margin-left: auto; border: none; background: none; color: var(--pv-text-faint); cursor: pointer; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ship-bulk-clear:hover { color: var(--pv-text); }
.pv-ship-ops { white-space: nowrap; }
/* 点整行就拉开编辑（用户 2026-09-28）：编辑那支笔撤了；正开着的那一行描一道主色 */
.pv-ship-table tbody tr.link { cursor: pointer; }
.pv-ship-table tbody tr.cur td { box-shadow: inset 0 1px 0 var(--pv-primary), inset 0 -1px 0 var(--pv-primary); }
.pv-ship-table tbody tr.link .chk, .pv-ship-table tbody tr.link .el-dropdown { cursor: default; }
/* 编辑抽屉里的状态那一行：小签 + 「标记为丢失」 */
.pv-ship-dw-st { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; min-height: 28px; }
.pv-ship-dw-st .pv-pmo-secbtn { height: 28px; font-size: calc(13px + var(--pv-fz-add, 0px)); border-radius: var(--pv-radius-btn); }
.pv-ship-dw-st .pv-pmo-secbtn.danger { color: var(--pv-danger-text); }
.pv-ship-dw-st .pv-pmo-secbtn.danger:hover { border-color: var(--pv-danger); color: var(--pv-danger-text); background: var(--pv-danger-soft); }
.pv-ship-del { border: none; background: none; cursor: pointer; color: var(--pv-text-faint); width: 24px; height: 24px; border-radius: 50%; }
.pv-ship-del:hover { background: var(--pv-bg); color: var(--pv-unread); }

/* ============================================================
   项目管理 / 任务（pv-task-board + PMO 页）
   颜色一律走 --pv-task-cat（由项目的颜色注入），不另起一套色板。
   ============================================================ */
.pv-due-pill {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 1.6; padding: 1px 9px;
  border-radius: var(--pv-radius-pill); background: var(--pv-danger-soft);
  color: var(--pv-danger); white-space: nowrap; flex-shrink: 0;
}
.pv-side-link .pv-due-pill { margin-left: auto; }

.pv-task-addbar { display: flex; gap: 8px; align-items: center; margin-bottom: 12px; }
/* 一颗素按钮就够。原来这排是"输入框 + 项目 + 截止日 + 添加"，横着占满一行，
   比它下面的任务本身还抢眼 —— 而它只是个入口。 */
/* .pv-task-addbtn 的样式并进上面 .pv-pmo-newbtn 那组了（全站一个组件） */

.pv-task-sec { margin-bottom: 40px; }
/* 最后一段底下不留那 40px：卡片和板块外框底边之间空一大条（用户 2026-09-22） */
.pv-task-sec:last-child { margin-bottom: 0; }
/* 段与段之间一道细线（用户 2026-09-08）：光靠抬头颜色分不开「今天」和「这一周」，卡片一多就连成一片。
   线上下都要留够气口（用户两次说太挤）：上面 40px 是上一段的 margin-bottom，下面 36px 是这段的 padding-top。 */
.pv-task-sec + .pv-task-sec { border-top: 1px solid var(--pv-border); padding-top: 36px; }
/* 分组抬头（逾期 / 今天 / 这一周 / 往后 / 没定日子 / 做完了）：原来 12px 淡灰，跟卡片一比几乎看不见
   （用户 2026-09-07）。现在 14px 深字 + 左边一道分组色的短竖条 + 计数做成同色小药丸；
   逾期红、今天也红（用户 2026-09-08：今天就是现在要办的，跟逾期一样急）、这一周蓝，后面几组保持灰。 */
.pv-task-sec-head {
  --pv-sec: var(--pv-text-faint);
  font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text);
  display: flex; align-items: center; gap: 8px; margin: 2px 0 8px;
}
.pv-task-sec-head::before { content: ""; width: 3px; height: 14px; border-radius: 2px; background: var(--pv-sec); flex: none; }
.pv-task-sec-head b {
  min-width: 20px; height: 18px; padding: 0 6px; border-radius: 9px; text-align: center;
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 18px; color: #fff; background: var(--pv-sec);
  font-variant-numeric: tabular-nums;
}
.pv-task-sec-head.g-over { --pv-sec: var(--pv-danger); color: var(--pv-danger); }
.pv-task-sec-head.g-today { --pv-sec: #2E7D46; color: #2E7D46; }   /* 今天用绿（用户 2026-09-09）：跟逾期的红分开 */
.pv-task-sec-head.g-tmr { --pv-sec: #0E7490; color: #0E7490; }   /* 明天（用户 2026-11-04）：青，介于今天的绿和这一周的蓝之间 */
.pv-task-sec-head.g-soon { --pv-sec: #1D4ED8; }
.pv-task-sec-head.g-later { --pv-sec: var(--pv-text-soft); }
.pv-task-sec-head.g-none, .pv-task-sec-head.g-done { color: var(--pv-text-soft); }
.pv-task-sec-hint { font-weight: 400; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }

/* 卡片网格（用户 2026-09-08）：版式照勤为径 growth-ledger 的 .grid-cards / .task-card ——
   一行几张按宽度自动排（每张最窄 250px），白底、细边、悬停边框变主色；
   卡内上标题、中一行灰字、底一行沉到底。手机上自然就是一列。 */
.pv-task-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; }
/* 拖卡改日子（用户 2026-10-02）：平时收成 0 高；拖起一张卡就展开成一排可放的日子，放上去那颗主色实底。
   DOM 一直在（只变高度），拖拽途中不增减节点——有的浏览器会因为节点变了把拖拽取消 */
.pv-task-dropbar { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; max-height: 0; overflow: hidden; opacity: 0; margin-bottom: 0;
                   transition: max-height .15s, opacity .15s, margin .15s; }
.pv-task-dropbar.on { max-height: 120px; opacity: 1; margin-bottom: 12px; }
.pv-task-dropbar-k { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; margin-right: 2px; }
.pv-task-drop { display: inline-flex; align-items: center; gap: 5px; height: 32px; padding: 0 12px; border-radius: 8px; border: 1.5px dashed var(--pv-text-soft);
                background: var(--pv-surface); color: var(--pv-text); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); white-space: nowrap; cursor: default; }
.pv-task-drop i { font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-task-drop.none { border-style: dotted; color: var(--pv-text-soft); }
.pv-task-drop.over { border-style: solid; border-color: var(--pv-primary); background: var(--pv-primary); color: #fff; }
.pv-task-drop.over i { color: rgba(255,255,255,.85); }
.pv-tc.can-drag { cursor: grab; }
.pv-tc.is-drag { opacity: .45; }
@media (hover: none) { .pv-task-dropbar { display: none; } }   /* 手机没有拖拽，这排不画 */
/* 项目管理板块里固定一行两张（用户 2026-09-08：三张在窄屏上一张卡只剩四个字宽，标题竖着排），手机一张 */
.pv-pmo-sec .pv-task-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (max-width: 640px) { .pv-pmo-sec .pv-task-grid { grid-template-columns: 1fr; } }
/* 任务板块标题栏那排头像：谁被选中谁亮、带一圈主色描边，其余压淡 */
.pv-pmo-who-strip { display: inline-flex; align-items: center; gap: 4px; margin-right: 6px; }
.pv-pmo-who-av {
  width: 28px; height: 28px; border-radius: 50%; padding: 0; border: 2px solid transparent; background: none;
  cursor: pointer; opacity: .45; display: inline-flex; align-items: center; justify-content: center; transition: opacity .12s;
}
.pv-pmo-who-av:hover { opacity: .85; }
.pv-pmo-who-av.on { opacity: 1; border-color: var(--pv-primary); }
.pv-pmo-who-av .pv-pmo-face { width: 22px; height: 22px; }
.pv-pmo-who-av.all { font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); border: 1px solid var(--pv-border); opacity: .7; }
.pv-pmo-who-av.all.on { color: var(--pv-primary-dark); border: 2px solid var(--pv-primary); opacity: 1; }
/* ===== 任务卡（照飞书任务的卡片，Little Jelly pref-task-card-feishu-style，用户 2026-09-08）=====
   白底、1px 细边、10px 圆角；悬停边框变主色、右上角冒出「⋯」。
   结构：圆勾选框 + 标题（整段换行，不截断）→ 「📅 x月x日 截止」一行 → 横线 → 键值行（图标 + 灰标签 ｜ 右对齐的值） */
.pv-tc {
  position: relative; display: flex; flex-direction: column; gap: 10px; min-width: 0;
  padding: 14px 16px; background: var(--pv-surface);
  border: 1px solid var(--pv-border); border-radius: 10px;
  transition: border-color .12s, box-shadow .12s;
}
.pv-tc.is-link { cursor: pointer; }
/* 段尾快捷添加卡（用户 2026-09-08）：虚线空卡占一格，点了按这段的日子新建 */
.pv-tc-add {
  align-items: center; justify-content: center; gap: 4px; min-height: 120px;
  border-style: dashed; background: none; color: var(--pv-text-soft); cursor: pointer; font: inherit;
}
.pv-tc-add i { font-size: 22px; line-height: 1; }
.pv-tc-add span { font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 600; }
.pv-tc-add small { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-tc-add:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-tc-add:hover small { color: var(--pv-primary-dark); }
.pv-tc:hover { border-color: var(--pv-primary); box-shadow: 0 0 0 1px var(--pv-primary) inset; }
.pv-tc.done { opacity: .55; }
.pv-tc.done .pv-tc-title { text-decoration: line-through; color: var(--pv-text-soft); }
/* 完成动画三步（用户 2026-09-08）：① 圆圈里弹出绿勾 ② 整张卡变绿 ③ 缩着淡出，然后才刷新列表 */
.pv-tc.is-check { background: #EAF7EE; border-color: #2E7D46; box-shadow: 0 0 0 1px #2E7D46 inset; transition: background .25s, border-color .25s, box-shadow .25s; }
.pv-tc.is-check .pv-tc-check { animation: pv-check-pop .32s cubic-bezier(.2, 1.4, .4, 1); }
.pv-tc.is-check .pv-tc-title { color: #2E7D46; }
/* 「今天 截止」「逾期」那行红字在变绿的卡上很扎眼（用户 2026-09-08）：动画期间一起转绿 */
.pv-tc.is-check .pv-tc-due, .pv-tc.is-check .pv-tc-due.now, .pv-tc.is-check .pv-tc-due.over { color: #2E7D46; transition: color .25s; }
.pv-tc.is-leave { animation: pv-card-leave .42s ease forwards; pointer-events: none; }
@keyframes pv-check-pop { 0% { transform: scale(.5); } 60% { transform: scale(1.25); } 100% { transform: scale(1); } }
@keyframes pv-card-leave { to { opacity: 0; transform: scale(.92) translateY(-8px); } }
/* 购物清单卡的 ✓ / ✗（用户 2026-09-20）：圆的（照任务卡的勾选圈），钉在评分那行的右端；点勾买了、点叉不要了，动画照上面任务卡的三步，叉那条整卡变红 */
.pv-wc-quick { flex: none; display: inline-flex; gap: 6px; margin-left: auto; }
.pv-wc-qbtn { width: 22px; height: 22px; border: 1.5px solid var(--pv-text-faint); border-radius: 50%; background: var(--pv-surface); color: var(--pv-text-faint); cursor: pointer; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1; padding: 0; display: inline-flex; align-items: center; justify-content: center; transition: background .12s, border-color .12s, color .12s; }
/* 评分那行钉在横线上面、键值行钉在卡底：标题区吃掉多出来的高度，所有卡的星和 ✓ / ✗ 都在同一个位置 */
.pv-tc.pv-wc .pv-tc-head { flex: 1; }
.pv-tc.pv-wc .pv-tc-kv { margin-top: 0; }
.pv-wc-qbtn.ok:hover, .pv-wc-qbtn.ok.on { background: #2E7D46; border-color: #2E7D46; color: #fff; }
.pv-wc-qbtn.no:hover, .pv-wc-qbtn.no.on { background: var(--pv-danger); border-color: var(--pv-danger); color: #fff; }
.pv-wc-qbtn.on i { display: inline-block; animation: pv-check-pop .32s cubic-bezier(.2, 1.4, .4, 1); }
.pv-tc.is-drop { background: #FDECEC; border-color: var(--pv-danger); box-shadow: 0 0 0 1px var(--pv-danger) inset; transition: background .25s, border-color .25s, box-shadow .25s; }
.pv-tc.is-drop .pv-tc-title { color: var(--pv-danger); }
.pv-tc.mile { background: #F6F9FF; }
.pv-tc-head { display: flex; align-items: flex-start; gap: 10px; min-width: 0; }
.pv-tc-check {
  flex: none; width: 20px; height: 20px; margin-top: 2px; border-radius: 50%;
  border: 1.5px solid var(--pv-text-faint); background: var(--pv-surface); cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; color: #fff; font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 0;
}
.pv-tc-check:hover { border-color: var(--pv-primary); }
.pv-tc-check.on { background: #2E7D46; border-color: #2E7D46; }
.pv-tc-check.mile { border-color: #1D4ED8; color: #1D4ED8; cursor: default; }
.pv-tc-title { flex: 1; min-width: 0; font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1.5; color: var(--pv-text); word-break: break-word; }
.pv-tc.mile .pv-tc-title { font-weight: 600; }
.pv-tc-more { flex: none; opacity: 0; transition: opacity .12s; }
.pv-tc:hover .pv-tc-more, .pv-tc-more.is-open { opacity: 1; }
.pv-tc-more-btn {
  width: 30px; height: 26px; border: 1px solid var(--pv-border); border-radius: 7px;
  background: var(--pv-surface); color: var(--pv-text-soft); cursor: pointer; font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1; padding: 0;
}
.pv-tc-more-btn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
/* 截止那行：默认灰；逾期红 + 铃铛；今天主色 + 铃铛。底下一道横线跟键值行分开 */
.pv-tc-due {
  display: flex; align-items: center; gap: 5px; flex-wrap: wrap;
  font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); padding-bottom: 10px; border-bottom: 1px solid var(--pv-border);
}
.pv-tc-due i { font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-tc-due.over { color: var(--pv-danger); }
.pv-tc-due.now { color: #2E7D46; }   /* 「今天 截止」跟抬头一样绿（用户 2026-09-09） */
.pv-tc-slip { font-size: calc(11.5px + var(--pv-fz-add, 0px)); margin-left: 2px; opacity: .85; }
/* 键值行：图标 + 灰标签靠左，值靠右；卡在网格里等高，这块沉到底 */
.pv-tc-kv { display: flex; flex-direction: column; gap: 8px; margin-top: auto; }
/* 任务卡（用户 2026-09-20）：标题区固定 4 行高、超出截断；「截止」那行和它底下的横线永远钉在标题区底部，一排卡对齐。
   购物清单卡（.pv-wc）另有一套（评分行钉横线上），不套这条；手机一列不用对齐，标题区按内容高 */
.pv-tc:not(.pv-wc) .pv-tc-head { flex: none; height: calc(4 * 1.5 * (15px + var(--pv-fz-add2, 0px))); }
.pv-tc:not(.pv-wc) .pv-tc-title { display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; }
@media (max-width: 640px) { .pv-tc:not(.pv-wc) .pv-tc-head { height: auto; } }
.pv-tc-row { display: flex; align-items: center; gap: 8px; font-size: calc(13px + var(--pv-fz-add, 0px)); min-width: 0; }
.pv-tc-row .k { flex: none; display: inline-flex; align-items: center; gap: 6px; color: var(--pv-text-faint); min-width: 64px; }
.pv-tc-row .k i { font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-tc-row .v { margin-left: auto; min-width: 0; text-align: right; color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-tc-row .v .dash { color: var(--pv-text-faint); }
.pv-tc-row .v.note { color: var(--pv-text-soft); }
.pv-task-row {
  display: flex; flex-direction: column; gap: 8px; min-width: 0;
  padding: 14px 16px; background: var(--pv-surface);
  border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius);
}
.pv-task-top { display: flex; align-items: flex-start; gap: 10px; min-width: 0; }
.pv-task-top .pv-task-title { flex: 1; min-width: 0; }
.pv-task-ops { flex: none; display: inline-flex; gap: 2px; margin-left: auto; opacity: .45; transition: opacity .12s; }
.pv-task-row:hover .pv-task-ops { opacity: 1; }
.pv-task-foot {
  margin-top: auto; padding-top: 2px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
.pv-task-foot .pv-task-due { flex: none; text-align: left; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-task-foot .pv-task-by { display: inline; margin-left: auto; font-size: calc(11.5px + var(--pv-fz-add, 0px)); white-space: nowrap; }
/* 整行可点＝打开编辑。给出手型，不然看不出这一行是能点的 */
.pv-task-row.is-link { cursor: pointer; }
.pv-task-row:hover { border-color: var(--pv-primary); }
.pv-task-row.over { background: rgba(229, 37, 45, .045); border-color: rgba(229, 37, 45, .28); }
.pv-task-row.done { opacity: .5; }
.pv-task-row.done .pv-task-title { text-decoration: line-through; }
/* 里程碑底色淡蓝一档（卡片都是白底了，靠这个和标题前的片分出来） */
.pv-task-row.mile { background: #F6F9FF; }
/* 里程碑靠标题前那枚「⚑ 里程碑」片 + 标题加粗认（用户 2026-09-07：任务和里程碑要一眼分开）。
   左边那道蓝边撤了（用户：圆角卡片配彩色边不好看）；左边原来的旗子也撤了，跟片里那枚重复。
   任务是这里的多数，不画片；提问画红底问号片。 */
.pv-task-row.mile .pv-task-title { font-weight: 700; }
.pv-task-row.mile .pv-task-mile-ico { width: 18px; height: 18px; flex: none; margin-top: 2px; }
.pv-task-kind {
  display: inline-flex; align-items: center; gap: 3px; vertical-align: 1px; margin-right: 6px;
  height: 17px; padding: 0 7px; border-radius: var(--pv-radius-pill);
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 17px; white-space: nowrap; flex-shrink: 0;
}
.pv-task-kind.k-mile { background: #E4ECFB; color: #1D4ED8; }
.pv-task-kind.k-q { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
/* 日程页添加栏：按钮 | 一道浅竖线 | 谁的（我的 / 家人 / 未分配 / 全部）片 */
.pv-task-addbar { flex-wrap: wrap; }
.pv-task-addbar-sep { width: 1px; height: 18px; background: var(--pv-border); flex: none; margin: 0 2px; }
.pv-task-who { --pv-ship-ctl-h: 26px; }
.pv-task-who .pv-ship-tab b { margin-left: 5px; font-weight: 700; opacity: .65; font-size: calc(11.5px + var(--pv-fz-add, 0px)); }

.pv-task-check {
  width: 18px; height: 18px; flex: none; margin-top: 2px; cursor: pointer;
  border: 1.5px solid var(--pv-border); border-radius: 5px; background: var(--pv-surface);
  display: flex; align-items: center; justify-content: center; color: #fff; font-size: calc(12px + var(--pv-fz-add, 0px));
}
.pv-task-check:hover { border-color: var(--pv-primary); }
.pv-task-check.on { background: #2E7D46; border-color: #2E7D46; }
.pv-task-mile-ico { flex: none; margin-top: 1px; color: var(--pv-task-cat, var(--pv-text-soft)); font-size: calc(13px + var(--pv-fz-add, 0px)); }

.pv-task-main { flex: 1; min-width: 0; }
.pv-task-title { font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text); font-weight: 550; line-height: 1.45; word-break: break-word; }
.pv-task-meta {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
/* 行底改成灰的之后，这枚色片原来那个 --pv-bg 底就跟行底同色、整个糊进去了。
   换成白底 + 中性描边：灰行和白行（里程碑）上都立得住，项目色留在字上。
   现在它是"这条属于哪个项目"的唯一载体 —— 左边那条彩色竖杠就是被它顶掉的。 */
.pv-task-proj {
  padding: 0 7px; border-radius: var(--pv-radius-pill); white-space: nowrap; flex-shrink: 0;
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  color: var(--pv-task-cat, var(--pv-text-soft)); font-weight: 600;
}
.pv-task-prio {
  padding: 0 7px; border-radius: var(--pv-radius-pill); white-space: nowrap; flex-shrink: 0;
  background: var(--pv-danger-soft); color: var(--pv-danger); font-weight: 600;
}
.pv-task-slip { color: var(--pv-danger); white-space: nowrap; flex-shrink: 0; }
.pv-task-note { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.pv-task-due {
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
  margin-top: 2px; font-variant-numeric: tabular-nums;
  display: flex; flex-direction: column; align-items: flex-end; gap: 2px;
}
/* 谁什么时候建的，垫在截止日期底下。淡一档 —— 它是来路，不该跟"什么时候要交"抢；
   而且截止日期逾期时会变红加粗，来路跟着变的话整块都在喊。 */
.pv-task-by {
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); white-space: nowrap;
}
.pv-task-due.now .pv-task-by, .pv-task-due.over .pv-task-by { color: var(--pv-text-faint); }
.pv-task-due.now { color: var(--pv-primary-dark); font-weight: 700; }
.pv-task-due.over { color: var(--pv-danger); font-weight: 700; }

.pv-task-ops { display: flex; gap: 2px; flex: none; }
/* 抽屉最底下那行来路。只读、淡一档，跟上面要填的东西隔开 */
.pv-drawer-meta {
  margin-top: 18px; padding-top: 12px; border-top: 1px dashed var(--pv-border);
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
.pv-task-op {
  width: 24px; height: 24px; border: none; background: none; cursor: pointer;
  color: var(--pv-text-faint); border-radius: var(--pv-radius-sm); font-size: calc(13px + var(--pv-fz-add, 0px));
}
.pv-task-op:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-task-op.del:hover { color: var(--pv-danger); }

/* ---- 项目管理三栏：项目树 | 内容 | 跳到 ---- */
/* 两侧都吸顶，只有中间的内容滚。
   「跳到」原本在中间，但吸附是**边缘**的语言 —— 一个夹在中间的东西钉住不动，
   眼睛读到的是"它掉队了"，不是"它被固定了"。挪到右边之后：吸附的都在边上、
   滚的只有一样、最宽那栏正好是真要读的内容。
   项目栏宽度可拖，走 --pv-pmo-side-w（JS 存在本机）。 */
.pv-pmo-layout {
  /* stretch 而不是 start：左栏得占满整列高度，底部「＋ 新建项目 / 模板管理」
     才钉得住。start 的话栏只有内容那么高，收起一块按钮就跟着往上跑到半空中。 */
  display: grid; column-gap: 0; align-items: stretch;
  /* 第二列就是拖宽把手，它同时充当栏与栏之间的间隙 —— 再叠 gap 的话
     两栏之间会变成 16+6+16=38px，散得没关系了 */
  grid-template-columns: var(--pv-pmo-side-w, 260px) 24px minmax(0, 1fr);
}
.pv-pmo-nav { display: none; }
@media (min-width: 1180px) {
  .pv-pmo-layout { grid-template-columns: var(--pv-pmo-side-w, 260px) 24px minmax(0, 1fr) 166px; }   /* 152 → 166：右边给滚动条让出了 14（用户 2026-09-28） */
  .pv-pmo-nav { display: flex; }
}
@media (max-width: 860px) {
  .pv-pmo-layout { grid-template-columns: 1fr; row-gap: 12px; }
  .pv-pmo-grip { display: none; }        /* 手机上没有鼠标可拖，也没有并排的两栏 */
}

/* 拖宽把手 —— 它画的那条竖线**就是**两栏之间的分割线。
   原来分割线画在左栏（.pv-pmo-side-body 的 border-right），把手自己在 12px 外
   另画一条，指上去就成了灰的一条、黄的一条并排两条。线只能有一条：平时灰、
   指上去/拖着变主色加粗，位置不动。 */
.pv-pmo-grip {
  align-self: stretch; min-height: 60px; cursor: col-resize; position: relative;
}
.pv-pmo-grip::after {
  content: ""; position: absolute; top: 0; bottom: 0; left: 50%; width: 1px;
  transform: translateX(-50%); border-radius: 1px;
  background: var(--pv-border); transition: background .12s, width .12s;
}
.pv-pmo-grip:hover::after, .pv-pmo-grip.on::after { background: var(--pv-primary); width: 2px; }

/* ① 项目树 —— 版式照搬 wbhrd SW PMO 的 Project folders。
   一行是个五格 grid「折叠 | 圆点 | 名字 | 状态 | ⋯」，列宽和 4px 间距按原样；
   颜色、圆角、字号换成站里的 token。 */
/* 不用 sticky 了：整个骨架本来就不滚（见 .pv-work），边栏只要撑满剩余高度、
   内部超出了自己滚就行。sticky 在一个不滚的容器里反而会算错位置。 */
/* 不画框线：面板底色和页面底色都是白的，框线一去两栏就化进页面里，
   只剩内容本身在说话。中间那块内容区还留着卡片，所以"哪块是主角"依然分得清。 */
.pv-pmo-side {
  /* 顶上不留内边距：上面就是那条横线，再空一档，左栏第一项会比右边的内容低一截 */
  padding: 0 16px 14px 0;
  display: flex; flex-direction: column; min-height: 0;
}
/* 两棵树当一个整体，吃掉除底部按钮以外的全部高度。
   这儿不再画竖线：两栏之间那条线由拖宽把手 .pv-pmo-grip 画（它就在这条线上），
   原来这里再画一条，指上把手时就是灰黄两条并排。 */
.pv-pmo-side-body {
  flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column;
}
/* 树本身滚，头部（搜索/筛选）和底部（新建）钉住不动 */

.pv-pmo-side-head { display: flex; align-items: center; margin-bottom: 10px; }
/* 左栏「项目」和中栏「跳到」用同一套：原来一个带 uppercase 一个不带，
   字号字重虽然一样，渲染出来还是看得出不齐。 */
.pv-pmo-side-title, .pv-pmo-nav-title {
  flex: 1; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .04em;
  color: var(--pv-text-faint);
}
/* 筛选行（用户 2026-10-30 改版）：一行不折——左边分段钮 .pv-pmo-fseg（全部 / 推进中 / 长期），右边「今天要交」；
   两边都 26 高同一条中线。栏不到 236 宽时红钮收掉「今天」两个字（.pv-pmo-side 是容器查询的容器） */
.pv-pmo-filters { display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; margin-bottom: 10px; min-width: 0; }
.pv-pmo-fseg { flex: none; }
.pv-pmo-filters .pv-pmo-fseg button { height: 24px; padding: 0 9px; font-size: calc(12px + var(--pv-fz-add, 0px)); }   /* 24 + 外框 2 = 26，跟右边红钮同高；多写一层是为了压过后面 .pv-pmo-seg button 那条 */
.pv-pmo-filters .pv-pmo-fseg button.live.on { background: #E4F5EA; color: #1F7A3D; }   /* 「推进中」选中走绿，跟全站的推进中一致 */
.pv-pmo-canvas .pv-pmo-side { container-type: inline-size; container-name: pmoside; }
@container pmoside (max-width: 236px) { .pv-pmo-due-chip .w { display: none; } .pv-pmo-filters .pv-pmo-fseg button { padding: 0 7px; } .pv-pmo-due-chip { padding: 0 8px; } .pv-pmo-filters { gap: 6px; } }
@container pmoside (max-width: 212px) { .pv-pmo-filters .pv-pmo-fseg button { padding: 0 5px; } .pv-pmo-due-chip { padding: 0 6px; } .pv-pmo-filters { gap: 4px; } }   /* 栏拖到最窄（200）三颗 + 红钮还在一行 */
/* 抬头那一行：左边原来那颗整宽的抬头钮 + 右边「全部折叠 / 展开」小钮 */
.pv-pmo-sect-row { display: flex; align-items: center; gap: 2px; }
.pv-pmo-sect-row > .pv-pmo-sect { flex: 1 1 auto; min-width: 0; width: auto; }
.pv-pmo-foldall { flex: none; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.pv-pmo-foldall:hover { background: var(--pv-bg); color: var(--pv-text); }
/* 每行右边那颗 ⋯ 悬停 / 选中才出来：一列几十行每行一颗太吵；没有鼠标的设备一直在 */
@media (hover: hover) {
  .pv-pmo-row .pv-pmo-menu-btn { opacity: 0; transition: opacity .12s; }
  .pv-pmo-row:hover .pv-pmo-menu-btn, .pv-pmo-row.active .pv-pmo-menu-btn, .pv-pmo-row:focus-within .pv-pmo-menu-btn { opacity: 1; }
}
/* 「推进中」这一颗选中时走绿，不跟「全部」那颗一样用主题黄 —— 全站「推进中」
   已经统一是绿色（角标、状态切换），筛选这儿再用黄的就成了第三种说法。
   用显式 class 而不是 :nth-child —— 位置一变就失效，而且排查时看不出是谁在生效。 */
.pv-ship-tab.pv-tab-live.active {
  background: linear-gradient(180deg, #E9F8EE 0%, #D9F1E1 100%);
  border-color: #A8DCBB; color: #1F7A3D;
}
.pv-pmo-f-due.pv-ship-tab:not(.active) { color: var(--pv-danger); }
.pv-pmo-side-empty { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.7; padding: 6px 2px 14px; }
/* 项目目录那棵占掉剩下的高度；共享那棵**只占自己内容那么高**（flex-grow: 0）——
   两棵都 grow 的话，一条两条的共享列表会白拿走半栏。
   收起项目目录时，共享那棵自然就摊得下全部内容，不再需要"先滚一段才看得全"。 */
.pv-pmo-tree { flex: 1 1 auto; min-height: 40px; margin-right: -4px; padding-right: 4px; overflow-y: auto; }
/* 只占自己内容那么高，但**不低于**这个数：只有一两个项目时，容器比「⋯」
   那张菜单还矮，菜单被 overflow 裁掉一半，得先滚一段才点得着。
   140px 正好装得下三行菜单。上限交给 flex 收缩（min-height:0 的父级会压它）。 */
.pv-pmo-tree-shared { flex: 0 0 auto; min-height: 0; max-height: 40vh; }   /* 不被压扁（空态那两行原来会被裁掉，用户 2026-09-14）；太长自己滚 */
/* 两块的抬头当开关用：整行可点，左边一个三角 */
.pv-pmo-sect {
  display: flex; align-items: center; gap: 2px; width: 100%;
  border: none; background: none; padding: 2px 0; cursor: pointer; font-family: inherit;
  text-align: left;
}
/* 展开三角：**一个类，两处共用**（左栏两块抬头 + 树里每一行）。
   用 ▾ / ▸ 字形的话有两重麻烦：那两个字形本身宽高就不一样，而且同一个字形
   转 90° 之后视觉尺寸也变 —— 于是同一棵树上会同时出现三四种大小的三角。
   边框画出来的三角旋转前后几何全等，两处共用一个类也就不可能再走样。 */
.pv-tri {
  display: block; position: relative; width: 18px; height: 18px;
  color: inherit; transition: transform .15s ease;
}
.pv-tri::before {
  content: ""; position: absolute; top: 50%; left: 50%;
  width: 0; height: 0; margin: -4px 0 0 -2px;
  border-left: 4px solid currentColor;
  border-top: 4px solid transparent;
  border-bottom: 4px solid transparent;
}
.pv-tri.open { transform: rotate(90deg); }
.pv-pmo-sect-chev { flex: none; color: var(--pv-text-faint); }
.pv-pmo-sect.open .pv-pmo-sect-chev { transform: rotate(90deg); }
.pv-pmo-sect:hover .pv-pmo-side-title { color: var(--pv-text); }
/* 收起时把条数写在抬头上 —— 不然收起来就完全看不出里面有没有东西 */
.pv-pmo-sect-n {
  flex: none; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint);
  font-variant-numeric: tabular-nums;
}
/* 今天要交几件。红一档 —— 它是"有火"，跟单纯的条数不是一回事。
   带上「Due」两个字：一个光秃秃的数字看不出是条数还是欠账。 */
.pv-pmo-sect-due {
  flex: none; height: 17px; padding: 0 7px; border-radius: 9px;
  background: var(--pv-danger-soft); color: var(--pv-danger-text);
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .02em;
  line-height: 17px; white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
/* 手机上边栏不吸顶也不限高，树就不该自己滚（页面滚就行） */
@media (max-width: 860px) { .pv-pmo-tree { overflow: visible; } }
/* 左栏下面「个人项目」那一块：跟上面的家庭项目之间用一条线断开 ——
   它回答的是另一个问题（只有我看得见的），不是家庭目录的延续。
   （类名沿用改版前「共享给我的」那块的，样式一模一样。） */
.pv-pmo-shared {
  flex: 0 0 auto; min-height: 0; display: flex; flex-direction: column;
  margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--pv-border);
  margin-bottom: 12px;   /* 跟底下「＋ 新建项目」之间留一口气（用户 2026-09-14） */
}
/* 收起时抬头底下不留那 10px —— 那是给底下的筛选和树让的位，
   收起来之后底下什么都没有，留着就是一截空当。
   排在上面那条之后：两条同样重，靠先后分胜负。 */
.pv-pmo-side .pv-pmo-sect:not(.open) { margin-bottom: 0; }
.pv-pmo-shared:not(.open) { margin-top: 8px; padding-top: 8px; }

/* 永远钉在最底下 */
.pv-pmo-side-foot { margin-top: auto; padding-top: 12px; }
/* ===== 全站统一的「＋ 新建 / 加一个」按钮（用户 2026-09-14：只改这一处，各处只差宽度）=====
   .pv-pmo-newbtn（项目管理左栏「新建项目」，整宽）和 .pv-task-addbtn（记一笔 / 加一个人 / 加一件礼物 / 新增一行…）同一套。 */
.pv-pmo-newbtn, .pv-task-addbtn {
  border: 1.5px dashed var(--pv-text-soft); background: none;      /* 边线加粗、颜色跟字一样灰（用户 2026-09-14） */
  color: var(--pv-text-soft); border-radius: var(--pv-radius-sm);
  padding: 6px 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 400; cursor: pointer;
  white-space: nowrap; flex-shrink: 0; font-family: inherit; line-height: 1.4;
}
.pv-pmo-newbtn { width: 100%; }
.pv-pmo-newbtn:hover, .pv-task-addbtn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }

/* 一行五格，列宽/间距/内边距按 SW PMO 原样：18px 折叠、18px 图标、名字撑开、
   状态角标、⋯。gap 4px、padding 4px 6px、圆角 6px、行间 margin 1px。 */
.pv-pmo-node { }
.pv-pmo-row {
  display: grid; grid-template-columns: 18px 18px 1fr auto auto;
  align-items: center; gap: 4px;
  /* 行高对齐右边「跳到」里的条目（32px）—— 两栏都是"一条条可以点的东西"，
     一边 30 一边 32，并排看得出错位。 */
  min-height: 32px; padding: 6px; border-radius: 6px;
  /* 用侧栏同一支深灰（--pv-text-soft），不用纯黑 —— 一列几十行纯黑很扎眼，
     而这一栏是导航，不该比它右边的内容还重 */
  color: var(--pv-text-soft);
  cursor: pointer; user-select: none; position: relative; margin: 1px 0;
}
/* 子层：一条竖线 + 缩进。这条线必须靠真嵌套容器的 border-left 画 ——
   摊平成一串再用 padding 缩进的话，线连不起来。 */
.pv-pmo-children { margin-left: 14px; border-left: 1px solid var(--pv-border); padding-left: 4px; }

.pv-pmo-row:hover { background: var(--pv-bg); }
/* 选中态跟右边「跳到」保持一致：浅黄底 + 深黄字。
   原来是整条主题色实底反白 —— 一是跟对面那栏不是一套语言，二是实底压着彩色文件夹
   图标会脏（当时只能把图标也刷白，等于把项目颜色这条信息扔了）。 */
.pv-pmo-row.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }

.pv-pmo-row.off { opacity: .55; }
.pv-pmo-row.dragging { opacity: .45; }
/* 落点提示：前/后画一条线，放进去画一圈虚线 —— 三种落点必须长得不一样，
   不然拖到一半根本不知道松手会发生什么 */
.pv-pmo-row.drop-inside { background: var(--pv-primary-soft); outline: 1px dashed var(--pv-primary); }
.pv-pmo-row.drop-before::before, .pv-pmo-row.drop-after::after {
  content: ""; position: absolute; left: 8px; right: 8px; height: 2px;
  background: var(--pv-primary); border-radius: 1px;
}
.pv-pmo-row.drop-before::before { top: 0; }
.pv-pmo-row.drop-after::after { bottom: 0; }

.pv-pmo-fold {
  /* 里面装的是 .pv-tri（CSS 画的三角），跟左栏两块抬头那颗完全一样大。
     格子固定 18px —— 那一行是固定五列的 grid，宽度不能动。 */
  border: none; background: none; color: var(--pv-text-faint);
  cursor: pointer; padding: 0; width: 18px; height: 18px;
  display: flex; align-items: center; justify-content: center;
}
.pv-pmo-fold:hover { color: var(--pv-text); }
.pv-pmo-fold.empty { visibility: hidden; }
/* 文件夹吃项目颜色。选中那行整条是主题色实底，图标跟着转白，
   不然彩色图标压在实底上会脏。 */
.pv-pmo-ico {
  line-height: 0; display: flex; align-items: center; justify-content: center;
  color: var(--pv-task-cat, var(--pv-text-faint));
}
/* 选中后图标保持项目色 —— 浅底不会把它压脏，颜色这条信息就不用丢 */
.pv-pmo-label {
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 500; min-width: 0; color: inherit;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pv-pmo-badge {
  flex-shrink: 0; font-size: calc(10px + var(--pv-fz-add, 0px)); font-weight: 600; letter-spacing: .02em;
  padding: 2px 6px; border-radius: var(--pv-radius-pill); white-space: nowrap;
  background: var(--pv-bg); color: var(--pv-text-faint);
}
.pv-pmo-badge.due { background: var(--pv-danger-soft); color: var(--pv-danger); font-weight: 700; }
/* 推进中＝绿灯。原来是蓝底蓝字，跟"在跑"这个意思对不上，而且淡底淡字在
   一堆行里根本跳不出来。深绿 + 白字，一眼看见哪几个在动。 */
/* 浅绿底 + 深绿字，跟状态切换里那颗「推进中」同一套。深绿实底太重：
   一列里每个项目都挂着它，几块深色压在导航栏上，反而盖过了真正要看的项目名。 */
.pv-pmo-badge.live {
  background: #E4F5EA; color: #1F7A3D; font-size: calc(9.5px + var(--pv-fz-add, 0px)); font-weight: 500;
}
.pv-pmo-badge.done { background: #d1fae5; color: #065f46; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1; }
.pv-pmo-badge.spacer { visibility: hidden; pointer-events: none; }
.pv-pmo-menu-btn {
  border: none; background: none; color: var(--pv-text-faint); font-size: 16px;
  line-height: 1; padding: 0 4px; cursor: pointer; border-radius: 4px;
}
.pv-pmo-menu-btn:hover { background: var(--pv-border); color: var(--pv-text); }
.pv-pmo-menu {
  position: absolute; right: 0; top: 100%; z-index: 20; min-width: 120px;
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,.08); padding: 4px;
}
/* 字号跟树里的项目名一致（12.5px）—— 这个菜单是从那一行弹出来的，
   两者差半档会显得菜单是"别处来的东西" */
.pv-pmo-menu button {
  display: block; width: 100%; text-align: left; border: none; background: none;
  font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 500;
  padding: 7px 10px; border-radius: 6px; cursor: pointer;
  color: var(--pv-text); white-space: nowrap;
}
.pv-pmo-menu button:hover { background: var(--pv-bg); }
.pv-pmo-menu button.danger { color: var(--pv-danger); }

.pv-pmo-hit {
  display: flex; align-items: center; gap: 9px; padding: 8px 4px; cursor: pointer;
  border-bottom: 1px solid var(--pv-border); font-size: calc(13.5px + var(--pv-fz-add, 0px));
}
.pv-pmo-hit:hover { background: var(--pv-bg); }
.pv-pmo-hit-kind {
  font-size: calc(10px + var(--pv-fz-add, 0px)); font-weight: 700; padding: 1px 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
}
/* 搜索结果左边的类型小签（用户 2026-09-28）：20 高的小签那一档，一种一个颜色；周期任务带循环图标。宽度定死，标题才对得齐 */
.pv-pmo-hit-kind { display: inline-flex; align-items: center; justify-content: center; gap: 3px; box-sizing: border-box; min-width: 72px; height: 20px; padding: 0 7px;
                   border-radius: 4px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1; font-weight: 600; }
.pv-pmo-hit-kind i { font-size: 12px; }
.pv-pmo-hit-kind.k-proj { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-pmo-hit-kind.k-mile { background: #E4ECFB; color: #1D4ED8; }
.pv-pmo-hit-kind.k-cycle { background: #E6F7F5; color: #0F766E; }
.pv-pmo-hit-kind.k-todo { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-pmo-hit-kind.k-doc { background: #FBF1DC; color: #8A5A00; }     /* 搜到的文档链接 / 文件夹（1.0.35） */
.pv-pmo-hit-kind.k-att { background: var(--pv-bg); color: var(--pv-text-soft); border: 1px solid var(--pv-border); }
.pv-pmo-hit-open { flex-shrink: 0; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-primary-dark); white-space: nowrap; padding: 0 2px; }
.pv-pmo-hit-open:hover { text-decoration: underline; }
.pv-pmo-hit-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-pmo-hit-title.done { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-pmo-hit-sub { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }

/* 「今天要交 N」靠右站，跟左边那两个"看哪一批"的开关分开 */
.pv-pmo-due-chip {
  margin-left: auto; display: inline-flex; align-items: center; gap: 4px;
  border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-faint);
  border-radius: var(--pv-radius-pill); height: 26px; padding: 0 10px;   /* 26：跟左边分段钮同高（用户 2026-10-30） */
  /* 文字和数字各是一个 flex 项，行高不一样时各自的中线就对不上（数字偏上，用户 2026-09-11）：
     统一成同一行高再居中 */
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 24px; font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0;
}
.pv-pmo-due-chip.hot { background: var(--pv-danger); border-color: var(--pv-danger); color: #fff; }
.pv-pmo-due-chip.on { box-shadow: 0 0 0 2px var(--pv-danger-soft); }
.pv-pmo-due-chip b { font-weight: 700; line-height: inherit; font-variant-numeric: tabular-nums; }

/* 右栏头部：项目名 + 状态切换 */
.pv-pmo-head {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 0 2px 12px; margin-bottom: 14px; border-bottom: 1px solid var(--pv-border);
}
.pv-pmo-head-ico { flex: none; display: flex; align-items: center; line-height: 0; }
/* 抬头上能点的那一块（图标 + 项目名）：点了拉开项目信息抽屉（用户 2026-09-28）。长相不变，悬停才有一层浅底 */
.pv-pmo-head-hit { display: inline-flex; align-items: center; gap: 10px; min-width: 0; margin: -4px -8px; padding: 4px 8px; border: 0; border-radius: 10px;
                   background: none; font: inherit; color: inherit; text-align: left; cursor: pointer; }
.pv-pmo-head-hit:hover { background: var(--pv-bg); }
.pv-pmo-head-hit:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: 1px; }
/* 负责人：小头像 + 名字，同一行高再居中 */
.pv-pmo-head-owner { display: inline-flex; align-items: center; gap: 5px; flex: none; height: 24px; padding: 0 9px 0 3px; border-radius: 999px; background: var(--pv-bg);
                     font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 24px; color: var(--pv-text-soft); white-space: nowrap; }
.pv-pmo-head-owner .pv-pmo-face { width: 18px; height: 18px; font-size: 10px; }
/* 「待认领」：跟旁边的负责人胶囊同高同字号，只换颜色；能点 */
.pv-pmo-head-claim { flex: none; height: 24px; padding: 0 10px; border: 0; border-radius: 999px; background: var(--pv-warning-soft); color: var(--pv-warning-text);
                     font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 24px; font-weight: 600; white-space: nowrap; cursor: pointer; }
.pv-pmo-head-claim:hover { background: var(--pv-warning-border); }
.pv-pmo-head-name {
  margin: 0; font-size: 20px; font-weight: 700; color: var(--pv-text);
  font-family: var(--title-font); min-width: 0;
}

.pv-pmo-blank { padding: 40px 20px; text-align: center; color: var(--pv-text-faint); font-size: calc(14px + var(--pv-fz-add2, 0px)); }

/* ② 跳到 —— 吸顶 + 滚动高亮。参考实现两样都没有，右边一滚它就跟着滚走，
   而它的全部价值就是"滚到一半也能立刻跳到别处"。 */
.pv-pmo-nav {
  flex-direction: column; gap: 3px; min-height: 0; margin-left: 16px;
  /* 右边留 8：按钮不贴着滚动条；整列再往里收 6，滚动条不贴着页面右边框（用户 2026-09-28） */
  padding: 0 8px 14px 10px; margin-right: 6px; overflow-y: auto;   /* 顶上不留内边距，跟左栏对齐 */
}
.pv-pmo-nav-head { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; }
.pv-pmo-gear {
  width: 26px; height: 26px; border-radius: 50%; border: 1px solid var(--pv-border);
  background: var(--pv-surface); color: var(--pv-text-soft); cursor: pointer;
  line-height: 0; flex-shrink: 0; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
}
.pv-pmo-gear:hover, .pv-pmo-gear.on { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; }
.pv-pmo-nav-group { display: flex; flex-direction: column; gap: var(--pv-nav-gap); }
.pv-pmo-nav-group + .pv-pmo-nav-group {
  margin-top: 9px; padding-top: 10px; border-top: 1px solid var(--pv-border);
}
/* 组标题跟它下面第一条之间原来只有 2px，粘成一坨；组与组之间反而更远，
   读起来像标题属于上一组。拉到 8px，从属关系才清楚。 */
/* 左栏组标题（清单 / 分类 / 跳到里的组名）跟空间页的「模块」一个样：12px / 不加粗 / 往左靠
   （用户 2026-09-03：模块和清单两个字大小不一样，以模块为准，都不加粗、再往左一点） */
.pv-pmo-nav-gtitle {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; letter-spacing: .04em; color: var(--pv-text-faint);
  padding: 0 4px; margin-bottom: 8px;
}
/* 字号/字重跟左边树里的项目名对齐（.pv-pmo-label 是 12.5px/500）——
   两边都是"一条一条可以点的东西"，长得不一样只会让人以为是两类东西。 */
.pv-pmo-nav-btn {
  display: block; width: 100%; text-align: left; border: none; background: var(--pv-bg);
  color: var(--pv-text-soft); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 500;
  padding: 7px 9px; border-radius: 7px; cursor: pointer;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pv-pmo-nav-btn:hover { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
/* 拖着换顺序（用户 2026-09-21） */
.pv-pmo-nav-btn { position: relative; }
.pv-pmo-nav-btn.dragging { opacity: .4; }
.pv-pmo-nav-btn.drop-before::after, .pv-pmo-nav-btn.drop-after::after { content: ""; position: absolute; left: 8px; right: 8px; height: 2px; background: var(--pv-primary); border-radius: 0; pointer-events: none; }   /* 平线，不跟圆角弯 */
.pv-pmo-nav-btn.drop-before::after { top: -1px; }
.pv-pmo-nav-btn.drop-after::after { bottom: -1px; }
.pv-pmo-nav-btn.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-pmo-mods {
  margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--pv-border);
}
.pv-pmo-mods-hint { font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 6px; line-height: 1.5; }
.pv-pmo-mods-row { display: flex; align-items: center; gap: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); padding: 2px 0; cursor: pointer; }
.pv-pmo-mods-lock { margin-left: auto; font-size: calc(10px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }

/* ③ 内容 */
.pv-pmo-main { min-width: 0; }
.pv-pmo-jumpbar { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-pmo-sec {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius); padding: 14px 16px; margin-bottom: 14px;
  /* 滚的是 .pv-work-scroll 自己，不是视口，所以不用给顶栏让高度 */
  scroll-margin-top: 8px;
}
.pv-pmo-sec-head {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  /* 给足高度，右边那颗「＋ 添加…」才不会显得被压扁 */
  min-height: 34px; padding-bottom: 11px; margin-bottom: 12px;
  border-bottom: 1px solid var(--pv-border);
}
.pv-pmo-sec-head h3 { margin: 0; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); }
.pv-pmo-sec-empty { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.75; }
.pv-pmo-secbtn {
  display: inline-flex; align-items: center; height: 26px;
  border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft);
  border-radius: 7px; padding: 0 11px; font-size: calc(12px + var(--pv-fz-add, 0px)); cursor: pointer;
  white-space: nowrap; flex-shrink: 0; font-family: inherit;
}
.pv-pmo-secbtn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }

.pv-pmo-status { display: inline-flex; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm); overflow: hidden; }
.pv-pmo-status button {
  border: none; background: var(--pv-surface); color: var(--pv-text-soft); cursor: pointer;
  font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 4px 10px; white-space: nowrap; flex-shrink: 0;
}
.pv-pmo-status button + button { border-left: 1px solid var(--pv-border); }
.pv-pmo-status button:hover:not(:disabled) { background: var(--pv-bg); }
.pv-pmo-status button.on { font-weight: 700; }
/* 推进中＝绿灯。用清脆的浅绿渐变，不用深绿 —— 这是个常驻状态，深色块压在标题行上太重 */
.pv-pmo-status button.on.s-进行中 {
  background: linear-gradient(180deg, #E9F8EE 0%, #D6F0DF 100%);
  color: #1F7A3D; box-shadow: inset 0 0 0 1px #A8DCBB;
}
.pv-pmo-status button.on.s-没开始 { background: var(--pv-bg); color: var(--pv-text); }
.pv-pmo-status button.on.s-暂停 { background: var(--pv-warning-soft); color: #92400e; }
.pv-pmo-status button.on.s-已完成 { background: #E7F6EC; color: #2E7D46; }

.pv-pmo-kpis { display: flex; gap: 22px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-pmo-kpi { display: flex; flex-direction: column; gap: 1px; }
.pv-pmo-kpi b { font-size: 20px; font-weight: 700; color: var(--pv-text); line-height: 1.1; font-variant-numeric: tabular-nums; }
.pv-pmo-kpi span { font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-pmo-kpi.hot b { color: var(--pv-danger); }
.pv-pmo-bar { height: 6px; border-radius: 3px; background: var(--pv-bg); overflow: hidden; margin-bottom: 10px; }
.pv-pmo-bar span { display: block; height: 100%; background: var(--pv-task-cat, var(--pv-primary)); }
.pv-pmo-progtxt { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin: -4px 0 10px; }
.pv-pmo-progtxt b { color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-pmo-dates { display: flex; gap: 16px; flex-wrap: wrap; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 共享给谁：没共享就整行不画（见模板），画出来时低调一点 —— 它是背景信息，不是待办 */
.pv-pmo-share { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
/* 名字 + 共享标记合占 grid 的第三格。名字自己截断，标记永不压缩 ——
   这一行任何情况下都不许换行（行高是固定的 32px，换行会把整棵树顶乱）。 */
.pv-pmo-name { display: flex; align-items: center; gap: 5px; min-width: 0; overflow: hidden; }
/* 树上的共享标记。两种方向用实心/空心区分，不用两个颜色 ——
   颜色那一栏已经被项目色占着了，再塞一个颜色进去会跟项目色打架。 */
/* 日历上任务条右边那行「谁 · 哪天建的」。淡一档、不换行 ——
   它是出处，不该跟任务本身抢；一条不是自己的任务，光有标题看不出来路。 */
.pv-cal-by {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
  margin-left: 6px; font-variant-numeric: tabular-nums;
}
/* 今天面板里它是个按钮（点了去那个项目的面板）：去掉按钮外观，悬停变主色带下划线，跟旁边的标题热区一个手感 */
button.pv-cal-by.is-link {
  border: none; background: none; padding: 0; font: inherit; font-size: calc(11.5px + var(--pv-fz-add, 0px)); cursor: pointer;
  border-bottom: 1px solid transparent; line-height: 1.4;
}
button.pv-cal-by.is-link:hover { color: var(--pv-primary-dark); border-bottom-color: currentColor; }

/* 中国海运的二级筛选（批次 / 账号）并进了状态那一行（用户 2026-09-03），
   前面留一个字当标签 —— 不加的话跟旁边那排状态看起来是同一排东西。 */
.pv-ship-batch-lab {
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
  margin-right: 2px;
}

/* 右栏抬头下那行范围提示（🔒 个人项目 / 👨‍👩‍👧 家庭项目） */
.pv-pmo-share-lab { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }
.pv-pmo-share-who {
  font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 1px 9px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-soft); white-space: nowrap; flex-shrink: 0;
}
.pv-pmo-note { margin-top: 10px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); line-height: 1.75; white-space: pre-wrap; }

/* 里程碑竖轨 —— 版式照搬 wbhrd 的 timeline。
   ⚠️ 类名不能用 .pv-pmo-node —— 那个已经被项目树的递归组件占了（pmo-node.js）。
   撞上的话这里的 display:grid 会把树的每一行也变成 grid。跟之前 .pv-shell 那次一样，
   CSS 撞名不报错，只会静默改掉别人的布局。

   关键三处：
   1. 竖线用 grid 第一列的**正中**定位（left: 轨宽/2 + translateX(-50%)），
      不是拿伪元素凑 —— 之前那条虚线没对准圆点，看着像两套东西。
   2. 圆点外面套一圈白 box-shadow，把竖线"咬断"，线才不会从点中间穿过去。
   3. 线本身是渐变：近处（上方，快到期的）偏蓝，远处淡成灰。 */
.pv-rail { --track: 30px; position: relative; padding: 4px 0 2px; }
.pv-rail::before {
  content: ""; position: absolute; left: calc(var(--track) / 2); top: 18px; bottom: 18px;
  width: 2px; transform: translateX(-50%); border-radius: 999px; pointer-events: none;
  /* 近处（快到的）用主题黄，远处淡成灰。原来近处是蓝的 —— 站里没有别的地方用蓝，
     单这一条线蓝着，像是从别的产品里抠过来的。 */
  background: linear-gradient(180deg, #EBC97F 0%, #F6E4BC 14%, var(--pv-border) 52%, var(--pv-border) 100%);
}
.pv-rail-node {
  display: grid; grid-template-columns: var(--track) minmax(0, 1fr);
  column-gap: 12px; align-items: start; position: relative; padding-bottom: 14px;
}
.pv-rail-node:last-child { padding-bottom: 2px; }
.pv-rail-dot {
  grid-column: 1; grid-row: 1; place-self: start center;
  width: 15px; height: 15px; margin-top: 13px; padding: 0;
  border-radius: 50%; background: #fff; border: 3px solid var(--pv-primary);
  box-sizing: border-box; z-index: 1; cursor: pointer;
  /* 这圈白就是把竖线咬断的那一下 */
  box-shadow: 0 0 0 3px var(--pv-surface), 0 1px 3px rgba(201, 125, 7, .18);
  transition: transform .12s;
}
button.pv-rail-dot:hover { transform: scale(1.15); }
.pv-rail-node.is-done .pv-rail-dot {
  border-color: #2E7D46; background: #2E7D46;
  box-shadow: 0 0 0 3px var(--pv-surface), 0 1px 2px rgba(46, 125, 70, .2);
}
.pv-rail-node.is-late .pv-rail-dot {
  border-color: var(--pv-primary); background: #FFFBEB;
  box-shadow: 0 0 0 3px var(--pv-surface), 0 0 0 6px rgba(201, 125, 7, .12);
}
/* 今天到期的里程碑：整张卡蓝框 + 浅蓝底、圆点也蓝（用户 2026-09-10：先用了绿，跟已完成分不开，改蓝）。红只留给逾期。 */
.pv-rail-node.is-due .pv-rail-dot {
  border-color: var(--pv-info); background: var(--pv-info-soft);
  box-shadow: 0 0 0 3px var(--pv-surface), 0 0 0 6px rgba(37, 99, 235, .14);
}
.pv-rail-node.is-due .pv-rail-card { border-color: var(--pv-info); background: var(--pv-info-soft); }
.pv-rail-node.is-undated .pv-rail-dot {
  border-color: var(--pv-border); border-style: dashed; background: var(--pv-bg);
  box-shadow: 0 0 0 3px var(--pv-surface);
}
.pv-rail-node--today .pv-rail-dot {
  width: 17px; height: 17px; margin-top: 12px; cursor: default;
  border-color: var(--pv-primary); background: var(--pv-primary-soft);
  box-shadow: 0 0 0 3px var(--pv-surface), 0 0 0 7px rgba(201, 125, 7, .16);
}
.pv-rail-card {
  grid-column: 2; grid-row: 1;
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: 10px; padding: 10px 12px; box-shadow: 0 1px 2px rgba(15, 23, 42, .04);
}
/* 「今天」只是轨道上的一个刻度，不是里程碑：不画框、不铺底，跟真正的里程碑卡拉开（用户 2026-09-10） */
.pv-rail-card.today { border: none; background: none; box-shadow: none; padding: 10px 0 0 2px; }
.pv-rail-node.is-done .pv-rail-card { border-color: #A8DCBB; background: #F3FBF5; }
.pv-rail-card-head { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }   /* 日期和标题之间隔 12（用户 2026-09-21） */
/* 整张卡点一下就打开编辑抽屉（跟任务行一样）；原来只有悬停才露出的那支笔是唯一热区，
   点卡片本身没反应，人会以为点不动。笔撤了，卡片就是入口。 */
.pv-rail-card.is-link { cursor: pointer; transition: border-color .12s, box-shadow .12s; }
.pv-rail-card.is-link:hover { border-color: var(--pv-primary); box-shadow: var(--pv-shadow); }
.pv-rail-kicker {
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .06em; color: var(--pv-primary-dark);
}
/* 日期用衬线字体：数字带衬线更好认，也跟正文（无衬线）拉开层次，
   一眼知道"这是个日子"而不是普通文字。跟 roadmap 用等宽字体是同一个用意。 */
.pv-rail-date {
  font-family: Cambria, Georgia, "Times New Roman", serif;
  font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-primary-dark);
  font-variant-numeric: tabular-nums; letter-spacing: .01em;
  text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 3px;
  text-decoration-color: rgba(201, 125, 7, .38);
}
.pv-rail-card.today .pv-rail-date { color: #8A5A05; text-decoration-color: rgba(201, 125, 7, .6); }
.pv-rail-node.is-late .pv-rail-date {   /* 逾期才红；今天到期的日期照常（用户 2026-09-10） */
  color: var(--pv-danger); text-decoration-color: rgba(229, 37, 45, .45);
}
.pv-rail-node.is-due .pv-rail-date { color: var(--pv-info-text); text-decoration-color: rgba(37, 99, 235, .4); }
.pv-rail-node.is-done .pv-rail-date { color: #1F7A3D; text-decoration-color: rgba(31, 122, 61, .4); }
.pv-rail-node.is-undated .pv-rail-date { color: var(--pv-text-faint); text-decoration-style: dashed; }
.pv-rail-card-title { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); line-height: 1.4; }
.pv-rail-card-note { margin-top: 3px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.6; }
.pv-rail-late {
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; padding: 0 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-danger-soft); color: var(--pv-danger); white-space: nowrap; flex-shrink: 0;
}

/* 卡片右下角的完成按钮 */
.pv-rail-card-foot { display: flex; justify-content: flex-end; align-items: center; gap: 6px; margin-top: 8px; }   /* 添加子任务 + 标记完成并排右下角 */
.pv-rail-done {
  border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-faint);
  border-radius: 6px; padding: 3px 10px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); cursor: pointer;
  font-family: inherit; white-space: nowrap; flex-shrink: 0; transition: all .12s;
}
.pv-rail-done:hover { border-color: #A8DCBB; color: #1F7A3D; background: #F3FBF5; }
.pv-rail-done.on { border-color: #A8DCBB; background: #E4F5EA; color: #1F7A3D; font-weight: 600; }

/* 板块标题上的三档小切换（未完成 / 已完成 / 全部） */
.pv-pmo-seg { display: inline-flex; border: 1px solid var(--pv-border); border-radius: 7px; overflow: hidden; }
.pv-pmo-seg button {
  border: none; background: var(--pv-surface); color: var(--pv-text-faint); cursor: pointer;
  font-family: inherit; font-size: calc(11.5px + var(--pv-fz-add, 0px)); height: 26px; padding: 0 10px;
  white-space: nowrap; flex-shrink: 0;
}
.pv-pmo-seg button + button { border-left: 1px solid var(--pv-border); }
.pv-pmo-seg button:hover { background: var(--pv-bg); }
.pv-pmo-seg button.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }

/* 评论区照 wbhrd-roadmap 的 .fo-dialogue-*：输入框**就在板块里**，不再点按钮弹抽屉。
   写一句话要先点一颗按钮、再等一张抽屉滑出来、写完还要找「记下」——三步之后人就不写了。
   条目之间用一道细横线分隔（不是虚线的整行框），日期那行是小号加字距的浅灰字。 */
.pv-pmo-compose textarea {
  width: 100%; min-height: 72px; resize: vertical; display: block;
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-btn);
  padding: 8px 10px; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6;
  box-sizing: border-box; color: var(--pv-text); background: var(--pv-surface);
}
.pv-pmo-compose textarea::placeholder { color: var(--pv-text-faint); }
.pv-pmo-compose textarea:focus { outline: none; border-color: var(--pv-primary); }
.pv-pmo-compose-act {
  display: flex; justify-content: flex-end; align-items: center; gap: 10px; margin-top: 8px;
}
.pv-pmo-compose-hint { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }

/* 评论的「谁说的」：家里的人一排带头像，点一下选（用户 2026-09-03：直接选家庭成员、给头像，
   不再有「其他」）。发新评论、回复、就地编辑三处共用 <pv-pmo-who>。 */
.pv-pmo-compose-who {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 8px;
}
.pv-pmo-compose-who-lab {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint);
  white-space: nowrap; flex-shrink: 0; margin-right: 2px;
}
.pv-pmo-who { display: inline-flex; gap: 6px; flex-wrap: wrap; align-items: center; }
.pv-pmo-who-item {
  display: inline-flex; align-items: center; gap: 6px; padding: 2px 9px 2px 3px;
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-pill); background: var(--pv-surface);
  font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; flex-shrink: 0;
}
.pv-pmo-who-item:hover { border-color: var(--pv-primary); color: var(--pv-text); }
.pv-pmo-who-item.active { border-color: var(--pv-primary); background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
/* 头像：飞书那张；没绑身份就首字母色块（跟股票模拟「谁的账本」那排同一套） */
.pv-pmo-face {
  flex: none; width: 22px; height: 22px; border-radius: 50%; object-fit: cover; background: var(--pv-bg);
}
.pv-pmo-face.is-letter {
  display: inline-flex; align-items: center; justify-content: center;
  color: #fff; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600;
}
.pv-pmo-face.lg { width: 30px; height: 30px; }
/* 没头像的人（用户 2026-10-28 的偏好）：不要首字，画一个人形占位；底色还是各人的颜色（底色是模板里内联写的 background，
   所以人形画在 ::after 上，不然会被内联的 background 冲掉）。全站几种字母头像一起改 */
.pv-pmo-face.is-letter, .pv-snav-face.is-letter, .pv-stock-face.is-letter, .pv-ct-face:not(:has(img)), span.pv-avatar, .pv-bh-face:not(:has(img)) { position: relative; color: transparent !important; overflow: hidden; }
.pv-pmo-face.is-letter::after, .pv-snav-face.is-letter::after, .pv-stock-face.is-letter::after, .pv-ct-face:not(:has(img))::after, span.pv-avatar::after, .pv-bh-face:not(:has(img))::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='34' height='34' viewBox='-5.143 -4.543 34.286 34.286'><circle cx='12' cy='8' r='4.3' fill='white'/><path d='M3.2 21.5c0-4.6 3.9-7.4 8.8-7.4s8.8 2.8 8.8 7.4z' fill='white'/></svg>") center / 100% 100% no-repeat;   /* 留白画进 viewBox（人形占 70%，头顶到脚底的视觉中心对准圆心；原来压在 62% 处偏低，用户 2026-10-29 要往上），底图铺满整圈——不再靠 background-size / position 定位，手机上人形偏左偏下（用户 2026-10-29） */
}
.pv-pmo-face.lg.is-letter { font-size: calc(14px + var(--pv-fz-add2, 0px)); }

/* 动作一组（回复 / 标为提问 / 编辑 / 删除）靠右（用户 2026-09-03），颜色淡、不加粗，悬停才亮 */
.pv-pmo-log-acts { display: inline-flex; align-items: center; gap: 10px; margin-left: auto; }
.pv-pmo-log-acts .pv-task-op { margin-left: 2px; }
.pv-pmo-log-edited { color: var(--pv-text-faint); }
.pv-pmo-log-to { color: var(--pv-text-faint); }
/* 回复框顶上那句「回复 @谁」：跟左边「谁说的」那排胶囊同一个字号行高（用户 2026-09-28：原来没定字号，跟着正文走，比胶囊大一圈） */
.pv-pmo-compose-who .pv-pmo-log-to { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; white-space: nowrap; flex: none; }
/* 回复：挂在这一楼底下，缩进一档、头像小一号 */
.pv-pmo-log-reply { display: flex; align-items: flex-start; gap: 8px; margin: 10px 0 0; }
/* 楼中楼回复框 / 就地编辑框：跟顶上的编辑器同一套控件，只是收在那一楼底下 */
.pv-pmo-log-replybox { margin: 10px 0 4px; padding-left: 12px; border-left: 2px solid var(--pv-primary-soft); }
.pv-pmo-log-editbox { margin: 4px 0 6px; }
@media (max-width: 640px) {
  /* 手机：动作那组换到下一行，别把名字和时间挤成竖排 */
  .pv-pmo-log-acts { flex: 1 1 100%; margin-left: 0; justify-content: flex-end; }
}

/* 对话式评论（照小红书 / B 站）：左边头像，右边一栏。一楼一条，楼与楼之间一道细线。 */
.pv-pmo-log {
  display: flex; align-items: flex-start; gap: 10px;
  border-top: 1px solid var(--pv-border); margin-top: 10px; padding: 12px 0 2px;
}
.pv-pmo-log-main { flex: 1; min-width: 0; }
/* 第一行：名字（正常字重、深一点）· 时间（淡）· 已编辑 · 提问记号；动作靠右，都不加粗 */
/* 元信息一行统一（用户 2026-09-11）：名字、时间、周几、已编辑、回复 @谁 全部 12px / 18px 行高 / 浅灰，
   一行的高度跟左边头像一样高、竖直居中 —— 原来名字 12.5px 深色、周几小签 11px/16px，三样各飘各的 */
.pv-pmo-log-meta {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin: 0 0 2px; min-height: 30px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 400; color: var(--pv-text-faint);
}
.pv-pmo-log-reply .pv-pmo-log-meta { min-height: 22px; }
.pv-pmo-log-author { color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 500; }
.pv-pmo-log-when { font-variant-numeric: tabular-nums; }
/* 时间后面那枚「周几」小签（用户 2026-09-08） */
.pv-pmo-log-wd { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 5px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint); white-space: nowrap; }
.pv-pmo-log-act {
  font-weight: 400; color: var(--pv-text-faint); cursor: pointer;
  white-space: nowrap; flex-shrink: 0;
}
.pv-pmo-log-act:hover { color: var(--pv-primary-dark); }

/* ---- 提问三态（照 legalsnap 留言区，见 Little Jelly pref-comment-question-flow）----
   红条「？提问」＝没人答；黄条「✓ 待确认」＝有别人回复了、等提问者点头；灰条「已解答」＝确认过了。
   标志占住右侧那片留白、与整条评论等高，长讨论里一眼扫得到；点它本身就是动作。
   黄条用深色字不用白字 —— 黄底配白字对比度不够，配墨色反而像经典的「待处理」标签。 */
/* 带底色的那几条左边留 10（用户 2026-10-02：头像原来贴着底色的左边）；整条圆角、不再只圆右边 */
.pv-pmo-log.question { position: relative; padding: 12px 72px 8px 10px; background: #FDF3F1; border-radius: 8px; }
.pv-pmo-log.question.q-pending { background: #FDF6E4; }
.pv-pmo-log.question.q-done { background: #EEF7F0; }   /* 已完成：浅绿底 + 右边绿条（用户 2026-10-02：原来是灰的） */
.pv-pmo-qflag {
  position: absolute; top: 0; right: 0; bottom: 0; width: 56px;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  background: var(--pv-danger); color: #fff; cursor: pointer; user-select: none;
  border-radius: 0 8px 8px 0; transition: background .12s;
}
.pv-pmo-qflag:hover { background: var(--pv-danger-text); }
.pv-pmo-qflag.pending { background: #EDB92E; color: var(--pv-text); }
.pv-pmo-qflag.pending:hover { background: #DCA918; }
.pv-pmo-qflag.done { background: #2E7D46; color: #fff; }
.pv-pmo-qflag.done:hover { background: #256A3A; }
.pv-pmo-qflag .q-mark { font: 700 22px/1 ui-monospace, SFMono-Regular, Menlo, monospace; }
.pv-pmo-qflag .q-text {
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); letter-spacing: .22em; writing-mode: vertical-rl; text-orientation: upright;   /* 竖排，窄条里也放得下 */
}
/* 回复也能标为待办（用户 2026-09-28）：跟顶楼同一套底色和右边那条，条窄一点；
   往左探出 8px，头像和上下几条回复还在一条线上。最矮 74：竖排的「待确认」三个字要放得下 */
.pv-pmo-log-reply.question { position: relative; min-height: 74px; margin-left: -8px; padding: 6px 56px 6px 8px; background: #FDF3F1; border-radius: 0 8px 8px 0; }
.pv-pmo-log-reply.question.q-pending { background: #FDF6E4; }
.pv-pmo-log-reply.question.q-done { background: #EEF7F0; }
.pv-pmo-log.question.q-done .pv-pmo-log-reply.question.q-done { background: var(--pv-surface); }   /* 顶楼也是绿底的时候，回复换成白底才分得出来 */
.pv-pmo-log-reply .pv-pmo-qflag { width: 46px; }
/* 提问底下那行小字：等谁答 / 已有回复等你确认。黄条同色系的深色，小字在浅底上读得清 */
.pv-pmo-q-info, .pv-pmo-q-answered { margin: 2px 0 4px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-pmo-q-answered { color: #8A6608; }
.pv-pmo-q-info a, .pv-pmo-q-answered a { margin-left: 6px; text-decoration: underline; cursor: pointer; color: inherit; }
.pv-pmo-q-info a:hover, .pv-pmo-q-answered a:hover { color: var(--pv-text); }
@media (max-width: 640px) { .pv-pmo-log.question { padding-right: 60px; } .pv-pmo-qflag { width: 46px; } }
/* 顶楼带底色时，底下那条分隔线跟底色挤在一起难看：拿掉，靠底色分 */
.pv-pmo-log.question { border-top-color: transparent; }
/* 提问弹窗顶上那段引文：浅底、左边一道色条，让人看清是在给哪条评论指人 */
.pv-pmo-q-quote {
  padding: 8px 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.55; color: var(--pv-text-soft);
  background: var(--pv-bg); border-left: 3px solid var(--pv-cat-11); border-radius: 0 6px 6px 0;
  max-height: 140px; overflow: auto;
}
/* 正文按 Markdown 渲染（走全站的 .pv-md），不再 pre-wrap：换行/列表/粗体由 Markdown 管 */
.pv-pmo-log-body { margin: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.55; color: var(--pv-text); }
.pv-pmo-log-body.pv-md p { margin: 2px 0; }
.pv-pmo-log-body.pv-md ul, .pv-pmo-log-body.pv-md ol { margin: 2px 0; padding-left: 20px; }
.pv-pmo-log-body.pv-md > :first-child { margin-top: 0; }
.pv-pmo-log-body.pv-md > :last-child { margin-bottom: 0; }
.pv-pmo-link { padding: 5px 0; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-pmo-link a { color: var(--pv-primary-dark); }
/* 飞书文档板块（用户 2026-09-08）：图标照飞书云文档那套彩色圆角方块，方块里是 icon font；
   整行是链接，悬停浅底、右侧露出改 / 移除。不套框：已经在板块里了。 */
.pv-doc-list { display: flex; flex-direction: column; gap: 2px; margin: 0 -8px; }
.pv-doc-row { display: flex; align-items: center; gap: 4px; min-width: 0; }
.pv-doc {
  flex: 1; min-width: 0; display: flex; align-items: flex-start; gap: 10px;
  padding: 7px 8px; border-radius: 8px; color: var(--pv-text); text-decoration: none;
}
/* 标题一行、底下把完整链接放下来，最多 3 行（用户 2026-09-21：右边那个类型标签看不懂，链接才是要看的） */
.pv-doc-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.pv-doc-url {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.45; color: var(--pv-text-faint);
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; word-break: break-all;
}
.pv-doc:hover .pv-doc-url { color: var(--pv-text-soft); }
.pv-doc-n { margin-left: 8px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-doc-row .pv-doc-acts { align-self: flex-start; margin-top: 6px; }
/* 两行的那种（周期任务 / 提醒，用户 2026-09-28）：名字一行写全、长了就折行不截断；底下一行小字，几样东西同一个字号行高、
   放不下就整样掉到下一行。圆圈和图标跟**第一行名字**对齐，不跟整块居中——名字折成两行时它们不会掉到中间去 */
.pv-doc-row.two { align-items: flex-start; }
.pv-doc-row.two .pv-tc-check { margin-top: 8px; }
.pv-doc-row.two .pv-doc { align-items: flex-start; }
.pv-doc-row.two .pv-doc-ico { margin-top: -1px; }
.pv-doc-row.two .pv-doc-name { white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: anywhere; line-height: 22px; }
.pv-doc-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0 12px; min-width: 0; }
.pv-doc-meta .pv-doc-kind, .pv-doc-meta .pv-doc-due { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; }
/* 「已结束」那一折里的：图标淡一档，名字划掉（.pv-doc-row.done .pv-doc-name 已经管了） */
.pv-doc-row.two.done .pv-doc-ico { opacity: .45; }
.pv-topics-done-body.pv-doc-list { margin: 4px 0 0; }
.pv-doc:hover { background: var(--pv-bg); color: var(--pv-primary-dark); }
.pv-doc-ico {
  width: 24px; height: 24px; border-radius: 6px; flex: none;
  display: inline-flex; align-items: center; justify-content: center; color: #fff; font-size: calc(14px + var(--pv-fz-add2, 0px));
}
.pv-doc-ico.k-docx { background: #3370FF; }
.pv-doc-ico.k-wiki { background: #14C0FF; }
.pv-doc-ico.k-sheet { background: #34C724; }
.pv-doc-ico.k-base { background: #7F3BF5; }
.pv-doc-ico.k-mind { background: #FFC60A; }
.pv-doc-ico.k-slide { background: #FF8800; }
.pv-doc-ico.k-minutes { background: #F54A45; }
.pv-doc-ico.k-file { background: #8F959E; }
.pv-doc-ico.k-web { background: #E6F1FB; color: #1F5FA8; }   /* 认不出是哪家的普通网址：浅蓝底（用户 2026-10-05：原来的灰底不好看） */
/* 文档链接（用户 2026-09-21）：飞书之外的图标色 + 文件夹分组 */
.pv-doc-ico.k-folder { background: #E8A33C; }
/* 上传的附件（用户 2026-10-02）：跟文档链接同一行式，图标方块用自己一档的灰青，一看就是传上来的文件不是链接 */
.pv-doc-ico.k-att { background: var(--pv-cat-12); }
.pv-doc-att .pv-doc { cursor: pointer; }
/* 附件那几行跟上面的链接列表一样往外挪 8，图标才在同一条线上 */
.pv-pmo-sec .pv-att.is-doc .pv-att-drop { margin: 2px -8px 0; display: flex; flex-direction: column; gap: 2px; }
.pv-doc-att .pv-doc-url { -webkit-line-clamp: 2; }
.pv-doc-ico.k-gdoc { background: #4285F4; }
.pv-doc-ico.k-gsheet { background: #0F9D58; }
.pv-doc-ico.k-gslide { background: #F4B400; }
.pv-doc-ico.k-gdrive { background: #34A853; }
.pv-doc-ico.k-notion { background: #191b23; }
.pv-doc-ico.k-github { background: #24292e; }
.pv-doc-ico.k-dropbox { background: #0061FF; }
.pv-doc-ico.k-onedrive { background: #0078D4; }
.pv-doc-ico.k-figma { background: #A259FF; }
.pv-doc-row.pv-doc-folder { margin-top: 6px; }
.pv-doc-row.pv-doc-folder .pv-doc-name { font-weight: 600; }
.pv-doc-row.in-folder { margin-left: 26px; }
.pv-doc-form { flex-wrap: wrap; }
.pv-doc-form .pv-doc-kindseg { flex: none; }
.pv-doc-form .pv-doc-kindseg button { height: 30px; padding: 0 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-doc-form .el-select.f { flex: 1 1 0; min-width: 120px; }
.pv-doc-form .el-select--mini .el-input__inner { height: 30px; line-height: 30px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-doc-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.5; }
.pv-doc-kind { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); flex: none; white-space: nowrap; }
.pv-doc-acts { display: flex; gap: 2px; flex: none; opacity: 0; transition: opacity .12s; }
.pv-doc-row:hover .pv-doc-acts { opacity: 1; }
/* 一行放完：两个输入框按比例分宽度，按钮不缩；字号 / 高度对齐评论区那排 mini 控件 */
.pv-doc-form { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.pv-doc-form .el-input.u { flex: 3 1 0; min-width: 0; }
.pv-doc-form .el-input.n { flex: 2 1 0; min-width: 0; }
.pv-doc-form .el-button { flex: none; margin-left: 0; }
.pv-doc-form .el-input--mini .el-input__inner { height: 30px; line-height: 30px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
@media (max-width: 640px) { .pv-doc-form { flex-wrap: wrap; } .pv-doc-form .el-input.u { flex-basis: 100%; } }
/* 加文档抽屉里的「上传文件」（用户 2026-09-28）：一块虚线框，拖进来或者点按钮选 */
.pv-doc-drop { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; min-height: 120px; padding: 16px;
               border: 1.5px dashed var(--pv-border); border-radius: var(--pv-radius-btn); color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-drawer .pv-ct-type i { margin-right: 3px; }
/* 文档链接板块里上传的文件那一段：跟上面的链接列表接着排，不另起一个框、空着不占高度 */
.pv-pmo-sec .pv-att .pv-att-drop { min-height: 0; }
.pv-doc-bulk { margin-top: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-doc-bulk a { color: var(--pv-text-faint); cursor: pointer; }
.pv-doc-bulk a:hover { color: var(--pv-primary-dark); }
@media (max-width: 640px) { .pv-doc-acts { opacity: 1; } .pv-doc-kind { display: none; } }

.pv-proj-colors { display: flex; gap: 6px; flex-wrap: wrap; }
.pv-proj-color {
  width: 22px; height: 22px; border-radius: 50%; border: 2px solid transparent; cursor: pointer;
}
.pv-proj-color.on { border-color: var(--pv-text); }

/* ============================================================
   当前家庭按钮（侧栏顶部，品牌和导航之间）
   ============================================================ */
/* 做成搪瓷门牌的样子：实色底 + 内嵌一圈白细线 + 两枚螺丝点。
   这三样是门牌之所以是门牌的全部，而且都是**平的** —— 不用渐变不用阴影，
   跟站里其余部分是同一种质感。 */
.pv-household {
  position: relative; display: block; width: 100%; text-align: center; cursor: pointer;
  margin: 4px 0 14px; padding: 9px 14px 10px;
  /* 一点点渐变：从上到下深一档。幅度压得很小（三档之间只差几度明度），
     读起来像搪瓷面上的一层光，而不是个立体按钮 —— 后者正是之前明确不要的。 */
  background: linear-gradient(168deg, var(--pv-plate-1) 0%, var(--pv-plate-2) 55%, var(--pv-plate-3) 100%);
  border: none; border-radius: 8px; font-family: inherit;
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .38);   /* 内嵌那圈白线 */
  transition: background .14s;
}
.pv-household:hover { background: linear-gradient(168deg, var(--pv-plate-h1) 0%, var(--pv-plate-h2) 55%, var(--pv-plate-h3) 100%); }
/* 两枚螺丝：门牌是拧在墙上的，这两个点是它最像门牌的地方 */
.pv-household::before, .pv-household::after {
  content: ""; position: absolute; top: 7px; width: 3px; height: 3px;
  border-radius: 50%; background: rgba(255, 255, 255, .42);
}
.pv-household::before { left: 7px; }
.pv-household::after { right: 7px; }
.pv-household-label {
  display: block; font-size: calc(9.5px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .18em;
  color: rgba(255, 255, 255, .72); line-height: 1.4;
  margin-bottom: 3px;                  /* 跟下面的名字拉开 */
}
.pv-household-name {
  display: block; font-size: 16px; font-weight: 700; color: #fff; line-height: 1.3;
  letter-spacing: .02em;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ============================================================
   下拉菜单：去掉那个小三角，字大一点，底色跟白页面分开
   ============================================================ */
/* 三角是十几年前"气泡对话框"的遗留装饰，现在只是噪音。
   页面本身就是白的，纯白菜单浮在上面看不出边界 —— 换成浅灰底 + 更实的阴影。 */
.el-dropdown-menu.el-popper .popper__arrow,
.el-dropdown-menu.el-popper .popper__arrow::after { display: none !important; }
.el-dropdown-menu.el-popper { margin-top: 6px; margin-bottom: 6px; }
/* 宽度和位置都跟着侧栏走：比侧栏窄一圈，并且在侧栏里左右居中。
   原来是写死的 min-width: 210px —— 比侧栏的内容区（222 − 14×2 = 194）还宽，
   弹出来会往右探出去一截，看着像挂歪了。
   居中量 = (侧栏宽 − 菜单宽) / 2 − 左内边距：触发器的左边缘在内边距那儿，
   要让菜单在**整条侧栏**里居中，得再往右推这一点。 */
.pv-side-settings-menu.el-dropdown-menu {
  --pv-menu-w: calc(var(--pv-side-w, 222px) - var(--pv-side-pad, 14px) * 2 - 14px);
  background: var(--pv-bg);
  border: 1px solid var(--pv-border);
  border-radius: var(--pv-radius);
  box-shadow: 0 12px 32px rgba(15, 23, 42, .18);
  padding: 6px;
  width: var(--pv-menu-w); min-width: 0; box-sizing: border-box;
  margin-left: calc((var(--pv-side-w, 222px) - var(--pv-menu-w)) / 2
                    - var(--pv-side-pad, 14px));
}
/* 手机上侧栏是 78vw，那套算式跟着变量走也成立；只兜一个上限免得太宽 */
@media (max-width: 640px) {
  .pv-side-settings-menu.el-dropdown-menu { max-width: 260px; }
}
.pv-side-settings-menu .el-dropdown-menu__item {
  font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1.5; padding: 9px 13px;
  border-radius: var(--pv-radius-sm); color: var(--pv-text);
}
.pv-side-settings-menu .el-dropdown-menu__item:hover { background: var(--pv-surface); color: var(--pv-text); }
/* 分隔线原来是这一项的 border-top。可这一项有圆角，border 会跟着圆角在两端弯下去 ——
   看着像一条两头翘的弧线，而不是一条分隔线。改成绝对定位的一条直线，
   左右各探出 6px（菜单的内边距）铺满整宽。 */
.pv-side-settings-menu .el-dropdown-menu__item--divided {
  border-top: none; margin-top: 7px; position: relative;
}
.pv-side-settings-menu .el-dropdown-menu__item--divided::before { display: none; }
.pv-side-settings-menu .el-dropdown-menu__item--divided::after {
  content: ''; position: absolute; left: -6px; right: -6px; top: -4px;
  height: 1px; background: var(--pv-border);
}

/* ============================================================
   家庭管理后台
   ============================================================ */
/* 一行就是一行，不套卡片 —— 一个框里再画一个输入框，外面那层什么也没多说 */
/* 家庭名称的输入框。宽度不占满整行 —— 一个只装四五个字的框拉到全宽，
   看着像要你写一段话。没有保存按钮：离开输入框或按回车就存（见 saveHouse）。 */
.pv-adm-name-input { width: 280px; max-width: 100%; }
/* 字号跟下面那张用户表对齐（14px）。全站 .el-input__inner 是 15px，
   紧挨着一张 14px 的表格时，就这一个框的字明显大一号。 */
.pv-adm-name-input .el-input__inner {
  font-size: calc(14px + var(--pv-fz-add2, 0px));
  /* line-height 交回给浏览器：外面那条统一规矩把它撑成了 38px（＝控件高度），
     那是给"一排控件对齐"用的，可 <input> 本来就会把文字在内容盒里垂直居中，
     再压一个跟高度等大的行高反而把它顶偏。高度照旧由 height 管，对齐不受影响。 */
  line-height: normal;
}

/* 整页不滚，**只有右边内容区滚** —— 跟项目管理同一套（.pv-work）。
   原来是整页滚、左栏 sticky 钉住：滚的时候顶栏「⚙️ 家庭管理后台」和那条横线
   一起往上跑，左栏却站着不动，两种行为混在一屏里，读起来很别扭。
   现在顶栏和左栏都固定，内容从横线底下流过去。 */
.pv-page.pv-adm {
  display: flex; flex-direction: column;
  height: calc(100dvh - var(--pv-topbar-h, 0px));
  padding-top: 16px; padding-bottom: 0; overflow: hidden;
}
.pv-adm-layout {
  display: grid; grid-template-columns: 168px minmax(0, 1fr); gap: 16px;
  flex: 1; min-height: 0;          /* 不给 0 的话 grid 子项会撑破容器，滚动条落到整页上 */
}
@media (max-width: 860px) {
  .pv-adm-layout { grid-template-columns: 1fr; }
  /* 手机上不玩双滚动区：一根手指分不清自己在滚哪一块，页面整体滚更顺手 */
  .pv-page.pv-adm { height: auto; overflow: visible; padding-bottom: 40px; }
  .pv-adm-main, .pv-adm-nav { overflow: visible; max-height: none; }
}

/* 照搬项目管理那套：左边一列导航**钉住不动**，只有右边跟着滚。
   竖线也去掉了 —— 分栏靠的是两边各自的留白，不是画一条线。
   加了线之后，滚动时右边内容从线旁边流过去，那条线反而更显眼。 */
.pv-adm-nav {
  /* 不再用 sticky：外面那层已经是固定高度的 flex，左栏自己滚就行 —— 
     sticky 是"页面在滚、我钉住"，这里页面根本不滚，语义对不上 */
  min-height: 0; overflow-y: auto;
  display: flex; flex-direction: column; gap: var(--pv-nav-gap);
  padding: 2px 14px 2px 0; border-right: none;
}
@media (max-width: 860px) {
  /* 窄屏排成一行小片，而不是让它占掉半屏高度。竖线换成横线。 */
  .pv-adm-nav {
    position: static; flex-direction: row; flex-wrap: wrap;
    max-height: none; overflow: visible;
    border-bottom: 1px solid var(--pv-border);
    padding: 0 0 10px;
  }
  .pv-adm-main { padding-left: 0; }
}
.pv-adm-nav-btn {
  display: flex; align-items: center; gap: 7px; width: 100%; min-width: 0; text-align: left;
  border: none; background: none; color: var(--pv-text-soft); font: inherit;
  /* 不加粗：这是一列导航，站内别处的导航都没加粗，就它一处重出来 */
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 400; padding: 8px 10px;
  border-radius: var(--pv-radius-sm); cursor: pointer; white-space: nowrap; overflow: hidden;
}
/* 名字太长截成「…」：裸文本在 flex 里做不了 ellipsis，名字包在这一层里 */
.pv-adm-nav-name { min-width: 0; flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 860px) { .pv-adm-nav-btn { width: auto; } }
.pv-adm-nav-btn:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-adm-nav-btn.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-adm-nav-ico { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1; flex-shrink: 0; }

/* 内容区不套框。滚的是它 —— 准确说是整页在滚，而左边那列 sticky 钉着不动，
   看起来就是"只有右边在滚"。不给它自己开一个滚动容器：套娃滚动条
   （页面一条、容器一条）是这类三栏界面最常见的手滑。 */
/* 内容区自己滚。底部留白给足，最后一行不至于贴着视口边 */
.pv-adm-main { padding: 2px 0 48px 8px; min-width: 0; min-height: 0; overflow-y: auto; }
/* 左栏的二级：选中那一格底下缩进展开。一级二级同在一列，才看得出谁属于谁 ——
   摆到右边去做成一排按钮的话，它跟左栏那一级之间没有任何视觉关联。
   字号比一级小一档、不带图标：它是"里面的一层"，不该跟一级抢。 */
.pv-adm-nav-sub {
  display: block; width: 100%; text-align: left; border: none; background: none;
  font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  padding: 6px 9px 6px 30px; border-radius: 7px; cursor: pointer;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; position: relative;
}
/* 缩进那一段里画一条竖线，把这几条二级串成一束挂在上面那格底下 */
.pv-adm-nav-sub::before {
  content: ""; position: absolute; left: 17px; top: 0; bottom: 0;
  border-left: 2px solid var(--pv-border);
}
.pv-adm-nav-sub:hover { background: var(--pv-bg); color: var(--pv-text); }
/* 选中只换颜色、**不加粗**：加粗会让这一条比旁边的宽出一点，整列跟着晃。
   左边那道线加粗到 3px —— 选中态靠它认，比靠字重稳。 */
.pv-adm-nav-sub.active { color: var(--pv-primary-dark); }
.pv-adm-nav-sub.active::before { border-left-width: 3px; border-left-color: var(--pv-primary); }
/* 展开二级时，上面那一格跟二级之间不留缝：它们是一体的 */
.pv-adm-nav-btn.has-subs { margin-bottom: 2px; }
/* 二级页签下面那行说明 + 右边的动作按钮。不再套一个 .pv-adm-head ——
   上面二级页签已经写着你在哪一格，再来一个大标题是同一句话说两次 */
/* 一页里的分节标题（家庭名称 / 用户管理）。不用 h3 + 横线那套 ——
   那是"一整格"的标题；这里是同一格里的第二块，轻一点就够。 */
.pv-adm-sec {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
  margin: 26px 0 10px; padding-top: 16px; border-top: 1px solid var(--pv-border);
}
/* 页面上的第一块：上面就是顶栏那条横线了，再画一条就是两条挨着 */
.pv-adm-sec.first { margin-top: 2px; padding-top: 0; border-top: none; }
.pv-adm-sec h4 { margin: 0; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); white-space: nowrap; }
.pv-adm-sec .pv-adm-sub { margin: 0; }
.pv-adm-head {
  display: flex; align-items: flex-start; gap: 12px; flex-wrap: wrap;
  padding-bottom: 11px; margin-bottom: 13px; border-bottom: 1px solid var(--pv-border);
}
.pv-adm-head h3 { margin: 0; font-size: 16px; font-weight: 700; color: var(--pv-text); }
/* 说明文字当副标题挂在标题下面，不再单独占一个框 */
.pv-adm-sub { margin: 4px 0 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.7; color: var(--pv-text-faint); max-width: 640px; }

/* 后台顶栏：标题 + 一条横线，跟项目管理同一套 */
.pv-adm-top {
  display: flex; align-items: center; gap: 14px;
  padding: 2px 0 13px; margin-bottom: 16px; border-bottom: 1px solid var(--pv-border);
}
.pv-adm-top h2 {
  margin: 0; font-family: var(--title-font); font-size: 21px; font-weight: 700;
  color: var(--pv-text); white-space: nowrap; flex-shrink: 0;
}

/* 导航项右边那枚计数。长在它数的那一项上，不再挂到页面标题旁边 ——
   隔着大半屏的两样东西，要读的人自己在心里连线。字比标签本身再小一号：
   它是补充，不该跟名字抢。 */
/* 导航项右边那枚计数。不加粗、比标签本身再小一号 —— 它是**标签**不是数字结论，
   加粗之后会跟左边的模块名抢，两个都想让你先读。 */
.pv-adm-nav-n {
  margin-left: auto; font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 400; line-height: 1.7;
  padding: 0 6px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-faint);
  white-space: nowrap; flex-shrink: 0;
}
.pv-adm-nav-btn.active .pv-adm-nav-n { background: #fff; color: var(--pv-primary-dark); }

/* 模块配置 */
/* 整体两栏、组内竖排。用多栏（column-count）而不是 grid：
   每组条目数不一样（顶级 2 个、我的 5 个），grid 会把它们对齐成方阵，
   短的下面留一大块白。多栏是"流"—— 排满一栏接着排下一栏，高度自己找平。 */
.pv-mod-wrap { column-count: 2; column-gap: 30px; }
@media (max-width: 820px) { .pv-mod-wrap { column-count: 1; } }
@media (min-width: 2000px) { .pv-mod-wrap { column-count: 3; } }
@media (min-width: 2900px) { .pv-mod-wrap { column-count: 4; } }
/* 一组不许被拆到两栏去：拆了的话标题在左栏底、条目在右栏顶，读起来是断的 */
.pv-mod-group { break-inside: avoid; -webkit-column-break-inside: avoid; margin: 0 0 18px; }
.pv-mod-group-head {
  display: flex; align-items: center; gap: 7px;
  padding-bottom: 7px; margin-bottom: 8px; border-bottom: 1px solid var(--pv-border);
}
.pv-mod-group-ico { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1; flex-shrink: 0; }
.pv-mod-group-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); white-space: nowrap; flex-shrink: 0; }
/* 一行一个。原来一行塞四个，「我的」那五项就被切成 4+1 两排，
   而组和组之间反倒看不出界线了。 */
.pv-mod-rows { display: block; }
.pv-mod-row {
  display: flex; align-items: center; gap: 9px; min-height: 34px;
  padding: 0 8px; border-radius: var(--pv-radius-sm); cursor: pointer;
}
.pv-mod-row:hover { background: var(--pv-bg); }
.pv-mod-row-ico { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1; flex-shrink: 0; }
.pv-mod-row-name { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); min-width: 0;
                   overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 关掉的那些淡下去，但**不删掉** —— 要能一眼看出"这儿还有个东西，只是收起来了" */
.pv-mod-row.off .pv-mod-row-name, .pv-mod-row.off .pv-mod-row-ico { opacity: .45; }
/* 分组可配（用户 2026-10-28）：组名旁的小工具（改名 / 上下 / 删）和行尾的「⋯」悬停才出，手机上一直在 */
.pv-mod-group-tools { display: inline-flex; align-items: center; gap: 2px; margin-left: 2px; opacity: 0; transition: opacity .12s; }
.pv-mod-group:hover .pv-mod-group-tools, .pv-mod-group-tools:focus-within { opacity: 1; }
.pv-mod-tool { width: 24px; height: 24px; padding: 0; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); font-size: 13px; line-height: 1;
               display: inline-flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; }
.pv-mod-tool:hover:not(:disabled) { background: var(--pv-bg); color: var(--pv-text); }
.pv-mod-tool.danger:hover:not(:disabled) { color: var(--pv-danger); }
.pv-mod-tool:disabled { opacity: .3; cursor: default; }
.pv-mod-row-mv { margin-left: auto; opacity: 0; transition: opacity .12s; }
.pv-mod-row:hover .pv-mod-row-mv, .pv-mod-row-mv:focus-within { opacity: 1; }
.pv-mod-row-empty { padding: 6px 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (hover: none) { .pv-mod-group-tools, .pv-mod-row-mv { opacity: 1; } }
/* 拖拽（用户 2026-10-29）：行能在组内、组间拖，组抓着组名那行拖；拖着的那条淡下去，落点画一道主色线 */
.pv-mod-row[draggable="true"], .pv-mod-group-head[draggable="true"] { cursor: grab; user-select: none; -webkit-user-select: none; }
.pv-mod-row.dragging, .pv-mod-group.dragging > .pv-mod-group-head { opacity: .35; }
.pv-mod-row.drop-before, .pv-mod-row.drop-after { position: relative; }
.pv-mod-row.drop-before::after, .pv-mod-row.drop-after::after { content: ""; position: absolute; left: 8px; right: 8px; height: 2px; background: var(--pv-primary); border-radius: 0; pointer-events: none; }   /* 平线，不跟圆角弯 */
.pv-mod-row.drop-before::after { top: -1px; }
.pv-mod-row.drop-after::after { bottom: -1px; }
.pv-mod-rows.drop-in { outline: 2px dashed var(--pv-primary); outline-offset: 2px; border-radius: var(--pv-radius-sm); }
.pv-mod-group.drop-before > .pv-mod-group-head { box-shadow: 0 -2px 0 0 var(--pv-primary); }
.pv-mod-group.drop-after { box-shadow: 0 2px 0 0 var(--pv-primary); }

/* ============================================================
   应用式工作区 .pv-work —— 顶栏钉住 + 只有内容区滚（Gmail / Slack 那一套）
   ============================================================
   ⚠️ 这个类**不能**叫 .pv-shell —— 那个名字已经被 App 的根布局占了
   （.pv-shell { display:flex } 就是"侧栏 | 主区"那一横排）。第一版就撞了名：
   后加的规则把 flex-direction 改成 column，整个应用竖了过来 —— 侧栏压在上面、
   主区被顶出视口，表现是"每一页右边都空白"，而且没有任何报错。
   加顶层类名之前先 grep 一遍。

   跟普通页面（.pv-page，整页跟着视口滚）的区别只有一条：
   **谁在滚**。这里滚的是中间那块，顶栏和两侧边栏是页面骨架的一部分，永远在原位。

   为什么值得单独做一套：一旦页面左右有边栏，整页滚就会出现"边栏跟着走"的
   怪相 —— 要么全都不动（那就没法看长内容），要么各滚各的（三样东西同时在动，
   眼睛不知道该跟哪个）。钉死骨架、只滚内容，是这类三栏界面唯一自洽的解。

   高度：视口减掉「当前重点」那条（--pv-topbar-h 是实测值，收起时会变小，
   focus-bar 切换后会 dispatch resize 让依赖它的地方重算）。 */
.pv-work {
  display: flex; flex-direction: column;
  /* 高度由 JS 按自身在视口里的位置实算（fitHeight）。
     这里原来写 calc(100dvh - var(--pv-topbar-h))：那个变量是"当前重点"那条的实测高度，
     可它会因为里面的字换行而变，读到的常常是上一拍的值 —— 差了 8px，底部就戳出视口。
     下面这行只是 JS 还没跑到时的兜底。 */
  height: calc(100dvh - var(--pv-topbar-h, 0px));
  max-width: var(--pv-page-max); margin: 0 auto;
  padding: 0 var(--pv-page-pad);
}
/* 顶栏：标题 + 搜索 + 动作，底下一条横线把它和内容分开 */
.pv-work-top {
  flex: none; display: flex; align-items: center; gap: 14px;
  padding: 16px 0 14px; border-bottom: 1px solid var(--pv-border);
}
.pv-work-top h2 {
  margin: 0; font-family: var(--title-font); font-size: 21px; font-weight: 700;
  color: var(--pv-text); white-space: nowrap; flex-shrink: 0;
}
/* 搜索占中间那一大片。Gmail 那条搜索栏之所以好用，一半原因是它够大够居中 —— 
   不用找，眼睛落下去就在那儿。 */
/* 紧跟在标题右边，不居中。居中看着"很正"，但眼睛要先扫过一段空白才找到它；
   而且标题和搜索本来就是一组（"在项目管理里搜"），中间隔一片白就断开了。 */
.pv-work-search {
  flex: 0 1 420px; min-width: 0; margin: 0 auto 0 20px;   /* 离左边标题 20px（用户 2026-09-13） */
  display: flex; align-items: center; gap: 8px;
  height: 34px; padding: 0 14px; cursor: pointer;   /* 38 → 34（用户 2026-09-07：稍微矮一点） */
  background: var(--pv-bg); border: 1px solid transparent;
  border-radius: var(--pv-radius-pill); color: var(--pv-text-faint); font-size: calc(14px + var(--pv-fz-add2, 0px));
  transition: background .12s, border-color .12s, box-shadow .12s;
}
.pv-work-search:hover, .pv-work-search:focus-visible {
  background: var(--pv-surface); border-color: var(--pv-border); box-shadow: var(--pv-shadow-sm);
}
.pv-work-search-ph { flex: 1; min-width: 0; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-work-search kbd {
  font-family: inherit; font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 2px 6px; border-radius: 5px;
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
}
.pv-work-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
/* 放大镜：Element 字体图标（el-icon-search），跟文字一个颜色、比 emoji 小一号 */
.pv-work-search-ico { flex: none; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text-faint); line-height: 1; }
/* 真输入框版（主人手记）：外壳跟项目管理那颗一模一样，里面是 input 不是按钮 */
.pv-work-search.is-input { cursor: text; }
.pv-work-search.is-input:focus-within {
  background: var(--pv-surface); border-color: var(--pv-border); box-shadow: var(--pv-shadow-sm);
}
.pv-work-search-inp {
  flex: 1; min-width: 0; border: none; background: none; outline: none; padding: 0;
  font: inherit; font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text);
}
.pv-work-search-inp::placeholder { color: var(--pv-text-faint); }
.pv-work-search-x {
  flex: none; border: none; background: none; padding: 0 2px; cursor: pointer;
  color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1;
}
.pv-work-search-x:hover { color: var(--pv-text); }
/* 装工作区骨架的 .pv-page：底部留白不要（工作区自己算到视口底） */
.pv-page-work { padding-top: 0; padding-bottom: 0; }   /* 顶上的 16px 由 .pv-work-top 自己带，标题跟项目管理页落在同一条线上（用户 2026-10-29） */
/* 主人手记的工作区主体：左栏（分类树）钉住，右边时间轴自己滚 —— 骨架照项目管理 .pv-work */
.pv-work-body.pv-diary-body { display: flex; align-items: stretch; min-height: 0; padding: 14px 0 0; }   /* 最左边那条本子栏 + 右边内容并排（用户 2026-09-23） */
.pv-diary-body > .pv-diary-gt, .pv-diary-body > .pv-work-scroll { flex: 1; min-width: 0; }
@media (max-width: 760px) { .pv-work-body.pv-diary-body { display: block; } }
.pv-diary-body > .pv-work-scroll { height: 100%; }
.pv-diary-body .pv-diary-gt, .pv-diary-body .pv-gt-layout { height: 100%; min-height: 0; }
.pv-diary-body .pv-gt-layout { align-items: stretch; }
/* 分类树在右边（用户 2026-09-28）：DOM 顺序不动（成长记录那几页还是左栏），只在日记本里用 order 翻过去 */
.pv-diary-body .pv-gt-layout.has-side { grid-template-columns: minmax(0, 1fr) 212px; }
.pv-diary-body .pv-gt-side { order: 2; border-right: 0; border-left: 1px solid var(--pv-border); padding: 0 0 14px var(--pv-page-pad); }
.pv-diary-body .pv-gt-main { order: 1; }
/* Team Culture 那一块要醒目（用户 2026-09-28：加底色、加样式，让它更突出）：
   整块铺主色浅底、左边一道主色边（有色边的那两个角不做圆角）；标题加粗上主色；
   每条前面一个色点，颜色跟卡片上那条 Team Culture 小签是同一个（c1…c6 / na）；选中的那条翻成白底 */
.pv-diary-body .pv-gt-cult { flex: none; margin-bottom: 16px; padding: 12px 8px 10px 9px; gap: 2px;
                             background: var(--pv-primary-soft); border-left: 3px solid var(--pv-primary); border-radius: 0 12px 12px 0; }
.pv-diary-body .pv-gt-cult > .pv-snav-title { padding: 0 8px; margin-bottom: 6px; font-weight: 700; letter-spacing: .06em; color: var(--pv-primary); }
.pv-diary-body .pv-gt-cult .pv-snav-item { --c: var(--pv-text-faint); padding: 6px 10px 6px 8px; gap: 9px; color: var(--pv-text); border-radius: 8px; }
.pv-diary-body .pv-gt-cult .pv-snav-item::before { content: ''; position: static; flex: none; width: 8px; height: 8px; border: 0; border-radius: 50%; background: var(--c); }
.pv-diary-body .pv-gt-cult .pv-snav-item.cu-c1 { --c: var(--pv-cat-1); } .pv-diary-body .pv-gt-cult .pv-snav-item.cu-c2 { --c: var(--pv-cat-2); }
.pv-diary-body .pv-gt-cult .pv-snav-item.cu-c3 { --c: var(--pv-cat-3); } .pv-diary-body .pv-gt-cult .pv-snav-item.cu-c4 { --c: var(--pv-cat-4); }
.pv-diary-body .pv-gt-cult .pv-snav-item.cu-c5 { --c: var(--pv-cat-5); } .pv-diary-body .pv-gt-cult .pv-snav-item.cu-c6 { --c: var(--pv-cat-7); }
.pv-diary-body .pv-gt-cult .pv-snav-item:hover { background: rgba(255, 255, 255, .6); }
.pv-diary-body .pv-gt-cult .pv-snav-item.active { background: var(--pv-surface); color: var(--pv-primary); font-weight: 600; box-shadow: 0 1px 2px rgba(0, 34, 68, .1); }
.pv-diary-body .pv-gt-cult .pv-snav-item.active .pv-snav-n { opacity: 1; }
@media (max-width: 860px) {
  /* 手机：分类躺平成一排可横滚的叶子小片，排在内容上面。
     格子写 minmax(0, 1fr) 而不是 1fr：1fr 的下限是内容宽度，一排不换行的小片会把整页撑到九百像素宽（原来就有这个毛病）。
     三个类名是为了压过底下那条「手机上 overflow: visible」；树那条 display:none 原来被后面的 .pv-snav 盖掉了，这里补上 */
  .pv-diary-body .pv-gt-layout.has-side { grid-template-columns: minmax(0, 1fr); }
  .pv-diary-body .pv-gt-layout .pv-gt-side { order: 0; border-left: 0; padding: 0 0 8px; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; }
  .pv-diary-body .pv-gt-layout .pv-gt-side::-webkit-scrollbar { display: none; }
  .pv-diary-body .pv-gt-tree, .pv-diary-body .pv-gt-side-empty { display: none; }
  .pv-diary-body .pv-gt-cult { display: none; }   /* 手机上只留分类那排小片，Team Culture 看卡片上的小签 */
  .pv-diary-body .pv-snav-title { display: none; }   /* 「模块」两个字在一排小片里会被挤成竖排 */
}
.pv-diary-body .pv-gt-side { position: static; max-height: none; min-height: 0; overflow-y: auto; }
.pv-diary-body .pv-gt-main { min-height: 0; overflow-y: auto; padding: 0 10px 24px 0; }
.pv-diary-body .pv-gt-main::-webkit-scrollbar { width: 10px; }
.pv-diary-body .pv-gt-main::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
@media (max-width: 860px) {
  /* 手机：整页滚，别套娃滚动条 */
  .pv-diary-body .pv-diary-gt, .pv-diary-body .pv-gt-layout { height: auto; }
  .pv-diary-body .pv-gt-main, .pv-diary-body .pv-gt-side { overflow: visible; }
  .pv-work-top { flex-wrap: wrap; }
  .pv-work-search { flex: 1 1 100%; order: 3; margin: 0; }
}

/* 主体：占满剩余高度，内部各栏自己决定滚不滚 */
/* 上下这 14px 是三栏跟那条横线之间的呼吸 —— 原来三栏直接顶在线上 */
.pv-work-body { flex: 1 1 auto; min-height: 0; display: grid; align-items: stretch; padding: 14px 0; }
/* 唯一会滚的那一块。上下留白在这里给，不在外面给——外面给的话滚到底会差一截 */
/* 右边那 10px 是给滚动条的沟槽 —— 不留的话滚动条直接贴着卡片边缘 */
.pv-work-scroll { min-width: 0; overflow-y: auto; padding: 0 10px 0 0; }
/* 细滚动条，去掉上下那两个箭头（macOS 开了"总是显示滚动条"才会出现，很老气） */
.pv-work-scroll::-webkit-scrollbar { width: 10px; }
.pv-work-scroll::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
.pv-work-scroll::-webkit-scrollbar-track { background: transparent; }
.pv-work-scroll::-webkit-scrollbar-thumb {
  background: #d6d3cd; border-radius: 99px;
  border: 3px solid transparent; background-clip: content-box;
}
.pv-work-scroll::-webkit-scrollbar-thumb:hover { background: #b9b5ad; background-clip: content-box; }
/* 项目管理左边那棵树、右边「跳到」那一列也用同一条细滚动条（用户 2026-09-28：原来是浏览器默认的，比中间那条粗一倍）。
   粗细、颜色、去箭头都照上面 .pv-work-scroll；火狐走 scrollbar-width */
.pv-pmo-tree, .pv-pmo-nav { scrollbar-width: thin; scrollbar-color: #d6d3cd transparent; }
.pv-pmo-tree::-webkit-scrollbar, .pv-pmo-nav::-webkit-scrollbar { width: 10px; }
.pv-pmo-tree::-webkit-scrollbar-button, .pv-pmo-nav::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
.pv-pmo-tree::-webkit-scrollbar-track, .pv-pmo-nav::-webkit-scrollbar-track { background: transparent; }
.pv-pmo-tree::-webkit-scrollbar-thumb, .pv-pmo-nav::-webkit-scrollbar-thumb { background: #d6d3cd; border-radius: 99px; border: 3px solid transparent; background-clip: content-box; }
.pv-pmo-tree::-webkit-scrollbar-thumb:hover, .pv-pmo-nav::-webkit-scrollbar-thumb:hover { background: #b9b5ad; background-clip: content-box; }
/* 边栏在骨架里，自己撑满高度、内部超出了自己滚 */
/* 只管"撑满高度、内部自己滚"，**不设 padding** ——
   它排在各面板样式后面，一旦声明 padding 就会把面板自己的左右内边距抹成 0，
   表现是标题贴着左边框。留白归各面板自己管。 */
.pv-work-rail { min-height: 0; display: flex; flex-direction: column; }

@media (max-width: 860px) {
  /* 手机上没有并排的三栏，回到"整页滚"最省事，也不会出现套娃滚动条 */
  .pv-work { height: auto; }
  .pv-work-body { display: block; }
  .pv-work-scroll { overflow: visible; padding: 12px 0; }
  .pv-work-rail { overflow: visible; }
  .pv-work-top { flex-wrap: wrap; }
  .pv-work-search { order: 3; flex: 1 1 100%; max-width: none; margin: 0; }
}


/* ============================================================
   右侧抽屉 .pv-drawer —— 新增/编辑统一从右边滑出来（手写，没用 el-drawer）
   ============================================================
   不用居中弹窗：居中弹窗把整页盖住，而填一条任务时常常要回头看列表里已经有什么。
   抽屉只占右边一条，左边照样看得见。

   为什么不用 el-drawer：它靠 transitionend 收尾，在这个页面里关不干净 ——
   数据里 visible 已经是 false，元素还留在屏幕上（跟 v-loading 那个遮罩同一类毛病）。
   这里只需要"从右边滑进来"这一个效果，v-if 一撤节点立刻就没了，不依赖任何动画事件。 */
.pv-drawer-scrim {
  /* 1900 而不是 2100：Element 的弹层（日期选择器、下拉、消息框）从 2000 起往上排，
     抽屉一旦盖过它们，抽屉里的日期选择器就"点了没反应"——其实是开在了抽屉背面。
     页面上其它东西最高才 50，所以 1900 依然稳压全场。 */
  position: fixed; inset: 0; z-index: 1900;
  background: rgba(15, 23, 42, .28);
  animation: pv-drawer-fade .16s ease-out;
}
.pv-drawer {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 1901;
  width: min(440px, 92vw); display: flex; flex-direction: column;
  background: var(--pv-surface); box-shadow: -8px 0 32px rgba(15, 23, 42, .18);
  animation: pv-drawer-in .18s cubic-bezier(.22, .61, .36, 1);
}
.pv-drawer.narrow { width: min(420px, 92vw); }
@keyframes pv-drawer-in { from { transform: translateX(100%); } to { transform: none; } }
/* 抽屉开着的时候，右下角那两颗悬浮球（AI 助手 / 开发记录 / 手机上的 dock）整个收起来
   （用户 2026-09-03：抽屉被它们压住，右下角那片根本点不到）。
   不靠 z-index 硬压：抽屉长在页面内容里，只要哪个祖先起了层叠上下文，1901 也压不过
   根层的 50；直接不画最稳。:has() 现代浏览器都认。 */
body:has(.pv-drawer) .pv-ai-fab,
body:has(.pv-drawer) .pv-devlog-fab,
body:has(.pv-drawer) .pv-fabdock,
body:has(.pv-drawer) .pv-fabdock-scrim { display: none !important; }
@keyframes pv-drawer-fade { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  .pv-drawer, .pv-drawer-scrim { animation: none; }
}
.pv-drawer-head {
  flex: none; display: flex; align-items: center; gap: 10px;
  padding: 16px 18px 13px; border-bottom: 1px solid var(--pv-border);
}
.pv-drawer-title {
  flex: 1; font-family: var(--title-font); font-size: 16px; font-weight: 700; color: var(--pv-text);
}
.pv-drawer-x {
  width: 26px; height: 26px; flex: none; border: none; background: none; cursor: pointer;
  color: var(--pv-text-faint); font-size: calc(15px + var(--pv-fz-add2, 0px)); border-radius: 50%; line-height: 1;
}
.pv-drawer-x:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-drawer-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 4px 18px 18px; }
/* 小写标签压在每个控件上面：一列到底，比左标签右控件省一半横向空间，抽屉本来就窄 */
/* 抽屉里字段底下的一句解释。只用在"不填会怎样"这种没法从控件本身看出来的地方 */
.pv-drawer-hint {
  margin: 5px 0 2px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text-faint);
}

.pv-drawer-lab {
  display: block; margin: 14px 0 5px; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700;
  letter-spacing: .04em; color: var(--pv-text-faint);
}
.pv-drawer-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.pv-drawer-row > div { min-width: 0; }
.pv-drawer-foot {
  flex: none; display: flex; justify-content: flex-end; gap: 8px;
  padding: 12px 18px; border-top: 1px solid var(--pv-border);
}


/* 抽屉里所有控件**同高、同圆角**，只在这一处定。
   原来是三种高度并排：输入框/下拉/日期 38（--pv-ctrl-h-sm）、「类型 / 优先级」
   那两排 radio 是 Element 的 mini(28)、「完成了吗」那个带框 checkbox 是 small(32)
   —— 并排的两格谁也对不齐，每一行都在错位。
   34 而不是 38：抽屉本来就窄，一列填下来七八个控件，38 一路排下去太笨重。 */
.pv-drawer { --pv-dw-h: 34px; }
.pv-drawer .el-input--small .el-input__inner,
.pv-drawer .el-select--small .el-input__inner,
.pv-drawer .el-date-editor--small.el-input .el-input__inner,
.pv-drawer .el-radio-button__inner,
.pv-drawer .el-checkbox.is-bordered.el-checkbox--small {
  height: var(--pv-dw-h); box-sizing: border-box; font-size: calc(13.5px + var(--pv-fz-add, 0px));
}
.pv-drawer .el-input--small .el-input__inner,
.pv-drawer .el-select--small .el-input__inner,
.pv-drawer .el-date-editor--small.el-input .el-input__inner {
  line-height: var(--pv-dw-h);
}
/* radio 和带框 checkbox 用 flex 居中：Element 给它们写死了 padding 和行高，
   光改 height 会让文字贴着上沿 */
.pv-drawer .el-radio-button__inner,
.pv-drawer .el-checkbox.is-bordered.el-checkbox--small {
  display: inline-flex; align-items: center; line-height: 1;
}
.pv-drawer .el-radio-button__inner { justify-content: center; padding: 0 16px; }
.pv-drawer .el-checkbox.is-bordered.el-checkbox--small {
  justify-content: flex-start; padding: 0 12px; width: 100%; margin: 0;
}
.pv-drawer .el-checkbox.is-bordered .el-checkbox__label { line-height: 1; padding-left: 8px; }
/* 圆角也统一到同一档。分段控件只在两端做圆角，中间那几颗保持方的 —— 
   它们拼成的是一条，每颗都圆会散成一排独立按钮。 */
.pv-drawer .el-input__inner,
.pv-drawer .el-textarea__inner,
.pv-drawer .el-checkbox.is-bordered.el-checkbox--small {
  border-radius: var(--pv-radius-btn);
}
.pv-drawer .el-radio-group { display: inline-flex; }
.pv-drawer .el-radio-button:first-child .el-radio-button__inner {
  border-radius: var(--pv-radius-btn) 0 0 var(--pv-radius-btn);
}
.pv-drawer .el-radio-button:last-child .el-radio-button__inner {
  border-radius: 0 var(--pv-radius-btn) var(--pv-radius-btn) 0;
}
/* 一行装不下就自己往下长的填写控件（用户 2026-09-27：任务标题写长了会被横着推出视野）。
   骨子里是 textarea + autosize，但只有一行时要跟旁边那些 34 高的输入框一模一样 ——
   行高 22 固定，上下内边距按 --pv-dw-h 反推（34 → 5、手机 42 → 9），
   一行正好撑满一档，往下每多一行加 22。resize 关掉：高度由内容说了算，不给人手动拖。 */
.pv-drawer .pv-dw-grow .el-textarea__inner {
  min-height: var(--pv-dw-h) !important;
  padding: calc((var(--pv-dw-h) - 24px) / 2) 12px;
  line-height: 22px; font-size: calc(13.5px + var(--pv-fz-add, 0px));
  resize: none; overflow-y: hidden;
}
/* 手机端跟着站内那一档放大，指头点得着 */
@media (max-width: 640px) { .pv-drawer { --pv-dw-h: var(--pv-ctrl-h-sm-mobile); } }

/* ============================================================
   「完成」一律用绿色，不用主题蓝/黄
   ============================================================
   完成是个**结果**，不是个选项 —— 全站已经用绿色表达它（任务列表的勾、里程碑的点、
   推进中的角标）。抽屉里那个「完成了吗」原来跟着 Element 走成蓝色，四处对不上。
   只改这一个语义的控件，其余表单该蓝还蓝。 */
.pv-drawer .el-checkbox.is-bordered.is-checked { border-color: #2E7D46; background: #F3FBF5; }
.pv-drawer .el-checkbox__input.is-checked .el-checkbox__inner {
  background-color: #2E7D46; border-color: #2E7D46;
}
.pv-drawer .el-checkbox__input.is-checked + .el-checkbox__label { color: #1F7A3D; }
.pv-drawer .el-checkbox__inner:hover { border-color: #2E7D46; }

/* 侧栏左下角的版本号：出问题时第一句话总是"你现在是哪个版本" */
.pv-side-user-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }

/* 版本行：跟上面「头像 + 名字 + 箭头」那块**并列**的一条，不是名字的副标题。
   副标题的位置在说"这是关于筱禾的信息"，可版本号讲的是整个软件。
   两颗都点得开更新记录 —— 左边是"我现在几版"，右边是"那一版改了什么"，
   出问题时这两句话总是连着问的。 */
/* 头像那块和版本号之间不画线：它俩本来就贴在一起、同属侧栏底部这一小块，
   中间横一道等于把一件事切成两件。上面那条（跟导航之间的）留着就够了 ——
   一小块地方里两条线，线比内容还多。 */
.pv-side-verbar {
  flex: none; display: flex; align-items: center; gap: 8px;
  padding: 5px 8px 2px; margin-top: 0;
}
.pv-side-verbar-v {
  border: none; background: none; padding: 0; cursor: pointer; font-family: inherit;
  font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.4;
  font-variant-numeric: tabular-nums; white-space: nowrap; flex-shrink: 0;
}
.pv-side-verbar-v:hover { color: var(--pv-primary-dark); }
.pv-side-verbar-tag {
  border: 1px solid var(--pv-border); background: none; cursor: pointer; font-family: inherit;
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); line-height: 1.6; padding: 0 7px; border-radius: var(--pv-radius-pill);
  color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
}
.pv-side-verbar-tag:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }

/* 今天面板：一类一行，类别标签在前，后面跟着这一类的具体条目（买菜再按超市分组） */
/* 一栏里是竖着的：类别片单独一行在上，下面才是这一类的东西。
   横着排（片在左、内容在右）在四分之一屏宽里放不下 —— 片一占位，
   右边就只剩十来个字。

   ⚠ 这里必须是 flex 列，不能用 display:block。
   block 的话，那枚 inline-flex 的类别片就成了**行内元素**，要参与基线对齐；
   而一个 inline-flex 盒子的基线取自它第一个子项 ——
     ·「要买」第一个子项是文字 → 基线是文字基线
     ·「PMO 里程碑」第一个子项是那面 SVG 小旗子 → 基线是它的底边
   两者对齐的参照物不同，片就一高一低，四栏并排时一眼看得出来。
   改成 flex 列之后片是块级子项，压根不参与基线计算，各栏顶端自然齐平。 */
.pv-cal-brief-row {
  display: flex; flex-direction: column; align-items: flex-start; min-width: 0;
}
.pv-cal-brief-kind { flex: none; align-items: center; margin-bottom: 5px; }
/* QAA 那一块右上角「看谁的」那排头像（用户 2026-10-27）：壳照 .pv-pmo-who-strip，只是钉在这一块的右上角 */
.pv-cal-brief-row.row-qaa { position: relative; }
.pv-cal-qaa-who { position: static; align-self: flex-start; margin: 0 12px 0 0; }   /* 1.0.252：在牌头「今天」左边，不再钉在 QAA 那一行 */
.pv-cal-qaa-who .pv-pmo-who-av:not(.on) { opacity: .3; filter: grayscale(1); }      /* 点暗的：灰掉 */
.pv-cal-qaa-who .pv-pmo-who-av:not(.on):hover { opacity: .6; }
.pv-cal-brief-items { display: block; min-width: 0; align-self: stretch; }
/* 一个 sub 一行：同一个超市的东西凑一行，换个超市换一行 */
.pv-cal-brief-sub { display: block; min-width: 0; line-height: 1.65; }
.pv-cal-brief-sub + .pv-cal-brief-sub { margin-top: 2px; }
/* 出处：内容右边用「 · 」接着的一小截，不是标签、也不加括号（用户 2026-09-03：不要小括号）。
   淡一档，让眼睛先读到东西本身。 */
/* 第二行副标题（超市 / 分类）跟项目那类的来路同一个样子：自己一行、11.5px 淡灰、不带「·」（用户 2026-09-10） */
.pv-cal-brief-where {
  display: block; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin: 1px 0 0; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.pv-cal-brief-names { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); line-height: 1.5; }
/* 一条 = 标题 + 逾期小签 + 来路，自己会换行；换行后各段都从这条起点对齐，行距收到 1.5 */
/* 一条一行（用户 2026-09-09：长标题折行后条与条黏在一起分不清）：每条自己占一块，条间留 7px；
   条内标题 / 逾期签 / 来路仍在一行里顺着排、放不下再折 */
/* 条内走行内流：标题折行后，逾期小签和来路紧跟在最后一个字后面，不再单独掉到下一行（用户 2026-09-09 截图） */
.pv-cal-brief-one { display: block; max-width: 100%; line-height: 1.6; position: relative; padding-left: 12px; }   /* 前面一颗圆点，一眼分得出哪是一条（用户 2026-09-15） */
.pv-cal-brief-one::before { content: ''; position: absolute; left: 1px; top: .72em; width: 5px; height: 5px; border-radius: 50%; background: var(--pv-text-faint); }
.pv-cal-brief-one + .pv-cal-brief-one { margin-top: 7px; }
/* 节前准备那一条前面的圆圈（用户 2026-09-30）：顶掉那颗圆点，点了 = 做完了 */
.pv-cal-brief-one.tick::before { display: none; }
/* 圆圈钉在这一条的左上角、跟第一行文字顶齐，折下来的行从圆圈右边起（用户 2026-10-02：手机上圆圈和字交错、第二行钻到圆圈底下） */
.pv-cal-brief-one.tick { padding-left: 24px; }
.pv-cal-brief-tick { position: absolute; left: 0; top: 3px; width: 16px; height: 16px; margin: 0; padding: 0; border-radius: 50%;
                     border: 1.5px solid var(--pv-text-faint); background: var(--pv-surface); cursor: pointer; }
.pv-cal-brief-tick::after { content: '✓'; position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 10px; line-height: 1; color: transparent; }
.pv-cal-brief-tick:hover { border-color: #2E7D46; background: #2E7D46; } .pv-cal-brief-tick:hover::after { color: #fff; }
.pv-cal-brief-tick:disabled { opacity: .5; cursor: default; }
.pv-cal-brief-one .pv-cal-brief-item { display: inline; line-height: inherit; cursor: pointer; }
.pv-cal-brief-one .pv-cal-brief-item:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: 2px; border-radius: 3px; }
/* 评论待办（用户 2026-09-29）：「待办 / 待确认」后面跟着那条评论的内容，整条最多两行，多了省略。
   要截行就得是块，不能是行内文字；悬停的下划线在两行的块上画出来是一道横线压在底下，这里不要 */
.pv-cal-brief-one .pv-cal-brief-item.cmt { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
                                            overflow-wrap: anywhere; border-bottom: 0; }
.pv-cal-brief-item.cmt .lead-t { font-weight: 600; }
.pv-cal-brief-one .pv-cal-brief-item.cmt .pv-cal-slip { margin: 0 6px 0 0; }
.pv-cal-brief-one .pv-cal-slip { display: inline-block; margin-left: 6px; vertical-align: 1px; }
.pv-cal-brief-one .pv-cal-slip.lead { margin-left: 0; margin-right: 6px; }   /* 在标题前面的那枚 */
/* 来路自己占一行、跟标题左对齐（用户 2026-09-10：折行后那 6px 左边距成了缩进） */
.pv-cal-brief-one .pv-cal-by { display: block; margin-left: 0; margin-top: 1px; }
/* 带来路的那条，底下要跟不带来路的条留一样的空（用户 2026-09-22）：
   条间距是 margin-top:7px，margin 会跟下一条的合并，所以这儿用 padding 垫，垫出标题那行本来会有的半行距 */
.pv-cal-brief-one button.pv-cal-by.is-link { padding: 0 0 5px; }

/* ============================================================
   项目模板：一串相对日期的里程碑规则
   ============================================================
   编辑器在抽屉里（.pv-drawer.wide），所以每一行都得在 ~520px 宽度里说清
   「谁、相对谁、往哪边、多久」。做法是拆两行：上行是名字和增删改，
   下行才是规则 —— 挤成一行的话四个控件全被压到只剩两三个字。 */
.pv-drawer.wide { width: min(560px, 96vw); }

.pv-tpl-back {
  border: none; background: none; cursor: pointer; padding: 0 4px 0 0;
  color: var(--pv-text-soft); font-size: calc(13px + var(--pv-fz-add, 0px)); font-family: inherit;
  white-space: nowrap; flex-shrink: 0;
}
.pv-tpl-back:hover { color: var(--pv-primary-dark); }

.pv-tpl-intro {
  margin: 10px 0 14px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.7; color: var(--pv-text-soft);
}
.pv-tpl-intro b { color: var(--pv-text); }

.pv-tpl-card {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  padding: 10px 12px; margin-bottom: 8px; cursor: pointer; background: var(--pv-surface);
}
.pv-tpl-card:hover { border-color: var(--pv-primary); background: var(--pv-primary-soft); }
.pv-tpl-card-head { display: flex; align-items: baseline; gap: 8px; }
.pv-tpl-card-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-tpl-card-n { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }
/* 链条：锚点在最右边（时间上它最靠后），前面的节点用 ← 串起来，
   读的方向跟"往前推"的思路一致 */
.pv-tpl-card-chain {
  display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin-top: 7px;
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
}
.pv-tpl-card-chain > span {
  border: 1px solid var(--pv-border); border-radius: 5px; padding: 1px 7px;
  background: var(--pv-bg); white-space: nowrap; flex-shrink: 0;
}
.pv-tpl-card-chain .pv-tpl-anchor {
  border-color: var(--pv-primary); color: var(--pv-primary-dark);
  background: var(--pv-primary-soft);
}

.pv-tpl-row {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  padding: 8px 9px; margin-bottom: 7px; background: var(--pv-bg);
}
.pv-tpl-row-top { display: flex; align-items: center; gap: 4px; }
.pv-tpl-row-rule { display: flex; align-items: center; gap: 6px; margin-top: 7px; }
.pv-tpl-rel { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }

.pv-tpl-hint { margin-top: 5px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text-faint); }
.pv-tpl-hint.warn { color: #B7791F; }
.pv-tpl-try { display: flex; align-items: center; gap: 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }

/* 试算结果：日期用衬线数字（跟里程碑时间线上那些日期同一支字体），
   一列窄表格，一眼比得出隔了几天 */
.pv-tpl-prev { margin-top: 8px; }
.pv-tpl-prev-row {
  display: grid; grid-template-columns: auto auto 1fr auto; align-items: baseline; gap: 8px;
  padding: 4px 2px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  border-bottom: 1px dashed var(--pv-border);
}
.pv-tpl-prev-row:last-child { border-bottom: none; }
.pv-tpl-prev-d {
  font-family: Cambria, Georgia, "Times New Roman", serif;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); white-space: nowrap; flex-shrink: 0;
}
.pv-tpl-prev-w { font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }
.pv-tpl-prev-n { color: var(--pv-text); }
.pv-tpl-prev-r { font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0; }
.pv-tpl-prev-row.anchor .pv-tpl-prev-n { color: var(--pv-primary-dark); }
.pv-tpl-prev-row.anchor .pv-tpl-prev-d { color: var(--pv-primary-dark); }
.pv-tpl-prev-row.broken .pv-tpl-prev-d { color: #C0433C; }

/* 项目表单里那块「会按模板生成什么」 */
.pv-tpl-apply {
  border: 1px solid var(--pv-border); border-left: 3px solid var(--pv-primary);
  /* 强调色那条边不做圆角 */
  border-radius: 0 var(--pv-radius-sm) var(--pv-radius-sm) 0;
  padding: 9px 11px; background: var(--pv-bg);
}
.pv-tpl-apply-head {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); line-height: 1.5;
}
.pv-tpl-apply-head b { color: var(--pv-primary-dark); }

/* 模板管理那颗：跟「新建项目」同宽同高，但不抢它的视线 —— 新建是主动作 */
.pv-pmo-newbtn.plain { border-style: solid; margin-top: 6px; }

/* 里程碑的小旗子（path 照搬 roadmap）。用 inline-block + vertical-align 而不是把
   .pv-cal-chip 改成 flex：那个小片在月历格子里靠 text-overflow:ellipsis 截字，
   一改成 flex 省略号就没了，格子里的长标题会直接溢出去。 */
.pv-ms-flag { display: inline-block; vertical-align: -1px; margin-right: 3px; }
/* 顶上筛选按钮里，旗子顶掉那个小方点，占同样的位置 */
.pv-cal-dot-flag { width: 11px; height: 11px; flex: none; color: #1D4ED8; margin-right: -1px; }

/* 日历上的东西都能点进去 —— 日历只是个**索引**：它把散在七八个模块里的东西
   按日子摆到一起。看到一条「要买 白萝卜」却点不动，人就只能自己回想
   "这是小厨房里的" —— 索引不能翻，那它就只是一张海报。 */
.pv-cal-chip.is-link, .pv-cal-band-item.is-link { cursor: pointer; }
.pv-cal-chip.is-link:hover, .pv-cal-band-item.is-link:hover { filter: brightness(1.12); }
/* 类别片在今天面板里是个真 button，得把浏览器的默认样式抹平，
   否则它跟旁边那些 span 片高矮不一 */
button.pv-cal-brief-kind {
  border: none; font-family: inherit; display: inline-flex; align-items: center;
}
/* 今天面板里每一条：平时看不出是按钮（一排下划线太吵），指上去才亮出来 */
.pv-cal-brief-item {
  border: none; background: none; padding: 0; cursor: pointer; font-family: inherit;
  font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text);
  border-bottom: 1px solid transparent;
  text-align: left;   /* button 默认居中，长标题折行后第二行会飘到中间（用户 2026-09-08） */
}
.pv-cal-brief-item + .pv-cal-brief-item { margin-left: 8px; }
.pv-cal-brief-item:hover { color: var(--pv-primary-dark); border-bottom-color: currentColor; }

/* 整行可点。左右各撑出 8px 再用负 margin 拉回去 —— 不这么做，hover 那层底色
   会紧贴着文字起笔，看着像选中了一段文本而不是"这一行亮了" */
.pv-cal-day-row.is-link {
  cursor: pointer; padding-left: 8px; padding-right: 8px; margin: 0 -8px;
  border-radius: var(--pv-radius-sm);
}
.pv-cal-day-row.is-link:hover { background: var(--pv-bg); }
/* 右边那枚箭头平时藏着：一列全是箭头很吵，而指上去才出现正好说明"这一行能点" */
.pv-cal-day-go { color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); opacity: 0; flex: none; }
.pv-cal-day-row.is-link:hover .pv-cal-day-go { opacity: 1; }

/* ============================================================
   电器文件存档 —— 柜子墙 → 打开一个柜子 → 里面的文件
   ============================================================
   卡片网格而不是列表：柜子是"东西"（一台冰箱、一台微波炉），
   而列表暗示的是"一条条事件"。东西该摆开来看。 */
.pv-appl-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.pv-appl-title { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); white-space: nowrap; flex-shrink: 0; }
.pv-appl-store {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
  padding: 2px 9px; border-radius: var(--pv-radius-pill); background: var(--pv-bg);
}

.pv-appl-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(216px, 1fr)); gap: 10px; }
.pv-appl-card {
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius);
  background: var(--pv-surface); padding: 12px 13px; cursor: pointer;
  transition: border-color .12s, box-shadow .12s;
}
.pv-appl-card:hover { border-color: var(--pv-primary); box-shadow: 0 3px 12px rgba(15, 23, 42, .07); }
.pv-appl-card-top { display: flex; align-items: center; gap: 8px; }
.pv-appl-card-ico { font-size: 17px; line-height: 1; flex-shrink: 0; }
.pv-appl-card-name {
  flex: 1; min-width: 0; font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 文件数：0 显示「—」而不是「0」，减少视觉噪音 */
.pv-appl-card-n {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 1px 8px; flex-shrink: 0; white-space: nowrap;
  border-radius: var(--pv-radius-pill); background: var(--pv-primary-soft); color: var(--pv-primary-dark);
}
.pv-appl-card-n.zero { background: var(--pv-bg); color: var(--pv-text-faint); font-weight: 400; }
.pv-appl-card-model {
  margin-top: 6px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pv-appl-card-foot { display: flex; align-items: center; gap: 6px; margin-top: 9px; flex-wrap: wrap; }
.pv-appl-cat {
  font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 1px 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-soft); white-space: nowrap; flex-shrink: 0;
}
/* 保修是这堆纸里唯一会"到点失效"的东西，所以它是卡片上唯一有颜色的信息 */
.pv-appl-warr {
  font-size: calc(11px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
}
.pv-appl-warr.soon { color: #B7791F; font-weight: 600; }
.pv-appl-warr.over { color: var(--pv-danger); }

.pv-appl-meta {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  padding-bottom: 10px; margin-bottom: 12px; border-bottom: 1px solid var(--pv-border);
}
.pv-appl-meta .late { color: var(--pv-danger); }

/* 整块都是拖放区。min-height 给够 —— 空柜子时也得有块地方能拖进去，
   不然"把文件拖进来"这句话指着的是一条 20px 高的缝。 */
.pv-appl-drop { min-height: 180px; }
/* 共用附件组件（pv-attachments）：列表照电器文件存档那套，多一行备注 */
.pv-att-drop { min-height: 120px; }
.pv-att-item { padding: 2px 0; }
.pv-att-item + .pv-att-item { border-top: 1px dashed var(--pv-border); }
.pv-att-note {
  margin: -2px 0 6px 34px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.55; color: var(--pv-text-soft);
  white-space: pre-wrap; word-break: break-word;
}
.pv-att-note.clickable { cursor: text; }
.pv-att-note.clickable:hover { color: var(--pv-text); }
.pv-att-note-add {
  margin: -2px 0 6px 34px; border: none; background: none; padding: 0; cursor: pointer;
  font-family: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
.pv-att-note-add:hover { color: var(--pv-primary-dark); }
.pv-att-note-edit { display: flex; align-items: center; gap: 6px; margin: 0 0 8px 34px; }
.pv-att-note-edit input {
  flex: 1; min-width: 0; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-btn);
  padding: 5px 9px; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); background: var(--pv-surface);
}
.pv-att-note-edit input:focus { outline: none; border-color: var(--pv-primary); }
/* 项目管理「列表」板块：工具条 + 一张紧凑些的数据表（表头 13px，行 8px） */
.pv-pmo-list-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
/* 板块本身已经是一张卡，表格不再套第二层框（用户 2026-09-08：框套框很怪）——只留行与行之间的横线 */
.pv-pmo-list-wrap { background: none; border: none; box-shadow: none; border-radius: 0; padding: 0; }
.pv-pmo-list-wrap .el-table, .pv-pmo-list-wrap .el-table th, .pv-pmo-list-wrap .el-table tr { background: transparent; }
.pv-pmo-list-wrap .el-table th { font-size: calc(13px + var(--pv-fz-add, 0px)); padding: 8px 0; }
.pv-pmo-list-wrap .el-table td { padding: 6px 0; }
/* 单元格两态（照飞书多维表格）：平时纯文字、悬停浅底；点了才是输入框 */
.pv-cell-wrap {
  min-height: 30px; display: flex; align-items: center; padding: 2px 8px; border-radius: 6px;
  cursor: text; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); width: 100%; box-sizing: border-box;
}
.pv-cell-wrap:not(.editing):hover { background: var(--pv-bg); }
.pv-cell-wrap.editing { padding: 0; cursor: default; }
.pv-cell-wrap .pv-cell { width: 100%; }
.pv-cell-empty { color: var(--pv-text-faint); }
.pv-cell-wrap.t-rating:not(.editing) { color: #F7BA2A; letter-spacing: 2px; cursor: pointer; }
.pv-cell-wrap.t-checkbox:not(.editing), .pv-cell-wrap.t-select:not(.editing), .pv-cell-wrap.t-multiselect:not(.editing),
.pv-cell-wrap.t-date:not(.editing), .pv-cell-wrap.t-datetime:not(.editing) { cursor: pointer; }
/* 表头排序（经典三态）：整格可点，右侧一对上下小三角平时很淡，当前方向那枚点亮（照 Element / 飞书表格） */
.pv-sort-head { cursor: pointer; user-select: none; }
.pv-sort-head:hover { color: var(--pv-primary-dark); }
.pv-sort-carets { display: inline-flex; flex-direction: column; margin-left: 4px; line-height: 0; }
.pv-sort-carets i { font-size: calc(11px + var(--pv-fz-add, 0px)); height: 7px; color: var(--pv-border); display: block; }
.pv-sort-carets i.on { color: var(--pv-primary); }
.pv-sort-head.on { color: var(--pv-primary-dark); }
.pv-pmo-list-pick { display: flex; flex-direction: column; gap: 8px; }
.pv-pmo-list-pick .el-radio { margin-right: 0; }
/* 逾期的那条标题本身也红（用户 2026-09-07），跟后面那枚小签一个颜色 */
.pv-cal-brief-item.is-over { color: var(--pv-danger); }   /* 鲜亮的那档红（用户 2026-09-07），不用暗红 */
/* 今天面板里逾期任务那枚小标签：「原定 9/2 · 3 Days」，红一档、小一号，不抢标题 */
.pv-cal-slip {
  display: inline-block; margin-left: 4px; padding: 0 7px; height: 19px; line-height: 19px;   /* 字上下各留一点气（用户 2026-09-08） */
  border-radius: var(--pv-radius-pill); background: var(--pv-danger); color: #fff;   /* 实底鲜红白字，一眼扫到 */
  font-size: calc(11px + var(--pv-fz-add, 0px)); font-variant-numeric: tabular-nums; white-space: nowrap; flex-shrink: 0; vertical-align: middle;
}
.pv-appl-empty {
  border: 1px dashed var(--pv-border); border-radius: var(--pv-radius);
  padding: 30px 20px; text-align: center; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
}
.pv-appl-file {
  display: flex; align-items: center; gap: 10px; padding: 8px 8px; margin: 0 -8px;
  border-bottom: 1px dashed var(--pv-border); border-radius: var(--pv-radius-sm);
}
.pv-appl-file:hover { background: var(--pv-bg); }
.pv-appl-file-ico { font-size: 16px; line-height: 1; flex-shrink: 0; }
.pv-appl-file-name {
  flex: 1; min-width: 0; text-align: left; border: none; background: none; padding: 0;
  cursor: pointer; font-family: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pv-appl-file-name:hover { color: var(--pv-primary-dark); text-decoration: underline; }
.pv-appl-file-size, .pv-appl-file-at {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
  font-variant-numeric: tabular-nums;
}
.pv-appl-uploading { padding: 10px 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-primary-dark); }
/* 上传进度行（用户 2026-09-08，照网盘那种）：名字 · 已传/总量 · 速度 · 剩多久 · 百分比，底下一条 4px 进度线；
   传到服务器之后等它落盘那段没有进度，进度线换成走动的条纹 */
.pv-up-row { display: flex; align-items: center; gap: 10px; padding: 8px 8px; margin: 0 -8px; border-bottom: 1px dashed var(--pv-border); }
.pv-up-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 5px; }
.pv-up-top { display: flex; align-items: center; gap: 8px; min-width: 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-up-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-up-stat { flex: none; color: var(--pv-text-faint); white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-up-row.error .pv-up-stat { color: var(--pv-danger); white-space: normal; }
.pv-up-pct { flex: none; min-width: 40px; text-align: right; font-variant-numeric: tabular-nums; color: var(--pv-primary-dark); }
.pv-up-row.done .pv-up-pct { color: #2E7D46; }
.pv-up-bar { height: 4px; border-radius: 2px; background: var(--pv-bg); overflow: hidden; }
.pv-up-fill { height: 100%; border-radius: 2px; background: var(--pv-primary); transition: width .2s linear; }
.pv-up-row.done .pv-up-fill { background: #2E7D46; }
.pv-up-row.error .pv-up-fill { background: var(--pv-danger); }
.pv-up-fill.indet {
  background: repeating-linear-gradient(90deg, var(--pv-primary) 0 12px, var(--pv-primary-soft) 12px 24px);
  animation: pv-up-stripes .7s linear infinite;
}
@keyframes pv-up-stripes { to { background-position: 24px 0; } }
@media (max-width: 640px) { .pv-up-stat { display: none; } }

/* ============================================================
   中继区 —— 从别处搬过来的表，原样躺着
   ============================================================
   刻意长得像个表格查看器，不像老顾别处那些卡片和面板：
   长得像别处，人会以为它已经"进系统了"。它没有。 */
.pv-stg-search { max-width: 460px; margin: 12px 0 4px; }

.pv-stg-doc { margin-top: 16px; }
.pv-stg-doc-head {
  display: flex; align-items: center; gap: 8px;
  padding-bottom: 6px; margin-bottom: 6px; border-bottom: 1px solid var(--pv-border);
}
.pv-stg-doc-title { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); }
.pv-stg-doc-head .pv-adm-nav-n { margin-left: 0; }

.pv-stg-row {
  display: flex; align-items: center; gap: 9px; min-height: 36px;
  padding: 0 8px; margin: 0 -8px; border-radius: var(--pv-radius-sm); cursor: pointer;
}
.pv-stg-row:hover { background: var(--pv-bg); }
.pv-stg-row-ico { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1; flex-shrink: 0; }
.pv-stg-row-name {
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pv-stg-row-tag {
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); padding: 0 6px; border-radius: var(--pv-radius-pill);
  background: var(--pv-bg); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
}
.pv-stg-row-n, .pv-stg-row-at {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; flex-shrink: 0;
  font-variant-numeric: tabular-nums;
}

/* 搜索命中：一行 60 列大半是空的，只挑有内容的前几格显示 */
.pv-stg-hit {
  display: flex; align-items: baseline; gap: 10px; padding: 6px 8px; margin: 0 -8px;
  border-bottom: 1px dashed var(--pv-border); border-radius: var(--pv-radius-sm); cursor: pointer;
}
.pv-stg-hit:hover { background: var(--pv-bg); }
.pv-stg-hit-where {
  font-size: calc(11px + var(--pv-fz-add, 0px)); padding: 1px 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark);
  white-space: nowrap; flex-shrink: 0;
}
.pv-stg-hit-cells { display: flex; flex-wrap: wrap; gap: 4px 12px; min-width: 0; }
.pv-stg-hit-cell { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-stg-hit-cell b {
  font-weight: 400; color: var(--pv-text-faint); font-size: calc(11px + var(--pv-fz-add, 0px)); margin-right: 4px;
}

/* 网格：横向自己滚，绝不把页面撑宽（61 列的表一定撑得出去）。
   表头吸顶，往下翻还知道哪列是哪列。 */
.pv-stg-grid-wrap {
  margin-top: 12px; overflow: auto; max-height: 62vh;
  border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
}
.pv-stg-grid { border-collapse: collapse; font-size: calc(12.5px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-stg-grid th, .pv-stg-grid td {
  border-right: 1px solid var(--pv-border); border-bottom: 1px solid var(--pv-border);
  padding: 5px 9px; text-align: left; max-width: 280px;
  overflow: hidden; text-overflow: ellipsis;
}
.pv-stg-grid thead th {
  position: sticky; top: 0; z-index: 1; background: var(--pv-bg);
  font-weight: 700; color: var(--pv-text-soft);
}
.pv-stg-grid tbody tr:hover td { background: var(--pv-bg); }
.pv-stg-grid td { color: var(--pv-text); }
/* 行号列：跟着横向滚动钉在左边 —— 表宽了之后，滚到右边就不知道在看第几行 */
.pv-stg-grid .pv-stg-idx {
  position: sticky; left: 0; z-index: 2; background: var(--pv-surface);
  color: var(--pv-text-faint); font-variant-numeric: tabular-nums; text-align: right;
  min-width: 44px;
}
.pv-stg-grid thead .pv-stg-idx { z-index: 3; background: var(--pv-bg); }

.pv-stg-pager {
  display: flex; align-items: center; gap: 10px; margin-top: 10px;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
}
.pv-stg-pick { padding: 3px 0; }
.pv-stg-result {
  margin-top: 12px; padding: 10px 12px; border-radius: var(--pv-radius-sm);
  background: var(--pv-bg); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.9; color: var(--pv-text-soft);
}
.pv-stg-result .bad { color: var(--pv-danger); }
/* 表头上面压着的那几行：不是数据，单独摆一条，不塞进网格 */
.pv-stg-note {
  margin-top: 10px; padding: 7px 11px; border-radius: var(--pv-radius-sm);
  background: var(--pv-bg); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1.7; color: var(--pv-text-faint);
}
.pv-stg-row-tag.warn { color: #B7791F; }
/* 表头右边没名字、下面却可能有数据的列：拿列号顶上，并且淡一档 —— 
   看得出"这列在源头就没名字"，而不是我们把名字弄丢了 */
.pv-stg-grid thead th.unnamed { color: var(--pv-text-faint); font-weight: 400; }

/* ============================================================
   后台内容区的**统一版式** —— 一套模板，几格通用
   ============================================================
   「家庭背景」和「飞书机器人」是两个独立页面原样嵌进来的，各自带着自己那套
   标题字号、卡片壳、内边距。结果同一个后台里，切一格换一副长相。

   与其挨个去改那些页面，不如让**容器**定规矩：进了 .pv-adm-main，
   标题多大、正文多大、要不要卡片壳，一律听这里的。
   好处是以后再嵌新页面不用先去改那个页面 —— 也就不会再出现
   "又得回去把某一页调一遍"这件事。 */

/* 嵌进来的页面自带的大标题和面包屑不要：后台左边已经写着现在在哪一格了 */
.pv-adm-main .pv-section-head,
.pv-adm-main .pv-crumb-back { display: none; }
.pv-adm-main .pv-page { padding: 0; }

/* 卡片壳一律脱掉。后台内容区本身已经是一层"区域"，
   里面再套白框就是框里画框 —— 那层框什么也没多说，还把内容往里挤了一圈。 */
.pv-adm-main .pv-home-block,
.pv-adm-main .pv-card-plain {
  background: none; border: none; box-shadow: none; border-radius: 0; padding: 0;
}
.pv-adm-main .pv-home-block { margin: 0 0 22px; }
.pv-adm-main .pv-card-plain { margin-bottom: 14px; }
.pv-adm-main .pv-home-block:last-child { margin-bottom: 0; }

/* 区块标题一律对齐 .pv-adm-head h3：16px / 700，下面一条横线。
   原来家庭背景那两块是 18px、飞书那几段是 15px，同一个后台三种标题。 */
/* 不画下横线：这些是**区块内部**的小标题，紧接着就是它自己的表格/列表 ——
   中间横一道线，反而把标题和它领着的东西切开了。
   页面顶上那条（.pv-adm-head）是另一回事，那条分的是"页头 / 正文"。 */
.pv-adm-main .pv-block-title,
.pv-adm-main .pv-fs-h3 {
  font-size: 16px; font-weight: 700; color: var(--pv-text); letter-spacing: 0;
  margin: 22px 0 10px; padding-bottom: 0; border-bottom: none;
}
.pv-adm-main .pv-block-title:first-child,
.pv-adm-main > .pv-fs-h3:first-child { margin-top: 0; }

/* 正文收到 13px 一档，跟 .pv-adm-sub 同级 */
.pv-adm-main .pv-fs-row { font-size: calc(13px + var(--pv-fz-add, 0px)); padding: 4px 0; }
.pv-adm-main .pv-fs-note { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.7; }
.pv-adm-main .pv-fs-empty { font-size: calc(12.5px + var(--pv-fz-add, 0px)); padding: 10px 12px; }
.pv-adm-main .pv-fs-item { padding: 7px 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-adm-main .pv-fs-name { font-weight: 400; }
.pv-adm-main .pv-fs-oid { font-size: calc(11.5px + var(--pv-fz-add, 0px)); }

/* ============================================================
   表格里那两个操作：编辑 / 删除
   ============================================================
   原来用的是 el-button type="text"。Element 的文字按钮不吃 size，
   字号固定 14px —— 而所在的表是 size="small"（12px）。
   于是一行里正文 12px、操作 14px，操作反而比内容还响。 */
.pv-mini-btn {
  display: inline-flex; align-items: center; height: 22px; padding: 0 9px;
  border: 1px solid var(--pv-border); background: var(--pv-surface);
  border-radius: 6px; font-family: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1;
  color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; flex-shrink: 0;
}
.pv-mini-btn + .pv-mini-btn { margin-left: 6px; }
.pv-mini-btn:hover:not(:disabled) { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-mini-btn.danger:hover:not(:disabled) { border-color: var(--pv-danger); color: var(--pv-danger); background: #FEF2F2; }
.pv-mini-btn:disabled { opacity: .4; cursor: not-allowed; }

/* 中继区：返回键单占一行，做成一颗看得出能点的东西（原来只是个裸箭头，
   挤在标题左边像标题的一部分） */
.pv-stg-back {
  display: inline-flex; align-items: center; height: 26px; padding: 0 11px;
  margin-bottom: 12px; border: 1px solid var(--pv-border); background: var(--pv-surface);
  border-radius: 7px; font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
  cursor: pointer; white-space: nowrap; flex-shrink: 0;
}
.pv-stg-back:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }

/* 从搜索点进来时的那条说明。不是筛选控件 —— 它只解释"你为什么只看到这几行" */
.pv-stg-filtered {
  display: flex; align-items: center; gap: 10px; margin-top: 10px;
  padding: 6px 11px; border-radius: var(--pv-radius-sm);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: calc(12.5px + var(--pv-fz-add, 0px));
}
.pv-stg-filtered button {
  border: none; background: none; padding: 0; cursor: pointer; font-family: inherit;
  font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-primary-dark); text-decoration: underline;
  white-space: nowrap; flex-shrink: 0;
}

/* 菜单里那枚「仅特殊权限」：红色小标，说明这一条一般人看不到 */
.pv-side-settings-menu .pv-menu-badge {
  margin-left: 8px; padding: 1px 7px; border-radius: var(--pv-radius-pill);
  background: #FEF2F2; color: #C0433C; border: 1px solid #F5C6C2;
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); line-height: 1.6; white-space: nowrap; flex-shrink: 0;
}

/* 安全页 */
.pv-sec-me {
  font-size: calc(10.5px + var(--pv-fz-add, 0px)); padding: 0 7px; border-radius: var(--pv-radius-pill);
  background: var(--pv-primary-soft); color: var(--pv-primary-dark);
  white-space: nowrap; flex-shrink: 0;
}
/* 注脚：解释"为什么过一阵要重新输密码"，本身没有可操作的东西 —— 
   所以给一条左边线 + 灰底，看得出它是上面那块的附注，不是又一个平级模块 */
.pv-sec-note {
  margin-top: 14px; padding: 10px 13px; background: var(--pv-bg);
  border-left: 3px solid var(--pv-border); border-radius: 0 var(--pv-radius-sm) var(--pv-radius-sm) 0;
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.9; color: var(--pv-text-soft);
}
.pv-sec-note-t { font-weight: 700; color: var(--pv-text); margin-bottom: 2px; }
.pv-sec-note .pv-fs-dot { display: inline-block; vertical-align: middle; margin-right: 6px; }

/* 日历：做完的里程碑/任务。默认不画，顶上那颗开关打开才有。
   划掉 + 淡下去：一眼能认出"这条已经过去了"，又不至于跟没做完的抢注意力。 */
/* 「做完的算不算」是另一个维度，所以两态都不用类型片那套浅底：
   关着＝素白（这是默认，不该看着像被选中了），开着＝绿底。 */
.pv-cal-donebtn { background: var(--pv-surface); color: var(--pv-text-soft); }
.pv-cal-donebtn.on { border-color: #2E7D46; color: #1F7A3D; background: #F3FBF5; font-weight: 600; }
.pv-cal-donebtn-tick { font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 1; }
.pv-cal-chip.done { opacity: .5; text-decoration: line-through; }
.pv-cal-chip-tick { margin-right: 3px; font-size: calc(10px + var(--pv-fz-add, 0px)); }
.pv-cal-day-row.done .pv-cal-day-title { opacity: .55; text-decoration: line-through; }

/* 模块配置里的小节标题 */
.pv-mod-sec {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
  margin: 20px 0 8px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text);
}
.pv-mod-sec:first-of-type { margin-top: 4px; }
.pv-mod-row-sub {
  font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ============================================================
   占位文字 / 空态提示全站一个字号（用户 2026-09-08：同一屏上三种大小的灰字）
   ============================================================
   规矩：placeholder 一律 12.5px 淡灰，不管输入框本身多大；「还没有 xx」这类空态提示同样 12.5px。
   放在文件末尾靠层叠顺序盖过前面各处零散写的值；以后新加的空态类往这一行里补。 */
.el-input__inner::placeholder, .el-textarea__inner::placeholder,
.pv-att input::placeholder, .pv-work-search-inp::placeholder, .pv-mp-input::placeholder,
.pv-pmo-compose textarea::placeholder, .pv-mde .el-textarea__inner::placeholder,
input::placeholder, textarea::placeholder {
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-style: normal;
}
.pv-pmo-sec-empty, .pv-pmo-side-empty, .pv-appl-empty, .pv-dp-empty, .pv-notif-empty, .pv-fs-empty,
.pv-empty, .pv-adm-sub, .pv-chat-hint { font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-empty .big { font-size: 36px; }   /* 整页空态那枚大图标不跟着缩 */

/* 附件备注弹窗 */
.pv-att-note-dialog .el-dialog__body { padding: 8px 20px 12px; }
.pv-att-note-for { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-bottom: 10px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-att-note-hint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-right: 10px; }

/* ---------- 文档型任务（用户 2026-09-08）：卡上的小签 / 链接行；飞书文档板块里的截止字；抽屉里的延期记录 ---------- */
.pv-task-kind.k-doc { background: #E8F0FF; color: #2B5CD9; }
.pv-tc-link { color: var(--pv-primary-dark); }
.pv-tc-link:hover { text-decoration: underline; }
.pv-doc-due { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-doc-due.now, .pv-doc-due.over { color: var(--pv-danger); font-weight: 600; }
.pv-doc-row.done .pv-doc-name { color: var(--pv-text-faint); text-decoration: line-through; }
/* 里程碑卡：就地加子任务那一行（用户 2026-09-21，照飞书）+ 卡脚的删除 ✕ */
/* 输入行照飞书：灰底比内容宽一圈（左右各多出 10px，圆圈仍跟上面子任务的圆圈对齐）、里面留边、行高 38 不显小 */
.pv-rail-sub-new { background: var(--pv-bg); border-radius: 8px; margin: 4px 0 2px; padding: 4px 12px 4px 10px; min-height: 38px; }
.pv-rail-sub-new .pv-rail-sub-due { padding-right: 2px; }
.pv-tc-check.ghost { cursor: default; border-color: var(--pv-border); }
.pv-rail-sub-input { flex: 1; min-width: 0; height: 30px; margin-left: 2px; border: 0; background: none; font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); outline: 0; }
.pv-rail-sub-input::placeholder { color: var(--pv-text-faint); }
.pv-rail-del { flex: none; width: 26px; height: 26px; margin-left: auto; border: 0; background: none; border-radius: 6px; color: var(--pv-text-faint); cursor: pointer; font-size: 14px; }
.pv-rail-del:hover { background: #FDECEC; color: var(--pv-danger); }
.pv-doc-row .pv-tc-check { flex: none; margin-left: 8px; }
.pv-pmo-secbtn.ghost { border-style: dashed; color: var(--pv-text-soft); }
.pv-delay-log { display: flex; flex-direction: column; gap: 3px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-delay-row { display: flex; align-items: center; gap: 10px; min-width: 0; line-height: 1.6; }
.pv-delay-row .w { flex: none; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-delay-row .ft { flex: none; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-delay-row .n { min-width: 0; color: var(--pv-text-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-delay-form { display: flex; align-items: center; gap: 6px; margin-top: 6px; flex-wrap: wrap; }
.pv-delay-form .el-date-editor { width: 140px; }
.pv-delay-form .el-input:not(.el-date-editor) { flex: 1 1 140px; }
.pv-delay-form .el-button { margin-left: 0; }

/* 主人手记工作区（用户 2026-09-09）：「＋ 记一笔」在左栏分类树顶上撑满一行；筛选片在右栏时间轴顶上 */
.pv-diary-add { margin-bottom: 6px; }   /* 尺寸走全站 .pv-addbtn；整宽在那一块里 */
.pv-diary-modebar { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
.pv-ship-tab i { font-size: calc(13px + var(--pv-fz-add, 0px)); margin-right: 4px; vertical-align: -1px; }


/* 记一笔抽屉拉宽到约五分之二屏（用户 2026-09-09）：Markdown 左写右预览才摆得开。手机仍 92vw */
.pv-drawer.pv-diary-dialog { width: clamp(560px, 40vw, 980px); }
@media (max-width: 640px) { .pv-drawer.pv-diary-dialog { width: 92vw; } }

/* 买菜行（用户 2026-09-09）：整行点了拉抽屉改，行里不再有输入框；笔和叉悬停才亮 */
.pv-gro-item.is-link { cursor: pointer; }
.pv-gro-item .pv-gro-pen { opacity: 0; }
.pv-gro-item:hover .pv-gro-pen { opacity: 1; }
.pv-gro-loc i { margin-right: 3px; }

/* 抽屉两列行：每列 min-width:0，内容放不下就自己收，别压到隔壁列（用户 2026-09-09 类型 / 优先级重叠） */
.pv-drawer-row > * { min-width: 0; }

/* 消息弹窗（用户 2026-09-09 照 Legal Snap）：未处理 / 已处理两页；已处理的压淡但仍可点回去 */
/* 消息面板的「未处理 / 已处理」：分段控件；文字和数字同一行高再居中（数字才不会偏上） */
.pv-notif-seg button { display: inline-flex; align-items: center; gap: 5px; height: 28px; line-height: 26px; padding: 0 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-notif-seg button b { font-weight: 700; line-height: inherit; font-variant-numeric: tabular-nums; }
.pv-notif-seg button.on b { color: var(--pv-primary-dark); }
.pv-notif-hint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin: -2px 0 8px; }
.pv-notif-item.done { opacity: .62; }
.pv-notif-item.done:hover { opacity: 1; }

/* 周期任务（用户 2026-09-09） */
.pv-task-kind.k-cycle { background: #E6F7F5; color: #0F766E; }
.pv-doc-ico.k-cycle { background: #0F9B8E; }
.pv-cycle-form { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
/* 周期那一行的三样（用户 2026-09-18：显得大）：跟抽屉别的控件同高同字号；数字框不带 ± 箭头、居中 */
.pv-cycle-kind { width: 136px; flex: none; }
.pv-cycle-n { width: 72px; flex: none; }
.pv-cycle-n.wk { width: 92px; }
.pv-cycle-n.el-input-number .el-input__inner { text-align: center; padding: 0 8px; font-variant-numeric: tabular-nums; }
.pv-drawer .el-input-number--small { line-height: var(--pv-dw-h, 34px); }
.pv-cycle-preview { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }

/* 项目管理板块里的任务卡不再带外框（用户 2026-09-09：不喜欢框线套框线）：改成浅底色块，悬停才描主色边 */
.pv-pmo-sec .pv-tc { border-color: transparent; background: var(--pv-bg); box-shadow: none; }
.pv-pmo-sec .pv-tc:hover { border-color: var(--pv-primary); }

/* AI 建议标题（用户 2026-09-09）：标题底下一条淡蓝小工具条，采用 / 不用 */
.pv-propose { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 6px 0 2px; padding: 6px 10px; border-radius: 8px; background: #EEF3FF; }
.pv-propose-k { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: #2B5CD9; font-weight: 600; white-space: nowrap; }
.pv-propose-v { flex: 1; min-width: 160px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); line-height: 1.5; }
.pv-propose-acts { flex: none; display: flex; gap: 6px; }
.pv-propose-acts .el-button { margin-left: 0; }

/* 没有建议时（用户 2026-09-10）：外面是虚线框、不铺底，里面那颗按钮实心带浅底 */
.pv-propose.empty { background: none; border: 1px dashed var(--pv-border); padding: 6px 8px; }
.pv-propose-btn.el-button { background: var(--pv-primary-soft); border-color: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-propose-btn.el-button:hover { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; }

/* 时间轴卡片抬头的农历（用户 2026-09-10）：跟日期同一行、淡一档 */
.pv-gt-lunar { color: var(--pv-text-faint); font-weight: 400; }

/* ---------- 主人手记卡片（用户 2026-09-10）：正文最多八行，点开弹窗看全文；右上角 ⋯ 收编辑 / 删除 ---------- */
.pv-gt-card .pv-gt-body:not(.full) { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 8; overflow: hidden; }
.pv-gt-card-more { position: absolute; top: 8px; right: 8px; opacity: 0; transition: opacity .12s; }
.pv-gt-card:hover .pv-gt-card-more { opacity: 1; }
.pv-gt-view .el-dialog__body { padding: 6px 28px 22px; }   /* 右边留够（用户 2026-09-16：正文贴着右沿） */
.pv-gt-view .pv-gt-body.full, .pv-gt-view .pv-gt-note { padding-right: 10px; }
/* 头部两行（用户 2026-09-28）：日期一行、复盘 + 标签一行。左边 28 跟正文那块的内边距是同一个数，
   原来头部用的是弹窗默认的 20，日期比底下的标题和正文靠左 8px；右边让出关闭钮 */
.pv-gt-view .el-dialog__header { padding: 20px 56px 8px 28px; }
.pv-gt-view-head { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-gt-view-date { line-height: 20px; }
.pv-gt-view-tags { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.pv-gt-view-tags:empty { display: none; }
.pv-gt-view-title { font-size: 20px; font-weight: 700; margin: 4px 0 12px; letter-spacing: -.2px; }
.pv-gt-body.full { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 1.8; color: var(--pv-text); }
/* 多级列表（用户 2026-09-10，照飞书）：二级有序用 a. b. c.，三级用 i. ii.；无序二级空心圆、三级方块 */
.pv-md ol ol { list-style: lower-alpha; }
.pv-md ol ol ol { list-style: lower-roman; }
.pv-md ul ul { list-style: circle; }
.pv-md ul ul ul { list-style: square; }
.pv-md li > ul, .pv-md li > ol { margin: 2px 0 2px; padding-left: 22px; }

/* 今天面板里的「共享 PMO」整组压成浅灰（用户 2026-09-10）：那是别人的活儿，看得见就行，不该跟自己的抢眼 */
.pv-cal-brief-kind.k-shared-task, .pv-cal-brief-kind.k-shared-chore {
  background: var(--pv-bg); color: var(--pv-text); font-weight: 600;
  box-shadow: inset 0 0 0 1px var(--pv-border);
}   /* 原来是浅灰字，在浅灰底上几乎看不见（用户 2026-09-24） */
.pv-cal-brief-row.row-shared_task .pv-cal-brief-item { color: var(--pv-text-soft); }
.pv-cal-brief-row.row-shared_task .pv-cal-brief-item.is-over { color: var(--pv-danger); }   /* 逾期的照样红（用户 2026-09-10） */
.pv-cal-brief-row.row-shared_task .pv-cal-by { color: var(--pv-text-faint); }

/* 主人手记抽屉（用户 2026-09-10）：标题框、正文编辑器、底部三颗按钮统一 13.5px；删除按钮浅红底、宽一点 */
.pv-drawer.pv-diary-dialog .el-textarea__inner { font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; }
.pv-drawer.pv-diary-dialog .pv-drawer-foot .el-button--small { font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-btn-danger-soft.el-button { background: var(--pv-danger-soft, #FEECEC); border-color: var(--pv-danger-soft, #FEECEC); color: var(--pv-danger); padding: 0 22px; }
.pv-btn-danger-soft.el-button:hover { background: var(--pv-danger); border-color: var(--pv-danger); color: #fff; }
.pv-review-quick { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0 2px; }
/* 快捷片跟抽屉里其它小控件一个尺寸（用户 2026-09-10：15px 的片在这儿太大） */
.pv-review-quick .pv-chip-opt { font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 2px 10px; line-height: 18px; }

/* 卡片抬头：日期一行（右边给 ⋯ 留位），分类标签自己一行换行排（用户 2026-09-10） */
.pv-gt-card .pv-gt-date { padding-right: 34px; }
.pv-gt-cats { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; padding-right: 34px; }
.pv-gt-cats .pv-gt-review { height: 22px; }   /* 跟旁边的分类签同高（用户 2026-09-23） */

/* 时间轴右栏顶行：左边是外面塞进来的筛选片，右端一句操作提示 */
.pv-gt-topline { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.pv-gt-topline > :first-child { flex: 1; min-width: 0; }
.pv-gt-hintline { display: flex; justify-content: flex-end; margin: -10px 0 8px; }   /* 贴着上面那排按钮（用户 2026-09-22） */
.pv-gt-hint { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 26px; white-space: nowrap; }

/* 特殊标签（用户 2026-09-10）：贴在正文第一行前面的小签，跟那行字同高；三个预设各一色，自己写的灰蓝 */
.pv-gt-flag { display: inline-block; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 19px; height: 19px; padding: 0 7px; border-radius: 999px; margin-right: 6px; vertical-align: 1px; color: #fff; font-weight: 600; white-space: nowrap; }
.pv-gt-flag.flag-break { background: var(--pv-primary); }
.pv-gt-flag.flag-important { background: var(--pv-danger); }
.pv-gt-flag.flag-happy { background: #2E7D46; }
.pv-gt-flag.flag-custom { background: #5B6FB8; }
.pv-flag-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.pv-flag-row .pv-chip-opt { font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 2px 10px; line-height: 18px; }
.pv-flag-row .pv-flag-custom { width: 140px; }
.pv-flag-row .pv-flag-custom .el-input__inner { height: 24px; line-height: 24px; font-size: calc(12px + var(--pv-fz-add, 0px)); }

/* ---------- 里程碑 = 阶段成果（用户 2026-09-10）：成果文档图标 + 子任务列表 + 进度 ---------- */
.pv-rail-doc { display: inline-flex; vertical-align: middle; margin-left: 6px; }
.pv-rail-doc .pv-doc-ico { width: 20px; height: 20px; border-radius: 5px; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-doc-ico.sm { width: 18px; height: 18px; border-radius: 5px; font-size: calc(11px + var(--pv-fz-add, 0px)); }
.pv-rail-subs { margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--pv-border); cursor: default; }
/* 进度照飞书（用户 2026-09-21）：「0 / 1」在前，后面一小段 110px 的粗胶囊条，不占满整行 */
.pv-rail-prog { display: flex; align-items: center; justify-content: flex-start; gap: 10px; margin: 2px 10px 8px; }
.pv-rail-prog-bar { order: 1; flex: 0 0 110px; height: 10px; border-radius: 5px; background: var(--pv-bg); overflow: hidden; }
.pv-rail-prog-n { order: 0; }
.pv-rail-prog-bar i { display: block; height: 100%; background: #2E7D46; border-radius: 5px; transition: width .2s; }
.pv-rail-prog-n { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-rail-sub { display: flex; align-items: center; gap: 10px; min-width: 0; min-height: 32px; padding: 3px 10px; font-size: calc(13px + var(--pv-fz-add, 0px)); }   /* 一行 32 高、留 10 边（用户 2026-09-21） */   /* 左右留 10：输入行的灰底不用外扩也不贴边，圆圈跟它对齐（用户 2026-09-21） */
.pv-rail-sub .pv-tc-check { width: 16px; height: 16px; font-size: calc(10px + var(--pv-fz-add, 0px)); flex: none; }
.pv-rail-sub-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); cursor: pointer; }
.pv-rail-sub-title:hover { color: var(--pv-primary-dark); }
/* 子任务行尾的 ✕：悬停才露（手机一直在） */
.pv-rail-sub-del { flex: none; opacity: 0; transition: opacity .12s; }
.pv-rail-sub:hover .pv-rail-sub-del { opacity: 1; }
@media (hover: none) { .pv-rail-sub-del { opacity: .6; } }
.pv-rail-sub.done .pv-rail-sub-title { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-rail-sub-due { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-rail-sub-due.now, .pv-rail-sub-due.over { color: var(--pv-danger); font-weight: 600; }
.pv-rail-sub-who { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-rail-sub-add { border: 1px dashed var(--pv-border); background: none; color: var(--pv-text-soft); border-radius: 6px; padding: 3px 10px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); cursor: pointer; font-family: inherit; white-space: nowrap; flex-shrink: 0; }   /* 跟旁边的「标记完成」同高同圆角 */
.pv-rail-sub-add:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
/* 任务卡上的「◆ 里程碑名」小签 */
.pv-task-kind.k-mile-tag { background: #EEF3FF; color: #2B5CD9; display: inline-flex; align-items: center; gap: 3px; max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 飞书文档板块字号统一（用户 2026-09-10）：标题 13.5、其余小字一律 12 */
.pv-doc-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-doc-kind, .pv-doc-due { font-size: calc(12px + var(--pv-fz-add, 0px)); }

/* 任务抽屉里的按钮统一（用户 2026-09-10）：全部照「记一笔」那颗——28px 高、12px 字、左右 12px 内边距；
   类型 / 优先级那两排单选按钮、延期表单、同步到勤为径、底部取消 / 保存都算。手机上的放大规则在这儿不生效。 */
.pv-drawer .el-button--mini, .pv-drawer .el-button--small,
.pv-drawer .el-button--mini.is-round, .pv-drawer .el-button--small.is-round {
  font-size: calc(13px + var(--pv-fz-add, 0px)); height: 28px; line-height: 26px; padding: 0 12px;   /* 字 13，跟弹窗底部、mini 一样（用户 2026-09-20） */
}
.pv-drawer .el-radio-button__inner {
  font-size: calc(12px + var(--pv-fz-add, 0px)); height: 28px; line-height: 26px; padding: 0 12px;
}
.pv-drawer .pv-chip-opt { font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 2px 10px; line-height: 18px; }

/* 日历外框永远不宽过它的容器（周视图七列必须全在视口里） */
.pv-cal-wrap { min-width: 0; max-width: 100%; }

/* 今天面板买菜那组：一家超市一行，后面淡灰「· N 样」 */
.pv-cal-brief-store { display: inline; }   /* 只包住文字：block 会撑满整列，悬停下划线拉到列尾（用户 2026-09-10） */
.pv-cal-brief-store-n { color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); }

/* 新建子项目弹窗里「放在 ×× 下面」那一行的项目名 */
.pv-pmo-parent-of { font-weight: 600; color: var(--pv-text); }

/* ===== 评论里 @ 人（用户 2026-09-10） ===== */
/* 编辑器里敲 @ 弹出来的名单：贴在输入框底下，不算光标位置（textarea 里算光标坐标要自己量字，
   不值得）；名单短、就那几个人，贴底下一样顺手 */
.pv-mde-mention {
  position: absolute; left: 0; top: 100%; margin-top: 4px; z-index: 30; min-width: 160px;
  background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0,0,0,.08); padding: 4px;
}
.pv-mde-mention button {
  display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  border: none; background: none; font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 500;
  padding: 5px 8px; border-radius: 6px; cursor: pointer; color: var(--pv-text); white-space: nowrap;
}
.pv-mde-mention button:hover, .pv-mde-mention button.on { background: var(--pv-bg); }
.pv-mde-mention .pv-pmo-face { width: 20px; height: 20px; font-size: calc(11px + var(--pv-fz-add, 0px)); }
.pv-mde-mention-empty { padding: 5px 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 正文里被 @ 的名字：一枚淡蓝小签，跟「回复 @谁」那行区分开（那是元信息，这是正文里点名） */
.pv-mention { color: var(--pv-info-text); background: var(--pv-info-soft); border-radius: 4px; padding: 0 4px; font-weight: 500; }

/* 月历「+N」：能点（右边那张牌换成这一天），悬停变主色 */
.pv-cal-more.is-link { cursor: pointer; }
.pv-cal-more.is-link:hover { color: var(--pv-primary-dark); }
.pv-cal-cell { cursor: pointer; }
button.pv-cal-daybadge { border: none; font-family: inherit; cursor: pointer; }
button.pv-cal-daybadge:hover { filter: brightness(.95); }

/* ===== 同步设置面板（议程页顶上，只读 + 探活）===== */
.pv-sync-body { display: grid; grid-template-columns: 170px 1fr; gap: 0; min-height: 300px; }
.pv-sync-list { border-right: 1px solid var(--pv-border); padding-right: 12px; display: flex; flex-direction: column; gap: 4px; }
.pv-sync-item {
  display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  border: none; background: none; font-family: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text);
  padding: 8px 10px; border-radius: var(--pv-radius-sm); cursor: pointer; white-space: nowrap;
}
.pv-sync-item:hover { background: var(--pv-bg); }
.pv-sync-item.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-sync-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: #c7cad4; }
.pv-sync-dot.ok { background: var(--pv-success); }
.pv-sync-dot.lg { width: 10px; height: 10px; }
.pv-sync-temp {
  flex: none; margin-left: auto; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 16px; padding: 0 6px; font-weight: 500;
  border: 1px solid var(--pv-border); border-radius: 4px; color: var(--pv-text-soft); white-space: nowrap;
}
.pv-sync-main { padding-left: 18px; min-width: 0; display: flex; flex-direction: column; gap: 18px; }
.pv-sync-lab { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .04em; color: var(--pv-text-soft); margin-bottom: 6px; }
.pv-sync-row { display: flex; align-items: center; gap: 8px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-sync-ver { margin-left: 6px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-sync-bad { color: var(--pv-text-soft); }
.pv-sync-btn {
  margin-left: auto; border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft);
  border-radius: 6px; padding: 3px 10px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); cursor: pointer; font-family: inherit; white-space: nowrap; flex-shrink: 0;
}
.pv-sync-btn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-sync-hint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.6; margin-top: 4px; }
.pv-sync-nums { display: flex; gap: 22px; margin-top: 8px; flex-wrap: wrap; }
.pv-sync-num { display: flex; flex-direction: column; gap: 1px; }
.pv-sync-num b { font-size: 20px; font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; line-height: 1.2; }
.pv-sync-num span { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-sync-err { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-danger-text); margin-top: 6px; }
@media (max-width: 640px) {
  .pv-sync-body { grid-template-columns: 1fr; }
  .pv-sync-list { border-right: none; border-bottom: 1px solid var(--pv-border); padding: 0 0 8px; flex-direction: row; }
  .pv-sync-main { padding-left: 0; padding-top: 12px; }
}

/* ===== 财务状况页：借项目管理的左栏骨架（views-finance.js）===== */
/* 项目管理那套在宽屏还有第四列「跳到」；这页没有，三列到底 */
.pv-pmo-layout.pv-fin-layout { grid-template-columns: auto minmax(0, 1fr); column-gap: 20px; }   /* 左栏是 <pv-rail>，宽度它自己定（默认 148） */
.pv-pmo-layout.pv-fin-layout .pv-pmo-grip { display: none; }   /* 分割线由左栏自己的 border-right 画（跟别的页一样），不用拖宽把手 */
@media (max-width: 860px) { .pv-pmo-layout.pv-fin-layout { grid-template-columns: 1fr; } }
.pv-fin-mod-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 0 0 6px; }
.pv-fin-mod-head h3 { margin: 0; font-size: 16px; }
.pv-relay .pv-stg-search { margin-top: 6px; }
/* 「消费分析」那格嵌的是 embedded 的空间页：它自带 .pv-page 的外边距和最大宽，在这一栏里不要 */
.pv-fin-layout .pv-pmo-main > .pv-page { padding: 0 0 48px; max-width: none; margin: 0; }

/* ===== <pv-side-nav>：全站左栏「分类 / 筛选 / 模块」那一列的唯一组件（用户 2026-09-11）=====
   1:1 照购物清单那列：小标题 12px 淡灰；条目 14px、平时不铺底、悬停浅灰、选中主色浅底 + 主色深字；
   右边计数 12.5px 粗、65% 不透明。项目管理那棵树（要建文件夹、拖拽）不走这里。 */
.pv-snav { display: flex; flex-direction: column; gap: var(--pv-nav-gap); min-width: 0; }
.pv-snav-title {
  font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; letter-spacing: .04em; color: var(--pv-text-faint);
  padding: 0 4px; margin-bottom: 8px;
}
.pv-snav-title.sub { margin: 6px 0 2px; }
/* 分割线（{divider: true}）：把一列里两拨不同性质的条目隔开；手机上这一列横着排，竖线代替 */
.pv-snav-div { flex: none; height: 1px; margin: 8px 4px; background: var(--pv-border); }
.pv-snav-item {
  display: flex; align-items: center; gap: 7px; width: 100%; min-width: 0; text-align: left;
  border: none; background: none; color: var(--pv-text-soft); font: inherit;
  font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 400; padding: 5px 10px 5px 18px; position: relative;   /* 左边留 18：三角跟名字之间要有口气（用户 2026-09-18） */
  border-radius: var(--pv-radius-sm); cursor: pointer; white-space: nowrap; overflow: hidden;
}
.pv-snav-item:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-snav-item.active { background: var(--pv-brand-soft); color: var(--pv-brand-dark); }
.pv-snav-ico { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1; flex-shrink: 0; }
.pv-snav-name { min-width: 0; flex: 0 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }   /* 不撑满：星标紧跟名字，计数靠 margin-left:auto 自己靠右 */
.pv-snav-n { margin-left: auto; flex: none; font-weight: 700; opacity: .65; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-variant-numeric: tabular-nums; }
.pv-snav-n.up { color: var(--pv-success); opacity: 1; }
.pv-snav-n.down { color: var(--pv-danger); opacity: 1; }
/* 那棵树里的头像大一点（用户 2026-09-23）；不加描边 */
.pv-snav-face { flex: none; width: 26px; height: 26px; border-radius: 50%; object-fit: cover; background: var(--pv-bg); }
.pv-snav-face.is-letter { display: inline-flex; align-items: center; justify-content: center; color: #fff; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600; }
/* 树：二三级往右缩、缩进处一道竖线（跟主人手记原来那棵一样）；三角只管折叠 */
.pv-snav-item.d1 { font-size: calc(13px + var(--pv-fz-add, 0px)); margin-left: 24px; width: calc(100% - 24px); }
.pv-snav-item.d2 { font-size: calc(12.5px + var(--pv-fz-add, 0px)); margin-left: 40px; width: calc(100% - 40px); }
.pv-snav-item.d1::before, .pv-snav-item.d2::before {
  content: ""; position: absolute; left: -12px; top: calc(var(--pv-nav-gap) * -1); bottom: 0;
  border-left: 2px solid var(--pv-border);
}
.pv-snav-item.d2::after { content: ""; position: absolute; left: -12px; top: 50%; width: 8px; border-top: 2px solid var(--pv-border); }
.pv-snav-item.active::before, .pv-snav-item.active::after { border-color: var(--pv-brand); }
.pv-snav-item.d1, .pv-snav-item.d2 { overflow: visible; }
/* 折叠三角挂在条目左边的留白里（绝对定位），不占名字前面的位置：这样带树的那一列（主人手记）
   名字也从 10px 起，跟别的页一样，不会整列往右挪一截（用户 2026-09-11） */
.pv-snav-tri {
  /* 放在条目自己 18px 的左内边距里（left:3 / 宽 12）：挂到条目外面会被滚动容器裁掉（日记本那列就看不见三角） */
  position: absolute; left: 3px; top: 50%; transform: translateY(-50%);
  width: 12px; height: 18px; display: grid; place-items: center;
  cursor: pointer; color: var(--pv-text-faint); border-radius: 4px;
}
.pv-snav-item.has-kids { overflow: visible; }
.pv-snav-tri:hover { background: var(--pv-border); color: var(--pv-text); }
.pv-snav-tri::before {
  content: ""; border: 4px solid transparent; border-left: 5px solid currentColor; border-right-width: 0;
  transform: translateX(1px); transition: transform .15s;
}
.pv-snav-tri.open::before { transform: rotate(90deg) translateX(1px); }
.pv-snav-tri.ph { display: none; }
/* 壳里已经有间距 / 吸顶等布局的（.pv-wl-side / .pv-fold-side / .pv-home-rail / .pv-gt-side / .pv-stock-side），条目照旧 */
.pv-home-rail .pv-snav-title { padding-left: 4px; }
@media (max-width: 860px) {
  /* 手机：一列躺平成一排可横滚的小片，小标题和树的缩进都不要 */
  /* Let's connect 的圈子栏在手机上是从右边拉出来的面板（.pv-soc-right，用户 2026-10-29），里头那棵树照电脑排、不躺平——这几条都绕开它 */
  .pv-snav:not(.pv-soc-right *) { flex-direction: row; gap: 6px; overflow-x: auto; padding-bottom: 2px; scrollbar-width: none; }   /* 横滚条不画（用户 2026-10-29） */
  .pv-snav:not(.pv-soc-right *)::-webkit-scrollbar { display: none; width: 0; height: 0; }
  .pv-snav-div:not(.pv-soc-right *) { width: 1px; height: 20px; margin: 0 4px; align-self: center; }
  .pv-snav-title:not(.pv-soc-right *) { display: none; }
  .pv-snav-item:not(.pv-soc-right *), .pv-snav-item.d1:not(.pv-soc-right *), .pv-snav-item.d2:not(.pv-soc-right *) { width: auto; flex: none; margin-left: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); border-radius: var(--pv-radius-pill); padding: 6px 12px; }
  .pv-snav-item:not(.pv-soc-right *)::before, .pv-snav-item:not(.pv-soc-right *)::after, .pv-snav-tri:not(.pv-soc-right *) { display: none; }
}

/* ===== 左栏（分类 / 筛选 / 模块那列）的外框统一（用户 2026-09-11）=====
   以购物清单那列为准：列宽 148px；列内 padding 上 = 右边内容的上边距、右 14px、下 14px、左 0；
   右边一条 1px 竖线；线到内容 20px。财务状况原来外层 14 + 列内 14 叠了两层，标题比内容低一截，就是这条没统一。 */
.pv-fold-layout { grid-template-columns: 148px minmax(0, 1fr); gap: 20px; }
.pv-fold-side { padding: 14px 14px 14px 0; margin-right: 0; }
.pv-fold-main .pv-home-rail, .pv-page.pv-sp .pv-home-rail { width: 148px; padding: 14px 14px 14px 0; margin-right: 0; }
.pv-gt-layout.has-side { gap: 20px; }
.pv-gt-side { padding: 0 14px 14px 0; border-right: 1px solid var(--pv-border); }
.pv-stock.split { grid-template-columns: auto minmax(0, 1fr); gap: 0; }   /* 左栏是 <pv-rail>，列宽跟着它（原来钉死 148 + 20 间距，拖宽只动线不动栏——用户 2026-10-30） */
.pv-stock-side { padding: 14px 14px 14px 0; margin-right: 0; }
.pv-fin-layout .pv-pmo-side { padding: 0 14px 14px 0; border-right: 1px solid var(--pv-border); min-height: 0; overflow-y: auto; }   /* 顶栏钉住后左栏自己滚（用户 2026-09-13） */
@media (max-width: 860px) {
  .pv-gt-side, .pv-stock-side, .pv-fin-layout .pv-pmo-side { border-right: none; padding: 0 0 8px; }
}

/* 从日程 / 铃铛跳到某条评论：滚到它并闪一下底色（用户 2026-09-11） */
.pv-pmo-log, .pv-pmo-log-reply { scroll-margin-top: 90px; }
@keyframes pv-log-flash { 0%, 35% { background: var(--pv-primary-soft); } 100% { background: transparent; } }
.pv-pmo-log-flash { animation: pv-log-flash 2.4s ease-out; border-radius: 8px; }

/* ===== 资产状况（assets-view.js）===== */
.pv-fin-mod-link { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-primary-dark); cursor: pointer; }
.pv-as { display: flex; flex-direction: column; gap: 14px; padding-bottom: 40px; }
.pv-as-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.pv-as-kpis { display: grid; grid-template-columns: 1fr 1fr 1.25fr 1.6fr; gap: 12px; align-items: stretch; }   /* 两张占比条的卡宽一点（美元占比 2026-09-20 也改成条了）；四张永远等高（用户 2026-09-14） */
.pv-as-kpi { position: relative; }
/* 悬停看背后的数：一张小浮层从卡底下拉出来，一行「说明 … 数字」 */
.pv-as-tip {
  display: none; position: absolute; left: 0; top: calc(100% + 6px); z-index: 30; width: max-content; min-width: 280px; max-width: min(620px, calc(100vw - 40px));
  background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  box-shadow: 0 8px 24px rgba(15, 23, 42, .12); padding: 10px 12px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
}
.pv-as-kpi:hover .pv-as-tip { display: block; }
.pv-as-kpi:last-child .pv-as-tip { left: auto; right: 0; }
.pv-as-tip .t { font-weight: 600; color: var(--pv-text); margin-bottom: 6px; }
/* 一行两列：左边说明不许被挤（用户 2026-09-11：「现金」被数字盖住只剩一个字），右边数字靠右、放不下就换行 */
.pv-as-tip > div:not(.t) { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 0 14px; align-items: start; line-height: 20px; }
.pv-as-tip > div > span { display: inline-flex; align-items: center; white-space: nowrap; max-width: 220px; overflow: hidden; text-overflow: ellipsis; }
.pv-as-tip > div > b { font-weight: 600; color: var(--pv-text); font-variant-numeric: tabular-nums; text-align: right; white-space: normal; }
.pv-as-tip > div.sub { padding-left: 10px; color: var(--pv-text-faint); }
.pv-as-tip > div.sub > b { font-weight: 400; color: var(--pv-text-soft); }
.pv-as-tip em { font-style: normal; font-weight: 400; color: var(--pv-text-faint); }
.pv-as-tip .up { color: var(--pv-success); } .pv-as-tip .down { color: var(--pv-danger); }
/* 数字排成列的浮层（占比两张卡，用户 2026-09-30）：名字 | 数字 × N | 目标，一列一列对齐；浮层宽按内容来、不跟卡的宽度走。
   名字列放不下就省略号（title 里有全名），账户行的金额横跨到最右一列 */
/* （下面都写成 .pv-as-tip > .pv-as-tipgrid：要压过上面 .pv-as-tip > div:not(.t) 那条老规则） */
.pv-as-tip > .pv-as-tipgrid { display: grid; gap: 0 12px; align-items: baseline; line-height: 20px; }
.pv-as-tip > .pv-as-tipgrid.cols3 { grid-template-columns: minmax(0, max-content) max-content max-content max-content; }
.pv-as-tip > .pv-as-tipgrid.cols4 { grid-template-columns: minmax(0, max-content) max-content max-content max-content max-content; }
.pv-as-tip > .pv-as-tipgrid > span { display: block; min-width: 0; max-width: 300px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-as-tip > .pv-as-tipgrid > span > .pv-as-catdot { vertical-align: 0; }
.pv-as-tip > .pv-as-tipgrid > b { font-weight: 600; color: var(--pv-text); font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
.pv-as-tip > .pv-as-tipgrid > em { white-space: nowrap; text-align: right; }
.pv-as-tip > .pv-as-tipgrid > .sub { color: var(--pv-text-faint); }
.pv-as-tip > .pv-as-tipgrid > span.sub { padding-left: 10px; }
.pv-as-tip > .pv-as-tipgrid > b.sub { font-weight: 400; color: var(--pv-text-soft); }
.pv-as-tip > .pv-as-tipgrid > b.rest { grid-column: 2 / -1; }
/* 分类行和账户行之间留一点气 */
.pv-as-tip > .pv-as-tipgrid > .gap { grid-column: 1 / -1; height: 4px; }
/* 自选怎么算的那一行小字：横跨整行、可以换行 */
.pv-as-tip > .pv-as-tipgrid > span.note { grid-column: 1 / -1; max-width: none; white-space: normal; margin-top: 2px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 16px; color: var(--pv-text-faint); }
/* 数字卡三段 k（标签）/ v（数字）/ s（底下一行说明）：s 钉在卡底，几张卡并排时说明行齐平（用户 2026-09-11） */
.pv-as-kpi { border: 1px solid var(--pv-border); border-radius: var(--pv-radius); padding: 12px 14px; background: var(--pv-surface); min-width: 0; display: flex; flex-direction: column; }
.pv-as-kpi .k { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-as-kpi .v { font-size: 22px; font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; line-height: 1.2; white-space: nowrap; }
.pv-as-kpi .v.small { font-size: 17px; }
.pv-as-kpi .s { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: auto; padding-top: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-as-kpi .v { min-height: 30px; display: flex; align-items: center; }   /* 小一号的数字也占同样的高度，s 才齐 */
/* 主按钮穿次按钮的壳：同高同字号同圆角，只换成主色实底 */
.pv-pmo-secbtn.primary { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; font-weight: 600; }
.pv-pmo-secbtn.primary:hover { background: var(--pv-primary-dark); border-color: var(--pv-primary-dark); color: #fff; }
.pv-as-kpi .up { color: var(--pv-success); } .pv-as-kpi .down { color: var(--pv-danger); }
.pv-as-card { border: 1px solid var(--pv-border); border-radius: var(--pv-radius); padding: 12px 14px 10px; background: var(--pv-surface); min-width: 0; }
/* 卡头：标题 h4 / 说明 .sub / 右侧工具 .tools 三个并列的孩子，都是 20px 行高、按基线对齐——
   原来说明嵌在标题里、右侧工具再套一层，三样东西三个高度（用户 2026-09-11） */
.pv-as-card-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; line-height: 20px; }
.pv-as-card-head h4 { margin: 0; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); line-height: 20px; }
.pv-as-card-head .sub, .pv-as-head .sub { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); line-height: 20px; }
.pv-as-card-head .tools { margin-left: auto; align-self: center; }
.pv-as-legend { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-soft); display: inline-flex; align-items: center; gap: 4px; line-height: 20px; }
.pv-as-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-left: 8px; }
.pv-as-svg { max-width: 100%; height: 220px; display: block; }   /* 宽度由 JS 按容器给，1:1 不拉伸，坐标轴的字才是真 11px */
.pv-as-svg.short { height: 150px; }
.pv-as-grid { stroke: var(--pv-border); stroke-width: 1; }
.pv-as-lab { font-size: calc(11px + var(--pv-fz-add, 0px)); fill: var(--pv-text-faint); font-family: inherit; }
.pv-as-line { fill: none; stroke: var(--pv-primary); stroke-width: 2; }
.pv-as-area { fill: var(--pv-primary); opacity: .10; }
.pv-as-dot { fill: var(--pv-surface); stroke: var(--pv-primary); stroke-width: 2; cursor: pointer; }
.pv-as-dot.on { fill: var(--pv-primary); }
.pv-as-seg { opacity: .85; } .pv-as-seg:hover { opacity: 1; }
/* 三类的颜色要一眼分得开：蓝 / 绿 / 橙（原来债券用青，跟现金的蓝挨得太近，用户 2026-09-11） */
.c-cash { fill: var(--pv-cat-2); background: var(--pv-cat-2); }
.c-bond { fill: var(--pv-cat-3); background: var(--pv-cat-3); }
.c-stock { fill: var(--pv-cat-1); background: var(--pv-cat-1); }
/* 股票劈成两块（用户 2026-09-30）：定投沿用股票的橙，自选用暖褐——同一族、深一档，一眼看出是股票里的一小块 */
.c-dca { fill: var(--pv-cat-1); background: var(--pv-cat-1); }
.c-pick { fill: var(--pv-cat-8); background: var(--pv-cat-8); }
.pv-as-catdot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; flex: none; }
.pv-as-bars { display: flex; flex-direction: column; gap: 6px; }
.pv-as-bar { display: grid; grid-template-columns: minmax(0, 220px) 1fr 96px 44px; align-items: center; gap: 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-as-bar .n { display: flex; align-items: center; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-as-bar .n em { font-style: normal; color: var(--pv-text-faint); }
.pv-as-bar .track { height: 10px; border-radius: 3px; background: var(--pv-bg); overflow: hidden; }   /* 圆角小一点（用户 2026-09-11） */
.pv-as-bar .track i { display: block; height: 100%; border-radius: 3px; }
.pv-as-bar .a { text-align: right; font-variant-numeric: tabular-nums; color: var(--pv-text); white-space: nowrap; }
.pv-as-bar .p { text-align: right; font-variant-numeric: tabular-nums; color: var(--pv-text-faint); white-space: nowrap; }
.pv-as-table td.note { max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-as-table td.ops { white-space: nowrap; }
.pv-as-form-grid { display: grid; grid-template-columns: minmax(0, 1fr) 150px; gap: 6px 10px; align-items: center; }
.pv-as-form-name { display: flex; align-items: center; min-width: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-as-acc { display: flex; flex-direction: column; gap: 6px; margin-top: 10px; }
.pv-as-acc-row { display: grid; grid-template-columns: minmax(0, 1fr) 92px 92px 84px 44px 26px; gap: 8px; align-items: center; }
.pv-as-acc-row.head { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (max-width: 860px) {
  .pv-as-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pv-as-bar { grid-template-columns: minmax(0, 1fr) 90px; }
  .pv-as-bar .track, .pv-as-bar .p { display: none; }
  .pv-as-acc-row { grid-template-columns: minmax(0, 1fr) 80px 80px; }
  .pv-as-acc-row > :nth-child(n+4) { display: none; }
}
/* 数字卡里的横向占比条：三段按比例分宽，段够宽才写百分数 */
.pv-as-ratio { position: relative; display: flex; width: 100%; height: 22px; border-radius: 6px; overflow: hidden; background: var(--pv-bg); }
.pv-as-ratio i { display: flex; align-items: center; justify-content: center; min-width: 0; font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: #fff; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; }
.pv-as-ratio i + i { border-left: 1px solid rgba(255,255,255,.6); }
/* 目标线：条上一道白虚线、两侧描一圈深色，落在任何一段上都看得见（用户 2026-09-20） */
.pv-as-mark { position: absolute; top: 0; bottom: 0; width: 0; border-left: 2px dashed #fff; box-shadow: -1px 0 0 rgba(15,23,42,.35), 1px 0 0 rgba(15,23,42,.35); pointer-events: none; }
.c-usd { fill: var(--pv-cat-5); background: var(--pv-cat-5); }
.c-rmb { fill: var(--pv-cat-4); background: var(--pv-cat-4); }
.pv-as-ratio-lg { display: inline-flex; align-items: center; gap: 3px; }
.pv-as-ratio-lg i { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-left: 6px; }
.pv-as-ratio-lg i:first-child { margin-left: 0; }
/* 走势图：右上角区间切换、悬停竖线 + 小卡 */
.pv-as-chart { position: relative; }
.pv-as-range button { height: 24px; padding: 0 9px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
.pv-as-guide { stroke: var(--pv-text-faint); stroke-width: 1; stroke-dasharray: 3 3; }
.pv-as-chart-tip {
  position: absolute; top: 44px; z-index: 30; min-width: 200px; pointer-events: none;
  background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm);
  box-shadow: 0 8px 24px rgba(15, 23, 42, .12); padding: 8px 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft);
}
.pv-as-chart-tip .t { font-weight: 600; color: var(--pv-text); margin-bottom: 4px; }
.pv-as-chart-tip > div:not(.t):not(.note) { display: flex; justify-content: space-between; gap: 12px; line-height: 19px; }
.pv-as-chart-tip > div > b { font-weight: 600; color: var(--pv-text); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-as-chart-tip .up { color: var(--pv-success); } .pv-as-chart-tip .down { color: var(--pv-danger); }
.pv-as-chart-tip .note { margin-top: 4px; color: var(--pv-text-faint); max-width: 260px; white-space: normal; }
/* 快照记录表：日期列钉在左边，分组表头，数字靠右 */
.pv-as-table th.sticky, .pv-as-table td.sticky { position: sticky; left: 0; z-index: 2; background: var(--pv-surface); box-shadow: 1px 0 0 var(--pv-border); }
.pv-as-table thead th { background: var(--pv-bg); }
.pv-as-table thead th.sticky { z-index: 3; background: var(--pv-bg); }
.pv-as-table tr.grp th { text-align: center; font-weight: 600; color: var(--pv-text-soft); border-bottom: 1px solid var(--pv-border); }
.pv-as-table th.acct { max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-as-table td.num { text-align: right; font-variant-numeric: tabular-nums; }
.pv-as-table td.num b { font-weight: 600; }
.pv-as-table td.up { color: var(--pv-success); } .pv-as-table td.down { color: var(--pv-danger); }

/* 财务状况页整页顺着滚，不再把页面钉成视口高、里面再滚（用户 2026-09-11：那样底部空一大截）。
   左栏吸顶跟着，右边内容自然长到底。 */
.pv-page.pv-sp.pv-sp-flow { height: auto; overflow: visible; padding-bottom: 20px; }   /* 底下留一点就够（用户 2026-09-11） */
.pv-page.pv-sp.pv-sp-flow > .pv-sp-body { display: block; min-height: 0; overflow: visible; }
.pv-sp-flow .pv-fin-layout { min-height: 0; align-items: start; }
.pv-sp-flow .pv-fin-layout .pv-pmo-main { overflow: visible; padding-right: 0; }
.pv-sp-flow .pv-fin-layout .pv-pmo-main > .pv-page { padding-bottom: 0; }
.pv-sp-flow .pv-fin-layout .pv-pmo-side { position: sticky; top: calc(var(--pv-topbar-h, 0px) + 12px); align-self: start; }
.pv-sp-flow .pv-as { padding-bottom: 0; }
@media (max-width: 860px) { .pv-sp-flow .pv-fin-layout .pv-pmo-side { position: static; } }
/* 快照记录表有两行表头：两行都吸顶时第二行要钉在第一行底下，不然往上滚第二行会盖到第一行上（用户 2026-09-11） */
.pv-as-table thead tr.grp th { top: 0; height: 30px; box-sizing: border-box; }
.pv-as-table thead tr:not(.grp) th { top: 30px; }
.pv-as-table thead tr.grp th.sticky { top: 0; }
.pv-as-wrap { max-height: 70vh; }
/* 消费明细：表格不再自己限高 62vh 里面滚（页面短于一屏时底下就空一截），整页顺着滚（用户 2026-09-11） */
.pv-sp-flow .pv-relay .pv-stg-grid-wrap { max-height: none; }
.pv-sp-flow .pv-relay .pv-stg-pager { margin-bottom: 0; }

/* 数字输入框不要浏览器自带的上下小箭头（用户 2026-09-12：直接输入就行）。全站一律；Element 的 el-input-number 那对 ± 不受影响 */
input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
input[type="number"] { -moz-appearance: textfield; appearance: textfield; }
/* 资产快照草稿（用户 2026-09-12） */
.pv-as-drafts { display: flex; flex-direction: column; gap: 6px; }
.pv-as-draft { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; border: 1px dashed var(--pv-border); border-radius: var(--pv-radius); padding: 8px 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); background: var(--pv-surface); }
.pv-as-draft.mine { border-color: var(--pv-primary); background: var(--pv-primary-soft); }
.pv-as-draft .sub { color: var(--pv-text-soft); }
.pv-as-draft-tag { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .04em; padding: 0 6px; border-radius: 4px; background: var(--pv-warning-soft); color: var(--pv-warning-text); line-height: 18px; }
.pv-as-form-grid { grid-template-columns: minmax(0, 1fr) 150px auto; }
.pv-as-form-name.pending { color: var(--pv-text-faint); }
.pv-as-pend { display: inline-flex; align-items: center; gap: 4px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; cursor: pointer; user-select: none; }
.pv-as-pend.on { color: var(--pv-warning-text); }
.pv-as-pend input { margin: 0; }
/* 提醒条：做完之后的状态签（跟旁边的按钮同高同字号，只是不能点） */
.pv-remind-done { display: inline-flex; align-items: center; height: 26px; padding: 0 10px; border-radius: var(--pv-radius-pill); font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-success-text); background: var(--pv-success-soft); white-space: nowrap; flex-shrink: 0; }

/* 主人手记：外面的 .pv-page 已经给了左右留白（--pv-page-pad），里面的 .pv-work 又给一遍，左边就空出两份（用户 2026-09-12） */
.pv-page-work .pv-work { padding-left: 0; padding-right: 0; max-width: none; }

/* ===== 人脉管理（contacts-view.js）===== */
.pv-ct-row { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 1px solid var(--pv-border); border-radius: var(--pv-radius); background: var(--pv-surface); margin-bottom: 8px; cursor: pointer; transition: border-color .12s, box-shadow .12s; }
.pv-ct-row:hover { border-color: var(--pv-primary); box-shadow: var(--pv-shadow); }
.pv-ct-face { flex: none; width: 34px; height: 34px; border-radius: 50%; color: #fff; font-weight: 700; font-size: calc(15px + var(--pv-fz-add2, 0px)); display: inline-flex; align-items: center; justify-content: center; }
.pv-ct-face.lg { width: 40px; height: 40px; font-size: 17px; }
.pv-ct-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pv-ct-name { font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.pv-ct-sub { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-rel { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 500; padding: 0 6px; border-radius: 4px; line-height: 18px; background: var(--pv-bg); color: var(--pv-text-soft); white-space: nowrap; }
.pv-ct-circle { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 500; padding: 0 6px; border-radius: 4px; line-height: 18px; background: var(--pv-info-soft); color: var(--pv-info-text); white-space: nowrap; }
/* 人的头部（用户 2026-09-20 选的方案 B「事实行」，照 person-head-layout.html 1:1）：头像 56 一列、信息竖三叠、动作靠右 */
.pv-ct-head { display: grid; grid-template-columns: 60px minmax(0, 1fr) auto; gap: 0 14px; align-items: center; }
.pv-ct-head > .pv-ct-acts { align-self: center; }
.pv-ct-face.xl { width: 56px; height: 56px; font-size: 22px; }
.pv-ct-stack { display: flex; flex-direction: column; min-width: 0; }
.pv-ct-stack .l1 { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; min-height: 28px; }
.pv-ct-stack .l1 .pv-pmo-head-name { line-height: 28px; }
.pv-ct-stack .l2 { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-soft); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-stack .l1b { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 8px; min-height: 20px; }   /* 第二行：岁数 + 圈子签（用户 2026-10-29：固定三行，有就各占一行） */
/* 事实行：前面一个图标当标签，一行一种东西 */
.pv-ct-facts { display: flex; flex-direction: column; gap: 3px; margin-top: 6px; }
.pv-ct-fact { display: flex; align-items: center; flex-wrap: wrap; gap: 3px 8px; min-height: 20px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-ct-fact .k { flex: none; width: 16px; text-align: center; font-size: 14px; line-height: 22px; }
/* 相连的人：「关系 名字」，点过去看他；悬停出小铅笔改 / 断开 */
.pv-ct-frel { display: inline-flex; align-items: center; gap: 5px; height: 20px; padding: 0; border: 0; background: none; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 22px; color: var(--pv-text); cursor: pointer; white-space: nowrap; }
/* 关系类型和名字同一个字号，只用字重和颜色分（用户 2026-09-23：原来两截长得不像一句话） */
.pv-ct-frel .t, .pv-ct-frel .n { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-ct-frel .t { color: var(--pv-text-faint); font-weight: 400; }
.pv-ct-frel .pv-ct-face { width: 16px; height: 16px; font-size: 9px; }   /* 相连的人带个小头像（用户 2026-10-06） */
.pv-ct-frel .n { font-weight: 600; color: var(--pv-text); }
.pv-ct-frel:hover .n { text-decoration: underline; }
.pv-ct-frel .x { display: none; color: var(--pv-text-faint); font-size: 12px; }
.pv-ct-frel:hover .x { display: inline; }
.pv-ct-frel .x:hover { color: var(--pv-primary-dark); }
.pv-ct-frel + .pv-ct-frel { margin-left: 6px; }
/* 动作：编辑 / 相连 / ⋯，三颗同高同字号；⋯ 里是 板块 / 删除 */
.pv-ct-acts { display: flex; align-items: center; gap: 8px; height: 28px; }
.pv-ct-acts .pv-pmo-secbtn { height: 28px; }
.pv-ct-more { width: 28px; padding: 0; justify-content: center; font-size: 16px; line-height: 1; }
.pv-ct-more-menu .danger { color: var(--pv-danger); }
@media (min-width: 641px) { .pv-ct-more-menu .mob { display: none; } }
@media (max-width: 640px) {
  .pv-ct-head { grid-template-columns: 48px minmax(0, 1fr) auto; gap: 0 12px; }
  .pv-ct-face.xl { width: 48px; height: 48px; font-size: 19px; }
  .pv-ct-stack .l1 { min-height: 26px; }
  .pv-ct-stack .l1 .pv-pmo-head-name { font-size: 18px; line-height: 26px; }
  .pv-ct-stack .l1 { display: block; }   /* 手机：名字当正文流排，星紧跟在最后一个字后面；名字长了折行星也跟着走，不独占一行（用户 2026-10-29） */
  .pv-ct-stack .l1 .pv-pmo-head-name { display: inline; white-space: normal; overflow: visible; }
  .pv-ct-stack .l1 .pv-ct-star { display: inline-flex; vertical-align: middle; margin-left: 6px; }
  .pv-ct-stack .l2 { white-space: normal; overflow: visible; text-overflow: clip; }   /* 第三行单位整句写完，不省略 */
  .pv-ct-acts .desk, .pv-ct-igrp .gn { display: none; }   /* 编辑 / 相连 收进 ⋯；兴趣不带组名 */
  .pv-ct-facts { margin-top: 6px; }
}
.pv-ct-opt-sub { float: right; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-left: 12px; }
/* 共同兴趣（用户 2026-09-20，照方案页 interests-highlight.html 1:1）：签按组上色（--c 是组的颜色）、名字底下一排、板块「也喜欢的还有谁」、总览的兴趣分布 */
.pv-ct-ichip { display: inline-flex; align-items: center; height: 20px; padding: 0 8px; border-radius: 4px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 500; white-space: nowrap; flex-shrink: 0; background: color-mix(in srgb, var(--c) 13%, #fff); color: var(--c); }
.pv-ct-ichip.shared { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--c) 45%, #fff); }
.pv-ct-ichip .x { margin-left: 5px; font-style: normal; opacity: .7; cursor: pointer; }
/* 兴趣几分（用户 2026-09-20）：签里一个小 ★5；「也喜欢的还有谁」名字后同样一个 */
.pv-ct-ichip .sc { margin-left: 5px; font-size: calc(10.5px + var(--pv-fz-add, 0px)); font-weight: 700; opacity: .85; }
.pv-ct-also .sc2 { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600; color: #E8A33C; }
/* 抽屉里打分：一个兴趣一行，签 + 五颗星 + 几分 */
.pv-ct-scores { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
.pv-ct-score { display: flex; align-items: center; gap: 10px; min-height: 24px; }
.pv-ct-score .stars { display: inline-flex; gap: 2px; }
.pv-ct-score .pv-ct-star { width: 20px; height: 20px; padding: 0; justify-content: center; }
.pv-ct-score .n { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-ichip .x:hover { opacity: 1; }
.pv-ct-igrp { display: inline-flex; align-items: center; gap: 5px; }
.pv-ct-igrp .gn { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-also { display: flex; flex-direction: column; }
/* 顶部对齐（用户 2026-10-15：名字折成两行时，左边的签和右边的「还有 N 人」跟第一行对齐，不悬在中间）：三样都是 24 高的一行 */
.pv-ct-also > div { display: flex; align-items: flex-start; gap: 10px; min-height: 34px; padding-block: 5px; border-bottom: 1px dashed var(--pv-border); }
.pv-ct-also > div:last-child { border-bottom: 0; }
.pv-ct-also .who { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 10px; flex: 1; min-width: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ct-also .who a { display: inline-flex; align-items: center; gap: 5px; height: 24px; color: var(--pv-text); cursor: pointer; white-space: nowrap; }
.pv-ct-also .who a:hover { text-decoration: underline; }
.pv-ct-also .who.dash { color: var(--pv-text-faint); }
.pv-ct-also .r { flex: none; line-height: 24px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-also .who.dash { line-height: 24px; }
.pv-ct-ibar .nm { display: flex; align-items: center; }
.pv-ct-ifilt { display: flex; align-items: center; gap: 8px; margin: 8px 0 2px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
@media (max-width: 640px) {
  .pv-ct-intsec .pv-ct-ibar:nth-child(n+7) { display: none; }   /* 手机上只放前 5 条（第 1 个子元素是标题行） */
}
.pv-ct-when { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-ct-when.due, .pv-ct-kv b.due { color: var(--pv-danger); }
.pv-ct-back { display: inline-block; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); cursor: pointer; margin-bottom: 8px; }
.pv-ct-back:hover { color: var(--pv-primary-dark); }
.pv-ct-mods { margin: -6px 0 14px; padding: 10px 12px; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-sm); background: var(--pv-surface); }
.pv-ct-kv { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px 24px; }
.pv-ct-kv > div { display: flex; justify-content: space-between; gap: 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 22px; border-bottom: 1px dashed var(--pv-border); }
.pv-ct-kv > div > span { color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-kv > div > b { font-weight: 500; color: var(--pv-text); text-align: right; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-kv em { font-style: normal; color: var(--pv-text-faint); }
.pv-ct-logbox { margin-bottom: 10px; }
.pv-ct-log { display: grid; grid-template-columns: 110px minmax(0, 1fr) 24px; gap: 10px; align-items: start; padding: 8px 0; border-top: 1px solid var(--pv-border); }
.pv-ct-log-when { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 20px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-ct-log-text { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text); }
.pv-ct-log .pv-task-op { opacity: 0; } .pv-ct-log:hover .pv-task-op { opacity: 1; }
@media (max-width: 860px) { .pv-ct-kv { grid-template-columns: 1fr; } .pv-ct-log { grid-template-columns: 1fr; gap: 2px; } }
.pv-ct .pv-diary-add { width: 100%; margin-bottom: 8px; }   /* 只有右栏顶的「加一个人」整宽；礼物那几页的「登记入库 / 加一个点子」只占自己的宽（用户 2026-09-20，原来这条把它们都撑满了） */
.pv-pmo-hit .pv-ct-face { width: 26px; height: 26px; font-size: calc(12px + var(--pv-fz-add, 0px)); margin-right: 8px; }
/* 人脉 · 配置圈子（用户 2026-09-13） */
.pv-ct-cfg-link { display: inline-flex; align-items: center; gap: 4px; margin-top: 10px; padding: 0; border: 0; background: none; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); cursor: pointer; white-space: nowrap; }
.pv-ct-cfg-link:hover { color: var(--pv-text); }
.pv-ct-cfg-hint { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin: -6px 0 10px; }
.pv-ct-cfg-row { display: flex; align-items: center; gap: 2px; height: 36px; border-bottom: 1px solid var(--pv-border); }
.pv-ct-cfg-name { flex: 1; min-width: 0; text-align: left; padding: 4px 6px; border: 0; background: none; font: inherit; color: var(--pv-text); border-radius: 6px; cursor: text; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-cfg-name:hover { background: var(--pv-bg); }
.pv-ct-cfg-input { flex: 1; min-width: 0; height: 26px; padding: 0 6px; border: 1px solid var(--pv-brand); border-radius: 6px; font: inherit; outline: 0; }
.pv-ct-cfg-n { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; margin-right: 6px; }
.pv-ct-cfg-ib { width: 26px; height: 26px; border: 0; background: none; border-radius: 6px; color: var(--pv-text-faint); cursor: pointer; flex: none; }
.pv-ct-cfg-ib:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-ct-cfg-ib:disabled { opacity: .3; cursor: default; background: none; }
.pv-ct-cfg-ib.danger:hover { color: var(--pv-danger); }
.pv-ct-cfg-add { display: flex; gap: 8px; margin-top: 12px; }
.pv-ct-qi { margin-top: 8px; }                        /* 加人抽屉里的「添新兴趣」行（用户 2026-10-28） */
.pv-ct-qi > .el-input { flex: 1 1 auto; min-width: 0; }
.pv-ct-qi > .g { flex: 0 0 118px; }
.pv-ct-qi > .el-button { flex: none; }
/* 设置里名单底下那行「输入框 + 添加」（圈子 / 礼品节点 / 礼物的地点 · 年龄段 · 分类）：32 高、13.5 字，手机上也不放大
   （用户 2026-09-18：太高、字太大）。写在全站手机放大规则后面、特异性更高，两边都压得住 */
.pv-ct-cfg-add .el-input--small .el-input__inner, .pv-ct-cfg-add .el-select--small .el-input__inner {
  height: 32px; line-height: 32px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); border-radius: 6px; }
.pv-ct-cfg-add .el-button--small, .pv-ct-cfg-add .el-button--small.is-round {
  height: 32px; line-height: 30px; padding: 0 14px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); border-radius: 6px; }
.pv-ct-cfg-addbox .el-input--small .el-input__inner, .pv-ct-cfg-addbox .el-select--small .el-input__inner,
.pv-ct-cfg-addbox .el-date-editor--small.el-input .el-input__inner { height: 32px; line-height: 32px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }

/* ---------- 分类管理（spend-cats.js）：0.9.46x 写了页面没挂样式（BUG-013），2026-09-13 补上 ---------- */
.pv-sc-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.pv-sc-head .sub, .pv-sc-sec-t .sub { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-weight: 400; margin-left: 4px; }
.pv-sc-head { --pv-search-h: 28px; }   /* 旁边的分段是 26 + 两条边 = 28，搜索框跟它一样高 */
.pv-sc-search { margin-left: auto; }
.pv-sc-sec { margin-bottom: 22px; }
.pv-sc-sec-t { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; margin-bottom: 4px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.pv-sc-row { display: grid; grid-template-columns: minmax(180px, 1fr) 70px auto; align-items: center; gap: 10px; min-height: 34px; border-bottom: 1px solid var(--pv-border); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sc-row.head { min-height: 26px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sc-row .name { min-width: 0; }
.pv-sc-row .n { text-align: right; font-variant-numeric: tabular-nums; cursor: pointer; color: var(--pv-text); }
.pv-sc-row .n:hover { color: var(--pv-primary-dark); }
.pv-sc-row .n.faint { color: var(--pv-text-faint); cursor: default; }
.pv-sc-row .ops { display: inline-flex; align-items: center; gap: 10px; justify-content: flex-end; min-width: 220px; }
.pv-sc-cell { display: inline-block; padding: 3px 6px; border-radius: 6px; cursor: text; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle; }
.pv-sc-cell:hover { background: var(--pv-bg); }
.pv-sc-cell.stray { color: var(--pv-warning-text); cursor: default; }
.pv-sc-cell.faint { color: var(--pv-text-faint); }
.pv-sc-cell.mono { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sc-preview { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 1.7; }
.pv-sc-samples { margin-top: 10px; }
.pv-sc-sample { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 1.7; }
.pv-sc-wrap { max-height: 60vh; }

/* ---------- 月度对账：2026-10-27 改成「这个月的工作台」，样式在文件末尾「月度对账工作台 .pv-wb-*」那段 ---------- */

/* ---------- 固定项（spend-recurring.js） ---------- */
.pv-sr-hint { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 14px; }
.pv-sr-group { margin-bottom: 20px; }
.pv-sr-gt { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; margin-bottom: 4px; display: flex; align-items: center; gap: 6px; }
.pv-sr-row { display: grid; grid-template-columns: minmax(110px, 1.2fr) minmax(130px, 1.4fr) 56px 48px 68px 88px 56px 68px 84px; align-items: center; gap: 8px; min-height: 34px; border-bottom: 1px solid var(--pv-border); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sr-row > span { min-width: 0; }
.pv-sr-row.head { min-height: 26px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sr-row .r { text-align: right; font-variant-numeric: tabular-nums; }
.pv-sr-row .ops { display: inline-flex; gap: 10px; justify-content: flex-end; }
.pv-sr-row .mono { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sr-group.is-off { color: var(--pv-text-faint); }
.pv-sr-add { margin-top: 8px; }
.pv-sr-addrow { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.pv-sr-addrow .w2 { width: 180px; }
.pv-sr-addrow .w1 { width: 100px; }

/* ---------- 商户名录（spend-merchants.js，用户 2026-09-13） ---------- */
.pv-mc-un { margin-bottom: 22px; }
.pv-mc-un-row { display: flex; flex-direction: column; gap: 4px; padding: 8px 0; border-bottom: 1px solid var(--pv-border); }
.pv-mc-un-row .raw { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-mc-un-row .meta { display: flex; gap: 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); flex-wrap: wrap; }
.pv-mc-un-row .ops { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pv-mc-un-row .hint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-success-text); white-space: nowrap; }
.pv-mc-pick { width: 300px; }
.pv-mc-un-empty { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 18px; }
.pv-mc-head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
/* 列表头那颗加号按钮跟旁边的 small 输入框同高同圆角（用户 2026-09-14：原来 21 高、10 圆角，看着像胶囊） */
.pv-mc-add, .pv-sg-add { margin: 0; }   /* 原来靠右、32 高（用户 2026-09-20：统一后放最左、尺寸走全站 .pv-addbtn） */
.pv-mc-head .pv-pmo-secbtn { height: 32px; border-radius: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); padding: 0 12px; }
.pv-mc-head .pv-pmo-secbtn.on { border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-mc-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px; }
.pv-mc-card { text-align: left; border: 1px solid var(--pv-border); border-radius: var(--pv-radius); background: var(--pv-surface); padding: 10px 12px; cursor: pointer; font: inherit; color: var(--pv-text); min-width: 0; display: flex; flex-direction: column; gap: 4px; transition: border-color .12s, box-shadow .12s; }
.pv-mc-card:hover { border-color: var(--pv-primary); box-shadow: var(--pv-shadow); }
.pv-mc-card .nm { font-weight: 600; font-size: calc(14px + var(--pv-fz-add2, 0px)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-mc-card .cat { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-mc-card .cat .sub { margin-left: 4px; }
.pv-mc-card .cat .none { color: var(--pv-warning-text); }
.pv-mc-card .al { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-mc-card .al .ex { margin-left: 6px; font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
.pv-mc-card .rl { display: flex; flex-wrap: wrap; gap: 4px; }
.pv-mc-card .chip, .pv-tx-dup .chip { display: inline-flex; align-items: center; gap: 4px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); padding: 0 7px; height: 20px; border-radius: 10px; background: var(--pv-bg); color: var(--pv-text-faint); white-space: nowrap; border: 0; font-family: inherit; }
.pv-mc-card .ft { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: auto; }
.pv-mc-two { display: flex; gap: 6px; }
.pv-mc-mono .el-input__inner, .pv-mc-mono .el-textarea__inner { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-mc-rule { display: flex; gap: 8px; align-items: center; }
.pv-mc-rule .md { width: 100px; flex: none; }
/* 商户抽屉 · 按条件分类（用户 2026-10-19）：一档 = 几行条件（列 / 比法 / 值）+ 归到哪类 + 档名 */
.pv-mc-var { display: flex; flex-direction: column; gap: 6px; margin-bottom: 12px; padding-bottom: 10px; border-bottom: 1px dashed var(--pv-border); }
.pv-mc-var .pv-mc-rule .half { flex: 1 1 0; min-width: 0; }
.pv-mc-cond .fld { width: 118px; flex: none; }
.pv-mc-cond .op { width: 86px; flex: none; }
.pv-mc-cond .val { flex: 1 1 0; min-width: 0; }
.pv-mc-cond .val.el-date-editor { width: auto; }
.pv-mc-lf.danger { color: var(--pv-danger); }
.pv-mc-lf.danger:hover { border-color: var(--pv-danger); color: var(--pv-danger); }
.pv-mc-var-to { flex: none; width: 16px; text-align: center; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-mc-card .chip.var { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; line-height: 20px; background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
/* 商户抽屉里所有东西一种字体、一种字号、一种高度（用户 2026-09-14）：单等宽字去掉，删除键做成同高方框，「加一条规则」整宽同高 */
.pv-drawer .pv-mc-mono .el-input__inner, .pv-drawer .pv-mc-mono .el-textarea__inner { font-family: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-drawer .pv-ct-cfg-ib { width: var(--pv-dw-h); height: var(--pv-dw-h); border: 1px solid var(--pv-border); border-radius: var(--pv-radius-btn); background: var(--pv-surface); display: inline-flex; align-items: center; justify-content: center; font-size: calc(14px + var(--pv-fz-add2, 0px)); }
.pv-drawer .pv-ct-cfg-ib:hover { background: var(--pv-bg); }
.pv-drawer .pv-mc-addrule { width: 100%; height: var(--pv-dw-h); display: inline-flex; align-items: center; justify-content: center; padding: 0 12px; border-radius: var(--pv-radius-btn); font-size: calc(13.5px + var(--pv-fz-add, 0px)); margin-top: 2px; }
.pv-mc-test { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-danger); margin-top: 6px; min-height: 18px; }
.pv-mc-test.ok { color: var(--pv-success-text); }

/* ---------- 类别 × 子类（spend-cats.js） ---------- */
.pv-tx-filter { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; flex-wrap: wrap; }
.pv-tx-month { width: 130px; }
.pv-tx-acc { width: 150px; }
.pv-tx-body { display: grid; grid-template-columns: 260px minmax(0, 1fr); gap: 20px; align-items: start; }
.pv-tx-cats { display: flex; flex-direction: column; gap: 2px; }
.pv-tx-cat { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) 40px 64px; gap: 6px; align-items: center; text-align: left; border: 0; background: none; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); padding: 6px 8px; border-radius: 6px; cursor: pointer; overflow: hidden; }
.pv-tx-cat:hover { background: var(--pv-bg); }
.pv-tx-cat.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-tx-cat.stray .nm { color: var(--pv-warning-text); }
.pv-tx-cat .nm { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-tx-cat .n, .pv-tx-cat .amt { text-align: right; font-variant-numeric: tabular-nums; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-tx-cat.on .n, .pv-tx-cat.on .amt { color: inherit; }
.pv-tx-cat .bar { position: absolute; left: 8px; bottom: 2px; height: 2px; background: var(--pv-primary); opacity: .35; border-radius: 1px; }
.pv-tx-row { display: grid; grid-template-columns: minmax(150px, 1fr) 50px 80px minmax(120px, 1.2fr) 230px; align-items: center; gap: 10px; min-height: 34px; border-bottom: 1px solid var(--pv-border); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-tx-row > * { min-width: 0; }
.pv-tx-row.head { min-height: 26px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-tx-row .r { text-align: right; font-variant-numeric: tabular-nums; }
.pv-tx-row .n { cursor: pointer; color: var(--pv-text); }
.pv-tx-row .n:hover { color: var(--pv-primary-dark); }
.pv-tx-row .mer { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-tx-row .ops { display: inline-flex; align-items: center; gap: 10px; justify-content: flex-end; }
.pv-tx-sel { width: 180px; }
.pv-tx-dups { margin-top: 22px; }
.pv-tx-dup { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-height: 30px; font-size: calc(13px + var(--pv-fz-add, 0px)); border-bottom: 1px solid var(--pv-border); }
.pv-tx-dup .chip { cursor: pointer; }
.pv-tx-dup .chip:hover { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-tx-dup .chip em { font-style: normal; font-weight: 600; }
@media (max-width: 900px) { .pv-tx-body { grid-template-columns: 1fr; } }

/* ---------- 消费明细分页网格（spend-grid.js，BUG-014） ---------- */
.pv-sg-bar { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
/* .pv-sg-add 跟 .pv-mc-add 一起定在商户名录那组 */
.pv-sg-table td, .pv-sg-table th { vertical-align: middle; }
.pv-sg-table td.r, .pv-sg-table th.r { text-align: right; font-variant-numeric: tabular-nums; }
.pv-sg-table td.raw { max-width: 260px; overflow: hidden; text-overflow: ellipsis; color: var(--pv-text-faint); font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-sg-table .pv-sc-cell { min-width: 40px; }
.pv-sg-table .el-select, .pv-sg-table .el-date-editor { width: 160px; }
.pv-ct-link { color: var(--pv-primary-dark); text-decoration: none; }
.pv-ct-link:hover { text-decoration: underline; }

/* 人脉：左栏「圈子 › 人」树，可拖宽（用户 2026-09-13，先只在这个界面开） */
/* 社交管理三栏：左 模块 / 中 内容 / 右 人员名单（用户 2026-09-13）；1280 起三栏都在，超宽屏跟着铺开 */
.pv-page.pv-sp-wide { max-width: none; }
/* 快乐社交的三栏（用户 2026-09-23）：模块（收窄）→ 内容 → 圈子 › 人。
   圈子那栏试过放中间，还是回到右边；模块列的收窄留着，只影响这一页。 */
/* 用户 2026-10-28（第二遍，稿 3a / 第二轮 2a）：中栏 + 把手 + 右栏拼成一整块——外圈一个 16 圆角，中栏只圆左边两个角、右栏只圆右边两个角、
   把手染成右栏的底色；两种灰在块里直接相接（稿就是这么画的）。两根滚动条都不显示（用户：滚动条在灰块里又长又怪），照样能滚 */
.pv-ct.pv-soc-layout { grid-template-columns: auto minmax(0, 1fr) 8px var(--pv-soc-right-w, 260px); column-gap: 0; align-items: stretch; }   /* 左栏是 <pv-rail>（默认 150） */
.pv-ct .pv-soc-left { margin-right: 8px; }
.pv-ct.pv-soc-layout:not(.solo) .pv-work-scroll { padding: 0; background: var(--pv-ct-canvas); border-radius: 16px 0 0 16px; scrollbar-width: none; }
.pv-ct.pv-soc-layout:not(.solo) .pv-work-scroll::-webkit-scrollbar { display: none; width: 0; height: 0; }
.pv-ct .pv-soc-grip { background: var(--pv-ct-rail); }
.pv-ct .pv-soc-right { scrollbar-width: none; }
.pv-ct .pv-soc-right::-webkit-scrollbar { display: none; width: 0; height: 0; }
.pv-soc-grip { min-height: 200px; }
.pv-soc-left { min-height: 0; overflow-y: auto; padding: 0 14px 14px 0; border-right: 1px solid var(--pv-border); }
/* 右边留 20：内容左边离分割线量出来是 21（把手半宽 5 + 列距 12 + 这里的 4），右边原来是 0，
   「加一个人」直接贴着滚动条（用户 2026-09-28：左右不平衡）。两边留成一样宽 */
.pv-soc-right { min-height: 0; overflow-y: auto; padding: 22px 14px 14px 14px; background: var(--pv-ct-rail); border-radius: 0 16px 16px 0; }   /* 稿 2a：比页面再浅一点的底，跟中间靠底色区分；竖线由把手画、悬停才出 */
.pv-soc-grip::after { background: transparent; }
.pv-soc-grip:hover::after, .pv-soc-grip.on::after { background: var(--pv-primary); }
/* 右栏筛人（稿 1b）：浅灰底无描边的输入框；「加一个人」无边框文字钮 */
.pv-ct-rail-q { width: 100%; height: 32px; margin-bottom: 6px; padding: 0 12px 0 30px; border: 0; border-radius: 8px; background: var(--pv-ct-field); color: var(--pv-text); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); outline: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca1b3' stroke-width='2' stroke-linecap='round'><circle cx='11' cy='11' r='7'/><path d='M20 20l-3.5-3.5'/></svg>"); background-repeat: no-repeat; background-position: 10px center; background-size: 14px 14px; }
.pv-ct-rail-q:focus { box-shadow: 0 0 0 2px var(--pv-primary-soft); }
.pv-ct-rail-q::placeholder { color: var(--pv-text-faint); }
.pv-ct-rail-add { display: inline-flex; align-items: center; gap: 4px; height: 30px; margin-bottom: 6px; padding: 0 6px; border: 0; background: none; color: var(--pv-text-soft); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; border-radius: 6px; }
.pv-ct-rail-add:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-snav-name.has-sub { display: flex; flex-direction: column; line-height: 1.25; white-space: normal; }
.pv-snav-sub { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-soc-main { min-width: 0; }
.pv-soc-nav { display: flex; flex-direction: column; gap: var(--pv-nav-gap); }
@media (max-width: 1180px) { .pv-ct.pv-soc-layout { grid-template-columns: auto minmax(0, 1fr) 8px var(--pv-soc-right-w, 220px); column-gap: 0; } }
/* 礼物 / 配置两个模块不摆右边的圈子那一栏，内容占满（用户 2026-09-28）；手机上本来就是一列，不用管 */
@media (min-width: 861px) { .pv-ct.pv-soc-layout.solo { grid-template-columns: auto minmax(0, 1fr); } }
.pv-soc-burger { display: none; align-items: center; gap: 6px; height: 32px; padding: 0 12px; border: 0; border-radius: var(--pv-radius-pill); background: var(--pv-bg); color: var(--pv-text-soft); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); white-space: nowrap; flex: none; cursor: pointer; }
.pv-soc-burger svg { width: 16px; height: 16px; }
.pv-soc-right-x, .pv-soc-right-scrim { display: none; }   /* 电脑上没有这两样；基础规则放在手机那块前面，手机那块才盖得过（窗口从手机宽拉回电脑宽时面板状态可能还开着，别留一层遮罩） */
/* 手机（用户 2026-10-29）：顶上一排 = 模块小片 + 右边一颗「☰ 圈子」；圈子那栏不再堆在最底下，点 ☰ 从右边拉出来（整棵树、筛人、加一个人都在里面），选了人自动收回 */
@media (max-width: 860px) {
  .pv-ct.pv-soc-layout { display: grid; grid-template-columns: minmax(0, 1fr) auto; row-gap: 14px; column-gap: 8px; align-items: start; }   /* 手机上 .pv-work-body 整体是 block，这页要网格：小片一列、☰ 一列 */
  .pv-ct.pv-soc-layout > .pv-soc-main, .pv-ct.pv-soc-layout > .pv-soc-grip { grid-column: 1 / -1; }
  .pv-soc-left { border: 0; padding: 0; overflow: visible; }
  .pv-soc-grip { display: none; }
  .pv-soc-burger { display: inline-flex; }
  .pv-ct.pv-soc-layout > .pv-soc-right { position: fixed; top: 0; right: 0; bottom: 0; z-index: 1500; width: min(86vw, 340px); padding: 54px 14px 24px; border: 0; border-radius: 0; background: var(--pv-ct-rail); overflow-y: auto;   /* 选择器写长是为了盖过下面「手机上右栏是单独一块」那条 */
                  box-shadow: -8px 0 32px rgba(25, 27, 35, .14); transform: translateX(104%); transition: transform .2s ease; }
  .pv-ct.pv-soc-layout > .pv-soc-right.open { transform: none; }
  .pv-soc-right-x { display: inline-flex; align-items: center; justify-content: center; position: absolute; top: 12px; right: 12px; width: 30px; height: 30px; border: 0; border-radius: 8px; background: var(--pv-bg); color: var(--pv-text-soft); font-size: 14px; cursor: pointer; }
  .pv-soc-right-scrim { display: block; position: fixed; inset: 0; z-index: 1499; background: rgba(25, 27, 35, .35); }
}
.pv-ct .pv-wl-side { border-right: 0; }
.pv-ct .pv-wl-side.pv-ml-side2 { padding-right: 6px; }
.pv-ct .pv-pmo-grip { min-height: 240px; }
.pv-ct-empty { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); padding: 28px 0; }
.pv-ct-sec-meta { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-left: 10px; white-space: nowrap; }
.pv-ct-sec-meta .due { color: var(--pv-danger); }

/* 人脉头像（用户 2026-09-13） */
.pv-ct-face.is-img { object-fit: cover; background: var(--pv-bg); }
/* 头像也能套在圈里（用户 2026-09-23：总览上那几处照片整张铺出来了）——
   别处是 <img class="pv-ct-face is-img"> 自己就是那个圈，总览里是 <span class="pv-ct-face"><img></span>，
   得给里面那张图补上撑满 + 裁圆。 */
.pv-ct-face { overflow: hidden; }
.pv-ct-ov .pv-ct-face { box-shadow: none; }   /* 稿 2a：那圈深色细线去掉 */
.pv-ct-face > img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }
.pv-ct-av { display: flex; align-items: center; gap: 14px; padding: 10px; border: 1px dashed var(--pv-border); border-radius: var(--pv-radius); outline: none; margin-bottom: 10px; cursor: text; }
.pv-ct-av:focus { border-color: var(--pv-primary); box-shadow: 0 0 0 2px var(--pv-primary-soft); }
.pv-ct-av-img { width: 56px; height: 56px; border-radius: 50%; object-fit: cover; flex: none; }
.pv-ct-av .pv-ct-face.lg { width: 56px; height: 56px; font-size: 22px; }
.pv-ct-av-ops { min-width: 0; }
.pv-ct-av-btns { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.pv-ct-av-btns label { cursor: pointer; }
.pv-ct-av-url { margin-bottom: 10px; }

/* ---------- 分类与商户：文件夹式（spend-cats.js，用户 2026-09-13） ---------- */
.pv-fx { display: grid; grid-template-columns: 260px minmax(0, 1fr); gap: 24px; align-items: start; }
.pv-fx-col { min-width: 0; }
.pv-fx-col-t { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-faint); margin-bottom: 6px; display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.pv-fx-col-t .sub { font-weight: 400; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-fx-row { display: flex; align-items: center; gap: 8px; height: 34px; padding: 0 6px 0 10px; border-radius: var(--pv-radius-sm); font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); cursor: pointer; border: 1px solid transparent; }
.pv-fx-row:hover { background: var(--pv-bg); }
.pv-fx-row.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-fx-row.over { border-color: var(--pv-primary); border-style: dashed; background: var(--pv-primary-soft); }
.pv-fx-row.unfiled { color: var(--pv-text-faint); }
.pv-fx-row.file { cursor: grab; user-select: none; }   /* Shift 连选时别把文字选中一片 */
.pv-fx-row.file:active { cursor: grabbing; }
.pv-fx-row > i { flex: none; font-size: calc(15px + var(--pv-fz-add2, 0px)); color: var(--pv-text-faint); }
.pv-fx-row.on > i { color: inherit; }
.pv-fx-row .nm { flex: 0 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }   /* 不撑满：⋯ 紧挨名字（用户 2026-09-13：3440 宽屏满屏找按钮太难受） */
.pv-fx-row .nm.stray { color: var(--pv-warning-text); }
.pv-fx-row .cnt { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-weight: 400; margin-left: auto; }
.pv-fx-row .mer { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 40%; }
.pv-fx-stmt { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }   /* 配置 › 银行账户：每月 N 号出对账单（1.0.33） */
.pv-fx-more { opacity: 0; font-size: 16px; line-height: 1; }
.pv-fx-row:hover .pv-fx-more, .pv-fx-row.on .pv-fx-more { opacity: 1; }
.pv-fx-inp { flex: 1; min-width: 0; height: 26px; padding: 0 6px; border: 1px solid var(--pv-primary); border-radius: 6px; font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); outline: 0; background: var(--pv-surface); }
.pv-fx-add { margin-top: 8px; }
.pv-fx-add .pv-task-addbtn { width: 100%; }
.pv-fx-add .pv-fx-inp { width: 100%; height: 34px; }
.pv-fx-danger { color: var(--pv-danger) !important; }
@media (max-width: 900px) { .pv-fx { grid-template-columns: 1fr; } }

/* ---------- 人脉 · 联系安排：一行一次、横向占满、可展开（用户 2026-09-13） ---------- */
.pv-ct-plans { display: flex; flex-direction: column; }
.pv-ct-plan { border-bottom: 0; }
.pv-ct-plan.is-done { opacity: 1; }
/* 1b（用户 2026-10-28 改版稿）：月份竖在左栏当时间轴（大号月份号 + 「月」，跨年再加年份），右边这个月的各行；组与组之间一条线 */
.pv-ct-plan-head { display: flex; align-items: center; gap: 10px; min-height: 44px; padding: 8px 6px; cursor: pointer; border-radius: 8px; }
.pv-ct-plan-head:hover { background: var(--pv-bg); }
.pv-ct-plan.today > .pv-ct-plan-head { background: color-mix(in srgb, var(--pv-primary-soft) 45%, var(--pv-surface)); }   /* 今天那一行一层淡底 */
/* 勾选圈：对勾 / 叉用 CSS 画，不用字形（Windows 上雅黑的 ✓ 基线不一样，勾不居中） */
.pv-ct-plan-check { flex: none; position: relative; width: 18px; height: 18px; box-sizing: border-box; border-radius: 50%; border: 1.5px solid var(--pv-text-faint); background: none; cursor: pointer; padding: 0; line-height: 0; display: inline-flex; align-items: center; justify-content: center; }
button.pv-ct-plan-check:hover { border-color: var(--pv-primary); background: var(--pv-primary-soft); }
/* 勾过 / 取消过的那颗圈也能点，再点一下放回待办（用户 2026-09-23） */
.pv-ct-plan-check.ok { background: var(--pv-success); border-color: var(--pv-success); }
.pv-ct-plan-check.x { background: var(--pv-text-faint); border-color: var(--pv-text-faint); }
.pv-ct-plan-check.ok::after { content: ""; width: 4px; height: 8px; border: solid #fff; border-width: 0 2px 2px 0; transform: translateY(-1px) rotate(45deg); }
.pv-ct-plan-check.x::before, .pv-ct-plan-check.x::after { content: ""; position: absolute; width: 8px; height: 2px; background: #fff; border-radius: 1px; }
.pv-ct-plan-check.x::before { transform: rotate(45deg); }
.pv-ct-plan-check.x::after { transform: rotate(-45deg); }
button.pv-ct-plan-check.ok:hover, button.pv-ct-plan-check.x:hover { background: none; border-color: var(--pv-text-faint); }
button.pv-ct-plan-check.ok:hover::after { border-color: var(--pv-text-faint); }
button.pv-ct-plan-check.x:hover::before, button.pv-ct-plan-check.x:hover::after { background: var(--pv-text-faint); }
/* 日期：纯文字块，竖排「日」+「周几」；今天是唯一一块实心主色页（写「今天」），过期红字，做完的灰 */
.pv-ct-plan-d { flex: none; width: 40px; height: 44px; display: flex; flex-direction: column; align-items: center; justify-content: center; border-radius: 8px; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-ct-plan-d b { font-size: calc(20px + var(--pv-fz-add, 0px)); font-weight: 800; line-height: 24px; }
.pv-ct-plan-d i { font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 14px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-plan-d.overdue b, .pv-ct-plan-d.overdue i { color: var(--pv-danger); }
.pv-ct-plan-d.today { background: var(--pv-primary); }
.pv-ct-plan-d.today b, .pv-ct-plan-d.today i { color: #fff; }
.pv-ct-plan-d.done b, .pv-ct-plan-d.done i { color: var(--pv-text-faint); }
/* 右边两行：标题（+ 过了 N 天 / 撞了 / 状态签）、类型 · 时间 / 周期 · 人 */
.pv-ct-plan-mid { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.pv-ct-plan-mid .l1 { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pv-ct-plan-mid .l2 { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 0; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); }
.pv-ct-plan-mid .l2 > * + *::before { content: "·"; margin: 0 6px; color: var(--pv-text-faint); }
.pv-ct-plan-mid .l2 .pv-ct-plan-faces { display: inline-flex; align-items: center; gap: 4px; }
.pv-ct-plan-mid .l2 .pv-pmo-face { width: 18px; height: 18px; font-size: calc(10px + var(--pv-fz-add, 0px)); }
.pv-ct-plan-title { flex: 0 1 auto; min-width: 0; font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-plan-title .st { margin-left: 6px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
/* 窄屏（用户 2026-10-28 加了日历页式日期之后标题只剩两三个字）：标题最多折两行，类型小签不占这一行（底下「类型」那一栏有） */
@media (max-width: 640px) {
  .pv-ct-plan-title { white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; line-height: 20px; }
  .pv-ct-plan-head .pv-ct-plan-chip:not(.due) { display: none; }
  .pv-ct-plan-head { gap: 10px; }
  .pv-ct-plan-body { padding-left: 12px; }
}
.pv-ct-plan-when { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; display: inline-flex; align-items: center; gap: 4px; }
.pv-ct-plan.today .pv-ct-plan-when { color: var(--pv-primary-dark); }
.pv-ct-plan.overdue .pv-ct-plan-when { color: var(--pv-danger); }
.pv-ct-plan-chip { font-size: calc(11.5px + var(--pv-fz-add, 0px)); padding: 0 7px; line-height: 18px; border-radius: 9px; background: var(--pv-bg); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-plan-chip.due.today { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }      /* 「今天」「过了 N 天」：原来挂在日期标签里，日期改成小日历页后单独一枚 */
.pv-ct-plan-chip.due.overdue { background: var(--pv-danger-soft); color: var(--pv-danger); font-weight: 600; }
.pv-ct-plan-faces { display: inline-flex; gap: 4px; }
.pv-ct-plan-face { display: inline-flex; }
.pv-ct-plan-n { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; display: inline-flex; align-items: center; gap: 3px; }
.pv-ct-plan-more { opacity: .45; flex: none; font-size: 16px; line-height: 1; }
.pv-ct-plan-head:hover .pv-ct-plan-more { opacity: 1; }
/* 折叠箭头在最左（用户 2026-10-18）：一颗 22 的小钮，只管展开 / 收起；点一行别处是开抽屉 */
.pv-ct-plan-chev { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; margin-left: 0; padding: 0; border: 0; border-radius: 4px; background: none; cursor: pointer;
  color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ct-plan-chev:hover { background: rgba(31, 36, 48, .07); color: var(--pv-text); }
.pv-ct-plan-body { padding: 4px 12px 14px 86px; }   /* 左缩进跟标题对齐：勾 18 + 12 + 日期 44 + 12 */
.pv-ct-plan-note { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text-soft);   /* 2026-10-18：原来 faint 太浅，加深一档 */ margin-bottom: 8px; padding: 2px 10px; border-left: 2px solid var(--pv-border); }   /* 备注：浅灰、小一号、上下不留那么多（用户 2026-09-13） */
.pv-ct-plan-note p { margin: 0 0 2px; }
.pv-ct-sec-meta .today { color: var(--pv-primary-dark); }
.pv-ct-plan-types { display: flex; flex-wrap: wrap; gap: 6px; }
/* 评论区 compact（人页，用户 2026-10-28 稿 3b）：顶上「再看 N 条更早的」；底下平时一行（头像 + 浅灰底占位），点开才是编辑器 + 身份胶囊 */
.pv-cthread-more { display: block; border: 0; background: none; padding: 2px 0 8px; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); cursor: pointer; }
.pv-cthread-more:hover { color: var(--pv-primary-dark); }
.pv-cthread-mini { display: flex; align-items: center; gap: 10px; margin-top: 10px; cursor: text; }
.pv-cthread-mini .pv-pmo-face { width: 28px; height: 28px; }
.pv-cthread-mini .ph { flex: 1; height: 36px; line-height: 36px; padding: 0 14px; border-radius: 10px; background: var(--pv-bg); color: var(--pv-text-faint); font-size: calc(13.5px + var(--pv-fz-add, 0px)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-cthread-mini:hover .ph { background: color-mix(in srgb, var(--pv-bg) 60%, var(--pv-border)); }
.pv-pmo-compose.bottom.compact { margin-top: 10px; padding: 0; border: 0; background: none; }
.pv-cthread-crow { display: flex; align-items: flex-start; gap: 10px; }
.pv-cthread-crow > .pv-pmo-face { width: 28px; height: 28px; margin-top: 2px; }
.pv-cthread-cbody { flex: 1; min-width: 0; }
.pv-cthread-cfoot { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
.pv-cthread-cfoot .sp { flex: 1; }
.pv-cthread-as { display: inline-flex; align-items: center; gap: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-cthread-pill { display: inline-flex; align-items: center; gap: 5px; height: 24px; padding: 0 8px 0 3px; border: 0; border-radius: 999px; background: var(--pv-bg); color: var(--pv-text-soft); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-cthread-pill .pv-pmo-face { width: 18px; height: 18px; }
.pv-cthread-pill.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
/* 时长 + 撞了（用户 2026-10-28） */
.pv-ct-durs { align-items: center; }
.pv-ct-durs .pv-ct-dur-n { width: 104px; margin-left: 4px; }
.pv-ct-clash { margin-top: 8px; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 6px 10px; border-radius: 8px; background: var(--pv-danger-soft); color: var(--pv-danger); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 18px; }
.pv-ct-clash span { white-space: nowrap; font-weight: 600; }
.pv-ct-type { border: 1px solid var(--pv-border); background: var(--pv-surface); border-radius: 999px; padding: 0 12px; height: 28px; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); cursor: pointer; white-space: nowrap; }
.pv-ct-type:hover { border-color: var(--pv-primary); }
.pv-ct-type.on { background: var(--pv-primary-soft); border-color: var(--pv-primary); color: var(--pv-primary-dark); font-weight: 600; }
.pv-ct-oldlogs-t { margin-top: 16px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-weight: 600; }
/* 日历上的人脉往来 */
.k-contact { --pv-k: var(--pv-cat-7); }
.k-contact .pv-cal-dot, .pv-cal-chip.k-contact { background: var(--pv-cat-7); }

/* 分类：勾选多个子类批量处理（用户 2026-09-13） */
.pv-fx-bar { display: flex; align-items: center; gap: 10px; min-height: 32px; padding: 8px 6px 8px 10px; margin-bottom: 2px; border-bottom: 1px solid var(--pv-border); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-fx-bar .el-button + .el-button { margin-left: 0; }
.pv-fx-chkall { display: inline-flex; align-items: center; gap: 6px; color: var(--pv-text-faint); cursor: pointer; white-space: nowrap; }
.pv-fx-bar.on .pv-fx-chkall { color: var(--pv-text); font-weight: 600; }
.pv-fx-chk { flex: none; margin: 0; accent-color: var(--pv-primary); cursor: pointer; }
.pv-fx-row.sel { background: var(--pv-primary-soft); }
.pv-fx-danger-btn { color: var(--pv-danger); border-color: var(--pv-danger-soft); }
.pv-fx-danger-btn:hover { color: #fff; background: var(--pv-danger); border-color: var(--pv-danger); }

/* 配置圈子：拖把手排序 */
.pv-ct-cfg-grip { flex: none; width: 10px; height: 16px; margin-right: 6px; cursor: grab; opacity: .55; background: radial-gradient(circle, var(--pv-text-faint) 1.3px, transparent 1.5px) 0 0 / 5px 5px; }
.pv-ct-cfg-row:hover .pv-ct-cfg-grip { opacity: 1; }
.pv-ct-cfg-row.dragging { opacity: .4; }
.pv-ct-cfg-row.drop-before { box-shadow: inset 0 2px 0 var(--pv-primary); }
.pv-ct-cfg-row.drop-after { box-shadow: inset 0 -2px 0 var(--pv-primary); }

/* 人脉星标（用户 2026-09-13） */
.pv-ct-star { border: 0; background: none; padding: 0 4px; font: inherit; font-size: 20px; line-height: 1; color: var(--pv-text-faint); cursor: pointer; flex: none; }
.pv-ct-star:hover, .pv-ct-star.on { color: #E8A33C; }
.pv-snav-star { flex: none; margin-left: 6px; display: block; }   /* 18px 的 SVG 星，紧跟名字固定 6px；svg 自己就是居中的（用户 2026-09-14） */
/* 星标那排独占一行、按内容分宽（用户 2026-09-27）：原来三颗等宽再跟筛选钮挤一行，右栏 220 宽时每颗只有 61px，
   「★ 珞九天」自己就要 56px，左右贴着边。筛选钮挪到「圈子」标题那一行去了。 */
.pv-ct-tools { display: flex; align-items: center; margin-bottom: 8px; }
.pv-ct-starseg { flex: 1; min-width: 0; }
.pv-ct-starseg button { flex: 1 1 auto; min-width: 0; padding: 0 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; height: 30px; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; gap: 4px; }
.pv-ct-starseg button span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-starseg button .pv-star { flex: none; }

/* 分类：拖着排序 */
.pv-fx-grip { flex: none; width: 10px; height: 16px; cursor: grab; opacity: 0; background: radial-gradient(circle, var(--pv-text-faint) 1.3px, transparent 1.5px) 0 0 / 5px 5px; }
.pv-fx-row:hover .pv-fx-grip, .pv-fx-row.on .pv-fx-grip { opacity: .9; }
.pv-fx-row.dragging { opacity: .4; }
/* 落点提示线（用户 2026-10-27）：一整条直线横贯整行、两头方的——原来是 inset 阴影，跟着行的圆角拐弯，像是卡片描了半圈边 */
.pv-fx-row { position: relative; }
.pv-fx-row.drop-before::before, .pv-fx-row.drop-after::after { content: ""; position: absolute; left: 0; right: 0; height: 2px; background: var(--pv-primary); pointer-events: none; }
.pv-fx-row.drop-before::before { top: -1px; }
.pv-fx-row.drop-after::after { bottom: -1px; }

/* 人脉 · 过去的安排：日期在前、状态标签（用户 2026-09-13）；1.0.248 起不再按月分栏，一行一条（稿 3a） */
.pv-ct-plan-sect { display: flex; align-items: center; gap: 6px; margin: 14px 0 2px; padding: 0; border: 0; background: none; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 500; color: var(--pv-text-faint); }
.pv-ct-plan-sect.up { color: var(--pv-primary-dark); }
.pv-ct-plan-sect.past { color: var(--pv-text-faint); }
.pv-ct-plan-title { font-weight: 700; }   /* 标题一直加粗，展开不展开一样 */
.pv-ct-plan-sect.is-btn { cursor: pointer; }
.pv-ct-plan-sect i { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ct-plan-info { display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); margin-bottom: 10px; }
.pv-ct-plan-info b { font-weight: 400; color: var(--pv-text-faint); margin-right: 6px; }
.pv-ct-tag { font-size: calc(11.5px + var(--pv-fz-add, 0px)); padding: 0 7px; line-height: 18px; border-radius: 4px; white-space: nowrap; flex: none; }
.pv-ct-tag.ok { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-ct-tag.x { background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-ct-plans.is-done .pv-ct-plan-title { font-weight: 700; }

/* 分类：拖子类到左栏时的提示 */
.pv-fx-col.dropzone { outline: 2px dashed var(--pv-primary-soft); outline-offset: 6px; border-radius: var(--pv-radius); }
.pv-fx-col.dropzone .pv-fx-row { border-style: dashed; border-color: var(--pv-border); }
.pv-fx-ghost { position: fixed; top: -1000px; left: -1000px; padding: 6px 12px; border-radius: 8px; background: var(--pv-primary); color: #fff; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap; box-shadow: var(--pv-shadow); }

/* 分类：拖到子类中间 = 合并 */
.pv-fx-row.drop-into { background: var(--pv-primary-soft); box-shadow: inset 0 0 0 2px var(--pv-primary); }
.pv-fx-into { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-primary-dark); white-space: nowrap; font-weight: 600; }
.pv-fx-row .el-dropdown { flex: none; }

/* 人脉总览面板（没选人时，用户 2026-09-13） */

/* 财务：消费登记的页签 + 消费分析顶上的对账提醒（用户 2026-09-13；2026-10-27 页签挪进标题行，.pv-fin-tabrow 撤了） */
/* 模块标题（+ tab 行）钉在右栏 .pv-work-scroll 顶上，内容从底下滚过去；底色盖住、一条线收边，跟 .pv-sp-top 一个做法（用户 2026-09-14） */
.pv-fin-pin { position: sticky; top: 0; z-index: 5; background: var(--pv-page-bg); padding-bottom: 12px; margin-bottom: 16px; border-bottom: 1px solid var(--pv-border); }
/* 财务状况「配置」：配比目标（用户 2026-09-20）。输入框跟全站小控件一个尺码（28px） */
.pv-as-cfg { max-width: 640px; }
.pv-as-cfg-sect2 { margin-top: 24px; }
.pv-as-cfg-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 18px; margin-bottom: 10px; }
.pv-as-cfg-f { display: inline-flex; align-items: center; gap: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 28px; color: var(--pv-text); white-space: nowrap; }
.pv-as-cfg-f .pv-as-catdot { margin-right: 0; }
.pv-as-cfg-f input { width: 60px; height: 28px; padding: 0 8px; border: 1px solid var(--pv-border); border-radius: 6px; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); font-variant-numeric: tabular-nums; text-align: right; outline: 0; background: var(--pv-surface); color: var(--pv-text); -moz-appearance: textfield; }
.pv-as-cfg-f input::-webkit-outer-spin-button, .pv-as-cfg-f input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.pv-as-cfg-f input:focus { border-color: var(--pv-primary); }
.pv-as-cfg-f em { font-style: normal; color: var(--pv-text-faint); }
.pv-as-cfg-sum { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 28px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-as-cfg-sum.bad { color: var(--pv-danger); }
.pv-as-cfg-bar { max-width: 480px; }
.pv-as-cfg-acts { display: flex; gap: 8px; margin-top: 24px; }
.pv-as-cfg-acts .el-button--small { height: 28px; padding: 0 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-fin-pin .pv-fin-mod-head { margin-bottom: 0; }
.pv-fin-tabs { margin: 0; }
/* 消费登记 / 配置 标题旁那排页签（用户 2026-10-26：太小）：这是页面级页签，不是行内的小分段，比全站 .pv-pmo-seg 大一档；
   两个模块同一位置同一尺寸，切换时不跳。手机上放不下就横向滚，不换行不缩字 */
.pv-fin-mod-head .pv-pmo-seg { border-radius: 9px; max-width: 100%; overflow-x: auto; scrollbar-width: none; }
.pv-fin-mod-head .pv-pmo-seg::-webkit-scrollbar { display: none; }
.pv-fin-mod-head .pv-pmo-seg button { height: 34px; padding: 0 18px; font-size: calc(14px + var(--pv-fz-add, 0px)); }
@media (max-width: 640px) { .pv-fin-mod-head .pv-pmo-seg button { height: 36px; padding: 0 13px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); } }
/* 醒目版（用户 2026-10-26：原来那条淡黄的看不见）：左边 4px 橙条（强调边不做圆角）、感叹号、正文深色、要紧的那半句加粗、「去对账」实底 */
.pv-fin-pending { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 0 0 14px; padding: 10px 14px 10px 12px; border-radius: 0 var(--pv-radius) var(--pv-radius) 0; background: var(--pv-warning-soft); border: 1px solid var(--pv-warning-border); border-left: 4px solid var(--pv-warning); color: var(--pv-text); font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-fin-pending .ico { color: var(--pv-warning); font-size: calc(18px + var(--pv-fz-add2, 0px)); line-height: 1; flex: none; }
.pv-fin-pending .t { flex: 1; min-width: 0; line-height: 1.5; }
.pv-fin-pending .t b { color: var(--pv-warning-text); font-weight: 700; }
.pv-fin-pending .pv-adm-sub { white-space: nowrap; }
.pv-fin-pending-go { height: 28px; line-height: 26px; padding: 0 14px; border-radius: 8px; border: 1px solid var(--pv-warning); background: var(--pv-warning); color: #fff; font-family: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-fin-pending-go:hover { filter: brightness(.94); }
@media (max-width: 640px) { .pv-fin-pending .ico { display: none; } .pv-fin-pending-go { height: 32px; line-height: 30px; } }

/* 人脉：右上角设置齿轮、设置弹窗分节、总览顶上的规则一句 */
.pv-snav-title { display: flex; align-items: center; gap: 6px; white-space: nowrap; flex-shrink: 0; }   /* nowrap：手机上这一栏横着排，「分类」两个字会被挤成竖排 */
.pv-ct-gear { margin-left: auto; border: 0; background: none; padding: 0 2px; font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-faint); cursor: pointer; line-height: 1; }
.pv-ct-gear:hover { color: var(--pv-text); }
.pv-ct-cfg-sect { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-faint); margin: 14px 0 4px; }
.pv-ct-cfg-sect:first-child { margin-top: 0; }

/* 人脉设置：两个 tab、农历、回国 / 回美国标签；星标图标 */
.pv-ct-cfg-tabs { margin-bottom: 12px; }
.pv-ct-cfg-lunar { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-cfg-addbox { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 12px; }
.pv-ct-cfg-addbox .pv-ct-cfg-add { flex: 1 1 100%; margin-top: 4px; }
.pv-ct-tag.home { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-ct-tag.abroad { background: #e8f0fe; color: #1d4ed8; }
.pv-ct-star i { font-size: 18px; }
.pv-ct-starseg button i { font-size: 18px; color: #E8A33C; margin-right: 0; }

/* 礼物清单（gifts-view.js） */
.pv-gf-bar { margin-bottom: 12px; }
.pv-gf-group { margin-bottom: 18px; }
.pv-gf-gt { display: flex; align-items: center; gap: 8px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); margin-bottom: 4px; }
.pv-gf-row { display: flex; align-items: center; gap: 10px; min-height: 34px; font-size: calc(13px + var(--pv-fz-add, 0px)); border-bottom: 1px solid var(--pv-border); padding: 0 6px; }
.pv-gf-row .who { flex: none; }
.pv-gf-row .gift { flex: 0 1 auto; min-width: 0; }
.pv-gf-row .note { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-gf-st { border: 0; cursor: pointer; font: inherit; font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
.pv-gf-del { opacity: 0; margin-left: auto; }
.pv-gf-row:hover .pv-gf-del { opacity: 1; }

/* 人脉右栏筛选钮 + 登记人 */
.pv-ct-filter-btn { flex: none; width: 26px; height: 24px; border: 1px solid var(--pv-border); border-radius: 7px; background: var(--pv-surface); color: var(--pv-text-faint); cursor: pointer; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1; }
.pv-ct-filter-btn:hover { color: var(--pv-text); }
.pv-ct-filter-wrap { margin-left: auto; flex: none; display: inline-flex; letter-spacing: 0; }   /* el-popover 的根：在「圈子」标题行里靠右 */
.pv-soc-nav > .pv-snav-title { display: flex; }   /* 手机上别的栏把小标题藏了；这一栏的标题行挂着筛选钮，得留着 */
.pv-ct-filter-btn.on { color: var(--pv-primary-dark); border-color: var(--pv-primary); background: var(--pv-primary-soft); }
.pv-ct-filter-t { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 4px; }
.pv-ct-filter-opt { display: block; width: 100%; text-align: left; border: 0; background: none; padding: 5px 8px; border-radius: 6px; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); cursor: pointer; }
.pv-ct-filter-opt:hover { background: var(--pv-bg); }
.pv-ct-filter-opt.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-ct-reg-when { margin-left: 8px; font-weight: 400; color: var(--pv-text-faint); }

/* 总览清单：两行一条（标题行 + 人名行） */
.pv-pmo-longterm { display: block; margin: 8px 0 2px; }

/* 飞书提醒设置弹窗（用户 2026-09-13：按实际发的内容写） */
.pv-rem-sec { padding: 10px 0; border-bottom: 1px solid var(--pv-border); }
.pv-rem-sec:last-of-type { border-bottom: 0; }
.pv-rem-row { display: flex; align-items: center; gap: 10px; min-height: 32px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); flex-wrap: wrap; }
.pv-rem-row b { font-weight: 600; white-space: nowrap; }
.pv-rem-link { font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-rem-list { margin: 6px 0 0 50px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-rem-list.off { color: var(--pv-text-faint); }
.pv-rem-list > div { line-height: 26px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.pv-rem-list > div::before { content: "·"; color: var(--pv-text-faint); }
.pv-rem-chk { margin-left: 4px; }
.pv-rem-chk.first { margin-left: 0; }
.pv-gro-rem-info { margin-top: 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }

/* 资产数字卡：较上次 / 较最初 窄屏换行；资产配比的目标做成右下角标签（用户 2026-09-14） */
.pv-as-kpi .s.wrap { white-space: normal; display: flex; flex-wrap: wrap; gap: 2px 10px; }
.pv-as-kpi .s.wrap .pv-as-d { white-space: nowrap; }
.pv-as-kpi .s.row { display: flex; align-items: center; gap: 8px; white-space: nowrap; }
/* 四块的图例（现金 债券 定投 自选 + 目标小签）：卡窄了放不下就折两行，小签自己去第二行靠右 */
.pv-as-kpi .s.row.wrap4 { flex-wrap: wrap; row-gap: 2px; }
.pv-as-target { margin-left: auto; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 7px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint); white-space: nowrap; }
@media (max-width: 1280px) { .pv-as-kpi .s.wrap .pv-as-d { flex: 1 1 100%; } }

/* 一枚星两态（pv-star）：空心带弧度 / 实心，同形同大 */
.pv-star { display: inline-block; vertical-align: middle; flex: none; }
.pv-star path { fill: none; stroke: #E8A33C; stroke-width: 1.7; }
.pv-star.on path { fill: #E8A33C; }
.pv-ct-star { display: inline-flex; align-items: center; }
.pv-ct-star .pv-star path { stroke: var(--pv-text-faint); }
.pv-ct-star:hover .pv-star path, .pv-ct-star.on .pv-star path { stroke: #E8A33C; }
.pv-ct-starseg button .pv-star { margin-right: 0; }

/* 商户规则：两行 + 按规则查（用户 2026-09-14） */
.pv-mc-rule2 { margin-bottom: 10px; }
.pv-mc-rule-meta { display: flex; align-items: center; gap: 8px; margin: 4px 0 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 22px; color: var(--pv-text-faint); min-width: 0; flex-wrap: wrap; }
.pv-mc-rule-meta .m { min-width: 0; }   /* 不折叠也不截断，长了就换行 */
.pv-mc-rule-label { flex: none; width: 120px; height: 22px; border: 0; border-bottom: 1px dashed var(--pv-border); background: none; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text); padding: 0 2px; outline: 0; }
.pv-mc-rule-label:focus { border-bottom-color: var(--pv-primary); }
.pv-mc-rules { margin-bottom: 16px; }
.pv-mc-rules-bar { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
/* 规则行（用户 2026-10-26）：不要圆角——悬停底色是一整条，上下边都是直的；第二行跟第一行拉开一点，停用钮带边框 */
.pv-mc-rule-row { padding: 8px 8px 9px; border-bottom: 1px solid var(--pv-border); cursor: pointer; border-radius: 0; }
.pv-mc-rule-row:hover { background: var(--pv-bg); }
.pv-mc-rule-row .l1 .mer.gone { color: var(--pv-danger); text-decoration: line-through; text-decoration-color: var(--pv-danger-border); }
.pv-mc-rule-row .l1 { display: flex; align-items: center; gap: 8px; font-size: calc(13px + var(--pv-fz-add, 0px)); min-width: 0; flex-wrap: wrap; }
.pv-mc-rule-row .l1 .mode { color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-mc-rule-row .l1 .val { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-mc-rule-row .l1 .mer { margin-left: auto; font-weight: 600; white-space: nowrap; }
.pv-mc-rule-row .l2 { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-height: 24px; }
/* 规则健康（用户 2026-09-14）：正常绿字、久未命中黄字 + 小签、从没命中红字 + 小签；两种分开，下一步动作不同 */
.pv-mc-stale { flex: none; display: inline-block; padding: 0 7px; border-radius: 4px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; white-space: nowrap; }
.pv-mc-stale.stale { background: #fff4e5; color: #b4530a; }
.pv-mc-stale.never { background: #fee4e2; color: var(--pv-danger); }
.pv-mc-rule-meta .hl.ok, .pv-mc-rule-row .hl.ok { color: var(--pv-success-text); }
.pv-mc-rule-meta .hl.stale, .pv-mc-rule-row .hl.stale { color: #b4530a; }
.pv-mc-rule-meta .hl.never, .pv-mc-rule-row .hl.never { color: var(--pv-danger); }
.pv-mc-rule-meta .hl.low, .pv-mc-rule-row .hl.low { color: var(--pv-text-faint); }
span.chip.stale { color: #b4530a; background: #fff4e5; }
span.chip.never { color: var(--pv-danger); background: #fee4e2; }
.pv-mc-lf { margin-left: auto; height: 22px; padding: 0 8px; border: 1px dashed var(--pv-border); border-radius: 4px; background: none; color: var(--pv-text-faint); font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; cursor: pointer; white-space: nowrap; flex: none; }
.pv-mc-lf:hover { border-color: var(--pv-text-soft); color: var(--pv-text); }
.pv-mc-lf.on { border-style: solid; border-color: var(--pv-text-soft); background: var(--pv-bg); color: var(--pv-text); }
.pv-mc-rseg { margin: 0; }

/* ---------- 辅助识别（spend-assist.js，用户 2026-09-14）：两态单元格，平时文字，点了才变输入框 ---------- */
.pv-sa-bar { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.pv-sa-seg { margin: 0; }
.pv-sa-add { margin: 0; }
.pv-sa-add.solo { margin-left: 0; }   /* 一条都没有时靠左（用户 2026-09-15） */
.pv-sa-list { border-top: 1px solid var(--pv-border); }
.pv-sa-row { display: grid; grid-template-columns: 90px 1.1fr 1.4fr 96px 1fr 1fr 96px 88px; gap: 8px; align-items: center; min-height: 38px; padding: 0 6px; border-bottom: 1px solid var(--pv-border); font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-sa-row.head { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); min-height: 30px; }
.pv-sa-row.dismissed { color: var(--pv-text-faint); }
.pv-sa-row .r { text-align: right; }
.pv-sa-row .num { font-variant-numeric: tabular-nums; }
.pv-sa-row .cell { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 4px 6px; border-radius: 6px; cursor: text; }
.pv-sa-row .cell:hover { background: var(--pv-bg); }
.pv-sa-row .cell.ro { cursor: default; }
.pv-sa-row .cell.ro:hover { background: none; }
.pv-sa-in { width: 100%; height: 28px; box-sizing: border-box; border: 1px solid var(--pv-primary); border-radius: 6px; padding: 0 6px; font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); background: var(--pv-surface); color: var(--pv-text); outline: 0; }
.pv-sa-in.r { text-align: right; }
.pv-sa-row .src { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-sa-row .ops { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }
.pv-sa-row .ops .pv-pmo-log-act { background: none; border: 0; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
@media (max-width: 900px) {
  .pv-sa-row { grid-template-columns: 80px 1fr 96px 70px; }
  .pv-sa-row > :nth-child(3), .pv-sa-row > :nth-child(5), .pv-sa-row > :nth-child(6), .pv-sa-row > :nth-child(7) { display: none; }
}

/* 商户「每次问」（用户 2026-09-14）：标签行右边一个小勾，卡片上一枚小签 */
.pv-mc-lab { display: flex; align-items: center; justify-content: space-between; }
.pv-mc-ask.el-checkbox { margin: 0; font-weight: 400; letter-spacing: 0; }
.pv-mc-ask .el-checkbox__label { font-size: calc(11px + var(--pv-fz-add, 0px)); padding-left: 5px; color: var(--pv-text-faint); }
.pv-mc-ask .el-checkbox__inner { width: 13px; height: 13px; }
.pv-mc-ask .el-checkbox__inner::after { height: 6px; left: 4px; top: 1px; }
.pv-mc-card .cat .pv-mc-asktag { margin-left: 6px; }

/* 今天面板：有「吃什么」时分左右，右边小栏竖线隔开、顶上一枚灰签（用户 2026-09-15） */
.pv-cal-brief-body.has-meal { display: grid; grid-template-columns: minmax(0, 1fr) 190px; gap: 0 18px; align-items: start; }
.pv-cal-brief-main { min-width: 0; }
.pv-cal-brief-meal { border-left: 1px solid var(--pv-border); padding-left: 16px; min-width: 0; }
.pv-cal-brief-mealtag { display: inline-block; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 7px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-soft); margin-bottom: 8px; white-space: nowrap; }
.pv-cal-brief-mealrow { display: block; position: relative; padding-left: 12px; margin-bottom: 7px; min-width: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text); }   /* 跟 .pv-cal-brief-one 同一套（用户 2026-09-15：字体要对上） */
.pv-cal-brief-mealrow::before { content: ''; position: absolute; left: 1px; top: .72em; width: 5px; height: 5px; border-radius: 50%; background: var(--pv-text-faint); }
.pv-cal-brief-mealrow .k { color: var(--pv-text-faint); margin-right: 6px; }
.pv-cal-brief-mealrow .v { cursor: pointer; }
.pv-cal-brief-mealrow .v:hover { color: var(--pv-primary-dark); }
.has-meal .pv-cal-brief-list { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 980px) { .has-meal .pv-cal-brief-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px) {
  .pv-cal-brief-body.has-meal { grid-template-columns: minmax(0, 1fr); }
  .pv-cal-brief-meal { border-left: 0; padding-left: 0; border-top: 1px dashed var(--pv-border); padding-top: 10px; margin-top: 10px; }
  .has-meal .pv-cal-brief-list { grid-template-columns: minmax(0, 1fr); }
}

/* 手机端今天面板（用户 2026-09-15）：类别小签下面留空、类别之间隔开一截，字号放大一档，好按模块认任务 */
@media (max-width: 640px) {
  .pv-cal-brief-list { gap: 20px; }
  .pv-cal-brief-kind { margin-bottom: 10px; }
  .pv-cal-brief-names { font-size: 15px; }
  .pv-cal-brief-one { line-height: 1.55; }
  .pv-cal-brief-one + .pv-cal-brief-one { margin-top: 9px; }
  .pv-cal-brief-one::before { top: .7em; }
  .pv-cal-brief-where, .pv-cal-brief-one .pv-cal-by { font-size: 12.5px; }
  .pv-cal-brief-mealrow { font-size: 15px; line-height: 1.55; margin-bottom: 9px; }
  .pv-cal-brief-mealrow::before { top: .7em; }
}
/* 手机端：页签排、筛选排各压成**一行横向滑动**（用户 2026-09-15：两排各换成两三行，一屏全是按钮）。
   照手机 app 里那种 chip 条：不换行、手指左右划、滚动条藏起来、两头贴到屏幕边。 */
@media (max-width: 640px) {
  .pv-cal-seg, .pv-cal-legend {
    flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none;
    margin-left: calc(-1 * var(--pv-page-pad)); margin-right: calc(-1 * var(--pv-page-pad));
    padding-left: var(--pv-page-pad); padding-right: var(--pv-page-pad);
    scroll-snap-type: x proximity; scroll-padding-left: var(--pv-page-pad);
  }
  .pv-cal-seg::-webkit-scrollbar, .pv-cal-legend::-webkit-scrollbar { display: none; }
  .pv-cal-seg > *, .pv-cal-legend > * { flex: none; scroll-snap-align: start; }
  .pv-cal-seg { width: auto; }
}

/* 日记复盘（用户 2026-09-16）：卡片 / 看全文抬头上的小签，编辑抽屉复盘日期那行右边的勾 */
.pv-gt-review { display: inline-flex; align-items: center; gap: 4px; margin-left: 0; padding: 0 8px; height: 20px; border-radius: 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1; white-space: nowrap; background: var(--pv-bg); color: var(--pv-text-soft); font-weight: 500; }
.pv-gt-review.due { background: #fee4e2; color: var(--pv-danger); }
.pv-gt-review.done { background: #e6f4ea; color: #1a7f37; }
.pv-gt-review.none { background: none; border: 1px dashed var(--pv-border); color: var(--pv-text-faint); font-weight: 400; }
.pv-gt-review.clickable { cursor: pointer; }
.pv-gt-review.clickable:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-gt-review .el-icon-refresh { font-size: 12px; }
.pv-gt-revlab { display: flex; align-items: center; justify-content: space-between; }
.pv-gt-revck.el-checkbox { margin: 0; font-weight: 400; letter-spacing: 0; }
.pv-gt-revck .el-checkbox__label { font-size: calc(12px + var(--pv-fz-add, 0px)); padding-left: 6px; color: var(--pv-text-soft); }

/* 小黑板打卡（用户 2026-09-17）：日头上的圆勾 + 餐位上的「已吃」小签 */
.pv-mp-day-check { margin: 0 8px 0 0; }
.pv-mp-day-check.on { background: var(--pv-success); border-color: var(--pv-success); color: #fff; }
/* 一顿一勾（用户 2026-09-23）：圈排在餐名前面，跟原来那颗小圆点占一样的位置 */
.pv-mp-slot-check { flex: none; width: 16px; height: 16px; margin: 0 6px 0 0; font-size: 10px; line-height: 14px; }
.pv-mp-slot-done { margin-left: 6px; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 6px; border-radius: 9px; background: var(--pv-success-soft); color: var(--pv-success-text); font-weight: 500; }
.pv-mp-day.ok .pv-mp-slot:not(.empty) { opacity: .75; }

/* 小黑板底下那两颗（饮食规划 / 饮食数据库），靠左 */
.pv-mp-foot { display: flex; align-items: center; gap: 8px; margin-top: 14px; }

/* 快乐社交 · 认识时间（用户 2026-09-17）：控件全按抽屉规格（--pv-dw-h 34 高、--pv-radius-btn 圆角、13.5 字），
   年份片和季节片跟旁边的输入框一个高度一个圆角，选中的实底主色 */
/* 抽屉里的多选下拉（圈子 / 问候节日…）：一个长标签把搜索框挤到第二行、框被撑高（用户 2026-10-28）——标签限宽给搜索框留位置，字省略 */
.pv-drawer .el-select__tags .el-tag { max-width: calc(100% - 44px); }
.pv-drawer .el-select__tags .el-tag .el-select__tags-text { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; vertical-align: top; }
.pv-drawer .el-select__tags > span { max-width: 100%; }
.pv-ct-met-top { display: flex; align-items: center; gap: 8px; }
.pv-ct-met-top .el-radio-group { flex: none; }
.pv-ct-met-date { flex: 1; min-width: 0; }
.pv-ct-met-preview { flex: 1; min-width: 0; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-met-approx { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.pv-ct-met-row { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.pv-ct-met-chip {
  height: var(--pv-dw-h, 34px); padding: 0 13px; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-btn);
  background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px));
  line-height: 1; cursor: pointer; white-space: nowrap; flex: none; font-variant-numeric: tabular-nums; transition: border-color .12s, background .12s, color .12s;
}
.pv-ct-met-chip:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-ct-met-chip.on { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; font-weight: 600; }
.pv-ct-met-year { width: 132px; flex: none; }
.pv-ct-namerow { display: flex; align-items: center; gap: 8px; }
.pv-ct-namerow .el-input { flex: 1; min-width: 0; }
.pv-ct-met-year .el-input__inner { text-align: center; font-variant-numeric: tabular-nums; }

/* 日记本 · 按类型翻（用户 2026-09-18）：顶栏搜索右边一排小签，尺寸照全站小按钮 */
.pv-diary-kinds { display: inline-flex; align-items: center; gap: 6px; flex: none; margin-left: 12px; }
.pv-diary-kinds .pv-chip-opt { display: inline-flex; align-items: center; height: 28px; padding: 0 11px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1; }
.pv-diary-kinds .pv-chip-opt b { margin-left: 4px; font-weight: 700; opacity: .65; }
.pv-diary-head .pv-diary-kinds { margin-left: 4px; }
@media (max-width: 640px) { .pv-work-top .pv-diary-kinds { flex-basis: 100%; margin-left: 0; order: 9; } }

/* ---------- 礼物点子 / 礼物登记（gift-ideas.js，用户 2026-09-18） ---------- */
.pv-gf-tabs { margin: 0 0 14px; }
.pv-gi { display: grid; grid-template-columns: 170px minmax(0, 1fr); gap: 0 18px; align-items: start; }
.pv-gi-side { border-right: 1px solid var(--pv-border); padding-right: 10px; position: sticky; top: 0; }
.pv-gi-main { min-width: 0; }
.pv-gi-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.pv-gi-bar .pv-pmo-seg { margin: 0; }
/* 2b（用户 2026-10-28 改版稿）：分类当页签（名称 + 件数，选中的粗 + 主色下划线），已买挪到页签行最右；其余收进「筛选」 */
.pv-gi-tabs { display: flex; align-items: flex-end; gap: 20px; border-bottom: 1px solid var(--pv-border); margin-bottom: 12px; overflow-x: auto; scrollbar-width: none; }
.pv-gi-tabs::-webkit-scrollbar { display: none; }
.pv-gi-tab { flex: none; display: inline-flex; align-items: baseline; gap: 4px; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; background: none; padding: 6px 0 8px; font: inherit; font-size: calc(14px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; }
.pv-gi-tab i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-gi-tab.none { color: var(--pv-text-faint); }
.pv-gi-tab.on { color: var(--pv-text); font-weight: 700; border-bottom-color: var(--pv-primary); }
.pv-gi-tabs .sp { flex: 1; }
.pv-gi-tabs .pv-ct-gear { margin-left: 0; align-self: center; padding-bottom: 2px; }
.pv-gi-tabs-st { flex: none; border: 0; background: none; padding: 6px 0 8px; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); cursor: pointer; white-space: nowrap; }
.pv-gi-tabs-st:hover { color: var(--pv-primary-dark); }
.pv-gi-filt { display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px; border: 1px solid var(--pv-border); border-radius: 7px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; }
.pv-gi-filt.on { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-gi-filt b { width: 18px; height: 18px; border-radius: 50%; background: var(--pv-primary); color: #fff; font-size: 11px; line-height: 18px; text-align: center; font-weight: 700; }
.pv-gi-fsel { display: inline-flex; align-items: center; gap: 4px; height: 26px; padding: 0 6px 0 10px; border-radius: 999px; background: var(--pv-bg); font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); white-space: nowrap; }
.pv-gi-fsel button { border: 0; background: none; padding: 0 2px; color: var(--pv-text-faint); cursor: pointer; font-size: 12px; line-height: 1; }
.pv-gi-fsel button:hover { color: var(--pv-text); }
.pv-gi-filt-pop.el-popover { padding: 12px 14px 10px; }
.pv-gi-filt-body .t { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-faint); margin: 2px 0 8px; }
.pv-gi-filt-body .chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.pv-gi-fchip { height: 28px; padding: 0 12px; border-radius: 999px; border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; }
.pv-gi-fchip.on { border-color: var(--pv-primary); background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-gi-filt-body .foot { display: flex; justify-content: space-between; align-items: center; border-top: 1px solid var(--pv-border); padding-top: 8px; }
.pv-gi-filt-body .foot button { border: 0; background: none; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; padding: 2px 0; }
.pv-gi-filt-body .foot .clr { color: var(--pv-text-faint); }
.pv-gi-filt-body .foot .ok { color: var(--pv-primary-dark); font-weight: 600; }
.pv-gi-add { margin: 0; }
.pv-gs-q { width: 240px; }
/* 礼物卡（用户 2026-09-20 重排：太挤、名字和 ×N 换行、标签位置别扭）：卡宽下限 300；名字一行到底带 ×N 小签；标签一行；
   价格 + 入库日期在脚的左边，⋯ / ✕ 和「送出」在脚的右边——名字那行不再给操作钮留位 */
.pv-gi-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 12px; }
.pv-gi-card { display: flex; gap: 12px; background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; padding: 12px; min-height: 112px; transition: border-color .12s; }
.pv-gi-card:hover { border-color: var(--pv-primary); }
.pv-gi-card.bought { opacity: .7; }
/* 点子页是一张表（用户 2026-09-28）：没有左边那条分类窄栏，表占满；点整行拉开抽屉；✕ 悬停才露 */
.pv-gi.pv-gi-list { display: block; }
.pv-gi-tbl .el-table__row.link { cursor: pointer; }
.pv-gi-tbl .el-table__row.bought td { opacity: .65; }
.pv-gi-tbl .dash { color: var(--pv-text-faint); }
.pv-gi-tname { font-weight: 600; color: var(--pv-text); font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-gi-tnote { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; color: var(--pv-text-soft); line-height: 1.5; word-break: normal; overflow-wrap: anywhere; }
/* 表里的小签一行排完，不折行（列宽是按内容量出来的，见 gift-ideas.js 的 fitColW / bandColW）——折了行会把这一行撑高 */
.pv-gi-tbl .pv-gi-tags { flex-wrap: nowrap; }
.pv-gi-tbl .pv-gi-tags .pv-gi-tag { flex: none; }
.pv-gi-tbl .pv-gi-link, .pv-gi-tbl .pv-gi-price { font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-gi-tbl td.pv-gi-opcol .cell { overflow: visible; text-overflow: clip; }
.pv-gi-rowops { display: inline-flex; align-items: center; justify-content: flex-end; gap: 4px; white-space: nowrap; }
/* 最后一列钉在右边：钉住的那份表没有自己的底色会透出底下的字，补上；去掉 Element 那道竖影，只留一条细线 */
.pv-gi-tbl .el-table__fixed-right { box-shadow: none; border-left: 1px solid var(--pv-border); }
.pv-gi-tbl .el-table__fixed-right::before { display: none; }
.pv-gi-bar .pv-ct-gear { flex: none; }
.pv-gi-card.link { cursor: pointer; }
.pv-gi-card.link:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: 1px; }
/* 点子卡（用户 2026-09-28）：不摆封面图，卡片收紧；名字最多两行，「买了，入库」钉在右上角；✕ 悬停时浮在右下角、不占位 */
.pv-gi-card.flat { position: relative; min-height: 0; padding: 10px 12px; }
.pv-gi-card.flat .pv-gi-body { gap: 5px; }
.pv-gi-card.flat .pv-gi-name { align-items: flex-start; gap: 10px; }
.pv-gi-card.flat .pv-gi-name .n { flex: 1 1 auto; white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.pv-gi-card.flat .pv-gi-name > button { margin-top: -2px; }   /* 26 高的钮跟 22 行高的第一行对中 */
.pv-gi-del { position: absolute; right: 10px; bottom: 8px; opacity: 0; transition: opacity .12s; }
.pv-gi-card:hover .pv-gi-del, .pv-gi-card:focus-within .pv-gi-del { opacity: 1; }
@media (hover: none) { .pv-gi-del { display: none; } }   /* 手机没有悬停：删除在抽屉里 */
.pv-gi-thumb { flex: none; width: 84px; height: 84px; border-radius: 8px; overflow: hidden; background: var(--pv-bg); }
.pv-gi-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pv-gi-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.pv-gi-top { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
.pv-gi-name { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 600; line-height: 22px; }
.pv-gi-name .n { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-gi-qty { flex: none; height: 18px; padding: 0 6px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-soft); font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 600; font-variant-numeric: tabular-nums; }
/* ⋯ / ✕ 没悬停时不占宽（原来只是透明、还占着 60px，把脚上的日期挤没了——用户 2026-09-20）；手机没有悬停，一直露着 */
.pv-gi-ops { flex: none; display: inline-flex; align-items: center; gap: 4px; width: 0; overflow: hidden; opacity: 0; transition: opacity .12s; }
.pv-gi-card:hover .pv-gi-ops { width: auto; opacity: 1; }
@media (hover: none) { .pv-gi-ops { width: auto; opacity: 1; } }
.pv-gi-tags { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.pv-gi-tag { display: inline-block; padding: 0 7px; line-height: 20px; border-radius: 10px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); background: var(--pv-bg); color: var(--pv-text-soft); white-space: nowrap; }
.pv-gi-tag.boy { background: #e8f0fe; color: #1e40af; }
.pv-gi-tag.girl { background: #fce7f3; color: #9d174d; }
.pv-gi-tag.age { background: #f3f0ff; color: #5b21b6; }
.pv-gi-tag.who { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }   /* 登记时定的「给 XX」（用户 2026-09-20） */
.pv-ct-hit-gift { background: var(--pv-bg); color: var(--pv-text); font-size: 16px; border-radius: 8px; }   /* 搜索结果里的礼物：方角小图 / 🎁 */
/* 登记抽屉里的价格：美元 / 人民币两个框并排，符号做前缀（用户 2026-09-20） */
.pv-gi-money { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.pv-gi-money .el-input-group__prepend { padding: 0 9px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); background: var(--pv-bg); border-radius: var(--pv-radius-btn) 0 0 var(--pv-radius-btn); }
.pv-gi-money .el-input-group--prepend .el-input__inner { border-radius: 0 var(--pv-radius-btn) var(--pv-radius-btn) 0; -moz-appearance: textfield; }
.pv-gi-money .el-input__inner::-webkit-outer-spin-button, .pv-gi-money .el-input__inner::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.pv-gi-meta { flex: 1 1 auto; display: flex; align-items: baseline; gap: 8px; min-width: 0; white-space: nowrap; }
.pv-gi-meta > * { flex: none; }
.pv-gi-price { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-gi-when { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-gi-foot .pv-gi-ops { margin-right: 2px; }
.pv-gi-note { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.pv-gi-foot { margin-top: auto; display: flex; align-items: center; gap: 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-gi-link { color: var(--pv-primary-dark); white-space: nowrap; }
.pv-gi-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.pv-gi-chips .pv-ct-met-chip { height: 30px; padding: 0 11px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-gi-imgbox { border: 1.5px dashed var(--pv-border); border-radius: var(--pv-radius-btn); padding: 10px; display: flex; flex-direction: column; gap: 8px; outline: 0; }
.pv-gi-imgbox:focus { border-color: var(--pv-primary); }
.pv-gi-imgbox.busy { border-color: var(--pv-primary); }   /* 原来只是变淡，看不出在传（用户 2026-11-02） */
.pv-gi-imgbox img { max-width: 100%; max-height: 220px; border-radius: 8px; align-self: flex-start; }
.pv-gi-imgph { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-gi-imgacts { display: flex; align-items: center; gap: 6px; }
.pv-gi-imgacts .el-input { flex: 1; min-width: 0; }
.pv-gs-group { margin-bottom: 18px; }
.pv-gs-gt { display: flex; align-items: center; gap: 8px; font-size: calc(14px + var(--pv-fz-add2, 0px)); margin-bottom: 8px; padding-bottom: 6px; border-bottom: 1px solid var(--pv-border); }
.pv-gs-gt i { color: var(--pv-text-faint); }
.pv-gs-given { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--pv-border); font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-gs-given-img { width: 32px; height: 32px; border-radius: 6px; object-fit: cover; }
.pv-gs-give-name { font-weight: 600; font-size: calc(15px + var(--pv-fz-add2, 0px)); margin-bottom: 4px; }
.pv-gs-give-n { display: flex; align-items: center; gap: 10px; }   /* 送几件 + 「送出后还剩 N 件」 */
.pv-gs-give-n .el-input-number { width: 120px; }
.pv-ct-cfg-sec + .pv-ct-cfg-sec { margin-top: 18px; }
.pv-ct-cfg-sect { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 6px; letter-spacing: .04em; }
/* minmax(0, 1fr)：光写 1fr 的话列宽会被里面最宽的一排（分类 / 筛选片）撑开，卡片跟着伸出屏幕右边 */
@media (max-width: 760px) { .pv-gi { grid-template-columns: minmax(0, 1fr); } .pv-gi-side { border-right: 0; padding-right: 0; position: static; min-width: 0; } .pv-gi-grid { grid-template-columns: minmax(0, 1fr); } }

/* 礼物：「管理地点 / 管理年龄段」是按钮不是链接（用户 2026-09-18）；图片框手机上按钮换行排、有「拍照」 */
.pv-gi-manage { display: inline-flex; align-items: center; gap: 4px; height: 30px; padding: 0 11px; border: 1px dashed var(--pv-border); border-radius: var(--pv-radius-btn); background: none; color: var(--pv-text-soft); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1; cursor: pointer; white-space: nowrap; flex: none; }
.pv-gi-manage:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-gi-manage.sm { height: 22px; padding: 0 8px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); letter-spacing: 0; font-weight: 400; }
.pv-gi-manage i { font-size: 12px; }
.pv-gi-imgbtns { display: flex; align-items: center; gap: 6px; flex: none; }
.pv-gi-imgbtns .pv-pmo-secbtn { height: 32px; border-radius: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-gi-imgbtns .el-button--small { height: 32px; line-height: 30px; padding: 0 12px; }
@media (max-width: 640px) {
  .pv-gi-imgacts { flex-wrap: wrap; }
  .pv-gi-imgacts .el-input { flex-basis: 100%; }
  .pv-gi-imgbtns { width: 100%; }
  .pv-gi-imgbtns .pv-gi-cam { flex: 1; justify-content: center; height: 40px; border-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); font-size: 15px; }
  .pv-gi-imgbtns .pv-gi-up { height: 40px; }
  .pv-gi-imgbtns .el-button--small { height: 40px; line-height: 38px; }
  .pv-gi-imgbox img { max-height: 40vh; }
  .pv-gi-manage { height: 34px; }
}

/* 日记本各看各的（用户 2026-09-18）：顶栏头像排；卡片上「分享给谁」小签 */
.pv-diary-who { flex: none; margin-left: 12px; }
.pv-diary-modebar .pv-diary-who { margin-left: 4px; }
.pv-diary-head .pv-diary-who { margin-left: 4px; }
.pv-gt-vis { position: absolute; top: 10px; right: 46px; display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 7px; border-radius: 10px; background: var(--pv-bg); color: var(--pv-text-faint); font-size: calc(11.5px + var(--pv-fz-add, 0px)); white-space: nowrap; max-width: 40%; overflow: hidden; text-overflow: ellipsis; }
.pv-gt-vis i { font-size: 12px; }
@media (max-width: 640px) { .pv-work-top .pv-diary-who { margin-left: 0; order: 8; } }

/* ---------- 项目管理「身体记录」（pmo-body.js，用户 2026-09-20） ---------- */
/* auto-fit，不是 auto-fill（用户 2026-09-29）：auto-fill 会把放得下的空列也留着，宽屏上只有一张卡的时候它只占窄窄一列；
   auto-fit 把空列收掉，一张就占满、两张各一半。最窄 320，再窄就一张一行 */
.pv-bd-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); gap: 12px; }
.pv-bd-card { container-type: inline-size; display: flex; flex-direction: column; gap: 6px; background: var(--pv-bg); border: 1px solid transparent; border-radius: 12px; padding: 12px 14px; transition: border-color .12s; }
.pv-bd-card:hover { border-color: var(--pv-primary); }
.pv-bd-top { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pv-bd-name { flex: 1; min-width: 0; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; line-height: 1.4; word-break: break-word; }
.pv-bd-ops { flex: none; opacity: 0; transition: opacity .12s; }
.pv-bd-card:hover .pv-bd-ops { opacity: 1; }
.pv-bd-lv { flex: none; display: inline-flex; align-items: center; height: 22px; padding: 0 8px; border-radius: 11px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; font-variant-numeric: tabular-nums; background: var(--pv-surface); color: var(--pv-text-soft); }
.pv-bd-lv.lo { background: #e6f4ea; color: #1a7f37; }
.pv-bd-lv.mid { background: #fff4e5; color: #b4530a; }
.pv-bd-lv.hi { background: #fee4e2; color: var(--pv-danger); }
.pv-bd-lv.sm { height: 20px; min-width: 26px; justify-content: center; padding: 0 5px; }
.pv-bd-meta { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bd-cause { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-bd-bars { display: flex; align-items: flex-end; gap: 3px; height: 34px; padding: 4px 0 0; border-bottom: 1px solid var(--pv-border); }
.pv-bd-bar { flex: 0 0 8px; border-radius: 2px 2px 0 0; background: var(--pv-text-faint); min-height: 3px; }
.pv-bd-bar.lo { background: #2E9E5B; } .pv-bd-bar.mid { background: #E89A2C; } .pv-bd-bar.hi { background: var(--pv-danger); }
.pv-bd-last { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-bd-foot { display: flex; align-items: center; gap: 8px; margin-top: auto; padding-top: 4px; }
.pv-bd-foot .pv-pmo-log-act { background: none; border: 0; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-bd-ci { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; }
.pv-bd-lvrow { display: flex; gap: 4px; flex-wrap: wrap; }
.pv-bd-lvbtn { width: 30px; height: 28px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-variant-numeric: tabular-nums; cursor: pointer; padding: 0; }
.pv-bd-lvbtn.on.lo { background: #1a7f37; border-color: #1a7f37; color: #fff; }
.pv-bd-lvbtn.on.mid { background: #b4530a; border-color: #b4530a; color: #fff; }
.pv-bd-lvbtn.on.hi { background: var(--pv-danger); border-color: var(--pv-danger); color: #fff; }
.pv-bd-cirow { display: flex; align-items: center; gap: 6px; }
.pv-bd-cirow .el-input { flex: 1; min-width: 0; }
.pv-bd-cirow .el-button { flex: none; }
.pv-bd-cirow .el-button + .el-button { margin-left: 0; }
.pv-bd-done { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--pv-border); font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-bd-done .pv-pmo-log-act { background: none; border: 0; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-bd-logrow { display: flex; align-items: center; gap: 8px; padding: 5px 0; border-bottom: 1px solid var(--pv-border); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-bd-logrow .w { flex: none; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
/* 记一次 / 编辑里的时间框（用户 2026-09-20：能改时间）：固定宽，跟旁边输入框同高 */
/* 时间那个框是定宽的。它自己也是一个 .el-input，上面「.pv-bd-cirow .el-input { flex: 1 }」比单写一个类名更具体，
   原来一直是那条赢了：时间框跟一句话平分剩下的宽度，窄的时候连日期都显示不出来。这里把选择器写到一样具体 */
/* 宽度跟着字号走：要放得下图标 +「12月29日 08:31」这么长的一串 */
.pv-bd-when, .pv-bd-cirow .pv-bd-when, .pv-bd-logrow.edit .pv-bd-when { flex: none; width: calc(176px + var(--pv-fz-add, 0px) * 9); }
.pv-bd-when.el-date-editor--small.el-input .el-input__inner { padding-left: 30px; padding-right: 8px; }
/* 卡片窄的时候（看的是卡片自己的宽度，不是屏幕）：时间一行、一句话一行、两颗按钮靠右再一行。
   一排硬塞的话时间和一句话各只剩几十像素，时间都显示不全（用户 2026-09-29）。
   要写在上面定宽那条的后面：两条一样具体，后写的赢 */
@container (max-width: 520px) {
  .pv-bd-cirow { flex-wrap: wrap; }
  .pv-bd-cirow .pv-bd-when, .pv-bd-cirow .el-input { flex: 1 1 100%; width: 100%; }
  .pv-bd-cirow .el-button:first-of-type { margin-left: auto; }
}
.pv-bd-logrow.edit { gap: 6px; }
.pv-bd-logrow.edit .el-input { flex: 1; min-width: 0; }
.pv-bd-logrow.edit .pv-ct-cfg-ib { width: 26px; height: 26px; border: 0; background: none; }
.pv-bd-logrow .n { flex: 1; min-width: 0; color: var(--pv-text-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 640px) { .pv-bd-grid { grid-template-columns: 1fr; } .pv-bd-ops { opacity: 1; } }

/* ---------- 快乐社交「配置」模块页（用户 2026-09-20，从右上角弹窗搬过来） ---------- */
.pv-soc-cfg { max-width: 820px; }   /* 总览那一页要放年度条和两列节日（用户 2026-09-23） */
.pv-soc-cfg .pv-fin-mod-head { margin-bottom: 10px; }
.pv-soc-cfg .pv-ct-cfg-tabs { margin-bottom: 18px; }
.pv-ct-ig { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; padding: 12px 14px; margin-bottom: 10px; }
.pv-ct-ig-head { display: flex; align-items: center; gap: 4px; margin-bottom: 8px; }
.pv-ct-ig-name { border: 0; background: none; padding: 2px 6px; margin-left: -6px; border-radius: 6px; font: inherit; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text); cursor: text; }
.pv-ct-ig-name:hover { background: var(--pv-bg); }
/* 兴趣分组的备注（用户 2026-09-23）：平时是一行灰字，点一下变输入框 */
.pv-ct-ig-note { margin: 2px 0 6px; }
.pv-ct-ig-notebtn { border: 0; background: none; padding: 0; font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px));
                    line-height: 1.6; color: var(--pv-text-soft); cursor: text; text-align: left; }
.pv-ct-ig-notebtn.empty { color: var(--pv-text-faint); }
.pv-ct-ig-notebtn:hover { color: var(--pv-primary); }
.pv-ct-ig-note .pv-ct-cfg-input { width: 100%; max-width: 420px; }
.pv-ct-ig-items { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
.pv-ct-ig-chip { display: inline-flex; align-items: center; gap: 4px; height: 28px; padding: 0 4px 0 11px; border-radius: 14px; background: var(--pv-bg); border: 1px solid var(--pv-border); font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-ct-ig-chip .n { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-weight: 600; }
.pv-ct-ig-chip .x { width: 20px; height: 20px; border: 0; border-radius: 50%; background: none; color: var(--pv-text-faint); font: inherit; font-size: 15px; line-height: 1; cursor: pointer; padding: 0; }
.pv-ct-ig-chip .x:hover { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-ct-ig .pv-ct-cfg-add { margin-top: 4px; }

/* ============================================================
   抽屉规范 v1（docs/DRAWER_STYLE.md，用户 2026-09-20）：右边拉出来的东西只有这一套尺寸——
   34 = 输入框类（--pv-dw-h）；30 = 单选分段 / 快捷胶囊 / 底部按钮（--pv-dw-h2，v1.1 用户 2026-10-17）；26 = 纯图标钮；20 = 小签。
   改尺寸先改那份文档再改这里。这块放文件最后，按顺序压过前面各处零散写的抽屉规则。
   ============================================================ */
/* v1.1（用户 2026-10-17：类型 / 优先级那排 34 太高、底部按钮 28 太小、快捷胶囊 24——三样取中间，一律 30）：
   单选分段（不论是不是跟输入框同一行）、日期快捷胶囊、底部删除 / 取消 / 保存都是 --pv-dw-h2 */
.pv-drawer { --pv-dw-h2: 30px; }
.pv-drawer .el-radio-button__inner { height: var(--pv-dw-h2); line-height: 1; padding: 0 15px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); display: inline-flex; align-items: center; }
.pv-drawer .el-radio-group.pv-seg-sm .el-radio-button__inner { height: var(--pv-dw-h2); padding: 0 14px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-drawer .pv-chip-opt { height: var(--pv-dw-h2); box-sizing: border-box; display: inline-flex; align-items: center; padding: 0 12px; line-height: 1; font-size: calc(12.5px + var(--pv-fz-add, 0px)); white-space: nowrap; flex-shrink: 0; }
/* 分段：一个细边圆角框，段名压在左上角那条边上（用户 2026-09-28，日记本的记录 / 编辑抽屉） */
.pv-drawer-body.pv-dw-secs { display: flex; flex-direction: column; gap: 14px; padding-top: 12px; }
.pv-dw-sec { min-width: 0; margin: 0; padding: 2px 14px 14px; border: 1px solid var(--pv-border); border-radius: 12px; }
.pv-dw-sec > legend { padding: 0 6px; margin-left: -2px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 18px; color: var(--pv-text-soft); }
.pv-dw-sec > .pv-drawer-lab:first-of-type, .pv-dw-sec > legend + .pv-drawer-lab, .pv-dw-sec > legend + div > .pv-drawer-lab:first-child { margin-top: 8px; }
.pv-dw-sec > legend + .pv-flag-row, .pv-dw-sec > legend + .pv-diary-ai, .pv-dw-sec > legend + .pv-mde, .pv-dw-sec > legend + .pv-cthread, .pv-dw-sec > legend + .pv-ct-av { margin-top: 8px; }
.pv-dw-sec > legend + .pv-drawer-row .pv-drawer-lab { margin-top: 8px; }
/* 段里最后一样是评论区 / 来路小字时，段底下的 14 已经够，不再多留 */
.pv-dw-sec > .pv-drawer-meta { margin-bottom: 0; }
/* 一行一个开关：名字在左、滑块在右 */
.pv-dw-sw { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: var(--pv-dw-h); border-bottom: 1px solid #f0f1f5;
            font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-dw-sw > span { white-space: nowrap; }
.pv-dw-switch { flex: none; }
.pv-dw-switch .el-switch__core { width: 32px !important; height: 18px; border-radius: 9px; }
.pv-dw-switch .el-switch__core::after { width: 14px; height: 14px; top: 1px; left: 1px; }
/* 抽屉左边那一列大纲（用户 2026-09-29，照 SW Workstation 的 re-jump：一整列在最左边、贯穿头体脚；
   组名黑体、字段名缩进一档；滚到哪儿亮哪儿，左边一道主色边）。<pv-drawer-outline> 扫到两段以上才出，
   出了就把抽屉撑宽 170（.has-outline），头部铺一层浅底跟体分开；体自己的滚动条藏掉、大纲上的也藏掉 */
.pv-drawer.has-outline { display: grid; grid-template-columns: 170px minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr) auto;
                         width: min(610px, 96vw); }
.pv-drawer.has-outline.narrow { width: min(590px, 96vw); }
.pv-drawer.has-outline.wide { width: min(730px, 96vw); }
.pv-drawer.has-outline.task { width: min(698px, 96vw); }
/* 任务抽屉描述有内容时不再拉宽（用户 2026-10-03）：描述上写下预览，抽屉一直 698 */
.pv-drawer.has-outline > .pv-dw-outline { grid-column: 1; grid-row: 1 / -1; }
.pv-drawer.has-outline > .pv-drawer-head, .pv-drawer.has-outline > .pv-drawer-body, .pv-drawer.has-outline > .pv-drawer-foot { grid-column: 2; min-width: 0; }
.pv-drawer.has-outline > .pv-drawer-head { background: var(--pv-bg); }
.pv-drawer.has-outline > .pv-drawer-body { scrollbar-width: none; }
.pv-drawer.has-outline > .pv-drawer-body::-webkit-scrollbar { display: none; }
.pv-dw-outline { display: flex; flex-direction: column; gap: 14px; min-height: 0; padding: 18px 0 16px 10px; border-right: 1px solid var(--pv-border);
                 background: #fafbfc; overflow-y: auto; scrollbar-width: none; }
.pv-dw-outline::-webkit-scrollbar { display: none; }
.pv-dwo-group { display: flex; flex-direction: column; gap: 2px; }
.pv-dwo-head { display: block; padding: 4px 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; letter-spacing: .04em; line-height: 18px;
               color: var(--pv-text); text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-dwo-head:hover, .pv-dwo-head.on { color: var(--pv-primary-dark); }
.pv-dwo-link { display: block; margin-left: 14px; padding: 5px 8px 5px 10px; border-left: 2px solid transparent; border-radius: 0 6px 6px 0;
               font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; line-height: 1.2; color: var(--pv-text-soft); text-decoration: none;
               white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-dwo-link:hover { color: var(--pv-text); background: rgba(15, 23, 42, .04); }
.pv-dwo-link.on { border-left-color: var(--pv-primary); color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
/* 大屏：大纲跟着宽一点、字大一点 */
@media (min-width: 1800px) {
  .pv-drawer.has-outline { grid-template-columns: 200px minmax(0, 1fr); width: min(640px, 96vw); }
  .pv-drawer.has-outline.task { width: min(728px, 96vw); }

  .pv-dw-outline { gap: 18px; }
  .pv-dwo-head { font-size: calc(13px + var(--pv-fz-add, 0px)); }
  .pv-dwo-link { padding: 6px 8px 6px 12px; font-size: calc(14px + var(--pv-fz-add, 0px)); }
}
/* 手机：不画大纲，抽屉回到原来的宽度 */
@media (max-width: 760px) {
  .pv-drawer.has-outline { display: flex; width: min(440px, 92vw); }
  .pv-drawer.has-outline.narrow { width: min(420px, 92vw); }
  .pv-drawer.has-outline.wide { width: min(560px, 96vw); }
  .pv-drawer.has-outline.task { width: min(528px, 96vw); }
  .pv-drawer.has-outline > .pv-drawer-head { background: var(--pv-surface); }
  .pv-dw-outline { display: none; }
}
.pv-dw-switch.is-checked .el-switch__core::after { margin-left: -15px; }
/* 标题 + 右边一颗动作钮（AI 拟标题），钮跟输入框同高 */
.pv-dw-titlerow { display: flex; align-items: flex-start; gap: 8px; }
.pv-dw-titlerow > .el-textarea, .pv-dw-titlerow > .el-input { flex: 1 1 auto; min-width: 0; }
.pv-drawer .pv-dw-titlerow > .el-button { flex: none; height: var(--pv-dw-h); line-height: 1; padding: 0 12px; white-space: nowrap; margin: 0; }
/* 多行框：字号、字体跟输入框一样（全站 .el-textarea__inner 是 15px，抽屉里显得比别的都大） */
.pv-drawer .el-textarea__inner { font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; font-family: inherit; }
/* 添加行（输入框 + 添加）在抽屉里也是 34；页面上的仍是 32 */
.pv-drawer .pv-ct-cfg-add .el-input--small .el-input__inner, .pv-drawer .pv-ct-cfg-add .el-select--small .el-input__inner { height: var(--pv-dw-h); line-height: var(--pv-dw-h); border-radius: var(--pv-radius-btn); }
.pv-drawer .pv-ct-cfg-add .el-button--small, .pv-drawer .pv-ct-cfg-add .el-button--small.is-round { height: var(--pv-dw-h); line-height: calc(var(--pv-dw-h) - 2px); padding: 0 16px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); border-radius: var(--pv-radius-btn); }
/* 小节标题、清单行、行末的图标钮（上移 / 下移 / 删除）：26 无边框，悬停浅底——跟快乐社交配置页一样；商户规则行里挨着输入框的那颗仍是 34 带框 */
.pv-drawer .pv-ct-cfg-sect { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); letter-spacing: .04em; margin: 14px 0 4px; }
.pv-drawer .pv-ct-cfg-sec:first-child .pv-ct-cfg-sect { margin-top: 10px; }
.pv-drawer .pv-ct-cfg-sec + .pv-ct-cfg-sec { margin-top: 6px; }
.pv-drawer .pv-ct-cfg-row { height: 36px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-drawer .pv-ct-cfg-row .pv-ct-cfg-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-drawer .pv-ct-cfg-row .pv-ct-cfg-ib { width: 26px; height: 26px; border: 0; background: none; border-radius: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-drawer .pv-ct-cfg-row .pv-ct-cfg-ib:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-drawer .pv-ct-cfg-row .pv-ct-cfg-ib.danger:hover { color: var(--pv-danger); }
.pv-drawer .pv-ct-cfg-row .pv-ct-cfg-ib:disabled { opacity: .3; background: none; }
/* 底下那排（用户 2026-09-22）：左下角删除、右下角取消 / 保存，同高、13 字、同圆角，落在一条线上。
   v1.1（2026-10-17）：30 高、圆角 6（用户：偏方、只带一点弧度）。
   删除用浅红底的 .pv-btn-danger-soft（日记抽屉那套），不再是一个没高度的文字链接。 */
.pv-drawer .pv-drawer-foot { align-items: center; }
.pv-drawer .pv-drawer-foot .el-button--small,
.pv-drawer .pv-drawer-foot .el-button--small.is-round {
  height: var(--pv-dw-h2); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
  line-height: 1; padding: 0 16px; font-size: calc(13px + var(--pv-fz-add, 0px)); border-radius: 6px;
}
.pv-drawer .pv-drawer-foot .el-button + .el-button { margin-left: 0; }   /* 间距交给 flex 的 gap，别再叠 Element 那 10px */
/* 任务抽屉比别的宽两成（用户 2026-09-28：原来 440 / 760，嫌窄）：平时 528；描述有内容就拉到 912，左写右预览各 ~430 */
.pv-drawer.task { width: min(528px, 96vw); }
/* .xwide（912）撤了（2026-10-03）：任务抽屉描述有内容时不再拉宽 */

/* ============================================================
   全站「新增」按钮（docs/ADD_BUTTON.md，用户 2026-09-20）：只有这一颗 .pv-addbtn——
   细加号图标 + 文字、1px 虚线边（不要粗）、圆角 8、30 高、13 字；放在它往里加东西的那个列表顶部靠左，栏里撑满（.block）；
   主动作只换主色实底（.primary）。三个老类（pv-task-addbtn / pv-pmo-newbtn / pv-rail-sub-add）在这儿一并长成它，
   模板里不用再改类名。字号只有这一个，不随页面跳。
   ============================================================ */
.pv-addbtn, .pv-task-addbtn, .pv-pmo-newbtn, .pv-rail-sub-add {
  display: inline-flex; align-items: center; justify-content: flex-start; gap: 6px; height: 30px; padding: 0 12px 0 10px; box-sizing: border-box;
  /* v1.2（用户 2026-10-29：虚线框 + 粗加号不好看）：浅灰实底、不描边，加号细一档；悬停底色深一档、字变主色 */
  border: 1px solid transparent; border-radius: 8px; background: var(--pv-bg); color: var(--pv-text);
  font-family: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 500; line-height: 1; cursor: pointer;
  white-space: nowrap; flex-shrink: 0; text-decoration: none; transition: background .12s, color .12s;
}
.pv-addbtn::before, .pv-task-addbtn::before, .pv-pmo-newbtn::before, .pv-rail-sub-add::before {
  content: ""; flex: none; width: 11px; height: 11px; background: currentColor; opacity: .8;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M6 1.2v9.6M1.2 6h9.6' stroke='black' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M6 1.2v9.6M1.2 6h9.6' stroke='black' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat;
}
.pv-addbtn:hover, .pv-task-addbtn:hover, .pv-pmo-newbtn:hover, .pv-rail-sub-add:hover { background: #e9ebf1; color: var(--pv-primary-dark); }
.pv-addbtn:hover::before, .pv-task-addbtn:hover::before, .pv-pmo-newbtn:hover::before, .pv-rail-sub-add:hover::before { opacity: 1; }
.pv-addbtn:disabled, .pv-task-addbtn:disabled { opacity: .5; cursor: default; }
.pv-addbtn.primary { background: var(--pv-primary); border-color: var(--pv-primary); color: #fff; }
.pv-addbtn.primary:hover { background: var(--pv-primary-dark); border-color: var(--pv-primary-dark); color: #fff; }
.pv-addbtn.block, .pv-pmo-newbtn, .pv-diary-add { width: 100%; justify-content: center; }
/* 板块列表顶上放按钮的那一行 */
.pv-addrow { display: flex; align-items: center; gap: 8px; margin: 0 0 10px; }
/* 同一排的 Element 小按钮跟它齐高（股票工具行、通用表格工具行） */
.pv-stock-toolbar .el-button--small, .pv-toolbar .el-button--small { height: 30px; line-height: 28px; padding: 0 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); border-radius: 8px; }
@media (max-width: 640px) { .pv-addbtn, .pv-task-addbtn, .pv-pmo-newbtn, .pv-rail-sub-add { height: 34px; } }

/* ============================================================
   确认类按钮（docs/DRAWER_STYLE.md「确认类按钮」，用户 2026-09-20）：保存 / 记下 / 登记 / 确认 / 添加 全站一个样——
   Element 主色实底 + 描边取消；高度跟着它所在的那一排走：抽屉底部、弹窗底部、评论框 28 高 13 字圆角 8；
   挨着输入框的跟输入框同高（抽屉 34 / 页面 38）；工具行里跟「新增」钮同排的 30。
   弹窗底部原来是 Element 默认（40 高 15 字），这里压成跟抽屉底部一样。
   ============================================================ */
.el-dialog__footer .el-button, .el-dialog__footer .el-button.is-round { height: 28px; line-height: 26px; padding: 0 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); border-radius: 8px; box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; }
.el-dialog__footer .el-button + .el-button { margin-left: 8px; }

/* ============================================================
   财务状况 › 信用卡权益（用户 2026-09-20）：顶行 + 三张数字卡 + 按周期分组的勾选清单
   ============================================================ */
.pv-cp-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.pv-cp-bar .pv-pmo-seg button { height: 30px; padding: 0 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-cp-bar .pv-pmo-secbtn { height: 30px; }
/* 看哪一年（用户 2026-09-22） */
/* 购物清单的参考价：币种分段 + 纯数字（用户 2026-09-23） */
.pv-wl-price { display: flex; align-items: center; gap: 8px; }
.pv-wl-price .pv-pmo-seg { flex: none; }
.pv-wl-price .pv-pmo-seg button { height: var(--pv-dw-h, 34px); padding: 0 10px; white-space: nowrap; }
.pv-wl-price .el-input { flex: 1; min-width: 0; }

/* 还没到生效季度的（用户 2026-09-23）：整条灰着——按自然年算的权益，财年前半段其实用不了 */
.pv-cp-row.dormant { opacity: .5; }
.pv-cp-row.dormant .pv-tc-check { pointer-events: none; }
.pv-cp-fq { margin-left: 6px; padding: 0 6px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint);
            font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 500; line-height: 17px; white-space: nowrap; flex-shrink: 0; }
.pv-cp-fq.on { background: var(--pv-success-soft); color: #2E7D46; }

/* 「错过的」/「这期还没用」两个弹窗（用户 2026-09-23） */
.pv-cp-dlg .el-dialog__body { padding: 10px 20px 4px; }
.pv-cp-pend-grp + .pv-cp-pend-grp { margin-top: 14px; }
.pv-cp-pend-grp .hd { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px; padding: 0 0 4px;
                      border-bottom: 1px solid var(--pv-border); margin-bottom: 4px;
                      font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); }
.pv-cp-pend-grp .hd .tag { font-weight: 400; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 20px; height: 20px;
                           padding: 0 8px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-soft); white-space: nowrap; }
.pv-cp-pend-grp .hd .tag.warn { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-cp-missed-row .per { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-cp-missed-row .pv-tc-check { flex: none; margin-left: 10px; }

/* 今年不会薅（用户 2026-09-23）：还留在清单上，但整条变蓝、圈里套一个圈——
   跟绿色的「用了」和空圈的「还没用」都分得开 */
.pv-cp-row.skipped { background: #EDF2FB; border-bottom-color: transparent; }
.pv-cp-row.skipped .pv-cp-name, .pv-cp-row.skipped .pv-cp-amt { color: #2F5EA8; }
.pv-cp-row.skipped .pv-cp-note, .pv-cp-row.skipped .pv-cp-past-btn { color: #7089B8; }
/* 今年不会薅（用户 2026-09-23）：整颗填满蓝，中间一个白圈，用 flex 居中而不是靠负 margin 凑 */
.pv-tc-check.skip { border-color: #2F5EA8; background: #2F5EA8; display: inline-flex; align-items: center; justify-content: center; color: #fff; }
.pv-cp-skipico { width: 15px; height: 15px; display: block; }   /* 圈用 SVG 画：够粗够圆，不靠 1.5px 的 CSS 描边（用户 2026-09-23） */
.pv-cp-vbtn.skip { margin-top: 10px; border-style: dashed; }
.pv-cp-vbtn.skip:hover { border-color: #2F5EA8; background: #EDF2FB; }
.pv-cp-vbtn.skip:hover b, .pv-cp-vbtn.skip:hover i { color: #2F5EA8; }

/* 错过的（用户 2026-09-23）：本财年已经过去又没勾的期，点开能就地补记 */
/* 能点开的那两张卡（用户 2026-09-23）：悬停边框转主色 + 轻微抬一下，让人知道点得开 */
.pv-cp-missed-kpi { cursor: default; transition: border-color .14s, box-shadow .14s, transform .14s; }
.pv-cp-missed-kpi.tap { cursor: pointer; }
.pv-cp-missed-kpi.tap:hover { border-color: var(--pv-primary); box-shadow: 0 4px 14px var(--pv-brand-glow); transform: translateY(-1px); }
.pv-cp-missed-kpi.tap:active { transform: none; }
.pv-cp-missed { margin: -4px 0 14px; padding: 10px 12px; border: 1px solid var(--pv-border); border-radius: 10px; background: var(--pv-bg); }
.pv-cp-missed-row { display: flex; align-items: center; gap: 8px; min-height: 32px; flex-wrap: wrap; }
.pv-cp-missed-row + .pv-cp-missed-row { border-top: 1px dashed var(--pv-border); }
.pv-cp-missed-row .nm { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); white-space: nowrap; }
.pv-cp-missed-row .chips { display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
.pv-cp-missed-row .amt { margin-left: auto; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
                         font-variant-numeric: tabular-nums; white-space: nowrap; }

/* 财年签（用户 2026-09-22）：标题右边写清这个财年是哪段；多于一个财年时点开切 */
.pv-cp-fy { position: relative; display: inline-flex; align-items: center; gap: 4px; height: 22px; padding: 0 8px; border-radius: 5px;
            background: var(--pv-bg); color: var(--pv-text-soft); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 22px;
            white-space: nowrap; flex-shrink: 0; font-variant-numeric: tabular-nums; }
.pv-cp-fy.pick { cursor: pointer; }
.pv-cp-fy.pick:hover { background: var(--pv-primary-soft, #EAF1FF); color: var(--pv-primary); }
.pv-cp-fy i { font-size: 11px; }
.pv-cp-fyscrim { position: fixed; inset: 0; z-index: 4; }
.pv-cp-fymenu { position: absolute; top: 26px; left: 0; z-index: 10; min-width: 190px; padding: 4px; border: 1px solid var(--pv-border);
                border-radius: 8px; background: var(--pv-surface); box-shadow: 0 8px 24px rgba(17, 24, 39, .12); display: block; }
.pv-cp-fymenu button { display: flex; align-items: baseline; gap: 8px; width: 100%; height: 30px; padding: 0 8px; border: 0; border-radius: 6px;
                       background: none; color: var(--pv-text); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; text-align: left; }
.pv-cp-fymenu button:hover { background: var(--pv-bg); }
.pv-cp-fymenu button.on { color: var(--pv-primary); font-weight: 600; }
.pv-cp-fymenu em { margin-left: auto; font-style: normal; color: var(--pv-text-faint); font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
/* 已拿回：主数是折算过的，旁边灰的是原额度 */
.pv-cp-gross { margin-left: 8px; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-cp-vtag { margin-right: 2px; padding: 0 5px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint);
              font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 17px; white-space: nowrap; flex-shrink: 0; }
/* 勾之前选「这笔对我值多少」 */
.pv-cp-vdlg { position: fixed; z-index: 3001; top: 50%; left: 50%; transform: translate(-50%, -50%); width: min(360px, calc(100vw - 32px));
              padding: 16px; border-radius: 12px; background: var(--pv-surface); box-shadow: 0 18px 48px rgba(17, 24, 39, .18); }
.pv-cp-vdlg-head { margin-bottom: 12px; font-size: calc(15px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); }
.pv-cp-vdlg-head span { display: block; margin-top: 3px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-cp-vdlg-head em { margin-left: 6px; font-style: normal; }
.pv-cp-vbtn { display: flex; align-items: center; gap: 8px; width: 100%; height: 40px; margin-bottom: 6px; padding: 0 12px;
              border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); color: var(--pv-text);
              font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; text-align: left; }
.pv-cp-vbtn:hover { border-color: var(--pv-primary); background: var(--pv-primary-soft, #EAF1FF); }
.pv-cp-vbtn b { flex: none; font-weight: 600; white-space: nowrap; }
.pv-cp-vbtn span { flex: 1; min-width: 0; color: var(--pv-text-faint); font-size: calc(11.5px + var(--pv-fz-add, 0px));
                   overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-cp-vbtn i { flex: none; font-style: normal; font-weight: 600; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-cp-vbtn:hover i { color: var(--pv-primary); }
@media (max-width: 720px) { .pv-cp-vbtn span { display: none; } }
.pv-cp-past-tag { margin-left: 6px; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 6px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-cp-yearmark { flex: none; min-width: 34px; text-align: center; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-cp-kpis { grid-template-columns: 1fr 1.8fr 1fr 1fr; margin-bottom: 18px; }   /* 四张卡：年费 / 已拿回 / 这期还没用 / 错过的（用户 2026-09-23） */
.pv-cp-kpis.no-pending { grid-template-columns: 1fr 1.8fr 1fr; }
.pv-cp-pct { margin-left: 8px; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-faint); }
.pv-cp-bar-track { width: 100%; height: 11px; border-radius: 6px; background: var(--pv-bg); overflow: hidden; }
.pv-cp-bar-track i { display: block; height: 100%; border-radius: 6px; background: #2E7D46; transition: width .25s; }
.pv-cp-bar-track i.over { background: #1F7A45; }
.pv-cp-warn { color: var(--pv-primary-dark); }
.pv-cp-sec { margin-bottom: 14px; }
.pv-cp-plab { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 18px; padding: 0 7px; border-radius: 4px; background: var(--pv-bg); }
.pv-cp-rows { display: flex; flex-direction: column; }
.pv-cp-row { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 6px 8px; margin: 0 -8px; border-radius: 8px; border-bottom: 1px dashed var(--pv-border); }
/* 用掉了的那条整根绿（用户 2026-09-22：不只勾是绿的）：淡绿底 + 绿字 */
.pv-cp-row.used { background: var(--pv-success-soft); border-bottom-color: transparent; }
/* 相邻两条同色的拼成一整块：上一条削掉下面两个角，下一条削掉上面两个角（用户 2026-09-23） */
.pv-cp-row.used:has(+ .pv-cp-row.used) { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
.pv-cp-row.used + .pv-cp-row.used { border-top-left-radius: 0; border-top-right-radius: 0; }
.pv-cp-row.skipped:has(+ .pv-cp-row.skipped) { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
.pv-cp-row.skipped + .pv-cp-row.skipped { border-top-left-radius: 0; border-top-right-radius: 0; }
.pv-cp-row:last-child { border-bottom: 0; }
.pv-cp-row .pv-tc-check { margin-top: 0; }
.pv-cp-row.busy { opacity: .6; }
.pv-cp-main { flex: 1; min-width: 0; cursor: pointer; }
.pv-cp-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); display: flex; align-items: center; gap: 8px; min-width: 0; }
/* 卡的标签：放在权益名前面、一张卡一个颜色（用户 2026-09-22：筱禾蓝、珞九天红）；宽度跟着名字走，短名字就短一点 */
.pv-cp-card { flex: none; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600; line-height: 18px;
              padding: 0 7px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-soft); white-space: nowrap; }
.pv-cp-card.c-blue { background: #E8F0FE; color: #1A56B8; }
.pv-cp-card.c-red { background: #FDECEC; color: #B3261E; }
.pv-cp-card.c-green { background: #E6F4EA; color: #1E6B38; }
.pv-cp-card.c-purple { background: #F0EBFA; color: #5B3FA8; }
.pv-cp-card.c-orange { background: #FCEEE2; color: #A2530E; }
.pv-cp-card.c-teal { background: #E2F4F3; color: #10635E; }
.pv-cp-dot { flex: none; display: inline-block; width: 8px; height: 8px; margin-right: 6px; border-radius: 50%; background: var(--pv-text-faint); vertical-align: 1px; }
.pv-cp-dot.c-blue { background: #1A56B8; } .pv-cp-dot.c-red { background: #B3261E; } .pv-cp-dot.c-green { background: #1E6B38; }
.pv-cp-dot.c-purple { background: #5B3FA8; } .pv-cp-dot.c-orange { background: #A2530E; } .pv-cp-dot.c-teal { background: #10635E; }
.pv-cp-dot.pick { width: 16px; height: 16px; margin: 0; border: 2px solid transparent; cursor: pointer; padding: 0; }
.pv-cp-dot.pick.on { border-color: var(--pv-text); }
/* 财年签的下拉里就能改起始月 */
.pv-cp-fyset { display: flex; align-items: center; gap: 6px; margin-top: 4px; padding: 8px 8px 4px; border-top: 1px solid var(--pv-border);
               color: var(--pv-text-soft); font-size: calc(12px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-cp-note { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-cp-amt { flex: none; text-align: right; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 700;
             font-variant-numeric: tabular-nums; color: var(--pv-text);
             display: flex; align-items: baseline; gap: 6px; white-space: nowrap; }
.pv-cp-at { font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: #2E7D46; white-space: nowrap; }
.pv-cp-row.used .pv-cp-name { color: #2E7D46; }
.pv-cp-row.used .pv-cp-note, .pv-cp-row.used .pv-cp-at { color: #5C8C6D; }
.pv-cp-row.used .pv-cp-amt { color: #2E7D46; }
.pv-cp-row.used .pv-cp-past-btn { color: #5C8C6D; }
.pv-cp-row.off { opacity: .7; gap: 10px; }
.pv-cp-row.off .pv-cp-name { flex: 1; min-width: 0; font-weight: 400; cursor: pointer; }
.pv-cp-row.off .pv-cp-amt { margin-left: auto; }
/* 配置 › 信用卡（用户 2026-09-22：卡片从抽屉搬进配置，宽度够了就一张卡一行） */
.pv-cardcfg .pv-addrow { margin-bottom: 4px; }
.pv-cardcfg-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; }
.pv-cardcfg-row + .pv-cardcfg-row { border-top: 1px dashed var(--pv-border); }
.pv-cardcfg-col.dot { position: relative; flex: none; display: flex; align-items: center; }
.pv-cardcfg-name { flex: 1 1 260px; min-width: 120px; }
.pv-cardcfg-owner { flex: 0 1 150px; min-width: 96px; }
.pv-cardcfg-fee { flex: none; width: 110px; }
.pv-cardcfg-pal { position: absolute; z-index: 10; top: 30px; left: 0; display: flex; gap: 8px; padding: 8px;
                  border: 1px solid var(--pv-border); border-radius: 10px; background: var(--pv-surface); box-shadow: 0 8px 24px rgba(17, 24, 39, .12); }
.pv-cp-dot.pick.lg { width: 24px; height: 24px; }
@media (max-width: 720px) {
  .pv-cardcfg-row { flex-wrap: wrap; }
  .pv-cardcfg-name { flex: 1 1 100%; order: 1; }
  .pv-cardcfg-col.dot { order: 0; }
  .pv-cardcfg-owner { flex: 1 1 auto; order: 2; }
  .pv-cardcfg-fee { order: 3; }
}
.pv-cp-restore { flex: none; height: 24px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface);
                 color: var(--pv-text-soft); font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 22px; cursor: pointer; white-space: nowrap; }
.pv-cp-restore:hover { border-color: var(--pv-primary); color: var(--pv-primary); }
/* 往期补记（用户 2026-09-20）：行末一颗小钟，点开一排期签 */
.pv-cp-past-btn { flex: none; width: 26px; height: 26px; border: 0; background: none; border-radius: 6px; color: var(--pv-text-faint); cursor: pointer; font-size: 14px; }
.pv-cp-past-btn:hover, .pv-cp-past-btn.on { background: var(--pv-bg); color: var(--pv-text); }
.pv-cp-past { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 4px 0 10px 32px; border-bottom: 1px dashed var(--pv-border); }
.pv-cp-past-name { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-right: 4px; white-space: nowrap; }
.pv-cp-pchip { display: inline-flex; align-items: center; gap: 4px; height: 24px; padding: 0 9px; border: 1px solid var(--pv-border); border-radius: 999px; background: var(--pv-surface); font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; }
.pv-cp-pchip:hover { border-color: var(--pv-primary); }
.pv-cp-pchip.on { background: #EAF7EE; border-color: #2E7D46; color: #2E7D46; font-weight: 600; }
.pv-cp-pchip:disabled { opacity: .5; cursor: default; }
@media (max-width: 640px) { .pv-cp-kpis { grid-template-columns: 1fr 1fr; } .pv-cp-kpis .pv-as-kpi.wide { grid-column: 1 / -1; } }

/* 礼物点子 / 礼物登记 手机端（用户 2026-09-20）：顶行「新增 + 在库 N 件」一行，搜索框整宽一行，筛选片横向滚不换行；
   卡片图 72、内边距收一点；卡脚的 ✕ 藏起来（删除在编辑抽屉最左），只留 ⋯ 和「送出 / 买了入库」 */
@media (max-width: 640px) {
  .pv-gi-bar { gap: 8px; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }   /* 2b：「筛选」和已选小签一行横滑不换行 */
  .pv-gi-bar::-webkit-scrollbar { display: none; }
  .pv-gi-bar > * { flex: none; }
  .pv-gi-filt-pop.el-popover { width: calc(100vw - 32px) !important; }
  .pv-gi-bar .pv-adm-sub { order: 2; margin-left: auto; }
  .pv-gi-bar > span[style*="flex:1"] { display: none; }
  .pv-gi-bar .pv-gs-q { order: 5; flex: 1 1 100%; width: 100%; }
  .pv-gi-bar .pv-pmo-seg { order: 6; max-width: 100%; overflow-x: auto; flex-wrap: nowrap; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
  .pv-gi-bar .pv-pmo-seg::-webkit-scrollbar { display: none; }
  .pv-gi-bar .pv-pmo-seg button { flex: none; }
  .pv-gi-card { padding: 10px; gap: 10px; min-height: 0; }
  .pv-gi-thumb { width: 72px; height: 72px; }
  .pv-gi-foot .pv-topic-del { display: none; }
  .pv-gs-gt { font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
}

/* ============================================================
   跟「新增」钮同一排的东西一律同高（pref 同排同高；用户 2026-09-20 盘点：礼物页筛选片、资产「账户」、日程快填框、
   消费明细 / 商户识别的搜索框和「按规则查」、首页「完成编辑」、里程碑树「标记完成」、家电柜子「编辑 / 删除柜子」、分类页「改名」、股票「关注 / 完成」）。
   用 :has 找到直接包着新增钮的那一排，不用逐页改类名。
   ============================================================ */
:is(div, span, section, nav, header, aside):has(> .pv-addbtn, > .pv-task-addbtn, > .pv-pmo-newbtn, > .pv-rail-sub-add) > :is(.pv-pmo-secbtn, .pv-mini-btn, .pv-rail-done, .el-button--small, .el-button--mini) { height: 30px; line-height: 28px; padding-top: 0; padding-bottom: 0; box-sizing: border-box; }
:is(div, span, section, nav, header, aside):has(> .pv-addbtn, > .pv-task-addbtn, > .pv-pmo-newbtn, > .pv-rail-sub-add) > .pv-pmo-seg > button { height: 30px; }
:is(div, span, section, nav, header, aside):has(> .pv-addbtn, > .pv-task-addbtn, > .pv-pmo-newbtn, > .pv-rail-sub-add) > :is(.el-input--small, .el-select--small) .el-input__inner { height: 30px; line-height: 30px; }
:is(div, span, section, nav, header, aside):has(> .pv-addbtn, > .pv-task-addbtn, > .pv-pmo-newbtn, > .pv-rail-sub-add) > :is(.el-input--small, .el-select--small) .el-input__icon { line-height: 30px; }
@media (max-width: 640px) {
  :is(div, span, section, nav, header, aside):has(> .pv-addbtn, > .pv-task-addbtn, > .pv-pmo-newbtn, > .pv-rail-sub-add) > :is(.pv-pmo-secbtn, .pv-mini-btn, .pv-rail-done, .el-button--small, .el-button--mini) { height: 34px; line-height: 32px; }
  :is(div, span, section, nav, header, aside):has(> .pv-addbtn, > .pv-task-addbtn, > .pv-pmo-newbtn, > .pv-rail-sub-add) > .pv-pmo-seg > button { height: 34px; }
  :is(div, span, section, nav, header, aside):has(> .pv-addbtn, > .pv-task-addbtn, > .pv-pmo-newbtn, > .pv-rail-sub-add) > :is(.el-input--small, .el-select--small) .el-input__inner { height: 34px; line-height: 34px; }
}

/* ============================================================
   快乐社交 · 总览（用户 2026-09-23，方案 2a）
   一条规矩：颜色只标「这是什么事」。日期方块 / 种类小字 / 热力格 / 图例色点用 --pv-ev-*；
   圈子、兴趣一律白底描边，不上色——原来三种不相干的东西长一个样，看不懂。
   ============================================================ */
.pv-ct-ov { display: flex; flex-direction: column; gap: 14px; background: transparent; padding: 26px 28px 32px; container-type: inline-size; container-name: ov; }   /* 1.0.248：浅底铺在 .pv-work-scroll 上（滚动条也在底色里），这儿不再自己铺 */   /* 2a（用户 2026-10-28 稿）：铺一层浅底，白块靠底色分开，不描边 */
.pv-ct-ov-head { display: flex; align-items: center; gap: 8px; padding: 2px 2px 0; }
.pv-ct-ov-head .sp { flex: 1; }
/* 日期那一行的两颗（稿 1e）：浅灰底 / 主色实心，同高同字号 */
.pv-ct-ovbtn { height: 32px; padding: 0 14px; border: 0; border-radius: 9px; background: var(--pv-ct-field); color: var(--pv-text); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 500; cursor: pointer; white-space: nowrap; }   /* 稿 2a：浅灰底 */
.pv-ct-ovbtn:hover { background: var(--pv-ct-btn); }
.pv-ct-ovbtn.primary { background: var(--pv-primary); color: #fff; font-weight: 600; }
.pv-ct-ovbtn.primary:hover { background: var(--pv-primary-dark); }
.pv-ct-ov-head b { font-size: calc(20px + var(--pv-fz-add, 0px)); font-weight: 800; color: var(--pv-text); }
.pv-ct-ov-head span { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (max-width: 640px) {
  .pv-ct-ov { padding: 14px 12px 24px; }   /* 手机：白卡两边别空那么多（用户 2026-10-29） */
  .pv-ct-ov-head b { font-size: calc(17px + var(--pv-fz-add, 0px)); white-space: nowrap; }   /* 「10 月 29 日 周四」「北京时间」一行写完，不折 */
  .pv-ct-ov-head span { white-space: nowrap; }
  .pv-ct-ovbtn { height: 30px; padding: 0 12px; }
}
@media (max-width: 400px) { .pv-ct-ov-head > span:not(.sp) { display: none; } }   /* 再窄一档连「北京时间」也不写 */
.pv-ct-ov-card { background: var(--pv-surface); border: 0; border-radius: var(--pv-card-r); padding: 18px 20px; min-width: 0; }   /* 去描边（稿 2a） */
.pv-ct-ov-t { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; white-space: nowrap; font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); margin-bottom: 10px; }
.pv-ct-ov-next .pv-ct-ov-t { align-items: center; margin-bottom: 18px; }
.pv-ct-ov-t.big { font-size: calc(16px + var(--pv-fz-add, 0px)); font-weight: 800; color: var(--pv-text); }
.pv-ct-ov-t .sub { font-weight: 400; color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-ct-ov-empty { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ct-ov-foot { margin-top: 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 用 flex-wrap 而不是固定几列：这一栏的宽度跟左右两栏一起变，只看视口宽度会在中间宽度上挤成一团
   （用户 2026-09-23）。放不下就整块换行，每块都有自己的最小宽度。 */
/* 稿 2a（用户 2026-10-28 第二遍）：第一排三张 1.15 / 1.35 / 1，第二排 2.5 / 1，间距 14；窄了再两列、单列 */
.pv-ct-ov-r1 { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; align-items: stretch; }   /* 「下一件」独占一整排（用户 2026-11-04）：屏幕越宽日历页排得越多；本月生日也整排，名单按宽度分几列 */
.pv-ct-ov-r1 .pv-ct-ov-bdlist { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(220px, 100%), 1fr)); column-gap: 18px; }
.pv-ct-ov-r1 > .pv-ct-ov-card { min-width: 0; }
.pv-ct-ov-r2 { display: grid; grid-template-columns: minmax(0, 2.5fr) minmax(0, 1fr); gap: 14px; align-items: start; }
.pv-ct-ov-r2 > .pv-ct-ov-card { min-width: 0; }
.pv-ct-ov-side { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
/* 几列按中栏自己的宽度定（1440 的屏中栏只有 720 宽，三列每张才 215，日历牌只能上下排、热力格也折行）：
   不到 940 两列（本月生日整行、名单回到多列），不到 600 单列 */
@container ov (max-width: 940px) {
  .pv-ct-ov-r1 { grid-template-columns: repeat(2, minmax(0, 1fr)); }   /* 下一件 / 本月生日并排一行（用户 2026-10-29：原来生日独占一行，下一件右边空一半） */
  .pv-ct-ov-bdlist { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(200px, 100%), 1fr)); gap: 0 18px; }
}
@container ov (max-width: 760px) { .pv-ct-ov-r2 { grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); } }
/* 中栏不到 760（MacBook 两边栏都开着时只有五六百）：并排的话「下一件」一张卡才 260，两张日历页各 110，标题三四个字就折行（用户 2026-11-04）。
   改成「下一件」独占一行、两张日历页各 240 左右；本月生日落到下面，名单按上面那条 auto-fill 排两列，不再右边一长条空白 */
@container ov (max-width: 760px) {
  .pv-ct-ov-r1 { grid-template-columns: minmax(0, 1fr); }
  .pv-ct-ov-r1 .pv-ct-ov-bdlist { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(220px, 100%), 1fr)); column-gap: 18px; }   /* 多写一层：后面「竖着一人一行」那条 flex 会盖掉上面 940 那条 grid */
}
@container ov (max-width: 520px) { .pv-ct-ov-r1, .pv-ct-ov-r2 { grid-template-columns: minmax(0, 1fr); } }   /* MacBook 上中栏五六百宽也要两张一行（用户 2026-10-28：一页信息太少） */

/* 日期方块：总览时间线和一个人的联系安排共用 */
.pv-ct-daytile { flex: none; display: flex; flex-direction: column; align-items: center; justify-content: center;
                 width: 44px; height: 44px; border-radius: 10px; background: var(--pv-bg); }
.pv-ct-daytile b { font-size: calc(17px + var(--pv-fz-add, 0px)); font-weight: 800; line-height: 1; font-variant-numeric: tabular-nums; }
.pv-ct-daytile i { font-size: calc(10px + var(--pv-fz-add, 0px)); font-style: normal; line-height: 1.5; }
.pv-ct-daytile b.word { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; white-space: nowrap; }   /* 「听说」两个字，不是数字 */
/* 月在上、日在下的那种（登记 / 认识序列）：小字压一点，整块还是上下居中 */
.pv-ct-daytile.mtop i { line-height: 1.3; margin-bottom: 2px; }
.pv-ct-daytile.lg { width: 52px; height: 56px; border-radius: 12px; }
.pv-ct-daytile.lg b { font-size: calc(22px + var(--pv-fz-add, 0px)); }
.pv-ct-daytile.lg i { font-size: calc(10.5px + var(--pv-fz-add, 0px)); }
.pv-ct-daytile.plan { background: var(--pv-ev-plan-soft); color: var(--pv-ev-plan); }
.pv-ct-daytile.fest { background: var(--pv-ev-fest-soft); color: var(--pv-ev-fest); }
.pv-ct-daytile.gift { background: var(--pv-ev-gift-soft); color: var(--pv-ev-gift); }
.pv-ct-daytile.bday { background: var(--pv-ev-bday-soft); color: var(--pv-ev-bday); }
.pv-ct-daytile.today { background: var(--pv-primary); color: #fff; }
.pv-ct-daytile.overdue { background: var(--pv-danger-soft, #FDECEC); color: var(--pv-danger); }
.pv-ct-daytile.past { background: #f3f4f7; color: var(--pv-text-soft); height: 36px; }
.pv-ct-daytile.past b { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; }

/* ① 下一件 */
/* 「下一件」卡（用户 2026-10-05）：上半 = 日期块 + 这一天的日历信息（公历 / 农历 / 节日），一道横线，下半 = 排的那件事 */
.pv-ct-ov-next-day { display: flex; align-items: center; gap: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--pv-border); }
.pv-ct-ov-next-cal { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.pv-ct-ov-next-cal .d { display: flex; align-items: center; gap: 8px; }
.pv-ct-ov-next-cal .d b { font-size: calc(14px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 700; color: var(--pv-text); white-space: nowrap; }
/* 「后天 / 3 天后」自己占一行，排在日期和农历底下（用户 2026-10-06） */
.pv-ct-ov-next-cal .w { display: flex; margin-top: 2px; }
.pv-ct-ov-next-cal .w em { flex: none; display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; background: color-mix(in srgb, currentColor 12%, transparent); font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; white-space: nowrap; }
.pv-ct-ov-next-cal .w em.plan { color: var(--pv-ev-plan); } .pv-ct-ov-next-cal .w em.fest { color: var(--pv-ev-fest); }
.pv-ct-ov-next-cal .w em.gift { color: var(--pv-ev-gift); } .pv-ct-ov-next-cal .w em.bday { color: var(--pv-ev-bday); }
.pv-ct-ov-next-cal .l { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ct-ov-next-cal .f { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 2px; }
.pv-ct-ov-next-cal .f i { display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px));
                          font-weight: 600; line-height: 1; white-space: nowrap; background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-ct-ov-next-ev { display: flex; flex-direction: column; gap: 6px; padding-top: 12px; min-width: 0; }
.pv-ct-ov-next-ev.link { cursor: pointer; }
.pv-ct-ov-next-ev .l1 { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.pv-ct-ov-next-ev .l1 em { flex: none; font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; }
.pv-ct-ov-next-ev .l1 .bd { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.pv-ct-ov-next-ev .l1 .t { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.pv-ct-ov-next-ev .l1 b { min-width: 0; font-size: calc(15px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); line-height: 1.45;
                          display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }   /* 标题在这儿有地方，放三行，不再一行截断 */
.pv-ct-ov-next-ev .l1 i { flex: none; font-style: normal; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ct-ov-next-who { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; margin-top: 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-soft); }
.pv-ct-ov-next-who .one { display: inline-flex; align-items: center; gap: 5px; min-width: 0; }
.pv-ct-ov-next-who .one .pv-ct-face { flex: none; }
.pv-ct-ov-next-who .one .n { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.k.plan { color: var(--pv-ev-plan); } .k.fest { color: var(--pv-ev-fest); }
.k.gift { color: var(--pv-ev-gift); } .k.bday { color: var(--pv-ev-bday); }

/* ② 热力格
   图例跟在格子右边。它的起步宽度原来写的是 130px：卡片内宽 315 时右边只剩 97，图例放不下、整块掉到格子底下，
   格子右边就空出一大片（用户 2026-09-28）。图例最长的一行「两件事」才 55px，起步宽度收到 72 就坐得回右边。
   图例左边比别处多留 14（合起来 28）：它跟格子是两样东西，贴着读起来像格子的第九列（用户 2026-09-28）。
   卡片再窄、右边真放不下时，换成上下排：格子按宽度撑满，图例横着排一行——哪种都不留空。
   并排最少要 304（星期 18 + 14 + 格子 172 + 28 + 图例 72）；门槛定在 310，留几个像素的余量——
   正好卡在 303.x 的时候两边都不算，图例会自己掉下去又不换排法。 */
/* 格子是正方形、列数按卡宽算（用户 2026-10-29）：contacts-view.measureHeat 量了 .pv-ct-heat-body 的宽，
   按「格子 30 上下、缝 6」算出列数（--pv-heat-cols，8～40）和边长（--pv-heat-h），写在 .pv-ct-heat-wrap 的行内变量上；
   这里只负责按变量排。图例固定在右边。 */
.pv-ct-heat-wrap { display: flex; align-items: flex-start; flex-wrap: wrap; gap: 10px 14px; container-type: inline-size;
                   --pv-heat-gap: 6px; --pv-heat-cols: 8; --pv-heat-h: 30px; --pv-heat-cell: var(--pv-heat-h); --pv-heat-today-bg: #FBE4E1; --pv-heat-today-fg: #C8961E; }
.pv-ct-heat-side { display: grid; grid-template-rows: repeat(7, var(--pv-heat-h)); gap: var(--pv-heat-gap); width: 18px; margin-top: 16px; }
.pv-ct-heat-side span { font-size: calc(10.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: var(--pv-heat-h); }
.pv-ct-heat-body { flex: 1 1 auto; min-width: 0; }
.pv-ct-heat-months { display: grid; grid-template-columns: repeat(var(--pv-heat-cols), minmax(0, 1fr)); gap: var(--pv-heat-gap); margin-bottom: 2px; height: 14px; }
.pv-ct-heat-months span { font-size: calc(10.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; min-width: 0; }
.pv-ct-heat { display: grid; grid-template-rows: repeat(7, var(--pv-heat-h)); grid-template-columns: repeat(var(--pv-heat-cols), minmax(0, 1fr)); grid-auto-flow: column; gap: var(--pv-heat-gap); }
.pv-ct-heat .cell { width: auto; min-width: 0; height: var(--pv-heat-h); border-radius: 5px; display: inline-flex; align-items: center; justify-content: center; }
/* 今天：浅红底 + 金色「今」（用户 2026-10-29），不画外框；底色在 heatStyle 里写成行内（跟事件的填色是同一处） */
.pv-ct-heat .cell.is-today i { font-style: normal; font-weight: 800; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1; color: var(--pv-heat-today-fg); }
.pv-ct-heat .cell.is-on { cursor: pointer; }
.pv-ct-heat .cell.is-past { opacity: .35; }
.pv-ct-heat-legend { flex: 0 0 auto; min-width: 0; margin-left: 4px; padding-top: 16px; display: flex; flex-direction: column; gap: 7px; align-self: flex-start; }
.pv-ct-ov-r1b > .pv-ct-ov-card { min-width: 0; }
.pv-ct-ov-heat { padding: 18px; }   /* 四边一致（用户 2026-10-28） */
.pv-ct-ov-heat .pv-ct-ov-t { margin-bottom: 12px; }
.pv-ct-ov-heat .pv-ct-heat-wrap { gap: 10px 14px; }
.pv-ct-heat .cell { cursor: default; }
/* 悬浮看当天 */
.pv-ct-heat-pop { position: fixed; z-index: 60; transform: translate(-50%, -100%); min-width: 150px; max-width: 280px; padding: 8px 10px; border-radius: 10px; background: #191b23; color: #fff; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; pointer-events: none; box-shadow: 0 6px 20px rgba(25, 27, 35, .18); }
.pv-ct-heat-pop .h { font-weight: 700; margin-bottom: 2px; display: flex; align-items: center; gap: 6px; }
.pv-ct-heat-pop .h i { font-style: normal; font-weight: 400; font-size: 11px; padding: 0 5px; border-radius: 4px; background: rgba(255, 255, 255, .18); }
.pv-ct-heat-pop .e { color: rgba(255, 255, 255, .6); }
.pv-ct-heat-pop .r { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.pv-ct-heat-pop .r em { flex: none; font-style: normal; font-size: 11px; font-weight: 700; }
.pv-ct-heat-pop .r em.plan { color: #F3B95F; } .pv-ct-heat-pop .r em.fest { color: #F2A3B5; } .pv-ct-heat-pop .r em.gift { color: #7FD1C5; } .pv-ct-heat-pop .r em.bday { color: #9DBBF2; }
.pv-ct-heat-pop .r b { font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-heat-pop .r span { flex: none; color: rgba(255, 255, 255, .6); }
.pv-ct-heat-legend .lg { display: flex; align-items: center; gap: 7px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-ct-heat-legend .lg i { flex: none; width: 9px; height: 9px; border-radius: 3px; background: var(--pv-text-faint); }
.pv-ct-heat-legend .lg i.plan { background: var(--pv-ev-plan); } .pv-ct-heat-legend .lg i.fest { background: var(--pv-ev-fest); }
.pv-ct-heat-legend .lg i.gift { background: var(--pv-ev-gift); } .pv-ct-heat-legend .lg i.bday { background: transparent; box-shadow: inset 0 0 0 2px var(--pv-ev-bday); }   /* 生日 = 框 */
.pv-ct-heat-legend .lg b { margin-left: 4px; font-weight: 600; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }   /* 稿 2a：数字跟在名字后面、灰 */
.pv-ct-heat-legend .lg.note { color: var(--pv-text-faint); }
.pv-ct-heat-legend .sep { height: 0; margin: 4px 0; }   /* 稿 2a：不画线 */
.pv-ct-heat-legend i.mark.today { background: var(--pv-heat-today-bg, #FBE4E1); box-shadow: inset 0 0 0 1px rgba(200, 150, 30, .55); }
.pv-ct-heat-legend i.mark.two { background: linear-gradient(135deg, var(--pv-ev-plan) 50%, var(--pv-ev-fest) 50%); }
/* 右边放不下图例：上下排。格子宽 = (容器 − 星期那一列 18 − 列距 14 − 七道缝 35) ÷ 8，最大 30 免得在手机上大得离谱 */
@container (max-width: 340px) {
  .pv-ct-heat-wrap { --pv-heat-gap: 5px; }
  .pv-ct-heat-body { flex: 1 1 0; }   /* BUG-077：原来写 100%，把前面那列星期挤成单独一行（手机上一三五日竖着排了 240px） */
  .pv-ct-heat-legend { flex: 1 1 100%; margin-left: 0; padding-top: 2px; flex-direction: row; flex-wrap: wrap; gap: 6px 16px; }
  .pv-ct-heat-legend .lg b { margin-left: 4px; }
  .pv-ct-heat-legend .sep { display: none; }
}

/* ③ 本月生日（用户 2026-09-28，原来是「星标好友」两排头像）：一人一行——头像 名字 几日 · 满几岁 … 还有几天。
   卡片宽的时候几列并排；过了的压淡，今天的那条用生日那支色。
   卡片窄（这一排三张并着的时候只有两百多宽）就不写满几岁，免得「还有几天」被挤出卡片 */
.pv-ct-ov-bdlist { display: flex; flex-direction: column; gap: 0; margin: 0 -8px; }   /* 稿 2a：竖着一人一行；2026-10-29 起一人两行 */
/* 用户 2026-10-29：一人两行。头像 24 / 名字 13 跟「下一件」底下那排人（.pv-ct-nx.col .pv-ct-nx-who）一个尺码；
   第一行 名字 + 来源签，第二行 几日 · 满几岁，右边还有几天 */
.pv-ct-ov-bd { display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: 0 8px; align-items: start; min-width: 0; border: 0; background: none; font: inherit; text-align: left;
               padding: 5px 8px; border-radius: 8px; color: var(--pv-text); cursor: pointer; overflow: hidden; }
.pv-ct-ov-bd .pv-ct-face { width: 24px; height: 24px; font-size: 11px; }
.pv-ct-ov-bd .bd-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.pv-ct-ov-bd .l1 { display: flex; align-items: center; gap: 6px; min-width: 0; height: 24px; }   /* 名字行跟头像同高、居中 */
.pv-ct-ov-bd .l2 { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pv-ct-ov-bd:hover { background: var(--pv-bg); }
.pv-ct-ov-bd:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: -2px; }
.pv-ct-ov-bd .nm { flex: 0 1 auto; min-width: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 24px; font-weight: 400;   /* 不加粗（用户 2026-10-29） */
                   white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-ov-bd .d { flex: 1 1 auto; min-width: 0; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums; }
.pv-ct-ov-bd .tag { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 6px; border-radius: 4px; white-space: nowrap; }
.pv-ct-ov-bd .tag.ct { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }   /* 人脉：Let's connect 里有档案，点得进去 */
.pv-ct-ov-bd .tag.bk { background: var(--pv-bg); color: var(--pv-text-faint); }               /* 生日簿：只记在「生日与纪念日」里 */
.pv-ct-ov-bd .st { flex: none; margin-left: auto; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-ev-bday); font-weight: 600; white-space: nowrap; }   /* 稿 2a：没过的加粗上色 */
.pv-ct-ov-bd.past { opacity: .55; }      /* 过了的也要看得清（用户 2026-09-28：过过生日的也请展示），只比没过的淡一档 */
.pv-ct-ov-bd.past .st { color: var(--pv-text-faint); font-weight: 400; }
.pv-ct-ov-bd.plain { cursor: default; }
.pv-ct-ov-bd.plain:hover { background: none; }
.pv-ct-ov-bd.now .st { color: var(--pv-ev-bday); font-weight: 600; }

/* 合并时间线 */
.pv-ct-tl-group + .pv-ct-tl-group { margin-top: 10px; }
.pv-ct-tl-gt { display: flex; align-items: center; gap: 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700;
               color: var(--pv-text-faint); letter-spacing: .06em; margin: 6px 0 4px; white-space: nowrap; }
.pv-ct-tl-gt::after { content: none; }   /* 稿 2a：组名后面不拉线 */
/* 右边留 16：悬停时整行有一块底色，右边那几个字（后天 / 还有几天）是光秃秃的文字，贴着底色边 8px 显得要掉出去；
   左边是自带底色的日期方块，8 就够（用户 2026-09-28） */
.pv-ct-tl-row { display: grid; grid-template-columns: 44px minmax(0, 1fr) auto; gap: 14px; align-items: center;
                padding: 7px 16px 7px 8px; border-radius: 10px; cursor: default; }
.pv-ct-tl-row.link { cursor: pointer; }
.pv-ct-tl-row.link:hover { background: var(--pv-bg); }
.pv-ct-tl-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.pv-ct-tl-main .l1 { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.pv-ct-tl-main .l1 em { flex: none; font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; }
.pv-ct-tl-main .l1 b { font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text);
                       min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-tl-main .l1 i { flex: none; font-style: normal; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ct-tl-main .l2 { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 6px; margin-top: 3px;
                     font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-ct-tl-main .l2 em { font-style: normal; color: var(--pv-text-faint); }
.pv-ct-tl-main .l2 .who { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap;
                          padding: 1px 7px 1px 2px; border-radius: 10px; background: var(--pv-bg); color: var(--pv-text); }
.pv-ct-tl-main .l2 .pv-ct-face { width: 18px; height: 18px; font-size: 9.5px; }
/* 「跳过」（用户 2026-09-28）：节日问候那一行的小钮，22 高、描边；悬停那一行才露出来，手机上一直在 */
.pv-ct-tl-end { display: inline-flex; align-items: center; gap: 10px; flex: none; }
.pv-ct-skip { flex: none; height: 22px; padding: 0 9px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); color: var(--pv-text-soft);
              font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; white-space: nowrap; cursor: pointer; opacity: 0; transition: opacity .12s; }
.pv-ct-skip:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-ct-tl-row:hover .pv-ct-skip, .pv-ct-plan-head:hover .pv-ct-skip, .pv-ct-skip:focus-visible { opacity: 1; }
@media (hover: none) { .pv-ct-skip { opacity: 1; } }
.pv-ct-tl-in { flex: none; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-tl-in.near { color: var(--pv-text-faint); font-weight: 400; }   /* 稿 2a：一律灰 */
.pv-ct-tl-flash { animation: pv-ct-tl-flash 1.6s ease; }
@keyframes pv-ct-tl-flash { 0%, 60% { background: var(--pv-primary-soft); } 100% { background: transparent; } }
/* 面板上的小头像只有一个尺码（用户 2026-09-23：到处一样大，而且比树里的小） */
.pv-ct-face.xs, .pv-ct-face.sm { width: 20px; height: 20px; font-size: 10px; }

/* ---------- 星标诊断（contacts-diag.js，用户 2026-09-28） ----------
   我标了星的人一人一张白卡，语言跟总览那几张一样（白底 / 细边 / 圆角 14）。卡里不再套盒子：
   数字那排和每条建议只用横线隔开。一排里的字同一个行高再居中；按钮全是 26 高 12 字那一个尺码（pv-pmo-secbtn），
   「安排上」只换主色实底。要不要关注只画成右上角一枚小签，不给卡片描彩边 */
.pv-dg-bar { align-items: stretch; }               /* 钮跟旁边那组筛选片一样高：不各写各的数，直接拉齐（用户 2026-10-05：差了一两个像素） */
.pv-dg-bar .pv-pmo-secbtn { height: auto; min-height: 28px; box-sizing: border-box; }
.pv-dg-bar .pv-pmo-seg { box-sizing: border-box; }
.pv-dg-bar .pv-pmo-seg button { height: auto; min-height: 26px; }
.pv-dg-bar .pv-dg-last { align-self: center; }
.pv-dg-bar .pv-pmo-secbtn:disabled { opacity: .55; cursor: default; }
.pv-dg-bar .pv-dg-run.going:disabled { opacity: 1; }          /* 在跑的时候这颗钮就是进度，别变灰 */
.pv-dg-last { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 26px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-dg-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 360px), 1fr)); gap: 14px; align-items: start; }
.pv-dg-card { display: flex; flex-direction: column; gap: 12px; min-width: 0; background: var(--pv-surface); border: 1px solid var(--pv-border);
              border-radius: var(--pv-radius); padding: 16px 18px; transition: opacity .15s; }
.pv-dg-card.busy { opacity: .55; }
.pv-dg-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
.pv-dg-who { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; padding: 0; border: 0; background: none; font: inherit; color: inherit;
             text-align: left; cursor: pointer; }
.pv-dg-who:hover .pv-dg-id b { color: var(--pv-primary-dark); }
.pv-dg-id { min-width: 0; display: flex; flex-direction: column; }
.pv-dg-id b { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 20px; font-weight: 700; color: var(--pv-text);
              white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-dg-id .sub { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint);
                 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-dg-lv { flex: none; height: 22px; padding: 0 9px; border-radius: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 22px;
            font-weight: 600; white-space: nowrap; }
.pv-dg-lv.high { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-dg-lv.mid { background: var(--pv-warning-soft); color: var(--pv-warning-text); }
.pv-dg-lv.low { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-dg-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0 12px; padding: 10px 0;
               border-top: 1px solid var(--pv-border); border-bottom: 1px solid var(--pv-border); }
.pv-dg-facts > div { min-width: 0; display: flex; flex-direction: column; }
.pv-dg-facts .k { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-dg-facts .v { font-size: calc(14px + var(--pv-fz-add, 0px)); line-height: 22px; font-weight: 600; color: var(--pv-text);
                  font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-dg-sigs { display: flex; flex-wrap: wrap; gap: 6px; }
.pv-dg .pv-ct-tag.bad { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-dg .pv-ct-tag.warn { background: var(--pv-warning-soft); color: var(--pv-warning-text); }
.pv-dg .pv-ct-tag.info { background: var(--pv-info-soft); color: var(--pv-info-text); }
.pv-dg-hl { font-size: calc(14.5px + var(--pv-fz-add, 0px)); line-height: 1.5; font-weight: 700; color: var(--pv-text); }
.pv-dg-pts { margin: 0; padding: 0 0 0 18px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.7; color: var(--pv-text); }
.pv-dg-an { margin: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.75; color: var(--pv-text-soft); }
.pv-dg-none { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.75; color: var(--pv-text-faint); }
.pv-dg-sec { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 600; color: var(--pv-text-faint); }
.pv-dg-acts { display: flex; flex-direction: column; }
.pv-dg-act { padding: 10px 0; border-top: 1px dashed var(--pv-border); }
.pv-dg-sec + .pv-dg-act { border-top: 0; padding-top: 6px; }
.pv-dg-act:last-child { padding-bottom: 0; }
.pv-dg-act-top { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; }
.pv-dg-act-top .d { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 600; color: var(--pv-ev-plan);
                    font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-dg-act-top .in { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-dg-act-top .pv-ct-tag { font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-dg-act-t { margin-top: 4px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.5; font-weight: 600; color: var(--pv-text); }
.pv-dg-act-note { margin-top: 2px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.65; color: var(--pv-text-soft); }
.pv-dg-act-why { margin-top: 2px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1.65; color: var(--pv-text-faint); }
.pv-dg-act-ops { display: flex; align-items: center; gap: 6px; margin-top: 8px; }
.pv-dg-act-ops .pv-pmo-secbtn:disabled, .pv-dg-foot .pv-pmo-secbtn:disabled { opacity: .5; cursor: default; }
.pv-dg-done { gap: 4px; border-color: var(--pv-success-border); background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-dg-done:hover { border-color: var(--pv-success); color: var(--pv-success-text); }
.pv-dg-foot { display: flex; align-items: center; gap: 8px; min-height: 26px; }
.pv-dg-foot .when { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; }
/* 手机上只留结论：一段分析和顶上「上次诊断」收掉，卡片边距收一点 */
@media (max-width: 860px) {
  .pv-dg-card { padding: 14px; gap: 10px; }
  .pv-dg-an, .pv-dg-last { display: none; }
  .pv-dg-act-ops .pv-pmo-secbtn, .pv-dg-foot .pv-pmo-secbtn { height: 30px; padding: 0 14px; }
  .pv-dg-bar .pv-pmo-secbtn { min-height: 30px; padding: 0 14px; }
}

/* 登记序列（用户 2026-09-27）：总览的白卡语言，一天一行——日期方块 / 这天登记的人 / 几个人。
   日期方块不上色（颜色只标「这是什么事」），只有今天那块是主色；头像走面板那一个尺码，不描深色边 */
.pv-ct-reg { display: flex; flex-direction: column; gap: 12px; }
.pv-ct-reg-head { align-items: center; flex-wrap: wrap; }
.pv-ct-reg-head b, .pv-ct-reg-head > span { line-height: 26px; }
.pv-ct-reg-head .pv-pmo-seg { margin-left: auto; flex: none; }
.pv-ct-reg-head .pv-pmo-seg button { font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-ct-reg-day { display: grid; grid-template-columns: 44px minmax(0, 1fr) auto; gap: 14px; align-items: start; padding: 7px 8px; }
.pv-ct-reg-day .pv-ct-tl-in { line-height: 46px; }   /* 跟日期方块同高，落在方块的中线上 */
/* 认识序列里「大概」的那几行（只知道季节 / 只知道年份）：方块用虚线框，一眼看出这不是一个准日子 */
.pv-ct-reg-day .pv-ct-daytile.approx { background: none; border: 1px dashed var(--pv-border); box-sizing: border-box; color: var(--pv-text-soft); }
.pv-ct-reg-day .pv-ct-daytile.approx b { font-size: calc(16px + var(--pv-fz-add, 0px)); font-weight: 700; }
.pv-ct-reg-people { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 2px 10px; align-content: center; min-width: 0; min-height: 46px; }
.pv-ct-reg-p { display: flex; align-items: center; gap: 8px; min-width: 0; border: 0; background: none; font: inherit; text-align: left;
               padding: 5px 8px; border-radius: 8px; color: var(--pv-text); cursor: pointer; }
.pv-ct-reg-p:hover { background: var(--pv-bg); }
.pv-ct-reg-p:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: -2px; }
.pv-ct-reg-p .nm { flex: 0 0 auto; max-width: calc(100% - 28px); font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600;
                   white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-reg-p .sub { flex: 1 1 0; min-width: 0; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint);
                    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 640px) {
  /* 手机：只留名字，圈子不写 */
  .pv-ct-reg-day { gap: 10px; padding: 7px 0; }
  .pv-ct-reg-people { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 2px 4px; }
  .pv-ct-reg-p { padding: 5px 4px; }
  .pv-ct-reg-p .sub { display: none; }
}

/* 圈子条：灰的，不上色 */
.pv-ct-cbar { padding: 5px 0; cursor: pointer; }
.pv-ct-cbar .l { display: flex; align-items: baseline; gap: 8px; }
.pv-ct-cbar .n { flex: 1; min-width: 0; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text);
                 overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-cbar .v { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-ct-cbar .bar { height: 5px; border-radius: 3px; background: #f0f1f5; margin-top: 4px; overflow: hidden; }
.pv-ct-cbar .bar i { display: block; height: 100%; border-radius: 3px; background: var(--pv-text-faint); }
.pv-ct-cbar:hover .n { color: var(--pv-primary-dark); }

/* 兴趣的马卡龙配色（用户 2026-09-23：全灰太干，来点柔和的）。
   六组浅底 + 同色深字 + 同色浅边，按兴趣所属的分组发色，同组同色。
   注意：这是**兴趣**，跟「这是什么事」那四个事件色（--pv-ev-*）不是一回事，饱和度低一档，不抢戏。 */
.pv-ct-ichip.m1, .pv-ct-istag.m1 { background: #FDEEF2; border-color: #F6D3DC; color: #A8455F; }
.pv-ct-ichip.m2, .pv-ct-istag.m2 { background: #EAF2FD; border-color: #CFE0F6; color: #2F5EA8; }
.pv-ct-ichip.m3, .pv-ct-istag.m3 { background: #EAF6EE; border-color: #CBE7D6; color: #2E7D52; }
.pv-ct-ichip.m4, .pv-ct-istag.m4 { background: #FDF3E3; border-color: #F5E0BC; color: #96651A; }
.pv-ct-ichip.m5, .pv-ct-istag.m5 { background: #F2EDFB; border-color: #DED3F3; color: #5B3FA8; }
.pv-ct-ichip.m6, .pv-ct-istag.m6 { background: #E5F5F4; border-color: #C6E6E3; color: #1A6C66; }
.pv-ct-ichip.m0, .pv-ct-istag.m0 { background: #F3F4F7; border-color: #E1E3EA; color: var(--pv-text-soft); }
.pv-ct-ichip .sc { color: inherit; opacity: .7; }
.pv-ct-istag.on, .pv-ct-istag.on.m1, .pv-ct-istag.on.m2, .pv-ct-istag.on.m3,
.pv-ct-istag.on.m4, .pv-ct-istag.on.m5, .pv-ct-istag.on.m6, .pv-ct-istag.on.m0 {
  background: #191b23; border-color: #191b23; color: #fff;
}
/* 中性兴趣签：总览和一个人的页面共用 */
.pv-ct-istags { display: flex; flex-wrap: wrap; gap: 6px; }
.pv-ct-istag { display: inline-flex; align-items: center; gap: 5px; height: 26px; padding: 0 11px; border-radius: 13px;
               border: 0; background: var(--pv-ct-field); color: var(--pv-text); font-family: inherit;   /* 稿 2a：浅灰底、不描边 */
               font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1; cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-ct-istag b { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-faint); }
.pv-ct-istag:hover { background: var(--pv-ct-btn); }
.pv-ct-istag.on { background: #191b23; color: #fff; }
.pv-ct-istag.on b { color: rgba(255, 255, 255, .7); }

@media (max-width: 900px) {
  .pv-ct-ov-r1 > .pv-ct-ov-heat { order: -1; }
  .pv-ct-heat-legend { padding-top: 8px; }
}

/* 配置的其余四页也用总览那套白卡（用户 2026-09-23：原来那几页跟总览完全不像一家） */
.pv-ct-ovcfg .pv-ct-cfg-sec { border: 0; padding: 0; margin: 0; background: none; }
.pv-ct-ovcfg .pv-ct-cfg-row { min-height: 40px; padding: 0 6px; border-radius: 8px; border-bottom: 1px solid #f4f5f8;
                              font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-ct-ovcfg .pv-ct-cfg-row:last-of-type { border-bottom: 0; }
.pv-ct-ovcfg .pv-ct-cfg-row:hover { background: var(--pv-bg); }
.pv-ct-ovcfg .pv-ct-cfg-name { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 500; color: var(--pv-text); }
.pv-ct-ovcfg .pv-ct-cfg-n { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ct-ovcfg .pv-ct-cfg-ib { width: 24px; height: 24px; border: 0; background: none; border-radius: 6px;
                             color: var(--pv-text-faint); font-size: 13px; }
.pv-ct-ovcfg .pv-ct-cfg-ib:hover { background: var(--pv-surface); color: var(--pv-text); }
.pv-ct-ovcfg .pv-ct-cfg-ib.danger:hover { background: #FDECEC; color: var(--pv-danger); }
.pv-ct-ovcfg .pv-ct-cfg-add { display: flex; gap: 8px; align-items: center; }
.pv-ct-ovcfg .pv-ct-cfg-add .el-input { flex: 1; min-width: 0; }
.pv-ct-ovcfg .pv-addrow { margin-bottom: 4px; }
/* 兴趣分组：每组在卡里用一道虚线分开，不再各自套盒子 */
.pv-ct-ovcfg .pv-ct-ig { border: 0; background: none; padding: 12px 0 0; margin: 0; }
.pv-ct-ovcfg .pv-ct-ig + .pv-ct-ig { border-top: 1px dashed var(--pv-border); }
.pv-ct-ovcfg .pv-ct-ig:first-of-type { padding-top: 2px; }

/* 配置 › 总览（用户 2026-09-23，方案 2b）：三张白卡竖排 */
.pv-ct-ovcfg { display: flex; flex-direction: column; gap: 12px; }
.pv-ct-ovcfg-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 18px; }
.pv-ct-ovcfg-row { display: flex; align-items: center; gap: 8px; min-height: 40px; cursor: pointer; border-radius: 8px; padding: 0 6px; }
.pv-ct-ovcfg-row:hover { background: var(--pv-bg); }
.pv-ct-ovcfg-row .dot { flex: none; width: 9px; height: 9px; border-radius: 50%; background: var(--pv-text-faint); }
.pv-ct-ovcfg-row .dot.plan { background: var(--pv-ev-plan); } .pv-ct-ovcfg-row .dot.fest { background: var(--pv-ev-fest); }
.pv-ct-ovcfg-row .dot.gift { background: var(--pv-ev-gift); } .pv-ct-ovcfg-row .dot.bday { background: var(--pv-ev-bday); }
.pv-ct-ovcfg-row .d { flex: none; width: 40px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); font-variant-numeric: tabular-nums; }
.pv-ct-ovcfg-row .nm { flex: none; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); white-space: nowrap; }
.pv-ct-ovcfg-row .nm.off { color: var(--pv-text-faint); font-weight: 400; }
.pv-ct-ovcfg-row .tip { flex: 1; min-width: 0; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
                        overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-ovcfg-sw { flex: none; }
.pv-ct-ovcfg-sw .el-switch__core { width: 32px !important; height: 18px; border-radius: 9px; }
.pv-ct-ovcfg-sw .el-switch__core::after { width: 14px; height: 14px; top: 1px; left: 1px; }
.pv-ct-ovcfg-sw.is-checked .el-switch__core::after { margin-left: -15px; }
.pv-ct-ovcfg-sep { height: 1px; background: var(--pv-border); margin: 10px 0; }
/* 「去假期安排」那一行：右边一个箭头链接，样子跟开关那一行一样高 */
.pv-ct-ovcfg-arrow { flex: none; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-primary-dark); white-space: nowrap; }
.pv-ct-ovcfg-go:hover .pv-ct-ovcfg-arrow { text-decoration: underline; }
.pv-ct-ovcfg-range { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.pv-ct-ovcfg-range .nm { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap; }
.pv-ct-ovcfg-range .tip { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-ovcfg-fest { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 20px; }
.pv-ct-ovcfg-fest .col { min-width: 0; }
.pv-ct-ovcfg-fest .ch { display: flex; align-items: center; gap: 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px));
                        font-weight: 700; color: var(--pv-text-soft); padding: 2px 6px 6px; }
.pv-ct-ovcfg-fest .ch .faces { display: flex; gap: 4px; }
/* 年度条 */
/* 年度条（用户 2026-09-23 重做）：上一条带放参考节日、中间是条、下一条带放礼品节点。
   标签先在 JS 里算好位置、贴边方式和错行，这儿只负责摆——原来全挤在一起是因为都绝对定位在条上。 */
.pv-ct-year { margin: 6px 0 4px; }
.pv-ct-year .refs, .pv-ct-year .gps { position: relative; height: 34px; }
.pv-ct-year .refs { margin-bottom: 2px; }
.pv-ct-year .gps { margin-top: 2px; }
.pv-ct-year .mk { position: absolute; top: 0; font-style: normal; }
.pv-ct-year .mk em { display: block; font-style: normal; white-space: nowrap; line-height: 16px; }
.pv-ct-year .mk.r1 { top: 17px; }
.pv-ct-year .mk.ac { transform: translateX(-50%); }
.pv-ct-year .mk.ar { transform: translateX(-100%); }
.pv-ct-year .refs .mk em { font-size: calc(10.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ct-year .gps .mk em { font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-ev-gift); }
.pv-ct-year .bar { position: relative; height: 30px; border-radius: 6px; background: #f6f6f9;
                   display: grid; grid-template-columns: repeat(12, 1fr); overflow: visible; }
.pv-ct-year .mo { position: relative; font-size: calc(10.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
                  align-self: end; padding: 0 0 3px 4px; border-left: 1px solid #fff; white-space: nowrap; overflow: hidden; }
.pv-ct-year .mo:first-child { border-left: 0; }
.pv-ct-year .bar i { position: absolute; top: 0; bottom: 0; font-style: normal; }
.pv-ct-year .gpline { width: 3px; margin-left: -1px; background: var(--pv-ev-gift); border-radius: 2px; }
.pv-ct-year .refline { width: 1px; background: #d0d3dc; }
.pv-ct-year .now { width: 2px; top: -5px; bottom: -5px; margin-left: -1px; background: var(--pv-primary); border-radius: 1px; }
/* 礼品节点清单 */
.pv-ct-giftrow { display: grid; grid-template-columns: 92px 96px 56px minmax(0, 1fr) 64px 26px; gap: 8px;
                 align-items: center; min-height: 42px; border-bottom: 1px solid #f4f5f8; }
.pv-ct-giftrow:last-of-type { border-bottom: 0; }
.pv-ct-giftrow .d { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-ct-giftrow .lu { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-ct-giftrow .k { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-ev-gift); white-space: nowrap; }
.pv-ct-giftrow .m { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pv-ct-giftrow .m b { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-giftrow .m em { font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
                       overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-giftrow .n { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); text-align: right; white-space: nowrap; }
@media (max-width: 900px) {
  .pv-ct-ovcfg-grid, .pv-ct-ovcfg-fest { grid-template-columns: minmax(0, 1fr); }
  .pv-ct-giftrow { grid-template-columns: 84px 56px minmax(0, 1fr) 26px; }
  .pv-ct-giftrow .lu, .pv-ct-giftrow .n { display: none; }
}

/* ============================================================
   快乐社交 · 一个人的页面（用户 2026-09-23，方案 3a）
   布局和交互照旧，只改颜色和细节：圈子 / 兴趣一律中性描边，橙色只留给星标。
   ============================================================ */
.pv-ct-face.xl { width: 60px; height: 60px; font-size: 24px; }
.pv-ct-head h2 { font-size: calc(22px + var(--pv-fz-add, 0px)); font-weight: 800; }
/* 圈子签：去掉蓝底，改中性描边 */
.pv-ct-circle { background: #fff !important; color: var(--pv-text-soft) !important; border: 1px solid #dcdfe7;
                height: 20px; border-radius: 5px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400;
                display: inline-flex; align-items: center; padding: 0 7px; line-height: 1; }
/* 事实行的「关系 / 兴趣」写成字，不用表情 */
.pv-ct-fact .k { width: 28px; margin-right: 4px; text-align: left; font-size: calc(11.5px + var(--pv-fz-add, 0px));
                 color: var(--pv-text-faint); line-height: 20px; }
.pv-ct-frel .n { text-decoration: underline; text-decoration-color: #dcdfe7; text-underline-offset: 3px; }
/* 兴趣签：撤掉组色，中性胶囊；评分是灰数字，不带 ★ */
.pv-ct-ichip { background: #fff; color: var(--pv-text); border: 1px solid #dcdfe7;
               height: 24px; border-radius: 12px; padding: 0 11px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-ct-ichip.shared { box-shadow: none; }
.pv-ct-ichip .sc { margin-left: 5px; font-size: calc(11px + var(--pv-fz-add, 0px)); font-weight: 600;
                   color: var(--pv-text-faint); opacity: 1; }
.pv-ct-also .sc2 { color: var(--pv-text-faint); }
/* 星标只用品牌橙 */
.pv-ct-star:hover, .pv-ct-star.on { color: var(--pv-primary); }
.pv-ct-star:hover .pv-star path, .pv-ct-star.on .pv-star path { stroke: var(--pv-primary); }
.pv-ct-starseg button i, .pv-ct-starseg button .pv-star path { color: var(--pv-primary); stroke: var(--pv-primary); }
.pv-ct-acts .pv-pmo-secbtn { white-space: nowrap; flex: none; }
/* 联系小结三卡 */
.pv-ct-sum { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
.pv-ct-sum-card { background: var(--pv-surface); border: 0; border-radius: var(--pv-card-r); padding: 13px 16px; min-width: 0; }   /* 稿 3a：去描边 */
.pv-ct-sum-card .k { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-bottom: 4px; }
.pv-ct-sum-card .v { font-size: calc(18px + var(--pv-fz-add, 0px)); font-weight: 800; color: var(--pv-text);
                     font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-ct-sum-card .v.plan { color: var(--pv-ev-plan); }
.pv-ct-sum-card .v.off { color: var(--pv-text-faint); font-weight: 600; }
.pv-ct-sum-card .s { margin-top: 3px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
                     overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-sum-card .s.plan { color: var(--pv-ev-plan); font-weight: 600; }
/* 基本信息：标签靠左、值紧跟，实线分隔 */
.pv-ct-kv > div { display: grid; grid-template-columns: 76px minmax(0, 1fr); gap: 10px; justify-content: start;
                  min-height: 32px; align-items: center; border-bottom: 1px solid #f4f5f8; }
.pv-ct-kv > div:last-child { border-bottom: 0; }
/* 人页（用户 2026-10-28 稿 3a）：主区铺浅底，板块白底不描边，行间不画线；头部小签 / 按钮浅灰底无描边 */
.pv-ct-sec-n { font-weight: 400; color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ct-person .pv-ct-kv > div { border-bottom: 0; }
/* 人页的样式整块在文件末尾「人页 v2」那一段（1.0.248） */
.pv-ct-kv > div > b { text-align: left; font-weight: 500; }
.pv-ct-kv a { color: var(--pv-primary-dark); }
/* 值右边的补充（用户 2026-09-27：生日右边写现在多大、还有几天过生日）：浅灰、用「·」隔开，七天内的那句换主色 */
.pv-ct-kv > div > b.has-x { display: flex; flex-wrap: wrap; column-gap: 12px; overflow: visible; }   /* 放不下就整段换到下一行，不从一句话中间折 */
.pv-ct-kv-x { display: inline-flex; align-items: center; gap: 8px; font-weight: 400; white-space: nowrap; }
.pv-ct-kv-x em { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 22px; }
.pv-ct-kv-x em + em::before { content: "·"; margin: 0 8px 0 0; color: var(--pv-text-faint); font-weight: 400; }
.pv-ct-kv-x em.soon { color: var(--pv-primary-dark); font-weight: 600; }
/* 岁数（用户 2026-09-28）：核心信息，挂在名字后面。主色浅底的小签，颜色照「生日与纪念日」页那枚「现在多大」（.pv-ann-age），
   字大一号、加粗——那边是名字后面的补充，这边是头部的主角 */
.pv-ct-age { flex: none; display: inline-flex; align-items: center; height: 24px; box-sizing: border-box; padding: 0 11px; border-radius: var(--pv-radius-pill);
             background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1; font-weight: 600;
             white-space: nowrap; }
/* 基本信息里占一整行的（兴趣那排小签，从头部挪下来的） */
.pv-ct-kv > div.wide { grid-column: 1 / -1; align-items: start; }
.pv-ct-kv > div.wide > span { line-height: 32px; }
.pv-ct-kv > div > b.chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 5px 0; overflow: visible; }
/* 共同兴趣：实线分隔、没人时一个「—」 */
.pv-ct-also > div { border-bottom: 1px solid #f4f5f8; }
.pv-ct-also > div:last-child { border-bottom: 0; }
@media (max-width: 900px) { .pv-ct-sum { grid-template-columns: minmax(0, 1fr); } }

/* ============================================================
   行程（用户 2026-09-25）：一段区间，跟假期一样走顶上的横条。
   回程未定的右端开口 —— 不知道哪天结束，就别画出一个结尾。
   ============================================================ */
/* 行程用浅蓝（用户 2026-10-02：原来的浅紫跟假期撞色，要浅蓝） */
.k-trip { --pv-k: #2F7FC1; }
.k-trip .pv-cal-dot, .pv-cal-chip.k-trip { background: #2F7FC1; }
.pv-cal-band.pv-cal-band-trip .pv-cal-band-item {
  background: #E6F1FB; color: #1F5FA8; box-shadow: inset 0 0 0 1px #C6DDF3;
}
.pv-cal-band.pv-cal-band-trip .pv-cal-band-item.open {
  /* 右端渐隐 + 一道虚边：这一段还没有头 */
  -webkit-mask-image: linear-gradient(90deg, #000 78%, rgba(0, 0, 0, .25) 100%);
  mask-image: linear-gradient(90deg, #000 78%, rgba(0, 0, 0, .25) 100%);
  border-right: 1px dashed #9CBFE4;
}
.pv-cal-band.pv-cal-band-trip .pv-cal-band-n { background: rgba(31, 95, 168, .12); color: #1F5FA8; }
/* 行程页 */
.pv-trip-sec + .pv-trip-sec { margin-top: 14px; }
.pv-trip-row { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 14px; min-height: 42px;
               padding: 6px 10px; margin: 0 -10px; border-radius: 10px; cursor: pointer;
               border-bottom: 1px solid #f4f5f8; }
.pv-trip-row:last-child { border-bottom: 0; }
.pv-trip-row:hover { background: var(--pv-bg); }
.pv-trip-row.on { background: #F8F6FD; }
.pv-trip-row.is-past { opacity: .6; }
.pv-trip-row .who { font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text);
                    white-space: nowrap; flex-shrink: 0; }
.pv-trip-row .span { display: inline-flex; align-items: center; gap: 7px; font-size: calc(13px + var(--pv-fz-add, 0px));
                     color: var(--pv-text-soft); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-trip-row .span b { font-weight: 600; color: var(--pv-text); }
.pv-trip-row .span b.undone { color: var(--pv-danger); font-weight: 500; }
.pv-trip-row .arrow { font-style: normal; color: var(--pv-text-faint); }
.pv-trip-row .arrow.open { color: var(--pv-danger); }
.pv-trip-row .train { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-trip-row .sub { margin-left: auto; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint);
                    white-space: nowrap; }
.pv-trip-row .acts { flex: none; }
/* 一趟一张卡（用户 2026-09-30）：套任务卡 .pv-tc 那套，标题不钉 4 行高（行程标题就一两行）；在外面的那张浅紫底 */
.pv-trip-grid { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
.pv-tc.pv-trip-card .pv-tc-head { height: auto; }
.pv-tc.pv-trip-card .pv-tc-title { -webkit-line-clamp: 3; }
.pv-tc.pv-trip-card.on { background: #F8F6FD; }
.pv-tc.pv-trip-card.is-past { opacity: .6; }
.pv-tc.pv-trip-card .pv-tc-due b { font-weight: 600; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-tc.pv-trip-card .pv-tc-due.now b { color: inherit; }
.pv-tc.pv-trip-card .pv-tc-due b.undone { color: var(--pv-danger); font-weight: 500; }
.pv-trip-arrow { color: var(--pv-text-faint); } .pv-trip-arrow.open { color: var(--pv-danger); }
.pv-trip-foot { display: flex; justify-content: flex-end; }
.pv-trip-seg { margin-top: 6px; }
.pv-trip-kind { margin-top: 14px; }
.pv-trip-one { flex: none; display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-soft); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; white-space: nowrap; }   /* 单程小签（用户 2026-10-06） */
.pv-trip-seg button { height: 26px; padding: 0 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }

/* ---------- 头像裁剪（avatar-crop.js，用户 2026-10-05） ---------- */
.pv-avc-dialog .el-dialog__body { padding: 12px 20px 4px; }
.pv-avc-stage { position: relative; margin: 0 auto; overflow: hidden; border-radius: var(--pv-radius-sm); background: #111; cursor: grab; touch-action: none; user-select: none; }
.pv-avc-stage:active { cursor: grabbing; }
.pv-avc-img { position: absolute; left: 0; top: 0; max-width: none; transform-origin: 0 0; pointer-events: none; }
.pv-avc-mask { position: absolute; inset: 0; border-radius: 50%; box-shadow: 0 0 0 999px rgba(0, 0, 0, .5); border: 1.5px solid rgba(255, 255, 255, .9); pointer-events: none; }
.pv-avc-zoom { display: flex; align-items: center; gap: 10px; width: 280px; margin: 14px auto 4px; color: var(--pv-text-faint); }
.pv-avc-zoom input { flex: 1; min-width: 0; accent-color: var(--pv-primary); }
.pv-avc-zoom i { font-size: 16px; line-height: 1; }

/* ---------- 全局搜索（global-search.js，用户 2026-10-05）：⌘K 浮出来的那一条，照 Spotlight 的样子 ---------- */
.pv-gsearch { position: fixed; inset: 0; z-index: 3000; display: flex; justify-content: center; align-items: flex-start; padding: 12vh 16px 0; background: rgba(20, 24, 40, .38); }
.pv-gsearch-box { width: min(680px, 100%); max-height: 70vh; display: flex; flex-direction: column; background: var(--pv-surface); border-radius: 14px; overflow: hidden;
             box-shadow: 0 24px 70px rgba(20, 24, 40, .35); }
.pv-gsearch-top { display: flex; align-items: center; gap: 10px; padding: 0 16px; height: 54px; border-bottom: 1px solid var(--pv-border); color: var(--pv-text-faint); }
.pv-gsearch-top > i { flex: none; font-size: 18px; line-height: 1; }
.pv-gsearch-inp { flex: 1; min-width: 0; height: 100%; border: 0; outline: 0; background: none; font: inherit; font-size: 17px; color: var(--pv-text); }
.pv-gsearch-inp::placeholder { color: var(--pv-text-faint); }
.pv-gsearch kbd { flex: none; display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 5px; border: 1px solid var(--pv-border); border-radius: 5px;
             background: var(--pv-bg); font: inherit; font-size: 11px; line-height: 1; color: var(--pv-text-soft); }
.pv-gsearch-list { flex: 1; min-height: 0; overflow-y: auto; padding: 6px 8px 8px; }
.pv-gsearch-empty { padding: 26px 0; text-align: center; color: var(--pv-text-faint); font-size: 13.5px; }
.pv-gsearch-gt { display: flex; align-items: center; gap: 6px; padding: 10px 10px 4px; font-size: 12px; line-height: 18px; font-weight: 700; letter-spacing: .04em; color: var(--pv-text-faint); }
.pv-gsearch-gt .ico { font-size: 13px; }
.pv-gsearch-gt .more { margin-left: auto; font-weight: 400; letter-spacing: 0; }
.pv-gsearch-item { display: flex; align-items: center; gap: 10px; height: 38px; padding: 0 10px; border-radius: 8px; cursor: pointer; font-size: 14px; line-height: 20px; }
.pv-gsearch-item.on { background: var(--pv-brand-soft); }
.pv-gsearch-ico { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 6px; font-size: 14px; line-height: 1;
                   background: var(--pv-bg); color: var(--pv-text-soft); }
/* 一种东西一个颜色（用户 2026-10-06）：项目黄、任务灰蓝、里程碑蓝、周期青、文件夹橙、文档链接浅蓝、附件灰、人紫 */
.pv-gsearch-ico.k-project { background: var(--pv-brand-soft); color: var(--pv-brand-dark); }
.pv-gsearch-ico.k-task { background: #EEF1F6; color: #4A5672; }
.pv-gsearch-ico.k-milestone { background: #E4ECFB; color: #1D4ED8; }
.pv-gsearch-ico.k-cycle { background: #E6F7F5; color: #0F766E; }
.pv-gsearch-ico.k-folder { background: #FDEBD3; color: #B45309; }
.pv-gsearch-ico.k-doc { background: #E6F1FB; color: #1F5FA8; }
.pv-gsearch-ico.k-person, .pv-gsearch-ico.k-plan { background: #F0EAFB; color: #6D3FC4; }
.pv-gsearch-ico.k-history, .pv-gsearch-ico.k-module { background: none; color: var(--pv-text-faint); }
.pv-gsearch-t { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); font-weight: 400; }
.pv-gsearch-t.strong { font-weight: 700; }      /* 只有项目加粗 */
.pv-gsearch-t.done { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-gsearch-gt .clear { cursor: pointer; }
.pv-gsearch-gt .clear:hover { color: var(--pv-brand-dark); }
.pv-gsearch-item.on .pv-gsearch-t { color: var(--pv-brand-dark); }
.pv-gsearch-s { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12.5px; color: var(--pv-text-faint); }
.pv-gsearch-open { flex: none; font-size: 12px; color: var(--pv-brand-dark); white-space: nowrap; }
.pv-gsearch-foot { display: flex; gap: 16px; padding: 8px 16px; border-top: 1px solid var(--pv-border); font-size: 12px; line-height: 20px; color: var(--pv-text-faint); }
.pv-gsearch-foot span { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
@media (max-width: 640px) { .pv-gsearch { padding-top: 8px; } .pv-gsearch-box { max-height: 82vh; } .pv-gsearch-foot { display: none; } }

/* ---------- 项目管理 · 打卡板块（pmo-checkin.js，用户 2026-10-06）：一天一张大格子，打了的整格是孩子挑的那张图 ---------- */
.pv-ck-head { display: flex; align-items: center; gap: 16px; margin-bottom: 14px; }
.pv-ck-title { flex: 1; min-width: 0; font-size: calc(15px + var(--pv-fz-add, 0px)); line-height: 22px; color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ck-stats { display: flex; gap: 18px; flex: none; }
.pv-ck-stats > div { display: flex; flex-direction: column; align-items: center; }
.pv-ck-stats .v { font-size: calc(20px + var(--pv-fz-add, 0px)); font-weight: 800; line-height: 24px; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-ck-stats .v.hot { color: var(--pv-brand-dark); }
.pv-ck-stats .k { font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 16px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-gear { flex: none; }
.pv-ck-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 10px; }
.pv-ck-tile { position: relative; aspect-ratio: 3 / 4; min-width: 0; padding: 0; border: 1px solid var(--pv-border); border-radius: 12px; overflow: hidden; cursor: pointer;
              background: var(--pv-bg); font-family: inherit; text-align: left; transition: transform .12s, box-shadow .12s, border-color .12s; }
.pv-ck-tile:hover:not(:disabled) { border-color: var(--pv-brand); transform: translateY(-1px); }
.pv-ck-tile.today { background: var(--pv-surface); border-color: var(--pv-brand); box-shadow: 0 4px 14px var(--pv-brand-glow); }
.pv-ck-tile.future { cursor: default; opacity: .7; }
.pv-ck-tile.on { border-color: transparent; background: linear-gradient(160deg, var(--pv-brand) 0%, #F7B955 100%); animation: pv-ck-pop .32s ease-out; }
.pv-ck-tile.busy { opacity: .6; }
.pv-ck-img { position: absolute; inset: 0; width: 100%; height: 100%; max-width: none; object-fit: cover; }
.pv-ck-date { position: absolute; left: 10px; top: 8px; display: flex; flex-direction: column; z-index: 1; }
.pv-ck-date b { font-size: calc(24px + var(--pv-fz-add, 0px)); line-height: 28px; font-weight: 800; font-style: italic; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-ck-date i { font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 16px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-tile.today .pv-ck-date b, .pv-ck-tile.today .pv-ck-date i { color: var(--pv-text); }
.pv-ck-tile.on .pv-ck-date b, .pv-ck-tile.on .pv-ck-date i { color: #fff; text-shadow: 0 1px 4px rgba(0, 0, 0, .45); }
.pv-ck-mark { position: absolute; right: 10px; bottom: 10px; display: flex; align-items: center; justify-content: center; width: 46px; height: 46px; border-radius: 50%;
              border: 1.5px dashed #cfd3df; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 1; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-tile.today .pv-ck-mark { border: 0; background: var(--pv-brand); color: #fff; font-weight: 700; }
.pv-ck-tile.miss:hover .pv-ck-mark { border-color: var(--pv-brand); color: var(--pv-brand-dark); }
.pv-ck-mark.done { border: 0; background: rgba(255, 255, 255, .28); color: #fff; font-size: 24px; }
.pv-ck-undo { position: absolute; inset: auto 0 0 0; padding: 6px 4px; background: rgba(20, 24, 40, .72); color: #fff; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; text-align: center; white-space: nowrap; z-index: 2; }
@keyframes pv-ck-pop { 0% { transform: scale(.86); } 60% { transform: scale(1.05); } 100% { transform: scale(1); } }
@media (prefers-reduced-motion: reduce) { .pv-ck-tile.on { animation: none; } }
.pv-ck-more { margin-top: 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-ck-more a, .pv-ck-hint a { color: var(--pv-brand-dark); cursor: pointer; }
.pv-ck-hint { margin-top: 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-ck-rewards { margin-top: 14px; border-top: 1px solid var(--pv-border); }
/* 一行是 grid（1.0.227）：每一列有上限、能缩，各块钉死在自己那一列（见文件末尾「奖励 / 轮次那几行成列」那段） */
.pv-ck-reward { display: grid; grid-template-columns: auto minmax(0, 1fr) minmax(0, 150px) 54px 90px minmax(0, 262px); align-items: center; gap: 10px; padding: 9px 0; border-bottom: 1px solid var(--pv-border); font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-ck-reward .n { flex: none; font-weight: 700; color: var(--pv-brand-dark); white-space: nowrap; }
.pv-ck-reward .t { flex: 1; min-width: 0; color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ck-reward .bar { flex: none; width: 90px; height: 6px; border-radius: 3px; background: var(--pv-bg); overflow: hidden; }
.pv-ck-reward .bar i { display: block; height: 100%; background: var(--pv-brand); border-radius: 3px; }
.pv-ck-reward .left { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-earned { margin-top: 14px; }
.pv-ck-sec { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 700; letter-spacing: .04em; color: var(--pv-text-faint); margin-bottom: 4px; }
.pv-ck-earn { display: flex; align-items: center; gap: 10px; padding: 7px 0; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-ck-earn .t { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-ck-earn.got .t { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-ck-earn .s { flex: 1; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
/* 达成奖励的庆祝弹窗（1.0.235 改名 pv-ck-win：原来叫 pv-ck-cheer，跟顶上那条绿色横幅撞了类名，弹窗被染成左对齐的绿底，BUG-071）：
   图居中、大字「连续 N 天」、底下一行起止 · 目标、奖励一枚胶囊、按钮居中 */
.pv-ck-win .el-dialog__header { display: none; }
.pv-ck-win .el-dialog__body { padding: 26px 24px 8px; text-align: center; }
.pv-ck-win .el-dialog__footer { text-align: center; padding: 8px 20px 22px; }
.pv-ck-win-img { width: 150px; height: 200px; object-fit: cover; border-radius: 14px; margin: 0 auto 16px; display: block; box-shadow: 0 8px 24px rgba(20, 24, 40, .2); }
.pv-ck-win-big { font-size: 22px; font-weight: 800; color: var(--pv-brand-dark); line-height: 30px; }
.pv-ck-win-rg { margin-top: 4px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); }
.pv-ck-win-t { margin: 12px auto 0; display: inline-block; max-width: 100%; padding: 5px 14px; border-radius: 999px; background: var(--pv-brand-soft); color: var(--pv-brand-dark); font-size: calc(15px + var(--pv-fz-add, 0px)); line-height: 22px; font-weight: 600; }
.pv-ck-imgrow { display: flex; align-items: center; gap: 14px; }
.pv-ck-imgrow .ops { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.pv-ck-tile.demo { flex: none; width: 78px; cursor: default; animation: none; }
.pv-ck-rrow { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; font-size: 13px; color: var(--pv-text-soft); white-space: nowrap; }
.pv-ck-rrow .d { width: 56px; flex: none; }
.pv-ck-rrow .t { flex: 1; min-width: 0; }
@media (max-width: 640px) {
  .pv-ck-head { flex-wrap: wrap; gap: 8px 14px; }
  .pv-ck-grid { grid-template-columns: repeat(3, 1fr); gap: 8px; }
  .pv-ck-reward .bar { display: none; }
  /* 手机：三列（连续 N 天 / 标题 / 铅笔），日期一行、结果一行 */
  .pv-ck-reward { grid-template-columns: auto minmax(0, 1fr) 54px; row-gap: 2px; }
  .pv-ck-reward .rg { grid-column: 1 / 3; grid-row: 2; }
  .pv-ck-reward .ops { grid-column: 3; }
  .pv-ck-reward .left { grid-column: 1 / -1; grid-row: 3; white-space: normal; }
}

/* 项目抬头右边的「视图」头像排（用户 2026-10-06）：跟状态那组隔开一点 */
.pv-pmo-head-view { flex: none; margin-right: 10px; }
@media (max-width: 640px) { .pv-pmo-head-view { margin-right: 6px; } }

/* 打卡：位置调整（用户 2026-10-06）——齿轮在板块标题行；期间写在卡名旁；奖励有小标题 + 新增钮、就地改 */
.pv-ck-title .sub { margin-left: 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-guide { display: flex; align-items: center; gap: 12px; padding: 9px 12px; margin-bottom: 14px; border-radius: 10px; background: var(--pv-brand-soft); color: var(--pv-brand-dark);
               font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-ck-guide span { flex: 1; min-width: 0; }
.pv-ck-guide .pv-pmo-secbtn { cursor: pointer; }
.pv-ck-sec.top { margin-top: 18px; margin-bottom: 8px; }
.pv-ck-rewards { margin-top: 4px; }
.pv-ck-reward .ops { flex: none; display: inline-flex; gap: 2px; opacity: 0; }
.pv-ck-reward:hover .ops { opacity: 1; }
.pv-ck-rewards .pv-ck-rrow { padding: 7px 0; margin-bottom: 0; border-bottom: 1px solid var(--pv-border); }
@media (max-width: 640px) { .pv-ck-title .sub { display: block; margin-left: 0; } .pv-ck-reward .ops { opacity: 1; } }

/* ---------- 项目管理 · 模板管理页（pmo-tplpage.js，用户 2026-10-06）：右边整块，左一列菜单 + 右边那一种的模板 ---------- */
/* 左栏那颗「模板管理」：不是新增，图标从加号换成两张叠着的卡 */
.pv-pmo-newbtn.tpl::before { width: 14px; height: 14px;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='black' stroke-width='1.4' stroke-linejoin='round'%3E%3Crect x='4.2' y='4.2' width='8.3' height='8.3' rx='1.6'/%3E%3Cpath d='M9.8 4.2V3.1a1.6 1.6 0 0 0-1.6-1.6H3.1a1.6 1.6 0 0 0-1.6 1.6v5.1a1.6 1.6 0 0 0 1.6 1.6h1.1'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='black' stroke-width='1.4' stroke-linejoin='round'%3E%3Crect x='4.2' y='4.2' width='8.3' height='8.3' rx='1.6'/%3E%3Cpath d='M9.8 4.2V3.1a1.6 1.6 0 0 0-1.6-1.6H3.1a1.6 1.6 0 0 0-1.6 1.6v5.1a1.6 1.6 0 0 0 1.6 1.6h1.1'/%3E%3C/svg%3E") center / contain no-repeat; }
/* 黄底白字（用户 2026-10-07）：跟上面那颗虚线的「新建项目」分开；正开着模板管理时颜色加深一档 */
.pv-pmo-newbtn.tpl { border: 1px solid var(--pv-brand); background: var(--pv-brand); color: #fff; font-weight: 600; }
.pv-pmo-newbtn.tpl:hover, .pv-pmo-newbtn.tpl.on { border-color: var(--pv-brand-dark); background: var(--pv-brand-dark); color: #fff; }
.pv-tplpage-head { display: flex; align-items: center; gap: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--pv-border); margin-bottom: 14px; }
.pv-tplpage-head h2 { flex: 1; margin: 0; font-size: calc(18px + var(--pv-fz-add, 0px)); line-height: 28px; font-weight: 700; color: var(--pv-text); }
.pv-tplpage-body { display: flex; align-items: flex-start; gap: 22px; }
.pv-tplpage-menu { flex: none; width: 168px; position: sticky; top: 0; }
.pv-tplpage-main { flex: 1; min-width: 0; max-width: 760px; }
.pv-tplc { border: 1px solid var(--pv-border); border-radius: 12px; background: var(--pv-surface); margin-bottom: 10px; }
.pv-tplc.open { border-color: var(--pv-brand); }
.pv-tplc-head { display: flex; align-items: center; gap: 8px; padding: 10px 12px; cursor: pointer; font-size: calc(14px + var(--pv-fz-add, 0px)); line-height: 22px; }
.pv-tplc-head b { flex: none; max-width: 40%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-tplc-head .s { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-tplc-body { padding: 0 14px 14px; border-top: 1px solid var(--pv-border); }
/* 里程碑模板内嵌版：抽屉那套壳（头 / 体 / 脚）摆平成普通的块 */
.pv-tplpage-inline .pv-drawer-head { position: static; padding: 0 0 10px; border: 0; background: none; min-height: 0; display: flex; align-items: center; gap: 8px; }
.pv-tplpage-inline .pv-drawer-head .pv-drawer-title { font-size: calc(14px + var(--pv-fz-add, 0px)); }
.pv-tplpage-inline .pv-drawer-x { display: none; }
.pv-tplpage-inline .pv-drawer-head .pv-drawer-title { display: none; }     /* 页面顶上已经写了「模板管理」，左边菜单也亮着「里程碑模板」，不再念一遍 */
.pv-tplpage-inline .pv-drawer-head:not(:has(.pv-tpl-back)) { display: none; }
.pv-tplpage-inline .pv-drawer-body { padding: 0; overflow: visible; }
.pv-tplpage-inline .pv-drawer-foot { position: static; display: flex; align-items: center; gap: 8px; padding: 14px 0 0; border: 0; background: none; }
/* 「使用模板」：抽屉头上叉号左边，主色描边的小钮——看得见，但不跟「保存」抢 */
.pv-tpl-use { flex: none; margin-left: auto; margin-right: 6px; }
.pv-tpl-usebtn { border-color: var(--pv-brand); color: var(--pv-brand-dark); background: var(--pv-brand-soft); font-weight: 600; gap: 4px; }
.pv-tpl-usebtn i { font-size: 13px; }
.pv-tpl-usebtn:hover { background: var(--pv-brand); color: #fff; border-color: var(--pv-brand); }
/* 打卡板块标题右端那颗配置钮：图标放大一倍（用户 2026-10-06） */
.pv-ck-cfgbtn { width: 26px; height: 26px; }
.pv-ck-cfgbtn i { font-size: 16px; line-height: 1; }      /* 26 → 20 → 16，用户定的（2026-10-07）；按钮回到 26 那档图标钮 */
@media (max-width: 860px) { .pv-tplpage-body { flex-direction: column; gap: 10px; } .pv-tplpage-menu { width: 100%; position: static; } }

/* 股票模拟 · 到价提醒卖（用户 2026-10-07）：持仓卡右上角一颗小钮；设了显示那个价，到过价变绿 */
.pv-watch-sell { flex: none; display: inline-flex; align-items: center; gap: 3px; height: 22px; padding: 0 8px; border: 1px solid var(--pv-border); border-radius: 11px; background: var(--pv-surface);
                 font-family: inherit; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1; color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; }
.pv-watch-sell i { font-size: 12px; }
.pv-watch-sell:hover { border-color: var(--pv-brand); color: var(--pv-brand-dark); }
.pv-watch-sell.set { border-color: var(--pv-brand); background: var(--pv-brand-soft); color: var(--pv-brand-dark); font-weight: 600; }
.pv-watch-sell.fired { border-color: #2E7D46; background: #E6F4EA; color: #1F6B38; }

/* 模板管理页里的表单（任务 / 打卡模板卡片、里程碑模板内嵌版）：不在抽屉里，但填的是同一类东西，尺寸照抽屉规范 v1——
   34 高、13.5 字、同圆角、多行框用正文字体（用户 2026-10-07：原来落回全站默认，输入框里的字比标签和占位字大一截，描述框还是等宽字体） */
.pv-tplc-body .el-input__inner, .pv-tplpage-inline .el-input__inner { height: var(--pv-dw-h, 34px); line-height: var(--pv-dw-h, 34px); padding: 0 11px; border-radius: var(--pv-radius-btn);
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-tplc-body .el-textarea__inner, .pv-tplpage-inline .el-textarea__inner { padding: 7px 11px; border-radius: var(--pv-radius-btn); font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.7; font-family: inherit; }
.pv-tplc-body .el-input__inner::placeholder, .pv-tplc-body .el-textarea__inner::placeholder { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-family: inherit; }
.pv-tplc-head b { font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 600; }
.pv-tplc-body .pv-chip-opt { font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 2px 10px; line-height: 18px; }
.pv-tplc-body .pv-pmo-seg button { height: 26px; font-size: calc(12px + var(--pv-fz-add, 0px)); }

/* 模板管理开着时没有右边「跳到」那一列：把给它留的 166 收回来，不然右边空一条（用户 2026-10-07） */
@media (min-width: 1180px) { .pv-pmo-layout.tpl-on { grid-template-columns: var(--pv-pmo-side-w, 260px) 24px minmax(0, 1fr); } }
.pv-tplpage-main { max-width: none; }

/* 裁剪框的方形蒙版（打卡图节选用，用户 2026-10-07）：不画圆，只描一圈白边 */
.pv-avc-mask.rect { border-radius: 0; box-shadow: none; border: 1.5px solid rgba(255, 255, 255, .9); }

/* 视图那排里项目负责人（不是自己时）的记号：头像右下角一枚主色小圆「责」（用户 2026-10-07：负责人不再单画一颗头像） */
.pv-pmo-who-av.owner { position: relative; }
.pv-pmo-who-own { position: absolute; right: -4px; bottom: -4px; display: flex; align-items: center; justify-content: center; width: 15px; height: 15px; border-radius: 50%;
                  background: var(--pv-brand); color: #fff; border: 1.5px solid var(--pv-surface); font-style: normal; font-size: 9px; font-weight: 700; line-height: 1; pointer-events: none; }
.pv-pmo-who-own i { font-size: 10px; line-height: 1; }     /* 「责」字换成一枚小星（用户 2026-10-07） */

/* 打卡格子右下角那枚圆（用户 2026-10-07）：比原来小 15%（46 → 39），打没打一样大；打了 = 绿底白对号，外面一圈白边，压在图上也分得出来 */
.pv-ck-mark { width: 39px; height: 39px; right: 9px; bottom: 9px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); box-sizing: border-box; }
.pv-ck-mark.done { background: #22A559; color: #fff; border: 2.5px solid #fff; font-size: 19px; font-weight: 700; z-index: 1; box-shadow: 0 2px 6px rgba(0, 0, 0, .22); }
.pv-ck-tile.today .pv-ck-mark.done { background: #22A559; }
.pv-ck-tile.demo .pv-ck-mark { width: 26px; height: 26px; right: 6px; bottom: 6px; }
.pv-ck-tile.demo .pv-ck-mark.done { font-size: 13px; border-width: 2px; }

/* 对号换成粗一点、圆头的（自己画的 SVG，线宽 3.6）；绿圆外面 4px 白边——「今天」那格原来把边框清成 0 了，这里点名补回来（用户 2026-10-07） */
.pv-ck-mark.done, .pv-ck-tile.today .pv-ck-mark.done { border: 4px solid #fff; width: 43px; height: 43px; right: 7px; bottom: 7px; }   /* 绿圆本身还是 35，加上两边的白边 */
.pv-ck-mark.done svg { width: 22px; height: 22px; display: block; }
.pv-ck-tile.demo .pv-ck-mark.done { width: 28px; height: 28px; right: 5px; bottom: 5px; border-width: 3px; }
.pv-ck-tile.demo .pv-ck-mark.done svg { width: 14px; height: 14px; }

/* 每周哪几天（pv-weekday-pick，用户 2026-10-07）：七颗 30 的圆片，选中主色实底；右边「工作日 / 周末」两颗快捷 */
.pv-wdpick { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.pv-wdpick-d { flex: none; width: 30px; height: 30px; padding: 0; border: 1px solid var(--pv-border); border-radius: 50%; background: var(--pv-surface); cursor: pointer;
               font-family: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1; color: var(--pv-text-soft); }
.pv-wdpick-d:hover { border-color: var(--pv-brand); color: var(--pv-brand-dark); }
.pv-wdpick-d.on { background: var(--pv-brand); border-color: var(--pv-brand); color: #fff; font-weight: 600; }
.pv-wdpick .pv-chip-opt { font-size: calc(12px + var(--pv-fz-add, 0px)); padding: 2px 10px; line-height: 18px; margin-left: 2px; }
.pv-cycle-wd { margin-top: 8px; }

/* 打卡抬头重排（用户 2026-10-07）：卡名一行、期间一行、三张数字卡一行（k 标签 / v 大数 / s 说明钉在卡底） */
.pv-ck-head { display: block; margin-bottom: 12px; }
.pv-ck-title { font-size: calc(17px + var(--pv-fz-add, 0px)); line-height: 26px; font-weight: 700; color: var(--pv-text); white-space: normal; overflow: visible; }
.pv-ck-sub { margin-top: 2px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); }
.pv-ck-stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-bottom: 16px; }
.pv-ck-stats > .pv-ck-stat { display: flex; flex-direction: column; align-items: flex-start; padding: 10px 14px; border: 1px solid var(--pv-border); border-radius: 12px; background: var(--pv-surface); min-width: 0; }
.pv-ck-stat .k { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-stat .v { font-size: calc(26px + var(--pv-fz-add, 0px)); line-height: 34px; font-weight: 800; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-ck-stat .v.hot { color: var(--pv-brand-dark); }
.pv-ck-stat .v i { margin-left: 3px; font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-ck-stat .s { margin-top: auto; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
@media (max-width: 640px) { .pv-ck-stats { gap: 6px; } .pv-ck-stats > .pv-ck-stat { padding: 8px 10px; } .pv-ck-stat .v { font-size: 22px; line-height: 30px; } .pv-ck-stat .s { display: none; } }

/* 今天面板行程后面的「去程 / 返程」小签（用户 2026-10-07）：20 高那档小签；去程蓝、返程绿 */
.pv-cal-leg { flex: none; display: inline-flex; align-items: center; height: 20px; padding: 0 7px; margin-left: 6px; border-radius: 4px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 600; line-height: 1;
              white-space: nowrap; background: #E6F1FB; color: #1F5FA8; text-decoration: none; }
.pv-cal-leg.back { background: #E6F4EA; color: #1F6B38; }

/* 今天面板抬头：行程 / 假期那几枚小签跟左边大日期的**底边**对齐（用户 2026-10-07），原来是居中、看着飘在半空 */
.pv-cal-brief-head { align-items: flex-end; }
.pv-cal-brief-head .pv-cal-daybig { align-self: flex-end; }
.pv-cal-brief-head .pv-cal-dayassoc { align-self: flex-end; align-items: flex-end; }
.pv-cal-brief-head .pv-cal-dayassoc-item { align-items: center; }
.pv-cal-brief-head .pv-cal-daybadge { align-self: flex-start; }

/* ---------- 配置页 · 打卡图库（用户 2026-10-07） ---------- */
/* 左下角那颗从「模板管理」改叫「配置」，图标换成齿轮 */
.pv-pmo-newbtn.tpl.cfg::before { width: 14px; height: 14px;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round'%3E%3Cpath d='M3 6h4M11 6h6M3 14h8M15 14h2'/%3E%3Ccircle cx='9' cy='6' r='2.1'/%3E%3Ccircle cx='13' cy='14' r='2.1'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round'%3E%3Cpath d='M3 6h4M11 6h6M3 14h8M15 14h2'/%3E%3Ccircle cx='9' cy='6' r='2.1'/%3E%3Ccircle cx='13' cy='14' r='2.1'/%3E%3C/svg%3E") center / contain no-repeat; }
.pv-alb-new { width: 220px; height: 30px; }
.pv-alb-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(132px, 1fr)); gap: 12px; margin-top: 4px; }
.pv-alb-card { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 8px; border: 1px solid var(--pv-border); border-radius: 12px; background: var(--pv-surface);
               font-family: inherit; text-align: left; cursor: pointer; min-width: 0; }
.pv-alb-card:hover, .pv-alb-card.on { border-color: var(--pv-brand); }
.pv-alb-card.on { background: var(--pv-brand-soft); }
.pv-alb-cover { display: flex; align-items: center; justify-content: center; width: 100%; aspect-ratio: 3 / 4; border-radius: 8px; overflow: hidden; background: var(--pv-bg); color: var(--pv-text-faint); font-size: 26px; margin-bottom: 4px; }
.pv-alb-cover img { width: 100%; height: 100%; max-width: none; object-fit: cover; }
.pv-alb-card b { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; color: var(--pv-text); }
.pv-alb-card .n, .pv-alb-head .n { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-alb-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.pv-alb-name { width: 220px; flex: none; }
.pv-alb-name .el-input__inner { height: 34px; line-height: 34px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; }
.pv-alb-imgs { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 10px; }
.pv-alb-img { position: relative; aspect-ratio: 3 / 4; border-radius: 10px; overflow: hidden; background: var(--pv-bg); }
.pv-alb-img img { width: 100%; height: 100%; max-width: none; object-fit: cover; display: block; }
.pv-alb-img .x { position: absolute; top: 5px; right: 5px; min-width: 22px; height: 22px; padding: 0 6px; border: 0; border-radius: 11px; background: rgba(20, 24, 40, .6); color: #fff;
                 font-family: inherit; font-size: 11.5px; line-height: 1; cursor: pointer; opacity: 0; white-space: nowrap; }
.pv-alb-img:hover .x, .pv-alb-img.ask .x { opacity: 1; }
.pv-alb-img.ask .x { background: #C73535; }
.pv-ck-picmode { margin-bottom: 10px; }
.pv-ck-picmode button:disabled { opacity: .5; cursor: default; }
.pv-ck-albpick { display: grid; grid-template-columns: repeat(auto-fill, minmax(92px, 1fr)); gap: 8px; }
.pv-alb-card.sm { padding: 6px; }
@media (max-width: 640px) { .pv-alb-img .x { opacity: 1; } }

/* 板块里「视图藏了别人的 N 条」那句提示（用户 2026-10-07） */
.pv-pmo-viewhint { padding: 8px 12px; margin-bottom: 10px; border-radius: 8px; background: var(--pv-brand-soft); color: var(--pv-brand-dark); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-pmo-viewhint a { margin-left: 6px; font-weight: 600; text-decoration: underline; cursor: pointer; color: inherit; }

/* ---------- 「重复」控件（pv-repeat-pick，用户 2026-10-07：照飞书日历）：一颗下拉 + 「自定义重复」弹窗 ---------- */
.pv-repeat { display: block; width: 100%; }
.pv-repeat-sel { width: 100%; }
.pv-repeat-pop .pv-repeat-custom { border-top: 1px solid var(--pv-border); margin-top: 4px; padding-top: 2px; }
.pv-repeat-dlg .el-dialog__body { padding: 8px 22px 6px; }
.pv-repeat-row { display: flex; align-items: center; gap: 10px; margin: 12px 0; }
.pv-repeat-row.top { margin-bottom: 4px; }
.pv-repeat-row .k { flex: 1; font-size: 13.5px; line-height: 34px; color: var(--pv-text-soft); white-space: nowrap; }
.pv-repeat-every { display: inline-flex; align-items: center; gap: 6px; font-size: 13.5px; color: var(--pv-text); }
.pv-repeat-every i { font-style: normal; }
.pv-repeat-every .n { width: 58px; }
.pv-repeat-row .u { width: 104px; flex: none; }
.pv-repeat-dlg .el-input__inner { height: 34px; line-height: 34px; font-size: 13.5px; border-radius: var(--pv-radius-btn); }
.pv-repeat-every .n .el-input__inner { text-align: center; padding: 0 6px; }
.pv-repeat-days { display: flex; gap: 8px; margin: 4px 0 12px; }
.pv-repeat-days button { flex: 1; min-width: 0; height: 32px; padding: 0; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); cursor: pointer;
                         font-family: inherit; font-size: 13.5px; line-height: 1; color: var(--pv-text); }
.pv-repeat-days button:hover { border-color: var(--pv-brand); }
.pv-repeat-days button.on { background: var(--pv-brand); border-color: var(--pv-brand); color: #fff; font-weight: 600; }
.pv-repeat-fixed { flex: none; display: inline-flex; align-items: center; height: 34px; padding: 0 12px; border-radius: var(--pv-radius-btn); background: var(--pv-bg); color: var(--pv-text-soft); font-size: 13.5px; white-space: nowrap; }
.pv-repeat-prev { margin: 2px 0 6px; padding: 7px 12px; border-radius: 8px; background: var(--pv-brand-soft); color: var(--pv-brand-dark); font-size: 13px; line-height: 20px; font-weight: 600; }
.pv-repeat-radio { display: flex; align-items: center; gap: 10px; min-height: 40px; }
.pv-repeat-radio .el-radio { margin-right: 0; flex: 1; }
.pv-repeat-radio .d { width: 190px; flex: none; }
.pv-repeat-dlg .el-radio__input.is-checked .el-radio__inner { border-color: var(--pv-brand); background: var(--pv-brand); }
.pv-repeat-dlg .el-radio__input.is-checked + .el-radio__label { color: var(--pv-brand-dark); }

/* 日历格子里的周期任务（用户 2026-10-07）：一多就密密麻麻，橙色太抢——改成浅灰底、灰字、不加粗，退到背景里；
   真正要盯的（一次性的任务、里程碑、联络）还是原来的实色。已完成的照旧 */
.pv-cal-chip.rep:not(.done) { background: #EEF0F4 !important; color: #7A8092 !important; border-color: transparent !important; font-weight: 400; box-shadow: none; }
.pv-cal-chip.rep:not(.done):hover { background: #E3E6EC !important; color: var(--pv-text-soft) !important; }

/* ---------- 平台 · 租户管理（super-tenants.js，2026-10-06） ---------- */
.pv-tn-card { border: 1px solid var(--pv-border); border-radius: var(--pv-card-r); background: var(--pv-surface); padding: 12px 16px 10px; margin-bottom: 12px; }
.pv-tn-card.off { opacity: .6; }
.pv-tn-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; padding-bottom: 8px; border-bottom: 1px solid var(--pv-border); margin-bottom: 4px; }
.pv-tn-head b { font-size: calc(15px + var(--pv-fz-add, 0px)); line-height: 22px; color: var(--pv-text); }
.pv-tn-head .s { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-tn-user { display: flex; align-items: center; gap: 10px; min-height: 34px; border-bottom: 1px solid #f0f1f5; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-tn-user .n { color: var(--pv-text); font-weight: 600; white-space: nowrap; }
.pv-tn-user .u { color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-tn-add { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; padding: 10px 0 4px; }
.pv-tn-add .el-input { width: 150px; } .pv-tn-add .el-select { width: 100px; }
.pv-tn .pv-addrow.sm { margin: 8px 0 2px; }
.pv-tn-pw { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px; padding: 10px 14px; margin-bottom: 12px; border-radius: 10px; background: var(--pv-brand-soft); color: var(--pv-brand-dark);
            font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 22px; }
.pv-tn-pw code { padding: 2px 8px; border-radius: 6px; background: #fff; color: var(--pv-text); font: 600 14px "SF Mono", Menlo, Consolas, monospace; user-select: all; }
.pv-tn-pw .s { flex: 1; min-width: 200px; font-size: calc(12px + var(--pv-fz-add, 0px)); }

/* 去程 / 返程小签挪到「行程」那枚后面了：左边不用再留距离（gap 管） */
.pv-cal-dayassoc-item .pv-cal-leg { margin-left: 0; }

/* ============================================================
   三套主题（2026-10-06）：黄（现有的，默认）/ 绿 / 蓝。租户管理员在后台「外观」里选，挂在 <html data-theme> 上。
   全站的主色都走 --pv-primary* / --pv-brand* / --pv-accent* 这几个变量（扫过一遍，写死的那几处也改成变量了），
   所以换主题 = 换这一组变量；红橙绿这些有含义的状态色（逾期、完成、提醒）不跟着变。
   ============================================================ */
:root[data-theme="green"] {
  --pv-primary: #1F9D62; --pv-primary-dark: #157A4A; --pv-primary-soft: #E2F4EA;
  --pv-brand: #1F9D62; --pv-brand-dark: #157A4A; --pv-brand-soft: #E2F4EA;
  --pv-accent: #22A559; --pv-accent-soft: #E9F7EE; --pv-brand-glow: rgba(31, 157, 98, .22);
  --pv-plate-1: #1E7F52; --pv-plate-2: #17683F; --pv-plate-3: #0F4E2E; --pv-plate-h1: #238F5D; --pv-plate-h2: #1B7548; --pv-plate-h3: #125A36;
}
:root[data-theme="blue"] {
  --pv-primary: #2F6FE4; --pv-primary-dark: #1F54BD; --pv-primary-soft: #E6EEFC;
  --pv-brand: #2F6FE4; --pv-brand-dark: #1F54BD; --pv-brand-soft: #E6EEFC;
  --pv-accent: #3B82F6; --pv-accent-soft: #EAF1FE; --pv-brand-glow: rgba(47, 111, 228, .22);
  --pv-plate-1: #2A5FC4; --pv-plate-2: #1F4CA3; --pv-plate-3: #163A80; --pv-plate-h1: #3069D3; --pv-plate-h2: #2456B3; --pv-plate-h3: #1A428F;
}
/* 开关（el-switch）选中时的颜色：有几处在模板里写死了黄色，这里按主题压过去 */
:root[data-theme="green"] .el-switch.is-checked .el-switch__core, :root[data-theme="blue"] .el-switch.is-checked .el-switch__core { background-color: var(--pv-primary) !important; border-color: var(--pv-primary) !important; }

/* ---------- 租户切换菜单（左上角门牌点开）---------- */
.pv-tenant { position: relative; }
.pv-household-sw { margin-left: 6px; font-size: 12px; opacity: .8; }
.pv-tenant-menu { position: absolute; left: 0; right: 0; top: calc(100% - 8px); z-index: 30; padding: 6px; border-radius: 10px; background: var(--pv-surface); border: 1px solid var(--pv-border);
                  box-shadow: 0 12px 34px rgba(20, 24, 40, .18); }
.pv-tenant-item { display: flex; align-items: center; gap: 8px; width: 100%; height: 34px; padding: 0 10px; border: 0; border-radius: 7px; background: none; cursor: pointer; font-family: inherit;
                  font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text); text-align: left; white-space: nowrap; }
.pv-tenant-item:hover { background: var(--pv-bg); }
.pv-tenant-item.on { background: var(--pv-brand-soft); color: var(--pv-brand-dark); font-weight: 600; }
.pv-tenant-item .n { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.pv-tenant-item .k { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-weight: 400; }
.pv-tenant-item.adm { margin-top: 4px; border-top: 1px solid var(--pv-border); border-radius: 0 0 7px 7px; color: var(--pv-text-soft); }
/* 租户自己传的图：不一定是那张横幅的比例，限个高、居中 */
.pv-brand-lockup.own { width: auto; max-width: 100%; max-height: 56px; object-fit: contain; }

/* ---------- 后台 · 外观（主题色 + 左上角的图）---------- */
.pv-brandset-themes { display: flex; flex-wrap: wrap; gap: 10px; }
.pv-brandset-theme { display: flex; align-items: center; gap: 10px; height: 44px; padding: 0 14px 0 10px; border: 1px solid var(--pv-border); border-radius: 10px; background: var(--pv-surface); cursor: pointer;
                     font-family: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); white-space: nowrap; }
.pv-brandset-theme i { width: 24px; height: 24px; border-radius: 50%; flex: none; }
.pv-brandset-theme.on { border-color: var(--pv-primary); box-shadow: 0 0 0 2px var(--pv-primary-soft); font-weight: 600; }
.pv-brandset-theme:disabled { opacity: .55; cursor: default; }
.pv-brandset-logo { display: flex; align-items: center; flex-wrap: wrap; gap: 14px; }
.pv-brandset-logo .box { display: flex; align-items: center; justify-content: center; width: 200px; height: 68px; padding: 6px; border: 1px dashed #c4c8d2; border-radius: 10px; background: var(--pv-bg); }
.pv-brandset-logo .box img { max-width: 100%; max-height: 100%; object-fit: contain; }
.pv-brandset-logo .ops { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.pv-brandset-logo label.pv-pmo-secbtn { cursor: pointer; }
/* ---------- 租户页：开模块那一行 ---------- */
.pv-tn-mods { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px; padding: 8px 0; border-bottom: 1px solid #f0f1f5; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-tn-mods .k { flex: none; white-space: nowrap; }
.pv-tn-mods .el-checkbox { margin-right: 0; }

/* ---------- 后台 · 家庭人名（family-names.js，2026-10-06）：左边家里的叫法，右边证件名 / 别的叫法；单元格平时是文字，点了才是输入框 ---------- */
.pv-fnames .pv-addbtn { margin-bottom: 10px; }
.pv-fnames-table { border: 1px solid var(--pv-border); border-radius: 10px; overflow: hidden; max-width: 720px; }
.pv-fnames-row { display: flex; align-items: center; gap: 10px; min-height: 42px; padding: 5px 10px; border-top: 1px solid var(--pv-border); }
.pv-fnames-row:first-child { border-top: 0; }
.pv-fnames-row.head { min-height: 34px; background: var(--pv-bg); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); font-weight: 600; }
.pv-fnames-row .c1 { flex: none; width: 150px; min-width: 0; }
.pv-fnames-row .c2 { flex: 1; min-width: 0; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.pv-fnames-row .c3 { flex: none; width: 26px; }
.pv-fnames-cell { display: block; width: 100%; height: 30px; padding: 0 8px; border: 0; border-radius: 6px; background: none; font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 30px; font-weight: 600; color: var(--pv-text); text-align: left; cursor: text; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-fnames-cell:hover { background: var(--pv-bg); }
.pv-fnames-in { width: 100%; height: 30px; padding: 0 8px; border: 1px solid var(--pv-primary); border-radius: 6px; background: var(--pv-surface); font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); outline: 0; box-sizing: border-box; }
.pv-fnames-in.add { width: 150px; flex: none; height: 26px; border-color: transparent; background: none; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-fnames-in.add:hover { background: var(--pv-bg); }
.pv-fnames-in.add:focus { border-color: var(--pv-primary); background: var(--pv-surface); }
.pv-fnames-chip { flex: none; display: inline-flex; align-items: center; gap: 4px; height: 24px; padding: 0 6px 0 9px; border-radius: 6px; background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 24px; font-weight: 600; white-space: nowrap; }
.pv-fnames-chip i { font-size: 11px; cursor: pointer; opacity: .55; }
.pv-fnames-chip i:hover { opacity: 1; }
.pv-fnames-del { width: 26px; height: 26px; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); cursor: pointer; opacity: 0; display: inline-flex; align-items: center; justify-content: center; }
.pv-fnames-row:hover .pv-fnames-del { opacity: 1; }
.pv-fnames-del:hover { background: var(--pv-bg); color: var(--pv-danger, #d93025); }
.pv-fnames-empty { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (max-width: 640px) {
  .pv-fnames-row { flex-wrap: wrap; }
  .pv-fnames-row.head .c2, .pv-fnames-row.head .c3 { display: none; }
  .pv-fnames-row .c1 { width: calc(100% - 36px); }
  .pv-fnames-row .c2 { order: 3; flex-basis: 100%; }
  .pv-fnames-del { opacity: 1; }
}

/* ---------- 股票模拟 › 可视化 › 谁能赚钱（stock-curve.js，2026-10-07）：每个人账户收益率的折线，手写 SVG ---------- */
.pv-stock-side .pv-side-nav + .pv-side-nav { margin-top: 14px; }
.pv-scurve-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px; margin-bottom: 14px; }
.pv-scurve-head h3 { margin: 0; font-size: calc(16px + var(--pv-fz-add2, 0px)); line-height: 24px; font-weight: 700; color: var(--pv-text); white-space: nowrap; }
.pv-scurve-span { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 24px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-scurve-leg { flex: none; display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 13px; background: var(--pv-surface); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); cursor: pointer; white-space: nowrap; }
.pv-scurve-leg i { width: 10px; height: 10px; border-radius: 50%; flex: none; }
.pv-scurve-leg.off { color: var(--pv-text-faint); } .pv-scurve-leg.off i { opacity: .25; }
.pv-scurve-board { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 220px)); gap: 12px; margin-bottom: 14px; }
.pv-scurve-board .pv-stat-card { display: flex; flex-direction: column; }
.pv-scurve-board .pv-stat-card .sub { margin-top: auto; }
.pv-scurve-board .v.up, .pv-scurve-tip u.up { color: var(--pv-success); }
.pv-scurve-board .v.down, .pv-scurve-tip u.down { color: var(--pv-danger); }
.pv-scurve-chart { position: relative; border: 1px solid var(--pv-border); border-radius: 12px; background: var(--pv-surface); padding: 10px 0 4px; overflow: hidden; }
.pv-scurve-chart svg { display: block; cursor: crosshair; touch-action: pan-y; }
.pv-scurve-chart .grid { stroke: var(--pv-border); stroke-width: 1; vector-effect: non-scaling-stroke; }
.pv-scurve-chart .grid.zero { stroke: var(--pv-text-faint); stroke-dasharray: 4 4; }
.pv-scurve-chart .ylab, .pv-scurve-chart .xlab { font-size: 11px; fill: var(--pv-text-faint); }
.pv-scurve-chart .ylab { text-anchor: end; }
.pv-scurve-chart .line { fill: none; stroke-width: 2.2; stroke-linejoin: round; stroke-linecap: round; vector-effect: non-scaling-stroke; }
.pv-scurve-chart .node { stroke: var(--pv-surface); stroke-width: 1.5; }
.pv-scurve-chart .cross { stroke: var(--pv-text-faint); stroke-width: 1; vector-effect: non-scaling-stroke; }
.pv-scurve-chart .dot { fill: var(--pv-surface); stroke-width: 2; vector-effect: non-scaling-stroke; }
.pv-scurve-tip { position: absolute; top: 12px; right: 14px; display: flex; flex-direction: column; gap: 3px; padding: 8px 10px; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); box-shadow: var(--pv-shadow-sm, 0 2px 8px rgba(0,0,0,.06)); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; pointer-events: none; }
.pv-scurve-tip b { font-weight: 700; color: var(--pv-text); white-space: nowrap; }
.pv-scurve-tip b em { margin-left: 6px; font-style: normal; font-weight: 500; color: var(--pv-text-faint); }
.pv-scurve-tip span { display: flex; align-items: center; gap: 6px; color: var(--pv-text-soft); white-space: nowrap; }
.pv-scurve-tip span i { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.pv-scurve-tip span u { margin-left: auto; padding-left: 14px; text-decoration: none; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--pv-text); }
.pv-scurve-note { margin-top: 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (max-width: 860px) {
  .pv-stock-side .pv-side-nav + .pv-side-nav { margin-top: 0; }
  .pv-scurve-tip { position: static; flex-direction: row; flex-wrap: wrap; gap: 4px 12px; border: 0; box-shadow: none; padding: 0 8px 6px; }
  .pv-scurve-tip span u { padding-left: 6px; }
}

/* 打卡 · 跳过（2026-10-07）：今天 / 漏掉的那格右上角一颗「跳过」；跳过的那格灰底斜纹 */
.pv-ck-skip { position: absolute; right: 6px; top: 6px; display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 10px; background: var(--pv-bg); color: var(--pv-text-soft); font-size: 11.5px; line-height: 20px; white-space: nowrap; cursor: pointer; opacity: 0; }
.pv-ck-tile.today .pv-ck-skip, .pv-ck-tile:hover .pv-ck-skip { opacity: 1; }
.pv-ck-skip:hover { background: var(--pv-border); color: var(--pv-text); }
.pv-ck-tile.skip { background: repeating-linear-gradient(135deg, var(--pv-bg) 0 8px, var(--pv-surface) 8px 16px); border-style: dashed; box-shadow: none; }
.pv-ck-tile.skip .pv-ck-mark.skipped, .pv-ck-tile.today.skip .pv-ck-mark.skipped { border: 0; background: var(--pv-border); color: var(--pv-text-soft); font-weight: 600; font-size: 11.5px; }
.pv-cal-byrow { display: flex; align-items: center; gap: 10px; margin-top: 1px; }
.pv-cal-brief-one .pv-cal-byrow .pv-cal-by { display: inline-block; margin: 0; }
/* 这一行的两颗链接：横线贴着字（用户 2026-10-07：原来用的是按钮底边，离字远，看着像压到下一条上） */
.pv-cal-byrow button.pv-cal-by.is-link { border-bottom: 0; line-height: 16px; text-decoration: none; text-underline-offset: 2px; text-decoration-thickness: 1px; }
.pv-cal-byrow button.pv-cal-by.is-link:hover { text-decoration: underline; }
.pv-cal-byrow .pv-cal-skip { color: var(--pv-text-soft); }
@media (hover: none) { .pv-ck-tile.miss .pv-ck-skip { opacity: 1; } }

/* ---------- 快乐社交 · 下一件（用户 2026-10-07 给的版式，照搬）：左日历页 + 右小签 / 标题，横线，底下一排人 ---------- */
.pv-ct-nx { --nx: var(--pv-ev-plan); --nx-soft: var(--pv-ev-plan-soft); display: flex; align-items: flex-start; gap: 18px; padding-bottom: 18px; }   /* 稿 2a 的尺寸 */
.pv-ct-nx.fest { --nx: var(--pv-ev-fest); --nx-soft: var(--pv-ev-fest-soft); }
.pv-ct-nx.gift { --nx: var(--pv-ev-gift); --nx-soft: var(--pv-ev-gift-soft); }
.pv-ct-nx.bday { --nx: var(--pv-ev-bday); --nx-soft: var(--pv-ev-bday-soft); }
.pv-ct-nx.link { cursor: pointer; }
.pv-ct-nx-cal { flex: none; width: 118px; display: flex; flex-direction: column; align-items: center; border-radius: var(--pv-card-r); overflow: hidden; background: var(--nx-soft); color: var(--nx); }
.pv-ct-nx-cal .top { align-self: stretch; height: 28px; display: flex; align-items: center; justify-content: center; background: var(--nx); color: #fff; font-size: calc(14px + var(--pv-fz-add, 0px)); line-height: 28px; font-weight: 700; white-space: nowrap; }
.pv-ct-nx-cal b { margin-top: 10px; font-size: 42px; line-height: 44px; font-weight: 800; font-variant-numeric: tabular-nums; }
.pv-ct-nx-cal .mw { margin: 2px 0 8px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; white-space: nowrap; }
.pv-ct-nx-cal .lunar { align-self: stretch; height: 28px; display: flex; align-items: center; justify-content: center; border-top: 0; background: color-mix(in srgb, var(--nx) 8%, transparent); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; white-space: nowrap; }
.pv-ct-nx-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; padding-top: 2px; }
.pv-ct-nx-main .k { font-style: normal; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 700; color: var(--nx); white-space: nowrap; }
.pv-ct-nx-main .k i { margin-left: 8px; font-style: normal; font-weight: 500; color: var(--pv-text-faint); }
.pv-ct-nx-main .t { font-size: calc(15px + var(--pv-fz-add, 0px)); line-height: 22px; font-weight: 600; color: var(--pv-text); display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; word-break: break-word; }   /* 18 → 15（用户 2026-10-29：标题太大） */
.pv-ct-nx-main .f { display: flex; flex-wrap: wrap; gap: 4px; }
.pv-ct-nx-main .f i { display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; background: var(--pv-ev-fest-soft); color: var(--pv-ev-fest); font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 20px; white-space: nowrap; }
.pv-ct-nx-who { display: flex; flex-wrap: wrap; gap: 8px 18px; padding-top: 0; border-top: 0; }   /* 稿 2a：不画线，靠间距（上面 .pv-ct-nx 的 padding-bottom 18 就是间距） */
/* 那排人照右边「本月生日」一行的画法（用户 2026-10-29：两处不一致）：22 的头像 + 8 间距 + 13.5/20 加粗的名字 */
.pv-ct-nx-who .one { display: inline-flex; align-items: center; gap: 8px; min-width: 0; }
.pv-ct-nx-who .pv-ct-face { width: 22px; height: 22px; font-size: calc(10.5px + var(--pv-fz-add, 0px)); }
.pv-ct-nx-who .n { font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 400; color: var(--pv-text); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 640px) {
  .pv-ct-nx { gap: 14px; padding-bottom: 16px; }
  .pv-ct-nx-cal { width: 112px; }
  .pv-ct-nx-cal b { margin-top: 8px; font-size: 34px; line-height: 38px; }
  .pv-ct-nx-cal .mw { margin-bottom: 6px; font-size: 12.5px; }
  .pv-ct-nx-main .t { font-size: 14px; line-height: 20px; }
}

/* 相连抽屉里「已经连上的」那几行（2026-10-07） */
.pv-ct-rels { display: flex; flex-direction: column; border: 1px solid var(--pv-border); border-radius: 8px; overflow: hidden; }
.pv-ct-rels-row { display: flex; align-items: center; gap: 8px; min-height: 44px; padding: 5px 10px; border-top: 1px solid var(--pv-border); }
.pv-ct-rels-row:first-child { border-top: 0; }
.pv-ct-rels-row .pv-ct-face { width: 26px; height: 26px; font-size: 12px; }
.pv-ct-rels-row .n { min-width: 0; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ct-rels-row .pv-ct-rel { flex: none; line-height: 20px; }
.pv-ct-rels-row .pv-pmo-secbtn { flex: none; }

/* 居中搜索弹窗（快乐社交 / 项目管理共用，用户 2026-10-07）：标题到搜索框原来隔着 Element 默认的 30px，太远；
   结果行左右留够地方，悬停的灰底不贴着字和头像 */
.pv-pmo-search-dialog .el-dialog__header { padding-bottom: 8px; }
.pv-pmo-search-dialog .el-dialog__body { padding: 6px 20px 14px; }
.pv-pmo-search-dialog .el-input { margin-bottom: 8px; }
.pv-pmo-search-dialog .pv-pmo-hit { padding-left: 10px; padding-right: 10px; }

/* 「下一件」卡片窄的时候（用户 2026-10-07 的 2a 窄版）：标题从日历页右边换到下面，按卡片自己的宽度判断，不看屏幕 */
.pv-ct-ov-next { container-type: inline-size; }
/* 两张（用户 2026-10-28 第二遍）：下一件 / 再下一件各占一列，日历页在上、小签 + 标题 + 人在下 */
.pv-ct-nx2 { display: grid; grid-template-columns: repeat(var(--nx-n, 3), minmax(0, 1fr)); gap: 14px 28px; }   /* 几列 = --nx-n，卡片多宽排几张、每张 ≥200（用户 2026-11-04）；列间 32 */   /* 两天之间 18 → 40（用户 2026-11-04：中间那道空再拉开） */
.pv-ct-nx.col { flex-direction: column; align-items: stretch; gap: 10px; padding-bottom: 0; min-width: 0; }
.pv-ct-nx.col .pv-ct-nx-cal { width: auto; align-self: stretch; }   /* 日历撑满这一列（用户 2026-11-04 选 B）：跟下面的字左右边都齐，不再一列两条对齐线、右边空一块 */
.pv-ct-nx.col .pv-ct-nx-main { padding-top: 0; }
.pv-ct-nx.col .pv-ct-nx-main .k { display: flex; align-items: center; gap: 8px; white-space: normal; }
.pv-ct-nx.col .pv-ct-nx-main .k i { margin-left: 0; }
.pv-ct-nx.col .pv-ct-nx-who { padding-top: 2px; }
.pv-ct-nx.col .pv-ct-nx-who .pv-ct-face { width: 24px; height: 24px; font-size: 11px; }
.pv-ct-nx.col .pv-ct-nx-who .n { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 24px; }
.pv-ct-nx.col .pv-ct-nx-who .one { gap: 6px; }
/* 「下一件」卡自己不到 440（手机）：两张日历页并排太挤，改成上下两段，每段日历页在左（窄一号）、事在右 */
@container (max-width: 440px) {
  .pv-ct-nx2 { grid-template-columns: minmax(0, 1fr); gap: 18px; }
  .pv-ct-nx.col { flex-direction: row; align-items: flex-start; gap: 14px; }
  .pv-ct-nx.col .pv-ct-nx-cal { width: 96px; align-self: flex-start; }   /* 横排时别跟着上面那条竖着拉满 */
  .pv-ct-nx.col .pv-ct-nx-cal b { font-size: 34px; line-height: 38px; }
  .pv-ct-nx.col .pv-ct-nx-list { flex: 1; min-width: 0; }
}

/* 纪念日 · 长期提示（2026-10-07）：第 N 天 */
.pv-ann-pin { flex: none; display: inline-flex; align-items: center; height: 20px; margin-left: 8px; padding: 0 7px; border-radius: 4px; background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 500; white-space: nowrap; }
.pv-ann-pin b { margin: 0 3px; font-weight: 800; font-variant-numeric: tabular-nums; }
.pv-ann-pinrow { display: flex; align-items: center; min-height: 34px; }
.pv-cal-dayn { flex: none; margin-left: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-cal-dayn b { margin: 0 2px; font-weight: 800; color: var(--pv-primary-dark); font-variant-numeric: tabular-nums; }

/* 行程 · 「记一趟行程」旁边的时差设置钮（2026-10-07） */
.pv-trip-bar { display: flex; align-items: center; gap: 8px; }
.pv-trip-bar .pv-pmo-secbtn { flex: none; white-space: nowrap; }
/* 日历今天牌「接下来：」（用户 2026-10-07）：第一条紧跟在冒号后面，不再先空一截；条与条之间照旧隔开 */
.pv-cal-brief-soon .pv-cal-soon-item:first-of-type, .pv-cal-brief-soon .pv-cal-soon-item.is-link:first-of-type { margin-left: 0; }

/* ---------- 手机端这一批（用户 2026-10-07） ---------- */
/* 抽屉开着的时候背后的页面不许滚：原来手指在抽屉上滑，动的是后面那一页，抽屉自己不动 */
html:has(.pv-drawer-scrim) { overflow: hidden; }
/* BUG-090（2026-11-10）：原来 body 也设 overflow: hidden——body 成了滚动容器，左栏的 sticky 改成相对 body 算，
   页面滚下去后打开抽屉，整条左栏（连底下的头像 / 铃铛）往上挪一截。只锁 html 就够了，背后照样滚不动 */
.pv-drawer-scrim { touch-action: none; }
.pv-drawer-body, .pv-dw-outline { overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }
@media (max-width: 640px) {
  /* 手机上不再从右边拉一条抽屉，直接铺满整屏；高度用 dvh，不被浏览器底栏吃掉「保存」那一排 */
  .pv-drawer, .pv-drawer.narrow, .pv-drawer.wide, .pv-drawer.task, .pv-drawer.pv-diary-dialog,
  .pv-drawer.has-outline, .pv-drawer.has-outline.narrow, .pv-drawer.has-outline.wide, .pv-drawer.has-outline.task {
    width: 100vw; max-width: 100vw; left: 0; right: 0; top: 0; bottom: auto; height: 100vh; height: 100dvh; box-shadow: none;
  }
  .pv-drawer-head { padding-top: max(12px, env(safe-area-inset-top)); }
  .pv-drawer-foot { padding-bottom: max(12px, env(safe-area-inset-bottom)); }
  .pv-drawer-scrim { background: var(--pv-surface); }

  /* 月历上面的行程 / 假期条：只占一两格的那种在手机上放不下字，原来剩一个图标加省略号、一趟一行摞好几层。
     现在这种短的画成一道细色条（不带字），能排进同一行的就排同一行；够三格宽的才写字 */
  .pv-cal-band { grid-auto-flow: row dense; row-gap: 2px; }
  .pv-cal-band-item.thin, .pv-cal-band.pv-cal-band-trip .pv-cal-band-item.thin {
    height: 6px; min-height: 0; padding: 0; border: 0; border-radius: 3px; font-size: 0; line-height: 0; overflow: hidden; align-self: center;
  }
  .pv-cal-band.pv-cal-band-trip .pv-cal-band-item.thin { background: #7FB2E6; box-shadow: none; border-right: 0; -webkit-mask-image: none; mask-image: none; }
  .pv-cal-band.pv-cal-band-trip .pv-cal-band-item.thin.open { background: repeating-linear-gradient(90deg, #7FB2E6 0 6px, transparent 6px 10px); }
  .pv-cal-band-item.thin .pv-cal-band-n { display: none; }
  .pv-cal-band-item:not(.thin) { font-size: 11.5px; padding-top: 1px; padding-bottom: 1px; }
  /* 假期例外（用户 2026-10-17：Columbus Day 只剩一道没字的细线，看不出是什么）：一两天的假期照样写名字，
     字小一号、不带图标，放不下就省略号；行程的短条还是细线 */
  .pv-cal-band:not(.pv-cal-band-trip) .pv-cal-band-item.thin {
    height: auto; padding: 0 4px; border-radius: 4px; font-size: 10px; line-height: 16px; align-self: stretch;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .pv-cal-band:not(.pv-cal-band-trip) .pv-cal-band-item.thin .pv-cal-band-ic { display: none; }

  /* 「接下来：」每条自己一行，顶头对齐「接下来」三个字，不往里缩；名字 / 日期 / 还有几天之间留出空 */
  .pv-cal-brief-soon .pv-cal-soon-item, .pv-cal-brief-soon .pv-cal-soon-item.is-link {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 6px; margin-left: 0; padding-left: 0; padding-right: 0; white-space: normal;
  }
}

/* ---------- 打卡 · 规定时间（2026-10-08）：格子左下角登记的钟点 + 准时 / 晚几分，右下角还是对勾，两块之间留空 ---------- */
.pv-ck-stats.four { grid-template-columns: repeat(4, minmax(0, 1fr)); }
/* 右边让出对勾（43 宽 + 7 边距）再加 12 的间隔，两块不挨着 */
.pv-ck-time { position: absolute; left: 9px; bottom: 9px; right: 62px; display: flex; flex-direction: column; align-items: flex-start; gap: 3px; min-width: 0; z-index: 1; pointer-events: none; }
.pv-ck-time b { font-size: calc(14px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 800; color: #fff; text-shadow: 0 1px 4px rgba(0, 0, 0, .5); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-ck-time i { display: inline-flex; align-items: center; height: 18px; padding: 0 6px; border-radius: 4px; font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 700; white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
.pv-ck-time i.ok { background: #fff; color: #1B8A49; }
.pv-ck-time i.bad { background: #D93A3A; color: #fff; }
.pv-ck-time i.hint { padding: 0; background: none; font-weight: 500; color: var(--pv-text-faint); }
.pv-ck-time.sk b { color: var(--pv-text); text-shadow: none; }   /* 跳过那天登记的钟点：底是浅条纹，用深字 */
.pv-ck-tile.on:not(:has(.pv-ck-img)) .pv-ck-time b { text-shadow: 0 1px 3px rgba(0, 0, 0, .28); }
/* 晚了而且「晚了不算」：这一格压暗一层，对勾换成灰的 */
.pv-ck-tile.nocount { filter: saturate(.35); }
.pv-ck-tile.nocount .pv-ck-mark.done { background: #9AA0AE; }
.pv-ck-undo.two { display: flex; padding: 0; }
.pv-ck-undo.two > span { flex: 1; padding: 6px 4px; cursor: pointer; }
.pv-ck-undo.two > span + span { border-left: 1px solid rgba(255, 255, 255, .25); }
.pv-ck-undo.two > span:hover { background: rgba(255, 255, 255, .14); }
/* 配置抽屉里那一行 */
.pv-ck-timecfg { display: flex; align-items: center; gap: 8px; min-height: var(--pv-dw-h, 34px); }
.pv-ck-timecfg .lab { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-ck-timepick.el-date-editor.el-input { width: 128px; }
/* 登记钟点的小框 */
.pv-ck-tmdlg .el-dialog__body { padding: 8px 20px 4px; }
.pv-ck-tmrow { display: flex; align-items: center; gap: 12px; }
.pv-ck-tminput { flex: none; width: 176px; height: 44px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 10px; background: var(--pv-surface); font: inherit; font-size: 22px; font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; outline: 0; }
.pv-ck-tminput:focus { border-color: var(--pv-primary); }
.pv-ck-tmverdict { display: inline-flex; align-items: center; height: 24px; padding: 0 9px; border-radius: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 24px; font-weight: 700; white-space: nowrap; }
.pv-ck-tmverdict.ok { background: #E3F5EA; color: #1B8A49; }
.pv-ck-tmverdict.bad { background: #FBE7E7; color: #C62F2F; }
.pv-ck-tmwhy { display: block; width: 100%; height: 34px; margin-top: 10px; padding: 0 10px; box-sizing: border-box; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); outline: none; }
.pv-ck-tmwhy:focus { border-color: var(--pv-primary); }
.pv-ck-tmnote { margin-top: 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-ck-tmfoot { display: inline-flex; gap: 8px; }
.pv-ck-tmfoot .el-button + .el-button { margin-left: 0; }
@media (max-width: 640px) {
  .pv-ck-stats.four { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pv-ck-time { left: 6px; bottom: 6px; right: 50px; }
  .pv-ck-time b { font-size: 12.5px; line-height: 16px; }
  .pv-ck-time i { height: 16px; line-height: 16px; padding: 0 4px; font-size: 10px; }
  .pv-ck-tmdlg { width: calc(100vw - 32px) !important; }
}

/* 打卡板块顶上的奖励提示条（2026-10-08）：再打几天能拿到什么。
   用户说原来那版浅黄底不够显眼：改成红包那种大红到橙的渐变底、白字，天数和奖励用金色大一号 */
.pv-ck-banner { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; padding: 10px 14px; border-radius: 12px;
  background: linear-gradient(100deg, #E0282E 0%, #F0502A 55%, #F78A1D 100%); color: #fff;
  box-shadow: 0 4px 12px rgba(224, 40, 46, .24); font-size: calc(14px + var(--pv-fz-add, 0px)); line-height: 22px; font-weight: 600; }
.pv-ck-banner .ic { flex: none; font-size: 18px; line-height: 22px; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .25)); }
.pv-ck-banner .tx { min-width: 0; }
.pv-ck-banner b { margin: 0 2px; font-weight: 800; font-size: inherit; color: #FFE27A; font-variant-numeric: tabular-nums; text-shadow: 0 1px 2px rgba(120, 20, 10, .35); }
/* 只有奖励那几个字大一点（用户 2026-10-08：整体回到原来的大小） */
.pv-ck-banner b.rw { font-size: calc(16px + var(--pv-fz-add, 0px)); }
.pv-ck-banner b.rw + b.rw::before { content: '、'; font-weight: 400; margin-right: 2px; color: #fff; }
@media (max-width: 640px) { .pv-ck-banner { padding: 9px 12px; font-size: 13.5px; } .pv-ck-banner b.rw { font-size: 15px; } }

/* ---------- 抽屉分组 v2（用户 2026-10-08）：不再用一圈框线把一组字段套起来——框套框既难看、又白占左右各 15px。
   改成「组标题 + 一道横线」：标题顶头，底下一条线，字段跟抽屉本身的左右边对齐。结构不变（fieldset.pv-dw-sec > legend），只换长相 ---------- */
.pv-drawer-body.pv-dw-secs { gap: 22px; padding-top: 14px; }
.pv-dw-sec { border: 0; border-radius: 0; padding: 0; }
.pv-dw-sec > legend { float: left; width: 100%; box-sizing: border-box; margin: 0 0 4px; padding: 0 0 7px; border-bottom: 1px solid var(--pv-border);
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 700; color: var(--pv-text); }
.pv-dw-sec > legend + * { clear: both; }

/* 任务卡上的提醒时间（2026-10-08） */
.pv-tc-remind { flex: none; display: inline-flex; align-items: center; gap: 3px; margin-left: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-soft); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-tc-remind i { font-size: 12px; }
.pv-tc-urgent { display: inline-flex; align-items: center; height: 18px; margin-left: 4px; padding: 0 6px; border-radius: 4px; background: var(--pv-danger-soft, #FBE7E7); color: var(--pv-danger-text, #C62F2F); font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 700; white-space: nowrap; }

/* 后台 · 电话提醒（settings-voice.js，2026-10-08） */
.pv-voice { margin-top: 28px; }
.pv-voice-phones { display: flex; flex-direction: column; gap: 8px; margin: 12px 0; max-width: 460px; }
.pv-voice-row { display: flex; align-items: center; gap: 10px; }
.pv-voice-row .n { flex: none; width: 88px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-voice-row .el-input { flex: 1; min-width: 0; }
/* 「吃什么」那一栏带圆圈的行：圆点换成圆圈，往右让出位置（2026-10-08） */
.pv-cal-brief-mealrow.tick { padding-left: 24px; }
.pv-cal-brief-mealrow.tick::before { display: none; }
/* 日历今天牌上行程的钟点（2026-10-08） */
.pv-cal-legtime { flex: none; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; white-space: nowrap; }

/* 打卡板块顶上的鼓励条（2026-10-10）：上一轮完成了，夸一句。绿色，跟下面红色的「再打几天」分开 */
.pv-ck-cheer { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 10px; padding: 10px 14px; border-radius: 12px; background: #E8F6EC; color: #1B6B3A; font-size: calc(14px + var(--pv-fz-add, 0px)); line-height: 22px; }
.pv-ck-cheer .ic { flex: none; font-size: 18px; line-height: 22px; }
.pv-ck-cheer .tx { min-width: 0; }
.pv-ck-cheer b { font-weight: 800; margin: 0 1px; }
@media (max-width: 640px) { .pv-ck-cheer { padding: 9px 12px; font-size: 13.5px; } }

/* 打卡奖励 · 起止日期（1.0.113）：编辑行第二排「从 … 到 …」，列表行多一个日期小字 */
.pv-ck-rrow { flex-wrap: wrap; }
.pv-ck-rrow .dates { order: 9; flex: 0 0 100%; display: flex; align-items: center; gap: 6px; }
.pv-ck-rrow .dates .dp.el-date-editor { width: 150px; flex: none; }
.pv-ck-reward .rg { flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-reward .left.off { color: var(--pv-danger, #B4233C); }

/* 餐厅清单 · 地区按钮 + 地图（1.0.114）。<pv-geo-map> 是通用的，.pv-rest-* 是餐厅这一页的摆法 */
.pv-geo { position: relative; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-md, 12px); overflow: hidden; background: var(--pv-bg); isolation: isolate; }
.pv-geo-box { width: 100%; height: 100%; }
.pv-geo-err { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 13px; color: var(--pv-text-faint); }
.pv-geo-ico { background: none; border: 0; }
.pv-geo-pin { display: block; width: 22px; height: 22px; margin-top: 2px; border-radius: 50% 50% 50% 0; transform: rotate(-45deg); background: var(--pv-primary); border: 2px solid #fff; box-shadow: 0 1px 4px rgba(0, 0, 0, .35); }
.pv-geo-pin.pick { background: #D9362B; }
.pv-geo .leaflet-container { font: inherit; }
.pv-geo .leaflet-popup-content { margin: 10px 12px; }
.pv-geo-pop .t { font-size: 14px; line-height: 20px; font-weight: 700; color: #191b23; }
.pv-geo-pop .s { font-size: 12px; line-height: 18px; color: #5d6273; }
.pv-geo-pop .n { font-size: 12px; line-height: 18px; color: #9499aa; }
.pv-rest-regions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-rest-map { height: 360px; margin-bottom: 12px; }
.pv-rest-unplaced, .pv-rest-pinline { display: flex; align-items: center; gap: 10px; margin: -4px 0 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); }
.pv-rest-pinline { margin: 6px 0 0; justify-content: space-between; }
.pv-rest-link { border: 0; background: none; padding: 0; font: inherit; color: var(--pv-primary-dark); cursor: pointer; white-space: nowrap; flex: none; }
.pv-rest-link:hover { text-decoration: underline; }
.pv-rest-link:disabled { color: var(--pv-text-faint); cursor: default; text-decoration: none; }
.pv-rest-addr { border: 0; background: none; padding: 0; font: inherit; color: inherit; cursor: pointer; text-align: left; }
.pv-rest-addr:hover { color: var(--pv-primary-dark); }
.pv-rest-addrrow { display: flex; gap: 8px; align-items: center; }
.pv-rest-addrrow .el-input { flex: 1; min-width: 0; }
.pv-rest-addrrow .el-button { flex: none; white-space: nowrap; }
.pv-rest-nofound { margin-top: 6px; font-size: 12.5px; line-height: 20px; color: var(--pv-text-faint); }
.pv-rest-found { margin-top: 6px; display: flex; flex-direction: column; border-top: 1px solid var(--pv-border); }
.pv-rest-found button { display: flex; align-items: baseline; gap: 8px; padding: 6px 2px; border: 0; border-bottom: 1px solid var(--pv-border); background: none; font: inherit; font-size: 13px; line-height: 20px; text-align: left; cursor: pointer; color: var(--pv-text); }
.pv-rest-found button b { flex: none; font-weight: 600; max-width: 50%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-rest-found button span { flex: 1; min-width: 0; color: var(--pv-text-faint); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-rest-found button:hover, .pv-rest-found button.on { color: var(--pv-primary-dark); }
.pv-rest-found button.on b::before { content: "✓ "; }
.pv-rest-pickmap { height: 240px; margin-top: 8px; }
@media (max-width: 640px) { .pv-rest-map { height: 240px; } .pv-rest-pickmap { height: 200px; } }
.pv-geo .leaflet-control-attribution { font-size: 10px; line-height: 16px; }

/* 打卡 · 目标和奖励的编辑块（1.0.115，用户 2026-10-10：原来一行挤着填、太紧）：标签在上、一格一件事，两列网格，按钮靠右 */
.pv-ck-redit { display: grid; grid-template-columns: 160px 1fr; gap: 14px 16px; padding: 18px 0 16px; border-bottom: 1px solid var(--pv-border); }
.pv-ck-redit .f { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.pv-ck-redit .f label { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); }
.pv-ck-redit .f.goal { grid-column: 1 / -1; }
.pv-ck-redit .f.date .el-date-editor { width: 100%; }
.pv-ck-redit .f.date + .f.date { max-width: 220px; }
.pv-ck-redit .acts { grid-column: 1 / -1; display: flex; justify-content: flex-end; gap: 8px; }
.pv-ck-redit .acts .el-button { margin: 0; white-space: nowrap; }
.pv-ck-reward .t b { font-weight: 600; margin-right: 8px; }
@media (max-width: 640px) { .pv-ck-redit { grid-template-columns: 1fr 1fr; } .pv-ck-redit .f.text { grid-column: 1 / -1; } .pv-ck-redit .f.date + .f.date { max-width: none; } }

/* 快乐社交 ·「下一件」管一整天（1.0.116）：标题行右边一颗小签「这天还有 N 件」，指上去弹出这一天的全部 */
.pv-ct-nx-more { flex: none; height: 20px; padding: 0 8px; border: 0; border-radius: var(--pv-radius-pill); background: var(--pv-ct-field);
  font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 600; color: var(--pv-primary-dark); white-space: nowrap; cursor: default; }
.pv-ct-nx-more:hover { background: color-mix(in srgb, var(--pv-bg) 60%, var(--pv-border)); }
.el-popover.pv-ct-nx-pop { padding: 12px 8px 8px; min-width: 280px; max-width: 380px; border-radius: 12px; }
.pv-ct-nx-poph { padding: 0 8px 8px; font-size: 12.5px; line-height: 18px; font-weight: 600; color: var(--pv-text-faint); }
.pv-ct-nx-pop .pv-ct-tl-row { grid-template-columns: minmax(0, 1fr) auto; gap: 10px; padding: 7px 8px; margin: 0; border-radius: 8px; }
.pv-ct-nx-pop .pv-ct-tl-row .pv-ct-skip { opacity: 1; }

/* 快乐社交 · 中间那栏的滚动条（用户 2026-10-10）：粗一点（6px，原来 4）、短两成（轨道上下各收一截，滑块跟着短）、
   滑块左右离东西一样远——左边是内容到滑块 13，右边原来是滑块到分割线 22，把这一栏往右让 9 */
.pv-soc-main.pv-work-scroll { margin-right: -9px; }
.pv-soc-main.pv-work-scroll::-webkit-scrollbar { width: 12px; }
.pv-soc-main.pv-work-scroll::-webkit-scrollbar-track { margin-block: 8vh; }
@media (max-width: 860px) { .pv-soc-main.pv-work-scroll { margin-right: 0; } }

/* 日记时间轴 · 中间那栏窄了就变单线（1.0.117，用户 2026-10-10：窗口窄的时候右栏占着地方，左右交错的两列被挤得每张卡只有两百来宽）。
   量的是时间轴所在那一栏的宽度，不是屏幕：屏幕不窄、但左右两栏都开着的时候一样会挤。摆法照上面手机那套（轴靠左、卡片占满） */
.pv-gt-main { container-type: inline-size; container-name: gtmain; }
@container gtmain (max-width: 680px) {
  .pv-gt::before { left: 14px; }
  .pv-gt-month { margin-left: 0; }
  .pv-gt-dot { left: 14px; margin-left: -5.5px; }
  .pv-gt-row.hl .pv-gt-dot { margin-left: -6.5px; }
  .pv-gt-row .pv-gt-card { width: calc(100% - 40px); }
  .pv-gt-row.left, .pv-gt-row.right { justify-content: flex-end; }
}
/* 窗口不到 1100：右边 Team Culture / 分类那栏收窄一点，把地方让给时间轴 */
@media (max-width: 1100px) and (min-width: 861px) { .pv-diary-body .pv-gt-layout.has-side { grid-template-columns: minmax(0, 1fr) 176px; } }

/* 日历 · 国内调休（1.0.120）：格子右上角一枚小字「休 / 班」，照国内日历的习惯——休是红的、班是深灰的 */
.pv-cal-shift { position: absolute; top: 7px; right: 6px; width: 18px; height: 18px; border-radius: 4px; display: flex; align-items: center; justify-content: center;
  font-style: normal; font-size: 11px; line-height: 18px; font-weight: 700; white-space: nowrap; }
.pv-cal-shift.rest { background: #FDECEC; color: #C4302B; }
.pv-cal-shift.work { background: #E9EAEE; color: #3A3F4B; }
.pv-cal-cell.other .pv-cal-shift { opacity: .55; }
.pv-cal-daycn { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 1.3; color: var(--pv-text-soft); white-space: nowrap; }
.pv-cal-daycn.off { color: #C4302B; }
.pv-cal-shift.inline { position: static; display: inline-flex; margin-left: 6px; vertical-align: 2px; }

/* 今天那张牌上的次要信息统一成一种小字（1.0.122，用户 2026-10-10：信息太多，这几样别那么显眼，字体也要一样）：
   日期旁边那几条（行程 / 假期 / 纪念日，连同「去程 / 返程」小签和钟点）、「国内 …」那一行、底下「接下来」——
   都是 12.5 / 20、不加粗、灰字；名字比日期深一档。电脑和手机一样。类别小片（行程 / 假期）保持原样，靠它认是哪一类 */
.pv-cal-brief .pv-cal-dayassoc-item { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-soft); }
.pv-cal-brief .pv-cal-dayassoc-title { font-weight: 400; color: var(--pv-text-soft); }
/* 当天过生日的那条（用户 2026-10-29）：跟 Next 里「明天生日」那张 hot 卡一个画法——主色框 + 浅底 + 加粗；
   不然前一天在 Next 里圈着，到了正日子挪进「节日」行反而成了一行灰字 */
/* 今天过生日的那颗：用生日色（跟 Let's connect 总览热力格 / 本月生日同一个蓝），跟主色的钮分开（用户 2026-10-29：当天的换个颜色突出） */
.pv-cal-brief .pv-cal-dayassoc-item.hot { box-shadow: 0 0 0 1.5px var(--pv-ev-bday); background: var(--pv-ev-bday-soft); padding: 2px 10px; border-radius: 8px; }
.pv-cal-brief .pv-cal-dayassoc-item.hot .pv-cal-dayassoc-title { font-weight: 700; color: var(--pv-ev-bday); }
.pv-cal-brief .pv-cal-dayassoc-item.hot:hover .pv-cal-dayassoc-title { text-decoration: none; }
.pv-cal-brief .pv-cal-leg, .pv-cal-brief .pv-cal-leg.back { background: var(--pv-bg); color: var(--pv-text-faint); font-weight: 400; font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-cal-brief .pv-cal-legtime { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 400; color: var(--pv-text-faint); }
.pv-cal-brief .pv-cal-daycn, .pv-cal-brief .pv-cal-daycn.off { font-size: inherit; line-height: inherit; color: var(--pv-text-faint); }
.pv-cal-brief .pv-cal-brief-soon { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); }
.pv-cal-brief .pv-cal-soon-item b { font-weight: 400; color: var(--pv-text-soft); }
.pv-cal-brief .pv-cal-soon-item i, .pv-cal-brief .pv-cal-soon-item u { color: var(--pv-text-faint); }
@media (max-width: 640px) {
  /* 日期旁边那几条在手机上：名字自己占一行，「当天往返 15:30 → 16:10 …」这些灰字排在它下面——
     原来挤在同一行，名字被压成一个字一行的竖排 */
  .pv-cal-brief .pv-cal-dayassoc-item { flex-wrap: wrap; row-gap: 0; max-width: 100%; }
  .pv-cal-brief .pv-cal-dayassoc-title { order: -1; flex: 1 1 100%; min-width: 0; }
  /* 手机月历上不放行程（用户 2026-10-10：占位，细条也不要）；行程在顶上那张牌和「行程」页签里看 */
  .pv-cal-wrap .pv-cal-band.pv-cal-band-trip { display: none; }
  /* 调休小标缩到格子右上角：手机格子窄，原来的大小会压在今天那颗圆上 */
  .pv-cal-cell .pv-cal-shift { top: 1px; right: 1px; width: 13px; height: 13px; border-radius: 3px; font-size: 9px; line-height: 13px; }
}

/* 家人安排 · 每周固定（1.0.123）：一张周课表，七栏；栏窄了改成一天一行（按这一块自己的宽度量，不按屏幕） */
.k-routine { --pv-k: #0E8A7D; }
.k-routine .pv-cal-dot, .pv-cal-chip.k-routine { background: #0E8A7D; }
.pv-rt { container-type: inline-size; container-name: rtweek; }
.pv-rt-zone { margin: 0 0 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-rt-week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 8px; align-items: start; }
.pv-rt-col { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.pv-rt-day { display: flex; align-items: center; gap: 6px; height: 28px; padding: 0 2px; border-bottom: 1px solid var(--pv-border);
  font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; color: var(--pv-text-soft); white-space: nowrap; }
.pv-rt-day i { font-style: normal; font-weight: 600; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 6px; border-radius: 4px; background: var(--pv-primary); color: #fff; }
.pv-rt-col.today .pv-rt-day { color: var(--pv-primary-dark); border-bottom-color: var(--pv-primary); }
.pv-rt-item { display: flex; flex-direction: column; gap: 1px; min-width: 0; padding: 7px 9px; border: 1px solid var(--pv-border); border-left: 3px solid #0E8A7D; border-radius: 0 8px 8px 0;
  background: var(--pv-surface); font: inherit; text-align: left; cursor: pointer; }
.pv-rt-item:hover { border-color: var(--pv-primary); border-left-color: #0E8A7D; }
.pv-rt-item.ro { cursor: default; }
.pv-rt-item b { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-rt-item .n { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text); overflow-wrap: anywhere; }
.pv-rt-item .w, .pv-rt-item .p { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-rt-item .w { color: var(--pv-text-soft); }
/* 隔一周上一次的（用户 2026-10-27）：卡上一枚小签，不上的那周整条淡掉；抽屉里勾选框 + 基准日同一行 */
.pv-rt-item em.bw { align-self: flex-start; font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; padding: 0 6px; border-radius: 4px; background: var(--pv-success-soft); color: var(--pv-success-text); white-space: nowrap; }
.pv-rt-item em.bw.off { background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-rt-item.off { opacity: .55; }
.pv-rt-biw { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.pv-rt-biw .anchor.el-date-editor { width: 170px; }
.pv-pmo-seg.pv-rt-days { display: flex; flex-wrap: wrap; }
.pv-pmo-seg.pv-rt-days button { flex: 1 0 auto; white-space: nowrap; }
@container rtweek (max-width: 760px) {
  .pv-rt-week { grid-template-columns: minmax(0, 1fr); gap: 4px; }
  .pv-rt-col { flex-direction: row; flex-wrap: wrap; align-items: flex-start; gap: 6px 8px; padding: 6px 0; border-bottom: 1px solid var(--pv-border); }
  .pv-rt-col.empty { display: none; }
  .pv-rt-day { flex: 0 0 64px; border-bottom: 0; height: auto; padding-top: 8px; }
  .pv-rt-item { flex: 1 1 200px; }
}

/* 购物清单 · 中国海运采购（1.0.125）：卡片照任务卡（.pv-tc），这里只补它自己的两样 */
.pv-rs-card .pv-rs-left { margin-left: auto; flex: none; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 400; color: var(--pv-text-faint); white-space: nowrap; }
.pv-rs-card.due .pv-rs-left { color: var(--pv-danger, #B4233C); font-weight: 600; }

/* 家人安排 · 课表（1.0.127）：节次 × 周几的格子。格子平时是一块带颜色的字，点了变输入框 */
.pv-tt-head { display: flex; align-items: center; gap: 8px; margin: 0 0 10px; min-height: 28px; }
.pv-tt-who { font-size: calc(14.5px + var(--pv-fz-add, 0px)); line-height: 22px; font-weight: 700; color: var(--pv-text); white-space: nowrap; }
.pv-tt-title { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 22px; color: var(--pv-text-faint); white-space: nowrap; }
/* 课表的有效期：名字后面一颗小钮（28 高是页面上次要按钮那一档的下限，这里跟旁边的字排一行用 24） */
.pv-tt-span { flex: none; display: inline-flex; align-items: center; gap: 5px; height: 24px; padding: 0 9px; margin-left: 4px; border: 1px solid var(--pv-border); border-radius: 12px; background: var(--pv-surface);
  font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 22px; color: var(--pv-text-soft); white-space: nowrap; cursor: pointer; }
.pv-tt-span:hover:not(:disabled) { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-tt-span:disabled { cursor: default; }
.pv-tt-span.none { border-style: dashed; color: var(--pv-text-faint); }
.pv-tt-span.off { border-color: #F2B8B5; color: #B3261E; background: #FDECEC; }
.pv-tt-span em { font-style: normal; font-weight: 600; }
.pv-tt-scroll { overflow-x: auto; }
.pv-tt-grid { width: 100%; min-width: 420px; border-collapse: separate; border-spacing: 4px; table-layout: fixed; }
.pv-tt-grid th { height: 30px; padding: 0 4px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; color: var(--pv-text-soft); text-align: center; white-space: nowrap; }
.pv-tt-grid th.p, .pv-tt-grid td.p { width: 64px; }
.pv-tt-grid th i { font-style: normal; margin-left: 5px; padding: 0 5px; border-radius: 4px; background: var(--pv-primary); color: #fff; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 600; }
.pv-tt-grid th.today { color: var(--pv-primary-dark); }
.pv-tt-grid td { height: 46px; padding: 0; text-align: center; vertical-align: middle; border-radius: 8px; }
.pv-tt-grid td.can { cursor: pointer; }
.pv-tt-grid td.today { box-shadow: inset 0 0 0 1.5px var(--pv-primary-soft); }
.pv-tt-grid td.p { color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 16px; }
.pv-tt-grid td.p b { display: block; font-weight: 600; color: var(--pv-text-soft); }
.pv-tt-grid td.p i { display: block; font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-tt-sub { display: flex; align-items: center; justify-content: center; width: 100%; height: 46px; padding: 0 6px; box-sizing: border-box; border-radius: 8px;
  font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 500; overflow-wrap: anywhere; }
.pv-tt-sub.none { background: var(--pv-bg); color: var(--pv-text-faint); opacity: .6; }
.pv-tt-grid td.can:hover .pv-tt-sub { filter: brightness(.96); }
.pv-tt-inp { width: 100%; height: 46px; box-sizing: border-box; border: 1.5px solid var(--pv-primary); border-radius: 8px; padding: 0 6px; font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); text-align: center; outline: none; background: var(--pv-surface); color: var(--pv-text); }
.pv-tt-grid td.p .pv-tt-inp { height: 22px; font-size: calc(12px + var(--pv-fz-add, 0px)); border-radius: 5px; padding: 0 3px; }
.pv-tt-grid td.p .pv-tt-inp.tm { margin-top: 2px; }
@media (max-width: 640px) { .pv-tt-grid th.p, .pv-tt-grid td.p { width: 40px; } .pv-tt-grid { border-spacing: 3px; } .pv-tt-sub { font-size: 12.5px; padding: 0 2px; } }

/* 日历今天那张牌 ·「今日安排」一行（1.0.127）：日期下面单独一块，左边一列小标签（行程 / 节日 / 课表 / 课外 / 接下来），右边是内容。
   字都是那套次要信息的小灰字（12.5 / 20），跟下面几栏待办拉开主次 */
.k-school { --pv-k: #5B6ABF; }
/* 上边不再留白：分割线（.pv-cal-brief-head）自己往下已经有 12，这里再留 10 就叠成 22 了（用户 2026-10-12） */
.pv-cal-brief .pv-cal-plan { display: flex; flex-direction: column; gap: 5px; padding: 0 0 12px; margin-bottom: 14px; border-bottom: 1px solid var(--pv-border); }
/* 左边那列小标签到内容的距离收了四分之一（用户 2026-10-12）：原来是 48 的一列 + 10 的沟，「课表」两个字后面空着 34；现在 40 + 8，空 24 */
.pv-cal-plan-row { display: grid; grid-template-columns: 40px minmax(0, 1fr); column-gap: 8px; align-items: baseline; }
/* 小标签是一颗钮：点一下这一行收起来，再点展开；不存，刷新就都回来。
   收起来的时候标签不变样（用户 2026-10-12：原来画了删除线，看着像把这件事划掉了），右边写一句「已隐藏」 */
.pv-cal-plan-row > .k { border: 0; background: none; padding: 0; font: inherit; text-align: left; cursor: pointer;
  font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-cal-plan-row > .k:hover { color: var(--pv-primary-dark); }
/* 时段撞了（用户 2026-10-28）：「撞了」红字，每条「重叠段 | 甲 几点到几点 × 乙 几点到几点」 */
.pv-cal-plan-row > .k.clash, .pv-cal-plan-row > .k.clash:hover { justify-self: start; padding: 0 7px; height: 19px; line-height: 19px; border-radius: var(--pv-radius-pill); background: var(--pv-danger); color: #fff; font-size: calc(11px + var(--pv-fz-add, 0px)); cursor: default; }   /* 跟逾期「N Days」同一枚红签（用户 2026-10-28） */
.pv-cal-clash-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-cal-clash-row > b { color: var(--pv-danger); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-cal-clash-row > span > i { font-style: normal; color: var(--pv-text-faint); margin-left: 4px; font-variant-numeric: tabular-nums; }
.pv-cal-clash-row > em { font-style: normal; color: var(--pv-text-faint); }
.pv-cal-clash { position: absolute; top: 7px; right: 28px; height: 18px; padding: 0 5px; border-radius: 4px; background: var(--pv-danger); color: #fff; font-style: normal; font-size: 11px; line-height: 18px; font-weight: 700; }
.pv-cal-plan-hid { justify-self: start; border: 0; background: none; padding: 0; font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); cursor: pointer; white-space: nowrap; }
.pv-cal-plan-hid:hover { color: var(--pv-primary-dark); }
.pv-cal-plan-row > .v { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 18px; min-width: 0; }
.pv-cal-plan-row > .v.col { flex-direction: column; align-items: flex-start; gap: 2px; }
/* 人名是一枚小签（用户 2026-10-12：原来是粗体字），课表和课外两行一样：20 高、浅主色底 */
.pv-cal-plan-who { flex: none; display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; background: var(--pv-primary-soft); color: var(--pv-primary-dark);
  font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 500; white-space: nowrap; }
/* 小签里人名后面跟着这一天的起止钟点（用户 2026-10-12：总时间放进标签里） */
.pv-cal-plan-who i { font-style: normal; margin-left: 6px; font-weight: 400; font-variant-numeric: tabular-nums; opacity: .85; }
/* 课表每行最前面：今天 / 明天 + 周几（孩子那边的） */
.pv-cal-plan-day { flex: none; display: inline-flex; align-items: baseline; gap: 4px; min-width: 62px; color: var(--pv-text-soft); white-space: nowrap; }
.pv-cal-plan-day i { font-style: normal; color: var(--pv-text-faint); }
.pv-cal-brief .pv-cal-dayassoc-item.none { cursor: default; }
.pv-cal-plan-lessons { display: inline-flex; flex-wrap: wrap; gap: 0 4px; min-width: 0; color: var(--pv-text-soft); }
.pv-cal-plan-lessons i { font-style: normal; white-space: nowrap; }
.pv-cal-plan-lessons i u { text-decoration: none; margin-right: 3px; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-cal-plan-lessons i + i::before { content: "·"; margin-right: 4px; color: var(--pv-text-faint); }
.pv-cal-plan-place { color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
/* Next（原来叫「接下来」）：一条一行的列表，不再横着排成一串（用户 2026-10-12） */
.pv-cal-brief .pv-cal-plan .pv-cal-brief-soon { margin: 0; padding: 0; border: 0; flex-direction: column; align-items: flex-start; gap: 2px; }
.pv-cal-brief .pv-cal-plan .pv-cal-soon-item, .pv-cal-brief .pv-cal-plan .pv-cal-soon-item.is-link { margin-left: 0; padding-left: 0; }
@media (max-width: 640px) {
  .pv-cal-plan-row { grid-template-columns: 34px minmax(0, 1fr); column-gap: 6px; }
  .pv-cal-brief .pv-cal-plan .pv-cal-dayassoc-title { order: 0; flex: 0 1 auto; }
}

/* 今日安排 · 小签和 Next 列表（1.0.137，用户 2026-10-12 挑的那版模拟稿）
   小签：20 高、12 号，一类一个颜色——值班灰蓝、游玩橙、美国假日紫，别的灰 */
.pv-cal-tag { flex: none; display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 500; white-space: nowrap; }
.pv-cal-tag.duty { background: #E9ECF3; color: #4A5670; }
.pv-cal-tag.play { background: #FFF0DC; color: #B26A00; }
.pv-cal-tag.fest { background: #EEE9FA; color: #5B3FA8; }
.pv-cal-tag.misc { background: var(--pv-bg); color: var(--pv-text-soft); }
/* Next：一条一行。左边一块日期牌（行程蓝 / 活动绿 / 假期紫 / 纪念日橙），右边两行：小签 + 标题（不加粗）、还有多久 | 到哪天 */
/* Next 横排（用户 2026-10-23：竖着四条太占地方）：一条 220 宽一行排开，排不下换行；手机上两列 */
.pv-cal-brief .pv-cal-plan .pv-cal-nexts { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 8px 20px; }
.pv-cal-brief .pv-cal-plan .pv-cal-nexts > .pv-cal-next { flex: 0 1 220px; min-width: 0; }
@media (max-width: 640px) {
  .pv-cal-brief .pv-cal-plan .pv-cal-nexts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 10px; }
  .pv-cal-brief .pv-cal-plan .pv-cal-nexts > .pv-cal-next { gap: 8px; }
}
.pv-cal-plan-row:has(.pv-cal-nexts) > .k { line-height: 40px; }
/* 收起来的时候每一行都一样高（用户 2026-10-12：Next 收起后上面空着一大截——它的标签为了对齐日期牌是 40 高，收起来就不该还是 40） */
.pv-cal-plan-row:has(.pv-cal-nexts) > .k.off { line-height: 20px; }
.pv-cal-next { display: flex; align-items: center; gap: 10px; min-width: 0; cursor: pointer; border-radius: 8px; }
.pv-cal-next:hover .t { color: var(--pv-primary-dark); }
.pv-cal-next:focus-visible { outline: 2px solid var(--pv-primary); outline-offset: 2px; }
.pv-cal-next-tile { flex: none; width: 44px; height: 40px; border-radius: 8px; display: flex; flex-direction: column; align-items: center; justify-content: center; line-height: 1; background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-cal-next-tile b { font-size: 16px; font-weight: 800; font-variant-numeric: tabular-nums; }
.pv-cal-next-tile.sm b { font-size: 12.5px; }
.pv-cal-next-tile i { font-style: normal; font-size: 10.5px; margin-top: 3px; white-space: nowrap; }
.pv-cal-next-tile.trip { background: #E3F0FA; color: #2F7FC1; }
.pv-cal-next-tile.act { background: #E4F4EA; color: #1E7B45; }
.pv-cal-next-tile.fest { background: #EEE9FA; color: #5B3FA8; }
.pv-cal-next-two { display: flex; flex-direction: column; gap: 0; min-width: 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-cal-next-two .l1 { display: flex; align-items: center; gap: 7px; min-width: 0; }
/* 标题跟上面课表里的课名一个颜色、一个字号（用户 2026-10-12：这一块的字要一样，不要有的黑有的灰） */
.pv-cal-next-two .l1 .t { color: var(--pv-text-soft); font-weight: 400; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 第二行左边让出 7px：上一行开头是小签，小签自己有 7 的内边距，字是从那儿起的——这样上下两行的字对齐 */
.pv-cal-next-two .l2 { display: flex; align-items: center; color: var(--pv-text-faint); white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-cal-next-two .l1:has(.pv-cal-tag) + .l2 { padding-left: 7px; }      /* 上一行没有小签的（没性质的行程）不用让，标题本来就顶着左边 */
/* 「后天 / 5 天后」不用特殊颜色、不加粗（用户 2026-10-12），近的远的一个样 */
/* 第二行整行一个颜色（用户 2026-10-12）：「后天 / 5 天后」跟后面的日期、钟点一样，都是这一行的浅灰 */
.pv-cal-next-two .l2 b, .pv-cal-next-two .l2 b.near { font-weight: 400; color: inherit; }
.pv-cal-next-two .l2 .bar { display: inline-block; width: 1px; height: 11px; margin: 0 8px; background: var(--pv-border); }

/* 日历 · QAA（求职申请系统推过来的求职步骤，1.0.143）：自己一个颜色，不混在 PMO 任务 / 日常小事里 */
.k-qaa { --pv-k: #7A4FBF; }
.k-qaa .pv-cal-dot, .pv-cal-chip.k-qaa { background: #7A4FBF; }
/* 日历 · 身体健康的预约（2026-10-31）：约好了的洗牙 / 体检 / 疫苗 / 理发 */
.k-appt { --pv-k: #C2547A; }
.k-appt .pv-cal-dot, .pv-cal-chip.k-appt { background: #C2547A; }

/* 打卡：一个项目几张卡（1.0.148）——新增钮在最前，两张以上排页签 */
.pv-ck-cards { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; margin-bottom: 14px; }
.pv-ck-cards .pv-addbtn { flex-shrink: 0; }
.pv-ck-tabs { flex-wrap: wrap; max-width: 100%; }
.pv-ck-tabs button { white-space: nowrap; flex-shrink: 0; height: 30px; padding: 0 14px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ck-none { padding: 18px 0 8px; color: var(--pv-text-faint); font-size: calc(13px + var(--pv-fz-add, 0px)); }

/* Markdown 字体颜色（1.0.149）：{red:…} 渲染成 .pv-mdc-red；编辑器工具条「A 颜色」拉出一排色点 */
.pv-mdc-red { color: var(--pv-danger); }
.pv-mdc-orange { color: var(--pv-cat-6); }
.pv-mdc-green { color: var(--pv-success-text); }
.pv-mdc-blue { color: var(--pv-cat-2); }
.pv-mdc-purple { color: var(--pv-cat-5); }
.pv-mdc-gray { color: var(--pv-text-faint); }
.pv-mde-color { position: relative; display: inline-flex; }
.pv-mde-a { font-weight: 700; text-decoration: underline; text-decoration-color: var(--pv-danger); text-decoration-thickness: 2px; text-underline-offset: 2px; }
/* 色点浮层（用户 2026-10-20）：点开后不靠悬停维持——原来鼠标穿过按钮和浮层之间那 4px 缝就收起来，色点根本点不到；
   现在点别处 / Esc / 选完才收，缝也不留 */
.pv-mde-colors { position: absolute; top: 100%; left: 0; z-index: 30; display: flex; gap: 6px; padding: 8px; margin-top: 2px;
  background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 8px; box-shadow: 0 6px 18px rgba(20, 24, 40, .14); }
.pv-mde-bar .pv-mde-colors button { min-width: 0; min-height: 0; width: 22px; height: 22px; padding: 0; border-radius: 50%; border: 2px solid var(--pv-surface); box-shadow: 0 0 0 1px var(--pv-border); flex-shrink: 0; }
.pv-mde-bar .pv-mde-colors button:hover { box-shadow: 0 0 0 2px var(--pv-text-soft); }
.pv-mde-bar .pv-mde-colors .pv-mdc-dot-red { background: var(--pv-danger); }
.pv-mde-bar .pv-mde-colors .pv-mdc-dot-orange { background: var(--pv-cat-6); }
.pv-mde-bar .pv-mde-colors .pv-mdc-dot-green { background: var(--pv-success-text); }
.pv-mde-bar .pv-mde-colors .pv-mdc-dot-blue { background: var(--pv-cat-2); }
.pv-mde-bar .pv-mde-colors .pv-mdc-dot-purple { background: var(--pv-cat-5); }
.pv-mde-bar .pv-mde-colors .pv-mdc-dot-gray { background: var(--pv-text-faint); }

/* 今日安排：人不在国内时课表 / 课外的小标（1.0.152）——「过」上完了、「明」落在我这边明天 */
.pv-cal-mk { display: inline-flex; align-items: center; justify-content: center; flex: none; height: 16px; padding: 0 4px; margin-right: 4px; border-radius: 3px;
  font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 16px; font-weight: 600; white-space: nowrap; }
.pv-cal-mk.past { background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-cal-mk.next { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-cal-plan-who i .pv-cal-mk { margin: 0 0 0 4px; }
.pv-cal-plan-lessons i.past { color: var(--pv-text-faint); }
.pv-cal-mk.cn { background: transparent; color: var(--pv-text-faint); font-weight: 400; padding: 0; margin-right: 6px; }
.pv-cal-plan-lessons i + i .pv-cal-mk.cn { margin-left: 2px; }

/* 打卡：失败的那几轮（1.0.160）——整行变浅、进度条灰的、右边一枚「失败」 */
.pv-ck-reward.failed .n, .pv-ck-reward.failed .t, .pv-ck-reward.failed .t b { color: var(--pv-text-faint); }
.pv-ck-reward.failed .bar i { background: var(--pv-border); }
/* 过往的轮次（用户 2026-10-27）：成功绿签 / 失败红签，「跟图不符」黄签；格子底边一条色带 + 第一天「第 N 轮」小签，跟列表一个颜色 */
/* 奖励 / 轮次那几行成列（用户 2026-10-27：右边那块宽窄不一，日期和进度条跟着挪；定死宽度又在窄屏上撑出横向滚动）：
   行本身的 grid 在上面 .pv-ck-reward 那条里；这里只把每个块钉死在自己那一列（有的行没有日期那一块，也不串位） */
.pv-ck-reward .n { grid-column: 1; }
.pv-ck-reward .t { grid-column: 2; }
.pv-ck-reward .rg { grid-column: 3; overflow: hidden; text-overflow: ellipsis; }
.pv-ck-reward .ops { grid-column: 4; justify-content: flex-start; }
.pv-ck-reward .bar { grid-column: 5; }
.pv-ck-reward .left { grid-column: 6; display: inline-flex; align-items: center; gap: 4px; min-width: 0; overflow: hidden; }
.pv-ck-reward .left > em { flex: none; margin-right: 2px; }
.pv-ck-reward .left .pv-ck-mis { flex: none; margin-left: 2px; }
.pv-ck-fail.won { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-ck-reward.past.won .bar i { background: var(--pv-success); }
.pv-ck-mis { display: inline-flex; align-items: center; height: 20px; padding: 0 6px; margin-left: 6px; border-radius: 4px; font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); background: var(--pv-warning-soft); color: var(--pv-warning-text); cursor: help; }
.pv-ck-redit.round .f.calc { grid-column: 1 / -1; flex-direction: row; align-items: center; gap: 10px; }
.pv-ck-redit.round .f.calc a { white-space: nowrap; }
.pv-ck-redit.round .pv-pmo-seg { align-self: flex-start; }
.pv-ck-redit.round .pv-pmo-seg button { height: 32px; padding: 0 16px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ck-rb { position: absolute; left: 0; right: 0; bottom: 0; height: 5px; z-index: 1; pointer-events: none; }
.pv-ck-rb.won { background: var(--pv-success); }   /* 只有成功的那一轮画色带（用户 2026-10-27：失败的别画红条）；轮次用第一天的小签认 */
.pv-ck-rno { position: absolute; left: 8px; top: 54px; height: 18px; padding: 0 6px; border-radius: 4px; font-size: calc(10.5px + var(--pv-fz-add, 0px)); line-height: 18px; font-weight: 600; white-space: nowrap; z-index: 1; pointer-events: none; }
.pv-ck-rno.go { pointer-events: auto; cursor: pointer; }     /* 过往的那轮：点小签去底下改（失败的只在这儿有） */
.pv-ck-rno.go:hover { box-shadow: 0 0 0 1.5px currentColor; }
.pv-ck-rpad { height: 0; }
.pv-ck-rno.won { background: var(--pv-success-soft); color: var(--pv-success-text); }   /* 只给成功的那轮：写「连续 N 天」，不写第几轮（用户 2026-10-27） */
.pv-ck-tile.on .pv-ck-rno { background: rgba(255, 255, 255, .88); }
.pv-ck-fail { display: inline-flex; align-items: center; height: 20px; padding: 0 6px; margin-right: 6px; border-radius: 4px; font-style: normal;
  font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; background: var(--pv-danger-soft); color: var(--pv-danger-text); white-space: nowrap; }

/* 周期任务「挪这一期」小框（1.0.161）：快捷日子 + 日期框一行，下面是理由 */
.pv-shift-when { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 12px; }
.pv-shift-when .pv-chip-opt i { font-style: normal; margin-left: 5px; opacity: .7; font-variant-numeric: tabular-nums; }

/* 安排联络（1.0.165）：评论在单独的抽屉里——行上一颗评论钮（没评论时悬停才出）、展开后底下一条「评论 N 条 ›」、评论抽屉顶上只读的信息块 */
button.pv-ct-plan-n { flex: none; display: inline-flex; align-items: center; gap: 3px; height: 24px; padding: 0 6px; border: 0; border-radius: 4px; background: none; cursor: pointer;
  color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); white-space: nowrap; }
button.pv-ct-plan-n:hover { background: rgba(31, 36, 48, .07); color: var(--pv-text); }
button.pv-ct-plan-n.none { opacity: 0; }
.pv-ct-plan-head:hover button.pv-ct-plan-n.none, button.pv-ct-plan-n.none:focus-visible { opacity: 1; }
.pv-ct-plan-cmtlink { display: inline-flex; align-items: center; gap: 5px; margin: 2px 0 6px; padding: 0; border: 0; background: none; cursor: pointer; white-space: nowrap;
  color: var(--pv-primary-dark); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-ct-plan-cmtlink:hover { text-decoration: underline; }
.pv-ct-cmt-top { padding: 12px 0 4px; border-bottom: 1px solid var(--pv-border); margin-bottom: 4px; }
.pv-ct-cmt-top .pv-ct-plan-info { margin-bottom: 8px; }
@media (max-width: 640px) { button.pv-ct-plan-n.none { display: none; } }
/* 1.0.168：卡片内容常驻，左边箭头只管评论；没评论时箭头那格空着，对齐；输入框在评论列表底下 */
.pv-ct-plan-chev.blank { cursor: default; }
.pv-ct-plan-chev.blank:hover { background: none; }
.pv-cthread .pv-pmo-compose.bottom { margin-top: 8px; }
/* 有评论时那颗钮是一枚小签（用户 2026-10-18：一眼看到有几条）：浅主色底、主色深字；没评论的还是悬停才出的灰图标 */
button.pv-ct-plan-n:not(.none) { height: 22px; padding: 0 8px; border-radius: 11px; background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
button.pv-ct-plan-n:not(.none):hover { background: var(--pv-primary); color: #fff; }

/* 购物清单：卡片换成列表（1.0.171，用户 2026-10-18）——一行一件；最左 ✓ / ✗，点一行别处 = 编辑 */
.pv-wl-tablewrap { overflow-x: auto; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-card, 10px); background: var(--pv-surface); }
.pv-wl-table { width: 100%; border-collapse: collapse; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-wl-table th { text-align: left; font-weight: 600; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); padding: 9px 10px; background: var(--pv-bg); border-bottom: 1px solid var(--pv-border); white-space: nowrap; }
.pv-wl-table td { padding: 8px 10px; border-bottom: 1px solid #f0f1f5; vertical-align: middle; color: var(--pv-text); }
.pv-wl-table tr:last-child td { border-bottom: 0; }
.pv-wl-table tr.link { cursor: pointer; }
.pv-wl-table tbody tr:hover td { background: #fafbfc; }
.pv-wl-table .act { width: 1%; white-space: nowrap; }
.pv-wl-table .act .pv-wc-quick { margin-left: 0; }
.pv-wl-table .name { min-width: 360px; width: 46%; }   /* 物品拉宽（用户 2026-10-31）：长名字别三行四行地折 */
.pv-wl-table .name .pv-wc-emoji { margin-right: 8px; }
.pv-wl-table .name .t { font-weight: 500; }
.pv-wl-table .rate { width: 1%; white-space: nowrap; }
.pv-wl-table .rate .el-rate { height: 20px; line-height: 20px; }
.pv-wl-table .nowrap { white-space: nowrap; width: 1%; }
.pv-wl-table td.over { color: var(--pv-danger); }
.pv-wl-table .num { white-space: nowrap; width: 1%; }
.pv-wl-table .loc { width: 140px; }
.pv-wl-table .note { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text-soft); }
.pv-wl-table .ops { width: 1%; text-align: right; }
.pv-wl-table .ops .pv-tc-more-btn { opacity: .5; }
.pv-wl-table tr:hover .ops .pv-tc-more-btn { opacity: 1; }
.pv-wl-table tr.done td, .pv-wl-table tr.bought td { color: var(--pv-text-faint); }
.pv-wl-table tr.done .name .t { text-decoration: line-through; }
/* 点了 ✓ / ✗：整行先变绿 / 变红，再淡出（跟原来卡片一个节奏） */
.pv-wl-table tr.is-check td { background: #EAF7EE; color: #2E7D46; transition: background .25s, color .25s; }
.pv-wl-table tr.is-drop td { background: #FDECEC; transition: background .25s; }
.pv-wl-table tr.is-leave { animation: pv-card-leave .42s ease forwards; pointer-events: none; }
@media (max-width: 640px) { .pv-wl-table .m-hide { display: none; } .pv-wl-table .name { min-width: 0; } .pv-wl-table .name .pv-wc-emoji { display: none; } }

/* 今日安排 · 孩子（1.0.173，用户 2026-10-18 给的数值）：一条一行 时间段 | 孩子名 | 上学 + 课名串 | 国内时间 */
.pv-kid-list { gap: 0 !important; align-items: stretch !important; min-width: 0; flex: 1; }
.pv-kid-list > .pv-kid-row, .pv-kid-list > .pv-kid-now { width: 100%; box-sizing: border-box; }
.pv-kid-row { display: grid; grid-template-columns: 104px 44px minmax(0, 1fr) auto; column-gap: 12px; align-items: baseline; padding: 7px 0; font-size: 14px; line-height: 22px; cursor: pointer; }
.pv-kid-row.past { opacity: .5; }
.pv-kid-row .t { font-variant-numeric: tabular-nums; color: var(--pv-text); white-space: nowrap; }
.pv-kid-row .who { font-weight: 600; white-space: nowrap; }
.pv-kid-row .what { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 12px; min-width: 0; }
.pv-kid-row .lab { font-weight: 600; white-space: nowrap; display: inline-flex; align-items: baseline; gap: 6px; }
.pv-kid-row .ls { color: #191b23; min-width: 0; }
.pv-kid-row .ls .l { position: relative; cursor: help; }
.pv-kid-row .ls .l.done { color: #9ca1b3; }
.pv-kid-row .ls .l.cur { color: #C97D07; font-weight: 600; }
.pv-kid-row .ls .l.next { text-decoration: underline dashed 1px; text-underline-offset: 3px; }
.pv-kid-row .cn { font-size: 12.5px; color: #9ca1b3; white-space: nowrap; }
.pv-kid-cnday { display: inline-block; margin-right: 4px; font-style: normal; font-size: 12px; line-height: 18px; padding: 0 6px; border-radius: 4px; background: #f6f6f9; color: #676c7e; }
.pv-kid-on { font-style: normal; font-size: 12px; line-height: 18px; padding: 0 7px; border-radius: 9px; background: #fdf1dc; color: #C97D07; font-weight: 600; white-space: nowrap; }
.pv-kid-now { display: flex; align-items: center; gap: 8px; margin: 2px 0; }
.pv-kid-now b { font-size: 12px; font-weight: 600; color: #C97D07; white-space: nowrap; }
.pv-kid-now i { flex: 1; height: 1px; background: #E8960C; opacity: .5; }
/* 点一下课名弹出的那句（手机上没有悬停）；电脑上悬停走 title */
.pv-kid-tip { position: absolute; left: 0; top: calc(100% + 4px); z-index: 20; font-style: normal; font-weight: 400; font-size: 12px; line-height: 18px; white-space: nowrap;
  padding: 4px 8px; border-radius: 6px; background: #2B3245; color: #fff; box-shadow: 0 4px 12px rgba(20, 24, 40, .18); }
/* 一条上学跨了我这边半夜（1.0.174）：「次日 / 昨天 / 今天」小签，跟国内周几那枚一个长相 */
.pv-kid-day { display: inline-block; font-style: normal; font-size: 12px; line-height: 18px; padding: 0 6px; border-radius: 4px; background: #f6f6f9; color: #676c7e; margin: 0 4px; white-space: nowrap; }
.pv-kid-row .t .pv-kid-day:first-child { margin-left: 0; }
.pv-kid-row { grid-template-columns: 144px 56px minmax(0, 1fr) auto; }
/* 字号跟这张牌别的几行一样（用户 2026-10-18：原来 14 / 22 偏大）：正文 12.5 / 20，小签 11.5 / 18 */
.pv-kid-row { grid-template-columns: 124px 52px minmax(0, 1fr) auto; padding: 5px 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-kid-row .cn { font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-kid-cnday, .pv-kid-on, .pv-kid-day { font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
.pv-kid-row .lab.school u { text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1.5px; }   /* 「上学」底下一道线（用户 2026-10-18） */
/* 1.0.179（用户 2026-10-18）：列和列之间收窄；「上课中」改红 */
.pv-kid-row { grid-template-columns: 114px 40px minmax(0, 1fr) auto; column-gap: 8px; }
.pv-kid-on { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
/* 手机（1.0.181，用户 2026-10-18 / 10-19）：一行四列塞不下——时间段 + 孩子名先吃掉 200 多像素，课名只剩三四个字一行。
   改成两行：第一行 时间段 · 孩子名 · 国内时间（靠右，放不下自己掉到下一行），第二行「上学」和课名串走同一行文字流，
   不再像 1.0.177 那样把「上学」单独顶成一行（.what 原来是 flex，课名串整块掉行）。
   这段必须排在上面那条 144px 的 grid-template-columns 之后，不然又被它盖掉（之前就是这么丢的）。 */
@media (max-width: 640px) {
  .pv-kid-row { display: flex; flex-wrap: wrap; align-items: center; column-gap: 10px; row-gap: 3px; padding: 8px 0; }
  .pv-kid-row .t   { order: 1; }
  .pv-kid-row .who { order: 2; }
  .pv-kid-row .cn  { order: 3; margin-left: auto; }
  .pv-kid-row .what { order: 4; flex: 0 0 100%; display: block; line-height: 24px; }
  .pv-kid-row .what .lab { margin-right: 8px; }
  .pv-kid-row .ls { display: inline; }
}
/* 1.0.181「家人」（用户 2026-10-19）：行程 / 活动并进来；名签可以好几个；行程后面那句状态（在外面 · 明天回来）浅一号 */
.pv-kid-row .who { display: inline-flex; flex-wrap: wrap; gap: 4px; }
.pv-kid-row .ls .pv-cal-leg, .pv-kid-row .ls .pv-cal-tag { font-style: normal; margin-right: 6px; }
.pv-kid-sub { font-style: normal; margin-left: 8px; color: var(--pv-text-faint); }
.pv-kid-row .t .pv-kid-day { margin: 0 6px 0 0; }
.pv-kid-row { grid-template-columns: var(--kid-t, 114px) var(--kid-who, 40px) minmax(0, 1fr) auto; }   /* 时间列宽 = kidTimeW 按内容算 */
/* 整条已经结束的：只靠整行 .5 变浅，课名不再叠一层「上完了」的灰（用户 2026-10-19：课表那行比课外那行淡一截，统一） */
.pv-kid-row.past .ls .l.done { color: inherit; }
/* 家人那块顶上「▲ 已过 N 条」（1.0.184，用户 2026-10-19）：跟「已隐藏」一个字号颜色；展开后箭头转成向下 */
.pv-kid-fold { align-self: flex-start; display: inline-flex; align-items: center; gap: 4px; border: 0; background: none; padding: 0 0 2px; font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); cursor: pointer; white-space: nowrap; }
.pv-kid-fold:hover { color: var(--pv-primary-dark); }
.pv-kid-fold svg { transition: transform .15s; }
.pv-kid-fold.open svg { transform: rotate(180deg); }

/* ---------- 规则页（spend-rules.js，2026-10-20）：待归类三态小签 + 按名字分组的规则表 ---------- */
.pv-rl-st { margin-left: 6px; }
.pv-mc-un-row .raw .pv-rl-st { margin: 0 8px 0 0; }
.pv-rl-st.pick { background: #fff4e5; color: #b4530a; }
.pv-rl-st.none { background: #fee4e2; color: var(--pv-danger); }
.pv-rl-st.unique { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-rl-cands { display: flex; flex-direction: column; gap: 4px; width: 100%; }
.pv-rl-cand { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 26px; min-width: 0; }
.pv-rl-cand .m { color: var(--pv-text-faint); min-width: 0; }
.pv-rl-cand .el-button { margin-left: auto; white-space: nowrap; flex-shrink: 0; }
.pv-rl-prefer.el-checkbox { margin: 0; white-space: nowrap; }
.pv-rl-prefer .el-checkbox__label { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-rl-groups { display: flex; flex-direction: column; gap: 14px; }
.pv-rl-ghead { display: flex; align-items: center; gap: 10px; font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 22px; padding: 0 8px 4px; }
.pv-mc-rule-row.off { opacity: .55; }
.pv-mc-rule-row .l2 .pv-rl-toggle { margin-left: auto; white-space: nowrap; flex-shrink: 0; height: 24px; line-height: 22px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); color: var(--pv-text-soft); font-family: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-mc-rule-row .l2 .pv-rl-toggle:hover { color: var(--pv-primary-dark); border-color: var(--pv-primary); }
.pv-mc-rule-row.off .l2 .pv-rl-toggle { color: var(--pv-primary-dark); border-color: var(--pv-primary); }
@media (max-width: 760px) { .pv-rl-cand .m:last-of-type { display: none; } }

/* 首页 Next · 生日先收起来（1.0.193，用户 2026-10-23）：悬停冒出 ⋯，手机上常驻；「已跳过 N」点开能恢复 */
.pv-cal-next-more { margin-left: auto; flex: none; }
.pv-cal-next-morebtn { width: 26px; height: 26px; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); cursor: pointer; padding: 0; display: inline-flex; align-items: center; justify-content: center; opacity: 0; }
.pv-cal-next:hover .pv-cal-next-morebtn, .pv-cal-next-morebtn:focus-visible, .pv-cal-next-more.is-active .pv-cal-next-morebtn { opacity: 1; }
.pv-cal-next-morebtn:hover { background: var(--pv-bg); color: var(--pv-primary-dark); }
@media (hover: none) { .pv-cal-next-morebtn { opacity: 1; } }
.pv-cal-snz-list { display: flex; flex-direction: column; gap: 6px; }
.pv-cal-snz-item { display: flex; align-items: center; gap: 8px; font-size: 12.5px; line-height: 20px; }
.pv-cal-snz-item .n { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-cal-snz-item .w { flex: none; color: var(--pv-text-faint); white-space: nowrap; }
.pv-cal-snz-undo { flex: none; border: 0; background: none; padding: 0; font: inherit; color: var(--pv-primary-dark); cursor: pointer; white-space: nowrap; }
/* 生日面板 · 今年跳过（1.0.193）：跟「只有月日」同一副小签长相；按钮 26 高，悬停才显眼 */
.pv-ann-skip { margin-left: 6px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 400; padding: 1px 8px; border-radius: var(--pv-radius-pill); white-space: nowrap; background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-ann-skipbtn { flex: none; height: 26px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 13px; background: var(--pv-surface); color: var(--pv-text-faint); font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); white-space: nowrap; cursor: pointer; margin-right: 6px; }
.pv-ann-skipbtn:hover { color: var(--pv-primary-dark); border-color: var(--pv-primary); }
/* 「上课中」挪到最右一列（1.0.195）：跟国内时间并排时隔开一点 */
.pv-kid-row .cn { display: inline-flex; align-items: center; gap: 6px; justify-self: end; white-space: nowrap; }
.pv-kid-row .cn .pv-kid-on { margin-left: 4px; }


/* ===== 企业租户（2026-10-24，views-company.js）：公司首页 / 会务 / 文件 ===== */
.pv-co-sub { color: var(--pv-text-soft); font-size: 14px; }
.pv-co-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; }
.pv-co-block { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius); padding: 14px 16px 12px; min-width: 0; }
.pv-co-block.wide { grid-column: 1 / -1; }
.pv-co-block.is-hidden { opacity: .45; border-style: dashed; }
.pv-co-block-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.pv-co-block-title { font-weight: 700; font-size: 15px; }
.pv-co-ib { border: 1px dashed #c4c8d2; background: #fff; border-radius: 6px; height: 24px; padding: 0 8px; font-size: 12px; cursor: pointer; color: var(--pv-text-soft); }
.pv-co-ib:hover { color: var(--pv-primary); border-color: var(--pv-primary); }
.pv-co-link { color: var(--pv-primary-dark, var(--pv-primary)); font-size: 12.5px; cursor: pointer; }
.pv-co-link:hover { text-decoration: underline; }
.pv-co-empty { color: var(--pv-text-faint); font-size: 13.5px; padding: 6px 0; }
.pv-co-muted { color: var(--pv-text-soft); font-size: 12.5px; }
.pv-co-lab { font-size: 11px; color: var(--pv-text-faint); font-weight: 700; letter-spacing: .04em; margin: 10px 0 5px; }
.pv-co-big { font-size: 26px; font-weight: 700; letter-spacing: -.2px; }
.pv-co-big small { font-size: 13px; font-weight: 500; color: var(--pv-text-soft); }
.pv-co-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px dashed var(--pv-border); font-size: 13.5px; cursor: pointer; min-width: 0; }
.pv-co-row:last-child { border-bottom: 0; }
.pv-co-row-main { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-co-tag { display: inline-block; font-size: 11.5px; line-height: 20px; padding: 0 7px; border-radius: 999px; background: var(--pv-bg); color: var(--pv-text-soft); border: 1px solid var(--pv-border); white-space: nowrap; flex: none; }
.pv-co-tag.danger, .pv-co-danger { color: var(--pv-danger-text, #c23434); background: var(--pv-danger-soft, #fde9e9); border-color: transparent; }
.pv-co-tag.warn { color: #9a6700; background: #fff4d6; border-color: transparent; }
.pv-co-tag.ok { color: #1f7a45; background: #dff3e6; border-color: transparent; }
.pv-co-warn { background: #fff4d6; color: #7a5200; border-radius: var(--pv-radius-sm); padding: 8px 10px; font-size: 13px; margin-bottom: 8px; }
.pv-co-name { margin-right: 6px; }
.pv-co-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.pv-co-chip { font-size: 12.5px; line-height: 24px; padding: 0 9px; border-radius: 999px; background: var(--pv-bg); border: 1px solid var(--pv-border); cursor: pointer; }
.pv-co-chip.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark, var(--pv-primary)); border-color: transparent; }
.pv-co-ann { display: flex; gap: 10px; align-items: baseline; padding: 8px 0; border-bottom: 1px dashed var(--pv-border); font-size: 14px; cursor: pointer; }
.pv-co-ann:last-child { border-bottom: 0; }
.pv-co-ann.pin { background: var(--pv-primary-soft); margin: 0 -8px; padding: 8px; border-radius: var(--pv-radius-sm); border-bottom: 0; }
.pv-co-pin { font-size: 11px; color: var(--pv-primary-dark, var(--pv-primary)); font-weight: 700; flex: none; }
.pv-co-ann-date { color: var(--pv-text-faint); font-size: 12px; flex: none; }
.pv-co-ann-text { white-space: pre-wrap; }
.pv-co-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.pv-co-table th, .pv-co-table td { padding: 6px 8px; border-bottom: 1px solid var(--pv-border); text-align: left; white-space: nowrap; }
.pv-co-table th { font-size: 11.5px; color: var(--pv-text-faint); font-weight: 700; }
.pv-co-table.matrix td { text-align: center; }
.pv-co-table.matrix td.n { text-align: left; font-weight: 600; }
.pv-co-table.matrix td.ok { color: #1f7a45; }
.pv-co-table.matrix td.no { color: #c23434; font-weight: 700; }
.pv-co-table.matrix tr.flag td { background: #fff4d6; }
.pv-co-scroll { overflow-x: auto; }
.pv-co-card { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius); padding: 10px 14px 12px; margin-top: 10px; }
.pv-co-meet-row { display: flex; align-items: center; gap: 10px; padding: 8px 4px; border-bottom: 1px dashed var(--pv-border); font-size: 13.5px; cursor: pointer; }
.pv-co-meet-row:hover { background: var(--pv-bg); }
.pv-co-absent { color: #c23434; font-size: 12.5px; }
.pv-co-doc { display: flex; align-items: center; gap: 12px; padding: 10px 4px; border-bottom: 1px dashed var(--pv-border); }
.pv-co-doc.know { opacity: .8; }
.pv-co-doc-ico { font-size: 22px; flex: none; }
.pv-co-doc-main { flex: 1; min-width: 0; }
.pv-co-doc-name { font-size: 14.5px; font-weight: 600; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.pv-co-today { display: flex; flex-direction: column; gap: 6px; }
.pv-addrow .pv-co-muted b { color: var(--pv-text); }
@media (max-width: 760px) { .pv-co-grid { grid-template-columns: 1fr; } }

/* 资产 · 最近一次按分组（1.0.197，用户 2026-10-24）：右上角 账户 / 分组 切换 + 设置钮；分组那条按组里账户的类别分段 */
.pv-as-bartools { display: flex; align-items: center; gap: 6px; }
.pv-as-grpset { width: 26px; height: 26px; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); cursor: pointer; padding: 0; display: inline-flex; align-items: center; justify-content: center; font-size: 14px; }
.pv-as-grpset:hover { background: var(--pv-bg); color: var(--pv-primary-dark); }
.pv-as-bar .track.seg .fill { display: flex; height: 100%; border-radius: 3px; overflow: hidden; }
/* 各账户 · 较基准（用户 2026-10-29）：一账户一行 账户 ｜ 基准时 ｜ 最近 ｜ 变化（本币 + 小字 %）｜ 小折线；合计行加粗 */
.pv-as-an { display: flex; flex-direction: column; }
.pv-as-an-row { display: grid; grid-template-columns: minmax(0, 200px) 1fr 1fr 1.2fr 110px; align-items: center; gap: 12px; min-height: 34px; padding: 3px 0; border-bottom: 1px solid #f4f5f8; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-as-an-row.head { min-height: 26px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); border-bottom: 1px solid var(--pv-border); }
.pv-as-an-row.total { border-bottom: 0; font-weight: 600; }
.pv-as-an-row .n { display: flex; align-items: center; gap: 6px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-as-an-row .n em { font-style: normal; font-weight: 400; color: var(--pv-text-faint); }
.pv-as-an-row .n .dot { flex: none; width: 8px; height: 8px; border-radius: 50%; }   /* 类别色点：现金 / 债券 / 股票，颜色由 .c-cash 那几条给 */
.pv-as-an-row .num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; line-height: 18px; }
.pv-as-an-row .num small { display: block; font-size: calc(11px + var(--pv-fz-add, 0px)); line-height: 14px; font-weight: 400; color: var(--pv-text-faint); }
.pv-as-an-row .num.up { color: var(--pv-success); } .pv-as-an-row .num.down { color: var(--pv-danger); }
.pv-as-an-row .sp { display: block; height: 28px; text-align: right; }
.pv-as-an-row .sp svg { width: 100%; height: 28px; overflow: visible; }
.pv-as-an-row .sp polyline { fill: none; stroke: var(--pv-text-faint); stroke-width: 1.5; vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round; }
.pv-as-an-row .sp polyline.up { stroke: var(--pv-success); } .pv-as-an-row .sp polyline.down { stroke: var(--pv-danger); }
.pv-as-bench.el-select { width: 170px; }
@media (max-width: 640px) {
  .pv-as-an-row { grid-template-columns: minmax(0, 1fr) 1fr 1.2fr; gap: 8px; }
  .pv-as-an-row > span:nth-child(2), .pv-as-an-row .sp { display: none; }   /* 手机：只留 账户 ｜ 最近 ｜ 变化 */
}
.pv-as-bar .track.seg .fill i { display: block; height: 100%; border-radius: 0; }
.pv-as-grp { display: flex; flex-direction: column; gap: 8px; max-height: 60vh; overflow: auto; }
.pv-as-grp-row { display: grid; grid-template-columns: minmax(0, 1fr) 200px; align-items: center; gap: 12px; font-size: 13px; line-height: 20px; }
.pv-as-grp-row .n { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-as-grp-row .n em { font-style: normal; color: var(--pv-text-faint); }
/* 弹窗底下的分组表（用户 2026-10-29）：加一组 → 组名两态（字 / 点了变输入框）→ 几个账户 → ✕ */
.pv-as-grp-list { display: flex; flex-direction: column; gap: 6px; margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--pv-border); }
.pv-as-grp-lt { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-soft); }
.pv-as-grp-list > .pv-addbtn { align-self: flex-start; }
.pv-as-grp-g { display: grid; grid-template-columns: minmax(0, 1fr) auto 26px; align-items: center; gap: 10px; min-height: 30px; font-size: 13px; }
.pv-as-grp-g .nm { min-height: 30px; line-height: 30px; padding: 0 8px; border-radius: 6px; color: var(--pv-text); cursor: text; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-as-grp-g .nm:hover { background: var(--pv-bg); }
.pv-as-grp-g .c { font-style: normal; color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-as-grp-g .el-input { grid-column: 1 / -1; }
.pv-as-grp-g .el-input + .c, .pv-as-grp-g .el-input ~ .pv-task-op { display: none; }
@media (max-width: 640px) { .pv-as-grp-row { grid-template-columns: minmax(0, 1fr) 140px; } }

/* 项目打卡 · 导出打卡图（1.0.197，用户 2026-10-24） */
.pv-ckx-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-ckx-pick.el-date-editor { width: 160px; }
.pv-ckx-pick.wide.el-date-editor { width: 240px; }
.pv-ckx-prev { min-height: 240px; display: flex; align-items: center; justify-content: center; background: var(--pv-bg); border-radius: 8px; padding: 12px; }
.pv-ckx-prev img { display: block; max-width: 100%; max-height: 60vh; border-radius: 6px; box-shadow: 0 1px 4px rgba(0,0,0,.08); }
.pv-ckx-empty { color: var(--pv-text-faint); font-size: 13px; }
.pv-ckx-tip { float: left; line-height: 32px; font-size: 12px; color: var(--pv-text-faint); }
@media (max-width: 640px) { .pv-ckx-dlg { width: calc(100vw - 32px) !important; } .pv-ckx-tip { display: none; } }

/* —— 超级管理员后台 › AI 用量（2026-10-24 重做：按时间段 / 功能模块 / 租户拆着看） —— */
.pv-aiu { min-width: 0; }
.pv-aiu-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-aiu-bar .pv-pmo-seg { flex-wrap: wrap; }
.pv-aiu-bar .pv-pmo-seg button { white-space: nowrap; flex-shrink: 0; }
.pv-aiu-pick.el-date-editor { width: 230px; }
.pv-aiu-house { width: 150px; }
.pv-aiu-active { margin: -4px 0 12px; }
.pv-aiu-chip {
  display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 10px; white-space: nowrap;
  border-radius: 12px; background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: 12px; line-height: 24px;
}
.pv-aiu-chip i { cursor: pointer; }
.pv-aiu-kpis { margin-bottom: 18px; }
.pv-aiu-kpis .pv-fin-kpi { display: flex; flex-direction: column; }
.pv-aiu-kpis .pv-fin-kpi .s { margin-top: auto; padding-top: 2px; font-size: 12px; }
.pv-aiu-sec { font-size: 13px; font-weight: 700; color: var(--pv-text); margin: 18px 0 8px; }
.pv-aiu-trend { display: flex; align-items: flex-end; gap: 3px; height: 150px; padding: 6px 0 0; border-bottom: 1px solid var(--pv-border); }
.pv-aiu-trend .col { flex: 1; min-width: 0; height: 100%; display: flex; flex-direction: column; }
.pv-aiu-trend .bar-wrap { flex: 1; display: flex; align-items: flex-end; justify-content: center; }
.pv-aiu-trend .bar { width: 70%; max-width: 22px; min-height: 1px; border-radius: 3px 3px 0 0; background: var(--pv-primary); }
.pv-aiu-trend .col:hover .bar { background: var(--pv-primary-dark); }
.pv-aiu-trend .lb { height: 18px; font-size: 11px; line-height: 18px; color: var(--pv-text-faint); text-align: center; white-space: nowrap; overflow: visible; }
.pv-aiu-cols { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 24px; }
.pv-aiu-row { display: flex; align-items: center; gap: 8px; height: 32px; padding: 0 8px; border-radius: 6px; font-size: 13px; line-height: 18px; }
.pv-aiu-row.clickable { cursor: pointer; }
.pv-aiu-row.clickable:hover { background: var(--pv-bg); }
.pv-aiu-row.on { background: var(--pv-primary-soft); }
.pv-aiu-row.dim { opacity: .45; }
.pv-aiu-row .nm { width: 96px; flex-shrink: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-aiu-row .track { flex: 1; height: 8px; border-radius: 4px; background: var(--pv-bg); overflow: hidden; }
.pv-aiu-row .fill { display: block; height: 100%; border-radius: 4px; background: var(--pv-primary); }
.pv-aiu-row .num { width: 64px; text-align: right; flex-shrink: 0; font-variant-numeric: tabular-nums; }
.pv-aiu-row .pc { width: 36px; text-align: right; flex-shrink: 0; color: var(--pv-text-faint); font-size: 12px; }
@media (max-width: 768px) {
  .pv-aiu-cols { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .pv-aiu-house { width: 120px; }
  .pv-aiu-trend { height: 110px; }
}

/* —— 家庭管理后台 › AI 接入（2026-10-24） —— */
.pv-aic { max-width: 720px; }
.pv-aic-row { display: flex; align-items: center; gap: 16px; min-height: 34px; margin-bottom: 12px; }
.pv-aic-k { width: 72px; flex-shrink: 0; font-size: 13px; line-height: 20px; color: var(--pv-text-soft); white-space: nowrap; }
.pv-aic-v { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.pv-aic-note { font-size: 12px; line-height: 20px; color: var(--pv-text-faint); }
.pv-aic-key { font-size: 13px; line-height: 20px; font-variant-numeric: tabular-nums; }
@media (max-width: 768px) {
  .pv-aic-row { flex-direction: column; align-items: stretch; gap: 6px; }
  .pv-aic-k:empty { display: none; }
}

/* ---------- 邀请链接（家庭管理后台 › 用户管理 下面，2026-10-25） ---------- */
.pv-inv-list { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; margin-top: 10px; }
.pv-inv-row { align-self: stretch; display: flex; align-items: center; gap: 10px; min-height: 36px; padding: 0 4px; border-bottom: 1px solid var(--pv-border, #ececec); font-size: 13px; line-height: 20px; }
.pv-inv-row .el-tag { flex-shrink: 0; }
.pv-inv-tail { flex-shrink: 0; white-space: nowrap; font-weight: 600; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-inv-meta { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text-faint); font-size: 12px; }
.pv-inv-hint { margin: 0 0 10px; font-size: 13px; line-height: 20px; color: var(--pv-text-soft); }
.pv-inv-link { display: flex; gap: 8px; }
.pv-inv-link .el-button { flex-shrink: 0; }

/* 餐厅：想吃 / 吃过（2026-10-25） */
.pv-rest-want { flex: none; white-space: nowrap; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; padding: 0 9px; border-radius: var(--pv-radius-pill); background: #FDEDE8; color: #C2502F; }
.pv-rest-card.want { border-style: dashed; }
.pv-rest-rate { display: flex; align-items: center; gap: 8px; margin-top: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); }
.pv-rest-rate span { white-space: nowrap; flex-shrink: 0; }
.pv-rest-rate .el-rate { height: 20px; line-height: 20px; }
.pv-rest-rate .el-rate__icon { font-size: 16px; margin-right: 3px; }

/* 日程页「小违和」页签（用户 2026-10-25）：几个人的身体记录上下排，人名一行小标题，不另套框 */
.pv-cal-body-sec + .pv-cal-body-sec { margin-top: 28px; }
/* 钉到首页的项目板块（用户 2026-10-26，轻量版）：项目页板块标题旁一颗小字钮，日程页顶上一颗页签 + 面板头 */
.pv-pmo-pin { margin-left: 2px; }
.pv-pmo-pinbtn { display: inline-flex; align-items: center; gap: 4px; height: 22px; padding: 0 7px; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); font: inherit; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 22px; cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-pmo-pinbtn:hover { color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-pmo-pinbtn.on { color: var(--pv-primary-dark); background: var(--pv-primary-soft); }
.pv-cal-pin-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.pv-cal-pin-head .pv-cal-body-t { margin: 0; flex: 1; min-width: 0; }
.pv-cal-pin-head .pv-pmo-log-act { white-space: nowrap; }
.pv-cal-body-t { font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 700; margin: 0 0 10px; color: var(--pv-text); }
/* 身体健康页（用户 2026-10-28）：项目名 + 没好的个数 + 「在项目里打开」一行 */
.pv-bh-tabs { margin-bottom: 12px; }
.pv-bh-pmo .pv-work-top { margin-bottom: 8px; }
.pv-bh-pmo .pv-pmo-layout { min-height: 70vh; }      /* 嵌在空间页里没有外层的高度可撑，给项目树一个底 */
.pv-bh-t { display: flex; align-items: center; gap: 8px; }
.pv-bh-n { height: 18px; min-width: 18px; padding: 0 6px; border-radius: 9px; background: var(--pv-danger-soft); color: var(--pv-danger); font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 18px; text-align: center; font-weight: 700; }
.pv-bh-t .pv-pmo-log-act { margin-left: auto; font-weight: 400; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }

/* Next 里明天就过生日的那条圈出来（用户 2026-10-26） */
.pv-cal-next.hot { box-shadow: 0 0 0 1.5px var(--pv-primary); background: var(--pv-primary-soft); padding: 4px 8px 4px 4px; margin: -4px 0; border-radius: 10px; }
.pv-cal-next.hot .pv-cal-next-tile { background: var(--pv-primary); color: #fff; }
.pv-cal-next.hot .t { font-weight: 700; }

/* ============================================================
   搜索框规范 v1（docs/SEARCH_BOX.md，用户 2026-10-26「搜索框样式太不统一了」）
   页面里筛列表用的搜索框全站只有一副长相：<el-input size="small" clearable prefix-icon="el-icon-search" class="pv-search">
   30 高（手机 34）/ 13 字 / 圆角 8 / 1px 实线边 / 左边放大镜 / 右边清除叉 / 宽 240；.grow 撑满这一行剩下的，.block 整宽。
   同一排的东西比它矮（26 的筛选片、28 的分段）就在那一排上设 --pv-search-h，别的一概不改。
   ⌘K 那条 Spotlight（.pv-work-search / .pv-gsearch）和中继区「全库搜索」（带查询按钮）不是这个，各走各的。
   ============================================================ */
.pv-search { width: 240px; flex: 0 0 auto; }
.pv-search.grow { width: auto; flex: 1 1 160px; min-width: 140px; max-width: 360px; }
.pv-search.block { width: 100%; flex: 1 1 100%; max-width: none; }
.pv-search .el-input__inner {
  height: var(--pv-search-h, 30px); line-height: var(--pv-search-h, 30px); box-sizing: border-box;
  padding-left: 30px; padding-right: 28px;
  font-size: calc(13px + var(--pv-fz-add, 0px)); border-radius: 8px;
  border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text);
}
.pv-search .el-input__inner:focus { border-color: var(--pv-primary); }
.pv-search .el-input__inner::placeholder { color: var(--pv-text-faint); }
.pv-search .el-input__prefix { left: 10px; display: flex; align-items: center; color: var(--pv-text-faint); }
.pv-search .el-input__suffix { right: 6px; display: flex; align-items: center; }
.pv-search .el-input__icon { line-height: 1; width: auto; font-size: calc(14px + var(--pv-fz-add, 0px)); }
.pv-search .el-input__prefix .el-input__icon { color: var(--pv-text-faint); }
@media (max-width: 640px) {
  .pv-search, .pv-search.grow, .pv-search.block { width: 100%; flex: 1 1 100%; max-width: none; min-width: 0; margin-left: 0; }
  .pv-search .el-input__inner { height: var(--pv-search-h-m, 34px); line-height: var(--pv-search-h-m, 34px); }
}

/* ============================================================
   消费登记 / 配置 / 消费分析按月关注 改版（用户 2026-10-27 给的改版稿 2a / 2b / 2c / 1b）
   通用规矩：页面页签 34 高 14 字；内容里的分段 30–34 高 13.5 字（都用 .pv-pmo-seg 那种连体描边）；
   主按钮 34–36 高、行内按钮 32 高、弱操作 28 高；正文 14、次要 13、全页最小 12；金额一律 tabular-nums 右对齐；
   展开区离上面的行头 4px（卡片式）或 12px（列表式）、离下一行 16–18px、左边缩进到和行首文字对齐。颜色只用 token。
   ============================================================ */
/* —— 2a 消费登记标题行：辅助识别页签的未处理数角标 + 右端「分类与规则」弱按钮 —— */
.pv-fin-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; margin-left: 6px; border-radius: 9px; background: var(--pv-unread); color: #fff; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700; line-height: 1; box-sizing: border-box; }
.pv-fin-cfglink { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 12px; border: 0; border-radius: 9px; background: none; color: var(--pv-text-soft); font-family: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-fin-cfglink:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-fin-cfglink i { font-size: 15px; }
@media (max-width: 640px) { .pv-fin-cfglink { height: 36px; padding: 0 8px; } .pv-fin-cfglink span { display: none; } }

/* —— 2c 配置：左侧分组小导航 + 右内容 —— */
.pv-fin-cfg { display: flex; gap: 24px; align-items: flex-start; }
.pv-fin-cfgnav { width: 168px; flex: none; display: flex; flex-direction: column; }
.pv-fin-cfgnav .grp { display: flex; flex-direction: column; gap: 4px; padding-bottom: 14px; }
.pv-fin-cfgnav .gt { font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); padding: 0 12px 4px; white-space: nowrap; }
.pv-fin-cfgnav button { display: flex; align-items: center; justify-content: space-between; gap: 8px; height: 38px; padding: 0 12px; border: 0; border-radius: 9px; background: none; color: var(--pv-text); font-family: inherit; font-size: calc(14px + var(--pv-fz-add2, 0px)); text-align: left; cursor: pointer; white-space: nowrap; }
.pv-fin-cfgnav button:hover { background: var(--pv-bg); }
.pv-fin-cfgnav button.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-fin-cfgnav button .n { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-fin-cfgmain { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.pv-fin-cfghead { display: flex; align-items: center; gap: 12px; min-height: 24px; }
.pv-fin-cfghead b { font-size: calc(17px + var(--pv-fz-add2, 0px)); font-weight: 700; line-height: 24px; white-space: nowrap; }
.pv-fin-cfghead span { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 24px; color: var(--pv-text-faint); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 640px) {
  .pv-fin-cfg { flex-direction: column; gap: 12px; }
  .pv-fin-cfgnav { width: 100%; flex-direction: row; gap: 6px; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
  .pv-fin-cfgnav::-webkit-scrollbar { display: none; }
  .pv-fin-cfgnav .grp { flex-direction: row; gap: 6px; padding: 0; }
  .pv-fin-cfgnav .gt, .pv-fin-cfgnav button .n, .pv-fin-cfghead span { display: none; }
  .pv-fin-cfgnav button { height: 34px; padding: 0 12px; border: 1px solid var(--pv-border); flex: none; }
  .pv-fin-cfgnav button.on { border-color: var(--pv-primary-soft); }
}

/* —— 2b 月度对账 = 这个月的工作台（spend-months.js）—— */
.pv-wb { display: flex; flex-direction: column; gap: 20px; }
/* 月份条：横排胶囊；勾圈 = 本月已登记（绿实心）/ 账户全对完没勾（绿边空心）/ 否则灰边 */
.pv-wb-months { display: flex; flex-wrap: wrap; gap: 8px; }
.pv-wb-mo { display: inline-flex; align-items: center; gap: 8px; height: 38px; padding: 0 14px 0 10px; border: 1px solid var(--pv-border); border-radius: 10px; background: var(--pv-surface); color: var(--pv-text); font-family: inherit; font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 500; cursor: pointer; white-space: nowrap; transition: border-color .12s, box-shadow .12s; }
.pv-wb-mo:hover { border-color: var(--pv-primary); }
.pv-wb-mo.on { border-color: var(--pv-primary); box-shadow: inset 0 0 0 1.5px var(--pv-primary); font-weight: 700; }
.pv-wb-mo.all { background: var(--pv-success-soft); border-color: var(--pv-success-border); }
.pv-wb-mo.all:hover, .pv-wb-mo.all.on { border-color: var(--pv-success); }
.pv-wb-mo.all.on { box-shadow: inset 0 0 0 1.5px var(--pv-success); }
.pv-wb-mo.empty { opacity: .55; }
.pv-wb-mo .ck { width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid var(--pv-border); background: var(--pv-surface); color: #fff; font-size: 11px; font-weight: 800; line-height: 1; display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; flex: none; }
.pv-wb-mo .ck.can { border-color: var(--pv-success); cursor: pointer; }
.pv-wb-mo .ck.can:hover { background: var(--pv-success-soft); }
.pv-wb-mo .ck.reg { border-color: var(--pv-success); background: var(--pv-success); cursor: pointer; }
.pv-wb-mo .ck.ghost { cursor: not-allowed; }
.pv-wb-mo .prog { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-wb-mo.all .prog { color: var(--pv-success-text); }
/* 月份标题行：左「2026 年 9 月」+ 状态一句，右「勾成本月已登记」 */
.pv-wb-head { display: flex; align-items: flex-end; gap: 16px; flex-wrap: wrap; }
.pv-wb-head .t { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.pv-wb-head h4 { margin: 0; font-size: calc(22px + var(--pv-fz-add2, 0px)); font-weight: 700; line-height: 1.2; }
.pv-wb-head .sub { font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
/* 卡（用户 2026-10-27 调过顺序）：逐个账户对 / 本月入账；待归类有才出第三张（能点，在下面展开） */
.pv-wb-steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; }
/* 本月支出 / 收入两张（用户 2026-10-27）：截止目前的合计；说明行「较上月 ▲12%」灰字，表现好的那个箭头 + 百分比才绿 */
.pv-wb-step.kpi .v.inc { color: var(--pv-success-text); }
.pv-wb-step .d b { font-weight: 600; color: inherit; font-variant-numeric: tabular-nums; }
.pv-wb-step .d b.good { color: var(--pv-success-text); }
.pv-wb-step { display: flex; flex-direction: column; gap: 6px; padding: 16px 18px; border: 1px solid var(--pv-border); border-radius: var(--pv-card-r); background: var(--pv-surface); text-align: left; min-width: 0; transition: border-color .12s; }
.pv-wb-step.act { cursor: pointer; }
.pv-wb-step.act:hover { border-color: var(--pv-primary); }   /* 只有能点的那张（待归类）悬停描主色边；别的卡没交互，不描 */
.pv-wb-step.warn.act { background: color-mix(in srgb, var(--pv-warning-soft) 40%, var(--pv-surface)); border-color: var(--pv-warning-border); }
.pv-wb-step.warn.act.open { border-color: var(--pv-primary); box-shadow: inset 0 0 0 1.5px var(--pv-primary); }
.pv-wb-step.ok { background: color-mix(in srgb, var(--pv-success-soft) 55%, var(--pv-surface)); border-color: var(--pv-success-border); }
.pv-wb-step.ok:hover { border-color: var(--pv-success); }
.pv-wb-step .hd { display: flex; align-items: center; gap: 10px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
/* 圈：没做完是空圈，做完了绿实心 ✓，待归类那张橙实心 ! */
.pv-wb-step .no { width: 22px; height: 22px; border-radius: 50%; border: 1.5px solid var(--pv-border); background: var(--pv-surface); box-sizing: border-box; font-size: 12px; font-weight: 800; line-height: 1; color: #fff; display: inline-flex; align-items: center; justify-content: center; flex: none; }
.pv-wb-step .no.ok { background: var(--pv-success); border-color: var(--pv-success); }
.pv-wb-step .no.warn { background: var(--pv-primary); border-color: var(--pv-primary); }
.pv-wb-step .v { font-size: calc(20px + var(--pv-fz-add2, 0px)); font-weight: 700; font-variant-numeric: tabular-nums; color: var(--pv-text); line-height: 1.2; }
.pv-wb-step.warn.act .v { color: var(--pv-warning-text); }
.pv-wb-step.ok .v { color: var(--pv-success-text); }
.pv-wb-step .d { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 待归类面板（只在 ② 展开时出现） */
.pv-wb-uncat { display: flex; flex-direction: column; padding: 18px 20px 8px; border: 1px solid var(--pv-warning-border); border-radius: var(--pv-card-r); background: color-mix(in srgb, var(--pv-warning-soft) 30%, var(--pv-surface)); }
.pv-wb-uncat .hd, .pv-wb-accs .hd { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.pv-wb-uncat .hd { padding-bottom: 12px; }
.pv-wb-uncat .hd b, .pv-wb-accs .hd b { font-size: calc(16px + var(--pv-fz-add2, 0px)); font-weight: 600; white-space: nowrap; }
.pv-wb-uncat .hd .sub, .pv-wb-accs .hd .sub { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); flex: 1; min-width: 0; }
.pv-wb-uncat .hd a { font-size: calc(13px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-wb-uncat .row { display: grid; grid-template-columns: 76px minmax(0, 1.4fr) 120px 84px auto auto; align-items: center; gap: 14px; min-height: 52px; border-top: 1px solid var(--pv-warning-border); }
.pv-wb-uncat .row.busy { opacity: .6; }
.pv-wb-uncat .row .d { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-wb-uncat .row .raw { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: calc(13px + var(--pv-fz-add, 0px)); min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-wb-uncat .row .acc { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-wb-uncat .row .v { font-size: calc(14px + var(--pv-fz-add, 0px)); text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-wb-uncat .row .forever { display: inline-flex; align-items: center; gap: 6px; min-width: 92px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; }
.pv-wb-uncat .row .forever input { accent-color: var(--pv-primary); width: 15px; height: 15px; margin: 0; }
.pv-wb-uncat .row .ops { display: inline-flex; align-items: center; gap: 8px; }
.pv-wb-catsel { width: 200px; }
.pv-wb-catsel .el-input__inner { height: 32px; line-height: 32px; border-radius: 9px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-wb-catsel .el-input__icon { line-height: 32px; }
.pv-wb-go { height: 32px; padding: 0 14px; border: 0; border-radius: 9px; background: var(--pv-primary); color: #fff; font-family: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-wb-go:hover { background: var(--pv-primary-dark); }
.pv-wb-go:disabled { opacity: .6; cursor: default; }
.pv-wb-uncat .row.empty { display: flex; font-size: calc(14px + var(--pv-fz-add, 0px)); color: var(--pv-success-text); }
/* 逐个账户对：一个账户一张卡，收起时透明边；点整行展开当月流水 */
.pv-wb-accs { display: flex; flex-direction: column; gap: 6px; }
.pv-wb-accs .hd { padding: 0 4px 6px; }
.pv-wb-acc { display: flex; flex-direction: column; border: 1px solid transparent; border-radius: 12px; background: var(--pv-surface); }
/* 一行是 flex 不是 grid：对账单日期那枚签有的行有、有的行没有，用 grid 留着空轨道会把右边两颗钮顶歪 */
.pv-wb-acc .rowh { display: flex; align-items: center; gap: 16px; min-height: 44px; padding: 0 14px 0 16px; border-radius: 12px; cursor: pointer; }   /* 54 → 44（用户 2026-10-27：太高，收窄两成） */
.pv-wb-acc .rowh:hover { background: var(--pv-bg); }
.pv-wb-acc .name { flex: 0 0 220px; display: flex; align-items: center; gap: 8px; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text); min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-wb-acc .name .pv-ct-tag { height: 20px; line-height: 20px; padding: 0 7px; border-radius: 6px; font-weight: 600; }
.pv-wb-acc.done .name, .pv-wb-acc.wait .name { color: var(--pv-text-soft); }
.pv-wb-acc .info { flex: 1 1 0; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-wb-acc .stmt { flex: none; display: inline-flex; align-items: center; height: 24px; padding: 0 9px; border-radius: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); background: var(--pv-bg); color: var(--pv-text-faint); white-space: nowrap; }
.pv-wb-acc .stmt.out { background: var(--pv-success-soft); color: var(--pv-success-text); }
/* 标记完成：绿色描边（用户 2026-10-27：勾了就是完成，不该是红的）；对账单没出 / 已登记的「撤销」灰 */
.pv-wb-mark, .pv-wb-see { min-width: 88px; height: 32px; padding: 0 14px; border: 1px solid var(--pv-success-border); border-radius: 9px; background: var(--pv-surface); color: var(--pv-success-text); font-family: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-wb-mark:hover { background: var(--pv-success-soft); border-color: var(--pv-success); }
/* 「看流水」跟「标记完成」同排同尺寸（用户 2026-10-27：原来是文字链接，对不齐），次要的只换灰边灰字 */
.pv-wb-see { border-color: var(--pv-border); color: var(--pv-text-soft); font-weight: 500; }
.pv-wb-see:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-wb-mark.wait, .pv-wb-mark.undo { border-color: var(--pv-border); color: var(--pv-text-faint); }
.pv-wb-mark.wait:hover, .pv-wb-mark.undo:hover { background: var(--pv-bg); border-color: var(--pv-border); color: var(--pv-text); }
.pv-wb-mark:disabled { opacity: .5; cursor: default; }
/* 账户流水弹窗：套消费分析下钻弹窗那副壳；类别 / 子类各一列、能换行，不再挤成一列省略 */
.pv-wb-modal .pv-fd-modal-card { max-width: 980px; }
.pv-fd-modal-head .sum { flex: none; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-fd-modal-head .sum em { font-style: normal; color: var(--pv-warning-text); }
.pv-fd-modal-foot { display: flex; align-items: center; gap: 12px; padding: 10px 16px; border-top: 1px solid var(--pv-border); }
.pv-fd-modal-foot .sp { flex: 1; }
.pv-fd-modal-foot a { font-size: calc(13px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-wb-tx td { padding: 8px 8px; vertical-align: middle; }
.pv-wb-tx .c { white-space: normal; min-width: 90px; }
.pv-wb-tx .c.un { color: var(--pv-warning-text); }
.pv-wb-tx .n { max-width: 220px; }
.pv-wb-tx .m { max-width: 180px; }
/* 手机：全站账目表那条规则藏的是第 3 / 5 列（账户 / 备注）；这张表第 3 列是类别要留着，藏子类（4）和备注（5） */
@media (max-width: 640px) {
  .pv-fd-modal-head .sum { display: none; }
  .pv-wb-tx th:nth-child(3) { display: table-cell; }
  .pv-wb-tx th:nth-child(4), .pv-wb-tx td:nth-child(4), .pv-wb-tx th:nth-child(5), .pv-wb-tx td:nth-child(5) { display: none; }
  .pv-wb-tx td, .pv-wb-tx th { padding: 8px 6px; }
  .pv-wb-tx .n { max-width: 130px; }
  .pv-wb-tx .c { min-width: 0; }
}
@media (max-width: 640px) {
  .pv-wb { gap: 16px; }
  .pv-wb-mo { height: 36px; padding: 0 12px 0 9px; }
  .pv-wb-head h4 { font-size: calc(19px + var(--pv-fz-add2, 0px)); }
  .pv-wb-steps { grid-template-columns: 1fr; gap: 8px; }
  .pv-wb-step { flex-direction: row; align-items: center; gap: 10px; padding: 12px 14px; }
  .pv-wb-step .hd { flex: 1; min-width: 0; }
  .pv-wb-step .v { font-size: calc(16px + var(--pv-fz-add2, 0px)); }
  .pv-wb-step .d { display: none; }
  .pv-wb-step.kpi { flex-wrap: wrap; row-gap: 2px; }
  .pv-wb-step.kpi .hd { flex: 1 1 auto; }
  .pv-wb-step.kpi .v { flex: none; }
  .pv-wb-step.kpi .d { display: block; flex: 1 1 100%; font-size: calc(12px + var(--pv-fz-add, 0px)); }
  .pv-wb-uncat { padding: 14px 12px 4px; }
  .pv-wb-uncat .hd .sub { display: none; }
  .pv-wb-uncat .row { display: flex; flex-wrap: wrap; gap: 8px 12px; padding: 10px 0; }
  .pv-wb-uncat .row .raw { flex: 1 1 100%; order: -1; }
  .pv-wb-uncat .row .acc { display: none; }
  .pv-wb-uncat .row .ops { flex: 1 1 100%; }
  .pv-wb-catsel { flex: 1; min-width: 0; width: auto; }
  .pv-wb-accs .hd .sub { display: none; }
  .pv-wb-acc .rowh { flex-wrap: wrap; gap: 2px 10px; padding: 8px 10px 8px 12px; min-height: 0; }
  .pv-wb-acc .name { flex: 1 1 0; order: 0; }
  .pv-wb-acc .pv-wb-mark { order: 1; min-width: 0; height: 30px; padding: 0 10px; }
  .pv-wb-acc .info { flex: 1 1 100%; order: 2; white-space: normal; }
  .pv-wb-acc .stmt, .pv-wb-acc .pv-wb-see { display: none; }
}

/* —— 消费明细：从月度对账「在消费明细里打开」过来的筛选片（账户 · 月份，✕ 去掉） —— */
.pv-sg-filt { display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 6px 0 10px; border-radius: 8px; background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-size: calc(13px + var(--pv-fz-add, 0px)); white-space: nowrap; flex-shrink: 0; }
.pv-sg-filt button { width: 20px; height: 20px; border: 0; border-radius: 5px; background: none; color: inherit; font-size: 12px; line-height: 1; cursor: pointer; }
.pv-sg-filt button:hover { background: rgba(25, 27, 35, .08); }

/* —— 1b 消费分析 › 按月关注 —— */
.pv-fd .panel-title { font-size: calc(16px + var(--pv-fz-add2, 0px)); font-weight: 600; }
.pv-fd .panel-sub { font-size: calc(13px + var(--pv-fz-add, 0px)); }
/* 选月：一句话「看 ‹ 月 › 跟 … 比」，底下一排 12 个月份格（橙 = 焦点月、浅橙 = 基准） */
.pv-fd-mf { display: flex; flex-direction: column; gap: 12px; padding: 16px 18px; border-radius: var(--pv-card-r); background: var(--pv-bg); margin-bottom: 16px; }
.pv-fd-mf-row { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.pv-fd-mf-row .w { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-fd-mf-step { display: inline-flex; align-items: center; height: 34px; border: 1px solid var(--pv-border); border-radius: 9px; background: var(--pv-surface); overflow: hidden; }
.pv-fd-mf-step button { width: 34px; height: 34px; border: 0; background: none; color: var(--pv-text-soft); font-size: 16px; line-height: 1; cursor: pointer; }
.pv-fd-mf-step button:hover { background: var(--pv-bg); }
.pv-fd-mf-step button:disabled { color: var(--pv-border); cursor: default; background: none; }
.pv-fd-mf-step span { padding: 0 12px; font-size: calc(14.5px + var(--pv-fz-add2, 0px)); font-weight: 700; line-height: 34px; border-left: 1px solid var(--pv-border); border-right: 1px solid var(--pv-border); white-space: nowrap; }
.pv-fd .pv-pmo-seg.pv-fd-cmp { border-radius: 9px; background: var(--pv-surface); }
.pv-fd .pv-fd-cmp button { height: 34px; padding: 0 14px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-fd .pv-fd-cmp button.on { color: var(--pv-primary-dark); }
.pv-fd .pv-fd-cmp button:disabled { color: var(--pv-text-faint); opacity: .55; cursor: not-allowed; background: var(--pv-surface); }
.pv-fd-mf-strip { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 6px; }
.pv-fd-mf-strip .cell { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 7px 0 6px; border: 1px solid var(--pv-border); border-radius: 9px; background: var(--pv-surface); font-family: inherit; cursor: pointer; min-width: 0; }
.pv-fd-mf-strip .cell .l { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-fd-mf-strip .cell .e { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; font-family: ui-monospace, "SF Mono", Menlo, monospace; white-space: nowrap; }
.pv-fd-mf-strip .cell:hover { border-color: var(--pv-primary); }
.pv-fd-mf-strip .cell.base { background: var(--pv-primary-soft); border-color: var(--pv-primary-soft); }
.pv-fd-mf-strip .cell.base .l, .pv-fd-mf-strip .cell.base .e { color: var(--pv-primary-dark); font-weight: 700; }
.pv-fd-mf-strip .cell.focus { background: var(--pv-primary); border-color: var(--pv-primary); }
.pv-fd-mf-strip .cell.focus .l, .pv-fd-mf-strip .cell.focus .e { color: #fff; font-weight: 700; }
.pv-fd-mf-strip .cell.empty { opacity: .55; }
/* 对比 KPI：焦点月支出 / 基准 / 多花或少花（按正负上底色）+ 收入卡 */
.pv-fd .pv-fd-cmpk { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.pv-fd .pv-fd-cmpk .pv-fin-kpi .v { font-size: 26px; font-variant-numeric: tabular-nums; letter-spacing: -.01em; }
.pv-fd .pv-fd-cmpd.up { background: var(--pv-danger-soft); border-color: var(--pv-danger-border); }
.pv-fd .pv-fd-cmpd.up .v, .pv-fd .pv-fd-cmpd.up .s { color: var(--pv-danger-text); }
.pv-fd .pv-fd-cmpd.down { background: var(--pv-success-soft); border-color: var(--pv-success-border); }
.pv-fd .pv-fd-cmpd.down .v, .pv-fd .pv-fd-cmpd.down .s { color: var(--pv-success-text); }
/* 差额归因：零线为中轴的左右条，点一行就地展开账目 */
.pv-fd-legend { display: flex; gap: 12px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-fd-legend span { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.pv-fd-legend i { width: 10px; height: 10px; border-radius: 3px; }
.pv-fd-legend i.up { background: var(--pv-danger); }
.pv-fd-legend i.down { background: var(--pv-success); }
.pv-fd-attr, .pv-fd-var { display: flex; flex-direction: column; }
.pv-fd-arow, .pv-fd-vwrap { display: flex; flex-direction: column; border-top: 1px solid var(--pv-bg); }
.pv-fd-arow > .h { display: grid; grid-template-columns: 20px minmax(96px, 150px) minmax(0, 1fr) minmax(0, 1fr) minmax(90px, 140px) 96px; align-items: center; gap: 10px; min-height: 44px; padding: 0 8px; border-radius: 9px; cursor: pointer; }   /* 2026-10-29：条和差额之间多一列绝对数 */
.pv-fd-arow > .h > .abs { display: flex; flex-direction: column; align-items: flex-end; line-height: 16px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-fd-arow > .h > .abs b { font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); }
.pv-fd-arow > .h > .abs em { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (max-width: 640px) { .pv-fd-arow > .h > .abs { display: none; } }
.pv-fd-arow > .h:hover, .pv-fd-arow.open > .h { background: var(--pv-bg); }
.pv-fd-arow > .h > .tri, .pv-fd-vwrap > .h > .tri { width: 20px; height: 20px; border-radius: 6px; background: var(--pv-bg); color: var(--pv-text-soft); font-size: 12px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; flex: none; }
.pv-fd-arow.open > .h > .tri, .pv-fd-vwrap.open > .h > .tri { background: var(--pv-border); }
.pv-fd-arow > .h > .tri i, .pv-fd-vwrap > .h > .tri i { font-size: 12px; font-weight: 700; transition: transform .15s; }
.pv-fd-arow.open > .h > .tri i, .pv-fd-vwrap.open > .h > .tri i { transform: rotate(90deg); }
.pv-fd-arow > .h > .n { font-size: calc(14px + var(--pv-fz-add2, 0px)); min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-fd-arow > .h > .bl { display: flex; justify-content: flex-end; height: 14px; }
.pv-fd-arow > .h > .bl i { display: block; height: 14px; border-radius: 4px 0 0 4px; background: var(--pv-success); }
.pv-fd-arow > .h > .br { display: flex; height: 14px; border-left: 1px solid var(--pv-border); margin-left: -10px; }
.pv-fd-arow > .h > .br i { display: block; height: 14px; border-radius: 0 4px 4px 0; background: var(--pv-danger); }
.pv-fd-arow > .h > .d { text-align: right; font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-fd-arow > .h > .d.up { color: var(--pv-danger-text); }
.pv-fd-arow > .h > .d.down { color: var(--pv-success-text); }
.pv-fd-vwrap > .h { min-height: 44px; }
.pv-fd-vwrap.open > .h { background: var(--pv-bg); }
/* 就地展开的账目块（差额归因 / 对比拆解共用）：上 12 下 18，左边缩进到类别名对齐 */
.pv-fd-inline { margin: 12px 8px 18px 38px; border: 1px solid var(--pv-border); border-radius: 10px; overflow: hidden; background: var(--pv-surface); }
.pv-fd-inline .hd { display: flex; align-items: center; gap: 10px; padding: 9px 14px; background: var(--pv-bg); font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-fd-inline .hd b { color: var(--pv-text); font-weight: 600; white-space: nowrap; }
.pv-fd-inline .hd .sp { flex: 1; }
.pv-fd-inline .hd a { white-space: nowrap; }
.pv-fd-inline .r { display: grid; grid-template-columns: 60px minmax(0, 1fr) 130px minmax(0, 170px) 96px; gap: 12px; align-items: center; height: 38px; padding: 0 14px; border-top: 1px solid var(--pv-bg); font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-fd-inline .r.go { cursor: pointer; }
.pv-fd-inline .r.go:hover { background: var(--pv-primary-soft); }
.pv-fd-inline .r .d { color: var(--pv-text-faint); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-fd-inline .r .m { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-fd-inline .r .a { color: var(--pv-text-soft); font-size: calc(13px + var(--pv-fz-add, 0px)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-fd-inline .r .v { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-fd-inline .r.none { display: flex; color: var(--pv-text-faint); }
@media (max-width: 860px) { .pv-fd .pv-fd-cmpk { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* 手机：选月那句「比」字省掉、对比分段整行横滑；差额归因一行变两行（名字 + 差额在上，左右条在下）；拆解那块藏开合钮、列收窄 */
@media (max-width: 640px) {
  .pv-fd-mf { padding: 12px; }
  .pv-fd-mf-row { gap: 8px 10px; }
  .pv-fd-mf-row .w.bi { display: none; }
  .pv-fd-mf-row .pv-fd-cmp { flex: 1 1 100%; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
  .pv-fd-mf-row .pv-fd-cmp::-webkit-scrollbar { display: none; }
  .pv-fd-mf-row .pv-fd-cmp button { flex: none; }
  .pv-fd-mf-strip { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .pv-fd-arow > .h { grid-template-columns: 20px minmax(0, 1fr) minmax(0, 1fr) 84px; grid-template-areas: "tri n n d" "e bl br e2"; gap: 4px 6px; padding: 8px 6px; min-height: 0; }
  .pv-fd-arow > .h > .tri { grid-area: tri; }
  .pv-fd-arow > .h > .n { grid-area: n; }
  .pv-fd-arow > .h > .d { grid-area: d; }
  .pv-fd-arow > .h > .bl { grid-area: bl; }
  .pv-fd-arow > .h > .br { grid-area: br; margin-left: -6px; }
  .pv-fd-inline { margin: 10px 0 14px; }
  .pv-fd-inline .hd { flex-wrap: wrap; row-gap: 4px; }
  .pv-fd-inline .hd .sp { display: none; }
  .pv-fd-inline .hd a { margin-left: auto; }
  .pv-fd-inline .r { grid-template-columns: 48px minmax(0, 1fr) 84px; padding: 0 10px; }
  .pv-fd-inline .r .a { display: none; }
  .pv-fd-vwrap > .h { gap: 8px; }
  .pv-fd-vwrap > .h > .tri { display: none; }
  .pv-fd-vwrap .vbars { min-width: 90px; }
  .pv-fd-vwrap .vnum { width: 92px; }
}

/* ===== 人页 v2（用户 2026-10-28 第二遍，照交接包稿 3a 1:1；1.0.248）=====
   中间整块铺 #f2f3f6 一直到滚动条，右栏紧挨着；头像一列 / 名字一列 / 动作顶齐名字那一行、30 高灰胶囊；
   三张小结卡两行（k / v + s）；基本信息和共同兴趣并排各占一半、一行 30；
   安排联络一行 = 勾 · 日期块 · 标题 / 月 · 类型 · 时间 · 人 · 评论 · 还有几天，不再有左边那列月份 */
.pv-ct { --pv-ct-canvas: #f6f7fa; --pv-ct-rail: #fbfbfc; --pv-ct-btn: #e6e8ee; --pv-ct-chip: #f0f1f5; --pv-ct-field: #eef0f4; }   /* 稿里的几个灰：中栏底 / 右栏底 / 人页钮和签 / 小签 / 总览钮和输入框（2a） */
.pv-ct-person { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; align-items: start; background: transparent; border-radius: 0; padding: 26px 28px 32px; }
.pv-ct-person > * { grid-column: 1 / -1; min-width: 0; }
.pv-ct-person > .pv-pmo-sec.half { grid-column: auto; }
.pv-ct-person .pv-pmo-sec { margin: 0; padding: 18px 20px; border: 0; border-radius: var(--pv-card-r); }
.pv-ct-person .pv-pmo-sec-head { min-height: 0; margin-bottom: 6px; padding-bottom: 4px; gap: 8px; border-bottom: 0; }
.pv-ct-person .pv-pmo-sec-head h3 { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 22px; }
.pv-ct-person .pv-ct-sec-n { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 22px; }
.pv-ct-person .pv-ct-sec-plans .pv-pmo-sec-head { margin-bottom: 0; padding-bottom: 6px; }
.pv-ct-person .pv-ct-sec-comments .pv-pmo-sec-head { margin-bottom: 12px; }
.pv-ct-person .pv-pmo-sec-head .pv-addbtn { height: 28px; padding: 0 12px 0 10px; border: 0; border-radius: 8px; background: var(--pv-ct-chip); color: var(--pv-text); }
.pv-ct-person .pv-pmo-sec-head .pv-addbtn:hover { background: var(--pv-ct-btn); color: var(--pv-text); }
/* 头部 */
.pv-ct-person .pv-pmo-head { margin: 0; padding: 2px 2px 6px; border-bottom: 0; }
.pv-ct-person .pv-ct-head { gap: 0 16px; align-items: start; }
.pv-ct-person .pv-ct-stack { gap: 4px; }
.pv-ct-person .pv-ct-stack .l1 { min-height: 30px; gap: 8px; }
.pv-ct-person .pv-ct-stack .l1 .pv-pmo-head-name { line-height: 30px; }
.pv-ct-person .pv-ct-stack .l2 { margin-top: 0; }
.pv-ct-person .pv-ct-age { height: auto; padding: 0; border-radius: 0; background: none; color: var(--pv-text-soft); font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 400; line-height: 20px; }
.pv-ct-person .pv-ct-circle { height: 20px; padding: 0 8px; border: 0 !important; border-radius: 5px; background: var(--pv-ct-btn) !important; color: #4a4f60 !important; font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
.pv-ct-person .pv-ct-facts { margin-top: 0; gap: 4px; }
.pv-ct-person .pv-ct-fact { gap: 3px 6px; }
.pv-ct-person .pv-ct-frel { gap: 6px; height: 20px; }
.pv-ct-person .pv-ct-frel .t, .pv-ct-person .pv-ct-frel .n { font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ct-person .pv-ct-frel .n { text-decoration: none; }
.pv-ct-person .pv-ct-frel .pv-ct-face { width: 20px; height: 20px; font-size: 10px; }
.pv-ct-person .pv-ct-head > .pv-ct-acts { align-self: start; height: 30px; gap: 8px; }
.pv-ct-person .pv-ct-acts .pv-pmo-secbtn { height: 30px; padding: 0 13px; border: 0; border-radius: 9px; background: var(--pv-ct-btn); color: var(--pv-text); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-ct-person .pv-ct-acts .pv-pmo-secbtn:hover { background: #dcdfe7; color: var(--pv-text); }
.pv-ct-person .pv-ct-acts .pv-ct-more { width: 32px; padding: 0; font-size: 14px; color: var(--pv-text-soft); }
/* 三张小结卡：k 一行，v 和 s 同一条基线 */
.pv-ct-person .pv-ct-sum { gap: 14px; margin: 0; }
.pv-ct-person .pv-ct-sum-card { display: flex; flex-direction: column; gap: 4px; padding: 14px 18px; }
.pv-ct-person .pv-ct-sum-card .k { margin: 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 18px; }
.pv-ct-sum-card .vs { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.pv-ct-person .pv-ct-sum-card .v { font-size: calc(18px + var(--pv-fz-add, 0px)); line-height: 24px; }
.pv-ct-person .pv-ct-sum-card .s { margin: 0; min-width: 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 18px; }
/* 基本信息：单列、一行 30、标签 76 */
.pv-ct-person .pv-ct-kv { grid-template-columns: minmax(0, 1fr); gap: 6px; }
.pv-ct-person .pv-ct-kv > div { grid-template-columns: 76px minmax(0, 1fr); gap: 12px; min-height: 30px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; border-bottom: 0; }
.pv-ct-person .pv-ct-kv > div > b { font-weight: 400; }
.pv-ct-person .pv-ct-kv a { white-space: nowrap; }
.pv-ct-person .pv-ct-kv-x em { line-height: 20px; }
.pv-ct-person .pv-ct-kv > div.wide > span { line-height: 30px; }
.pv-ct-person .pv-ct-kv > div > b.chips { padding: 3px 0; }
/* 共同兴趣：签 72 一列 · 人 · 还有几人，一行 40 */
/* 行距跟左边「基本信息」一个节奏（用户 2026-10-29：左边行距大、右边小，不统一）：行高 30 起、行间 6；
   兴趣小签和「还有 N 人」钉在第一行人名那条线上（align-items: start + 跟人名行一样的 24 行高），人多换行时不再掉到中间 */
.pv-ct-person .pv-ct-also { gap: 6px; }
/* 用户 2026-10-29：签在上（右边「还有 N 人」）、人在下横着排、放不下折几行。原来签 | 人 | 还有几人 三栏，窄卡上中间那栏只剩一个名字宽，人竖成一列、长名字还压到右边的字上 */
.pv-ct-person .pv-ct-also > div { display: flex; flex-direction: column; gap: 6px; min-height: 0; padding: 6px 0; border-bottom: 0; }
.pv-ct-person .pv-ct-also .hd { display: flex; align-items: center; gap: 10px; }
.pv-ct-person .pv-ct-also .hd .r { line-height: 20px; }   /* 「还有 N 人」紧跟在签后面，当它的小注 */
.pv-ct-person .pv-ct-ichip { justify-self: start; height: 24px; padding: 0 10px; border: 0; border-radius: 12px; background: var(--pv-ct-chip); color: var(--pv-text); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-ct-person .pv-ct-also .who { gap: 4px 12px; }
.pv-ct-person .pv-ct-also .who a { gap: 5px; height: 24px; }
.pv-ct-person .pv-ct-also .r { font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 24px; }
/* 安排联络 */
.pv-ct-person .pv-ct-plan-sect { margin: 0; padding: 4px 0; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); }
.pv-ct-person .pv-ct-plan-sect.past { padding: 12px 0 4px; }
.pv-ct-person .pv-ct-plan-head { display: grid; grid-template-columns: 18px 44px minmax(0, 1fr) auto auto; gap: 12px; align-items: center; min-height: 0; padding: 7px 10px; margin: 0 -10px; border-radius: 10px; }
.pv-ct-person .pv-ct-plan.is-done .pv-ct-plan-head { grid-template-columns: 18px 44px minmax(0, 1fr) auto; padding: 5px 10px; }
.pv-ct-person .pv-ct-plan-check { border-color: #c4c8d2; }
/* 完成的那颗勾走全站的绿（用户 2026-10-30：稿 3a 时把人页这颗压成了灰，看着像没完成）——不再覆盖，用上面 .pv-ct-plan-check.ok 那条 */
.pv-ct-person .pv-ct-plan-d { width: 44px; height: 44px; gap: 1px; border-radius: 10px; background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-ct-person .pv-ct-plan-d b { font-size: calc(16px + var(--pv-fz-add, 0px)); line-height: 1; font-weight: 700; color: inherit; }
.pv-ct-person .pv-ct-plan-d i { font-size: calc(10px + var(--pv-fz-add, 0px)); line-height: 12px; color: inherit; }
.pv-ct-person .pv-ct-plan-d.overdue { background: var(--pv-danger-soft); color: var(--pv-danger); }
.pv-ct-person .pv-ct-plan-d.today { background: var(--pv-primary); color: #fff; }
.pv-ct-person .pv-ct-plan-d.done { height: 34px; border-radius: 9px; background: #f3f4f7; color: var(--pv-text-soft); font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; }
.pv-ct-person .pv-ct-plan-mid { gap: 3px; }
.pv-ct-person .pv-ct-plan.is-done .pv-ct-plan-title { font-size: calc(13.5px + var(--pv-fz-add2, 0px)); font-weight: 400; color: var(--pv-text-soft); }
.pv-ct-plan-meta { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 4px 0; min-width: 0; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ct-plan-meta > * + *::before { content: "·"; margin: 0 6px; color: var(--pv-text-faint); }
.pv-ct-plan-meta .pv-pmo-face { width: 18px; height: 18px; font-size: calc(10px + var(--pv-fz-add, 0px)); }
.pv-ct-plan-side { display: inline-flex; align-items: center; gap: 4px; }
.pv-ct-plan-due { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-primary-dark); white-space: nowrap; text-align: right; }
.pv-ct-plan-due.overdue { color: var(--pv-danger); }
.pv-ct-person .pv-ct-plan-body { padding: 2px 12px 10px 86px; }
.pv-ct-person .pv-ct-plan-note { margin-bottom: 4px; }
.pv-ct-person .pv-ct-plan.today > .pv-ct-plan-head { background: transparent; }   /* 今天靠实心日期块就够了，不再铺一层淡底 */
.pv-ct-person .pv-ct-plan.today > .pv-ct-plan-head:hover { background: var(--pv-bg); }
.pv-ct-plan-more-link { align-self: flex-start; margin: 0; padding: 6px 0 2px; border: 0; background: none; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); cursor: pointer; }
.pv-ct-plan-more-link:hover { color: var(--pv-text); text-decoration: underline; }
.pv-ct-person .pv-ct-tag.x { background: var(--pv-ct-chip); }
/* 评论楼之间、兴趣行之间不画线（楼的线是 .pv-pmo-log 的上边框） */
.pv-ct-person .pv-pmo-log { border-top: 0; margin-top: 0; padding: 8px 0 2px; }
.pv-ct-person .pv-ct-int-row, .pv-ct-person .pv-ct-irow { border-bottom: 0; }
@media (max-width: 860px) {
  .pv-ct-person { grid-template-columns: minmax(0, 1fr); padding: 14px 12px 20px; }
  .pv-ct-person > .pv-pmo-sec.half { grid-column: 1 / -1; }
  .pv-ct-person .pv-pmo-sec { padding: 14px; }
  .pv-ct-person .pv-ct-plan-head { grid-template-columns: 18px 40px minmax(0, 1fr) auto; gap: 10px; }
  .pv-ct-person .pv-ct-plan-due { display: none; }
  .pv-ct-person .pv-ct-plan-d { width: 40px; height: 40px; }
  .pv-ct-person .pv-ct-plan-body { padding-left: 12px; }
  .pv-ct.pv-soc-layout:not(.solo) .pv-work-scroll { border-radius: 12px; }
  .pv-ct .pv-soc-right { border-radius: 12px; padding: 14px 12px; }   /* 手机上右栏是单独一块，四个角都圆 */
}

/* 全出血（用户 2026-10-28 试一版）：模块栏竖线和标题行横线右边 / 下边整块都是底色——灰块贴着竖线、贴着横线、贴到窗口右边和底边，不留白边、不留圆角 */
@media (min-width: 861px) {
  .pv-ct.pv-soc-layout:not(.solo) { padding: 0; }
  .pv-page .pv-ct.pv-soc-layout:not(.solo) { margin-right: calc(-1 * var(--pv-page-pad)); }
  /* 左栏是 <pv-rail>（.pv-mrail）了：全出血把整块的上内边距去掉后，栏顶那 14px 由栏自己补回来——原来写的是老类名 .pv-soc-left，
     换组件后没跟着改，「模块」那行就贴到了横线上（用户 2026-10-29：跟身体健康 / 日记本不对齐） */
  .pv-ct.pv-soc-layout:not(.solo) > .pv-mrail { margin-right: 0; padding-top: 14px; }
  .pv-ct.pv-soc-layout:not(.solo) .pv-work-scroll { border-radius: 0; }
  .pv-ct.pv-soc-layout:not(.solo) .pv-soc-right { border-radius: 0; }
}

/* 日期块里的数字靠左（用户 2026-10-28：9 和 30 该从同一条线起，不要居中）——人页安排行和总览「接下来」的 44 宽小块；「下一件」那张 118 宽的日历页仍居中 */
.pv-ct-person .pv-ct-plan-d { align-items: flex-start; padding-left: 8px; box-sizing: border-box; }
.pv-ct-person .pv-ct-plan-d.done { justify-content: flex-start; }
.pv-ct-ov .pv-ct-daytile { align-items: flex-start; padding-left: 8px; box-sizing: border-box; }
/* 后台模块配置：分组的改名 / 上下 / 删 和行尾「⋯」一直可见（用户 2026-10-28：悬停才出的找不到） */
.pv-mod-group-tools { opacity: .6; }
.pv-mod-row-mv { opacity: .5; }

/* 日历页顶上的「撞了」提示条（用户 2026-10-28）：这一屏里今天起有重叠时段的联络 / 安排，先在最上面说一声 */
.pv-cal-clash-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; margin: 0 0 12px; padding: 8px 12px; border-radius: 10px; background: var(--pv-danger-soft, #FDECEC); }
.pv-cal-clash-bar .k { flex: none; height: 20px; padding: 0 7px; border-radius: 5px; background: var(--pv-danger); color: #fff; font-size: calc(11.5px + var(--pv-fz-add, 0px)); font-weight: 700; display: inline-flex; align-items: center; white-space: nowrap; }
.pv-cal-clash-bar .it { display: inline-flex; align-items: baseline; gap: 6px; min-width: 0; padding: 0; border: 0; background: none; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text); cursor: pointer; }
.pv-cal-clash-bar .it b { color: var(--pv-danger); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-cal-clash-bar .it span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 220px; }
.pv-cal-clash-bar .it em { font-style: normal; color: var(--pv-text-faint); }
.pv-cal-clash-bar .it:hover span { text-decoration: underline; }
.pv-cal-clash-bar .more { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }

/* 中国海运：页内 AI 登记的粘贴框（1.0.254） */
.pv-ship-ai { margin: 0 0 12px; padding: 12px; border-radius: 12px; background: var(--pv-bg); }
.pv-ship-ai-ta { display: block; width: 100%; min-height: 96px; box-sizing: border-box; padding: 10px 12px; border: 0; border-radius: 8px; background: var(--pv-surface); color: var(--pv-text);
                 font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 1.6; resize: vertical; outline: none; }
.pv-ship-ai-ta:focus { box-shadow: 0 0 0 2px var(--pv-primary-soft); }
.pv-ship-ai-ta::placeholder { color: var(--pv-text-faint); }
.pv-ship-ai-foot { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.pv-ship-ai-foot .sp { flex: 1; }

/* ===== 身体健康改版（用户 2026-10-28，交接包「身体健康改版 1a」）：顶栏 + 左栏分组导航 + 右侧自己滚 ===== */
.pv-bh { display: flex; flex-direction: column; min-height: 0; flex: 1 1 auto; }
/* 顶栏撤了（用户 2026-10-29：要跟别的模块页一个样——外面那条标题 + 横线，左栏从「模块」小标题起）；
   两颗动作钮改成全站 .pv-addbtn，放在各自列表的顶上靠左。.pv-bh-topbtn 这几条留给老缓存里的页面 */
.pv-bh-topbtn { height: 34px; padding: 0 14px; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-pill); background: var(--pv-surface); color: var(--pv-text);
                font: inherit; font-size: calc(14px + var(--pv-fz-add2, 0px)); cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-bh-topbtn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-bh-topbtn.primary { border-color: var(--pv-primary); background: var(--pv-primary); color: #fff; font-weight: 600; padding: 0 16px; }
.pv-bh-topbtn.primary:hover { background: var(--pv-primary-dark); border-color: var(--pv-primary-dark); color: #fff; }
.pv-bh-layout { grid-template-columns: auto minmax(0, 1fr); column-gap: 0; min-height: 70vh; padding-top: 14px; }   /* 左栏是 <pv-rail>（默认 212） */   /* 嵌在 /folder 页里没有外层的高度可撑，给个底；线下 14px 跟别的模块页一样 */
.pv-bh-side { min-height: 0; overflow-y: auto; border-right: 1px solid var(--pv-border); padding: 0 16px 14px 0; display: flex; flex-direction: column; }
.pv-bh-nav .pv-snav-n { color: var(--pv-brand-dark); opacity: 1; }
.pv-bh-nav .pv-snav-item.active .pv-snav-n { color: inherit; }
.pv-bh-nav .pv-snav-title.sub { margin: 12px 0 2px; }
.pv-bh-nav .pv-snav-item.more { color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }   /* 「更多 N 人」那条是开关不是页 */
.pv-bh-nav .pv-snav-item.ext .pv-snav-name::after { content: " ↗"; color: var(--pv-text-faint); }                 /* 日常那两条跳项目管理 */
.pv-bh-more { display: flex; align-items: center; gap: 6px; width: 100%; padding: 4px 10px; border: 0; border-radius: 8px; background: none; color: var(--pv-text-faint); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); text-align: left; cursor: pointer; }
.pv-bh-more:hover { color: var(--pv-text); }
.pv-bh-navnote { padding: 2px 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bh-ext { margin-left: auto; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bh-main { padding: 0 10px 28px 28px; display: flex; flex-direction: column; gap: 18px; }
.pv-bh-main > .pv-addrow { margin: 0; }
.pv-bh-main > .pv-addrow > .pv-bh-who { margin-left: auto; }
/* 一行的标题块点了开任务卡（用户 2026-10-29：登记的内容点不开） */
.pv-bh-item.link { cursor: pointer; }
.pv-bh-item.link:hover .l1 b { color: var(--pv-primary-dark); text-decoration: underline; }
.pv-bh-ep-t.link { cursor: pointer; }
.pv-bh-ep-t.link:hover .l1 b { color: var(--pv-primary-dark); text-decoration: underline; }
.pv-bh-head { display: flex; align-items: flex-end; gap: 16px; }
.pv-bh-head-t { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.pv-bh-title { font-size: calc(20px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); }
.pv-bh-sub { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bh-who { display: flex; gap: 4px; padding: 3px; border-radius: var(--pv-radius-pill); background: var(--pv-bg); flex-shrink: 0; }
.pv-bh-who button { border: 0; background: none; border-radius: var(--pv-radius-pill); padding: 5px 12px; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; }
.pv-bh-who button.on { background: var(--pv-surface); color: var(--pv-text); box-shadow: 0 1px 2px rgba(0, 0, 0, .08); }
/* 三档 */
.pv-bh-grp { display: flex; flex-direction: column; gap: 8px; }
.pv-bh-grp-h { display: flex; align-items: center; gap: 8px; padding: 0; border: 0; background: none; font: inherit; text-align: left; cursor: default; }
.pv-bh-grp-h.foldable { cursor: pointer; }
.pv-bh-grp-h b { font-size: calc(14px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); }
.pv-bh-grp-h i { font-style: normal; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-faint); }
.pv-bh-grp-h span, .pv-bh-grp-h em { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bh-box { display: flex; flex-direction: column; border: 1px solid var(--pv-border); border-radius: 12px; overflow: hidden; }
.pv-bh-rowwrap { display: flex; flex-direction: column; border-top: 1px solid #f0f1f5; }
.pv-bh-rowwrap:first-child { border-top: 0; }
.pv-bh-row { display: grid; grid-template-columns: 30px minmax(0, 1fr) 190px 168px; align-items: center; gap: 14px; padding: 12px 16px; }
.pv-bh-face { width: 30px; height: 30px; border-radius: 50%; color: #fff; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; display: inline-flex; align-items: center; justify-content: center; overflow: hidden; }
.pv-bh-face img { width: 100%; height: 100%; object-fit: cover; }
.pv-bh-item { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.pv-bh-item .l1 { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pv-bh-item .l1 b { font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bh-item .l2 { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bh-cat { flex: none; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); background: var(--pv-bg); padding: 1px 8px; border-radius: var(--pv-radius-pill); white-space: nowrap; }
.pv-bh-st { display: flex; flex-direction: column; gap: 3px; align-items: flex-start; min-width: 0; }
.pv-bh-st .pill { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; padding: 3px 10px; border-radius: var(--pv-radius-pill); white-space: nowrap; }
.pv-bh-st .pill.over { background: var(--pv-danger-soft); color: var(--pv-danger-text, #c0151e); }
.pv-bh-st .pill.soon { background: var(--pv-warning-soft); color: var(--pv-warning-text); }
.pv-bh-st .pill.booked { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-bh-st .pill.later { background: var(--pv-bg); color: var(--pv-text-soft); font-weight: 400; }
.pv-bh-st .sub { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); padding-left: 2px; }
.pv-bh-acts { display: flex; gap: 6px; justify-content: flex-end; flex-shrink: 0; }
.pv-bh-btn { height: 30px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-bh-btn:hover:not(:disabled) { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-bh-btn:disabled { opacity: .5; cursor: default; }
.pv-bh-btn.brand { border-color: var(--pv-primary); color: var(--pv-primary-dark); font-weight: 600; padding: 0 14px; }
.pv-bh-btn.brand.solid { background: var(--pv-primary); color: #fff; border-color: var(--pv-primary); }
.pv-bh-btn.brand.solid:hover:not(:disabled) { background: var(--pv-primary-dark); border-color: var(--pv-primary-dark); color: #fff; }
.pv-bh-btn.dark { background: #191b23; border-color: #191b23; color: #fff; padding: 0 12px; }
.pv-bh-btn.dark:hover:not(:disabled) { background: #32353f; border-color: #32353f; color: #fff; }
.pv-bh-btn.ghost { border-color: transparent; background: none; color: var(--pv-text-faint); }
.pv-bh-btn.ghost:hover:not(:disabled) { border-color: transparent; color: var(--pv-text); }
.pv-bh-form { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 0 16px 14px 60px; }
.pv-bh-formhint { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bh-empty { font-size: calc(14px + var(--pv-fz-add2, 0px)); color: var(--pv-text-faint); padding: 24px 0; }
/* 小违和：一个毛病一张卡 */
.pv-bh-eps { display: flex; flex-direction: column; gap: 12px; }
.pv-bh-ep { border: 1px solid var(--pv-border); border-radius: 12px; padding: 16px 18px; display: flex; flex-direction: column; gap: 12px; }
.pv-bh-ep-top { display: flex; align-items: flex-start; gap: 16px; }
.pv-bh-ep-t { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.pv-bh-ep-t .l1 { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pv-bh-ep-t .l1 b { font-size: calc(16px + var(--pv-fz-add2, 0px)); font-weight: 600; color: var(--pv-text); }
.pv-bh-ep-t .l2 { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bh-bars { display: flex; align-items: flex-end; gap: 3px; height: 32px; flex-shrink: 0; }
.pv-bh-bars span { width: 8px; border-radius: 2px; background: #e3dccb; }
.pv-bh-bars span.last { background: var(--pv-primary); }
.pv-bh-now { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; min-width: 64px; flex-shrink: 0; }
.pv-bh-now b { font-size: calc(20px + var(--pv-fz-add2, 0px)); font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; line-height: 1.1; }
.pv-bh-now b i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-bh-now b.none { color: var(--pv-text-faint); font-weight: 400; }
.pv-bh-now span { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-bh-score { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding-top: 10px; border-top: 1px solid #f0f1f5; }
.pv-bh-score > span { font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); margin-right: 6px; }
.pv-bh-score button { width: 34px; height: 32px; padding: 0; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); color: var(--pv-text); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-bh-score button:hover:not(:disabled) { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-bh-healed { display: flex; flex-direction: column; gap: 6px; }
.pv-bh-healed-h { align-self: flex-start; padding: 4px 2px; border: 0; background: none; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); cursor: pointer; }
.pv-bh-healed-h:hover { color: var(--pv-text); }
.pv-bh-healed-row { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 0 2px; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-bh-healed-row b { font-weight: 600; color: var(--pv-text); }
.pv-bh-healed-row .m { color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
@media (max-width: 860px) {
  .pv-bh-layout { grid-template-columns: minmax(0, 1fr); min-height: 0; }
  .pv-bh-side { border-right: 0; padding: 0 0 10px; overflow: visible; }
  .pv-bh-nav { flex-direction: row; flex-wrap: wrap; gap: 4px; }
  .pv-bh-nav .pv-snav-title { width: 100%; }
  .pv-bh-nav .pv-snav-item { width: auto; }
  .pv-bh-main { padding: 8px 0 24px; }
  .pv-bh-head { flex-direction: column; align-items: flex-start; gap: 10px; }
  .pv-bh-row { grid-template-columns: 30px minmax(0, 1fr); row-gap: 8px; padding: 12px; }
  .pv-bh-st { grid-column: 2; }
  .pv-bh-acts { grid-column: 2; justify-content: flex-start; }
  .pv-bh-form { padding-left: 12px; }
  .pv-bh-ep-top { flex-wrap: wrap; }
  .pv-bh-ep-t { flex-basis: 100%; }
}

/* ============================================================
   组件库 #1 <pv-rail>「模块栏」（frontend/assets/components/rail.js，规范 docs/components/index.html；用户 2026-10-29）
   一列：顶上「标题 + 设置 / 收起」那行，底下 <pv-side-nav>；右边缘一道竖线 + 拖宽把手；收起成 44px 图标条。
   外面的网格那一列写 auto。
   ============================================================ */
.pv-mrail { position: relative; flex: none; box-sizing: border-box; min-height: 0; display: flex; flex-direction: column;
           padding: 0 16px 14px 0; border-right: 1px solid var(--pv-border); overflow: visible; }
.pv-mrail > .pv-snav { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.pv-mrail.sticky { position: sticky; top: calc(var(--pv-topbar-h) + 12px); max-height: calc(100dvh - var(--pv-topbar-h) - 32px); }
.pv-mrail.fold { width: 44px; padding-right: 8px; }
.pv-mrail-head { display: flex; align-items: center; gap: 2px; min-height: 17px; margin-bottom: 8px; padding-left: 4px; }
.pv-mrail-head > .pv-snav-title { flex: 1; min-width: 0; margin: 0; padding: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-mrail-btn { flex: none; width: 20px; height: 20px; margin: -1.5px 0; padding: 0; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint);   /* 20 高、上下各只探出 1.5px：钮跟「模块」那行同一条中线（用户 2026-10-29：原来 22 高往上探 3px，看着太靠上） */
               font-size: 13px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; opacity: 0; transition: opacity .12s, background .12s; }
.pv-mrail:hover .pv-mrail-btn, .pv-mrail.fold .pv-mrail-btn, .pv-mrail-btn:focus-visible { opacity: 1; }
.pv-mrail-btn:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-mrail.fold .pv-mrail-head { justify-content: center; padding-left: 0; }
.pv-mrail-mini { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.pv-mrail-mini-btn { width: 34px; height: 34px; padding: 0; border: 0; border-radius: var(--pv-radius-sm); background: none; cursor: pointer;
                    font-family: inherit; font-size: 17px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; color: var(--pv-text-soft); }
.pv-mrail-mini-btn .ch { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; }
.pv-mrail-mini-btn.d1 { width: 28px; height: 28px; font-size: 14px; }
.pv-mrail-mini-btn:hover { background: var(--pv-bg); }
.pv-mrail-mini-btn.on { background: var(--pv-brand-soft); color: var(--pv-brand-dark); }
.pv-mrail-grip { position: absolute; top: 0; bottom: 0; right: -5px; width: 10px; cursor: col-resize; z-index: 2; }
.pv-mrail-grip::after { content: ""; position: absolute; top: 0; bottom: 0; left: 4px; width: 1px; background: transparent; transition: background .12s, width .12s; }
.pv-mrail-grip:hover::after, .pv-mrail-grip.on::after { background: var(--pv-primary); width: 2px; }
.pv-mrail.resizing { user-select: none; }
@media (max-width: 860px) {
  .pv-mrail, .pv-mrail.fold { width: auto !important; padding: 0 0 8px; border-right: 0; }
  .pv-mrail-head, .pv-mrail-grip { display: none; }
  .pv-mrail-mini { flex-direction: row; flex-wrap: wrap; }
  .pv-mrail.fold > .pv-snav { display: flex; }
}
/* 设置弹窗（数值照 docs/components/index.html 的演示）：一行 = 拖点 | 图标框 34×30 | 名字框 | 一级 / 二级 | 显示 / 隐藏；
   小标题那行是虚线框的名字；分隔线那行一道线。底下两颗 .pv-addbtn 加小标题 / 分隔线 */
.pv-mrail-wtip { position: absolute; top: 2px; left: 50%; transform: translateX(-50%); z-index: 4; padding: 2px 8px; border-radius: 6px; background: #191b23; color: #fff; font-size: 11.5px; line-height: 16px; white-space: nowrap; pointer-events: none; }
.pv-mrail-mini-div { width: 20px; height: 1px; margin: 4px 0; background: var(--pv-border); }
.pv-mrail-cfg { display: flex; flex-direction: column; gap: 4px; }
.pv-mrail-cfg-list { display: flex; flex-direction: column; max-height: 50vh; overflow-y: auto; }
.pv-mrail-cfg-row { display: flex; align-items: center; gap: 6px; min-height: 40px; padding: 0 2px; border-bottom: 1px dashed var(--pv-border); background: var(--pv-surface); cursor: grab; user-select: none; -webkit-user-select: none; }
.pv-mrail-cfg-row:last-child { border-bottom: 0; }
.pv-mrail-cfg-row .grip { flex: none; width: 18px; fill: #c4c8d4; }
.pv-mrail-cfg-row .ic { flex: none; width: 34px; height: 30px; text-align: center; border: 1px solid var(--pv-border); border-radius: 6px; font: inherit; font-size: 14px; background: var(--pv-surface); outline: none; }
.pv-mrail-cfg-row .nm { flex: 1; min-width: 0; height: 30px; padding: 0 8px; border: 1px solid var(--pv-border); border-radius: 6px; font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); background: var(--pv-surface); outline: none; }
.pv-mrail-cfg-row .nm:focus, .pv-mrail-cfg-row .ic:focus { border-color: var(--pv-primary); }
.pv-mrail-cfg-row .nm:disabled { background: #fafafc; color: var(--pv-text-soft); }
.pv-mrail-cfg-row .nm.h { border-style: dashed; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-mrail-cfg-row .k { flex: none; font-size: 11px; color: var(--pv-text-faint); }
.pv-mrail-cfg-row .dline { flex: 1; display: flex; align-items: center; gap: 10px; font-size: 12px; color: var(--pv-text-faint); }
.pv-mrail-cfg-row .dline::before, .pv-mrail-cfg-row .dline::after { content: ""; flex: 1; border-top: 1px solid #d3d6e0; }
.pv-mrail-cfg-row .seg { flex: none; display: flex; border: 1px solid var(--pv-border); border-radius: 6px; overflow: hidden; }
.pv-mrail-cfg-row .seg button { height: 26px; padding: 0 8px; border: 0; background: var(--pv-surface); color: var(--pv-text-faint); font: inherit; font-size: 12px; cursor: pointer; }
.pv-mrail-cfg-row .seg button + button { border-left: 1px solid var(--pv-border); }
.pv-mrail-cfg-row .seg button.on { background: var(--pv-brand-soft); color: var(--pv-brand-dark); }
.pv-mrail-cfg-row .seg button:disabled { color: #d3d6e0; cursor: not-allowed; }
.pv-mrail-cfg-row .ib { flex: none; width: 26px; height: 26px; padding: 0; border: 0; border-radius: 6px; background: none; color: var(--pv-text-soft); cursor: pointer; font-size: 14px; }
.pv-mrail-cfg-row .ib:hover { background: var(--pv-bg); }
.pv-mrail-cfg-row .ib.off { color: var(--pv-text-faint); }
.pv-mrail-cfg-row .ib.del:hover { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-mrail-cfg-row.off .nm, .pv-mrail-cfg-row.off .ic { opacity: .4; text-decoration: line-through; }
.pv-mrail-cfg-row.dragging { opacity: .35; }
.pv-mrail-cfg-row.over { position: relative; }
.pv-mrail-cfg-row.over::after { content: ""; position: absolute; left: 0; right: 0; top: -1px; height: 2px; background: var(--pv-primary); pointer-events: none; }   /* 平线 */
.pv-mrail-cfg-adds { display: flex; gap: 8px; margin-top: 10px; }
.pv-mrail-cfg-hint { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin-top: 6px; }
.pv-mrail-cfg-foot { display: flex; align-items: center; gap: 8px; }
/* 各页套 <pv-rail> 时的那点差别：分类页左栏跟右边内容一样线下留 14；日记本那列右边留 20；
   总览 / 分类筛选那几列（购物清单 / 影视书籍 / 其他清单）不吸顶、跟内容齐顶 */
.pv-fold-layout > .pv-mrail { padding-top: 14px; align-self: stretch; }
.pv-diary-rail { margin-right: 20px; }
.pv-wl-layout > .pv-mrail { align-self: start; }
.pv-soc-layout > .pv-mrail { padding-right: 14px; }

/* 「下一件」一张卡列那天的每一件（用户 2026-10-29）：日历页底下一列，每件 = 小签 + 标题 + 一排人，件与件之间一道浅线；
   小签颜色跟每件自己的种类走（日历页跟第一件走）；超过 3 件折成「还有 N 件」 */
.pv-ct-nx-list { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.pv-ct-nx-it { display: flex; flex-direction: column; gap: 6px; min-width: 0; --nx: var(--pv-ev-plan); }
.pv-ct-nx-it.fest { --nx: var(--pv-ev-fest); } .pv-ct-nx-it.gift { --nx: var(--pv-ev-gift); } .pv-ct-nx-it.bday { --nx: var(--pv-ev-bday); }
.pv-ct-nx-it + .pv-ct-nx-it { padding-top: 10px; border-top: 1px solid #f0f1f5; }
.pv-ct-nx-it.link { cursor: pointer; }
.pv-ct-nx-it.link:hover .t { color: var(--pv-primary-dark); }
.pv-ct-nx-list > .pv-ct-nx-more { align-self: flex-start; margin-top: 2px; }

/* ============================================================
   工具条 .pv-tb（用户 2026-10-29，照飞书任务那排：新建 | 未完成 | 筛选 N | 排序：… | 分组：… | 字段配置）
   先在 Let's connect › 礼物登记定稿，之后抽成组件库 #2。文字钮 28 高、13 字、灰字无底，悬停浅灰，选了条件的那颗主色浅底 + 主色深字 + 粗数字
   ============================================================ */
.pv-tb { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 4px; margin: 0 0 18px; }
.pv-tb > .pv-addbtn { margin-right: 0; }
.pv-tb-sep { flex: none; width: 1px; height: 16px; margin: 0 10px; background: var(--pv-border); }
.pv-tb-btn { display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 10px; border: 0; border-radius: 8px; background: none; color: #4a4f60; font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); white-space: nowrap; cursor: pointer; }
.pv-tb-btn .ic { flex: none; width: 14px; height: 14px; color: currentColor; }
.pv-tb-btn:hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-tb-btn.on { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-tb-btn .n { color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-tb-btn .dot { color: var(--pv-text-faint); }
.pv-tb-btn b { font-weight: 700; }
.pv-tb-end { margin-left: auto; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-tb > .pv-search { --pv-search-h: 30px; width: 200px; flex: 0 1 200px; min-width: 120px; }   /* v1.1：搜索框全站那副长相，这排里 30 高、靠右在统计前面 */
.pv-tb-end + .pv-tb-end { margin-left: 0; }
/* 礼物仓库这一页的右栏：左内边距 20（跟左栏离竖线的距离对称）、右内边距 var(--pv-page-pad)。只给这一页加——.pv-soc-main 是 Let's connect 各页共用的 */
.pv-gs { padding: 2px var(--pv-page-pad) 0 20px; }   /* 顶 2 + 布局自带 14 = 工具条离横线 16，第一颗钮跟左栏「模块」那行齐 */
/* 下拉菜单照飞书（用户 2026-10-29）：圆角 10、内留 6、一行 36 高 14 字；选中那行只换字色 + 右边一个 ✓，不铺底；悬停浅灰 */
.pv-tb-menu.el-dropdown-menu { padding: 6px; border-radius: 10px; border: 1px solid var(--pv-border); box-shadow: 0 8px 24px rgba(25, 27, 35, .10); min-width: 168px; }
.pv-tb-menu .el-dropdown-menu__item { display: flex; align-items: center; gap: 10px; height: 36px; line-height: 36px; padding: 0 12px; border-radius: 7px; font-size: calc(14px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-tb-menu .el-dropdown-menu__item:not(.is-disabled):hover { background: var(--pv-bg); color: var(--pv-text); }
.pv-tb-menu .el-dropdown-menu__item.on { color: var(--pv-primary-dark); background: none; }
.pv-tb-menu .el-dropdown-menu__item.on::after { content: "✓"; margin-left: auto; font-size: 13px; font-weight: 700; color: var(--pv-primary-dark); }
.pv-tb-menu .el-dropdown-menu__item.is-disabled { color: var(--pv-text-faint); opacity: .6; }
.pv-tb-menu .popper__arrow { display: none; }
.pv-tb-btn.open { background: var(--pv-bg); color: var(--pv-text); }   /* 菜单开着时那颗钮按下去的样子 */
.pv-tb-btn.on.open { background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-tb-pop { padding: 8px 6px; }
.pv-tb-fields { display: flex; flex-direction: column; }
.pv-tb-fields .row { display: flex; align-items: center; gap: 10px; height: 32px; padding: 0 8px; border-radius: 6px; font-size: 13px; color: var(--pv-text); cursor: pointer; }
.pv-tb-fields .row:hover { background: var(--pv-bg); }
/* 已送出的卡（用户 2026-10-29：并进同一页用第一颗下拉切）：淡一档、名字后面一枚灰签 */
.pv-gi-card.out { opacity: .72; }
.pv-gi-card.out:hover { opacity: 1; }
.pv-gi-tag.done { background: var(--pv-bg); color: var(--pv-text-faint); }


/* Let's connect › 礼物仓库（用户 2026-10-29）：铺灰画布 + 白卡的布局抽成组件库 #3 .pv-canvas-layout（见文件末尾），这里只剩礼物仓库自己的两条 */
.pv-ct.pv-soc-layout.canvas .pv-gs-gt { border-bottom: 0; padding-bottom: 0; margin-bottom: 10px; }
.pv-ct.pv-soc-layout.canvas .pv-pmo-sec-empty { color: var(--pv-text-faint); }

/* 加一个人 › AI 填表（用户 2026-10-29）：粘一段资料，AI 把认得出的填进下面的格子，只填空着的 */
.pv-ct-aifill > legend + .el-textarea { margin-top: 12px; }   /* 跟上面那道横线隔开（用户 2026-10-29：4 太挤） */
.pv-ct-aifill .el-textarea__inner { border-radius: 6px; }   /* 多行大框用 9 显得太圆（用户 2026-10-29）；单行填写控件还是抽屉规范的 9 */
.pv-ct-aifill-row { display: flex; align-items: center; gap: 10px; margin-top: 8px; }
.pv-ct-aifill-note { min-width: 0; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); }


/* ============================================================
   组件库 #3 画布布局 .pv-canvas-layout（用户 2026-10-29，以礼物仓库为模板；规范见 docs/components/index.html #canvas）
   左栏 <pv-rail> ｜ 右边 .pv-canvas：浅灰画布、自己滚、滚动条不画。页面容器右边不留白、顶上那道横线一直画到窗口边，
   右边的留白由 .pv-canvas-in 给（上 16 右 24 下 32 左 20）；卡片 .pv-canvas-card 白底不描边圆角 14、悬停一圈主色；
   工具条铺在画布上时新建钮白底、文字钮悬停 / 按下用深一档的灰。手机：画布是一块圆角 12 的灰块、内留 12，页面整体滚
   ============================================================ */
:root { --pv-canvas-bg: #f6f7fa; --pv-canvas-rail: #fbfbfc; --pv-canvas-btn: #e6e8ee; }   /* 灰底 #f2f3f6 → #f6f7fa：用户 2026-10-30 嫌深了 */
.pv-canvas-layout { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 0; align-items: stretch; padding: 0; }
.pv-canvas-layout > .pv-mrail { margin-right: 0; padding-top: 14px; }
.pv-canvas-layout > .pv-canvas { min-width: 0; min-height: 0; margin: 0; padding: 0; overflow-y: auto; background: var(--pv-canvas-bg); border-radius: 0; scrollbar-width: none; }
.pv-canvas-layout > .pv-canvas::-webkit-scrollbar { display: none; width: 0; height: 0; }
.pv-canvas-in { padding: 16px 24px 32px 20px; min-height: 100%; box-sizing: border-box; }
.pv-canvas-layout > .pv-canvas.pv-canvas-in { padding: 16px 24px 32px 20px; }   /* 整页滚的页：画布和内容区可以是同一个元素，两个类一起戴 */
.pv-canvas-card { background: var(--pv-surface); border: 0; border-radius: var(--pv-card-r); padding: 14px; transition: box-shadow .12s; }
.pv-canvas-card:hover { box-shadow: 0 0 0 1.5px var(--pv-primary); }
.pv-canvas-layout .pv-tb > .pv-addbtn:not(.primary) { background: var(--pv-surface); }   /* 主色那颗（记买入 / 记一次快照）不动 */
.pv-canvas-layout .pv-tb > .pv-addbtn:not(.primary):hover { background: #e9ebf1; }
.pv-canvas-layout .pv-tb-btn:hover, .pv-canvas-layout .pv-tb-btn.open { background: var(--pv-canvas-btn); }
.pv-canvas-layout .pv-tb-btn.on, .pv-canvas-layout .pv-tb-btn.on.open { background: var(--pv-primary-soft); }
.pv-canvas-layout .pv-tb-sep { background: #d9dce4; }
.pv-canvas-layout .pv-pmo-sec-empty { color: var(--pv-text-faint); }
@media (min-width: 861px) {
  .pv-page:has(.pv-canvas-layout) { padding-right: 0; }                               /* 容器右边不留白：横线到窗口边，留白在 .pv-canvas-in */
  .pv-page.pv-modpage > .pv-page:has(.pv-canvas-layout) { padding-top: 0; padding-bottom: 0; }   /* 线下那 14 由左栏补；底下不留，灰铺到底 */
  .pv-page.pv-modpage:has(.pv-canvas-layout) { padding-bottom: 0; }
  .pv-page.pv-modpage .pv-canvas-layout { min-height: calc(100dvh - var(--pv-topbar-h, 0px) - 65px); }   /* 整页滚的分类页：内容短也让灰铺到窗口底（顶栏 + 标题行 65 之下全是它） */
  .pv-page.pv-sp .pv-canvas-layout { min-height: 100%; }                                                   /* 空间页 .pv-sp-body 自己定高、自己滚：铺满它 */
}
@media (max-width: 860px) {
  .pv-canvas-layout { display: block; }
  .pv-canvas-layout > .pv-canvas { background: var(--pv-canvas-bg); border-radius: 12px; overflow: visible; }
  .pv-canvas-in, .pv-canvas-layout > .pv-canvas.pv-canvas-in { padding: 12px; min-height: 0; }
}
/* 各页铺上画布后的小调整：盒子不描边改白卡；本来自带 18 间距的列表不再叠工具条的 18 */
.pv-canvas-layout .pv-bh-box { border: 0; background: var(--pv-surface); border-radius: var(--pv-card-r); }
.pv-bh-main > .pv-tb { margin-bottom: 0; }


/* ============================================================
   财务状况 › 资产状况 / 消费分析 · 总览 尺寸统一（用户 2026-10-29 间距改版 3a / 3b / 3c）
   一、共用：右栏内边距 上 24（含在钉顶页头里）左右 28 下 32；页头 标题 20/700 行高 34、下留 14 + 1px 线、离内容 20；
   区块竖向 gap 20（由外层 flex column 管，区块自己不带 margin）；并排 gap 16；卡壳 白底 1px 圆角 14 内留 18 22 20；
   卡头 一行 30、居中对齐、标题 15/600、说明 13 淡灰、离内容 16；数字卡 16 18 内留、min-height 112、标签 13 / 数字 24 行高 32 / 底行 13 钉底；
   分段钮 连体描边 圆角 9：页头 34 高 18 内距 14 字、卡内 30 高 14 内距 13.5 字；列表行 13.5 字、横条行 34、两行条目 46、hover 浅底；表格 表头 36 灰底、行 40
   ============================================================ */
.pv-fin-layout .pv-pmo-main.pv-work-scroll { padding: 0 28px 32px; }
.pv-fin-layout .pv-pmo-main > .pv-page { padding: 0; }
.pv-fin-layout .pv-fin-pin { padding: 24px 0 14px; margin: 0 0 20px; border-bottom: 1px solid var(--pv-border); background: var(--pv-page-bg); }
.pv-fin-layout .pv-fin-mod-head { gap: 14px; margin: 0; min-height: 34px; align-items: center; }
.pv-fin-layout .pv-fin-mod-head h3 { font-size: calc(20px + var(--pv-fz-add2, 0px)); font-weight: 700; line-height: 34px; }
.pv-fin-head-meta { margin-left: auto; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-fin-ana { display: flex; flex-direction: column; gap: 20px; }
.pv-fin-ana > .pv-page { padding: 0; margin: 0; max-width: none; }   /* 嵌进来的空间页外壳不再自己留白，跟资产页同一条起始线 */
/* 分段钮：连体描边一种样子，页头 34 / 卡内 30；看板里 JS 打的是 .active，跟 .on 一个意思 */
.pv-fin-layout .pv-pmo-seg { border-radius: 9px; }
.pv-fin-layout .pv-pmo-seg button { height: 28px; padding: 0 14px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }   /* 28 + 外框 2 = 看上去 30 */
.pv-fin-layout .pv-pmo-seg button.on, .pv-fin-layout .pv-pmo-seg button.active { background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-fin-layout .pv-fin-pin .pv-fin-tabs button { height: 32px; padding: 0 18px; font-size: calc(14px + var(--pv-fz-add, 0px)); }   /* 32 + 外框 2 = 34，跟标题行同高 */
/* 竖向节奏 20：资产页外层 .pv-as 的 gap；工具条 / 对账提醒不再自带下边距 */
.pv-as { gap: 20px; padding-bottom: 0; }
.pv-as > .pv-tb { margin-bottom: 0; }
.pv-as > .pv-tb .pv-addbtn, .pv-as > .pv-tb .pv-pmo-secbtn { height: 32px; }
.pv-as > .pv-tb .pv-tb-end { font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-as-kpis { gap: 16px; }
@media (min-width: 861px) { .pv-as-kpis { grid-template-columns: 1fr 1fr 1.45fr 1.6fr; } }   /* 美元占比卡底行要放两个金额，再宽一点；手机还是两列 */
/* 窄屏（用户 2026-10-29：笔记本上前两张卡被挤到标题都切掉）：右栏不到 900 先缩字（数字 24 → 20、留白收一点），四张还在一排；不到 740 才两两一排 */
.pv-as { container-type: inline-size; container-name: as; }
@container as (max-width: 900px) {   /* 选择器带上 .pv-as：后面统一数字卡那段是 .pv-as-kpi .v，这里要盖过它 */
  .pv-as .pv-as-kpis { gap: 12px; }
  .pv-as .pv-as-kpi { padding: 14px 14px; min-height: 104px; }
  .pv-as .pv-as-kpi .v { font-size: 20px; line-height: 28px; min-height: 28px; }
  .pv-as .pv-as-kpi .v.small { font-size: 15px; }
  .pv-as .pv-as-kpi .s, .pv-as .pv-as-kpi .k { font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
}
@container as (max-width: 740px) { .pv-as-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@container as (max-width: 440px) { .pv-as-kpis { grid-template-columns: minmax(0, 1fr); } }
.pv-as-kpi .k { white-space: normal; overflow: visible; text-overflow: clip; }   /* 标签宁可折行也别切成「总资产（美元口…」 */
.pv-fin-pending { margin: 0; padding: 12px 16px; font-size: calc(14px + var(--pv-fz-add, 0px)); }
.pv-fin-pending-go { height: 32px; line-height: 30px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
/* 卡壳 + 卡头（资产页 .pv-as-card 和看板 .pv-fd .panel 同一副） */
.pv-as-card, .pv-fd .panel { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-card-r); padding: 18px 22px 20px; min-width: 0; }
.pv-as-card-head, .pv-fd .panel-head { display: flex; align-items: center; justify-content: flex-start; gap: 10px; flex-wrap: wrap; min-height: 30px; margin: 0 0 16px; line-height: 22px; }
.pv-as-card-head h4, .pv-fd .panel-title { margin: 0; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 600; line-height: 22px; color: var(--pv-text); }
.pv-as-card-head .sub, .pv-fd .panel-sub { font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); line-height: 22px; }
.pv-as-card-head .tools, .pv-fd .panel-head .tools { margin-left: auto; align-self: center; display: inline-flex; align-items: center; gap: 8px; }
/* 数字卡：资产页 .pv-as-kpi 和看板 .pv-fin-kpi 合成同一种 */
.pv-as-kpi, .pv-fin-kpi, .pv-fd .pv-fin-kpi { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-card-r); padding: 16px 18px; min-height: 112px; box-sizing: border-box; display: flex; flex-direction: column; min-width: 0; }
.pv-as-kpi .k, .pv-fin-kpi .k { font-size: calc(13px + var(--pv-fz-add, 0px)); letter-spacing: 0; color: var(--pv-text-soft); margin: 0; line-height: 18px; }
.pv-as-kpi .v, .pv-fin-kpi .v, .pv-fd .pv-fin-kpi .v { flex: none; display: flex; align-items: center; min-height: 32px; margin-top: 6px; font-size: 24px; font-weight: 700; line-height: 32px; font-variant-numeric: tabular-nums; }
.pv-as-kpi .v.small { font-size: 17px; }
.pv-as-kpi .s, .pv-fin-kpi .s, .pv-fd .pv-fin-kpi .s { margin-top: auto; padding-top: 8px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); line-height: 18px; }
.pv-fin-kpis { gap: 16px; }
.pv-as-ratio { height: 24px; }
.pv-as-ratio-lg.amt { font-variant-numeric: tabular-nums; color: var(--pv-text); gap: 4px; }
.pv-as-ratio-lg.amt i { width: 9px; height: 9px; margin-left: 10px; }
.pv-as-ratio-lg.amt i:first-child { margin-left: 0; }
.pv-as-kpi .s.row { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 10px; white-space: normal; overflow: visible; }   /* 两边金额长了「目标」自己折到下一行 */
.pv-as-kpi .s.row .pv-as-target { margin-left: auto; }
/* 横条行：34 高、名字和条之间 14、条 8 高、整行 hover 浅底（左右 padding 8 + margin -8） */
.pv-as-bars { gap: 0; }
.pv-as-bar { min-height: 34px; gap: 14px; padding: 0 8px; margin: 0 -8px; border-radius: 8px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); }
.pv-as-bar:hover { background: var(--pv-bg); }
.pv-as-bar .track { height: 8px; }
.pv-as-bar .a { font-weight: 600; }
/* 各账户 · 较基准：表头 36 灰底 12.5/600，行 40、13.5，外框 1px 圆角 10，合计行浅底加粗 */
.pv-as-an { border: 1px solid var(--pv-border); border-radius: 10px; overflow: hidden; }
.pv-as-an-row { min-height: 40px; padding: 2px 12px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); border-bottom: 1px solid var(--pv-border); }
.pv-as-an-row:last-child { border-bottom: 0; }
.pv-as-an-row.head { min-height: 36px; background: var(--pv-bg); font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-soft); }
.pv-as-an-row.total { background: #fafafc; }
/* 图表坐标、月份字 12 淡灰 */
.pv-as-card svg text { font-size: 12px; fill: var(--pv-text-faint); }
/* 看板：区块 flex column gap 20（.hidden 仍然藏）；两列卡 gap 16；旧的 mb-* 不再起作用 */
.pv-fd .pv-fd-stack { display: flex; flex-direction: column; gap: 20px; }
.pv-fd .pv-fd-stack.hidden { display: none; }
.pv-fd .pv-fd-two { gap: 16px; }
.pv-fd .pv-fd-srcrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pv-fd .pv-fd-srcrow:empty { display: none; }
.pv-fd .pv-fd-srcrow .pv-pmo-secbtn.hidden { display: none; }
.pv-fd .pv-fd-leg { display: inline-flex; align-items: center; gap: 14px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-fd .pv-fd-leg span { display: inline-flex; align-items: center; gap: 5px; }
.pv-fd .pv-fd-leg i { width: 10px; height: 10px; border-radius: 3px; }
/* 趋势柱：柱 20 宽、一组两根间距 4、顶上标签 10.5/12 离柱顶 3，支出主色深、收入深绿；月份字 12 淡灰 */
.pv-fd .pv-fd-trend { height: auto; min-height: 196px; align-items: flex-end; }
.pv-fd .pv-fd-vcol { display: flex; flex-direction: column; align-items: center; justify-content: flex-end; }
.pv-fd .pv-fd-vlbl { font-size: 10.5px; line-height: 12px; margin-bottom: 3px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-fd .pv-fd-vlbl.e { color: var(--pv-primary-dark); }
.pv-fd .pv-fd-vlbl.i { color: var(--pv-success-text); }
.pv-fd .pv-fd-vmon { font-size: 12px; color: var(--pv-text-faint); }
/* 类别 / 账户列表：一行 46 高，名字 13.5、笔数 12.5 淡灰、金额粗右对齐、占比 40 宽 12.5、条 6 高 */
.pv-fd .pv-fd-rows { display: flex; flex-direction: column; }
.pv-fd .pv-fd-barrow { min-height: 46px; display: flex; flex-direction: column; justify-content: center; gap: 6px; padding: 5px 8px; margin: 0 -8px; border-radius: 8px; cursor: pointer; }
.pv-fd .pv-fd-barrow:hover { background: var(--pv-bg); }
.pv-fd .pv-fd-br-top { display: flex; align-items: center; gap: 10px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 18px; }
.pv-fd .pv-fd-br-top .nm { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-fd .pv-fd-br-top .nm em { font-style: normal; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-fd .pv-fd-br-top .amt { font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--pv-text); }
.pv-fd .pv-fd-br-top .pct { width: 40px; text-align: right; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-fd .pv-fd-br-track { height: 6px; border-radius: 3px; background: var(--pv-bg); overflow: hidden; }
.pv-fd .pv-fd-br-track .bar { height: 100%; border-radius: 3px; background: var(--pv-primary); }
@media (max-width: 860px) {
  .pv-fin-layout .pv-pmo-main.pv-work-scroll { padding: 0 0 24px; }
  .pv-fin-layout .pv-fin-mod-head { gap: 10px; }
  .pv-fin-head-meta { margin-left: 0; flex: 1 1 100%; order: 3; }
  .pv-fin-winseg { order: 4; }
}

/* 工具条插槽里常塞的东西（2026-10-29 全站套用）：end 里的筛选片排成一排、字回正常色；actions 里的 el-button 跟 30 高对齐 */
.pv-tb-end .pv-filter-row { display: inline-flex; align-items: center; gap: 6px; margin: 0; }
.pv-tb-end .pv-stg-search, .pv-tb-end .pv-stg-search .el-input { width: 300px; max-width: 100%; }
.pv-tb > .el-button--small, .pv-tb .el-button--small { height: 30px; padding-top: 0; padding-bottom: 0; line-height: 28px; }
.pv-tb .pv-gt-toolbar-sel { min-width: 180px; }
.pv-tb .pv-rest-flabel { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }

/* ============================================================
   画布布局铺到更多页（用户 2026-10-29 确认清单）：财务状况 › 信用卡权益 / 消费登记、分类页折叠布局（买菜清单、旅行助手…）、日记本、项目管理、股票模拟
   ============================================================ */
/* 财务状况：按模块加 .pv-fin-canvas——右栏整块铺灰、钉顶页头保持白底横跨、内容区自己留 28 */
.pv-fin-layout.pv-fin-canvas .pv-pmo-main.pv-work-scroll { padding: 0; background: var(--pv-canvas-bg); scrollbar-width: none; }
.pv-fin-layout.pv-fin-canvas .pv-pmo-main.pv-work-scroll::-webkit-scrollbar { display: none; width: 0; height: 0; }
.pv-fin-canvas .pv-fin-pin { padding: 38px 28px 14px; margin-bottom: 0; }   /* 38 = 布局原来那 14 + 页头的 24：标题还在 222 那条线上 */
.pv-fin-layout.pv-fin-canvas, .pv-page.pv-modpage > .pv-work-body.pv-fin-canvas { padding-top: 0; }   /* 分类页外壳那条 14 也去掉，页头自己补 */
.pv-fin-canvas > .pv-mrail { padding-top: 14px; }   /* 左栏自己补那 14：换到资产状况 / 消费分析时「模块」那行不跳（用户 2026-10-30） */
@media (min-width: 861px) { .pv-page:has(.pv-fin-canvas) { padding-right: 0; } }   /* 跟别的画布页一样顶到窗口边 */
.pv-fin-canvas .pv-fin-body { padding: 20px 28px 32px; }
.pv-fin-canvas .pv-cp { padding: 0 28px 32px; }
.pv-fin-canvas .pv-cp > .pv-fin-pin { margin: 0 -28px 20px; }
.pv-fin-canvas .pv-as-kpi, .pv-fin-canvas .pv-as-card { border: 0; }
.pv-fin-canvas .pv-cp-list, .pv-fin-canvas .pv-cp-rows { background: var(--pv-surface); border-radius: var(--pv-card-r); padding: 6px 18px; }
.pv-fin-canvas .pv-stg-grid-wrap, .pv-fin-canvas .pv-sa-list, .pv-fin-canvas .pv-wb-steps, .pv-fin-canvas .pv-wb-months, .pv-fin-canvas .pv-wb-uncat { background: var(--pv-surface); border-radius: var(--pv-card-r); padding: 12px 18px; }
.pv-fin-canvas .pv-tb > .pv-addbtn:not(.primary) { background: var(--pv-surface); }
.pv-fin-canvas .pv-tb-btn:hover, .pv-fin-canvas .pv-tb-btn.open { background: var(--pv-canvas-btn); }
/* 分类页折叠布局：每个块一张白卡 */
.pv-canvas-layout .pv-fold-main .pv-home-block { margin: 0 0 20px; }
.pv-canvas-layout .pv-fold-main .pv-home-block > .pv-block { background: var(--pv-surface); border-radius: var(--pv-card-r); padding: 16px 18px; }
.pv-canvas-layout .pv-fold-main .pv-home-cols:not(.solo) > .pv-home-block:first-child { margin-top: 0; }
.pv-canvas-layout .pv-fold-main .pv-home-rail { background: var(--pv-surface); border-radius: var(--pv-card-r); padding: 14px 12px; border: 0; }   /* 嵌在里面那条「模块」小栏也上白卡，别浮在灰上 */
/* 日记本：时间轴卡 / 待办卡白底不描边 */
.pv-canvas-layout .pv-gt-card, .pv-canvas-layout .pv-tc { border-color: transparent; border-radius: var(--pv-card-r); }
.pv-canvas-layout .pv-gt-side { border-left: 0; }
/* 项目管理：右栏铺灰（不是 grid 子项，单独写），板块白卡不描边；顶栏那行留原来的右边距 */
.pv-work.pv-pmo.pv-pmo-canvas { padding-right: 0; }
.pv-pmo-canvas > .pv-work-top { padding-right: var(--pv-page-pad); }
.pv-pmo-canvas .pv-pmo-main.pv-work-scroll { background: var(--pv-canvas-bg); padding: 16px 24px 32px 20px; scrollbar-width: none; }
.pv-pmo-canvas .pv-pmo-main.pv-work-scroll::-webkit-scrollbar { display: none; width: 0; height: 0; }
.pv-pmo-canvas .pv-pmo-sec { border-color: transparent; border-radius: var(--pv-card-r); margin-bottom: 16px; }
.pv-pmo-canvas .pv-tb > .pv-addbtn:not(.primary) { background: var(--pv-canvas-btn); }
/* 分割线紧贴灰底（用户 2026-10-30）：把手列 24 → 12，线画在把手右沿，右边不再留那 12px 白条；左树到线的距离不变 */
.pv-pmo-canvas .pv-pmo-layout { grid-template-columns: var(--pv-pmo-side-w, 260px) 12px minmax(0, 1fr); }
@media (min-width: 1180px) {
  .pv-pmo-canvas .pv-pmo-layout { grid-template-columns: var(--pv-pmo-side-w, 260px) 12px minmax(0, 1fr) 166px; }
  .pv-pmo-canvas .pv-pmo-layout.tpl-on { grid-template-columns: var(--pv-pmo-side-w, 260px) 12px minmax(0, 1fr); }
}
.pv-pmo-canvas .pv-pmo-grip::after { left: auto; right: 0; transform: none; }
/* 灰底顶到顶栏横线、铺到窗口底（用户 2026-10-30）：外壳那 14 不给了，左树 / 右边「跳到」自己补 14，跟别的画布页一样 */
.pv-pmo-canvas .pv-pmo-layout { padding: 0; }
.pv-pmo-canvas .pv-pmo-side, .pv-pmo-canvas .pv-pmo-nav { padding-top: 14px; }
/* 日记本：同上，本子栏那 14 由 .pv-canvas-layout > .pv-mrail 给 */
.pv-work-body.pv-diary-body.pv-canvas-layout { padding-top: 0; }
/* 股票模拟：几个人一起记时左栏是 #1 模块栏、右边铺灰；数字卡 / 表格白底 */
.pv-canvas-layout .pv-stock-cards .pv-stat, .pv-canvas-layout .pv-stock-table { background: var(--pv-surface); border-color: transparent; border-radius: var(--pv-card-r); }
.pv-canvas-layout .pv-stock-table { padding: 8px 14px; }
/* 画布上的卡片 / 容器一律不描边（用户 2026-10-30）：白卡靠灰底分隔就够了；行与行之间的横线、页签下划线、状态色竖条不算边框，照旧 */
.pv-canvas-layout .pv-stat-card, .pv-canvas-layout .pv-risk-item, .pv-canvas-layout .pv-risk-item.hot, .pv-canvas-layout .pv-stock-board,
.pv-canvas-layout .pv-mp-day, .pv-canvas-layout .pv-mp-day.today, .pv-canvas-layout .pv-mp-day.ok, .pv-canvas-layout .pv-table-wrap,
.pv-canvas-layout .pv-mp-slot, .pv-canvas-layout .pv-mp-day.today .pv-mp-slot,
.pv-pmo-canvas .pv-ck-stats > .pv-ck-stat, .pv-fin-canvas .pv-wb-step, .pv-fin-canvas .pv-wb-step.warn.act, .pv-fin-canvas .pv-pmo-sec { border-color: transparent; }
.pv-canvas-layout .pv-stat-card, .pv-canvas-layout .pv-table-wrap, .pv-pmo-canvas .pv-ck-stats > .pv-ck-stat, .pv-fin-canvas .pv-pmo-sec { border-radius: var(--pv-card-r); }
.pv-fin-canvas .pv-wb-step.act:hover { border-color: var(--pv-primary); }   /* 能点的那张悬停一圈主色照旧（画布卡片规范） */
.pv-canvas-layout .pv-mp-slot.empty { border-color: transparent; background: var(--pv-canvas-bg); }   /* 饭谱空格子：虚线框换成浅灰实底 */
.pv-canvas-layout .pv-mp-day.today .pv-mp-slot.empty { border-color: transparent; background: #FFFCF5; }
.pv-canvas-layout .pv-mp-slot.empty:hover { border-color: transparent; background: var(--pv-primary-soft); }
/* 画布上的 v-loading 蒙层跟灰底同色：原来是白的，礼物仓库加载时顶上先白一块、好了再变灰（用户 2026-10-30） */
.pv-canvas > .el-loading-mask, .pv-canvas-in > .el-loading-mask, .pv-pmo-main.pv-canvas > .el-loading-mask { background: color-mix(in srgb, var(--pv-canvas-bg) 88%, transparent); }
@media (max-width: 860px) {
  .pv-fin-canvas .pv-fin-pin { padding-left: 0; padding-right: 0; }
  .pv-fin-canvas .pv-fin-body, .pv-fin-canvas .pv-cp { padding: 12px 0 24px; }
  .pv-fin-canvas .pv-cp > .pv-fin-pin { margin: 0 0 16px; }
  .pv-work.pv-pmo.pv-pmo-canvas { padding-right: var(--pv-page-pad); }
  .pv-pmo-canvas .pv-pmo-main.pv-work-scroll { padding: 12px; border-radius: 12px; }
  .pv-pmo-canvas .pv-pmo-layout { grid-template-columns: 1fr; padding-bottom: 14px; }   /* 手机上灰块是圆角一块，底下照旧留 14 */
}

/* 就地改类别（用户 2026-10-29）：账目行上的类别是两态——平时是字、点了变下拉；消费分析和消费明细之间不用来回跳 */
.pv-fd-inline .r .c { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text-soft); font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-fd-catcell { cursor: pointer; border-bottom: 1px dashed transparent; }
.pv-fd-catcell:hover { color: var(--pv-primary-dark); border-bottom-color: var(--pv-primary); }
.pv-fd-catsel { height: 26px; max-width: 100%; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text); border: 1px solid var(--pv-primary); border-radius: 6px; padding: 0 22px 0 8px; outline: none; appearance: none; -webkit-appearance: none;
  background: var(--pv-surface) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M3 4.5l3 3 3-3' fill='none' stroke='%239ca1b3' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/></svg>") no-repeat right 7px center / 10px 10px; }

/* 手机端锁死缩放（用户 2026-10-30）：双指捏合会把整页放大、再拖来拖去就乱了。pan-x pan-y = 只许滚不许捏；
   配合 index.html 的 viewport maximum-scale=1 / user-scalable=no 和 gesturestart 拦截（iOS Safari 只认后者）。 */
html, body { touch-action: pan-x pan-y; }

/* 抽屉里被「导到」的那一行闪一下底色（日记本从复盘小签开抽屉，用户 2026-10-30） */
.pv-dw-flash { animation: pv-dw-flash 1.6s ease-out; border-radius: 6px; }
@keyframes pv-dw-flash { 0%, 35% { background: var(--pv-primary-soft); box-shadow: 0 0 0 6px var(--pv-primary-soft); } 100% { background: transparent; box-shadow: 0 0 0 6px transparent; } }

/* ---------- 手机端：股票模拟 / 小厨房（用户 2026-10-30，照首页和 Let's connect 的手机版收拾） ---------- */
.pv-stock-board-chev { display: none; }
@media (max-width: 640px) {
  /* 工具条折行时：竖线别挂在行尾；右端那句统计自己占一行 */
  .pv-tb { gap: 8px 6px; margin-bottom: 14px; }
  .pv-tb-sep { display: none; }
  .pv-tb-end { flex: 1 1 100%; margin-left: 0; white-space: normal; }
  /* 分类页折叠布局：白卡只比灰块缩 12，不再「块 14 + 卡 18」两层缩进；块与块之间 12 */
  .pv-canvas-layout .pv-fold-main .pv-home-block { padding: 0; margin: 0 0 12px; }
  .pv-canvas-layout .pv-fold-main .pv-home-block > .pv-block { padding: 14px 14px 16px; }
  .pv-canvas-layout .pv-fold-main .pv-home-cols { padding-top: 10px; }
  /* 小黑板控制行：第一行 跨度分段钮 ｜ ‹ 回到今天 ›，第二行 进度环 + 已排几餐（原来三样各占一行、左右乱飘） */
  .pv-mp-bar { gap: 8px 6px; margin: 2px 0 12px; }
  .pv-mp-seg { order: 1; padding: 2px; }
  .pv-mp-seg button { height: 26px; padding: 0 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
  .pv-mp-nav { order: 2; margin-left: auto; gap: 4px; }
  .pv-mp-arrow { width: 30px; height: 30px; }
  .pv-mp-today { height: 30px; padding: 0 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
  .pv-mp-meter { order: 3; flex: 1 1 100%; margin-left: 0; }
  .pv-mp-ring { width: 30px; height: 30px; }
  /* 股票模拟：总资产一张通栏，三张盈亏并排一行、只留标签和数（说明行收掉）；风控三格同样 */
  .pv-stock-cards { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-bottom: 14px; }
  .pv-stock-cards .pv-stat-card.wide { grid-column: 1 / -1; }
  .pv-stock-cards .pv-stat-card:not(.wide), .pv-risk-item { padding: 10px 10px 12px; }
  .pv-stock-cards .pv-stat-card:not(.wide) .k, .pv-risk-item .k { font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 1.25; white-space: normal; }
  .pv-stock-cards .pv-stat-card:not(.wide) .v, .pv-risk-item .v { font-size: 18px; letter-spacing: -.2px; }
  .pv-stock-cards .pv-stat-card:not(.wide) .sub, .pv-risk-item .sub { display: none; }
  .pv-risk-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
  /* 交易规则：手机上只露抬头那一行，点了才展开 */
  .pv-stock-board { margin-bottom: 12px; }
  .pv-stock-board-head { display: flex; align-items: center; gap: 6px; cursor: pointer; }
  .pv-stock-board-chev { display: inline-block; margin-left: auto; font-size: 13px; color: var(--pv-text-faint); transition: transform .15s; }
  .pv-stock-board.open .pv-stock-board-chev { transform: rotate(180deg); }
  .pv-stock-board:not(.open) ul { display: none; }
}
/* 登记入库：放在哪 | 数量 两列不再对半分，数量只要一窄条（用户 2026-10-31） */
.pv-drawer-row.pv-gi-row-qty { grid-template-columns: minmax(0, 1fr) 96px; }

/* ---------- 身体健康 · 小违和泳道图（2026-10-31，交接包方向 2a） ---------- */
.pv-bh-win { display: inline-flex; align-items: center; gap: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text); }
.pv-bh-win b { font-weight: 600; font-variant-numeric: tabular-nums; min-width: 92px; text-align: center; }
.pv-bh-winbtn { width: 28px; height: 28px; padding: 0; border: 0; border-radius: 8px; background: var(--pv-surface); color: var(--pv-text-soft); font-size: 16px; line-height: 28px; cursor: pointer; }
.pv-bh-winbtn:hover { background: var(--pv-canvas-btn); color: var(--pv-text); }
.pv-bh-swim { background: var(--pv-surface); border-radius: 12px; padding: 0 14px 10px; }
.pv-bh-tip { display: flex; align-items: center; gap: 10px; height: 30px; margin: 0 -14px 4px; padding: 0 14px; border-bottom: 1px solid var(--pv-border); font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 30px; white-space: nowrap; overflow: hidden; }
.pv-bh-tip b { font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-bh-tip .nm { color: var(--pv-text); }
.pv-bh-tip .lv { display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 6px; font-size: 12px; line-height: 20px; font-weight: 700; }
.pv-bh-tip .tx { color: var(--pv-text-soft); overflow: hidden; text-overflow: ellipsis; }
.pv-bh-tip .ph { color: var(--pv-text-faint); }
.pv-bh-sgrid { display: grid; align-items: stretch; }
.pv-bh-shead { height: 30px; }
.pv-bh-shead .hd { position: relative; min-width: 0; }
.pv-bh-shead .hd b, .pv-bh-shead .hd i { position: absolute; left: 50%; transform: translateX(-50%); font-size: 10px; line-height: 12px; white-space: nowrap; font-style: normal; color: var(--pv-text-faint); font-weight: 500; }
.pv-bh-shead .hd i { top: 2px; }
.pv-bh-shead .hd b { bottom: 4px; }
.pv-bh-shead .hd.wk b { opacity: .55; }
.pv-bh-shead .hd.month b, .pv-bh-shead .hd.month i { color: var(--pv-text-soft); font-weight: 700; }
.pv-bh-shead .hd.today b, .pv-bh-shead .hd.today i { color: var(--pv-primary-dark); font-weight: 700; }
.pv-bh-shead .hd.today { background: #fdf6e9; border-radius: 6px 6px 0 0; }
.pv-bh-shead .hd.hov { background: #f3f4f7; }
.pv-bh-lane { height: 60px; border-bottom: 1px solid #eceef3; }
.pv-bh-lane.healed { opacity: .72; }
.pv-bh-lane .nm { display: flex; flex-direction: column; justify-content: center; gap: 3px; min-width: 0; padding: 0 10px 0 0; border: 0; background: none; text-align: left; cursor: pointer; font: inherit; }
.pv-bh-lane .nm .l1 { display: flex; align-items: center; gap: 6px; min-width: 0; }
.pv-bh-lane .nm .l1 b { font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-bh-lane .nm:hover .l1 b { color: var(--pv-primary-dark); }
.pv-bh-lane .nm .l2 { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-bh-lane .cell { position: relative; display: flex; align-items: flex-end; justify-content: center; min-width: 0; cursor: pointer; }
.pv-bh-lane .cell.today { background: #fdf6e9; }
.pv-bh-lane .cell.hov { background: #f3f4f7; }
.pv-bh-lane .cell .bar { width: calc(100% - 4px); max-width: 18px; border-radius: 3px 3px 0 0; }
.pv-bh-lane .cell .gap { width: 100%; height: 4px; background: #F2DFB8; }
.pv-bh-lane .cell .brk { width: 100%; height: 0; border-top: 2px dashed #c4c8d4; margin-bottom: 1px; }
.pv-bh-sdiv { padding: 10px 0 4px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-weight: 600; }
.pv-bh-legend { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-bh-legend > span { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.pv-bh-legend i.bars { display: inline-flex; align-items: flex-end; gap: 2px; height: 16px; }
.pv-bh-legend i.bars u { display: block; width: 6px; border-radius: 2px 2px 0 0; }
.pv-bh-legend i.gap { display: block; width: 22px; height: 4px; background: #F2DFB8; }
.pv-bh-legend i.brk { display: block; width: 22px; border-top: 2px dashed #c4c8d4; }
/* 详情抽屉 */
.pv-bh-dr .pv-drawer-head { gap: 8px; align-items: center; }
.pv-bh-stp { display: inline-flex; align-items: center; height: 20px; padding: 0 8px; border-radius: 10px; font-size: 11.5px; line-height: 20px; font-weight: 600; white-space: nowrap; }
.pv-bh-stp.open { background: var(--pv-warning-soft); color: var(--pv-warning-text); }
.pv-bh-stp.ok { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-bh-drmeta { margin-top: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); line-height: 1.6; }
.pv-bh-chart { display: flex; align-items: flex-end; gap: 1px; height: 60px; padding: 0 0 1px; border-bottom: 1px solid var(--pv-border); }
.pv-bh-chart .col { flex: 1 1 0; min-width: 0; height: 100%; display: flex; align-items: flex-end; justify-content: center; cursor: pointer; border-radius: 3px 3px 0 0; }
.pv-bh-chart .col.break { background: repeating-linear-gradient(135deg, #f3f4f7 0 4px, #fff 4px 8px); }
.pv-bh-chart .col.sel { box-shadow: inset 0 0 0 2px #191b23; }
.pv-bh-chart .col .bar { width: 100%; max-width: 14px; border-radius: 3px 3px 0 0; }
.pv-bh-chart .col .gap { width: 100%; height: 3px; background: #F2DFB8; }
.pv-bh-chartx { display: flex; justify-content: space-between; margin-top: 4px; font-size: 11px; color: var(--pv-text-faint); }
.pv-bh-selinfo { margin-top: 8px; padding: 8px 10px; border-radius: 8px; background: var(--pv-bg); font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-bh-dracts { display: flex; gap: 8px; margin-top: 14px; }
.pv-bh-rec { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.pv-bh-rec .lvs { display: flex; flex-wrap: wrap; gap: 4px; }
.pv-bh-rec .lvs button { min-width: 30px; height: 30px; padding: 0 6px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: 13px; cursor: pointer; font-variant-numeric: tabular-nums; }
.pv-bh-rec .lvs button.on { border-color: transparent; font-weight: 700; }
.pv-bh-rec .row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pv-bh-rec .pv-drawer-row { margin: 0; }
.pv-bh-kv { min-height: 22px; padding: 4px 6px; margin: 0 -6px; border-radius: 6px; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 1.6; color: var(--pv-text); cursor: text; white-space: pre-wrap; }
.pv-bh-kv:hover { background: var(--pv-bg); }
.pv-bh-recs { display: flex; flex-direction: column; }
.pv-bh-recs .hd { padding: 10px 0 4px; font-size: 12px; color: var(--pv-text-faint); font-weight: 600; }
.pv-bh-recs .brk { display: flex; align-items: center; gap: 8px; padding: 8px 0; font-size: 12px; color: var(--pv-text-soft); }
.pv-bh-recs .brk i { flex: 1; border-top: 2px dashed #c4c8d4; }
.pv-bh-recs .none { padding: 6px 0; font-size: 12.5px; color: var(--pv-text-faint); }
.pv-bh-recs .log { position: relative; display: grid; grid-template-columns: auto auto minmax(0, 1fr) auto; align-items: center; gap: 10px; min-height: 36px; padding: 4px 8px; margin: 0 -8px; border-radius: 8px; cursor: pointer; }
.pv-bh-recs .log:hover { background: var(--pv-bg); }
.pv-bh-recs .log.sel { background: #fdf6e9; }
.pv-bh-recs .log .d { font-size: 12.5px; color: var(--pv-text-soft); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-bh-recs .log .lv { display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 6px; font-size: 12px; line-height: 20px; font-weight: 700; white-space: nowrap; }
.pv-bh-recs .log .nt { font-size: 13px; color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bh-recs .log .ops { display: inline-flex; gap: 2px; opacity: 0; transition: opacity .12s; }
.pv-bh-recs .log:hover .ops { opacity: 1; }
@media (hover: none) { .pv-bh-recs .log .ops { opacity: 1; } }
.pv-bh-recs .log .ops button { width: 26px; height: 26px; padding: 0; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); cursor: pointer; }
.pv-bh-recs .log .ops button:hover { background: var(--pv-border); color: var(--pv-text); }
.pv-bh-catseg { display: flex; flex-wrap: wrap; gap: 6px; }
.pv-bh-catseg button { height: 30px; padding: 0 12px; border: 1px solid var(--pv-border); border-radius: 15px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: 13px; cursor: pointer; white-space: nowrap; }
.pv-bh-catseg button.on { border-color: var(--pv-primary); background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-bh-cyc { display: flex; align-items: center; gap: 8px; font-size: 13.5px; color: var(--pv-text); }
@media (max-width: 640px) {
  .pv-bh-swim { padding: 0 8px 8px; }
  .pv-bh-tip { margin: 0 -8px 4px; padding: 0 8px; }
  .pv-bh-lane { height: 52px; }
  .pv-bh-lane .nm { padding-right: 6px; }
  .pv-bh-win b { min-width: 0; }
}
.pv-bd-moved { margin: 0 0 10px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-cal-bh-list { display: flex; flex-direction: column; }
.pv-cal-bh-row { display: flex; align-items: baseline; gap: 10px; padding: 8px 6px; margin: 0 -6px; border: 0; border-radius: 8px; background: none; text-align: left; font: inherit; cursor: pointer; }
.pv-cal-bh-row:hover { background: var(--pv-bg); }
.pv-cal-bh-row b { font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text); }
.pv-cal-bh-row span { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-bh-legend i.bars u.b1 { height: 5px; background: oklch(0.87 0.064 75); }
.pv-bh-legend i.bars u.b2 { height: 10px; background: oklch(0.75 0.112 65); }
.pv-bh-legend i.bars u.b3 { height: 16px; background: oklch(0.63 0.16 55); }
.pv-drawer-row.pv-wl-pricerow { grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); }
.pv-wl-price .pv-pmo-seg button { min-width: 34px; padding: 0 10px; font-weight: 600; }
@media (max-width: 860px) { .pv-wl-table .name { min-width: 0; width: auto; } }

/* 左下角「我在哪个时区」（用户 2026-11-01）：名字底下一行小字 + 菜单里的弹窗 */
.pv-side-user-tz { font-size: 11.5px; line-height: 15px; color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums; }
.pv-menu-sub { margin-left: 8px; font-size: 12px; color: var(--pv-text-faint); }
.pv-tz-list { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.pv-tz-opt { display: flex; flex-direction: column; align-items: flex-start; gap: 1px; padding: 8px 12px; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); cursor: pointer; text-align: left; font: inherit; }
.pv-tz-opt b { font-size: 13.5px; font-weight: 600; color: var(--pv-text); }
.pv-tz-opt i { font-style: normal; font-size: 11px; color: var(--pv-text-faint); }
.pv-tz-opt:hover { border-color: var(--pv-primary); }
.pv-tz-opt.on { border-color: var(--pv-primary); background: var(--pv-primary-soft); }
.pv-tz-opt.on b { color: var(--pv-primary-dark); }
.pv-tz-dev { margin-top: 12px; font-size: 12.5px; color: var(--pv-text-soft); }
.pv-tz-dev a { margin-left: 6px; }
.pv-tz-note { margin-top: 10px; font-size: 12px; line-height: 1.6; color: var(--pv-text-faint); }
/* 首页钉住的项目板块：右上那组（用户 2026-11-01）——小签 + 两颗 28 高的按钮 */
.pv-cal-pin-until { display: inline-flex; align-items: center; gap: 4px; height: 24px; padding: 0 9px; border-radius: 12px; background: var(--pv-bg); color: var(--pv-text-soft); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 24px; white-space: nowrap; flex-shrink: 0; margin-right: 4px; }
.pv-cal-pin-btn { display: inline-flex; align-items: center; gap: 4px; height: 28px; padding: 0 12px; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 26px; cursor: pointer; white-space: nowrap; flex-shrink: 0; transition: border-color .12s, color .12s, background .12s; }
.pv-cal-pin-btn i { font-size: 13px; }
.pv-cal-pin-btn.open { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-cal-pin-btn.open:hover { background: var(--pv-primary-soft); }
.pv-cal-pin-btn.off:hover { border-color: var(--pv-danger); color: var(--pv-danger); background: var(--pv-danger-soft); }
/* 个人设置（用户 2026-11-01） */
.pv-me-dlg .el-dialog__body { padding-top: 6px; }
.pv-me-sec { padding: 12px 0; border-bottom: 1px solid var(--pv-border); }
.pv-me-sec:last-child { border-bottom: 0; }
.pv-me-h { font-size: 11.5px; font-weight: 700; letter-spacing: .04em; color: var(--pv-text-faint); margin-bottom: 6px; }
.pv-me-row { display: flex; align-items: center; gap: 8px; }
.pv-me-row .el-input { flex: 1; min-width: 0; }
.pv-me-row .el-button + .el-button { margin-left: 0; }
.pv-me-v { flex: 1; min-width: 0; display: inline-flex; align-items: center; gap: 6px; font-size: 13.5px; color: var(--pv-text); line-height: 30px; }
.pv-me-av { width: 22px; height: 22px; border-radius: 50%; object-fit: cover; }
.pv-me-note { margin-top: 6px; font-size: 12px; line-height: 1.6; color: var(--pv-text-faint); }
/* 登录页备案号（用户 2026-11-01）：白色卡片右下角，小一号浅灰；手机上没有两栏，跟在表单最后居中 */
.pv-auth-beian { position: absolute; right: 28px; bottom: 20px; display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 4px 8px; font-size: 12px; line-height: 18px; color: #9aa59e; }
.pv-auth-beian a { display: inline-flex; align-items: center; gap: 4px; color: inherit; text-decoration: none; white-space: nowrap; }
.pv-auth-beian a:hover { color: #1f3a2f; text-decoration: underline; }
.pv-auth-beian .dot { color: #c3ccc6; }
@media (max-width: 640px) { .pv-auth-beian { position: static; justify-content: center; margin-top: 8px; font-size: 11.5px; } }

/* ---------- 身体健康 · 小违和 v3（2026-11-01，交接包方向 3a）：一项一张白卡（画布上不描边），没记的天什么都不画 ---------- */
.pv-bh3 { --c-pain: oklch(0.6 0.17 30); --c-count: oklch(0.55 0.13 250); }
.pv-bh3-tip { display: flex; align-items: center; gap: 10px; height: 30px; padding: 0 2px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 30px; white-space: nowrap; overflow: hidden; }
.pv-bh3-tip b { font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-bh3-tip .nm { color: var(--pv-text); }
.pv-bh3-tip .val { display: inline-flex; align-items: center; height: 20px; padding: 0 7px; color: #fff; font-size: 12px; line-height: 20px; font-weight: 700; }
.pv-bh3-tip .tx { color: var(--pv-text-soft); overflow: hidden; text-overflow: ellipsis; }
.pv-bh3-tip .ph { color: var(--pv-text-faint); }
.pv-bh3-grid { display: grid; align-items: stretch; }
.pv-bh3-head { height: 30px; }
.pv-bh3-head .hd { position: relative; min-width: 0; }
.pv-bh3-head .hd b, .pv-bh3-head .hd i { position: absolute; left: 50%; transform: translateX(-50%); font-size: 10px; line-height: 12px; white-space: nowrap; font-style: normal; color: var(--pv-text-faint); font-weight: 500; }
.pv-bh3-head .hd i { top: 2px; }
.pv-bh3-head .hd b { bottom: 4px; }
.pv-bh3-head .hd.wk b { opacity: .55; }
.pv-bh3-head .hd.month b, .pv-bh3-head .hd.month i { color: var(--pv-text-soft); font-weight: 700; }
.pv-bh3-head .hd.today b, .pv-bh3-head .hd.today i { color: var(--pv-primary-dark); font-weight: 700; }
.pv-bh3-card { position: relative; height: 70px; margin-bottom: 8px; background: var(--pv-surface); border-radius: 0 10px 10px 0; overflow: hidden; }
.pv-bh3-card::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--c); }   /* 左边色条：直角那侧（彩边不做圆角） */
.pv-bh3-card.closed .lab .l1 b { color: var(--pv-text-soft); }   /* 已好的整组用灰（色条 / 柱子的灰在 laneOf 里给），不再整体半透明 */
.pv-bh3-card .lab { display: flex; flex-direction: column; justify-content: center; gap: 4px; min-width: 0; padding: 0 10px 0 16px; border: 0; background: none; text-align: left; cursor: pointer; font: inherit; }
.pv-bh3-card .lab .l1 { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.pv-bh3-card .lab .l1 b { font-size: calc(14px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-bh3-card .lab .l1 i { font-style: normal; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-bh3-card .lab:hover .l1 b { color: var(--pv-primary-dark); }
.pv-bh3-card .lab .l2 { font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-bh3-card .cell { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; min-width: 0; padding-bottom: 8px; cursor: pointer; }
.pv-bh3-card .cell.today { background: #fdf6e9; }
.pv-bh3-card .cell.hov { background: #f0f1f5; }
.pv-bh3-card .cell.sel { background: #FBEED2; }
.pv-bh3-card .cell .bar { display: block; width: calc(100% - 3px); max-width: 16px; background: var(--c); }
.pv-bh3-card .cell .num { font-style: normal; font-size: 9px; line-height: 11px; font-weight: 700; letter-spacing: -.4px; color: var(--c); white-space: nowrap; margin-bottom: 1px; }
.pv-bh3-card .cell .ok { font-size: 12px; line-height: 12px; font-weight: 700; color: #2f8f4e; }
.pv-bh3-card .acts { display: flex; align-items: center; justify-content: flex-end; gap: 6px; margin-left: 12px; padding: 0 14px; border-left: 1px solid #eceef3; }
.pv-bh3-card .acts button { height: 30px; border-radius: 8px; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-bh3-card .acts .main { width: 84px; border: 0; background: var(--c); color: #fff; font-weight: 600; }
.pv-bh3-card.closed .acts .main { background: oklch(0.6 0.17 30); }   /* 「重新开放」还是红色主按钮：它是动作，不是状态 */
.pv-bh3-card .acts .main:hover { filter: brightness(.94); }
.pv-bh3-card .acts .sec { width: 72px; border: 1px solid var(--pv-border); background: var(--pv-surface); color: var(--pv-text-soft); }
.pv-bh3-card .acts .sec:hover { border-color: #2f8f4e; color: #2f8f4e; }
.pv-bh3-card .acts button:disabled { opacity: .6; cursor: default; }
.pv-bh3-div { display: flex; align-items: center; gap: 6px; padding: 10px 2px 6px; border: 0; background: none; font: inherit; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); font-weight: 600; cursor: pointer; }
.pv-bh3-div:hover { color: var(--pv-text-soft); }
.pv-bh3-div em { font-style: normal; font-size: 10px; }
.pv-bh3-legend { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 8px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-bh3-legend > span { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.pv-bh3-legend i.bars { display: inline-flex; align-items: flex-end; gap: 2px; height: 16px; }
.pv-bh3-legend i.bars u { display: block; width: 6px; }
.pv-bh3-legend i.bars.p u { background: oklch(0.6 0.17 30); }
.pv-bh3-legend i.bars.c u { background: oklch(0.55 0.13 250); }
.pv-bh3-legend i.bars u.b1 { height: 6px; } .pv-bh3-legend i.bars u.b2 { height: 11px; } .pv-bh3-legend i.bars u.b3 { height: 16px; }
.pv-bh3-legend i.ok { font-style: normal; font-weight: 700; color: #2f8f4e; }
/* 提示条：底部居中黑条 */
.pv-bh3-toast { position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%); z-index: 3000; display: flex; align-items: center; gap: 14px; max-width: calc(100vw - 32px); padding: 10px 16px; border-radius: 10px; background: #191b23; color: #fff; font-size: 13px; line-height: 20px; box-shadow: 0 8px 24px rgba(0, 0, 0, .18); }
.pv-bh3-toast span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bh3-toast a { color: #f5c26b; font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0; }
/* 那天弹窗 */
.pv-bh3-dlg .el-dialog__header { padding: 18px 20px 10px; border-bottom: 1px solid var(--pv-border); }
.pv-bh3-dlgh { display: flex; flex-direction: column; gap: 3px; }
.pv-bh3-dlgh b { font-size: 16px; font-weight: 700; color: var(--pv-text); }
.pv-bh3-dlgh span { font-size: 12.5px; color: var(--pv-text-faint); }
.pv-bh3-dlg .el-dialog__body { padding: 14px 20px 6px; max-height: 60vh; overflow-y: auto; }
.pv-bh3-rec { display: flex; flex-direction: column; gap: 8px; padding: 12px; margin-bottom: 10px; border: 1px solid var(--pv-border); border-radius: 10px; background: #fafbfc; }
.pv-bh3-rec.hl { border-color: var(--pv-primary); background: var(--pv-primary-soft); }
.pv-bh3-rec .row1 { display: flex; align-items: center; gap: 8px; }
.pv-bh3-rec .del { font-size: 12.5px; color: var(--pv-text-faint); cursor: pointer; }
.pv-bh3-rec .del:hover { color: var(--pv-danger); }
.pv-bh3-rec .lvs { display: flex; flex-wrap: wrap; gap: 4px; }
.pv-bh3-rec .lvs button, .pv-bh-rec .lvs button { min-width: 30px; height: 30px; padding: 0 6px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: 13px; cursor: pointer; font-variant-numeric: tabular-nums; }
.pv-bh3-rec .lvs button.on, .pv-bh-rec .lvs button.on { border-color: transparent; background: oklch(0.6 0.17 30); color: #fff; font-weight: 700; }
.pv-bh3-rec .step { display: flex; align-items: center; gap: 8px; }
.pv-bh3-rec .step button { width: 30px; height: 30px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); font-size: 15px; cursor: pointer; }
.pv-bh3-rec .step b { min-width: 20px; text-align: center; font-size: 16px; font-variant-numeric: tabular-nums; }
.pv-bh3-rec .step span { font-size: 13px; color: var(--pv-text-soft); }
.pv-bh3-dlgf { display: flex; align-items: center; gap: 8px; width: 100%; }
.pv-bh3-dlgf .el-button + .el-button { margin-left: 0; }
/* 详情抽屉 */
.pv-bh3-drsub { font-size: 13px; color: var(--pv-text-faint); }
.pv-bh3-dr .pv-drawer-head { gap: 8px; align-items: baseline; }
.pv-bh3-dr .pv-drawer-head .pv-drawer-title { flex: none; }
.pv-bh3-kv { display: grid; grid-template-columns: 56px 1fr; align-items: center; gap: 8px 10px; margin-top: 14px; }
.pv-bh3-name { height: 34px; box-sizing: border-box; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); font: inherit; font-size: 14px; color: var(--pv-text); outline: none; min-width: 0; }
.pv-bh3-name:focus { border-color: var(--pv-primary); }
.pv-bh3-kv label { font-size: 12.5px; color: var(--pv-text-faint); }
.pv-bh3-list { display: flex; flex-direction: column; }
.pv-bh3-list .hd { padding: 10px 0 4px; font-size: 12px; color: var(--pv-text-faint); font-weight: 600; }
.pv-bh3-list .brk { display: flex; align-items: center; gap: 8px; padding: 8px 0; font-size: 12px; color: #2f8f4e; }
.pv-bh3-list .brk i { flex: 1; border-top: 1px solid #b9dcc4; }
.pv-bh3-list .none { padding: 6px 0; font-size: 12.5px; color: var(--pv-text-faint); }
.pv-bh3-list .log { display: grid; grid-template-columns: auto auto minmax(0, 1fr); align-items: center; gap: 10px; min-height: 34px; padding: 2px 8px; margin: 0 -8px; border-radius: 8px; cursor: pointer; }
.pv-bh3-list .log:hover { background: var(--pv-bg); }
.pv-bh3-list .log .d { font-size: 12.5px; color: var(--pv-text-soft); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-bh3-list .log .v { display: inline-flex; align-items: center; height: 20px; padding: 0 7px; color: #fff; font-size: 12px; line-height: 20px; font-weight: 700; white-space: nowrap; }
.pv-bh3-list .log .nt { font-size: 13px; color: var(--pv-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bh3-del { display: inline-block; margin-top: 18px; font-size: 12.5px; color: var(--pv-text-faint); cursor: pointer; }
.pv-bh3-del:hover { color: var(--pv-danger); }
/* 新加一项 */
.pv-bh3-new .el-dialog__body { padding-top: 8px; }
.pv-bh3-types { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; padding: 4px; border-radius: 10px; background: #f3f4f7; }
.pv-bh3-types button { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 8px 12px; border: 0; border-radius: 8px; background: none; text-align: left; cursor: pointer; font: inherit; }
.pv-bh3-types button b { font-size: 14px; color: var(--pv-text-soft); }
.pv-bh3-types button i { font-style: normal; font-size: 11.5px; color: var(--pv-text-faint); }
.pv-bh3-types button.on { background: var(--pv-surface); box-shadow: 0 1px 3px rgba(25, 27, 35, .1); }
.pv-bh3-types button.on b { color: var(--pv-text); }
.pv-bh3-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
.pv-bh3-chips button { height: 26px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 13px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: 12.5px; cursor: pointer; white-space: nowrap; }
.pv-bh3-chips button:hover { border-color: var(--pv-primary); }
.pv-bh3-chips button.on { border-color: var(--pv-primary); background: var(--pv-primary-soft); color: var(--pv-primary-dark); }
.pv-bh3-chips.feel { margin-top: 0; }
.pv-bh3-hint { margin-left: 6px; font-weight: 400; letter-spacing: 0; color: var(--pv-text-faint); }
.pv-bh3-preview { font-size: 12.5px; color: var(--pv-text-faint); }
@media (max-width: 640px) {
  .pv-bh3-card { height: 60px; }
  .pv-bh3-card .lab { padding: 0 6px 0 12px; }
  .pv-bh3-card .lab .l1 i, .pv-bh3-card .cell .num { display: none; }
  .pv-bh3-card .acts { margin-left: 6px; padding: 0 6px; }
  .pv-bh3-card .acts .main { width: 78px; }
  .pv-bh3-card .acts .sec { display: none; }
  .pv-bh3-toast { bottom: 16px; }
}
/* 详情抽屉「今天好了」大按钮 / 已好的浅绿条（用户 2026-11-01） */
.pv-bh3-heal { display: flex; align-items: center; gap: 14px; width: 100%; margin-top: 14px; padding: 14px 16px; border: 1.5px solid #2f8f4e; border-radius: 12px; background: #f1f8f3; text-align: left; cursor: pointer; font: inherit; }
.pv-bh3-heal:hover { background: #e3f2e8; }
.pv-bh3-heal .dot, .pv-bh3-healed .dot { flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: #2f8f4e; color: #fff; font-weight: 700; }
.pv-bh3-heal .dot { width: 36px; height: 36px; font-size: 20px; }
.pv-bh3-heal .tx { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.pv-bh3-heal .tx b { font-size: 16px; font-weight: 700; color: #1f6b38; }
.pv-bh3-heal .tx i { font-style: normal; font-size: 12.5px; line-height: 1.5; color: #4f7d5d; }
.pv-bh3-healed { display: flex; align-items: center; gap: 10px; margin-top: 14px; padding: 12px 16px; border-radius: 12px; background: #f1f8f3; }
.pv-bh3-healed .dot { width: 28px; height: 28px; font-size: 15px; }
.pv-bh3-healed b { font-size: 14px; font-weight: 600; color: #1f6b38; }
.pv-bh3-card .cell .num.sm { font-size: 7.5px; }
.pv-bh3-list .log { grid-template-columns: auto auto minmax(0, 1fr); }
/* 小违和卡片上的解决方案（用户 2026-11-01）：名字下面一行绿字，填了才有 */
.pv-bh3-card .lab .sol { font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 15px; color: #2f7a47; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-bh3-card .lab { gap: 3px; }
.pv-gro-empty { padding: 12px 2px 4px; }   /* 买菜清单空了：一行小字（用户 2026-11-01） */
.pv-gt-revck-foot.el-checkbox { display: flex; align-items: center; margin-top: 12px; }   /* 已复盘勾在复盘段最底（用户 2026-11-01） */
/* 登录页密码框里的小眼睛（用户 2026-11-01） */
.pv-auth-eye { flex: none; display: flex; align-items: center; justify-content: center; width: 36px; height: 100%; padding: 0; border: 0; background: none; cursor: pointer; color: #a1a5a3; }
.pv-auth-eye:hover { color: #6e6e73; }
/* 撞了：两边标题能点，去 Let's connect 那条（用户 2026-11-01） */
.pv-cal-clash-bar .it span.go, .pv-cal-clash-row > span.go { cursor: pointer; }
.pv-cal-clash-bar .it span.go:hover, .pv-cal-clash-row > span.go:hover { color: var(--pv-primary); text-decoration: underline; }
.pv-cal-clash-bar .it:hover span { text-decoration: none; }
/* 手机上「家人」：国内时间不再挤在第一行右边——放不下就掉到右下角，跟左上的时间斜对着（用户 2026-11-01）。
   改成永远单独一行、贴左，紧跟在时间下面当副标题：时间 · 孩子名 / 国内周几 时刻 / 课表 …，三行都从左边起 */
@media (max-width: 640px) {
  .pv-kid-row { row-gap: 1px; }
  .pv-kid-row .cn { order: 3; flex: 0 0 100%; margin-left: 0; justify-self: start; justify-content: flex-start; line-height: 20px; }
  .pv-kid-row .cn:empty { display: none; }
  .pv-kid-row .what { margin-top: 3px; }
}
/* 小违和 · 分钟这类计次点「＋ 记分钟」弹出的小框（用户 2026-11-01）：填数或点常用值，回车记上 */
.pv-bh3-amt-pop.el-popover { padding: 12px; }
.pv-bh3-amt .in { display: flex; align-items: center; gap: 8px; height: 34px; padding: 0 10px; border: 1px solid var(--pv-line, #e3e5ea); border-radius: 8px; }
.pv-bh3-amt .in:focus-within { border-color: oklch(0.55 0.13 250); }
.pv-bh3-amt .in input { flex: 1; min-width: 0; height: 100%; border: 0; outline: 0; background: none; font: inherit; font-size: 15px; font-variant-numeric: tabular-nums; }
.pv-bh3-amt .in span { flex: none; font-size: 13px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-bh3-amt .chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0; }
.pv-bh3-amt .chips button { flex: none; height: 26px; min-width: 38px; padding: 0 8px; border: 0; border-radius: 999px; background: var(--pv-bg, #f2f3f6); font: inherit; font-size: 12.5px; color: var(--pv-text); cursor: pointer; white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-bh3-amt .chips button:hover, .pv-bh3-amt .chips button.on { background: oklch(0.94 0.03 250); color: oklch(0.55 0.13 250); }
.pv-bh3-amt .foot { display: flex; justify-content: flex-end; gap: 8px; }
.pv-bh3-amt .foot button { height: 28px; padding: 0 14px; border-radius: 8px; font: inherit; font-size: 12.5px; cursor: pointer; white-space: nowrap; }
.pv-bh3-amt .foot .x { border: 1px solid var(--pv-line, #e3e5ea); background: #fff; color: var(--pv-text-soft); }
.pv-bh3-amt .foot .ok { border: 1px solid oklch(0.55 0.13 250); background: oklch(0.55 0.13 250); color: #fff; }
.pv-bh3-amt .foot .ok:disabled { opacity: .45; cursor: not-allowed; }
/* 手机上今日安排里的小签再小一号（用户 2026-11-01）：孩子名 / 次日·明天 / 国内周几 / 上课中，
   原来 11.5–12px 在手机上跟正文差不多大，签子抢眼；改 10.5px、签子矮 2px，正文不动 */
@media (max-width: 640px) {
  .pv-cal-plan-who { height: 18px; line-height: 18px; padding: 0 5px; font-size: calc(10.5px + var(--pv-fz-add, 0px)); }
  .pv-kid-day, .pv-kid-cnday, .pv-kid-on { font-size: calc(10.5px + var(--pv-fz-add, 0px)); line-height: 16px; padding: 0 5px; }
}
/* 手机上左边栏的子项（Let's connect / 和老人聊 / 孩子专区 …）高一点（用户 2026-11-01）：
   原来上下 8px、一行 36 高左右，手指点着挤；改到 44 高（手机上点按的最小舒适高度），彼此再隔开 2px */
@media (max-width: 640px) {
  .pv-side-subs { gap: 3px; margin: 2px 0 4px; }
  .pv-side-sub { min-height: 44px; padding-top: 10px; padding-bottom: 10px; box-sizing: border-box; }
}

/* ===== 财务状况全模块铺灰画布（用户 2026-11-02）：照 Let's connect——页头也在灰上、不画底线；
   内容区 上 0 右 24 下 32 左 20（页头已经给了上面的 16）；所有卡片白底、不描边、圆角 14；留白整体收一档 ===== */
.pv-fin-layout.pv-fin-canvas .pv-fin-pin { background: var(--pv-canvas-bg); border-bottom: 0; padding: 16px 24px 12px 20px; margin: 0; }
.pv-fin-canvas .pv-fin-body, .pv-fin-canvas .pv-fin-ana, .pv-fin-canvas .pv-fin-cfg, .pv-fin-canvas .pv-pmo-main > .pv-as { padding: 0 24px 32px 20px; }
.pv-fin-canvas .pv-cp { padding: 0 24px 32px 20px; }
.pv-fin-canvas .pv-cp > .pv-fin-pin { margin: 0 -24px 0 -20px; }
.pv-fin-canvas .pv-fin-ana, .pv-fin-canvas .pv-as { gap: 12px; }
.pv-fin-canvas .pv-fd .panel, .pv-fin-canvas .pv-fin-kpi, .pv-fin-canvas .pv-as-kpi, .pv-fin-canvas .pv-as-card { border: 0; border-radius: var(--pv-card-r); background: var(--pv-surface); box-shadow: none; }
.pv-fin-canvas .pv-fd .panel { padding: 14px 16px; }
.pv-fin-canvas .pv-fin-kpi, .pv-fin-canvas .pv-as-kpi { padding: 12px 14px; }
.pv-fin-canvas .pv-as-card { padding: 12px 16px 10px; }
.pv-fin-canvas .pv-as-kpis, .pv-fin-canvas .pv-fin-kpis { gap: 12px; }
/* 配置：左边分组导航直接在灰上，右边内容一整张白卡 */
.pv-fin-canvas .pv-fin-cfg { gap: 16px; }
.pv-fin-canvas .pv-fin-cfgmain { background: var(--pv-surface); border-radius: var(--pv-card-r); padding: 14px 16px 18px; }
.pv-fin-canvas .pv-fin-cfgnav button.on { background: var(--pv-surface); }
@media (max-width: 860px) {
  .pv-fin-layout.pv-fin-canvas .pv-fin-pin { padding: 12px 0 10px; }
  .pv-fin-canvas .pv-fin-body, .pv-fin-canvas .pv-fin-ana, .pv-fin-canvas .pv-fin-cfg, .pv-fin-canvas .pv-pmo-main > .pv-as, .pv-fin-canvas .pv-cp { padding: 0 0 24px; }
  .pv-fin-canvas .pv-cp > .pv-fin-pin { margin: 0; }
}
.pv-pmo-layout.pv-fin-layout.pv-fin-canvas { column-gap: 0; }   /* 灰色直接贴着左栏那道竖线，不留白缝（同 Let's connect） */
/* 内容短的模块（配置 / 辅助识别）灰也铺到窗口底（用户 2026-11-02） */
@media (min-width: 861px) { .pv-page.pv-modpage .pv-fin-canvas, .pv-page.pv-modpage .pv-fin-canvas > .pv-pmo-main { min-height: calc(100dvh - var(--pv-topbar-h, 0px) - 65px); } }
/* 信用卡权益每组：白卡里不再套一层带内边距的白块，标题下那道线也撤掉（一层卡就够） */
.pv-fin-canvas .pv-cp-sec { padding: 12px 16px 6px; margin-bottom: 12px; }
.pv-fin-canvas .pv-cp-sec > .pv-pmo-sec-head { border-bottom: 0; padding: 0 0 4px; margin: 0; }
.pv-fin-canvas .pv-cp-sec .pv-cp-rows { background: none; border-radius: 0; padding: 0; }
/* 中国海运表头照资产状况「各账户 · 较基准」那条灰表头（用户 2026-11-02）：浅灰底、12.5 / 600、次级字色、36 高 */
.pv-ship-table th { height: 36px; padding-top: 0; padding-bottom: 0; background: var(--pv-bg); color: var(--pv-text-soft); font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; }
/* 那条灰表头里「走势」比别的字高一截：走势列在数据行是 28 高的小图，表头里不用这个高度 */
.pv-as-an-row.head .sp { height: auto; line-height: inherit; }
/* 礼物图片上传中：本机预览上盖一层白，中间转圈 + 「正在上传 N%」（用户 2026-11-02） */
.pv-gi-imgwait { position: relative; min-height: 96px; align-self: stretch; display: flex; border-radius: 8px; overflow: hidden; background: var(--pv-bg); }
.pv-gi-imgwait img { max-width: 100%; max-height: 220px; display: block; margin-right: auto; }
.pv-gi-imgwait .mask { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: 8px; background: rgba(255, 255, 255, .72); color: var(--pv-primary-dark, var(--pv-primary)); font-size: calc(13.5px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap; }
.pv-gi-imgwait .mask i { font-size: 18px; }
.pv-gi-imgbtns label.off { opacity: .45; pointer-events: none; }
/* 家人安排 · 寒暑假（用户 2026-11-02）：日历上一条青绿横带，图例 / 筛选片同色 */
.k-kidbreak { --pv-k: #1F9A8A; }
.k-kidbreak .pv-cal-dot, .pv-cal-chip.k-kidbreak { background: #1F9A8A; }
.pv-cal-band.pv-cal-band-break .pv-cal-band-item { background: #E3F5F2; color: #13786B; box-shadow: inset 0 0 0 1px #BFE6DF; }
.pv-cal-band.pv-cal-band-break .pv-cal-band-n { background: rgba(19, 120, 107, .12); color: #13786B; }
/* 家人安排 · 寒暑假列表（用户 2026-11-02）：一段一行——类型小签 · 谁 · 起止 · 状态 · 备注，同一行高居中 */
.pv-kb-list { display: flex; flex-direction: column; }
.pv-kb-row { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 6px 8px; border: 0; border-bottom: 1px solid var(--pv-border); background: none; font: inherit; font-size: calc(13.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text); text-align: left; cursor: pointer; border-radius: 0; }
.pv-kb-row:last-child { border-bottom: 0; }
.pv-kb-row:hover { background: var(--pv-bg); }
.pv-kb-row.ro { cursor: default; }
.pv-kb-row.past { color: var(--pv-text-faint); }
.pv-kb-row .t { flex: none; height: 20px; padding: 0 7px; border-radius: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; white-space: nowrap; }
.pv-kb-row .t-winter { background: #E6F1FB; color: #1F5FA8; }
.pv-kb-row .t-summer { background: #FFF1DE; color: #B4610E; }
.pv-kb-row .t-other { background: var(--pv-bg); color: var(--pv-text-soft); }
.pv-kb-row.past .t { opacity: .6; }
.pv-kb-row .w { flex: none; font-weight: 600; white-space: nowrap; }
.pv-kb-row .r { flex: none; white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-kb-row .r i { font-style: normal; color: var(--pv-text-faint); }
.pv-kb-row .s { flex: none; height: 20px; padding: 0 7px; border-radius: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; white-space: nowrap; background: #E3F5F2; color: #13786B; }
.pv-kb-row.soon .s { background: var(--pv-bg); color: var(--pv-text-soft); }
.pv-kb-row .n { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text-faint); }
@media (max-width: 640px) {
  .pv-kb-row { flex-wrap: wrap; row-gap: 2px; }
  .pv-kb-row .n { flex-basis: 100%; }
}
/* Let's connect 人页「过去的」那组日期块（用户 2026-11-02）：浅绿底 = 做完了；字在框里正中（原来被 flex-start 顶到上沿） */
.pv-ct-person .pv-ct-plan-d.done { display: flex; align-items: center; justify-content: center; align-self: center; width: 52px; height: 30px; padding: 0; line-height: 30px; margin-right: 4px; border-radius: 8px; background: #E6F6EC; color: #237A45; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* 超级管理员 › 租户卡上「改成工作 / 家庭」（用户 2026-11-02）：跟种类小签同高的文字钮，点第一下变红问一句 */
.pv-tn-kindbtn { flex: none; height: 22px; padding: 0 8px; border: 1px dashed var(--pv-border); border-radius: 6px; background: none; font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; }
.pv-tn-kindbtn:hover { border-color: var(--pv-primary); color: var(--pv-primary); }
.pv-tn-kindbtn.ask { border-style: solid; border-color: var(--pv-danger); color: var(--pv-danger); }
/* ===== 小违和「今天还好」（用户 2026-11-02 方案 A）：一条 0 分 = 那天没犯 / 没感觉；格子画浅绿圆 ✓，跟「那天好了」的绿字 ✓ 分开 ===== */
.pv-bh3-card .cell .fine, .pv-bh3-legend i.fine { display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; border-radius: 50%; background: #e6f6ec; color: #2f9e5b; font-size: 9px; font-style: normal; font-weight: 800; line-height: 14px; }
.pv-bh3-card .acts .okb { min-width: 64px; padding: 0 9px; border: 0; background: #e6f6ec; color: #237a45; font-weight: 600; }
.pv-bh3-card .acts .okb:hover { background: #d6efdf; }
.pv-bh3-card .acts .okb.done { background: none; color: #2f9e5b; box-shadow: inset 0 0 0 1px #bfe6cc; }
.pv-bh3-card .acts .sec { width: auto; min-width: 46px; padding: 0 9px; }
.pv-bh3-fine { display: flex; align-items: center; gap: 8px; height: 30px; padding: 0 10px; border-radius: 8px; background: #e6f6ec; color: #237a45; font-weight: 700; font-size: 13px; margin: 6px 0; }
.pv-bh3-fine i { font-style: normal; font-weight: 400; font-size: 12px; color: #4f8a64; }
@media (max-width: 640px) {
  .pv-bh3-card .acts { flex-direction: column; align-items: stretch; justify-content: center; gap: 4px; margin-left: 6px; padding: 0 6px; }
  .pv-bh3-card .acts button { width: 100%; min-width: 0; height: 26px; padding: 0 4px; font-size: 12px; }
  .pv-bh3-card .acts .sec { display: none; }   /* 手机上「好了」收进详情抽屉（抽屉里有整宽的「今天好了」） */
}
/* 日历「小违和」页签的看板：全家按人分段（用户 2026-11-02） */
.pv-bh-board { padding: 0; }
.pv-bh-pgrp { margin-top: 14px; }
.pv-bh-pgrp:first-of-type { margin-top: 6px; }
.pv-bh-phead { display: flex; align-items: center; gap: 10px; min-height: 32px; margin: 0 0 6px; }
.pv-bh-phead .pv-bh-face { width: 28px; height: 28px; flex: none; }
.pv-bh-phead b { font-size: calc(15px + var(--pv-fz-add, 0px)); line-height: 20px; white-space: nowrap; }
.pv-bh-phead .n { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-bh-phead .pv-addbtn { margin-left: 6px; }
.pv-bh-pempty { padding: 6px 2px 2px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-cal-body.board { background: none; padding: 0; }   /* 日历整页白底（用户 2026-11-03）：不铺灰，卡片自己带一圈细边 */
/* 小违和看板（日历 / 项目里）都是白底（用户 2026-11-03）：卡片一圈细边，左边色条照旧画在上面 */
.pv-bh-board .pv-bh3-card { box-shadow: inset 0 0 0 1px var(--pv-border); }
.pv-bh-board .pv-bh3-card .acts { border-left-color: var(--pv-border); }
.pv-bh-boardbar { display: flex; align-items: center; gap: 12px; justify-content: flex-start; min-height: 32px; margin: 0 0 6px; }
.pv-bh-boardbar .pv-bh3-tip { flex: 1; min-width: 0; height: 30px; }
.pv-bh-src { display: inline-flex; align-items: center; gap: 4px; flex: none; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-bh-src a { color: var(--pv-text-soft); cursor: pointer; }
.pv-bh-src a:hover { color: var(--pv-primary); text-decoration: underline; }
.pv-bh-src a i { font-style: normal; color: var(--pv-text-faint); }
.pv-bh-cfgbtn { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; margin-left: 2px; border: 1px solid var(--pv-border); border-radius: 7px; background: var(--pv-surface); color: var(--pv-text-soft); cursor: pointer; }
.pv-bh-cfgbtn:hover { border-color: var(--pv-primary); color: var(--pv-primary); }
.pv-bh-cfg-pop.el-popover { padding: 12px 14px 10px; }
.pv-bh-cfg .t { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); margin-bottom: 8px; }
.pv-bh-cfg .row { display: flex; align-items: center; gap: 8px; min-height: 30px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; cursor: pointer; }
.pv-bh-cfg .row span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bh-cfg .row i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-bh-cfg .none, .pv-bh-cfg .sub { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); margin: 4px 0; }
.pv-bh-cfg .foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 8px; }
.pv-bh-cfg .foot button { height: 28px; padding: 0 14px; border-radius: 8px; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; }
.pv-bh-cfg .foot .x { border: 1px solid var(--pv-border); background: #fff; color: var(--pv-text-soft); }
.pv-bh-cfg .foot .ok { border: 1px solid var(--pv-primary); background: var(--pv-primary); color: #fff; }
@media (max-width: 640px) { .pv-bh-boardbar { flex-wrap: wrap; } .pv-bh-boardbar .pv-bh3-tip { flex-basis: 100%; order: 3; } }
/* 谁能赚钱头一次加载的占位（用户 2026-11-04）：跟加载完同样的圆角卡 + 图表区，淡灰轻闪，不再整块盖方角遮罩 */
.pv-scurve-skel .sk { height: 92px; border-radius: var(--pv-card-r); background: linear-gradient(90deg, #fff 0%, #f1f2f6 50%, #fff 100%); background-size: 200% 100%; animation: pv-skel 1.2s ease-in-out infinite; }
.pv-scurve-skel .sk.chart { height: 320px; margin-top: 12px; }
.pv-scurve-spin { font-size: 14px; color: var(--pv-text-faint); }
@keyframes pv-skel { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } }
/* ===== 股票看板 · 总览 / 其他持仓（用户 2026-11-04）：画布上的白卡；贡献横条涨绿跌红 ===== */
.pv-sb-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin: 0 0 12px; }
.pv-sb-head h3 { margin: 0; font-size: calc(18px + var(--pv-fz-add2, 0px)); line-height: 26px; font-weight: 700; white-space: nowrap; }
.pv-sb-head .sub { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 26px; color: var(--pv-text-faint); }
.pv-sb .pv-stat-card { border: 0; border-radius: var(--pv-card-r); }
.pv-sb-card { background: var(--pv-surface); border-radius: var(--pv-card-r); padding: 14px 16px; margin-bottom: 12px; min-width: 0; }
.pv-sb-t { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 20px; font-weight: 700; margin-bottom: 10px; }
.pv-sb-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.pv-sb-grid .pv-sb-card { margin-bottom: 12px; }
.pv-sb-attr .row { display: grid; grid-template-columns: minmax(80px, 160px) minmax(0, 1fr) 96px 44px; align-items: center; gap: 10px; min-height: 30px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-sb-attr .nm { display: flex; align-items: baseline; gap: 6px; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-sb-attr .nm i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); overflow: hidden; text-overflow: ellipsis; }
.pv-sb-attr .track { height: 10px; border-radius: 5px; background: #f1f2f5; overflow: hidden; }
.pv-sb-attr .bar { display: block; height: 100%; border-radius: 5px; background: var(--pv-text-faint); }
.pv-sb-attr .bar.up { background: var(--pv-success); }
.pv-sb-attr .bar.down { background: var(--pv-danger); }
.pv-sb-attr .v { text-align: right; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pv-sb-attr .v.up { color: var(--pv-success); } .pv-sb-attr .v.down { color: var(--pv-danger); }
.pv-sb-attr .share { text-align: right; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-sb-tablewrap { overflow-x: auto; }
.pv-sb-table td { text-align: right; padding: 9px 10px; border-bottom: 1px solid #f1f2f5; font-variant-numeric: tabular-nums; }
.pv-sb-table th.l, .pv-sb-table td.l { text-align: left; }
.pv-sb-table tr.link { cursor: pointer; }
.pv-sb-table tr.link:hover td { background: var(--pv-bg); }
.pv-sb-table td em { font-style: normal; margin-left: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); opacity: .8; }
.pv-sb-table td .note { font-style: normal; margin-left: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
@media (max-width: 860px) {
  .pv-sb-grid { grid-template-columns: 1fr; }
  .pv-sb-attr .row { grid-template-columns: 64px minmax(0, 1fr) 84px 36px; gap: 6px; }
  .pv-sb-attr .nm i { display: none; }
}
/* 股票看板：内容短（谁能赚钱加载中 / 总览）时灰画布也铺到窗口底，不再只铺半截（用户 2026-11-04） */
@media (min-width: 861px) { .pv-page.pv-modpage .pv-stock.split { min-height: calc(100dvh - var(--pv-topbar-h, 0px) - 65px); } }
/* 股票账本 ·「假如那天没操作」（用户 2026-11-04）：一排日期片 → 那天做了什么 → 实际 / 假如 / 差 三格 → 每只持仓的差 */
.pv-stock-wi { background: var(--pv-surface); border-radius: var(--pv-card-r); padding: 14px 16px; margin: 0 0 18px; }
.pv-stock-wi-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.pv-stock-wi-head > b { font-size: calc(14px + var(--pv-fz-add2, 0px)); line-height: 26px; white-space: nowrap; }
.pv-stock-wi-days { display: flex; flex-wrap: wrap; gap: 6px; }
.pv-stock-wi-days button { flex: none; height: 26px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 13px; background: var(--pv-surface); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); cursor: pointer; white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-stock-wi-days button:hover { border-color: var(--pv-primary); color: var(--pv-primary); }
.pv-stock-wi-days button.on { background: var(--pv-primary-soft); border-color: var(--pv-primary); color: var(--pv-primary-dark); font-weight: 600; }
.pv-stock-wi-ph { margin-top: 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-stock-wi-trades { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 10px 0; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 22px; color: var(--pv-text-soft); }
.pv-stock-wi-trades span { height: 22px; padding: 0 8px; border-radius: 6px; white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-stock-wi-trades span.buy { background: #eaf2fd; color: #1f5fa8; }
.pv-stock-wi-trades span.sell { background: #fdf0e6; color: #b4610e; }
.pv-stock-wi-cmp { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-bottom: 10px; }
.pv-stock-wi-cmp > div { display: flex; flex-direction: column; gap: 2px; padding: 10px 12px; border-radius: 10px; background: var(--pv-bg); min-width: 0; }
.pv-stock-wi-cmp i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-stock-wi-cmp b { font-size: 20px; line-height: 28px; font-variant-numeric: tabular-nums; }
.pv-stock-wi-cmp b.up { color: var(--pv-success); } .pv-stock-wi-cmp b.down { color: var(--pv-danger); }
.pv-stock-wi-cmp em { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-stock-wi-table td { text-align: right; padding: 8px 10px; border-bottom: 1px solid #f1f2f5; font-variant-numeric: tabular-nums; }
.pv-stock-wi-table th.l, .pv-stock-wi-table td.l { text-align: left; }
.pv-stock-wi-table tr.chg td { background: #fffaf0; }
.pv-stock-wi-table td.up { color: var(--pv-success); } .pv-stock-wi-table td.down { color: var(--pv-danger); }
@media (max-width: 640px) { .pv-stock-wi-cmp { grid-template-columns: 1fr; } }
/* ===== 和老人聊 · 按日子分列的看板（用户 2026-11-04，照飞书任务看板）：未规划在最左；列横着排、页面横向能滚；卡片拖到「未规划 / 今天 / 明天」改日子 ===== */
.pv-tb-board { display: flex; align-items: flex-start; gap: 14px; overflow-x: auto; padding-bottom: 12px; scrollbar-width: thin; }
.pv-tb-col { flex: 0 0 300px; display: flex; flex-direction: column; gap: 10px; min-height: 160px; padding: 10px; border-radius: var(--pv-card-r); background: #f6f7fa; transition: box-shadow .12s, background .12s; }
.pv-tb-col.k-none { background: #fff7e8; }   /* 未规划：淡橙底，提醒先去排日子 */
.pv-tb-col.over { box-shadow: inset 0 0 0 2px var(--pv-primary); background: var(--pv-primary-soft); }
.pv-tb-col-h { display: flex; align-items: center; gap: 8px; height: 28px; padding: 0 4px; }
.pv-tb-col-h b { font-size: calc(15px + var(--pv-fz-add2, 0px)); line-height: 20px; white-space: nowrap; }
.pv-tb-col-h span { font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-tb-col.k-over .pv-tb-col-h b { color: var(--pv-danger); }
.pv-tb-col > .pv-addbtn { align-self: flex-start; }
.pv-tb-col .pv-topic-card.sm { width: 100%; margin: 0; cursor: grab; min-height: 0; }   /* 看板里不用撑满 172 高：卡片高矮跟内容走 */
.pv-tb-col .pv-topic-card.dragging { opacity: .45; }
.pv-tb-col-empty { padding: 14px 6px; text-align: center; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-topic-plan { display: flex; align-items: center; gap: 6px; margin: 6px 0 0 30px; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; color: var(--pv-text-soft); white-space: nowrap; }
.pv-topic-plan.over { color: var(--pv-danger); }
.pv-topic-plan.today { color: var(--pv-primary-dark, var(--pv-primary)); font-weight: 600; }
.pv-topic-flags.sm .el-rate__icon { font-size: 13px; margin-right: 1px; }
@media (max-width: 640px) { .pv-tb-col { flex-basis: 82vw; } }
/* ===== 铺灰画布的页从空间链接（/s/编号）进来时（用户 2026-11-04：购物清单顶上一条白缝、底下一大截白）=====
   空间页外壳 .pv-home-cols 给普通白底页留了 上 14 / 下 48 的白；里面装的是灰画布（组件库 #3 / 财务那套）时这两段白就露出来。
   装画布的时候：外壳不留白、自己撑满可用高度，里面一层层往下撑，灰底从标题横线下一直铺到窗口底 */
.pv-page.pv-sp .pv-home-cols.solo:has(.pv-canvas-layout, .pv-fin-canvas) { padding: 0; min-height: 100%; display: flex; flex-direction: column; }
.pv-page.pv-sp .pv-home-cols.solo:has(.pv-canvas-layout, .pv-fin-canvas) > .pv-home-block,
.pv-page.pv-sp .pv-home-cols.solo:has(.pv-canvas-layout, .pv-fin-canvas) > .pv-home-block > .pv-block { flex: 1 0 auto; display: flex; flex-direction: column; margin: 0; }
.pv-page.pv-sp .pv-home-cols.solo .pv-block > .pv-canvas-layout, .pv-page.pv-sp .pv-home-cols.solo .pv-block > .pv-fin-canvas { flex: 1 0 auto; }
.pv-page.pv-sp > .pv-sp-body > .pv-fin-layout.pv-fin-canvas { padding-bottom: 0; }   /* 财务从空间链接进来：底下那 14 的白也去掉，灰铺到底 */
/* 财务那套画布（.pv-fin-canvas）也跟组件库 #3 一样：页面底下不留白、自己也不垫 14，灰铺到窗口底（用户 2026-11-04） */
.pv-page.pv-modpage:has(.pv-fin-canvas) { padding-bottom: 0; }
.pv-fin-layout.pv-fin-canvas { padding-bottom: 0; }
/* ===== 身体微调（用户 2026-11-04，原「身体健康」）：页面就是小违和看板，白底；周视图 7 天 × 早中晚 ===== */
.pv-page.pv-sp > .pv-sp-body.pv-bh-module { padding: 16px 0 32px; }
/* 跟其它模块一样铺浅灰画布（组件库 #3 的灰，用户 2026-11-04）：灰紧贴横线、铺到窗口右边和底；留白在画布里；卡片白底不描边 */
@media (min-width: 861px) {
  .pv-page:has(.pv-bh-module) { padding-right: 0; }
  .pv-page.pv-modpage:has(.pv-bh-module) { padding-bottom: 0; }
  .pv-page.pv-modpage > .pv-page:has(> .pv-sp-body.pv-bh-module) { padding-top: 0; padding-bottom: 0; }
  .pv-page.pv-modpage .pv-sp-body.pv-bh-module { min-height: calc(100dvh - var(--pv-topbar-h, 0px) - 65px); }
  .pv-sp-body.pv-bh-module, .pv-page.pv-sp > .pv-sp-body.pv-bh-module { padding: 16px 24px 32px 20px; box-sizing: border-box; background: var(--pv-canvas-bg); scrollbar-width: none; }
}
@media (max-width: 860px) {
  .pv-sp-body.pv-bh-module, .pv-page.pv-sp > .pv-sp-body.pv-bh-module { padding: 12px; border-radius: 12px; background: var(--pv-canvas-bg); }
}
.pv-bh-module .pv-bh-board .pv-bh3-card { box-shadow: none; }
.pv-bh-module .pv-bh-board .pv-bh3-card .acts { border-left-color: #eceef3; }
.pv-bh-module .el-loading-mask { background-color: rgba(246, 247, 250, .7); }
.pv-bh-module .pv-addbtn { background: var(--pv-surface); }
.pv-bh-module .pv-addbtn:hover { background: #e9ebf1; }
.pv-bh-module .pv-bh-pgrp:first-of-type { margin-top: 18px; }   /* 时间轴跟第一个人之间多空一点（原来 6） */
.pv-bh-zoom { margin-left: auto; border-radius: 8px; }
.pv-bh-zoom button { height: 26px; padding: 0 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-bh-boardbar .pv-bh-win { margin-left: 0; }
/* 周视图表头（用户 2026-11-04 二改）：日期 + 早中晚做成一条白色圆角时间轴，跟下面的白卡同一种料子；
   天与天之间只画一道短竖线；今天那一列整列铺浅琥珀（跟格子里今天的底同色），「今天」做成浮在上方的小胶囊，不占格子宽 */
.pv-bh3-head.wk { height: auto; row-gap: 0; margin-top: 18px; }
.pv-bh3-head.wk .wd { position: relative; display: flex; align-items: center; justify-content: center; min-width: 0; height: 28px; padding-top: 4px; box-sizing: border-box; background: var(--pv-surface); font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-bh3-head.wk .wd .t { overflow: hidden; text-overflow: ellipsis; }
.pv-bh3-head.wk .wd .t b { margin-right: 4px; font-weight: 600; color: var(--pv-text-soft); font-variant-numeric: tabular-nums; }
.pv-bh3-head.wk .wd + .wd::before { content: ""; position: absolute; left: 0; top: 50%; width: 1px; height: 22px; margin-top: -9px; background: var(--pv-border); }
.pv-bh3-head.wk .wd.today::before, .pv-bh3-head.wk .wd.today + .wd::before { display: none; }
.pv-bh3-head.wk .wd.today { background: #fdf6e9; color: var(--pv-primary-dark, var(--pv-primary)); }
.pv-bh3-head.wk .wd.today .t b { color: var(--pv-primary-dark, var(--pv-primary)); font-weight: 700; }
.pv-bh3-head.wk .wd .flag { position: absolute; left: 50%; top: -14px; transform: translateX(-50%); z-index: 1; height: 18px; padding: 0 8px; border-radius: 9px; background: var(--pv-primary); color: #fff; font-size: 11px; line-height: 18px; font-weight: 700; letter-spacing: .5px; box-shadow: 0 1px 4px rgba(0, 0, 0, .12); pointer-events: none; }
.pv-bh3-head.wk .sg { height: 24px; padding-bottom: 2px; box-sizing: border-box; background: var(--pv-surface); text-align: center; font-size: 10.5px; line-height: 22px; color: var(--pv-text-faint); }
.pv-bh3-head.wk .sg.today { background: #fdf6e9; color: var(--pv-primary-dark, var(--pv-primary)); font-weight: 600; }
/* 白条四个角：子项顺序 = 空 / 7 天 / 空 / 空 / 21 段 / 空 */
.pv-bh3-head.wk > :nth-child(2) { border-top-left-radius: 10px; }
.pv-bh3-head.wk > :nth-child(8) { border-top-right-radius: 10px; }
.pv-bh3-head.wk > :nth-child(11) { border-bottom-left-radius: 10px; }
.pv-bh3-head.wk > :nth-child(31) { border-bottom-right-radius: 10px; }
.pv-bh3-card .cell.segstart { box-shadow: inset 1px 0 0 var(--pv-border); }
/* 同一段记了几次：柱子顶上一个圆圈数字 */
.pv-bh3-card .cell .cnt { display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; border-radius: 50%; background: var(--c); color: #fff; font-size: 9.5px; font-style: normal; font-weight: 700; line-height: 15px; margin-bottom: 1px; }
/* 「＋ 记一次」选分 */
.pv-bh3-lv .t { font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text); margin-bottom: 6px; }
.pv-bh3-lv .chips { margin: 0 0 8px; }
.pv-bh3-lv .chips button { min-width: 34px; }
.pv-bh3-lv .chips button.on { background: oklch(0.6 0.17 30); color: #fff; }
.pv-bh3-lv .note { width: 100%; height: 30px; box-sizing: border-box; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 8px; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); outline: 0; margin-bottom: 8px; }
.pv-bh3-lv .note:focus { border-color: oklch(0.6 0.17 30); }
.pv-bh3-lv .foot .ok { border-color: oklch(0.6 0.17 30); background: oklch(0.6 0.17 30); }
/* Let's connect 人员抽屉（用户 2026-11-04）：头像离「基础信息」标题下那条线远一点；AI 填表默认折起，只剩一行可点的标题 */
.pv-dw-sec .pv-ct-av { margin-top: 14px; }
.pv-ct-aifill-tg { display: inline-flex; align-items: center; gap: 6px; padding: 0; border: 0; background: none; font: inherit; color: inherit; cursor: pointer; white-space: nowrap; }
.pv-ct-aifill-tg i { font-size: 12px; color: var(--pv-text-faint); }
.pv-ct-aifill-tg:hover, .pv-ct-aifill-tg:hover i { color: var(--pv-primary); }
.pv-dw-sec.pv-ct-aifill.folded { padding-bottom: 0; margin-bottom: 6px; }
/* 身体关注抽屉里的分类切换（用户 2026-11-04）：跟新加一项同一副，小一号；下面空一点再接名称 */
.pv-bh3-types.sm { margin: 10px 0 12px; }
.pv-bh3-types.sm button { padding: 6px 10px; }
.pv-bh3-types.sm button b { font-size: 13px; }
/* 身体关注看板：工具条 + 日期轴吸顶（用户 2026-11-04），底色跟画布一样，下面滚过去的卡片被盖住 */
.pv-bh-module .pv-bh-stick { position: sticky; top: var(--pv-topbar-h, 0px); z-index: 6; margin: -16px 0 0; padding: 16px 0 6px; background: var(--pv-canvas-bg, #f6f7fa); }
.pv-bh-module .pv-bh-stick .pv-bh3-head { margin-bottom: 0; }
/* ===== 节假日增删改（用户 2026-11-04，设计稿「节假日 · 列表 / 编辑抽屉」） ===== */
.pv-hol-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 12px 0 10px; }
.pv-hol-bar-sep { flex: none; width: 1px; height: 16px; margin: 0 4px; background: var(--pv-border); }
.pv-hol-reg { border-radius: 8px; }
.pv-hol-reg button { height: 28px; padding: 0 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-hol-reg button i { font-style: normal; margin-left: 2px; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-hol-reg button.on i { color: inherit; opacity: .7; }
.pv-hol-name.can { cursor: pointer; }
.pv-hol-name.can:hover { color: var(--pv-primary-dark); text-decoration: underline; text-decoration-color: rgba(201, 125, 7, .4); text-underline-offset: 3px; }
.pv-hol-mine { display: inline-flex; align-items: center; height: 18px; margin-left: 6px; padding: 0 6px; border-radius: 4px; background: var(--pv-info-soft); color: var(--pv-info-text); font-size: 11px; font-weight: 600; vertical-align: 1px; }
.el-dropdown-menu__item.pv-hol-danger { color: var(--pv-danger); }
.pv-hol-hidden { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; margin-top: 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-hol-hidden .one { display: inline-flex; align-items: center; gap: 6px; }
.pv-hol-hidden .one button { padding: 0; border: 0; background: none; color: var(--pv-primary-dark); font: inherit; cursor: pointer; }
.pv-hol-hidden .one button:hover { text-decoration: underline; }
/* 编辑抽屉 */
.pv-hol-src { margin-left: 8px; padding: 0 7px; border-radius: 4px; background: var(--pv-bg); color: var(--pv-text-faint); font-size: 11.5px; line-height: 20px; white-space: nowrap; }
.pv-hol-regs { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.pv-hol-regbtn { height: 28px; padding: 0 14px; border: 1px solid var(--pv-border); border-radius: var(--pv-radius-pill); background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-hol-regbtn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.pv-hol-regbtn.on { border-color: var(--pv-primary); background: var(--pv-primary-soft); color: var(--pv-primary-dark); font-weight: 600; }
.pv-hol-regbtn.dash { border-style: dashed; color: var(--pv-text-faint); }
.pv-hol-regin { width: 140px; }
.pv-hol-years { display: flex; flex-direction: column; border: 1px solid var(--pv-border); border-radius: 10px; overflow: hidden; }
.pv-hol-yr { display: grid; grid-template-columns: 40px minmax(0, 1fr) auto minmax(0, 1fr) minmax(0, 1.2fr) 26px; align-items: center; gap: 6px; padding: 6px 8px 6px 12px; }
.pv-hol-yr + .pv-hol-yr { border-top: 1px solid var(--pv-border); }
.pv-hol-yr > b { font-size: 13px; font-variant-numeric: tabular-nums; color: var(--pv-text); }
.pv-hol-yr.gone > b { color: var(--pv-text-faint); }
.pv-hol-yr .to { font-size: 12px; color: var(--pv-text-faint); }
.pv-hol-yr .el-date-editor.el-input { width: auto; }
.pv-hol-yr .el-input__inner { padding-left: 28px; padding-right: 6px; }
.pv-hol-yr .nt .el-input__inner { padding-left: 10px; }
.pv-hol-addyr { align-self: flex-start; margin-top: 8px; height: 28px; padding: 0 10px; border: 0; border-radius: 7px; background: var(--pv-bg); color: #4a4f60; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-hol-addyr::before { content: "＋ "; }
.pv-hol-addyr:hover { background: #e9ebf1; color: var(--pv-text); }
.pv-hol-edfoot { display: flex; align-items: center; gap: 8px; }
.pv-hol-edfoot .sp { flex: 1; }
.pv-hol-hidebtn { height: 28px; padding: 0 8px; border: 0; border-radius: 7px; background: none; color: var(--pv-danger); font: inherit; font-size: calc(13px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-hol-hidebtn:hover { background: #FDECEC; }
.pv-drawer.pv-hol-ed { width: min(560px, 100vw); }
@media (max-width: 640px) {
  .pv-hol-yr { grid-template-columns: 40px minmax(0, 1fr) auto minmax(0, 1fr) 26px; }
  .pv-hol-yr .nt { grid-column: 2 / 5; }
}
/* 总览「各账户」类型小签（用户 2026-11-04）：自选 = 模拟账，集中 = 其他持仓 */
.pv-sb-kind { display: inline-flex; align-items: center; height: 20px; padding: 0 8px; border-radius: 6px; font-size: 12px; line-height: 20px; font-weight: 600; white-space: nowrap; flex-shrink: 0; }
.pv-sb-kind.sim { background: #eef2fb; color: #3d5a99; }
.pv-sb-kind.hold { background: #fdf3e3; color: #a2620b; }
/* 节假日表（用户 2026-11-04）：「⋯」那列撤了，整行可点开编辑抽屉 */
.pv-hol-tbl .el-table__row, .pv-hol-item.can { cursor: pointer; }
/* 页面本身窄（两边栏都开着的 MacBook，不止手机）就换成一列卡片，不再出横向滚动条 */
.pv-hol { container-type: inline-size; }
@container (max-width: 880px) {
  .pv-hol-tbl { display: none; }
  .pv-hol-list { display: block; }
}
/* 计次「记一笔」（用户 2026-11-04）：「记录」小框和那天弹窗同一套——多一行备注；弹窗里分「记一笔 / 这天已记」两段 */
.pv-bh3-amt .note { display: block; width: 100%; height: 30px; box-sizing: border-box; padding: 0 10px; margin: 0 0 10px; border: 1px solid var(--pv-line, #e3e5ea); border-radius: 8px; font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); outline: 0; }
.pv-bh3-amt .note:focus { border-color: oklch(0.55 0.13 250); }
.pv-bh3-dlg .pv-bh3-amt .foot .x { display: none; }   /* 弹窗右下角有「好」，小框里的取消不重复 */
.pv-bh3-rec .pv-bh3-amt .chips { margin-bottom: 8px; }
.pv-bh3-dlgsec { margin: 4px 0 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 700; color: var(--pv-text-soft); }
.pv-bh3-dlgsec + .pv-bh3-rec, .pv-bh3-amt + .pv-bh3-dlgsec { margin-top: 14px; }
/* 计次「记一笔」统一成一个弹窗（用户 2026-11-04 二改）：「记录」、点格子、详情里点一条都弹它。
   记在哪天哪一段一行（日期 + 现在 / 早 / 中 / 晚）；数字框不要浏览器自带的上下小箭头（点一下 +1 那种跟常用值两套逻辑） */
.pv-bh3-when { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 0 0 10px; }
.pv-bh3-when .segs { display: inline-flex; padding: 3px; border-radius: 9px; background: #f0f1f5; }
.pv-bh3-when .segs button { height: 24px; padding: 0 12px; border: 0; border-radius: 6px; background: transparent; color: var(--pv-text-soft); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-bh3-when .segs button.on { background: var(--pv-surface); color: var(--pv-text); font-weight: 600; box-shadow: 0 1px 3px rgba(25, 27, 35, .12); }
.pv-bh3-amt input[type=number] { -moz-appearance: textfield; appearance: textfield; }
.pv-bh3-amt input[type=number]::-webkit-outer-spin-button, .pv-bh3-amt input[type=number]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.pv-bh3-dlg.el-dialog { max-width: calc(100vw - 24px); }
/* 盘前 / 盘后价（用户 2026-11-04）：现价底下一行小字，灰色，涨跌照涨绿跌红 */
.pv-ext-px { display: block; margin-top: 2px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); line-height: 16px; font-weight: 400; color: var(--pv-text-faint); white-space: nowrap; font-variant-numeric: tabular-nums; }
.pv-ext-px b { font-weight: 600; }
.pv-ext-px b.up { color: var(--pv-success); }
.pv-ext-px b.down { color: var(--pv-danger); }
.pv-watch-price .pv-ext-px { margin-top: 0; }
/* 其他持仓 Buying power 卡（用户 2026-11-04）：点卡片就地填 raw，回车存、Esc 退 */
.pv-sb-bp.can { cursor: pointer; }
.pv-sb-bp.can:hover { box-shadow: inset 0 0 0 1px var(--pv-border); }
.pv-sb-bpin { display: flex; align-items: center; gap: 6px; height: 36px; margin: 4px 0; }
.pv-sb-bpin span { flex: none; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-sb-bpin input { flex: 1; min-width: 0; height: 32px; padding: 0 10px; border: 1px solid var(--pv-primary); border-radius: 8px; font: inherit; font-size: 18px; font-weight: 700; font-variant-numeric: tabular-nums; outline: 0; }
/* ===== 抽屉规范 v2（用户 2026-11-04 逐条确认，设计稿「右侧抽屉」①–⑨；docs/DRAWER_STYLE.md v2）=====
   ① 字号：标签 12.5 / 600 / 次深灰、不加字距；提示 12；标题 17，下面一行 12.5 副标题（.pv-drawer-sub，写改的是谁 / 改了就存）
   ② 宽度只两档：标准 480（默认、.narrow）/ 宽 600（.wide、.task、日记）；带大纲的各加 170。手机（≤640）照旧铺满 */
.pv-drawer-lab { margin: 14px 0 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; letter-spacing: 0; color: var(--pv-text-soft); }
.pv-drawer-hint { font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-drawer .pv-adm-sub { font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-drawer-title { font-size: calc(17px + var(--pv-fz-add, 0px)); }
.pv-drawer-tt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pv-drawer-tt > .pv-drawer-title { flex: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-drawer-sub { font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 18px; color: var(--pv-text-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-drawer-head:has(.pv-drawer-tt) { align-items: flex-start; }
.pv-drawer-head:has(.pv-drawer-tt) .pv-drawer-x { margin-top: 1px; }
@media (min-width: 641px) {
  .pv-drawer, .pv-drawer.narrow { width: min(480px, 92vw); }
  .pv-drawer.wide, .pv-drawer.task, .pv-drawer.pv-diary-dialog, .pv-drawer.pv-hol-ed { width: min(600px, 96vw); }
  .pv-drawer.has-outline, .pv-drawer.has-outline.narrow { width: min(650px, 96vw); }
  .pv-drawer.has-outline.wide, .pv-drawer.has-outline.task, .pv-drawer.has-outline.pv-diary-dialog { width: min(770px, 96vw); }
}
@media (min-width: 1800px) {
  .pv-drawer.has-outline, .pv-drawer.has-outline.narrow { width: min(680px, 96vw); }
  .pv-drawer.has-outline.wide, .pv-drawer.has-outline.task, .pv-drawer.has-outline.pv-diary-dialog { width: min(800px, 96vw); }
}
@media (min-width: 641px) and (max-width: 760px) {
  .pv-drawer.has-outline, .pv-drawer.has-outline.narrow { width: min(480px, 92vw); }
  .pv-drawer.has-outline.wide, .pv-drawer.has-outline.task, .pv-drawer.has-outline.pv-diary-dialog { width: min(600px, 96vw); }
}
/* ⑥ 底部：左「删除」（浅红底 .pv-btn-danger-soft）/「更多 ▾」，右「取消 · 添加 / 保存」 */
.pv-drawer-foot > .pv-btn-danger-soft, .pv-drawer-foot > .pv-drawer-more { margin-right: auto; }
.pv-drawer-foot > .pv-drawer-more + .pv-btn-danger-soft { margin-right: 0; }
/* ⑦ 次要动作收进「更多 ▾」：el-dropdown 套一颗跟底部按钮同高的描边钮 */
.pv-drawer-more .pv-drawer-morebtn { height: 30px; padding: 0 12px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: 13px; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; }
.pv-drawer-more .pv-drawer-morebtn:hover { border-color: var(--pv-primary); color: var(--pv-primary-dark); }
.el-dropdown-menu__item.pv-drawer-more-danger { color: var(--pv-danger); }
/* 左栏数字后面的小字签（用户 2026-11-04）：自选账的总盈亏率带「总」，跟总览 / 其他持仓的今天涨跌区分 */
.pv-snav-ntag { display: inline-flex; align-items: center; justify-content: center; height: 16px; margin-left: 4px; padding: 0 4px; border-radius: 4px; background: #eef0f4; color: var(--pv-text-soft); font-style: normal; font-size: 10.5px; line-height: 16px; font-weight: 600; vertical-align: 1px; white-space: nowrap; }
/* 其他持仓「操作」：按天一组 */
.pv-sb-day + .pv-sb-day { margin-top: 12px; }
.pv-sb-day .hd { display: flex; align-items: center; gap: 8px; height: 30px; padding: 0 2px; border-bottom: 1px solid #f1f2f5; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; }
.pv-sb-day .hd .n { color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-sb-day .sp { flex: 1; }
.pv-sb-day .hd .eff { color: var(--pv-text-soft); font-size: calc(12.5px + var(--pv-fz-add, 0px)); white-space: nowrap; }
.pv-sb-day .hd .eff b.up, .pv-sb-day .tr .eff.up { color: var(--pv-success); }
.pv-sb-day .hd .eff b.down, .pv-sb-day .tr .eff.down { color: var(--pv-danger); }
.pv-sb-day .tr { display: flex; align-items: center; gap: 10px; min-height: 34px; padding: 0 2px; border-bottom: 1px solid #f6f7f9; font-size: calc(13px + var(--pv-fz-add, 0px)); line-height: 20px; font-variant-numeric: tabular-nums; }
.pv-sb-day .tr.link { cursor: pointer; }
.pv-sb-day .tr.link:hover { background: var(--pv-bg); }
.pv-sb-day .tr .side { flex: none; height: 20px; padding: 0 7px; border-radius: 5px; font-size: 12px; line-height: 20px; font-weight: 600; white-space: nowrap; }
.pv-sb-day .tr .side.buy { background: #e7f6ec; color: var(--pv-success); }
.pv-sb-day .tr .side.sell { background: #fdecec; color: var(--pv-danger); }
.pv-sb-day .tr .qp { color: var(--pv-text); white-space: nowrap; }
.pv-sb-day .tr .amt { color: var(--pv-text-faint); white-space: nowrap; }
.pv-sb-day .tr .note { font-style: normal; color: var(--pv-text-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.pv-sb-day .tr .eff { font-weight: 600; white-space: nowrap; }
.pv-sb-sideseg { display: inline-flex; margin-bottom: 4px; border-radius: 8px; }
.pv-sb-sideseg button { height: 28px; padding: 0 16px; }
.pv-sb-have { margin-left: 8px; font-weight: 400; color: var(--pv-text-faint); }
.pv-sb-tamt { margin-top: 8px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); font-variant-numeric: tabular-nums; }
/* 身体关注「还好」✓ 统一（用户 2026-11-04）：绿底白勾（原来浅绿底绿勾）；右边「今天还好」跟「记录」一样大小，绿底白字 */
.pv-bh3-card .cell .fine, .pv-bh3-card .cell .ok, .pv-bh3-legend i.fine { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; background: #2f9e5b; color: #fff; font-size: 10px; font-style: normal; font-weight: 800; line-height: 16px; }
.pv-bh3-card .acts .okb { width: 84px; min-width: 0; padding: 0; border: 0; background: #2f9e5b; color: #fff; font-weight: 600; }
.pv-bh3-card .acts .okb:hover { background: #278a4f; }
.pv-bh3-card .acts .okb.done { background: #2f9e5b; color: #fff; box-shadow: none; opacity: .55; }
.pv-bh3-dlgf .pv-bh3-okbtn { border-color: #2f9e5b; background: #2f9e5b; color: #fff; }
.pv-bh3-dlgf .pv-bh3-okbtn:hover, .pv-bh3-dlgf .pv-bh3-okbtn:focus { border-color: #278a4f; background: #278a4f; color: #fff; }
@media (max-width: 640px) { .pv-bh3-card .acts .okb { width: 100%; } }
/* 总览「今天涨跌来自哪里」标题右边的 按账户 / 按个股 切换（用户 2026-11-04） */
.pv-sb-thead { display: flex; align-items: center; gap: 12px; }
.pv-sb-byseg { margin-left: auto; border-radius: 8px; }
.pv-sb-byseg button { height: 26px; padding: 0 12px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 400; }
/* 股票看板总览 / 其他持仓四张卡（用户 2026-11-04）：手机上两列两行，不再 3 + 1、也不挤出屏 */
@media (max-width: 640px) { .pv-sb .pv-stock-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* 股票看板数字卡（用户 2026-11-04）：左上小标题和大数字之间拉开一点 */
.pv-stock-cards .pv-stat-card .k { margin-bottom: 6px; }
/* 股票板块（用户 2026-11-04）：小签 AI 紫、其他灰；点了变下拉 */
.pv-sect { display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 8px; border-radius: 6px; background: #eef0f4; color: var(--pv-text-soft); font-size: 12px; line-height: 20px; font-weight: 600; white-space: nowrap; flex-shrink: 0; }
.pv-sect.ai { background: #efeafd; color: #5b3fd1; }
.pv-sect.can { cursor: pointer; }
.pv-sect.can:hover { box-shadow: inset 0 0 0 1px currentColor; }
.pv-sect i { font-style: normal; font-weight: 400; opacity: .75; }
.pv-sect-sel { width: 120px; }
.pv-sb-sectsum { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
.pv-sb-sectq { margin-bottom: 8px; }
.pv-sb-sectin { width: 220px; max-width: 100%; height: 30px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 8px; font: inherit; font-size: 13px; outline: 0; box-sizing: border-box; }
.pv-sb-sectin:focus { border-color: var(--pv-primary); }
.pv-sb-src { font-size: 12px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-sb-reset { font-size: 12px; color: var(--pv-primary-dark, var(--pv-primary)); cursor: pointer; white-space: nowrap; }
/* 股票看板（用户 2026-11-04 二次）：风控卡、所有数字卡的小标题和数字拉开；代码后面的板块小签小一号 */
.pv-risk-item .k, .pv-stock .pv-stat-card .k { margin-bottom: 6px; }
.pv-sect-sm { height: 18px; margin-left: 6px; padding: 0 5px; font-size: 11px; line-height: 18px; vertical-align: 1px; }
/* 身体关注顶上「还好」开关（用户 2026-11-04）：在周月季年左边，开着 = 绿底白勾的小圆 + 字；关着灰。高度跟旁边分段钮一样 26 */
.pv-bh-boardbar .pv-bh-finetg { margin-left: auto; }
.pv-bh-boardbar .pv-bh-finetg + .pv-bh-zoom { margin-left: 0; }
.pv-bh-finetg { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 8px; background: var(--pv-surface); color: var(--pv-text-faint); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); line-height: 24px; cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.pv-bh-finetg i { display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; border-radius: 50%; background: #c9ccd6; color: #fff; font-size: 9px; font-style: normal; font-weight: 800; line-height: 14px; }
.pv-bh-finetg.on { border-color: #bfe6cc; background: #f1f8f3; color: #237a45; }
.pv-bh-finetg.on i { background: #2f9e5b; }
/* 总览「持仓汇总」对账表（用户 2026-11-06） */
.pv-sb-tsub { margin-left: 10px; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 400; color: var(--pv-text-faint); }
.pv-sb-recon td.dim { color: var(--pv-text-faint); }
.pv-sb-extt { display: block; font-style: normal; font-size: 11px; line-height: 14px; color: var(--pv-text-faint); }
.pv-sb-recon tr.sum td { background: #fafbfc; color: var(--pv-text-soft); }
.pv-sb-recon tr.sum.total td { background: #f3f5f9; color: var(--pv-text); }
.pv-sb-recon tr.sum td.l { font-weight: 600; }

/* ===== 小违和 · 一项一个页面（2026-11-09，设计稿「小违和详情页」）：原详情抽屉 + 任务 + 评论 =====
   电脑：顶上一块头（人 · 名称 · 两枚小签 · 不再关注 / 记一次），下面左宽右窄两栏：左 走势 / 任务 / 评论，右 每次记录 / 设置。
   手机：两栏叠起来，头下面三个页签 记录 / 任务 / 评论 */
.pv-bhd { display: flex; flex-direction: column; gap: 14px; padding: 4px 0 32px; }
.pv-bhd-crumb { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--pv-text-soft); min-width: 0; }
.pv-bhd-crumb .back { display: inline-flex; align-items: center; gap: 4px; border: 0; background: none; padding: 4px 6px 4px 0; font: inherit; color: var(--pv-text-soft); cursor: pointer; }
.pv-bhd-crumb .back:hover { color: var(--pv-primary-dark); }
.pv-bhd-crumb b { font-weight: 500; color: var(--pv-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-bhd-head { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 20px; padding: 18px 20px; background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius); }
.pv-bhd-face { width: 44px; height: 44px; font-size: 16px; flex: none; }
.pv-bhd-face img { width: 100%; height: 100%; object-fit: cover; }
.pv-bhd-head .tt { flex: 1 1 320px; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.pv-bhd-head .l1 { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.pv-bhd-head h1 { margin: 0; font-size: calc(22px + var(--pv-fz-add2, 0px)); line-height: 30px; font-weight: 700; color: var(--pv-text); }
.pv-bhd-head .l2 { font-size: 13px; color: var(--pv-text-soft); }
.pv-bhd-head .l3 { font-size: 13px; color: var(--pv-text-soft); }
.pv-bhd-head .acts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.pv-bhd-tag { display: inline-flex; align-items: center; height: 22px; padding: 0 8px; border-radius: 6px; font-size: 12px; font-weight: 600; white-space: nowrap; }
.pv-bhd-tag.pain { background: var(--pv-danger-soft); color: var(--pv-danger-text); }
.pv-bhd-tag.count { background: var(--pv-info-soft); color: var(--pv-info-text); }
.pv-bhd-tag.on { background: var(--pv-warning-soft); color: #8a5a00; }
.pv-bhd-tag.off { background: var(--pv-success-soft); color: var(--pv-success-text); }
.pv-bhd-heal { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 14px; border: 1px solid var(--pv-success-border); border-radius: var(--pv-radius-btn); background: var(--pv-success-soft); color: var(--pv-success-text); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; }
.pv-bhd-heal:hover { border-color: #93cf9d; }
.pv-bhd-heal i { font-style: normal; font-weight: 700; }
.pv-bhd-cols { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 14px; }
.pv-bhd-main { flex: 999 1 560px; min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.pv-bhd-side { flex: 1 1 320px; min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.pv-bhd-card { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius); padding: 16px 18px; display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.pv-bhd-card > .hd { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.pv-bhd-card > .hd h2 { margin: 0; font-size: 15px; font-weight: 700; color: var(--pv-text); }
.pv-bhd-card > .hd .sub { font-size: 12.5px; color: var(--pv-text-faint); }
.pv-bhd-card > .hd .pv-bhd-seg { margin-left: auto; }
.pv-bhd-seg button { height: 26px; padding: 0 10px; font-size: 12.5px; }
/* 走势：一列一格，柱子从底往上；点一列 = 开那天的弹窗（看 / 改 / 补记） */
.pv-bhd-chart { display: grid; gap: 2px; height: 128px; align-items: end; border-bottom: 1px solid var(--pv-border); }
.pv-bhd-chart .col { position: relative; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; border: 0; padding: 0 0 3px; background: none; border-radius: 4px 4px 0 0; cursor: pointer; font: inherit; min-width: 0; }
.pv-bhd-chart .col:hover { background: var(--pv-bg); }
.pv-bhd-chart .col.today { background: var(--pv-primary-soft); }
.pv-bhd-chart .bar { display: block; width: min(16px, 70%); border-radius: 3px 3px 0 0; }
.pv-bhd-chart em { font-style: normal; font-size: 11px; line-height: 14px; color: var(--pv-text-soft); font-variant-numeric: tabular-nums; margin-bottom: 2px; }
.pv-bhd-chart .fine { font-size: 12px; color: #2f8f4e; font-weight: 700; }
.pv-bhd-axis { display: grid; gap: 2px; font-size: 11px; color: var(--pv-text-faint); text-align: center; white-space: nowrap; }
.pv-bhd-axis span { overflow: visible; }
.pv-bhd-axis .today { color: var(--pv-primary-dark); font-weight: 600; }
.pv-bhd-kv { display: grid; grid-template-columns: 64px minmax(0, 1fr); align-items: center; gap: 10px; padding-top: 10px; border-top: 1px solid var(--pv-border); }
.pv-bhd-kv label { font-size: 12.5px; color: var(--pv-text-soft); }
.pv-bhd-kv.col { grid-template-columns: 1fr; gap: 6px; border-top: 0; padding-top: 0; }
.pv-bhd-danger { display: flex; justify-content: flex-end; padding-top: 4px; }
/* 任务：照项目管理任务的一行——圈圈、标题（点了改）、子任务数、截止、负责人、悬停出加子任务 / 删 */
.pv-bhd-card .pv-addrow { margin: 0; }
.pv-bhd-addt { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--pv-primary); border-radius: 10px; background: #fffaf0; }
.pv-bhd-addt .tt { flex: 1 1 200px; min-width: 0; height: 30px; border: 0; background: transparent; font: inherit; font-size: 14px; color: var(--pv-text); outline: none; }
.pv-bhd-addt .ck, .pv-bhd-task.add .ck { width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid #bdc1cd; box-sizing: border-box; flex: none; }
.pv-bhd-owner { width: 112px; }
.pv-bhd-due { width: 140px !important; }
.pv-bhd-tasks { display: flex; flex-direction: column; }
.pv-bhd-task { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 4px 4px; border-bottom: 1px solid #f0f1f5; }
.pv-bhd-task.sub { padding-left: 30px; min-height: 34px; border-bottom-color: transparent; }
.pv-bhd-task.sub + .pv-bhd-task:not(.sub) { border-top: 1px solid #f0f1f5; }
.pv-bhd-task .ck { width: 18px; height: 18px; flex: none; border-radius: 50%; border: 1.5px solid #bdc1cd; background: var(--pv-surface); padding: 0; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; }
.pv-bhd-task .ck:hover { border-color: #16a34a; }
.pv-bhd-task.sub .ck { width: 16px; height: 16px; }
.pv-bhd-task .ck.on { background: #16a34a; border-color: #16a34a; }
.pv-bhd-task .tt { flex: 1; min-width: 0; text-align: left; border: 0; background: none; padding: 4px 0; font: inherit; font-size: 14px; color: var(--pv-text); cursor: text; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bhd-task.sub .tt { font-size: 13.5px; }
.pv-bhd-task .tt.edit { height: 30px; padding: 0 8px; border: 1px solid var(--pv-primary); border-radius: 6px; background: var(--pv-surface); outline: none; cursor: text; }
.pv-bhd-task.done .tt { color: var(--pv-text-faint); text-decoration: line-through; }
.pv-bhd-task .subn i { font-style: normal; }
.pv-bhd-task .subn { flex: none; font-size: 12px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-bhd-task .ops { flex: none; display: inline-flex; gap: 2px; opacity: 0; transition: opacity .12s; }
.pv-bhd-task:hover .ops, .pv-bhd-task:focus-within .ops { opacity: 1; }
.pv-bhd-task .ops button { width: 26px; height: 26px; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.pv-bhd-task .ops button:hover { background: var(--pv-bg); color: var(--pv-text); }
/* 行里的截止 / 负责人：平时像小签，没填时只露占位字；点了是 Element 的选择器 */
.pv-bhd-task .pv-bhd-due.sm { width: 112px !important; flex: none; }
.pv-bhd-task .pv-bhd-owner.sm { width: 84px; flex: none; }
.pv-bhd-task .pv-bhd-due.sm .el-input__inner, .pv-bhd-task .pv-bhd-owner.sm .el-input__inner { height: 24px; line-height: 24px; border-color: transparent; background: var(--pv-bg); border-radius: 5px; font-size: 12px; color: var(--pv-text-soft); padding-left: 8px; padding-right: 20px; }
.pv-bhd-task .pv-bhd-due.sm .el-input__prefix { display: none; }
.pv-bhd-task .pv-bhd-due.sm .el-input__icon { line-height: 24px; }
.pv-bhd-task .pv-bhd-owner.sm .el-input__icon { line-height: 24px; }
.pv-bhd-task .pv-bhd-due.sm.over .el-input__inner { background: var(--pv-danger-soft); color: var(--pv-danger-text); font-weight: 600; }
.pv-bhd-task .pv-bhd-due.sm:hover .el-input__inner, .pv-bhd-task .pv-bhd-owner.sm:hover .el-input__inner { border-color: var(--pv-border); }
.pv-bhd-none { padding: 10px 2px; font-size: 13px; color: var(--pv-text-faint); }
.pv-bhd-donebar { align-self: flex-start; border: 0; background: none; padding: 10px 2px 2px; font: inherit; font-size: 13px; color: var(--pv-text-soft); cursor: pointer; }
.pv-bhd-donebar em { font-style: normal; margin-left: 4px; }
.pv-bhd-tabs { display: none; }
@media (max-width: 640px) {
  .pv-bhd { gap: 10px; padding-bottom: 24px; }
  .pv-bhd-head { padding: 14px; gap: 10px 12px; }
  .pv-bhd-face { width: 36px; height: 36px; font-size: 14px; }
  .pv-bhd-head h1 { font-size: 19px; line-height: 26px; }
  .pv-bhd-head .acts { width: 100%; }
  .pv-bhd-head .acts > * { flex: 1; }
  .pv-bhd-head .acts .el-button, .pv-bhd-heal { width: 100%; height: 40px; justify-content: center; }
  .pv-bhd-tabs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: var(--pv-radius); overflow: hidden; }
  .pv-bhd-tabs button { height: 44px; border: 0; background: none; font: inherit; font-size: 15px; color: var(--pv-text-soft); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 4px; }
  .pv-bhd-tabs button i { font-style: normal; font-size: 12px; color: var(--pv-text-faint); }
  .pv-bhd-tabs button.on { color: var(--pv-text); font-weight: 700; box-shadow: inset 0 -2px 0 var(--pv-primary); }
  .pv-bhd-tabs button.on i { color: var(--pv-primary-dark); }
  .pv-bhd-cols, .pv-bhd-main, .pv-bhd-side { gap: 10px; }
  .pv-bhd-card { padding: 14px; }
  .pv-bhd-chart { height: 96px; }
  .pv-bhd-task { flex-wrap: wrap; min-height: 44px; row-gap: 4px; }
  .pv-bhd-task:not(.sub) .tt { flex: 1 1 calc(100% - 10px); white-space: normal; }
  /* 第二行（子任务数 / 截止 / 负责人 / 按钮）跟标题左边对齐：整行留 32 的左边距，圈圈用负边距挂回去 */
  .pv-bhd-task:not(.sub) { padding-left: 32px; }
  .pv-bhd-task:not(.sub) > .ck { margin-left: -30px; }
  .pv-bhd-task { column-gap: 8px; }
  .pv-bhd-task .subn i { display: none; }
  .pv-bhd-task .pv-bhd-due.sm { width: 92px !important; }
  .pv-bhd-task .pv-bhd-owner.sm { width: 70px; }
  .pv-bhd-task .ops { opacity: 1; margin-left: auto; }
  .pv-bhd-task .ck { width: 22px; height: 22px; }
  .pv-bhd-addt .pv-bhd-owner, .pv-bhd-addt .pv-bhd-due { flex: 1 1 120px; width: auto !important; }
}

/* 小违和详情页走势图（用户 2026-11-10）：一天记了好几次，柱顶圆圈写几次（跟看板同款）；只记了「还好」的绿底白勾 */
.pv-bhd-chart .cnt { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; margin-bottom: 2px; border-radius: 50%; color: #fff; font-size: 10px; font-style: normal; font-weight: 700; line-height: 16px; font-variant-numeric: tabular-nums; }
.pv-bhd-chart .fine { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; background: #2f9e5b; color: #fff; font-size: 10px; font-weight: 800; line-height: 16px; }
/* 灰底上的白卡一律带一圈浅灰边（用户 2026-11-10：小违和详情页那种「白卡 + 浅灰边」好看，全站照它）——
   这里列的是原来写了 border: 0 或没写边框的那些（用 --pv-card-r 圆角的白卡）；本来就有边的不重复写。
   以后新加灰底白卡：圆角用 --pv-card-r，边框用 1px solid var(--pv-border) */
.pv-ct-ov-card,
.pv-ct-sum-card,
.pv-fd-mf,
.pv-ct-person .pv-pmo-sec,
.pv-canvas-card,
.pv-canvas-layout .pv-bh-box,
.pv-fin-canvas .pv-cp-list,
.pv-fin-canvas .pv-cp-rows,
.pv-canvas-layout .pv-fold-main .pv-home-block > .pv-block,
.pv-canvas-layout .pv-fold-main .pv-home-rail,
.pv-canvas-layout .pv-gt-card,
.pv-canvas-layout .pv-tc,
.pv-pmo-canvas .pv-pmo-sec,
.pv-canvas-layout .pv-stock-cards .pv-stat,
.pv-canvas-layout .pv-stock-table,
.pv-canvas-layout .pv-stat-card,
.pv-canvas-layout .pv-table-wrap,
.pv-pmo-canvas .pv-ck-stats > .pv-ck-stat,
.pv-fin-canvas .pv-pmo-sec,
.pv-fin-canvas .pv-fd .panel,
.pv-fin-canvas .pv-fin-kpi,
.pv-fin-canvas .pv-as-kpi,
.pv-fin-canvas .pv-as-card,
.pv-fin-canvas .pv-fin-cfgmain,
.pv-sb .pv-stat-card,
.pv-sb-card,
.pv-stock-wi,
.pv-tb-col,
.pv-bh-module .pv-bh-board .pv-bh3-card { border: 1px solid var(--pv-border); }
.pv-bh-module .pv-bh-board .pv-bh3-card { border-left: 0; }   /* 左边是彩色竖条，不再叠灰边 */
/* 小违和详情页顶上那排（用户 2026-11-10：「不再关注」32、「记录」是 Element 小按钮另一个高，并排高低不齐）：一排同高同字号 */
.pv-bhd-head .acts { display: flex; align-items: center; gap: 8px; }
.pv-bhd-head .acts .el-button { height: 32px; padding: 0 16px; font-size: 13px; line-height: 30px; }
/* 同排同高（用户 2026-11-10 让全站扫一遍按钮高低）：日历顶上「回到今天」26 → 跟两颗翻页圆钮一样 30；行程工具条右边「时差」跟左边两颗 30 一样高 */
.pv-cal-today { height: 30px; line-height: 30px; }
.pv-tb .pv-tb-end .pv-pmo-secbtn, .pv-tb-end > .pv-pmo-secbtn { height: 30px; line-height: 28px; display: inline-flex; align-items: center; gap: 4px; }
/* 小违和详情页走势图的悬浮提示（用户 2026-11-10）：那天每一次——几点、几分 / 几次、备注 */
.pv-bhd-tip.el-tooltip__popper.is-light { border-color: var(--pv-border); padding: 10px 12px; box-shadow: 0 6px 18px rgba(25, 27, 35, .1); }
.pv-bhd-tipc { display: flex; flex-direction: column; gap: 5px; min-width: 150px; max-width: 280px; font-size: 12.5px; line-height: 18px; color: var(--pv-text); }
.pv-bhd-tipc > b { font-weight: 700; margin-bottom: 1px; }
.pv-bhd-tipc .row { display: flex; align-items: center; gap: 8px; }
.pv-bhd-tipc .t { flex: none; color: var(--pv-text-soft); font-variant-numeric: tabular-nums; }
.pv-bhd-tipc .v { flex: none; height: 18px; padding: 0 6px; border-radius: 4px; color: #fff; font-size: 11.5px; font-weight: 700; line-height: 18px; white-space: nowrap; }
.pv-bhd-tipc .n { min-width: 0; color: var(--pv-text-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bhd-tipc .none { color: var(--pv-text-faint); }

/* 日程孩子行：核桃 / 葫芦同一个色，核桃深、葫芦浅（用户 2026-11-10） */
.pv-kid-row .pv-cal-plan-who.deep { background: #f3d9a8; color: #8a5a10; }
.pv-kid-row .pv-cal-plan-who.light { background: #fbf0dc; color: #b8862e; }

/* 谁能赚钱：线尾挂了头像，提示框挪到左上，别盖住头像（用户 2026-11-10） */
.pv-scurve-tip { right: auto; left: 62px; }

/* 日常小事看板（用户 2026-11-10，照飞书任务）：一组一列左右排，列宽固定，放不下横着滑；手机上照旧上下排 */
.pv-task-cols { display: flex; align-items: flex-start; gap: 16px; overflow-x: auto; padding-bottom: 6px; }
.pv-task-cols > .pv-task-sec { flex: 0 0 280px; min-width: 0; margin: 0; padding: 0; border: 0; }
.pv-task-cols > .pv-task-sec + .pv-task-sec { border-top: 0; padding-top: 0; }
.pv-task-cols .pv-task-grid { display: flex; flex-direction: column; gap: 12px; }
/* 网格里标题区固定 4 行高是为了一排卡片对齐；分列后上下排，不用对齐，标题多高占多高 */
.pv-task-cols .pv-tc { flex: none; }
.pv-task-cols .pv-tc:not(.pv-wc) .pv-tc-head { height: auto; }
.pv-task-cols .pv-addrow { margin: 0 0 10px; }
@media (max-width: 640px) {
  .pv-task-cols { display: block; overflow: visible; }
  .pv-task-cols > .pv-task-sec { margin-bottom: 24px; }
}

/* ===== 小违和「那天」弹窗 v2（2026-11-11）=====
   记一笔：日期一行，快捷时间一排（现在 / 早 9 / 中 15 / 晚 21，点了填进当前那行），下面一行一次（第 1 次 03:50、第 2 次 06:20…），「再加一次」多一行；
   这天已记：一条一行（时间 · 几次 / 几分 · 备注），点了才展开改，不再每条都摊开一整套控件 */
.pv-bh3-dlg .el-dialog__body { padding: 14px 20px 8px; }
.pv-bh3-new2 { display: flex; flex-direction: column; gap: 10px; padding: 14px; border: 1px solid var(--pv-border); border-radius: 12px; background: var(--pv-surface); }
.pv-bh3-new2 .top { display: flex; align-items: center; gap: 10px; }
.pv-bh3-new2 .lab { font-size: 14px; font-weight: 700; color: var(--pv-text); }
.pv-bh3-new2 .top .d { width: 150px !important; margin-left: auto; }
.pv-bh3-new2 .segs { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.pv-bh3-new2 .segs > span { font-size: 12px; color: var(--pv-text-faint); margin-right: 2px; }
.pv-bh3-new2 .segs button { display: inline-flex; align-items: baseline; gap: 4px; height: 28px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 999px; background: var(--pv-surface); font: inherit; font-size: 13px; color: var(--pv-text); cursor: pointer; }
.pv-bh3-new2 .segs button i { font-style: normal; font-size: 11.5px; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-bh3-new2 .segs button:hover { border-color: oklch(0.75 0.06 250); }
.pv-bh3-new2 .segs button.on { border-color: oklch(0.55 0.13 250); background: oklch(0.96 0.02 250); color: oklch(0.45 0.13 250); font-weight: 600; }
.pv-bh3-new2 .rows { display: flex; flex-direction: column; gap: 6px; }
.pv-bh3-new2 .row { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 4px 6px 4px 10px; border-radius: 8px; background: var(--pv-bg); border: 1px solid transparent; }
.pv-bh3-new2 .row.at { border-color: oklch(0.8 0.06 250); background: oklch(0.975 0.01 250); }
.pv-bh3-new2 .row .n { flex: none; width: 46px; font-size: 12.5px; color: var(--pv-text-soft); }
.pv-bh3-new2 .row .t { width: 104px !important; }
.pv-bh3-new2 .amt, .pv-bh3-rec2 .amt { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); }
.pv-bh3-new2 .amt:focus-within, .pv-bh3-rec2 .amt:focus-within { border-color: oklch(0.55 0.13 250); }
.pv-bh3-new2 .amt input, .pv-bh3-rec2 .amt input { width: 56px; border: 0; outline: 0; background: none; font: inherit; font-size: 14px; font-variant-numeric: tabular-nums; -moz-appearance: textfield; }
.pv-bh3-new2 .amt input::-webkit-outer-spin-button, .pv-bh3-new2 .amt input::-webkit-inner-spin-button, .pv-bh3-rec2 .amt input::-webkit-outer-spin-button, .pv-bh3-rec2 .amt input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.pv-bh3-new2 .amt em, .pv-bh3-rec2 .amt em { font-style: normal; font-size: 12.5px; color: var(--pv-text-faint); }
.pv-bh3-new2 .row .x { flex: none; width: 28px; height: 28px; border: 0; border-radius: 6px; background: none; color: var(--pv-text-faint); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.pv-bh3-new2 .row .x:hover { background: var(--pv-surface); color: var(--pv-danger); }
.pv-bh3-new2 .chips { display: flex; flex-wrap: wrap; gap: 6px; }
.pv-bh3-new2 .chips button { height: 26px; min-width: 36px; padding: 0 8px; border: 0; border-radius: 999px; background: var(--pv-bg); font: inherit; font-size: 12.5px; cursor: pointer; font-variant-numeric: tabular-nums; }
.pv-bh3-new2 .chips button.on, .pv-bh3-new2 .chips button:hover { background: oklch(0.94 0.03 250); color: oklch(0.45 0.13 250); }
.pv-bh3-new2 .more { align-self: flex-start; display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px; border: 1px dashed #c9ccd6; border-radius: 8px; background: none; font: inherit; font-size: 13px; color: var(--pv-text-soft); cursor: pointer; }
.pv-bh3-new2 .more:hover { border-color: oklch(0.55 0.13 250); color: oklch(0.45 0.13 250); }
.pv-bh3-new2 .note { height: 34px; box-sizing: border-box; padding: 0 10px; border: 1px solid var(--pv-border); border-radius: 8px; font: inherit; font-size: 13.5px; color: var(--pv-text); outline: none; }
.pv-bh3-new2 .note:focus { border-color: oklch(0.55 0.13 250); }
.pv-bh3-new2 .foot { display: flex; align-items: center; gap: 10px; }
.pv-bh3-new2 .foot .sum { flex: 1; font-size: 12.5px; color: var(--pv-text-soft); }
.pv-bh3-new2 .foot .ok { height: 32px; padding: 0 20px; border: 0; border-radius: 8px; background: oklch(0.5 0.13 250); color: #fff; font: inherit; font-size: 13.5px; font-weight: 600; cursor: pointer; }
.pv-bh3-new2 .foot .ok:disabled { opacity: .45; cursor: default; }
.pv-bh3-dlgsec i { font-style: normal; font-weight: 400; margin-left: 8px; font-size: 12px; color: var(--pv-text-faint); }
.pv-bh3-new2 + .pv-bh3-dlgsec { margin-top: 16px; }
.pv-bh3-recs { display: flex; flex-direction: column; border: 1px solid var(--pv-border); border-radius: 10px; overflow: hidden; margin-bottom: 6px; }
.pv-bh3-rec2 + .pv-bh3-rec2 { border-top: 1px solid var(--pv-border); }
.pv-bh3-rec2 .sum { width: 100%; display: flex; align-items: center; gap: 10px; min-height: 42px; padding: 6px 12px; border: 0; background: var(--pv-surface); font: inherit; text-align: left; cursor: pointer; }
.pv-bh3-rec2 .sum:hover { background: var(--pv-bg); }
.pv-bh3-rec2 .sum .t { flex: none; width: 44px; font-size: 14px; font-weight: 600; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-bh3-rec2 .sum .v { flex: none; padding: 0 7px; border-radius: 5px; line-height: 20px; font-size: 12px; font-weight: 700; color: #fff; }
.pv-bh3-rec2 .sum .v.fine { background: #2f9e5b; }
.pv-bh3-rec2 .sum .nt { flex: 1; min-width: 0; font-size: 13px; color: var(--pv-text-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-bh3-rec2 .sum .chev { flex: none; color: var(--pv-text-faint); transition: transform .15s; }
.pv-bh3-rec2.open .sum .chev { transform: rotate(180deg); }
.pv-bh3-rec2.hl .sum, .pv-bh3-rec2.open .sum { background: oklch(0.975 0.01 250); }
.pv-bh3-rec2 .edit { display: flex; flex-direction: column; gap: 8px; padding: 4px 12px 12px; background: oklch(0.975 0.01 250); }
.pv-bh3-rec2 .edit .row1 { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.pv-bh3-rec2 .edit .lvs { display: flex; flex-wrap: wrap; gap: 4px; }
.pv-bh3-rec2 .edit .lvs button { min-width: 30px; height: 30px; padding: 0 6px; border: 1px solid var(--pv-border); border-radius: 6px; background: var(--pv-surface); color: var(--pv-text-soft); font: inherit; font-size: 13px; cursor: pointer; font-variant-numeric: tabular-nums; }
.pv-bh3-rec2 .edit .lvs button.on { border-color: transparent; background: oklch(0.6 0.17 30); color: #fff; font-weight: 700; }
.pv-bh3-rec2 .edit .acts { display: flex; align-items: center; gap: 8px; }
.pv-bh3-rec2 .edit .acts button { border: 0; background: none; padding: 4px 0; font: inherit; font-size: 12.5px; cursor: pointer; }
.pv-bh3-rec2 .edit .split { color: oklch(0.45 0.13 250); }
.pv-bh3-rec2 .edit .split:hover { text-decoration: underline; }
.pv-bh3-rec2 .edit .del { color: var(--pv-text-faint); }
.pv-bh3-rec2 .edit .del:hover { color: var(--pv-danger); }
@media (max-width: 640px) {
  .pv-bh3-new2 { padding: 12px; }
  .pv-bh3-new2 .top .d { width: 140px !important; }
  .pv-bh3-new2 .row { min-height: 44px; }
  .pv-bh3-new2 .row .n { width: 40px; }
  .pv-bh3-new2 .segs button { height: 32px; }
  .pv-bh3-rec2 .sum { min-height: 46px; }
}


/* 打卡列表 + 每张卡自己的抽屉（用户 2026-11-11）：项目里几张打卡一张一行，点一行从右边拉出这张的格子 / 奖励 / 轮次 */
.pv-ck-list { display: flex; flex-direction: column; border: 1px solid var(--pv-border); border-radius: var(--pv-card-r, 10px); background: var(--pv-surface); }
.pv-ck-row { display: grid; grid-template-columns: minmax(120px, 1.4fr) minmax(120px, 1fr) auto 84px 96px 84px minmax(48px, auto); align-items: center; gap: 12px;
  padding: 12px 16px; border: 0; background: none; text-align: left; font: inherit; font-size: 13px; line-height: 20px; color: var(--pv-text); cursor: pointer; }
.pv-ck-row + .pv-ck-row { border-top: 1px solid var(--pv-border); }
.pv-ck-row:hover, .pv-ck-row.on { background: var(--pv-primary-soft); }
.pv-ck-row .nm { font-size: 14px; font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-ck-row .sp, .pv-ck-row .who { color: var(--pv-text-soft); white-space: nowrap; }
.pv-ck-row .num { color: var(--pv-text-soft); white-space: nowrap; }
.pv-ck-row .num b { color: var(--pv-text); font-weight: 600; }
.pv-ck-row .td { font-size: 12px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-ck-row .td.on { color: var(--pv-success, #1f9d62); }
.pv-ck-state { display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 4px; font-size: 12px; line-height: 20px; white-space: nowrap; flex-shrink: 0; justify-self: start; }
.pv-ck-state.on { background: #e5f5ec; color: #1f9d62; }
.pv-ck-state.wait { background: #e8effd; color: #2f6fe4; }
.pv-ck-state.end { background: var(--pv-bg); color: var(--pv-text-faint); }
.pv-drawer.pv-ck-dw { width: min(760px, 96vw); }
.pv-ck-dw .pv-drawer-head .pv-pmo-secbtn { flex-shrink: 0; }
.pv-ck-dw .pv-ck-head { display: none; }   /* 卡名 / 期间已经在抽屉标题里 */
.pv-drawer-scrim.pv-ck-top { z-index: 1902; }
.pv-drawer.pv-ck-top { z-index: 1903; }
@media (max-width: 640px) {
  .pv-ck-row { grid-template-columns: 1fr auto; row-gap: 2px; }
  .pv-ck-row .nm { grid-column: 1; grid-row: 1; }
  .pv-ck-row .pv-ck-state { grid-column: 2; grid-row: 1; justify-self: end; }
  .pv-ck-row .sp { grid-column: 1; grid-row: 2; }
  .pv-ck-row .td { grid-column: 2; grid-row: 2; justify-self: end; }
  .pv-ck-row .num, .pv-ck-row .who { display: none; }
}
.pv-task-sec-head.g-early { --pv-sec: var(--pv-text-faint); color: var(--pv-text-soft); }   /* 日常小事「更早」：截止日在今天之前的已完成（2026-11-11） */
/* 从日历点进来的那件小事（2026-11-12）：卡片描一圈主色，3 秒后淡掉 */
.pv-tc.is-hl { box-shadow: 0 0 0 2px var(--pv-primary), var(--pv-shadow); transition: box-shadow .4s; }

/* 股票参数弹窗 · 资金（2026-11-12）：其他持仓起始资金 + 入金记录 */
.pv-stock-dep { border-top: 1px solid var(--pv-border); margin-top: 6px; padding-top: 12px; }
.pv-stock-dep .hd { font-size: 14px; font-weight: 600; margin-bottom: 10px; display: flex; align-items: center; gap: 8px; }
.pv-stock-dep .hd span, .pv-stock-dep .lab span { font-size: 12px; font-weight: 400; color: var(--pv-text-faint); }
.pv-stock-dep .lab { font-size: 13px; color: var(--pv-text-soft); margin: 4px 0 8px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pv-stock-dep .row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 8px; }
.pv-stock-dep .it { display: flex; align-items: center; gap: 10px; font-size: 13px; line-height: 20px; padding: 5px 0; border-top: 1px solid var(--pv-border); }
.pv-stock-dep .it .d { color: var(--pv-text-faint); width: 40px; white-space: nowrap; }
.pv-stock-dep .it .a { flex: 1; min-width: 0; color: var(--pv-text-soft); }
.pv-stock-dep .it b { font-weight: 600; color: var(--pv-success, #1f9d62); white-space: nowrap; }
.pv-stock-dep .it b.neg { color: var(--pv-danger); }
.pv-stock-dep .it button { border: 0; background: none; color: var(--pv-text-faint); cursor: pointer; padding: 0 2px; }
.pv-stock-dep .it button:hover { color: var(--pv-danger); }
/* 信用卡权益每组里的清单不再套框（用户 2026-11-12：左边一道框线，勾上之后绿底 / 蓝底又溢出框外）：外面那张卡已经有边，一层就够 */
.pv-fin-canvas .pv-cp-sec .pv-cp-rows { border: 0; box-shadow: none; }
/* 日记草稿（2026-11-12）：工具条「草稿 N」弹出的那一小列，点一条接着写 */
.pv-diary-drafts-pop { padding: 6px !important; }
.pv-diary-drafts .it { display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: 6px; cursor: pointer; font-size: 13px; line-height: 20px; }
.pv-diary-drafts .it:hover { background: var(--pv-primary-soft); }
.pv-diary-drafts .it .t { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--pv-text); }
.pv-diary-drafts .it .at { font-size: 12px; color: var(--pv-text-faint); white-space: nowrap; }
.pv-diary-drafts .it button { border: 0; background: none; color: var(--pv-text-faint); cursor: pointer; padding: 0 2px; visibility: hidden; }
.pv-diary-drafts .it:hover button { visibility: visible; }
.pv-diary-drafts .it button:hover { color: var(--pv-danger); }
/* 购物清单抽屉：名字敲完 AI 猜分类时，分类标签后面那行小字（2026-11-13） */
.pv-wl-guessing { margin-left: 8px; font-size: 12px; font-weight: 400; color: var(--pv-primary); display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
/* ===== 日程时间轴（用户 2026-11-13，设计稿「首页日历 · 今日时刻 + 日 / 3 天 / 周视图」）=====
   今天牌「时刻」：一条横轴，一件日程一块（一行高、直角、不带左边色条），撞了往下叠；顶上一排按类开关 + 全天 / 从现在起。
   下面日历的日 / 3 天 / 周：时间格，一天一列、方块按钟点占高。颜色只表示哪一类：家人蓝 / 联络橙 / 别的日程青 */
.pv-tl, .pv-tg { --tl-fam: #4F7FD9; --tl-fam-s: #E8EFFB; --tl-ct: #C97D07; --tl-ct-s: #FBEED2; --tl-sch: #177268; --tl-sch-s: #DFF0ED; }
.pv-tl { flex: 1 1 auto; min-width: 0; width: 100%; gap: 8px; }
.pv-tl-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; width: 100%; }
.pv-tl-bar .sp { flex: 1; }
.pv-tl-tog { --c: var(--tl-fam); --s: var(--tl-fam-s); display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 10px; border: 1px solid var(--s); border-radius: var(--pv-radius-pill); background: var(--s); color: var(--c); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; cursor: pointer; white-space: nowrap; }
.pv-tl-tog i { width: 8px; height: 8px; border-radius: 50%; background: var(--c); }
.pv-tl-tog.c-ct { --c: var(--tl-ct); --s: var(--tl-ct-s); } .pv-tl-tog.c-sch { --c: var(--tl-sch); --s: var(--tl-sch-s); }
.pv-tl-tog.off { border: 1px dashed #d9dce4; background: var(--pv-surface); color: #b0b4c2; font-weight: 400; }
.pv-tl-tog.off i { background: #d9dce4; }
.pv-tl-allday { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 10px; background: var(--tl-fam-s); color: var(--tl-fam); font-size: calc(12.5px + var(--pv-fz-add, 0px)); font-weight: 600; cursor: pointer; white-space: nowrap; }
.pv-tl-allday i { font-style: normal; font-weight: 400; opacity: .8; }
.pv-tl-range { display: inline-flex; padding: 3px; border-radius: 8px; background: #f0f1f5; }
.pv-tl-range button { height: 22px; padding: 0 10px; border: 0; border-radius: 6px; background: transparent; color: var(--pv-text-soft); font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; }
.pv-tl-range button.on { background: var(--pv-surface); color: var(--pv-text); font-weight: 600; box-shadow: 0 1px 3px rgba(25, 27, 35, .12); }
.pv-tl-track { position: relative; align-self: stretch; width: 100%; margin-top: 22px; background: #fafbfc; }
.pv-tl-tick { position: absolute; top: 0; bottom: 0; width: 1px; background: #f0f1f5; }
.pv-tl-tick.major { background: #e3e5ea; }
.pv-tl-tick i { position: absolute; top: -18px; left: -12px; width: 24px; text-align: center; font-style: normal; font-size: 11px; line-height: 14px; color: var(--pv-text-faint); }
.pv-tl-past { position: absolute; left: 0; top: 0; bottom: 0; background: rgba(25, 27, 35, .035); pointer-events: none; }
.pv-tl-blk { --c: var(--tl-fam); --s: var(--tl-fam-s); position: absolute; height: 24px; margin-left: 1px; padding: 0 7px; box-sizing: border-box; background: var(--s); color: var(--c); line-height: 24px; font-size: calc(12px + var(--pv-fz-add, 0px)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }
.pv-tl-blk.c-ct, .pv-tg-blk.c-ct { --c: var(--tl-ct); --s: var(--tl-ct-s); } .pv-tl-blk.c-sch, .pv-tg-blk.c-sch { --c: var(--tl-sch); --s: var(--tl-sch-s); }
.pv-tl-blk b { font-weight: 700; }
.pv-tl-blk i { margin-left: 6px; font-style: normal; font-size: calc(11px + var(--pv-fz-add, 0px)); opacity: .75; }
.pv-tl-blk.past { opacity: .45; }
.pv-tl-blk.on { box-shadow: inset 0 0 0 1.5px var(--c); }
.pv-tl-blk:hover { filter: brightness(.97); box-shadow: inset 0 0 0 1px var(--c); }
.pv-tl-now { position: absolute; top: -6px; bottom: -6px; width: 2px; margin-left: -1px; background: var(--pv-danger); pointer-events: none; z-index: 1; }
.pv-tl-now b { position: absolute; top: -18px; left: 50%; transform: translateX(-50%); height: 16px; padding: 0 6px; border-radius: 8px; background: var(--pv-danger); color: #fff; font-size: 11px; line-height: 16px; font-weight: 700; white-space: nowrap; }
.pv-tl-none { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
/* 时间格 */
.pv-tg { border: 1px solid var(--pv-border); border-radius: 10px; overflow: hidden; background: var(--pv-surface); }
.pv-tg-row { display: grid; grid-template-columns: 52px repeat(var(--tg-n, 7), minmax(0, 1fr)); }
.pv-tg.n1 .pv-tg-row { --tg-n: 1; } .pv-tg.n3 .pv-tg-row { --tg-n: 3; }
.pv-tg-row > .ax { font-size: 11px; color: var(--pv-text-faint); }
.pv-tg-head { border-bottom: 1px solid var(--pv-border); }
.pv-tg-head .d { display: flex; align-items: baseline; gap: 6px; padding: 8px 10px; cursor: pointer; min-width: 0; }
.pv-tg-head .d b { font-size: 18px; font-weight: 700; color: var(--pv-text); font-variant-numeric: tabular-nums; }
.pv-tg-head .d span { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-tg-head .d.today b { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%; background: var(--pv-primary); color: #fff; font-size: 14px; }
.pv-tg-head .d.today span { color: var(--pv-primary-dark); font-weight: 600; }
.pv-tg-head .d.open { background: var(--pv-primary-soft); }
.pv-tg-allday { border-bottom: 1px solid var(--pv-border); }
.pv-tg-allday > .ax { display: flex; align-items: center; justify-content: center; }
.pv-tg-allday .d { min-width: 0; padding: 4px 3px; border-left: 1px solid #eceef3; display: flex; flex-direction: column; gap: 2px; min-height: 30px; }
.pv-tg-allday .d.today, .pv-tg-grid .d.today { background: rgba(232, 150, 12, .05); }
.pv-tg-body { max-height: 620px; overflow-y: auto; }
.pv-tg-grid { position: relative; background-image: repeating-linear-gradient(to bottom, #f0f1f5 0, #f0f1f5 1px, transparent 1px, transparent 44px); }
.pv-tg-grid > .ax { position: relative; }
.pv-tg-grid > .ax span { position: absolute; right: 8px; transform: translateY(-50%); font-size: 11px; color: var(--pv-text-faint); font-variant-numeric: tabular-nums; }
.pv-tg-grid .d { position: relative; border-left: 1px solid #eceef3; min-width: 0; }
.pv-tg-blk { --c: var(--tl-fam); --s: var(--tl-fam-s); position: absolute; box-sizing: border-box; padding: 3px 6px; background: var(--s); color: var(--c); border-radius: 0; overflow: hidden; cursor: pointer; line-height: 1.3; }
.pv-tg-blk b { display: block; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-tg-blk i { display: block; font-style: normal; font-size: 11px; opacity: .8; white-space: nowrap; overflow: hidden; }
.pv-tg-blk.past { opacity: .5; }
.pv-tg-blk:hover { box-shadow: inset 0 0 0 1.5px var(--c); }
.pv-tg-now { position: absolute; left: 0; right: 0; height: 2px; background: var(--pv-danger); z-index: 2; pointer-events: none; }
.pv-tg-now::before { content: ""; position: absolute; left: -4px; top: -3px; width: 8px; height: 8px; border-radius: 50%; background: var(--pv-danger); }
@media (max-width: 640px) {
  .pv-tg-row { grid-template-columns: 40px repeat(var(--tg-n, 7), minmax(0, 1fr)); }
  .pv-tg-head .d { padding: 6px; flex-direction: column; gap: 0; }
  .pv-tl-range { order: 9; }
}
/* 「时刻」轴第二版（用户 2026-11-13：太不明显、贴右端伸出去、悬停看不到时间）：
   没过的实底白字（家人蓝 / 联络橙 / 日程青），过去的退成浅底；轴本身白底细线；悬停浮小卡 */
.pv-tl-track { background: var(--pv-surface); box-shadow: inset 0 0 0 1px var(--pv-border); }
.pv-tl-past { background: rgba(25, 27, 35, .04); }
.pv-tl-blk { background: var(--c); color: #fff; }
.pv-tl-blk i { opacity: .85; }
.pv-tl-blk.past { opacity: 1; background: var(--s); color: var(--c); }
.pv-tl-blk.on { box-shadow: 0 0 0 2px var(--pv-surface), 0 0 0 3.5px var(--c); z-index: 1; }
.pv-tl-blk:hover { filter: brightness(1.06); box-shadow: 0 2px 8px rgba(25, 27, 35, .18); z-index: 2; }
.pv-tl-blk.past:hover { filter: none; box-shadow: inset 0 0 0 1px var(--c); }
.pv-tl-tip { position: absolute; z-index: 5; transform: translateY(calc(-100% - 6px)); display: flex; flex-direction: column; gap: 2px; min-width: 140px; max-width: 280px; padding: 8px 10px; background: #191b23; color: #fff; box-shadow: 0 6px 18px rgba(25, 27, 35, .22); pointer-events: none; font-size: 12.5px; line-height: 1.45; }
.pv-tl-tip.r { transform: translate(-100%, calc(-100% - 6px)); }
.pv-tl-tip b { font-weight: 700; }
.pv-tl-tip span { white-space: nowrap; font-variant-numeric: tabular-nums; color: rgba(255, 255, 255, .85); }
.pv-tl-tip i { font-style: normal; color: rgba(255, 255, 255, .7); font-size: 12px; }
/* 抽屉删除试点（用户 2026-11-13 方案 A，先只在任务抽屉）：左边一组「更多 ▾ + 删除」，删除点了底栏原地变浅红确认条 */
.pv-drawer-foot > .pv-drawer-left { margin-right: auto; display: inline-flex; align-items: center; gap: 8px; }
.pv-drawer-left > .pv-drawer-more { margin-right: 0; }
.pv-drawer-left .pv-drawer-delbtn.el-button { margin-left: 0; padding: 0 14px; }
.pv-drawer-left .pv-drawer-delbtn.el-button [class*="el-icon-"] + span { margin-left: 4px; }
.pv-drawer-foot.is-delask { background: #FFF5F5; border-top-color: #F7C9C9; }
.pv-drawer-delask { margin-right: auto; display: inline-flex; align-items: center; gap: 6px; min-width: 0; color: var(--pv-danger); font-size: calc(13px + var(--pv-fz-add, 0px)); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* 「时刻」轴第三版（用户 2026-11-13）：去掉轴的灰底和外框，只留刻度线；块自己有明确边框（没过的实底、过了的浅底 + 一圈色线）；
   行高 28 = 块 24 + 行间 4，轴高 = 行数 × 28 − 4，最后一行底下不再多出空隙；最左边的钟点字左对齐，不被切掉半个 */
.pv-tl-track { background: transparent; box-shadow: none; }
.pv-tl-tick { background: #f1f2f5; }
.pv-tl-tick.major { background: #e6e8ee; }
.pv-tl-tick i.first { left: 0; text-align: left; }
.pv-tl-blk { margin-left: 0; box-shadow: inset 0 0 0 1px var(--c); }
.pv-tl-blk.past { box-shadow: inset 0 0 0 1px var(--c); }
.pv-tl-blk.on { box-shadow: inset 0 0 0 1px var(--c), 0 0 0 2px var(--pv-surface), 0 0 0 3.5px var(--c); }
/* ============ 股票看板整合版（用户 2026-11-13，画布「股票看板」0–⑤）============
   头部一行 .pv-sk-head → 总账卡 .pv-sk-hero（总资产 / 今天 / 风控）→ 持仓 .pv-sk-sec + 列表 .pv-sk-tbl / 卡片 .pv-sk-cards → 交易 .pv-sk-days；个股抽屉 .pv-sk-drw */
.pv-sk-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; }
.pv-sk-head .t { font-size: calc(20px + var(--pv-fz-add2, 0px)); font-weight: 700; }
.pv-sk-head .s { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-head .sp, .pv-sk-sec .sp, .pv-sk-hero .base .sp, .pv-sk-day .sp, .pv-sk-drow .sp, .pv-sk-dtr .sp, .pv-sk-card .sp { flex: 1; }
.pv-sk-head .el-button + .el-button { margin-left: 0; }
.pv-sk-ib.el-button { width: 30px; padding: 0; }
.pv-sk-live { display: inline-flex; align-items: center; gap: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); white-space: nowrap; }
.pv-sk-live i { width: 7px; height: 7px; border-radius: 50%; background: var(--pv-success); box-shadow: 0 0 0 3px rgba(22, 163, 74, .15); }
.pv-sk-live.off i { background: #c9ccd6; box-shadow: none; }
.pv-sk-hero { display: grid; grid-template-columns: 1.35fr 1fr 1.15fr; background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; padding: 18px 20px 12px; font-variant-numeric: tabular-nums; }
.pv-sk-hero .c { min-width: 0; padding: 0 20px; border-left: 1px solid #eef0f4; display: flex; flex-direction: column; gap: 4px; }
.pv-sk-hero .c:first-child { padding-left: 0; border-left: 0; }
.pv-sk-hero .k { display: flex; align-items: center; gap: 6px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-hero .big { font-size: 32px; font-weight: 700; letter-spacing: -.5px; line-height: 1.2; }
.pv-sk-hero .mid { font-size: 26px; font-weight: 700; letter-spacing: -.4px; line-height: 1.25; margin-top: 4px; }
.pv-sk-hero .c.risk .mid { font-size: 22px; }
.pv-sk-hero .l { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-hero .m { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-sk-hero .up { color: var(--pv-success); } .pv-sk-hero .down { color: var(--pv-danger); }
.pv-sk-hero .bar { height: 8px; border-radius: 4px; background: #eef0f4; overflow: hidden; margin: 2px 0; }
.pv-sk-hero .bar i { display: block; height: 100%; border-radius: 4px; transition: width .3s; }
.pv-sk-hero .bar i.ok { background: var(--pv-success); } .pv-sk-hero .bar i.warn { background: #E8960C; } .pv-sk-hero .bar i.bad { background: var(--pv-danger); }
.pv-sk-hero .c.risk.hot .mid { color: var(--pv-danger); }
.pv-sk-rulebtn { margin-left: auto; display: inline-flex; align-items: center; gap: 3px; height: 20px; padding: 0 6px; border: 0; border-radius: 5px; background: none; color: var(--pv-text-faint); font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-sk-rulebtn:hover { background: #f2f3f6; color: var(--pv-text-soft); }
.pv-sk-hero .c.risk .k > span:last-child { margin-left: auto; }
.pv-sk-rules-t { font-weight: 700; margin-bottom: 6px; }
.pv-sk-rules ul { margin: 0; padding-left: 16px; display: flex; flex-direction: column; gap: 4px; font-size: 12.5px; line-height: 1.55; color: var(--pv-text-soft); }
.pv-sk-rules li b { color: var(--pv-text); margin-right: 6px; }
.pv-sk-hero .base { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 28px; margin-top: 14px; padding-top: 10px; border-top: 1px solid #eef0f4; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sk-hero .base i { font-style: normal; color: var(--pv-text-faint); margin-right: 6px; }
.pv-sk-hero .base .faint { color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-sk-sec { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 24px 0 10px; }
.pv-sk-sec h4 { margin: 0; font-size: calc(15px + var(--pv-fz-add2, 0px)); font-weight: 700; }
.pv-sk-sec .hint { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-sec .el-button + .el-button { margin-left: 0; }
.pv-sk-seg { display: inline-flex; padding: 3px; border-radius: 8px; background: #eef0f4; max-width: 100%; overflow-x: auto; scrollbar-width: none; }
.pv-sk-seg button { flex: none; height: 24px; padding: 0 10px; border: 0; border-radius: 6px; background: transparent; color: var(--pv-text-soft); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; }
.pv-sk-seg button i { font-style: normal; color: var(--pv-text-faint); margin-left: 2px; }
.pv-sk-seg button.on { background: var(--pv-surface); color: var(--pv-text); font-weight: 600; box-shadow: 0 1px 3px rgba(25, 27, 35, .12); }
.pv-sk-empty { padding: 18px 4px; font-size: calc(13px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-tbl { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; padding: 4px 10px; overflow-x: auto; }
.pv-sk-tbl table, .pv-sk-wi table { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
.pv-sk-tbl th, .pv-sk-wi th { padding: 8px 10px; border-bottom: 1px solid #eef0f4; text-align: right; font-size: calc(12px + var(--pv-fz-add, 0px)); font-weight: 600; color: var(--pv-text-faint); white-space: nowrap; }
.pv-sk-tbl td, .pv-sk-wi td { padding: 10px; border-bottom: 1px solid #f3f4f7; text-align: right; white-space: nowrap; font-size: calc(13px + var(--pv-fz-add, 0px)); vertical-align: middle; }
.pv-sk-tbl tr:last-child td { border-bottom: 0; }
.pv-sk-tbl .l, .pv-sk-wi .l { text-align: left; }
.pv-sk-tbl tbody tr { cursor: pointer; }
.pv-sk-tbl tbody tr:hover td { background: #fafbfc; }
.pv-sk-tbl .nm { display: flex; align-items: center; gap: 6px; }
.pv-sk-tbl .nm b { font-size: calc(14px + var(--pv-fz-add, 0px)); }
.pv-sk-tbl .sub { margin-top: 2px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-tbl td.up, .pv-sk-tbl .sub.up, .pv-sk-wi .up, .pv-sk-days .up, .pv-sk-card .up, .pv-sk-drw .up { color: var(--pv-success); }
.pv-sk-tbl td.down, .pv-sk-tbl .sub.down, .pv-sk-wi .down, .pv-sk-days .down, .pv-sk-card .down, .pv-sk-drw .down { color: var(--pv-danger); }
.pv-sk-tbl td.up .sub, .pv-sk-tbl td.down .sub { color: inherit; opacity: .85; }
.pv-sk-tbl .px { font-size: calc(14px + var(--pv-fz-add, 0px)); }
.pv-sk-tbl .pv-watch-pill { min-width: 62px; display: inline-block; }
.pv-sk-stop { display: inline-flex; align-items: center; gap: 6px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-sk-stop > i { position: relative; width: 54px; height: 5px; border-radius: 3px; background: #eef0f4; overflow: hidden; }
.pv-sk-stop em { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 3px; }
.pv-sk-stop em.ok { background: var(--pv-success); } .pv-sk-stop em.warn { background: #E8960C; } .pv-sk-stop em.bad { background: var(--pv-danger); }
.pv-sk-stop .down { color: var(--pv-danger); font-weight: 600; }
.pv-sk-bell { display: inline-flex; align-items: center; gap: 3px; height: 22px; padding: 0 7px; border: 0; border-radius: 6px; background: none; color: #b0b4c2; font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; }
.pv-sk-bell:hover { background: #f2f3f6; color: var(--pv-text-soft); }
.pv-sk-bell.set { background: #FBEED2; color: #C97D07; }
.pv-sk-bell.fired { background: #e7f6ec; color: var(--pv-success); }
.pv-sk-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
.pv-sk-card { display: flex; flex-direction: column; gap: 8px; padding: 14px 16px; background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; cursor: pointer; transition: box-shadow .15s, border-color .15s; font-variant-numeric: tabular-nums; }
.pv-sk-card:hover { border-color: #dcdfe6; box-shadow: 0 6px 18px rgba(25, 27, 35, .10); }
.pv-sk-card .top { display: flex; align-items: center; gap: 6px; }
.pv-sk-card .top b { font-size: calc(15px + var(--pv-fz-add2, 0px)); }
.pv-sk-card .top .n { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-card .pr { display: flex; align-items: baseline; gap: 8px; }
.pv-sk-card .pr b { font-size: 24px; letter-spacing: -.3px; }
.pv-sk-card .pr .pv-watch-pill { margin-left: auto; }
.pv-sk-card .kv { display: grid; grid-template-columns: auto 1fr; gap: 6px 10px; padding-top: 8px; border-top: 1px solid #f0f1f5; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sk-card .kv > span { color: var(--pv-text-faint); }
.pv-sk-card .kv > b { text-align: right; font-weight: 600; }
.pv-sk-card .ft { display: flex; align-items: center; gap: 6px; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-card .ft .last { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.pv-sk-days { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; padding: 4px 16px 10px; font-variant-numeric: tabular-nums; }
.pv-sk-day { padding: 4px 0 6px; }
.pv-sk-day .hd { display: flex; align-items: center; gap: 8px; height: 36px; border-bottom: 1px solid #eef0f4; cursor: pointer; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sk-day .hd .n { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-day .hd .eff { font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); white-space: nowrap; }
.pv-sk-day .hd .tg { width: 48px; text-align: right; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-day .hd:hover .tg { color: var(--pv-text-soft); }
.pv-sk-day .tr { display: flex; align-items: center; gap: 10px; min-height: 36px; padding: 0 4px; border-bottom: 1px solid #f6f7f9; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sk-day .tr.link { cursor: pointer; }
.pv-sk-day .tr.link:hover { background: #fafbfc; }
.pv-sk-day .side, .pv-sk-dtr .side { flex: none; height: 20px; padding: 0 7px; border-radius: 5px; font-size: calc(12px + var(--pv-fz-add, 0px)); line-height: 20px; font-weight: 600; white-space: nowrap; }
.pv-sk-day .side.buy, .pv-sk-dtr .side.buy { background: #e7f6ec; color: var(--pv-success); }
.pv-sk-day .side.sell, .pv-sk-dtr .side.sell { background: #fdecec; color: var(--pv-danger); }
.pv-sk-day .qp { color: var(--pv-text-soft); white-space: nowrap; }
.pv-sk-day .amt, .pv-sk-dtr .amt { color: var(--pv-text-faint); white-space: nowrap; }
.pv-sk-day .note { font-style: normal; color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; min-width: 0; }
.pv-sk-day .eff { white-space: nowrap; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sk-wi { margin: 8px 0 6px; padding: 12px 14px; border-radius: 10px; background: #f7f8fa; }
.pv-sk-wi .cmp { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.pv-sk-wi .cmp > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pv-sk-wi .cmp i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-wi .cmp b { font-size: calc(16px + var(--pv-fz-add, 0px)); }
.pv-sk-wi .cmp em { font-style: normal; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-wi table { margin-top: 10px; background: var(--pv-surface); border-radius: 8px; }
.pv-sk-more { margin-top: 6px; height: 28px; padding: 0 10px; border: 0; border-radius: 7px; background: #f2f3f6; color: var(--pv-text-soft); font: inherit; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; }
.pv-sk-drw .pv-drawer-tt { flex-direction: row; align-items: center; gap: 8px; }
.pv-sk-drw .pv-drawer-body { font-variant-numeric: tabular-nums; display: flex; flex-direction: column; gap: 14px; }
.pv-sk-dpx { display: flex; align-items: baseline; flex-wrap: wrap; gap: 10px; }
.pv-sk-dpx > b { font-size: 30px; letter-spacing: -.4px; }
.pv-sk-grid { display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid #eef0f4; border-radius: 10px; overflow: hidden; }
.pv-sk-grid > div { display: flex; flex-direction: column; gap: 2px; padding: 10px 12px; border-left: 1px solid #eef0f4; border-top: 1px solid #eef0f4; margin: -1px 0 0 -1px; min-width: 0; }
.pv-sk-grid i { font-style: normal; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-grid b { font-size: calc(15px + var(--pv-fz-add, 0px)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv-sk-drow { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 10px; background: #f7f8fa; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sk-drow .k { color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sk-drow.alert { cursor: pointer; color: var(--pv-text-soft); }
.pv-sk-drow.alert.set { background: #FBEED2; color: var(--pv-text); }
.pv-sk-drow.alert > i { color: #C97D07; }
.pv-sk-drow.alert .a { color: #C97D07; font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sk-dsub { font-weight: 700; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sk-dsub span { font-weight: 400; color: var(--pv-text-faint); font-size: calc(12px + var(--pv-fz-add, 0px)); }
.pv-sk-dtr { display: flex; align-items: center; gap: 10px; min-height: 38px; border-bottom: 1px solid #f3f4f7; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sk-dsub + .pv-sk-dlist { margin-top: -8px; }
.pv-sk-dtr.link { cursor: pointer; } .pv-sk-dtr.link:hover { background: #fafbfc; }
.pv-sk-dtr .d { width: 40px; color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
@media (max-width: 900px) {
  .pv-sk-hero { grid-template-columns: 1fr 1fr; row-gap: 14px; }
  .pv-sk-hero .c.risk { grid-column: 1 / -1; padding: 12px 0 0; border-left: 0; border-top: 1px solid #eef0f4; }
}
@media (max-width: 640px) {
  .pv-sk-head .t { font-size: 17px; } .pv-sk-head .s { display: none; }
  .pv-sk-live { order: 9; width: 100%; }
  .pv-sk-hero { grid-template-columns: 1fr; padding: 14px 16px 10px; }
  .pv-sk-hero .c { padding: 0; border-left: 0; }
  .pv-sk-hero .c + .c { padding-top: 10px; border-top: 1px solid #eef0f4; }
  .pv-sk-hero .big { font-size: 28px; } .pv-sk-hero .mid { font-size: 22px; }
  .pv-sk-cards { grid-template-columns: 1fr; }
  .pv-sk-wi .cmp { grid-template-columns: 1fr; }
  .pv-sk-day .amt, .pv-sk-day .note { display: none; }
  .pv-sk-day .hd .eff { font-size: 12px; }
}
.pv-sk-hero .pv-watch-pill.up, .pv-sk-hero .pv-watch-pill.down, .pv-sk-drw .pv-watch-pill.up, .pv-sk-drw .pv-watch-pill.down, .pv-sk-card .pv-watch-pill.up, .pv-sk-card .pv-watch-pill.down, .pv-sk-tbl .pv-watch-pill.up, .pv-sk-tbl .pv-watch-pill.down { color: #fff; }
.pv-sk-grid b { white-space: normal; overflow: visible; }
@media (max-width: 640px) { .pv-sk-head .t { flex-basis: 100%; } .pv-sk-head .sp { display: none; } .pv-sk-live { order: 0; width: auto; flex-basis: 100%; } }
.pv-sk-card .pr b.pv-stock-price, .pv-sk-dpx > b.pv-stock-price { margin-left: -5px; }
/* 总览整合版（用户 2026-11-13 画布 ④） */
.pv-sk-alloc { flex-direction: column; align-items: stretch !important; gap: 6px !important; }
.pv-sk-alloc .bar { display: flex; gap: 2px; height: 10px; border-radius: 5px; overflow: hidden; }
.pv-sk-alloc .bar i { min-width: 2px; }
.pv-sk-alloc .lg { display: flex; flex-wrap: wrap; gap: 4px 18px; font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-soft); }
.pv-sk-alloc .lg span { display: inline-flex; align-items: center; gap: 6px; }
.pv-sk-alloc .lg i { width: 8px; height: 8px; border-radius: 50%; margin: 0 !important; }
.pv-sk-accts { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 12px; }
.pv-sk-acct { display: flex; flex-direction: column; gap: 8px; padding: 14px 16px; background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; cursor: pointer; font-variant-numeric: tabular-nums; transition: box-shadow .15s, border-color .15s; }
.pv-sk-acct:hover { border-color: #dcdfe6; box-shadow: 0 6px 18px rgba(25, 27, 35, .10); }
.pv-sk-acct .top { display: flex; align-items: center; gap: 8px; }
.pv-sk-acct .top > i { width: 20px; height: 20px; border-radius: 6px; flex: none; }
.pv-sk-acct .top .sp { flex: 1; }
.pv-sk-acct .go { font-size: calc(12px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-acct:hover .go { color: var(--pv-text-soft); }
.pv-sk-acct .v { font-size: 22px; letter-spacing: -.3px; }
.pv-sk-acct .kv { display: flex; flex-wrap: wrap; gap: 4px 16px; font-size: calc(12.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); }
.pv-sk-acct .kv b.up { color: var(--pv-success); } .pv-sk-acct .kv b.down { color: var(--pv-danger); } .pv-sk-acct .kv b { color: var(--pv-text); }
.pv-sk-acct .mix { display: flex; gap: 2px; height: 6px; border-radius: 3px; overflow: hidden; background: #f2f3f6; }
.pv-sk-acct .mix i.up { background: var(--pv-success); } .pv-sk-acct .mix i.down { background: var(--pv-danger); } .pv-sk-acct .mix i.flat { background: #c9ccd6; } .pv-sk-acct .mix i.cash { background: #e3e5ea; }
.pv-sk-two { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr); gap: 0 16px; }
.pv-sk-box { background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; padding: 10px 14px; }
.pv-sk-fold { margin-top: 16px; }
.pv-sk-fold > .hd { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; padding: 12px 16px; background: var(--pv-surface); border: 1px solid var(--pv-border); border-radius: 12px; cursor: pointer; font-size: calc(13px + var(--pv-fz-add, 0px)); }
.pv-sk-fold > .hd span:not(.sp) { color: var(--pv-text-faint); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sk-fold > .hd .sp { flex: 1; }
.pv-sk-fold > .hd i { font-style: normal; color: var(--pv-text-soft); font-size: calc(12.5px + var(--pv-fz-add, 0px)); }
.pv-sk-fold.open > .hd { border-radius: 12px 12px 0 0; border-bottom: 0; }
.pv-sk-fold.open > .pv-sb-card { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; }
@media (max-width: 900px) { .pv-sk-two { grid-template-columns: 1fr; } }
.pv-sk-edit { margin-left: auto; font-size: calc(11.5px + var(--pv-fz-add, 0px)); color: var(--pv-text-faint); opacity: 0; transition: opacity .15s; }
.pv-sk-hero .pv-sb-bp.can { cursor: pointer; }
.pv-sk-hero .pv-sb-bp.can:hover .pv-sk-edit { opacity: 1; }
.pv-sk-hero .pv-sb-bp { background: none; border-top: 0; border-right: 0; border-bottom: 0; border-radius: 0; }
/* 首页日历右上角刷新钮（2026-11-13）：跟翻页圆钮同一颗灰，重拉时图标转圈 */
.pv-cal-refresh { margin-left: 8px; flex-shrink: 0; }
.pv-cal-refresh i { font-size: 15px; }
.pv-cal-refresh.spin i { animation: pv-cal-spin .8s linear infinite; }
.pv-cal-refresh:disabled { cursor: default; }
@keyframes pv-cal-spin { to { transform: rotate(360deg); } }
/* 信用卡权益「本财年已拿回」（2026-11-13）：百分比挪到条右边；「原 $x」窄了就省略，不再把整行挤出卡外 */
.pv-cp-bar-row { display: flex; align-items: center; gap: 8px; }
.pv-cp-bar-row .pv-cp-bar-track { flex: 1; min-width: 0; }
.pv-cp-bar-row .pv-cp-pct { margin-left: 0; flex-shrink: 0; white-space: nowrap; line-height: 18px; }
.pv-cp-kpis .pv-as-kpi.wide .v { min-width: 0; overflow: hidden; }
.pv-cp-kpis .pv-as-kpi.wide .pv-cp-gross { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 里程碑卡上的评论（用户 2026-11-14）：卡脚一颗「N 条评论」，卡上露最近一条，点了就地展开整串 */
.pv-rail-cmt-btn { display: inline-flex; align-items: center; gap: 4px; height: 26px; padding: 0 9px; border: 1px solid transparent; border-radius: 6px; background: none; color: var(--pv-text-faint); font: inherit; font-size: calc(12px + var(--pv-fz-add, 0px)); cursor: pointer; white-space: nowrap; }
.pv-rail-cmt-btn i { font-size: 14px; }
.pv-rail-cmt-btn:hover { background: #f2f3f6; color: var(--pv-text-soft); }
.pv-rail-cmt-btn.has { color: #3c72b8; background: #EEF3FB; font-weight: 600; }
.pv-rail-cmt-btn.on { color: #3c72b8; background: #fff; border-color: #C9DAF2; }
.pv-rail-cmt-peek { display: flex; align-items: center; gap: 6px; margin-top: 8px; padding: 6px 8px; border-radius: 8px; background: #f6f7f9; font-size: calc(12.5px + var(--pv-fz-add, 0px)); cursor: pointer; min-width: 0; }
.pv-rail-cmt-peek:hover { background: #EEF3FB; }
.pv-rail-cmt-peek .av { flex: none; width: 18px; height: 18px; border-radius: 50%; object-fit: cover; color: #fff; font-size: 10.5px; font-weight: 700; line-height: 18px; text-align: center; }
.pv-rail-cmt-peek b { flex: none; font-weight: 600; color: var(--pv-text); }
.pv-rail-cmt-peek .t { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--pv-text-soft); }
.pv-rail-cmt-peek .w { flex: none; color: var(--pv-text-faint); font-size: calc(11.5px + var(--pv-fz-add, 0px)); }
.pv-rail-cmts { margin-top: 8px; padding: 10px 10px 4px; border-radius: 8px; background: #f8f9fb; border: 1px solid #eef0f4; cursor: default; }
/* 持仓区「关注」钮（用户 2026-11-14）：站里统一的灰底加号钮，跟分段同高同底色，不再是偏蓝的 el-button */
.pv-sk-sec .pv-sk-addw { height: 30px; background: #eef0f4; }
.pv-sk-sec .pv-sk-addw:hover { background: #e3e5ea; }
.pv-sk-sec .pv-pmo-secbtn.pv-sk-addw { padding: 0 12px; border-radius: 8px; border: 0; }
/* 已完成的里程碑卡（绿底）上，评论钮跟着走绿色，不再是一块蓝（用户 2026-11-14） */
.pv-rail-node.is-done .pv-rail-cmt-btn.has { color: #1F7A3D; background: #E4F5EA; }
.pv-rail-node.is-done .pv-rail-cmt-btn.on { color: #1F7A3D; background: #fff; border-color: #A8DCBB; }
.pv-rail-node.is-done .pv-rail-cmt-btn:hover { color: #1F7A3D; background: #E4F5EA; }
/* 时刻轴「现在」小签（用户 2026-11-14：顶到「全天 / 从现在起」、压住钟点字）：抬到钟点字上面一层，轴整体往下让出位置 */
.pv-tl-track { margin-top: 40px; }
.pv-tl-now b { top: -28px; }
