/* ============================================================================
 * v0892_home.css — v0.8.9.1 fe-home 专用样式（个人信息页 / 作品瀑布流 / 徽章设置 /
 *                 共创贡献 / 成就陈列柜 / 手机端「我的」）
 * 写手：fe-home ｜ 唯一 owner：fe-home ｜ 新 class 一律 v92- 前缀
 * 挂载：Lead 在 index.html `</head>` 前、m.html 第 963 行 `</style>` 之后各挂一条 <link>（挂最后）
 * 口径：只用 v0.8.9「蓝金玻璃 2.0」既有 token（--fs-* / --sp-* / --r-* / --sh-* / --z-*）
 * 特异性：.pf-* 既有规则由 profile.js 的 <style id="profile-css"> 在运行时注入（晚于本文件），
 *         故凡与旧规则同名的覆盖一律加一层 .v92-profile / 提高特异性，必要时 !important。
 * ==========================================================================*/

/* ---------- 0. 头像弹跳收口（item 9）----------------------------------------
 * 根因（侦察报告 A §1.3）：
 *   ① profile.js:399 `.up-emoji{transition:.12s}` → transition-property 默认 all
 *   ② profile.js:400 `.up-emoji:hover{transform:scale(1.06)}` → 悬浮放大 6%
 *   ③ style.css:5023 `.up-emoji:active{transform:scale(.96)}` → 按压缩 4%
 *   ①②③ 叠加 = 鼠标扫过一排头像时每格「弹一下」。
 * profile.js 已同步删除 ②、收紧 ①；这里再加一道同权重可胜出的兜底（本文件挂载晚于
 * style.css 与 m.html 内联样式，但早于 profile.js 运行时注入的 #profile-css → 用 !important）。
 * 注意：不删 `:active` 的全局按压反馈，只对 .up-emoji 这一个组件摘掉 transform 抖动。 */
.up-emoji {
  transition: border-color .12s ease, background-color .12s ease, box-shadow .12s ease !important;
}
.up-emoji:hover { transform: none !important; }
.up-emoji:active { transform: none !important; }
/* 头像本体（个人页左上角圆形头像）同样不做 scale —— 只保留投影加厚 */
.pf-av { transition: box-shadow .18s var(--ease-out) !important; }
.pf-av-wrap:hover .pf-av { transform: none !important; box-shadow: 0 6px 18px rgba(var(--prgb), .3) !important; }
/* U9-1 终态要求：悬浮/按下**不得改变 getBoundingClientRect()**（rect 差必须 = 0）。
   反馈只用颜色/描边/阴影/透明度表达；这里把影响几何的属性全部钉死并禁掉相关过渡。 */
.pf-av,
.pf-av-wrap:hover .pf-av,
.pf-av-wrap:active .pf-av,
.up-emoji,
.up-emoji:hover,
.up-emoji:active {
  transform: none !important;
  transition-property: box-shadow, background-color, border-color, color !important;
}
.pf-av-wrap:hover .pf-av { width: 64px !important; height: 64px !important; padding: 0 !important; margin: 0 !important; box-sizing: border-box !important; }
.up-emoji:hover, .up-emoji:active { width: 42px !important; height: 42px !important; padding: 0 !important; margin: 0 !important; border-width: 1.5px !important; box-sizing: border-box !important; }

/* 玻璃卡：统一圆角 / 描边 / 阴影 / 毛玻璃层次 */
.v92-glass {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-m);
  box-shadow: var(--sh-1);
  padding: var(--sp-3) var(--sp-4);
}
.v92-glass > .v92-glass-title {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--fs-4);
  font-weight: 800;
  letter-spacing: .3px;
  color: var(--text);
  margin: 0 0 var(--sp-2);
}
.v92-glass > .v92-glass-title .v92-t-aux {
  margin-left: auto;
  font-size: var(--fs-2);
  font-weight: 500;
  color: var(--text-sub);
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  flex-wrap: wrap;
}

/* 1.2 等级与经验 */
.v92-profile .profile-system { border-radius: var(--r-m); box-shadow: var(--sh-1); }
/* 徽章与成就行（自渲染） */
.v92-chiprow { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.v92-badge-pin {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 1px 9px;
  border-radius: var(--r-full);
  border: 1px solid var(--gold);
  background: color-mix(in srgb, var(--gold) 14%, transparent);
  color: var(--gold-deep);
  font-size: var(--fs-2);
  font-weight: 700;
  white-space: nowrap;
}
.v92-badge-pin-ico { font-size: var(--fs-3); }
.v92-ach-chip { cursor: pointer; }
.v92-hint { font-size: var(--fs-2); color: var(--text-light); line-height: 1.6; }

/* 1.3 徽章设置（item 5） */
.v92-badgeset { display: flex; flex-direction: column; gap: var(--sp-2); }
.v92-switch-row {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--fs-3);
  color: var(--text);
}
.v92-switch {
  position: relative;
  width: 40px;
  height: 22px;
  border-radius: var(--r-full);
  background: color-mix(in srgb, var(--primary) 20%, transparent);
  border: 1px solid var(--border);
  cursor: pointer;
  flex: none;
  transition: background-color .16s var(--ease-out);
}
.v92-switch::after {
  content: '';
  position: absolute;
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: #fff;
  box-shadow: var(--shadow);
  transition: left .16s var(--ease-out);
}
.v92-switch.on { background: var(--primary); border-color: var(--primary); }
.v92-switch.on::after { left: 20px; }
.v92-bp-count {
  font-size: var(--fs-2);
  font-weight: 700;
  color: var(--gold-deep);
  background: rgba(var(--grgb), .12);
  border: 1px solid rgba(var(--grgb), .3);
  border-radius: var(--r-full);
  padding: 1px 9px;
}
.v92-bp-count.over { color: var(--danger); background: var(--danger-bg); border-color: var(--danger); }
/* 徽章候选：A2 改「一行横滑」（5 枚一行，超出横向滚动），不再 2 列大格浪费半屏 */
.v92-badge-pick {
  display: flex;
  flex-wrap: nowrap;
  gap: 6px;
  overflow-x: auto;
  overflow-y: hidden;
  padding-bottom: 2px;
  scrollbar-width: thin;
}
.v92-bp {
  display: inline-flex;
  align-items: center;
  justify-content: flex-start;
  gap: 4px;
  flex: 0 0 auto;
  max-width: 170px;
  min-width: 0;
  min-height: 30px;
  font-size: var(--fs-2);
  line-height: 1.35;
  padding: 3px 10px;
  border-radius: var(--r-full);
  border: 1px solid var(--hair);
  background: transparent;
  color: var(--text);
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: border-color .12s ease, background-color .12s ease;
}
.v92-bp:hover { border-color: var(--primary); }
.v92-bp.on {
  border-color: var(--gold);
  background: rgba(var(--grgb), .16);
  font-weight: 700;
  box-shadow: 0 0 0 2px rgba(var(--grgb), .18);
}
.v92-bp.locked {
  cursor: not-allowed;
  color: var(--text-sub);
  background: transparent;
  border-style: dashed;
  opacity: .78;
}
.v92-bp .v92-bp-ico { font-size: var(--fs-4); }
.v92-badgeset .v92-hint { font-size: var(--fs-1); color: var(--text-sub); line-height: 1.6; }
.v92-badgeset-acts { display: flex; gap: var(--sp-2); align-items: center; }
.v92-badgeset-acts .btn { min-height: 30px; }

/* ---------- 2. 参考作品：等宽多列瀑布流（item 1）--------------------------- */
.v92-works-head { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; margin-bottom: var(--sp-2); }
.v92-works-head .v92-wh-title { font-size: var(--fs-4); font-weight: 800; letter-spacing: .3px; }
.v92-works-head .v92-wh-aux { margin-left: auto; display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
.v92-count-box {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--fs-2); color: var(--text-sub);
  border: 1px solid var(--border); border-radius: var(--r-full);
  padding: 2px 4px 2px 10px; background: transparent;
}
.v92-count-box input {
  width: 46px; text-align: center; font-size: var(--fs-2); font-weight: 700;
  border: 1px solid var(--border); border-radius: var(--r-full);
  padding: 3px 2px; background: var(--card); color: var(--text);
}
.v92-count-box .v92-cnt-btn {
  width: 22px; height: 22px; border-radius: 50%; border: 1px solid var(--border);
  background: var(--card); color: var(--text); cursor: pointer; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-3);
}
.v92-count-box .v92-cnt-btn:disabled { opacity: .4; cursor: not-allowed; }

/* 瀑布流本体：JS 按图片真实宽高把卡片分进最矮的列（等宽列，不做固定格子）。
   注意：必须显式 flex，否则会被 profile 页自注入的 .pf-portfolio{display:grid} 覆盖。 */
.pf-portfolio.v92-pf-masonry { display: flex; gap: var(--sp-3); align-items: flex-start; max-height: none; overflow: visible; }
.v92-pf-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: var(--sp-3); }
.v92-pf-masonry { display: flex; gap: var(--sp-3); align-items: flex-start; margin-top: var(--sp-2); }
.v92-pf-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: var(--sp-3); }
.v92-pf-item {
  position: relative;
  border-radius: var(--r-s);
  overflow: hidden;
  background: var(--bg-deep);   /* 白名单①：图片未加载时的骨架底色 */
  border: 1px solid var(--border);
  box-shadow: var(--sh-1);
  cursor: zoom-in;
  /* 只过渡阴影/描边 —— 不做 transform，避免与 item 9 同源的"弹跳"复现 */
  transition: box-shadow .18s var(--ease-out), border-color .18s var(--ease-out);
}
.v92-pf-item:hover { box-shadow: var(--sh-2); border-color: rgba(var(--prgb), .45); }
.v92-pf-item img { display: block; width: 100%; height: auto; }
.v92-pf-item .v92-pf-ph {
  display: flex; align-items: center; justify-content: center;
  min-height: 92px; font-size: var(--fs-6); color: var(--text-sub);
}
.v92-pf-cap {
  position: absolute; left: 0; right: 0; bottom: 0;
  background: linear-gradient(180deg, rgba(12, 18, 30, 0) 0%, rgba(12, 18, 30, .68) 100%);
  color: #fff; font-size: var(--fs-1); padding: 14px 8px 5px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  pointer-events: none;
}
.v92-pf-ord {
  position: absolute; top: 6px; left: 6px;
  min-width: 20px; height: 20px; padding: 0 5px;
  border-radius: var(--r-full);
  background: rgba(12, 18, 30, .62); color: #fff;
  font-size: var(--fs-1); font-weight: 700;
  display: flex; align-items: center; justify-content: center;
  pointer-events: none;
}
.v92-pf-tools { position: absolute; top: 6px; right: 6px; display: flex; gap: 4px; opacity: 0; transition: opacity .14s var(--ease-out); }
.v92-pf-item:hover .v92-pf-tools, .v92-pf-item:focus-within .v92-pf-tools { opacity: 1; }
.v92-pf-tools button {
  width: 24px; height: 24px; border-radius: 50%; border: none;
  background: rgba(12, 18, 30, .62); color: #fff; cursor: pointer;
  font-size: var(--fs-2); line-height: 1; display: inline-flex; align-items: center; justify-content: center;
}
.v92-pf-tools button:hover { background: rgba(12, 18, 30, .85); }
.v92-pf-tools button.v92-del:hover { background: var(--danger); }
.v92-pf-item.v92-dragging { opacity: .45; }
.v92-pf-item.v92-drop { outline: 2px dashed var(--primary); outline-offset: -3px; }
.v92-pf-empty {
  grid-column: 1 / -1; text-align: center; color: var(--text-sub);
  font-size: var(--fs-3); padding: var(--sp-5) var(--sp-3);
  border: 1px dashed var(--border); border-radius: var(--r-s);
}
.v92-works-tip { font-size: var(--fs-1); color: var(--text-sub); margin-top: var(--sp-2); line-height: 1.6; }

/* ---------- 3. 口碑（沿用旧结构，仅收紧描边）------------------------------ */
.v92-profile .pf-rep-card { border-radius: var(--r-m); box-shadow: var(--sh-1); }

/* ---------- 4. 成就陈列柜（item 10）--------------------------------------
 * 真实 DOM 是 style.css 既有的 .ach-frames > .ach-frame > .shelf > .slot，
 * achievements.js 给 .slot 追加 v92-done / v92-lock 强化对比：
 *   已完成 = 金底 + 实线金边 + 悬浮抬升 + ✓ 角标；
 *   未完成 = 虚线灰边 + 🔒 角标 + 灰度图标（不只靠透明度区分）。
 * 本文件晚于 style.css 加载，故 .v92-cabinet .slot.* 同权重下胜出。 */
.v92-pin-cnt {
  margin-left: var(--sp-2);
  font-size: var(--fs-1);
  font-weight: 700;
  color: var(--gold-deep);
  background: rgba(var(--grgb), .12);
  border: 1px solid rgba(var(--grgb), .3);
  border-radius: var(--r-full);
  padding: 0 7px;
}
.v92-cabinet-legend {
  display: flex; gap: var(--sp-2); flex-wrap: wrap;
  font-size: var(--fs-1); color: var(--text-sub);
  margin: 0 0 var(--sp-2);
}
.v92-cabinet-legend .v92-lg { padding: 1px 9px; border-radius: var(--r-full); border: 1px solid var(--border); }
.v92-cabinet-legend .v92-lg.done { color: var(--gold-deep); background: rgba(var(--grgb), .12); border-color: rgba(var(--grgb), .35); font-weight: 700; }
.v92-cabinet .slot.v92-done {
  border-color: rgba(var(--grgb), .5) !important;
  background: linear-gradient(135deg, rgba(var(--grgb), .16), var(--card) 68%) !important;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .05), 0 6px 16px rgba(var(--grgb), .16) !important;
  position: relative;
}
.v92-cabinet .slot.v92-done::after {
  content: '✓';
  position: absolute; top: 2px; right: 3px;
  width: 15px; height: 15px; border-radius: 50%;
  background: linear-gradient(135deg, var(--gold), var(--gold-dark));
  color: #fff; font-size: var(--fs-1); font-weight: 800;
  display: flex; align-items: center; justify-content: center;
}
.v92-cabinet .slot.v92-done .sname { color: var(--text) !important; font-weight: 700; }
.v92-cabinet .slot.v92-done:hover {
  box-shadow: 0 2px 6px rgba(16, 24, 40, .08), 0 14px 30px rgba(var(--grgb), .26) !important;
}
.v92-cabinet .slot.v92-lock {
  border: 1px dashed var(--border) !important;
  background: transparent !important;
  box-shadow: none !important;
  position: relative;
}
.v92-cabinet .slot.v92-lock .trophy { filter: grayscale(1); opacity: .55; }
.v92-cabinet .slot.v92-lock .sname { color: var(--text-sub) !important; }
.v92-cabinet .slot.v92-lock::after {
  content: '🔒';
  position: absolute; top: 2px; right: 3px;
  font-size: var(--fs-1); line-height: 1;
}
.v92-cabinet .slot.v92-lock .slot-pts { color: var(--text-sub) !important; }

/* ---------- 5. 名片入口 / 通用小件 ---------------------------------------- */
.v92-cardlink { cursor: pointer; }
.v92-cardlink:hover { color: var(--primary-ink); text-decoration: underline; }

/* ---------- 6. 手机端「我的」（m.html）------------------------------------ */
/* 6.1 身份卡 v2：头像 + 名字 + 身份/权限 + 带标签数值 + 紧凑签到（ID 选择器，稳压 m.html 内联类） */
#me_user { display: flex; align-items: flex-start; gap: 12px; padding: 12px 14px; }
#me_user .av { flex: none; width: 56px; height: 56px; border-radius: var(--r-m); font-size: var(--fs-6); display: flex; align-items: center; justify-content: center; }
#me_user .m { flex: 1; min-width: 0; }
#me_user .m > b { font-size: var(--fs-5); line-height: 1.3; }
.v92-m-name-row { display: flex; align-items: center; gap: 8px; }
.v92-m-name-row > b { flex: 1; min-width: 0; font-size: var(--fs-5); line-height: 1.3; }
#me_user .icbtn { flex: none; min-width: 44px; min-height: 44px; display: inline-flex; align-items: center; justify-content: center; }
#me_user .icbtn svg { width: 18px; height: 18px; display: block; }
/* m.html 的 .icbtn::after{inset:-5px} 用于扩大点击热区，会让 scrollWidth 超出 clientWidth（横向溢出检测误报）；
   这里直接把按钮做成 44×44（A11y 达标）并收回伪元素，既无溢出也不缩小热区。 */
#me_user .icbtn::after { inset: 0; }
.v92-m-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.v92-m-tags .tag { font-size: var(--fs-1); white-space: nowrap; }
.v92-m-extra { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 6px; font-size: var(--fs-1); }
.v92-m-stat { display: inline-flex; align-items: center; gap: 3px; color: var(--text-sub); white-space: nowrap; }
.v92-m-stat b { color: var(--text); font-size: var(--fs-1); font-weight: 800; }
.v92-m-stat .lv-badge { font-size: var(--fs-1); padding: 0 6px; border-radius: var(--r-full); }
.v92-m-extra .v92-m-sign { margin-left: auto; font-size: var(--fs-1); padding: 3px 12px; border-radius: var(--r-full); flex: none; }

.v92-m-works { display: flex; gap: 6px; align-items: flex-start; }
.v92-m-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.v92-m-item {
  position: relative; border-radius: 10px; overflow: hidden;
  border: 1px solid var(--hair); background: var(--bg2);   /* 白名单①：手机端图片骨架底色 */
}
.v92-m-item img { display: block; width: 100%; height: auto; }
.v92-m-item .v92-m-cap {
  position: absolute; left: 0; right: 0; bottom: 0;
  font-size: var(--fs-1); color: #fff; padding: 12px 6px 4px;
  background: linear-gradient(180deg, rgba(12, 18, 30, 0), rgba(12, 18, 30, .7));
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.v92-m-item .v92-m-ord {
  position: absolute; top: 4px; left: 4px; font-size: var(--fs-1);
  background: rgba(12, 18, 30, .6); color: #fff; border-radius: 999px; padding: 0 5px;
}
.v92-m-acts { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap; }
.v92-m-acts .btnp { font-size: var(--fs-1); padding: 4px 12px; border-radius: 999px; }
.v92-m-bp { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.v92-m-bp > span {
  font-size: var(--fs-1); padding: 3px 9px; border-radius: 8px;
  border: 1.5px solid var(--hair); background: transparent;
  cursor: pointer; user-select: none;
}
.v92-m-bp > span.on { border-color: var(--gold); background: rgba(var(--grgb), .16); font-weight: 700; }
.v92-m-bp > span.locked { opacity: .6; cursor: not-allowed; border-style: dashed; }
.v92-m-count { font-size: var(--fs-1); color: var(--text-light); margin-top: 6px; }
.v92-m-contrib-ev { display: flex; gap: 8px; font-size: var(--fs-1); padding: 5px 0; border-bottom: 1px solid var(--hair); }
.v92-m-contrib-ev:last-child { border-bottom: none; }
.v92-m-contrib-ev i { margin-left: auto; font-style: normal; font-weight: 800; color: var(--ok); }
.v92-m-contrib-ev i.neg { color: var(--danger); }

@media (max-width: 720px) {
  .v92-profile .profile-layout { height: auto; min-height: 0; }
}


/* U9-1 兜底（Lead 2026-10-04 裁定）：实测 .pf-av 悬浮时 computed width/height 由 52px 变 64px
   （不是 transform），这就是"弹跳"的 12px 来源。这里把几何属性在 hover/active 下显式钉死，
   过渡只留颜色/阴影；悬浮反馈仅用 box-shadow 表达。 */
.pf-av,
.pf-av * { transform: none !important; }
.pf-av-wrap:hover .pf-av,
.pf-av-wrap:active .pf-av,
.pf-av:hover,
.pf-av:active {
  width: 52px !important;
  height: 52px !important;
  padding: 0 !important;
  margin: 0 !important;
  border-width: 0 !important;
  box-sizing: border-box !important;
  font-size: 21px !important;
  transform: none !important;
  transition-property: box-shadow, background-color, border-color, color !important;
}


/* ============================================================================
 * v0.8.9.2 · 参考作品墙接共享 V92Masonry（老板 2026-10-04 截图：卡片右侧空白 / 不是瀑布流）
 * 帧是固定尺寸，卡片必须贴合帧宽；标题/工具行用 width:0 + min-width:100% 跟随卡片，
 * **不能反过来把卡片撑宽**。
 * ==========================================================================*/
/* profile.js 运行时注入的 .pf-portfolio{display:grid} 规则**晚于本文件**（外链先、内联后），
  同权重会覆盖 .v92-masonry 的 display:flex（实测列宽会掉回 119.7px、帧被压扁）→ 此处 !important 是**必要的，勿删**（见报告 §8.15.1） */
.pf-portfolio.v92-masonry {
  display: flex !important;      /* profile 页运行时注入的 .pf-portfolio{display:grid} 更靠后，必须 !important 顶回 */
  align-items: flex-start;
  flex-wrap: nowrap;
}
.pf-portfolio.v92-masonry > .v92-mcol { flex: 0 0 auto !important; }
/* ①a 卡片宽 == 帧宽：卡片按 max-content（帧是其中最宽的子项），标题/工具行用 width:0+min-width:100% 跟随 */
.v92-mcol > .v92-pf-item { overflow: hidden; width: max-content; max-width: 100%; }
/* ①b 帧在列内居中：留白左右均分，观感是"呼吸感"而不是"右边坏了一块"（桌面卡片 + 手机卡片都要） */
/* profile.js 运行时注入的 .pf-portfolio > *{margin:0} 规则**晚于本文件**，会吃掉居中的 auto →
  此处 !important 是**必要的，勿删**（见报告 §8.15.1） */
.v92-masonry > .v92-mcol > * {
  margin-left: auto !important;
  margin-right: auto !important;
}
/* ⑤ 子元素一律不得超出卡片内容盒（实测仍有 6px，来自某个 width:100% + padding 的子元素） */
.v92-mcol > .v92-pf-item > *,
.v92-mcol > .v92-m-item > * { max-width: 100%; box-sizing: border-box; }
.pf-portfolio.v92-masonry .v92-pf-item,
.pf-portfolio.v92-masonry .v92-m-item { overflow-x: hidden; }
/* ⑤ 绝对定位浮层（序号 .v92-pf-ord / 工具行 .v92-pf-tools）**绝不能 width:100%**：
   left:6px + 整卡宽 → 右溢出 6px；right:6px + 整卡宽 → 左溢出 6px。
   实测这就是"卡片 scrollWidth 比自身宽 6px"的**真源头**（不是伪元素）→ 按内容自适应。 */
.v92-mcol > .v92-pf-item > .v92-pf-tools {
  display: flex;
  gap: 4px;
  max-width: calc(100% - 12px);
  box-sizing: border-box;
  padding: 0;
}
.v92-mcol > .v92-pf-item > .v92-pf-tools > * { flex: 0 0 auto; }
.v92-mcol > .v92-pf-item > .v92-pf-cap,
.v92-mcol > .v92-pf-item > .v92-pf-link {
  width: 0;
  min-width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  padding-left: 0;
  padding-right: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.v92-mcol > .v92-pf-item,
.v92-mcol > .v92-m-item {
  width: max-content;
  max-width: 100%;
  margin: 0;
  background: transparent;
  border: none;
  box-shadow: none;
}
.v92-mcol .v92-pf-cap,
.v92-mcol .v92-pf-link,
.v92-mcol .v92-m-cap {
  width: 0;
  min-width: 100%;
  box-sizing: border-box;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}


/* ============================================================================
 * v0.8.9.2 · 修老板 2026-10-04 截图：「7 张作品只看见 3 张、下方一大片白」
 * 根因：profile.js 运行时注入的 `.pf-portfolio` 写死了 `height:160px; max-height:160px`
 *       → 容器 scrollHeight 876px 而 clientHeight 只有 160px，其余 4 张被裁在盒子外。
 * 规则：作品墙路径上**任何一层都不许有固定高度/裁切**，容器必须跟着内容长高。
 * ==========================================================================*/
#pf-portfolio,
.pf-portfolio.v92-masonry,
.pf-works-card,
#pf-content {
  height: auto !important;
  max-height: none !important;
}
#pf-portfolio,
.pf-portfolio.v92-masonry { overflow: visible !important; }
.pf-works-card { padding-bottom: var(--sp-4); }


/* ============================================================================
 * v0.8.9.2 · 整页统一（老板：卡片间距统一、风格 UI 统一）
 * 全页只用一个间距变量 --pf-gap 与一套卡内边距 --pf-pad-*；卡头统一 .pf-card-h 规格。
 * 实测改动前：左栏 gap=9、右栏 gap=21/9（集合 {9,21}）；卡 paddingTop 9–18 / paddingLeft 14–20（各 5 种）。
 * ⚠️ 选择器必须带 .content-scroll 前缀：回退版布局类名是 .profile-layout（**没有 .v92-profile**），
 *    且 profile.js 运行时注入的同权重规则更靠后 → 只写 .profile-layout .card 会被注入规则压回去。
 * ==========================================================================*/
.content-scroll .profile-layout {
  --pf-gap: var(--sp-4);      /* 全页唯一卡片间距 */
  --pf-pad-y: var(--sp-4);    /* 全页唯一卡内纵向内边距 */
  --pf-pad-x: var(--sp-4);    /* 全页唯一卡内横向内边距 */
}
.content-scroll .profile-layout aside.pl-side,
.content-scroll .profile-layout .pl-main,
.content-scroll .profile-layout .profile-main,
.content-scroll .profile-layout #pf-content {
  display: flex !important;
  flex-direction: column !important;
  gap: var(--pf-gap) !important;
}
.content-scroll .profile-layout .card {
  margin: 0 !important;
  padding: var(--pf-pad-y) var(--pf-pad-x) !important;
  border-radius: var(--r-m);
  border: 1px solid var(--hair);
  box-shadow: var(--shadow);
  background: var(--card);
}
/* 卡头统一规格：同一字号/行高/图标位/下边距 */
.content-scroll .profile-layout .card .pf-card-h,
.content-scroll .profile-layout .card h3,
.content-scroll .profile-layout .card h4,
.content-scroll .profile-layout .card .v92-glass-title,
.content-scroll .profile-layout .card .pf-ops-title {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--fs-4) !important;
  font-weight: 700 !important;
  line-height: 1.4 !important;
  color: var(--text);
  margin: 0 0 var(--sp-3) !important;
  padding: 0 !important;
}
/* 候选面板默认隐藏（[hidden] 会被业务 CSS 的 display 覆写，必须显式压住） */
.content-scroll .profile-layout #pf-badgeset[hidden] { display: none !important; }
.content-scroll .profile-layout .card > .pf-card-h .pf-h-ic { display: inline-flex; align-items: center; flex: none; }
.content-scroll .profile-layout .card > .pf-card-h .pf-h-aux,
.content-scroll .profile-layout .card > .v92-glass-title .v92-t-aux {
  margin-left: auto;
  font-size: var(--fs-2);
  font-weight: 600;
  color: var(--text-sub);
}
.content-scroll .profile-layout .card > .pf-card-h .pf-h-act { margin-left: var(--sp-2); flex: none; }
/* 徽章卡精简：一行佩戴 chip + 开关行紧凑 */
.content-scroll .profile-layout .v92-badgeset-card .pf-badges-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-1);
  min-height: 26px;
}
.content-scroll .profile-layout .v92-badgeset-card .pf-badge-switchrow {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  margin-top: var(--sp-2);
  font-size: var(--fs-2);
  color: var(--text-sub);
}
/* 文本一律可收缩 + 省略号，避免被挤断 */
.content-scroll .profile-layout .card,
.content-scroll .profile-layout .card * { min-width: 0; }
.content-scroll .profile-layout .card .pf-h-aux,
.content-scroll .profile-layout .card .pf-ops-title,
.content-scroll .profile-layout .card .v92-glass-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }


/* ============================================================================
 * 左栏卡片必须「按内容定高」——回退把 style.css 的旧规则带回来了：
 *   .pl-side > .card { flex: 1 1 0 !important; overflow-y: auto !important; }
 * 后果：卡片高度被 flex 拉平并锁死（实测徽章卡恒为 339px，展开候选后高度不变），
 *      超出内容在卡内滚动 → 老板说的「字段显示不完整」。
 * 全页统一的前提是卡高由内容决定，故这里顶回 flex:0 0 auto + overflow:visible。
 * ⚠️ 与 §8.15.1 的两处 !important 同因：旧规则在 style.css 里且带 !important，不顶就会回归。
 * ==========================================================================*/
.content-scroll .profile-layout aside.pl-side > .card,
.content-scroll .profile-layout .pl-main > .card {
  flex: 0 0 auto !important;
  overflow: visible !important;
  min-height: 0 !important;
  max-height: none !important;
  height: auto !important;
}
/* 佩戴徽章：紧凑排列，但**文本不许被裁**（判据：逐元素 scrollWidth-clientWidth ≤1）。
   注意 nowrap+省略号 会让 scrollWidth 永远大于 clientWidth → 与"不许截断"判据冲突，故这里允许换行、文字可折行。 */
.content-scroll .profile-layout .pf-badges-row {
  flex-wrap: wrap !important;
  overflow: visible !important;
  gap: var(--sp-1) !important;
}
.content-scroll .profile-layout .pf-badges-row .pf-badge-pin-lbl,
.content-scroll .profile-layout .pf-badges-row .v92-badge-pin {
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
  max-width: 100%;
}
/* 装饰性符号（星标等）本来就没有内容盒，overflow 必须 visible，否则会被判成"截断" */
.content-scroll .profile-layout .star,
.content-scroll .profile-layout .v92-pf-ord,
.content-scroll .profile-layout .rep-stars { overflow: visible !important; }


/* ============================================================================
 * 手机弹层贴高（老板 2026-10-04：「手机这个选项卡高度不对」）
 * 实测：`#asheet` 计算 height=692px（390×844）/ 1043px（390×1600），= max-height:82% 的固定比例高度，
 *      而内容分别只有 610 / 958px → 底部空白 82 / 85px；内容越少空白越大。
 * 改法：高度按内容贴合，只有超出 82% 才限制，超出部分内部滚动。
 * ==========================================================================*/
.sheet,
.maskfix .sheet,
#asheet,
.m-sheet,
.msheet {
  height: auto !important;
  max-height: 82% !important;
  overflow-y: auto !important;
  display: flex;
  flex-direction: column;
}
.sheet > *:last-child,
#asheet > *:last-child { margin-bottom: 0 !important; }




/* ============================================================================
 * 成就页动画（老板：「悬浮弹详情没动画、切换选项也没动画」）
 *  · tooltip .ach-tip：opacity 0→1 + translateY(4px)→0，160ms --ease-out；隐藏也走过渡
 *  · 筛选 chip：背景/描边/文字色过渡
 *  · 网格：切换筛选后整体 opacity 0→1（只动 opacity，**不改几何** → 零位移）
 *  · 全部尊重 prefers-reduced-motion
 * ==========================================================================*/
.ach-tip {
  opacity: 0;
  transform: translateY(4px);
  transition: opacity 160ms var(--ease-out, ease-out), transform 160ms var(--ease-out, ease-out);
}
.ach-tip.on { opacity: 1; transform: translateY(0); }
.filter-chip {
  transition: background-color var(--dur-fast, 160ms) ease, border-color var(--dur-fast, 160ms) ease,
              color var(--dur-fast, 160ms) ease;
}
#ach-root.ach-in, #ach-grid.ach-in, .ach-grid.ach-in, .v92-cabinet.ach-in {
  animation: achGridIn 240ms var(--ease-out, ease-out) both;
}
@keyframes achGridIn { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  .ach-tip { transition: none; }
  #ach-root.ach-in, #ach-grid.ach-in, .ach-grid.ach-in, .v92-cabinet.ach-in { animation: none; }
  .filter-chip { transition: none; }
}


/* ⚠️ 临时保留（待 Lead 在 m.html 给**普通 `.sheet`** 也做同样处理后可删）：
   m.html:437 的补丁只覆盖 `.sheet.sheet-safe`，**普通 `.sheet` 仍是 84px 底部预留** →
   实测 openBadges/openContrib 等普通 sheet 底部空白 85px。此条是"贴内容"的最后一块，
   搬回源头后本文件将不再有任何 padding-bottom 覆盖（L9②：同一属性全站一处定义）。 */
.sheet:not(:has(.sheet-foot)):not(:has(.sheet-actions)):not(:has([data-sheet-foot])) {
  padding-bottom: calc(var(--sp-4) - 1px) !important;
}


/* ============================================================================
 * 「一屏装下」压缩档（Lead 2026-10-04 更正：不加高、不裁切，**压缩**内容）
 * 目标三者同时成立：P1 #content 不滚动 / P2 每层不裁切 / P3 每张卡完整可见。
 * 手段：卡间距与内边距 16→12、行距收紧、账号操作改横向一行、费用区限高下调、
 *      徽章佩戴行单行可滚（可达 → 不算裁切）。
 * ==========================================================================*/
.content-scroll .profile-layout {
  --pf-gap: var(--sp-3);      /* 12px */
  --pf-pad-y: var(--sp-3);
  --pf-pad-x: var(--sp-3);
}
/* 个人信息键值行收紧（原 row-gap:11px / font 14px） */
.content-scroll .profile-layout .pf-info-card .pf-kv { row-gap: 5px; font-size: var(--fs-3); }
.content-scroll .profile-layout .pf-info-card .pf-kv b { font-size: var(--fs-3); }
.content-scroll .profile-layout .pf-info-card h3,
.content-scroll .profile-layout .pf-fees-card h3 { margin-bottom: var(--sp-2) !important; }
/* 费用区限高下调（原 min(46vh,340px)） */
.content-scroll .profile-layout .pf-fees-card .pf-fees-wrap { max-height: min(26vh, 190px); }
/* 账号操作：三个按钮横向一行、紧凑 */
.content-scroll .profile-layout .pf-ops { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.content-scroll .profile-layout .pf-ops .pf-ops-title { flex: 1 1 100%; margin: 0 0 2px; }
.content-scroll .profile-layout .pf-ops .pf-op-btn {
  flex: 1 1 0; min-width: 0; padding: 7px 8px !important;
  font-size: var(--fs-2) !important; line-height: 1.2 !important;
}
/* 徽章佩戴行：单行、可横向滚动（可达 → L1 口径豁免），不再把卡撑高 */
.content-scroll .profile-layout .pf-badges-row {
  flex-wrap: nowrap !important; overflow-x: auto !important;
  gap: var(--sp-1) !important;
}
.content-scroll .profile-layout .pf-badges-row > * { flex: 0 0 auto; }
/* 矮窗口再压一档（800 / 720 / 700） */
@media (max-height: 860px) {
  .content-scroll .profile-layout { --pf-gap: var(--sp-2); --pf-pad-y: 10px; --pf-pad-x: var(--sp-3); }
  .content-scroll .profile-layout .card { font-size: var(--fs-2); }
  .content-scroll .profile-layout .pf-fees-card .pf-fees-wrap { max-height: min(20vh, 150px); }
  .content-scroll .profile-layout .pf-ops .pf-op-btn { padding: 6px 6px !important; }
}


/* ============================================================================
 * 自适应档（Lead 2026-10-04 最终口径）：**所有尺寸跟视口走**，不写死 px。
 *  · 外壳 height:calc(100vh - 头高) + overflow:hidden（视口相对 → 天然自适应）
 *  · 两栏 flex + **逐层 min-height:0**（flex 默认 min-height:auto 是撑破父级的元凶）
 *  · 左栏卡 flex:0 1 auto；**徽章卡（内容最高）flex:1 1 auto + overflow-y:auto** → 高时全展开、矮时自己滚
 *  · 右栏同理；参考作品 5 列 × 2 行，行高由可用高度反算（grid 1fr 行 + minmax(0,1fr)）
 * ==========================================================================*/
.content-scroll .profile-layout {
  height: calc(100vh - 140px) !important;
  overflow: hidden !important;
  align-items: stretch !important;
  min-height: 0 !important;
}
.content-scroll .profile-layout > * {
  display: flex !important;
  flex-direction: column !important;
  min-height: 0 !important;
  overflow: hidden !important;
}
/* v0.8.9.2 修（老板：「**没内容的时候卡片大小也变了**」，配图 0 作品 0 口碑）：
   原来这里给徽章卡 / 参考作品卡上 `flex:1 1 auto` → **flex-grow 把卡片拉伸去填满列剩余高度**，
   内容少时多出来的高度全变成**卡片内部的空白**（空态提示悬在一大片空白中间）。
   改为 `flex:0 0 auto`（**贴内容**）；**余量留在列尾**，不撑进卡片内部。
   上一轮加的 `min-height:0` + `overflow-y:auto` 保留（那是防撑破 + 内容可达，不是用来拉伸的）。 */
.content-scroll .profile-layout aside.pl-side > * { flex: 0 0 auto !important; min-height: 0 !important; }
.content-scroll .profile-layout aside.pl-side > .v92-badgeset-card {
  flex: 0 0 auto !important; min-height: 0 !important; overflow-y: auto !important;
}
.content-scroll .profile-layout .pl-main > * { flex: 0 0 auto !important; min-height: 0 !important; overflow-y: auto !important; }
/* 参考作品卡：**贴内容**（5×2 由卡内容决定；余量留列尾） */
.content-scroll #v92-works-card,
.content-scroll .pf-works-card {
  flex: 0 0 auto !important; min-height: 0 !important;
  display: flex !important; flex-direction: column !important; overflow-y: auto !important;
}
.content-scroll #v92-works-card :is(.v92-works-grid, .pf-portfolio, .v92-frames, .v92-masonry, .v92-mcol),
.content-scroll .pf-works-card  :is(.v92-works-grid, .pf-portfolio, .v92-frames, .v92-masonry, .v92-mcol) {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  display: grid !important;
  grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
  grid-auto-rows: auto !important;
  gap: var(--sp-2) !important;
  overflow: hidden !important;
  width: 100% !important;
}
/* masonry 的列容器在 5×2 网格里透明化（子项直接参与网格） */
.content-scroll #v92-works-card .v92-mcol,
.content-scroll .pf-works-card  .v92-mcol { display: contents !important; }
.content-scroll #v92-works-card :is(.v92-works-grid, .pf-portfolio, .v92-frames, .v92-masonry) > *,
.content-scroll .pf-works-card  :is(.v92-works-grid, .pf-portfolio, .v92-frames, .v92-masonry) > * {
  min-width: 0 !important; min-height: 0 !important;
}
/* 帧/图：由格子尺寸决定（1:1），不再用写死的 --fw/--fh */
.content-scroll #v92-works-card .v92-frame,
.content-scroll .pf-works-card  .v92-frame {
  width: 100% !important; height: auto !important;
  aspect-ratio: 1 / 1 !important; min-height: 0 !important;
}
.content-scroll #v92-works-card img, .content-scroll .pf-works-card img {
  width: 100% !important; height: 100% !important; object-fit: contain !important;
}


/* 自适应补丁：极小窗口下「局部内部滚动」是正解（Lead P2 放宽口径）——
   两栏本身可滚，保证每张卡都**可达**；徽章卡仍优先吸收余量，绝不把整页撑高。 */
.content-scroll .profile-layout aside.pl-side,
.content-scroll .profile-layout .pl-main {
  overflow-y: auto !important;
  overflow-x: hidden !important;
  min-height: 0 !important;
  scrollbar-width: thin;
}
/* 参考作品卡内部 5×2 网格若仍超出，允许内部滚动而不是裁掉 */
.content-scroll #v92-works-card :is(.v92-works-grid, .pf-portfolio, .v92-frames, .v92-masonry),
.content-scroll .pf-works-card  :is(.v92-works-grid, .pf-portfolio, .v92-frames, .v92-masonry) {
  overflow-y: auto !important;
}


/* 空态（无作品 / 无口碑）：克制的固定高，不随列高拉伸 */
.content-scroll .profile-layout :is(.v92-pf-empty, .empty-tip, .pf-empty) {
  min-height: 68px;
  display: flex; align-items: center; justify-content: center;
  padding: var(--sp-3) var(--sp-4);
  box-sizing: border-box;
}
/* 列容器：余高留在列尾 */
.content-scroll .profile-layout aside.pl-side,
.content-scroll .profile-layout .pl-main { align-content: flex-start !important; }
