/* ============================================================================
 * v0892_msg.css — v0.8.9.1 · fe-msg 组件样式
 * 归属写手：fe-msg ｜ 覆盖：名片 v2（task-11）/ 协作人单行与弹窗（task-12）/
 *                        待评价与写评（item 2）/ 消息中心（item 6·8）
 * 挂载：Lead 在 index.html 与 m.html 末尾加 <link>（同权重靠后生效）
 * 规范（tools/check_css_tokens.py 必须 E1–E6 = 0）：
 *   · 只用 style.css / m.html 都存在的 token，**不写 fallback**（两侧均已定义）
 *   · 字号只用 --fs-1..8（最小 11px）；圆角只用 --r-s/m/l/full / --radius / 装饰性 2–9·50
 *   · 无纯黑阴影、无白色描边；头像为「主题色同色系对角渐变」（color-mix 合成，非双语义色拼接）
 *   · 列数不用自定义 token：CSS 给默认值，实际列数由渲染侧写 inline grid-template-columns
 * ========================================================================== */

/* ================= 1. 名片 v2（桌面 + 手机共用同一套 class） =================
   结构：.v92-card > .v92-c-id（身份横条）+ 若干 .v92-c-sec（分区卡）
   铁律：每张卡的**最后一个子元素自身拉伸到卡底**（.v92-c-idend / .v92-c-fill / .v92-c-scroll），
        因此「卡片高 − 最后子元素 bottom」恒等于 padding，不会出现卡内底部空挡。 */
.v92-card{display:flex;flex-direction:column;gap:16px;   /* v0.8.9.2 统一卡间距 16px */font-size:var(--fs-3);line-height:1.55;color:var(--text);}

/* 1.1 身份横条 */
.v92-c-id{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;padding:var(--sp-3) var(--sp-4);
  border-radius:var(--radius);background:var(--glass);border:1px solid var(--hair);box-shadow:var(--shadow);}
.v92-c-av{width:64px;height:64px;flex:0 0 64px;border-radius:var(--r-l);overflow:hidden;
  display:flex;align-items:center;justify-content:center;font-size:var(--fs-7);font-weight:700;color:var(--on-grad);
  background:linear-gradient(135deg,color-mix(in srgb,var(--primary) 74%,var(--card)),var(--primary-deep));}
.v92-c-av img{width:100%;height:100%;object-fit:cover;display:block;}
.v92-c-idmid{flex:1;min-width:150px;display:flex;flex-direction:column;justify-content:center;gap:2px;}
.v92-c-name{display:flex;align-items:center;gap:var(--sp-1);flex-wrap:wrap;font-size:var(--fs-5);font-weight:700;line-height:1.3;word-break:break-all;}
.v92-c-sub{font-size:var(--fs-1);color:var(--text-sub);}
.v92-c-tags{display:flex;flex-wrap:wrap;gap:4px;}
.v92-c-tag{font-size:var(--fs-1);padding:1px 8px;border-radius:var(--r-full);background:var(--primary-light);
  color:var(--primary-ink);white-space:nowrap;}
.v92-c-tag.gold{background:var(--gold-bg);color:var(--gold-ink);}
.v92-c-tag.plain{background:color-mix(in srgb,var(--primary) 6%,transparent);color:var(--text-sub);}
/* 横条末位块：徽章 + 4 格数据；align-self:stretch 保证它就是"贴到卡底"的那个子元素 */
.v92-c-idend{flex:0 0 auto;align-self:stretch;display:flex;align-items:center;gap:var(--sp-3);}
.v92-c-stat4{display:grid;grid-template-columns:repeat(4,minmax(58px,auto));gap:var(--sp-1);align-content:center;}
.v92-c-stat{padding:4px 9px;border-radius:var(--r-s);text-align:center;background:color-mix(in srgb,var(--primary) 6%,transparent);border:1px solid var(--hair);box-sizing:border-box;}
.v92-c-stat b{display:block;font-size:var(--fs-5);font-weight:700;line-height:1.2;}
.v92-c-stat span{display:block;font-size:var(--fs-1);color:var(--text-sub);margin-top:1px;white-space:nowrap;}
.v92-c-stat.hi b{color:var(--gold-ink);}

/* 1.2 徽章（与成就柜 .ach-badge 同系：圆角方章 + 金色描边 + 主题浅浅金底，非双色渐变方黄块） */
.v92-c-badges{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-content:center;}
.v92-c-badges.row{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;max-width:100%;padding-bottom:2px;scrollbar-width:thin;}
.v92-c-badge{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:2px;width:60px;}
.v92-c-badge i{width:40px;height:40px;border-radius:var(--r-s);display:flex;align-items:center;justify-content:center;
  font-size:var(--fs-5);font-style:normal;border:1.5px solid var(--gold);background:var(--gold-bg);box-shadow:var(--shadow);}
.v92-c-badge.dim i{border-color:var(--hair);background:transparent;filter:grayscale(1);opacity:.5;}
.v92-c-badge span{font-size:var(--fs-1);color:var(--text-sub);max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* 1.3 分区卡 */
.v92-c-sec{padding:16px;border:1px solid var(--hair);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow);
  min-width:0;box-sizing:border-box;}
.v92-c-sec-h{display:flex;align-items:baseline;gap:var(--sp-1);font-size:14px;line-height:19.6px;font-weight:700;color:var(--text);margin-bottom:12px;}   /* v0.8.9.2 统一卡头：14px / 19.6px / 12px（与个人信息页其它卡同值） */
.v92-c-sec-h small{margin-left:auto;font-size:var(--fs-1);font-weight:400;color:var(--text-sub);}
.v92-c-sec-h .ic{font-size:var(--fs-4);}
.v92-c-fill{min-height:0;}
.v92-c-foot{border-top:1px solid var(--hair);margin-top:var(--sp-2);padding-top:var(--sp-1);font-size:var(--fs-1);
  color:var(--text-sub);text-align:center;}
.v92-c-bio{font-size:var(--fs-2);color:var(--text-sub);white-space:pre-wrap;}

/* 1.4 参考作品：列数由渲染侧 inline 指定（≤6 张 = 张数 → 一行等宽铺满；>6 张 = 5 列） */
.v92-c-samples{display:grid;gap:var(--sp-2);grid-template-columns:repeat(5,minmax(0,1fr));}   /* v0.8.9.2：固定 5 列（10 张 = 5×2 无空位） */
.v92-c-sample{position:relative;aspect-ratio:1;border-radius:var(--r-s);overflow:hidden;background:var(--bg2);cursor:zoom-in;}
.v92-c-sample img{width:100%;height:100%;object-fit:cover;display:block;}
.v92-c-sample .cap{position:absolute;left:0;right:0;bottom:0;padding:3px 5px;font-size:var(--fs-1);color:var(--on-grad);
  background:linear-gradient(transparent,rgba(16,24,40,.72));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}

/* 1.5 空态（图标 + 一句引导，不是白块） */
.v92-c-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-1);
  padding:var(--sp-4) var(--sp-3);border:1px dashed var(--hair);border-radius:var(--r-s);color:var(--text-sub);
  font-size:var(--fs-2);text-align:center;background:var(--bg2);}
.v92-c-empty .ic{font-size:var(--fs-6);line-height:1;opacity:.75;}
.v92-c-empty .act{color:var(--primary-ink);cursor:pointer;}

/* 1.6 口碑 / 贡献 列表 */
/* v0.8.9.17：名片「收费标准」分区 —— 一行一项：主题 · 类型 …… 金额/计费 */
.v92-c-fees{display:flex;flex-direction:column;gap:2px}
.v92-c-fee{display:flex;align-items:center;gap:10px;padding:7px 2px;border-bottom:1px dashed var(--hair);font-size:var(--fs-2)}
.v92-c-fee:last-child{border-bottom:0}
.v92-c-fee .t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-sub)}
.v92-c-fee b{margin-left:auto;flex:none;color:var(--text);font-weight:700}
.v92-c-chips{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-1);}
.v92-c-rep-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:0 var(--sp-4);}
.v92-c-rep{display:flex;gap:var(--sp-2);padding:var(--sp-1) 0;border-bottom:1px dashed var(--hair);font-size:var(--fs-2);}
.v92-c-rep:last-child{border-bottom:none;}
.v92-c-rep .txt{flex:1;min-width:0;}
.v92-c-rep .meta{font-size:var(--fs-1);color:var(--text-sub);margin-top:2px;}
.v92-c-rep .star{color:var(--gold-ink);flex:none;}
.v92-c-evs{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:0 var(--sp-4);}
.v92-c-ev{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-1);padding:5px 0;border-bottom:1px dashed var(--hair);}
.v92-c-ev:last-child{border-bottom:none;}
.v92-c-ev .r{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.v92-c-ev .p{flex:none;font-weight:700;color:var(--ok-ink);}
.v92-c-ev .p.minus{color:var(--danger-ink);}
.v92-c-ev .t{flex:none;font-size:var(--fs-1);color:var(--text-sub);}

/* ---- 方案 A（默认，推荐）：身份横条 + 单列分区；分区内自适应多列，长列表内部滚动 ---- */
.v92-card.a .v92-c-scroll{max-height:216px;overflow:auto;min-height:0;}

/* ---- 方案 B：左身份栏 + 右内容栏；两栏等高，各自"末卡"吸收余高（底部锚定脚注） ---- */
.v92-card.b{display:grid;grid-template-columns:286px minmax(0,1fr);gap:16px;align-items:stretch;}   /* 统一卡间距 16px */
.v92-card.b .v92-c-colL,.v92-card.b .v92-c-colR{display:flex;flex-direction:column;gap:16px;min-width:0;}
.v92-card.b .v92-c-colL .v92-c-id{flex-direction:column;align-items:center;text-align:center;gap:var(--sp-2);}
.v92-card.b .v92-c-colL .v92-c-av{width:76px;height:76px;flex-basis:76px;font-size:var(--fs-8);}
.v92-card.b .v92-c-colL .v92-c-idmid{align-items:center;min-width:0;}
.v92-card.b .v92-c-colL .v92-c-name{justify-content:center;}
.v92-card.b .v92-c-colL .v92-c-tags{justify-content:center;}
.v92-card.b .v92-c-colL .v92-c-idend{flex-direction:column;align-items:stretch;align-self:auto;gap:var(--sp-2);width:100%;}
.v92-card.b .v92-c-colL .v92-c-stat4{grid-template-columns:repeat(2,minmax(0,1fr));width:100%;}
.v92-card.b .v92-c-colL .v92-c-badges{justify-content:center;}
.v92-card.b .v92-c-grow{flex:1;display:flex;flex-direction:column;min-height:0;}
.v92-card.b .v92-c-grow > .v92-c-fill{flex:1;display:flex;flex-direction:column;min-height:0;}
.v92-card.b .v92-c-grow .v92-c-scroll{flex:1;overflow:auto;min-height:0;display:flex;flex-direction:column;justify-content:center;}
.v92-card.b .v92-c-rep-list,.v92-card.b .v92-c-evs{grid-template-columns:minmax(0,1fr);}

/* ------------------------------------------------------- 2. 缩略名片（小卡） */
/* 用于：计划协作人区 / 选人弹窗 / 群成员栏 */
.v92-mini{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2);border-radius:var(--r-s);cursor:pointer;
  border:1px solid var(--hair);background:var(--card);transition:border-color .15s,transform .15s;text-align:left;}
.v92-mini:hover{border-color:var(--primary);transform:translateY(-1px);}
.v92-mini:active{transform:scale(.985);}
.v92-mini-av{width:36px;height:36px;flex:0 0 36px;border-radius:var(--r-s);overflow:hidden;display:flex;align-items:center;
  justify-content:center;font-size:var(--fs-5);color:var(--on-grad);position:relative;
  background:linear-gradient(135deg,color-mix(in srgb,var(--primary) 74%,var(--card)),var(--primary-deep));}
.v92-mini-av img{width:100%;height:100%;object-fit:cover;display:block;}
.v92-mini-av .cc{position:absolute;right:-3px;bottom:-3px;width:16px;height:16px;border-radius:var(--r-full);
  font-size:var(--fs-1);line-height:16px;text-align:center;color:var(--on-grad);border:1.5px solid var(--card);
  background:linear-gradient(135deg,color-mix(in srgb,var(--primary) 60%,var(--gold)),var(--primary-deep));}
.v92-mini-mid{flex:1;min-width:0;}
.v92-mini-name{display:flex;align-items:center;gap:4px;font-size:var(--fs-3);font-weight:600;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.v92-mini-meta{display:flex;align-items:center;gap:4px;margin-top:2px;font-size:var(--fs-1);color:var(--text-sub);flex-wrap:wrap;}
.v92-mini-owner{font-size:var(--fs-1);padding:0 4px;border-radius:var(--r-s);background:var(--gold-bg);color:var(--gold-ink);}
.v92-mini-role{font-size:var(--fs-1);padding:0 6px;border-radius:var(--r-full);background:var(--primary-light);color:var(--primary-ink);}
.v92-mini-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:var(--sp-2);}
/* 缩略名片内的移除按钮 / 角色下拉（可编辑态） */
.v92-mini .x{cursor:pointer;color:var(--text-sub);font-size:var(--fs-2);padding:0 4px;flex:none;}
.v92-mini .x:hover{color:var(--danger-ink);}
.v92-mini .cm-role{font-size:var(--fs-1);border:1px solid var(--hair);border-radius:var(--r-s);padding:1px 4px;
  background:transparent;color:var(--text-sub);max-width:104px;}

/* ------------------- 3. 协作人区 / 选人弹窗（task-12：一行横滑，绝不换行） ------------------- */
.v92-sec-title{font-size:var(--fs-2);font-weight:700;color:var(--text-sub);margin:var(--sp-2) 0 var(--sp-1);}
.v92-assoc-wrap{display:flex;align-items:center;gap:var(--sp-2);width:100%;min-width:0;}
.v92-assoc-wrap .v92-assoc-row{flex:1;min-width:0;}
/* 单行横滑容器：成员卡 flex:0 0 auto，溢出横滑（JS 另绑 wheel → scrollLeft） */
.v92-assoc-row{display:flex;align-items:stretch;gap:var(--sp-2);flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
  padding:2px 2px var(--sp-1);scrollbar-width:thin;-webkit-overflow-scrolling:touch;}
.v92-assoc-row > *{flex:0 0 auto;}
.v92-assoc-row > .v92-mini{align-self:stretch;}
.v92-assoc-row::-webkit-scrollbar{height:6px;}
.v92-assoc-row::-webkit-scrollbar-thumb{background:var(--hair);border-radius:var(--r-full);}
.v92-assoc-row .v92-mini{width:186px;max-width:186px;}
.v92-assoc-row .v92-mini-mid{min-width:0;}
/* 正常尺寸按钮：不被容器拉满（width:auto 覆盖移动端 .btnp 的 width:100%） */
.v92-assoc-add{flex:0 0 auto;width:auto;height:32px;min-height:32px;max-height:32px;padding:0 12px;line-height:1;
  align-self:center;white-space:nowrap;display:inline-flex;align-items:center;gap:4px;}
.v92-assoc-more{flex:0 0 auto;font-size:var(--fs-1);color:var(--text-sub);white-space:nowrap;padding:0 4px;}
/* 选人弹窗：候选人一排卡片（缩略名片 + 角色 + 添加） */
.v92-pick-card{flex:0 0 auto;width:224px;display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-2);
  border-radius:var(--r-s);border:1px solid var(--hair);background:var(--card);box-sizing:border-box;}
.v92-pick-card .v92-mini{border:none;background:transparent;padding:0;width:100%;max-width:none;cursor:pointer;}
.v92-pick-card .v92-mini:hover{transform:none;border-color:transparent;}
.v92-pick-card-foot{display:flex;align-items:center;gap:var(--sp-1);}
.v92-pick-card-foot .role-sel{flex:1;min-width:0;font-size:var(--fs-1);border:1px solid var(--hair);
  border-radius:var(--r-s);padding:3px 5px;background:transparent;color:var(--text-sub);}
.v92-pick-card-foot .btn{flex:none;height:28px;padding:0 10px;font-size:var(--fs-1);}
/* 手机端弹层里的可点选候选卡 */
.v92-pick-card.on{border-color:var(--primary);background:var(--primary-light);}
.v92-pick-card .x{cursor:pointer;flex:none;color:var(--text-sub);font-size:var(--fs-2);padding:0 2px;}
.v92-pick-card.on .x{color:var(--primary-ink);}

/* ------------------------------------------------- 4. 待评价 / 写评（item 2） */
.v92-rev-lead{margin-bottom:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-radius:var(--r-s);font-size:var(--fs-2);
  line-height:1.7;background:var(--primary-light);color:var(--primary-ink);}
.v92-rev-plan{border:1px solid var(--hair);border-radius:var(--radius);padding:var(--sp-3);margin-bottom:var(--sp-3);background:var(--card);}
.v92-rev-plan-head{display:flex;align-items:center;gap:var(--sp-1);font-size:var(--fs-3);font-weight:700;margin-bottom:2px;}
.v92-rev-plan-head small{margin-left:auto;font-size:var(--fs-1);font-weight:400;color:var(--text-sub);}
.v92-rev-peer{padding:var(--sp-2) 0;border-top:1px dashed var(--hair);}
.v92-rev-peer:first-of-type{border-top:none;}
.v92-rev-peer.done{opacity:.72;}
.v92-rev-peerhead{display:flex;align-items:center;gap:var(--sp-2);}
.v92-rev-who{flex:1;min-width:0;font-size:var(--fs-2);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.v92-rev-who .role{font-size:var(--fs-1);color:var(--text-sub);margin-left:5px;}
.v92-rev-body{padding:2px 0 var(--sp-1);}
.v92-rev-body textarea{width:100%;min-height:52px;padding:var(--sp-2);border-radius:var(--r-s);font-size:var(--fs-2);
  line-height:1.6;border:1px solid var(--hair);background:var(--card);color:var(--text);resize:vertical;font-family:inherit;}
.v92-rev-body .row{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-1);font-size:var(--fs-1);color:var(--text-sub);}
.v92-rev-body .row .btn{margin-left:auto;}
.v92-rev-done{font-size:var(--fs-1);color:var(--ok-ink);flex:none;}

/* 4.1 星级控件（总分 + 分维度共用；recruit.js 兜底弹窗也用 .v92-stars） */
.v92-stars{flex:none;letter-spacing:1px;cursor:pointer;font-size:var(--fs-5);color:var(--text-light);user-select:none;line-height:1.2;}
.v92-stars i{font-style:normal;}
.v92-stars i.on{color:var(--gold-ink);}
.v92-stars.sm{font-size:var(--fs-2);letter-spacing:.5px;}
.v92-stars.total{font-size:var(--fs-5);}

/* 4.2 分维度评分（键名来自后端 peers[i].dimension_keys，契约 §3.3） */
.v92-dim-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:2px var(--sp-2);margin:2px 0;}
.v92-dim{display:flex;align-items:center;gap:var(--sp-1);font-size:var(--fs-1);color:var(--text-sub);}
.v92-dim-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* ------------------------------------------------------------------ 5. 手机 */
@media (max-width:640px){
  /* 5.1 名片压缩：首屏必须容得下「身份 + 数据 + 作品前 3 张」 */
  .v92-card{gap:16px;font-size:var(--fs-2);}   /* v0.8.9.2 统一卡间距 16px */
  .v92-card.b{grid-template-columns:minmax(0,1fr);}
  .v92-card.b .v92-c-colL .v92-c-id{flex-direction:row;align-items:center;text-align:left;gap:var(--sp-2);}
  .v92-card.b .v92-c-colL .v92-c-av{width:46px;height:46px;flex-basis:46px;font-size:var(--fs-6);border-radius:var(--r-m);}
  .v92-card.b .v92-c-colL .v92-c-idmid{align-items:flex-start;flex:1;min-width:0;}
  .v92-card.b .v92-c-colL .v92-c-name{justify-content:flex-start;font-size:var(--fs-5);}
  .v92-card.b .v92-c-colL .v92-c-tags{justify-content:flex-start;}
  .v92-card.b .v92-c-colL .v92-c-idend{align-self:stretch;width:auto;flex-direction:column;align-items:stretch;}
  .v92-c-id{gap:var(--sp-2);padding:var(--sp-2);flex-wrap:wrap;}
  .v92-c-av{width:46px;height:46px;flex-basis:46px;font-size:var(--fs-6);border-radius:var(--r-m);}
  .v92-c-idmid{min-width:0;flex:1;}
  .v92-c-name{font-size:var(--fs-4);}
  .v92-c-idend{flex-basis:100%;flex-direction:column;align-items:stretch;align-self:stretch;gap:var(--sp-2);}
  .v92-c-stat4{grid-template-columns:repeat(4,minmax(0,1fr));gap:4px;}
  .v92-c-stat{padding:3px 2px;border-radius:var(--r-s);}
  .v92-c-stat b{font-size:var(--fs-4);}
  .v92-c-stat span{font-size:var(--fs-1);overflow:hidden;text-overflow:ellipsis;}
  .v92-c-badges{gap:var(--sp-1);}
  .v92-c-badges.row{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;}
  .v92-c-badge{width:52px;}
  .v92-c-badge i{width:34px;height:34px;font-size:var(--fs-4);border-radius:var(--r-s);}
  .v92-c-badge span{max-width:52px;font-size:var(--fs-1);}
  .v92-c-sec{padding:16px;}
  .v92-c-sec-h{margin-bottom:var(--sp-1);}
  .v92-c-samples{gap:4px;}
  .v92-c-rep-list,.v92-c-evs{grid-template-columns:minmax(0,1fr);}
  .v92-card.a .v92-c-scroll,.v92-card.b .v92-c-grow .v92-c-scroll{max-height:168px;}
  .v92-mini-grid{grid-template-columns:minmax(0,1fr);}
  .v92-dim-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);}
  .v92-rev-body .row .btn{margin-left:auto;}
  /* 5.2 协作人一行横滑（手机端同样不换行） */
  .v92-assoc-row .v92-mini{width:172px;max-width:172px;}
  .v92-assoc-add{height:30px;min-height:30px;max-height:30px;padding:0 10px;}
}

/* --------------------- 6. item 8：经典版消息中心不出现「手机版流转」📱 按钮
   （按钮在 messages.js 侧按布局条件渲染；这里再做一层 CSS 兜底，防面板早于布局类渲染） */
#app.layout-classic #msg-float-qr{display:none;}

/* ------------------------------------------- 7. 无障碍 / 减少动效偏好 */
@media (prefers-reduced-motion:reduce){
  .v92-mini,.v92-mini:hover,.v92-mini:active{transition:none;transform:none;}
}

/* ══════════════════════════════════════════════════════════════════════
   v0.8.9.2 · 页面切换动画统一（Lead 指令：导航切换与页面内子页/tab 必须同一套）
   根因：导航模块切换用 `--ease-out`（平顺），页面内子页/tab 用 `--ease-spring`
        （cubic-bezier(.34,1.56,.64,1) 带回弹、起步快）→ 观感「页面内更快、还带弹」。
   口径：页面切换 = **内容替换** → 统一 `--ease-out`（无回弹）；`--ease-spring` 只留给
        弹窗/按钮这类「元素出现」的反馈。位移统一为同一组关键帧 pageSwitch。
   本文件在 index.html / m.html 都加载且位于 style.css 与 m.html 内联样式之后 → 同权重覆盖生效。
   ══════════════════════════════════════════════════════════════════════ */
:root {
  --dur-page: var(--dur-base, .26s);                              /* 页面切换时长 */
  --ease-page: var(--ease-out, cubic-bezier(.22, .61, .36, 1));     /* 页面切换缓动：无回弹 */
}
/* 层① 模块级切换（导航换模块）：允许位移 + 缩放 */
@keyframes pageSwitch {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}
/* 层②/③ 模块内切换（子视图 / tab / 数据切换）：**只 opacity，禁止任何位移/缩放**
   ——「数据换了」≠「页面换了」；带位移会让用户以为整页刷新（老板 L8 反馈） */
@keyframes pageFade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
/* ① 桌面：导航模块切换（app.js switchModule 给 #content 挂 .page-in，700ms 后摘除） */
.page-in,
.page-in > * {
  animation-name: pageSwitch;
  animation-duration: var(--dur-page);
  animation-timing-function: var(--ease-page);
  animation-fill-mode: backwards;
}
/* ② 页面内子面板 / tab（设置 4 子面板、资料库/设置 tab、计划·灵感 tab）→ 只淡入 */
.st-panel.active,
.tab.active,
.matab.active,
.st-panel.active > .card-title,
.topbar-title.switching.enter {
  animation: pageFade var(--dur-page) var(--ease-page);
}
/* ③ 模块内「数据切换」（物料规划换计划 / 切换分镜 / 切换分类 / 筛选）→ 只淡入，时长更短 */
.page-fade,
.mfx-data-fade {
  animation: pageFade var(--dur-fast, .18s) var(--ease-page);
}
/* ③ 手机：屏切换（m.html 原为 .22s ease / scrIn，现统一同一时长·缓动·关键帧） */
.scr.on {
  animation: pageSwitch var(--dur-page) var(--ease-page);
}
/* ④ prefers-reduced-motion：切换动画时长为 0（不做位移） */
@media (prefers-reduced-motion: reduce) {
  .page-in,
  .page-in > *,
  .st-panel.active,
  .tab.active,
  .matab.active,
  .scr.on,
  .page-fade,
  .mfx-data-fade,
  .topbar-title.switching.enter {
    animation-duration: 0s !important;
  }
}

/* ══════════════════════════════════════════════════════════════════════

/* ══════════ item 21-2：悬停缩略名片（与 _ui_preview_site/v0892_名片提效_预览.html 一致）══════════ */
/* v0.8.9.38（老板截图：悬浮名片压在计划封面上整片透出）——
   原用半透明玻璃面 --glass(rgba .8/.54) + backdrop 模糊，浮在大图上必然透底。
   悬浮卡是浮在任意内容之上的弹层 → 改**不透明卡面**，只在边缘保留描边与投影。 */
.v92-hovercard { position: fixed; z-index: var(--z-popover); width: 320px;
                 background: var(--card, #fff);
                 border: 1px solid var(--hair); border-radius: var(--r-l); box-shadow: var(--sh-2);
                 padding: 12px 13px 11px; font-size: var(--fs-3); color: var(--text); }
.v92-hovercard .hc-shots[data-hc]{cursor:pointer}   /* v0.8.9.38：缩略图整块可点 → 打开完整名片 */
.v92-hovercard .hc-load { font-size: var(--fs-2); color: var(--text-sub); padding: 8px 2px; }
.v92-hovercard .hc-top { display: flex; gap: 9px; align-items: flex-start; }
.v92-hovercard .hc-av { width: 44px; height: 44px; flex: none; border-radius: var(--r-s); overflow: hidden;
                        display: grid; place-items: center; font-size: 18px; background: var(--primary-light); }
.v92-hovercard .hc-mid { flex: 1; min-width: 0; }
.v92-hovercard .hc-name { display: flex; align-items: center; gap: 6px; font-size: var(--fs-4); font-weight: 700; }
.v92-hovercard .hc-cc { font-size: var(--fs-1); padding: 1px 7px; border-radius: var(--r-full);
                        background: var(--gold-bg); color: var(--gold-ink); font-weight: 700; }
.v92-hovercard .hc-sub { font-size: var(--fs-1); color: var(--text-sub); margin-top: 3px; }
.v92-hovercard .hc-star { color: var(--gold-ink); font-weight: 700; }
.v92-hovercard .hc-stats { display: flex; gap: 14px; margin: 10px 0 8px; padding-top: 9px;
                           border-top: 1px solid var(--hair); font-size: var(--fs-1); color: var(--text-sub); }
.v92-hovercard .hc-stats b { color: var(--text); font-size: var(--fs-4); }
.v92-hovercard .hc-shots { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.v92-hovercard .hc-shot { aspect-ratio: 1 / 1; border-radius: var(--r-s); border: 1px solid var(--hair);
                          background: rgba(120, 140, 180, .10) center/cover no-repeat; overflow: hidden; }
.v92-hovercard .hc-shot.more { display: grid; place-items: center; font-size: 11px; color: var(--text-sub); }
.v92-hovercard .hc-rev { margin-top: 9px; padding-top: 8px; border-top: 1px dashed var(--hair);
                         font-size: var(--fs-1); line-height: 1.65; color: var(--text-sub); }
.v92-hovercard .hc-rev q { color: var(--text); font-style: normal; }
.v92-hovercard .hc-rev .hc-rev-by { color: var(--text-light); }
.v92-hovercard .hc-acts { display: flex; gap: 6px; margin-top: 10px; }
.v92-hovercard .hc-acts .btn { height: 28px; padding: 0 10px; font-size: var(--fs-1); flex: 1; justify-content: center; }

   v0.8.9.2 · 口碑区重做（老板：左大综合评分 + 五颗星｜右按身份分栏，点击看明细）
   数据源：GET /api/users/{uid}/reviews = {rating_avg, rating_count, by_role, items}
   ══════════════════════════════════════════════════════════════════════ */
.v92-rep-wrap{display:grid;grid-template-columns:minmax(140px,180px) minmax(0,1fr);gap:var(--sp-3);align-items:center;}
.v92-rep-l{text-align:center;padding:var(--sp-2) 0;}
.v92-rep-score{font-size:calc(var(--fs-8) * 1.67);line-height:1.05;font-weight:800;letter-spacing:-1px;color:var(--text);}
.v92-rep-score.none{font-size:var(--fs-5);font-weight:700;color:var(--text-sub);letter-spacing:0;}
.v92-rep-sub{margin-top:4px;font-size:var(--fs-2);color:var(--text-sub);}
.v92-stars{display:inline-flex;gap:2px;vertical-align:middle;}
.v92-stars .st{position:relative;width:1em;height:1em;display:inline-block;}
.v92-stars .st::before{content:'★';position:absolute;top:0;left:0;color:var(--hair);}
.v92-stars .st.full::after,
.v92-stars .st.half::after{content:'★';position:absolute;top:0;left:0;color:var(--gold-ink);overflow:hidden;}
.v92-stars .st.half::after{width:50%;}
.v92-stars.lg{font-size:20px;margin-top:6px;}
.v92-stars.sm{font-size:12px;}
.v92-rep-right{display:flex;flex-direction:column;min-width:0;}
.v92-rep-row{display:flex;align-items:center;gap:var(--sp-2);padding:7px 8px;border-radius:var(--r-s);cursor:pointer;min-width:0;}
.v92-rep-row + .v92-rep-row{border-top:1px solid var(--hair);}
.v92-rep-row:hover,.v92-rep-row.on{background:color-mix(in srgb,var(--primary) 6%,transparent);}
.v92-rep-row .r{font-weight:700;font-size:var(--fs-3);min-width:3.4em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.v92-rep-row .s{display:inline-flex;align-items:center;gap:4px;color:var(--text-sub);font-size:var(--fs-2);}
.v92-rep-row .s b{color:var(--text);font-size:var(--fs-3);}
.v92-rep-row .n{margin-left:auto;color:var(--text-sub);font-size:var(--fs-2);white-space:nowrap;}
.v92-rep-row .gt{color:var(--text-light);}
.v92-rep-details{margin-top:var(--sp-2);}
.v92-rep-detail-h{font-size:var(--fs-2);color:var(--text-sub);margin-bottom:4px;}
.v92-rep-item{padding:8px 10px;border:1px solid var(--hair);border-radius:var(--r-s);margin-bottom:6px;}
.v92-rep-item .hd{display:flex;align-items:center;gap:6px;font-size:var(--fs-2);color:var(--text-sub);}
.v92-rep-item .who{font-weight:700;color:var(--text);}
.v92-rep-item .time{margin-left:auto;}
.v92-rep-item .txt{margin-top:4px;font-size:var(--fs-3);line-height:1.6;}
.v92-rep-dims{display:flex;flex-wrap:wrap;gap:4px;margin-top:5px;}
.v92-rep-dim{font-size:var(--fs-1);color:var(--text-sub);background:color-mix(in srgb,var(--primary) 6%,transparent);border-radius:var(--r-full);padding:1px 7px;}
.v92-rep-dim b{color:var(--text);margin-right:3px;font-weight:600;}
@media (max-width:640px){
  .v92-rep-wrap{grid-template-columns:minmax(0,1fr);gap:var(--sp-2);}
  .v92-rep-score{font-size:calc(var(--fs-8) * 1.5);}
  .v92-rep-l{padding:0 0 var(--sp-1);}
}
