/* 职见 AI · 样式表 v5
 * 视觉基准：浅色卡片 + 蓝色渐变 Hero，左侧导航（桌面）/ 底部标签（移动）
 * 断点：≤900px 收成移动布局；≤560px 进一步压缩
 * 约定：所有区块可在运营后台配置顺序与显隐，DOM 上以 [data-block] 标记
 */

/* ============================================================
   1. 变量与基础
   ============================================================ */

:root{
  --primary:#2f5bff;
  --primary2:#6d5cff;
  --primary-soft:#eef2ff;
  --green:#16a34a;
  --orange:#f59e0b;
  --red:#dc2626;
  --ink:#1b2130;
  --text:#384056;
  --muted:#8b95a6;
  --line:#e8ebf2;
  --soft:#f4f6fb;
  --soft2:#f7f8fc;
  --bg:#f6f7fb;
  --white:#fff;
  --r:18px;
  --r-sm:12px;
  --r-xs:9px;
  --shadow:0 6px 22px rgba(30,40,80,.06);
  --shadow-lg:0 16px 44px rgba(30,40,80,.12);
  --side-w:230px;
  --nav-h:60px;
}

*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0}
body{
  background:var(--bg);color:var(--text);
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;
}
h1,h2,h3{margin:0;color:var(--ink);line-height:1.35}
p{margin:0}
ul{margin:0;padding:0;list-style:none}
button{font-family:inherit;font-size:inherit;border:0;background:none;cursor:pointer;color:inherit}
input,textarea,select{font-family:inherit;font-size:inherit;color:inherit}
a{text-decoration:none;color:inherit}
img{max-width:100%;display:block}
[hidden]{display:none !important}

.sprite{position:absolute;width:0;height:0;overflow:hidden}
.ic{width:19px;height:19px;flex:none;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.mut{color:var(--muted)}
.center{text-align:center}
.linky{color:var(--primary);font-weight:700;cursor:pointer;border-bottom:1px dashed currentColor}

/* ============================================================
   2. 按钮
   ============================================================ */

.btn-primary,.btn-ghost,.btn-mini,.btn-link{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  border-radius:var(--r-sm);font-weight:700;transition:.18s;white-space:nowrap;
}
.btn-primary{
  padding:12px 22px;font-size:14px;color:#fff;
  background:linear-gradient(135deg,var(--primary),var(--primary2));
  box-shadow:0 8px 20px rgba(47,91,255,.26);
}
.btn-primary:hover{transform:translateY(-1px);box-shadow:0 12px 26px rgba(47,91,255,.32)}
.btn-primary:disabled{opacity:.6;transform:none;box-shadow:none;cursor:default}
.btn-ghost{
  padding:11px 20px;font-size:13.5px;color:#5b6675;
  background:var(--white);border:1px solid var(--line);
}
.btn-ghost:hover{border-color:#cfd6ff;color:var(--primary);background:#fafbff}
.btn-ghost:disabled{opacity:.55;cursor:default}
.btn-mini{
  padding:7px 14px;font-size:12.5px;color:var(--primary);
  background:var(--primary-soft);border:1px solid #dde3ff;
}
.btn-mini:hover{background:#e4e9ff}
.btn-link{
  padding:8px 4px;font-size:13px;color:var(--primary);
  background:none;border:0;text-decoration:underline;text-underline-offset:3px;
}
.sm{padding:8px 15px;font-size:13px}
.wide{width:100%}

/* 交互统一（V16 需求：全站按钮/交互巡检）
   1) 移动端点按不再出现灰蓝高亮块，并去掉 300ms 点击延迟；
   2) .btn-* / .side-upgrade / 底部导航此前都没有 :active，点击缺少即时反馈，补上轻微回弹；
   3) 全站此前没有 :focus-visible，键盘 Tab 时看不到焦点落在哪，补一条清晰焦点环。 */
button,a,[role="button"],summary{-webkit-tap-highlight-color:transparent;touch-action:manipulation}
button:focus-visible,a:focus-visible,[role="button"]:focus-visible,summary:focus-visible{
  outline:2px solid var(--primary);outline-offset:2px;border-radius:8px;
}
.btn-primary:active,.side-upgrade:active,.mobile-nav button:active{transform:translateY(0) scale(.985)}
.btn-primary:active{box-shadow:0 4px 12px rgba(47,91,255,.24)}
.btn-ghost:active,.btn-mini:active,.jt-i:active,.chip-row button:active,.job-search a:active,.portal-row a:active{transform:scale(.985)}

/* ============================================================
   3. 布局骨架
   ============================================================ */

.app{display:flex;min-height:100vh;min-height:100dvh}

.side{
  width:var(--side-w);flex:none;background:var(--white);
  border-right:1px solid var(--line);
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh;height:100dvh;
}
/* 品牌标：新 logo 的机器人标图片 + 后台可配的「职见 AI」文字。
   文字仍由 paintHome() 按 brand.name 写入，所以图片只做左侧图钉，
   不接管文字 —— 后台改品牌名依旧生效。 */
.logo{
  padding:24px 22px 18px;font-size:21px;font-weight:800;color:var(--primary);
  letter-spacing:-.5px;display:flex;align-items:center;
}
.logo-img{height:26px;width:auto;display:block;flex:none;margin-right:9px}
.logo .lg-name span{color:var(--ink)}
.nav{flex:1;padding:4px 12px;overflow-y:auto}
.nav button{
  width:100%;display:flex;align-items:center;gap:11px;
  padding:11px 13px;border-radius:var(--r-xs);margin-bottom:3px;
  font-size:14px;font-weight:600;color:#6b7488;transition:.16s;text-align:left;
}
.nav button:hover{background:var(--soft);color:var(--primary)}
.nav button.active{background:var(--primary-soft);color:var(--primary);font-weight:800}
.nav button .ic{width:18px;height:18px}

.side-foot{padding:14px;border-top:1px solid var(--line)}
/* 侧栏不再展示「可用次数」：剩余次数只在「我的 → 会员」那一块出现（需求） */
.side-upgrade{
  width:100%;padding:11px;border-radius:var(--r-sm);
  font-size:13.5px;font-weight:700;color:#fff;
  background:linear-gradient(135deg,var(--primary),var(--primary2));
}
.side-upgrade:hover{transform:translateY(-1px)}

/* 宽屏（≥1440）时内容列贴死在侧栏右侧、右边留一大片空白；用 margin:auto 把内容列
   在侧栏之外的空间里居中，视觉重心更稳。.top 的底色与 body 一致，所以不会出现接缝。 */
.main{flex:1;min-width:0;padding:0 34px 56px;max-width:1180px;margin:0 auto}

.top{
  display:flex;align-items:flex-start;justify-content:space-between;gap:18px;
  padding:26px 0 18px;position:sticky;top:0;z-index:20;
  background:linear-gradient(180deg,var(--bg) 74%,rgba(246,247,251,.86));
  backdrop-filter:saturate(160%) blur(8px);
  -webkit-backdrop-filter:saturate(160%) blur(8px);
}
.top-l{display:flex;align-items:flex-start;gap:12px;min-width:0}
.back-btn{
  width:36px;height:36px;border-radius:var(--r-xs);flex:none;margin-top:2px;
  background:var(--white);border:1px solid var(--line);color:#5b6675;
  display:grid;place-items:center;transition:.16s;
}
.back-btn:hover{color:var(--primary);border-color:#cfd6ff;background:#fafbff}
.top-txt{min-width:0}
.top h1{font-size:21px;font-weight:800;letter-spacing:-.3px}
.top p{font-size:13px;color:var(--muted);margin-top:5px;max-width:640px}
.top-r{display:flex;align-items:center;gap:10px;flex:none}
.avatar{
  width:38px;height:38px;border-radius:50%;flex:none;
  background:linear-gradient(135deg,var(--primary),var(--primary2));
  color:#fff;font-weight:800;font-size:14px;display:grid;place-items:center;
  box-shadow:0 6px 16px rgba(47,91,255,.26);
}

/* ============================================================
   3b. 鉴权结果回来前的占位（需求：刷新时不要闪「登录 / 注册」）
   — 云 SDK 恢复会话是异步的，之前先按「游客」画一遍，登录用户刷新会看到
     登录按钮 → 头像的跳变。现在先显示骨架块，鉴权落地后再切换。
   —— 骨架必须「绝对定位盖在原位」：若留在文档流里，被 visibility:hidden
      藏起来的按钮仍然占位，骨架会被挤到别的 x，侧栏高度还会先涨后缩。
   ============================================================ */
.auth-skel{
  display:none;
  background:linear-gradient(100deg,#eaedf5 28%,#f7f9fd 50%,#eaedf5 72%);
  background-size:220% 100%;
  animation:skelShine 1.25s linear infinite;
}
@keyframes skelShine{from{background-position:130% 0}to{background-position:-30% 0}}
html.auth-pending #topLogin,
html.auth-pending #topAvatar,
html.auth-pending #sideUpgrade,
html.auth-pending #guestBar{visibility:hidden}
/* 顶栏：盖在「登录 / 注册」原位置（右侧贴边，宽 104px 与按钮同尺寸） */
html.auth-pending .top-r{position:relative}
html.auth-pending .top-r > .auth-skel{
  display:block;position:absolute;right:0;top:50%;transform:translateY(-50%);
  width:104px;height:33px;border-radius:10px;
}
/* 侧栏：不铺骨架，只把按钮藏起来 —— 它的宽度是 100%，占位本来就稳定，
   盖骨架反而会和真实按钮差几像素；藏起来既不会误显「免费注册」，也不会有位移。 */

/* ============================================================
   3c. 游客态统一入口条（手机端）
   — 之前「登录 / 注册」在各页是散落的：诊断页在卡片底部、经历优化在中部、
     邀请页在很下面、我的页在卡片里，位置每页都不一样。现在手机端统一成
     顶栏下方同一条，位置固定；各页原来的散落按钮在手机端隐藏。
   ============================================================ */
.guest-bar{display:none}
@media(max-width:900px){
  .guest-bar{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    margin:0 0 12px;padding:10px 12px;
    background:linear-gradient(120deg,#eef3ff,#e6efff);
    border:1px solid #d7e3ff;border-radius:13px;
  }
  .guest-bar .gb-txt{font-size:12.4px;color:#3d5893;line-height:1.5;min-width:0}
  .guest-bar .gb-btn{
    flex:none;border:0;border-radius:9px;padding:8px 13px;cursor:pointer;
    background:linear-gradient(135deg,var(--primary),var(--primary2));
    color:#fff;font-size:12.5px;font-weight:800;white-space:nowrap;
  }
  .guest-bar .gb-btn:active{transform:scale(.97)}
  /* 手机端同一入口只留一条，散落的这些隐藏（桌面端不变，那里位置本来就统一） */
  #dgSavedLogin,#exLogin,#invLogin,#meGuestLogin{display:none}
}

.page{display:none;animation:fadeUp .26s ease backwards}
.page.active{display:block}
@keyframes fadeUp{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}

/* ============================================================
   4. 通用卡片与表单
   ============================================================ */

.card{
  background:var(--white);border:1px solid var(--line);border-radius:var(--r);
  padding:22px;box-shadow:var(--shadow);margin-bottom:18px;
}
.card-h{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:6px}
.card-h h2{font-size:16.5px}

.section-title{
  display:flex;align-items:baseline;gap:10px;margin:26px 2px 12px;flex-wrap:wrap;
}
.section-title h2{font-size:16px;font-weight:800}
.section-title > span{font-size:12.5px;color:var(--muted)}

.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;grid-auto-rows:1fr}

.step{display:flex;align-items:center;gap:10px;margin:0 0 14px}
.step span{
  width:22px;height:22px;border-radius:7px;flex:none;display:grid;place-items:center;
  background:var(--primary-soft);color:var(--primary);font-size:12px;font-weight:800;
}
.step b{font-size:14.5px;color:var(--ink)}

.fld{display:block;margin-bottom:14px}
.fld > span{display:block;font-size:12.8px;font-weight:600;color:#6b7488;margin-bottom:7px}
.fld input,.fld select,.fld textarea{
  width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-sm);
  background-color:#fcfdff;font-size:14px;line-height:1.6;transition:.16s;
  -webkit-appearance:none;appearance:none;
}
.fld textarea{resize:vertical}
/* 注意：这里只能用 background-color。用简写 `background` 会把 select 的
   background-repeat / -position / -size 一起重置成默认值，导致自定义箭头
   在聚焦时被平铺铺满整个输入框（H5 上表现为"框内出现奇怪的底色"）。 */
.fld input:focus,.fld select:focus,.fld textarea:focus{
  outline:0;border-color:var(--primary);background-color:#fff;box-shadow:0 0 0 3px rgba(47,91,255,.1);
}
.fld input::placeholder,.fld textarea::placeholder{color:#b3bbc9}
.two-col{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}

.hint{font-size:12.8px;color:var(--muted);line-height:1.72}
.hint-row{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:6px;flex-wrap:wrap}
.hint-row .hint{flex:1;min-width:200px;margin:0}

.actions{display:flex;align-items:center;justify-content:flex-end;gap:12px;margin-top:18px;flex-wrap:wrap}
.actions .mut{font-size:12.5px;margin-right:auto}

.empty{
  padding:26px 18px;text-align:center;font-size:13px;color:var(--muted);
  background:var(--soft2);border:1px dashed #dfe4ef;border-radius:var(--r-sm);
}

.seg{
  display:inline-flex;gap:3px;padding:4px;border-radius:var(--r-sm);
  background:var(--soft);margin-bottom:14px;flex-wrap:wrap;
}
.seg-i{
  padding:9px 18px;border-radius:var(--r-xs);font-size:13.3px;font-weight:600;
  color:#6b7488;transition:.16s;
}
.seg-i.active{background:var(--white);color:var(--primary);font-weight:800;box-shadow:0 2px 8px rgba(30,40,80,.08)}
.seg-sm .seg-i{padding:7px 14px;font-size:12.8px}

.sub-pane{margin-top:2px}

.drop{
  display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;
  padding:34px 20px;border:1.5px dashed #d5dbe8;border-radius:var(--r);
  background:var(--soft2);cursor:pointer;transition:.18s;
}
.drop:hover,.drop.over{border-color:var(--primary);background:#f5f7ff}
.drop-ic{color:var(--primary);display:grid;place-items:center}
.drop-ic .ic{width:26px;height:26px}
.drop b{font-size:14px;color:var(--ink)}
.drop .mut{font-size:12.5px}

.file-row{
  display:flex;align-items:center;gap:12px;margin-top:14px;padding:13px 15px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--soft2);
}
.file-ic{
  width:38px;height:38px;border-radius:10px;flex:none;display:grid;place-items:center;
  background:var(--primary-soft);color:var(--primary);font-size:11px;font-weight:800;
}
.file-name{flex:1;min-width:0;font-size:13.5px;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.file-note{font-size:12px;color:var(--muted);flex:none}
.preview-wrap{
  margin-top:14px;border:1px solid var(--line);border-radius:var(--r-sm);
  overflow:hidden;background:var(--soft2);max-height:44vh;overflow-y:auto;
}
.preview-wrap img{width:100%}

/* 简历选择器 */
.resume-pick{display:flex;flex-wrap:wrap;gap:9px;min-height:44px;align-items:flex-start}
.rp-item{
  display:flex;align-items:center;gap:8px;padding:9px 14px;border-radius:var(--r-sm);
  border:1px solid var(--line);background:#fcfdff;font-size:13px;color:#5b6675;
  transition:.16s;max-width:100%;
}
.rp-item:hover{border-color:#cfd6ff;color:var(--primary)}
.rp-item.on{border-color:var(--primary);background:var(--primary-soft);color:var(--primary);font-weight:700}
.rp-item b{font-weight:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}
.rp-item i{font-style:normal;font-size:11.5px;color:var(--muted)}
.rp-empty{font-size:12.8px;color:var(--muted);line-height:1.7}

.pick-list{display:grid;gap:9px;margin-bottom:14px}
.pick-item{
  display:flex;align-items:flex-start;gap:11px;padding:13px 15px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:#fcfdff;
  cursor:pointer;transition:.16s;
}
.pick-item:hover{border-color:#cfd6ff}
.pick-item.on{border-color:var(--primary);background:var(--primary-soft)}
.pick-item .box{
  width:19px;height:19px;border-radius:6px;flex:none;margin-top:1px;
  border:1.5px solid #ccd3e2;display:grid;place-items:center;
  font-size:11px;color:#fff;font-weight:800;
}
.pick-item.on .box{background:var(--primary);border-color:var(--primary)}
.pi-main{flex:1;min-width:0}
.pi-main b{display:block;font-size:13.6px;color:var(--ink);margin-bottom:3px}
.pi-main span{font-size:12px;color:var(--muted);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pick-item.off{opacity:.6}
.saved-item .pi-main span{white-space:normal}

.prog{margin-top:14px}
.prog-bar{height:8px;border-radius:99px;background:#edf0f5;overflow:hidden}
.prog-bar i{
  display:block;height:100%;width:0;border-radius:99px;
  background:linear-gradient(90deg,var(--primary),var(--primary2));transition:width .32s linear;
}
.prog-meta{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:8px;font-size:12.5px;color:var(--muted)}
.prog-meta span{font-weight:600;color:#5b6675}
.prog-meta em{font-style:normal;color:var(--primary);flex:none}

/* 上传/解析失败：常驻可见 + 一键重试（不靠 2.6 秒就消失的 toast） */
.up-err{
  display:flex;gap:11px;align-items:flex-start;margin-top:14px;padding:13px 15px;
  border:1px solid #f3d2d2;border-radius:var(--r-sm);background:#fff6f6;
}
.up-err-ic{flex:none;color:#d64545;display:grid;place-items:center;padding-top:1px}
.up-err-ic .ic{width:20px;height:20px;stroke-width:1.8}
.up-err-bd{min-width:0;flex:1;display:flex;flex-direction:column;gap:4px}
.up-err-bd b{font-size:13.6px;color:#a83232}
.up-err-bd > span{font-size:12.6px;line-height:1.65;color:#7c4a4a;word-break:break-word}
.up-err-act{display:flex;gap:9px;flex-wrap:wrap;margin-top:7px}
.up-err-act .btn-ghost{gap:5px}
.up-err-act .btn-ghost .ic{width:15px;height:15px}
@media(max-width:900px){
  .up-err{padding:12px 13px}
  .up-err-act{width:100%}
  .up-err-act .btn-ghost{flex:1;justify-content:center}
}

.parsed-box{
  margin-top:14px;padding:15px 17px;border-radius:var(--r-sm);
  background:#f7f9ff;border:1px solid #e2e7fb;
}
.parsed-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}
.ph-l{min-width:0;flex:1}
.ph-l b{display:block;font-size:14px;margin-bottom:4px;color:var(--ink)}
.ph-l span{font-size:12.3px;line-height:1.6;display:block}
.parsed-head > .btn-ghost{flex:none}
#dgParsedBody{margin-top:12px}
.chip-row{display:flex;flex-wrap:wrap;gap:8px}
.chip-row span{
  font-size:12.3px;padding:6px 11px;border-radius:20px;
  background:#fff;border:1px solid #e2e7fb;color:#4a5570;
}
.sec-peek{margin-top:12px;display:grid;gap:10px}
.sp-item{background:#fff;border:1px solid #e9ecf5;border-radius:10px;padding:11px 13px}
.sp-item b{font-size:13px;display:block;margin-bottom:3px;color:var(--ink)}
.sp-item span{font-size:12px;color:var(--muted)}
.sp-item p{margin:6px 0 0;font-size:12.5px;color:#4a5570;line-height:1.65}
.edit-wrap{margin-top:12px}
.edit-wrap .hint{margin-bottom:9px}
.edit-wrap textarea{
  width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:#fff;min-height:180px;resize:vertical;font-size:13.5px;line-height:1.7;
}
.edit-wrap textarea:focus{outline:0;border-color:var(--primary);box-shadow:0 0 0 3px rgba(47,91,255,.1)}

.notice-bar{
  display:flex;align-items:flex-start;gap:10px;padding:13px 17px;margin-bottom:16px;
  border-radius:var(--r-sm);background:#fffbeb;border:1px solid #fde9bb;
  font-size:13px;color:#8a6314;line-height:1.65;
}
.notice-bar b{flex:none;font-size:12px;padding:2px 8px;border-radius:6px;background:#f7c948;color:#fff}

/* ============================================================
   5. 首页
   ============================================================ */

.hero{
  border-radius:var(--r);padding:34px 32px;margin-bottom:6px;position:relative;overflow:hidden;
  background:linear-gradient(120deg,#2f5bff,#6d5cff 62%,#8b5cf6);
  box-shadow:0 18px 42px rgba(47,91,255,.24);
}
.hero::after{
  content:"";position:absolute;right:-70px;top:-90px;width:280px;height:280px;border-radius:50%;
  background:rgba(255,255,255,.1);
}
.hero h2{color:#fff;font-size:25px;font-weight:800;letter-spacing:-.4px;max-width:660px;position:relative}
.hero p{color:rgba(255,255,255,.88);font-size:13.8px;line-height:1.75;margin-top:10px;max-width:660px;position:relative}
/* 品牌 Slogan：贴在最上面，跟着品牌名走（后台改 slogan 这里同步变） */
.hero .hero-slogan{
  color:rgba(255,255,255,.8);font-size:12.5px;font-weight:700;letter-spacing:.14em;
  margin:0 0 10px;max-width:none;
}
.hero-tip{
  display:inline-flex;align-items:center;gap:7px;margin-top:16px;position:relative;
  padding:7px 14px;border-radius:99px;background:rgba(255,255,255,.18);
  color:#fff;font-size:12.5px;font-weight:600;
  border:1px solid rgba(255,255,255,.24);
}
.hero-tip .ic{width:14px;height:14px}

.card.tool{
  padding:20px;cursor:pointer;transition:.2s;display:flex;flex-direction:column;
  text-align:left;border-color:var(--line);
}
.card.tool:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg);border-color:#d6dcff}
.card.tool .icon{
  width:42px;height:42px;border-radius:13px;display:grid;place-items:center;margin-bottom:13px;
  background:var(--primary-soft);color:var(--primary);
}
.card.tool .icon .ic{width:21px;height:21px}
.card.tool h3{font-size:15px;font-weight:800;margin-bottom:7px}
.card.tool p{font-size:12.6px;color:var(--muted);line-height:1.68;flex:1}
.card.tool .go{font-size:12.5px;font-weight:700;color:var(--primary);margin-top:13px}
.card.tool.off{opacity:.55;cursor:default}
.card.tool.off:hover{transform:none;box-shadow:var(--shadow)}
.card.tool.off .go{color:var(--muted)}

/* ============================================================
   6. 可视化：评分环 / 雷达 / 维度条
   ============================================================ */

.viz-card{overflow:hidden}
.viz-head{display:flex;gap:26px;align-items:center}
.viz-info{flex:1;min-width:0}
.grade-chip{
  display:inline-block;font-size:12.5px;font-weight:800;color:var(--primary);
  background:var(--primary-soft);padding:5px 13px;border-radius:99px;margin-bottom:10px;
}
.viz-info .verdict{margin:0;font-size:13.6px;color:#3d4661;line-height:1.78}
/* V51（大哥 2026-09-27 需求 4）：雷达图 + 维度条下面那句「你是什么水平」。
   刻意做成一条**安静的说明块**（不是广告位）：左侧一道主色竖线，跟 .deep-quote
   同一套语言，配色只用现有 token；第一句说水平（ink 加粗），第二句才引导深度报告（主色）。 */
.score-level{
  margin-top:18px;padding:12px 15px;
  border-left:3px solid var(--primary);
  border-radius:0 var(--r-xs) var(--r-xs) 0;
  background:var(--primary-soft);
}
.score-level .sl-main{margin:0;font-size:13.4px;font-weight:800;color:var(--ink);line-height:1.68}
.score-level .sl-cta{margin:6px 0 0;font-size:12.8px;font-weight:600;color:var(--primary);line-height:1.72}
/* V95（大哥 2026-10-09 需求 3）：中间那句「还能再提多少分」——
   白底胶囊压在 primary-soft 说明块上，是这一块里最跳的一句（它才是转化钩子）。 */
.score-level .sl-gain{
  margin:8px 0 0;padding:7px 11px;font-size:13px;font-weight:700;
  color:var(--primary);background:#fff;border-radius:var(--r-xs);line-height:1.62;
}
.viz-btns{display:flex;gap:9px;margin-top:16px;flex-wrap:wrap}
.ring{width:136px;height:136px;flex:none}
.ring-num{font-size:32px;font-weight:800;font-family:-apple-system,"PingFang SC",sans-serif}
.ring-cap{font-size:11.5px}
.ring circle:last-of-type{animation:ringIn .9s ease both}
@keyframes ringIn{from{stroke-dasharray:0 999}}

/* V15：雷达图的 viewBox 会随维度名长度自适应撑大（见 app.js radarSvg），
   这里放宽到 400px，避免分母变大后图反而被缩小、字看不清。 */
.radar-wrap{display:flex;justify-content:center;margin:12px 0 4px}
.radar{width:100%;max-width:400px;height:auto}
.radar-lab{font-size:12px;font-family:-apple-system,"PingFang SC",sans-serif;letter-spacing:.2px}
@media (max-width:560px){
  .radar{max-width:330px}
}
.dims-list{margin-top:12px;border-top:1px solid var(--line);padding-top:14px}
.dim{margin-bottom:15px}
.dim:last-child{margin-bottom:0}
.dim-top{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:7px}
.dim-top b{font-size:13.4px;font-weight:700;color:var(--ink)}
.dim-top em{font-style:normal;font-size:13.5px;font-weight:800}
.bar{height:8px;border-radius:99px;background:#eef1f6;overflow:hidden}
.bar i{display:block;height:100%;border-radius:99px;transition:width .5s ease}
.dim-note{font-size:12.2px;color:var(--muted);margin-top:7px;line-height:1.65}

.score-chip{
  width:46px;height:46px;border-radius:13px;flex:none;display:grid;place-items:center;
  font-weight:800;font-size:15px;background:var(--primary-soft);color:var(--primary);
}
.score-chip.warn{background:#fff5e5;color:#b97700}
.score-chip.bad{background:#fdecec;color:var(--red)}

.issue{display:flex;gap:12px;padding:13px 0;border-bottom:1px solid var(--line)}
.issue:last-child{border-bottom:0;padding-bottom:0}
.issue .dot{
  width:22px;height:22px;border-radius:7px;flex:none;margin-top:1px;
  display:grid;place-items:center;font-size:12px;font-weight:800;
  background:#fff5e5;color:#b97700;
}
.issue.bad .dot{background:#fdecec;color:var(--red)}
.issue.good .dot{background:#e8f8f1;color:var(--green)}
/* V74：「发现的问题」三级 —— suggest（建议优化）走中性灰，与 warn（重要）的琥珀色区分开 */
.issue.suggest .dot{background:#eef2f7;color:#5b6b80}
/* V74：问题标题前的等级标签（严重 / 重要 / 建议优化 / 亮点） */
.i-body .lv{display:inline-block;font-size:11px;font-weight:700;line-height:1;padding:3px 6px;border-radius:5px;margin-right:7px;vertical-align:1px}
.lv-bad{background:#fdecec;color:#c2410c}
.lv-warn{background:#fff5e5;color:#b97700}
.lv-suggest{background:#eef2f7;color:#5b6b80}
.lv-good{background:#e8f8f1;color:#15803d}
.i-body b{font-size:13.5px;color:var(--ink);display:block;margin-bottom:4px}
.i-body p{font-size:12.6px;color:#5b6675;line-height:1.7}

.fix{
  padding:14px 16px;border-radius:var(--r-sm);background:var(--soft2);
  border:1px solid var(--line);margin-bottom:11px;
}
.fix:last-child{margin-bottom:0}
.fix .from{font-size:12.6px;color:#9aa3b2;text-decoration:line-through;line-height:1.7;margin-bottom:7px}
.fix .to{font-size:13.4px;color:var(--ink);line-height:1.72;font-weight:600}
.fix .why{display:block;font-size:12.1px;color:var(--primary);margin-top:7px}
/* V95（大哥 2026-10-09 需求 4）：逐句改法卡片底部的「去用经历优化」引导 + 小入口。 */
.fix-to-exp{
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  margin-top:15px;padding-top:13px;border-top:1px dashed var(--line);
}
.fix-to-exp .fte-note{margin:0;flex:1;min-width:200px;font-size:12.5px;color:var(--muted);line-height:1.72}

.kw{display:flex;flex-wrap:wrap;gap:8px}
.kw span{
  font-size:12.4px;padding:6px 12px;border-radius:99px;
  background:var(--soft);border:1px solid var(--line);color:#5b6675;
}
.kw.miss span{background:#fdecec;border-color:#fbdcdc;color:#b3261e}

.rw-list{display:grid;gap:8px}
.rw-list li{position:relative;padding-left:17px;font-size:13.2px;line-height:1.75;color:#3d4661}
.rw-list li::before{
  content:"";position:absolute;left:3px;top:9px;width:5px;height:5px;border-radius:50%;background:var(--primary);
}
/* V15：经历改写稿支持「能力分类标签」（活动运营 / 项目管理 / 内容运营 …）。
   带标签的行不再用圆点——标签本身就是视觉锚点，整体更像一页可扫读的简历。 */
.rw-list li.rw-li{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 9px;padding-left:0}
.rw-list li.rw-li::before{content:none}
.rw-tag{
  flex:0 0 auto;display:inline-block;padding:2px 9px;border-radius:999px;
  background:#eef3ff;border:1px solid #dbe4ff;color:#2f5bff;
  font-size:11.5px;font-weight:700;line-height:1.6;letter-spacing:.2px;white-space:nowrap;
}
.rw-txt{flex:1 1 auto;min-width:10ch}
@media (max-width:560px){
  .rw-list li.rw-li{gap:5px 8px}
  .rw-tag{font-size:11px;padding:2px 8px}
}
.next-list{display:grid;gap:10px;counter-reset:n}
.next-list li{
  position:relative;padding-left:34px;font-size:13.3px;line-height:1.75;color:#3d4661;
  counter-increment:n;
}
.next-list li::before{
  content:counter(n);position:absolute;left:0;top:1px;
  width:22px;height:22px;border-radius:7px;display:grid;place-items:center;
  background:var(--primary-soft);color:var(--primary);font-size:12px;font-weight:800;
}

.jd-model{display:grid;gap:14px}
.jd-model li{display:flex;gap:13px;align-items:flex-start}
.jd-model .weight{display:flex;gap:3px;flex:none;margin-top:6px}
.jd-model .weight i{width:6px;height:14px;border-radius:3px;background:#e6eaf2}
.jd-model .weight i.on{background:var(--primary)}
.jm-body b{font-size:13.5px;color:var(--ink);display:block;margin-bottom:3px}
.jm-body p{font-size:12.5px;color:var(--muted);line-height:1.7}

.match{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:12px 0;border-bottom:1px solid var(--line)}
.match:last-child{border-bottom:0;padding-bottom:0}
.match .m-l b{font-size:13.4px;color:var(--ink);display:block;margin-bottom:3px}
.match .m-l p{font-size:12.5px;color:var(--muted);line-height:1.68}
.mtag{font-size:12px;font-weight:700;padding:5px 12px;border-radius:99px;flex:none;white-space:nowrap}
.mtag.covered{background:#e8f8f1;color:#12805a}
.mtag.partial{background:#fff5e5;color:#b97700}
.mtag.missing{background:#fdecec;color:#b3261e}

/* ============================================================
   7. 经历
   ============================================================ */

.exp-item{padding:18px 0;border-bottom:1px solid var(--line)}
.exp-item:last-child{border-bottom:0;padding-bottom:0}
.exp-head{display:flex;justify-content:space-between;gap:12px;margin-bottom:9px}
.exp-type{
  display:inline-block;font-size:11.5px;font-weight:700;color:var(--primary);
  background:var(--primary-soft);padding:3px 10px;border-radius:6px;margin-bottom:7px;
}
.exp-head h3{font-size:15px;font-weight:700}
.exp-meta{font-size:12.2px;color:var(--muted);margin-top:5px}
.exp-body{font-size:13.2px;color:#5b6675;line-height:1.78;white-space:pre-wrap}
.exp-tools{display:flex;gap:9px;margin-top:12px;flex-wrap:wrap}
.exp-ai{margin-top:14px;padding:15px 17px;border-radius:var(--r-sm);background:#f7f9ff;border:1px solid #e2e7fb}
/* V95（大哥 2026-10-09 需求 1）：经历列表折叠。
   每段默认收成一行（类型标签 + 标题 + meta + 「已优化」小标 + ▾），点整行展开原文 + 优化稿。
   .exp-fold 用 display 控制（不用 hidden 属性）—— 纯前端状态，没有后台开关要跟它抢。 */
.exp-head{cursor:pointer}
.exp-head-main{min-width:0;flex:1}
.exp-head-right{display:flex;align-items:center;gap:9px;flex:none}
.exp-done{
  font-size:11.5px;font-weight:700;color:var(--primary);
  background:#fff;padding:3px 9px;border-radius:99px;border:1px solid #e2e7fb;white-space:nowrap;
}
.exp-caret{
  width:0;height:0;flex:none;
  border-left:5px solid transparent;border-right:5px solid transparent;
  border-top:6px solid var(--muted);
  transition:transform .18s ease;
}
.exp-item.open .exp-caret{transform:rotate(180deg)}
.exp-fold{display:none}
.exp-item.open .exp-fold{display:block}
.exp-fold .exp-body{margin-top:4px}
.exp-item.open{padding-bottom:18px}
/* V95 需求 2：改写稿改完即落库，原来的「保存到这段经历」按钮换成这句状态告知。 */
.exp-saved{font-size:12.5px;color:var(--muted);line-height:2;margin-right:auto}
.ai-head{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.ai-head b{font-size:13.5px;color:var(--ink)}
.ai-head .grade{font-size:12px;color:var(--primary);background:#fff;padding:3px 10px;border-radius:99px;border:1px solid #e2e7fb}

/* ============================================================
   8. 题库
   ============================================================ */

.q-item{padding:18px 0;border-bottom:1px solid var(--line)}
.q-item:last-child{border-bottom:0;padding-bottom:0}
.q-top{display:flex;gap:13px;align-items:flex-start}
.q-no{
  width:26px;height:26px;border-radius:9px;flex:none;display:grid;place-items:center;
  background:var(--primary-soft);color:var(--primary);font-size:12.5px;font-weight:800;margin-top:1px;
}
.qb{flex:1;min-width:0}
.qb > b{font-size:14.2px;line-height:1.65;color:var(--ink);font-weight:700;display:block}
.q-tags{display:flex;flex-wrap:wrap;gap:7px;margin-top:8px}
.q-tags span{font-size:11.5px;padding:3px 10px;border-radius:99px;background:var(--soft);color:#7b8497;font-weight:600}
.q-tags span.hot{background:#fdecec;color:#b3261e}
.q-tags span.key{background:#fff5e5;color:#b97700}
.q-tip{font-size:12.4px;color:var(--muted);margin-top:9px;line-height:1.7;padding-left:39px}

.ans-wrap{margin-top:12px;padding-left:39px}
.ans-body{border-radius:var(--r-sm);background:var(--soft2);border:1px solid var(--line);padding:16px 17px}
.ans-text{font-size:13.3px;line-height:1.82;color:#3d4661;white-space:pre-wrap}
.ans-sub{margin-top:14px}
.ans-sub > b{display:block;font-size:12.8px;color:var(--ink);margin-bottom:7px}
.ans-sub ul{display:grid;gap:7px}
.ans-sub li{position:relative;padding-left:16px;font-size:12.9px;line-height:1.75;color:#5b6675}
.ans-sub li::before{content:"";position:absolute;left:3px;top:8px;width:5px;height:5px;border-radius:50%;background:var(--primary)}
.ans-warn{
  margin-top:13px;padding:11px 14px;border-radius:var(--r-xs);
  background:#fffbeb;border:1px solid #fde9bb;font-size:12.5px;color:#8a6314;line-height:1.68;
}

/* ============================================================
   9. AI 面试
   ============================================================ */

.mk-options{display:flex;flex-wrap:wrap;gap:10px;margin:0 0 16px}
.mk-opt{
  display:flex;align-items:center;gap:8px;padding:11px 16px;border-radius:var(--r-sm);
  background:var(--soft2);font-size:13px;font-weight:600;color:#5b6675;cursor:pointer;
  border:1px solid var(--line);transition:.16s;
}
.mk-opt:hover{border-color:#cfd6ff;color:var(--primary)}
.mk-opt input{accent-color:var(--primary);margin:0}
.mk-opt:has(input:checked){background:var(--primary-soft);color:var(--primary);border-color:#ccd6ff;font-weight:800}
.mk-opt input:checked + span{color:var(--primary);font-weight:800}
.mk-tips{
  margin:14px 0 0;padding:15px 17px;border-radius:var(--r-sm);
  background:#f7f9ff;border:1px solid #e2e7fb;display:grid;gap:9px;
}
.mk-tips li{position:relative;padding-left:20px;font-size:12.8px;color:#5b6675;line-height:1.65}
.mk-tips li::before{
  content:"·";position:absolute;left:6px;top:-2px;color:var(--primary);font-size:20px;font-weight:800;line-height:1.3;
}

.room{
  /* 用 left/right/top + dvh 高度，而不是 inset:0：
     ① 移动端浏览器地址栏收放会让 100vh 高于可视区，inset:0 会把底部输入框顶到屏幕外；
     ② dvh 会跟随可视区变化，配合 JS 里的 visualViewport 同步（软键盘弹起）更稳。 */
  position:fixed;left:0;right:0;top:0;z-index:70;
  height:100vh;height:100dvh;
  display:flex;flex-direction:column;
  background:linear-gradient(180deg,#f8f9fd,#eef1f8);
  padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom);
  animation:roomIn .26s ease both;
  overscroll-behavior:contain;
}
@keyframes roomIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
/* 兜底：只要在面试间里，就掐掉 .page 的进入动画/transform，
   避免任何残留的 transform 把 fixed 面试间拉回「相对 section 定位」。 */
body.in-room .page{animation:none !important;transform:none !important}
.room-head{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  background:#fff;border-bottom:1px solid var(--line);padding:13px 18px;flex:none;
}
.rh-left{display:flex;align-items:center;gap:11px;min-width:0}
.rh-left b{display:block;font-size:14.5px}
.rh-left span{display:block;font-size:12px;color:var(--muted);margin-top:2px}
.rh-dot{width:9px;height:9px;border-radius:50%;background:#19a974;flex:none;box-shadow:0 0 0 4px rgba(25,169,116,.16);animation:pulse 1.8s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}
.rh-right{display:flex;align-items:center;gap:10px;flex:none}
.rh-timer{
  font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;font-size:13.5px;font-weight:700;
  color:#5b6675;background:var(--soft2);padding:6px 11px;border-radius:8px;
}
.room-prog{height:4px;background:#e6e9f2;flex:none}
.room-prog i{display:block;height:100%;width:0;border-radius:99px;background:linear-gradient(90deg,var(--primary),var(--primary2));transition:width .4s}
.chat{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:20px;display:flex;flex-direction:column;gap:14px}
.chat-input{display:flex;gap:10px;align-items:flex-end;flex:none;padding:12px 16px;background:#fff;border-top:1px solid var(--line)}
.chat-input textarea{
  flex:1;padding:11px 14px;border:1px solid var(--line);border-radius:12px;
  line-height:1.55;font-size:14px;resize:none;max-height:140px;min-height:44px;
  -webkit-appearance:none;appearance:none;
}
.chat-input textarea:focus{outline:0;border-color:var(--primary);box-shadow:0 0 0 3px rgba(47,91,255,.1)}
.room-tip{margin:0;padding:9px 16px 12px;background:#fff;color:var(--muted);font-size:12px;flex:none}
.bubble{
  max-width:min(78%,620px);padding:13px 16px;border-radius:15px;
  background:#fff;border:1px solid var(--line);box-shadow:0 3px 12px rgba(30,40,80,.05);
  align-self:flex-start;animation:fadeUp .2s ease both;
}
.bubble b{display:block;font-size:11.5px;color:var(--muted);margin-bottom:6px;font-weight:700}
.bubble .bk{font-size:14px;line-height:1.78;white-space:pre-wrap;word-break:break-word}
.bubble.me{
  align-self:flex-end;background:linear-gradient(135deg,var(--primary),var(--primary2));
  border-color:transparent;box-shadow:0 6px 18px rgba(47,91,255,.26);
}
.bubble.me b{color:rgba(255,255,255,.78)}
.bubble.me .bk{color:#fff}
.bubble.opening{background:var(--soft);border-color:#dfe1fb}
.bubble.opening b{color:#6d6ec9}
.bubble.typing .bk::after{content:"●";font-size:9px;color:var(--primary);margin-left:4px;animation:blink 1s steps(2,start) infinite}
@keyframes blink{0%,100%{opacity:1}50%{opacity:.15}}

.room-report{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:22px;background:linear-gradient(180deg,#f8f9fd,#eef1f8)}
.room-report .rr-head{display:flex;align-items:baseline;justify-content:space-between;gap:14px;flex-wrap:wrap;max-width:780px;margin:0 auto 14px}
.room-report .rr-head h2{margin:0;font-size:18px}
.room-report .rr-head span{font-size:12.5px;color:var(--muted)}
.room-report .card{max-width:780px;margin:0 auto}
.mk-report .mk-score{font-size:46px;font-weight:800;color:var(--primary);line-height:1;margin-bottom:16px}
.mk-report .mk-score i{font-size:16px;font-style:normal;color:var(--muted);font-weight:600}
.mk-report .mk-line{margin:0 0 9px;font-size:13.5px;line-height:1.8;color:#3d4661;white-space:pre-wrap}
.mk-report-acts{max-width:780px;margin:16px auto 0;justify-content:flex-end}

/* ---- 历史 AI 面试：报告 + 完整对话过程 ---- */
.mk-rep-h{display:flex;align-items:center;gap:10px;font-size:13px;font-weight:800;color:var(--ink);margin-bottom:12px}
.mk-rep-score{font-style:normal;font-size:12px;font-weight:800;color:var(--primary);background:var(--primary-soft);border-radius:99px;padding:3px 10px}
.tr-title{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:22px}
.tr-title h2{margin:0}
.transcript{padding:20px 22px;display:grid;gap:14px}
.tr-row{display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.tr-row.me{align-items:flex-end}
.tr-who{display:flex;align-items:center;gap:8px;font-size:11.5px;font-weight:700;color:var(--muted)}
.tr-who em{font-style:normal;font-weight:700;font-size:10.5px;color:var(--primary);background:var(--primary-soft);border-radius:99px;padding:2px 9px}
.tr-who em.tr-tag-rep{color:#8a6412;background:#fff8e8;border:1px solid #f2dfae}
/* 收尾报告那一条用淡黄底，和问答区分开 */
.tr-row.rep .tr-bk{background:#fffdf6;border-color:#f2e4c0}
.tr-bk{
  max-width:min(84%,720px);padding:12px 15px;border-radius:14px;
  background:var(--soft);border:1px solid var(--line);color:var(--text);
  font-size:13.5px;line-height:1.78;word-break:break-word;
}
.tr-row.me .tr-bk{
  background:linear-gradient(135deg,var(--primary),var(--primary2));
  border-color:transparent;color:#fff;box-shadow:0 6px 18px rgba(47,91,255,.2);
}
@media (max-width:820px){
  .transcript{padding:15px 14px}
  .tr-bk{max-width:92%}
}

body.in-room{overflow:hidden}
body.in-room .mobile-nav{display:none}

/* ============================================================
   10. 我的：简历 / 报告 / 会员 / 模型 / 用量
   ============================================================ */

.me-head{display:flex;align-items:center;gap:15px;flex-wrap:wrap}
.me-avatar{
  width:52px;height:52px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:linear-gradient(135deg,var(--primary),var(--primary2));color:#fff;
  font-size:19px;font-weight:800;
}
.me-info{flex:1;min-width:0}
.me-info b{display:block;font-size:16px;color:var(--ink)}
.me-info span{font-size:12.6px;display:block;margin-top:3px;overflow:hidden;text-overflow:ellipsis}

.rv-item{display:flex;align-items:center;gap:14px;padding:15px 0;border-bottom:1px solid var(--line);flex-wrap:wrap}
.rv-item:last-child{border-bottom:0;padding-bottom:0}
.rv-ic{
  width:46px;height:46px;border-radius:13px;flex:none;display:grid;place-items:center;
  background:var(--primary-soft);color:var(--primary);font-size:11.5px;font-weight:800;
}
.rv-body{flex:1;min-width:150px}
.rv-body b{display:block;font-size:13.8px;color:var(--ink);margin-bottom:4px;word-break:break-all}
.rv-body span{font-size:12.1px;color:var(--muted);line-height:1.6}
.rv-tools{display:flex;gap:8px;flex:none;flex-wrap:wrap}

/* 我的使用记录：6 类能力固定 6 块。
   PC 端一行 6 块（原来 4 列会留下 4+2 的缺口），窄屏 3 列 × 2 行，永远铺满不留空。 */
.usage-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;margin-top:14px}
.usage-cell{
  padding:15px 10px;border-radius:var(--r-sm);background:var(--soft2);
  border:1px solid var(--line);text-align:center;min-width:0;
}
.usage-cell i{display:block;font-style:normal;font-size:12.2px;color:var(--muted);margin-bottom:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.usage-cell b{display:block;font-size:22px;font-weight:800;color:var(--ink);line-height:1.1}
.usage-cell b em{font-style:normal;font-size:12px;font-weight:600;color:var(--muted);margin-left:2px}
.usage-cell.zero b{color:#c3c9d6}

.member-top{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:16px}
/* v18：左侧文案块必须能收缩（flex 默认 min-width:auto = min-content），
   否则长副标题会和右侧不换行的「剩余可用 N 次」胶囊一起把卡片撑破；
   Safari 的 min-content 计算更容易踩到这一点。 */
.member-top > div:not(.free-chip){flex:1 1 220px;min-width:0}
.plan-name{font-size:17px;font-weight:800;color:var(--ink)}
.plan-sub{font-size:12.5px;margin-top:5px;word-break:break-word}
.free-chip{
  font-size:12.5px;font-weight:700;color:var(--primary);background:var(--primary-soft);
  padding:8px 15px;border-radius:99px;white-space:nowrap;max-width:100%;
}
.free-chip b{font-size:15px}

/* v18：Safari 排查 —— 原来的 repeat(3,1fr) 等价于 minmax(auto,1fr)，auto 下限是
   min-content。档位卡里的套餐名 / 价格 / 权益文案一旦有较长的不可断行片段，
   轨道就会被撑得比容器还宽，整块横向溢出（Safari 触发得比 Chrome 早）。
   改成 minmax(0,1fr) 把下限压到 0，和下面的 .usage-grid 保持一致。 */
/* v21：档位从 3 档变成 4 档（新增「校招信息库」），写死 repeat(3) 会让第 4 档
   掉到第二行单独一个。auto-fit + minmax 让它按可用宽度自己铺：
   3 档时三列等宽，4 档时四列等宽，后台再加档位也不会塌。 */
.tiers{display:grid;grid-template-columns:repeat(auto-fit,minmax(212px,1fr));gap:12px}
.tier{
  position:relative;padding:17px 15px;border-radius:var(--r-sm);cursor:pointer;
  border:1.5px solid var(--line);background:#fcfdff;transition:.18s;
}
.tier:hover{border-color:#c9d2ff}
.tier.on{border-color:var(--primary);background:#f7f9ff;box-shadow:0 8px 22px rgba(47,91,255,.13)}
.tier .t-badge{
  position:absolute;top:-10px;right:12px;font-size:11px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,#f59e0b,#ef7c1a);padding:3px 10px;border-radius:99px;
  box-shadow:0 4px 12px rgba(239,124,26,.3);
}
.tier .t-name{font-size:13.5px;font-weight:800;color:var(--ink);margin-bottom:9px;word-break:break-word}
.tier .t-price{display:flex;align-items:baseline;gap:3px;color:var(--primary);margin-bottom:5px;flex-wrap:wrap;min-width:0}
.tier .t-price b{font-size:25px;font-weight:800}
.tier .t-price b em{font-style:normal;font-size:14px;font-weight:700;margin-right:1px}
.tier .t-price i{font-style:normal;font-size:12px;color:var(--muted)}
.tier .t-quota{font-size:12.2px;color:#5b6675;font-weight:700;margin-bottom:9px;word-break:break-word}
.tier ul{display:grid;gap:6px}
.tier li{position:relative;padding-left:15px;font-size:12.1px;color:var(--muted);line-height:1.6;word-break:break-word}
.tier li::before{content:"";position:absolute;left:2px;top:7px;width:5px;height:5px;border-radius:50%;background:var(--primary);opacity:.55}
.tier.on li{color:#4a5570}

.model-list{display:grid;gap:10px;margin-top:14px}
.model-item{
  display:flex;align-items:center;gap:13px;padding:14px 16px;border-radius:var(--r-sm);
  border:1.5px solid var(--line);background:#fcfdff;cursor:pointer;transition:.16s;
}
.model-item:hover{border-color:#c9d2ff}
.model-item.on{border-color:var(--primary);background:#f7f9ff}
.mi-radio{width:17px;height:17px;border-radius:50%;flex:none;border:1.5px solid #ccd3e2;display:grid;place-items:center}
.model-item.on .mi-radio{border-color:var(--primary)}
.model-item.on .mi-radio::after{content:"";width:8px;height:8px;border-radius:50%;background:var(--primary)}
.mi-body{flex:1;min-width:0}
.mi-body b{display:block;font-size:13.5px;color:var(--ink);margin-bottom:3px;word-break:break-all}
.mi-body span{font-size:12px;color:var(--muted)}
.mi-tag{font-size:11.5px;font-weight:700;padding:4px 10px;border-radius:99px;flex:none;background:var(--soft);color:#7b8497}
.mi-tag.on{background:#e8f8f1;color:#12805a}

.admin-card{border-color:#dde3ff;background:#fafbff}

/* ============================================================
   11. 邀请
   ============================================================ */

.invite-main h2{font-size:19px;margin-bottom:9px}
.invite-main > p{font-size:13.4px;color:var(--muted);line-height:1.72}
.inv-code-row{display:grid;grid-template-columns:1.3fr 1fr 1fr 1.1fr;gap:14px;margin:22px 0 18px}
.inv-code,.inv-stat{
  background:#fff;border:1px solid var(--line);border-radius:var(--r-sm);
  padding:14px 16px;box-shadow:0 4px 14px rgba(30,40,80,.04);
}
.inv-code span,.inv-stat span{display:block;font-size:12px;margin-bottom:6px;color:var(--muted)}
.inv-code b{
  font-size:22px;letter-spacing:2px;color:var(--primary);font-weight:800;
  font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;
}
.inv-stat b{font-size:20px;font-weight:800;color:var(--ink)}
.inv-stat b i{font-style:normal;color:var(--primary)}
.inv-actions{display:flex;gap:10px;flex-wrap:wrap}
.inv-link{
  margin-top:15px;padding:12px 14px;border-radius:var(--r-sm);background:var(--soft2);
  border:1px dashed #d8dbf0;color:#6d76a0;font-size:12.4px;word-break:break-all;line-height:1.65;
}
.iv-item{display:flex;align-items:center;gap:13px;padding:14px 0;border-bottom:1px solid var(--line)}
.iv-item:last-child{border-bottom:0;padding-bottom:0}
.iv-ava{
  width:40px;height:40px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:var(--primary-soft);color:var(--primary);font-weight:800;font-size:15px;
}
.iv-body{flex:1;min-width:0}
.iv-body b{display:block;font-size:13.8px;margin-bottom:3px;color:var(--ink);word-break:break-all}
.iv-body span{font-size:12px;color:var(--muted)}
/* v18：邀请明细要分行显示「邮箱」和「注册时间」，挤在一行看不清 */
.iv-body .iv-mail{display:block;color:#5b6675;margin-top:1px;word-break:break-all}
.iv-body .iv-time{display:block;margin-top:3px}
.iv-tag{
  flex:none;font-size:12px;font-weight:700;padding:5px 12px;border-radius:20px;
  background:var(--soft);color:#8b95a6;white-space:nowrap;
}
.iv-tag.on{background:#e8f8f1;color:#12805a}
/* V123：邀请列表「待到账」态（奖励等被邀请人用功能才发）—— 琥珀色，和「已到账」绿区分 */
.iv-tag.pend{background:#fff4e5;color:#b5710a}
/* V123：待到账行下方的小字说明 */
.iv-note{display:block;margin-top:3px;color:#b5710a;font-size:11.5px}

/* ============================================================
   12. 弹层 / 提示 / 加载
   ============================================================ */

.modal{position:fixed;inset:0;z-index:190;display:flex;align-items:center;justify-content:center;padding:20px;overflow:auto}
body.rb-modal-open{overflow:hidden}
.modal-mask{position:absolute;inset:0;background:rgba(20,26,44,.46);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px)}
.modal-box{
  position:relative;background:#fff;border-radius:20px;padding:28px;width:100%;max-width:460px;
  max-height:calc(100vh - 40px);max-height:calc(100dvh - 40px);overflow-y:auto;
  -webkit-overflow-scrolling:touch;box-shadow:0 24px 64px rgba(20,26,44,.24);
  animation:modalIn .24s ease both;
}
@keyframes modalIn{from{opacity:0;transform:translateY(16px) scale(.98)}to{opacity:1;transform:none}}
.modal-x{position:absolute;top:16px;right:16px;width:30px;height:30px;border-radius:9px;color:var(--muted);font-size:15px;display:grid;place-items:center}
.modal-x:hover{background:var(--soft);color:var(--ink)}
.modal-box h2{font-size:18px;margin-bottom:8px}
.modal-box > .mut{font-size:12.9px;line-height:1.7;display:block;margin-bottom:8px}
.auth-box{max-width:430px}
.auth-pane{margin-top:6px}
.auth-err{
  padding:11px 14px;border-radius:var(--r-xs);background:#fdecec;border:1px solid #fbdcdc;
  color:#b3261e;font-size:12.7px;line-height:1.6;margin:10px 0;
}
.inline-input{display:flex;gap:9px;align-items:stretch}
.inline-input input{flex:1;min-width:0}
.inline-input .btn-ghost{flex:none}
.auth-box .btn-link{display:block;margin:12px auto 0}

.pay-box{max-width:490px}
.tiers-modal{margin:16px 0 18px}
.pay-qr{text-align:center;margin:6px 0 14px}
.pay-qr img{width:200px;height:200px;object-fit:contain;border-radius:var(--r-sm);border:1px solid var(--line);background:#fff;margin:0 auto}
.pay-qr p{font-size:12.4px;color:var(--muted);margin-top:10px}
.pay-wx{display:flex;align-items:center;gap:11px;padding:12px 15px;border-radius:var(--r-sm);background:var(--soft2);font-size:13px;margin-bottom:12px}
.pay-wx b{font-size:14px;color:var(--ink)}
.pay-wx .btn-ghost{margin-left:auto}
.pay-alt{display:flex;align-items:center;justify-content:center;gap:8px;margin:14px 0 2px;font-size:13px;flex-wrap:wrap}
.pay-box > .btn-link{display:block;margin:12px auto 0}

/* 邀请分享海报 */
.poster-box{max-width:530px}
.poster-stage{
  margin:16px 0 14px;border-radius:14px;overflow:hidden;background:var(--soft2);
  border:1px solid var(--line);min-height:120px;display:grid;place-items:center;
}
.poster-stage canvas{display:block;width:100%;height:auto}
.poster-stage img{display:block;width:100%;height:auto}
.poster-acts{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}
.poster-acts .btn-primary,.poster-acts .btn-ghost{flex:1;min-width:130px}
.poster-box .hint{margin-top:10px}
/* 拿不到剪贴板权限时的兜底：把文案摊出来让用户长按复制 */
.copy-area{
  width:100%;box-sizing:border-box;margin:12px 0 6px;padding:12px 14px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--soft);
  color:var(--ink);font-size:13.5px;line-height:1.7;resize:vertical;
  font-family:inherit;-webkit-user-select:all;user-select:all;
}
.copy-area:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px rgba(47,91,255,.12)}

/* 运营后台「预览用户报告」时顶部的提示条（固定在最上方，右侧可关闭） */
.adm-preview-bar{
  position:fixed;left:0;right:0;top:0;z-index:120;
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:10px 18px;background:linear-gradient(90deg,#2f5bff,#6d5cff);color:#fff;
  font-size:13px;box-shadow:0 6px 20px rgba(47,91,255,.28);
}
.adm-preview-bar b{
  font-size:12px;font-weight:800;letter-spacing:.3px;
  background:rgba(255,255,255,.22);border-radius:99px;padding:4px 11px;
}
.adm-preview-bar span{flex:1;min-width:0;opacity:.94}
.adm-preview-bar .btn-ghost{
  background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.3);color:#fff;
}
.adm-preview-bar .btn-ghost:hover{background:rgba(255,255,255,.26);color:#fff}
.adm-preview-bar ~ .app{padding-top:44px}

.cf-box{max-width:410px}
.cf-text{margin:10px 0 22px;font-size:13.8px;color:#4a5570;line-height:1.75}
.cf-actions{justify-content:flex-end;gap:10px}
.cf-actions .btn-ghost,.cf-actions .btn-primary{flex:none;min-width:98px}

.poster-wrap{
  border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;background:var(--soft);
  max-height:58vh;overflow-y:auto;-webkit-overflow-scrolling:touch;
}
.poster-wrap img{width:100%}
.poster-actions{display:flex;gap:10px;margin:14px 0 4px;flex-wrap:wrap}
.poster-actions .btn-primary,.poster-actions .btn-ghost{flex:1;min-width:130px}

.toast{
  position:fixed;left:50%;bottom:90px;transform:translate(-50%,14px);z-index:120;
  max-width:min(86vw,420px);padding:13px 20px;border-radius:var(--r-sm);
  background:rgba(24,30,48,.94);color:#fff;font-size:13.3px;line-height:1.6;text-align:center;
  opacity:0;pointer-events:none;transition:.26s;box-shadow:0 14px 34px rgba(20,26,44,.28);
}
.toast.show{opacity:1;transform:translate(-50%,0)}

.loading{position:fixed;inset:0;z-index:110;display:flex;align-items:center;justify-content:center;background:rgba(20,26,44,.34);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px)}
.loading-box{
  background:#fff;border-radius:18px;padding:30px 34px;text-align:center;
  max-width:min(86vw,340px);box-shadow:0 22px 56px rgba(20,26,44,.24);
}
.spinner{
  width:34px;height:34px;margin:0 auto 16px;border-radius:50%;
  border:3px solid #e6eaf5;border-top-color:var(--primary);animation:spin .8s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}
.loading-box b{display:block;font-size:14.5px;color:var(--ink);margin-bottom:7px}
.loading-box span{font-size:12.5px;color:var(--muted);line-height:1.6}

/* ============================================================
   12.5 桌面横版导航（v21）
   ------------------------------------------------------------
   需求：电脑端导航栏迭代为横版。
   做法：不动 DOM（.side 里还是 logo + .nav + .side-foot），只用 CSS 把
   左侧竖栏掰成顶部横条 —— 后台的「导航栏配置」因此两端共用一套结构，
   不需要为横版再维护一份 HTML。
   注意 .side 要在 .top 之上（z-index），且 .top 的 sticky top 要让出横条高度，
   否则滚动时顶栏会钻到导航条底下。
   ============================================================ */

:root{--topnav-h:62px}

@media(min-width:901px){
  .app{display:block}

  .side{
    width:auto;height:var(--topnav-h);
    flex-direction:row;align-items:center;gap:18px;
    padding:0 26px;position:sticky;top:0;z-index:50;
    border-right:0;border-bottom:1px solid var(--line);
    box-shadow:0 1px 0 rgba(30,40,80,.02),0 6px 18px rgba(30,40,80,.035);
  }
  .logo{padding:0;font-size:19px;flex:none;line-height:1}
  .logo-img{height:27px;margin-right:8px}

  /* 入口多了也不换行：横向滚动，滚动条藏掉 */
  .nav{
    flex:1;min-width:0;display:flex;align-items:center;gap:2px;
    padding:0;overflow-x:auto;overflow-y:visible;
    scrollbar-width:none;-ms-overflow-style:none;
  }
  .nav::-webkit-scrollbar{display:none}
  .nav button{
    width:auto;white-space:nowrap;margin-bottom:0;
    flex-direction:row;gap:7px;padding:8px 12px;border-radius:10px;
    font-size:13.5px;font-weight:600;
  }
  .nav button .ic{width:17px;height:17px}
  .nav button.active{background:var(--primary-soft);color:var(--primary)}

  .side-foot{border-top:0;padding:0;flex:none}
  .side-upgrade{width:auto;padding:9px 18px;font-size:13px}

  /* 顶栏给横版导航让出高度 */
  .top{top:var(--topnav-h)}
}

/* ============================================================
   13. 移动端
   ============================================================ */

.mobile-nav{display:none}

@media(max-width:900px){
  .side{display:none}
  .main{padding:0 16px;max-width:none}
  /* 顶栏高度必须逐页一致：各页副标题行数不同（76 / 96 / 116px），
     切页时整块内容会上下跳，游客也容易觉得「登录入口位置换了」。
     这里固定 min-height + 副标题最多两行，所有页面一律 96px。 */
  .top{padding:16px 0 12px;min-height:96px;align-items:center}
  .top-l{align-items:center}
  .top h1{font-size:18px}
  .top p{
    font-size:12.4px;margin-top:4px;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  .avatar{width:34px;height:34px;font-size:13px}
  .back-btn{width:32px;height:32px}

  .card{padding:17px;border-radius:16px;margin-bottom:14px}
  .section-title{margin:20px 2px 10px}
  .section-title h2{font-size:15px}

  .hero{padding:26px 20px;border-radius:16px}
  .hero h2{font-size:20px}
  .hero p{font-size:13px;margin-top:9px}
  .hero-tip{font-size:12px;padding:6px 12px;margin-top:13px}

  .grid{grid-template-columns:1fr 1fr;gap:11px}
  .card.tool{padding:16px}
  .card.tool .icon{width:36px;height:36px;border-radius:11px;margin-bottom:11px}
  .card.tool .icon .ic{width:18px;height:18px}
  .card.tool h3{font-size:14px;margin-bottom:6px}
  .card.tool p{font-size:12px;line-height:1.6}
  .card.tool .go{font-size:12px;margin-top:11px}

  .two-col{grid-template-columns:1fr;gap:0}
  .actions{flex-direction:column-reverse;align-items:stretch;gap:10px}
  .actions .mut{margin:0 0 2px;text-align:center;order:9}
  .actions .btn-primary,.actions .btn-ghost{width:100%}
  .hint-row{flex-direction:column;align-items:stretch}
  .hint-row .btn-primary,.hint-row .btn-ghost{width:100%}

  .viz-head{flex-direction:column;align-items:center;gap:18px;text-align:center}
  .ring{margin:0 auto}
  .viz-info{width:100%}
  .viz-btns{justify-content:center}
  .viz-btns .btn-primary,.viz-btns .btn-ghost{flex:1;min-width:130px}

  .inv-code-row{grid-template-columns:1fr 1fr;gap:11px}
  .inv-code{grid-column:1 / -1}
  .inv-actions .btn-primary,.inv-actions .btn-ghost{flex:1;min-width:140px}

  .tiers{grid-template-columns:minmax(0,1fr);gap:11px}
  .tier{padding:15px 14px}
  .usage-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
  .usage-cell{padding:13px 8px}
  .usage-cell b{font-size:20px}

  .rv-item{gap:12px}
  .rv-ic{width:40px;height:40px;border-radius:11px;font-size:11px}
  .rv-tools{width:100%;margin-left:52px}
  .rv-tools .btn-ghost{flex:1}
  .dg-item .rv-tools{margin-left:0;width:100%}
  .dg-item{flex-wrap:wrap}

  .ans-wrap{padding-left:0}
  .q-tip{padding-left:0}
  .room-head{padding:11px 14px}
  .chat{padding:14px}
  .bubble{max-width:88%}
  .room-report{padding:16px}
  .mk-report-acts{flex-direction:column}
  .mk-report-acts .btn-ghost,.mk-report-acts .btn-primary{width:100%}

  .poster-actions{flex-direction:column}
  .modal{padding:14px;align-items:flex-end}
  .modal-box{max-width:100%;border-radius:20px 20px 0 0;max-height:calc(100vh - 20px);padding:24px 20px}
  .toast{bottom:calc(var(--nav-h) + env(safe-area-inset-bottom) + 22px)}

  /* 输入框统一 16px，避免 iOS 聚焦时整页放大 */
  input,textarea,select,.fld input,.fld textarea,.fld select,
  .chat-input textarea,.edit-wrap textarea{font-size:16px}
  .chat-input textarea{line-height:1.5}

  /* —— 底部导航：内容区必须留出导航高度，否则最下面的按钮会被盖住 —— */
  .mobile-nav{
    display:flex;position:fixed;bottom:0;left:0;right:0;z-index:60;
    background:rgba(255,255,255,.97);border-top:1px solid var(--line);
    backdrop-filter:saturate(180%) blur(12px);-webkit-backdrop-filter:saturate(180%) blur(12px);
    height:calc(var(--nav-h) + env(safe-area-inset-bottom));
    padding-bottom:env(safe-area-inset-bottom);
    align-items:stretch;
  }
  .mobile-nav button{
    flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    color:#9aa3b2;font-size:10.5px;font-weight:600;transition:.16s;
  }
  .mobile-nav button .ic{width:21px;height:21px;stroke-width:1.8}
  .mobile-nav button.active{color:var(--primary);font-weight:800}
  .mobile-nav button.active .ic{stroke-width:2.2}
  body:not(.in-room) .main{padding-bottom:calc(var(--nav-h) + env(safe-area-inset-bottom) + 28px)}
}

@media(max-width:560px){
  .card.tool{padding:14px}
  .card.tool .icon{width:33px;height:33px;margin-bottom:9px}
  .card.tool h3{font-size:13.4px}
  .hero h2{font-size:18.5px}
  .inv-code-row{grid-template-columns:1fr}
  .rv-tools{margin-left:0}
  .saved-item .pi-main span{white-space:normal}
}

/* 键盘弹出后仍能滚到输入框（iOS Safari） */
.chat-input,.edit-wrap{scroll-margin-bottom:140px}

/* ---------- 区块引擎：由运营后台配置显隐，用独立属性避免与元素自身的 hidden 冲突 ---------- */
[data-block-off]{display:none !important}

/* ---------- 求职分析：方向建议 / 岗位推荐 ---------- */
.dir-list{display:grid;gap:13px;margin-top:14px}
.dir-item{padding:15px 17px;border-radius:var(--r-sm);border:1px solid var(--line);background:var(--soft2)}
.dir-top{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:8px}
.dir-top b{font-size:14px;color:var(--ink)}
.dir-top em{font-style:normal;font-size:14px;font-weight:800;color:var(--primary)}
.dir-item p{font-size:12.6px;color:#5b6675;line-height:1.7}
.dir-item p + p{margin-top:5px}
.dir-item .entry{color:var(--muted);font-size:12.2px}

.job-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:14px}
.job-card{
  padding:16px;border-radius:var(--r-sm);border:1px solid var(--line);background:#fcfdff;
  display:flex;flex-direction:column;
}
.job-card h4{margin:0 0 7px;font-size:14px;font-weight:800;color:var(--ink)}
.job-meta{font-size:12.2px;color:var(--muted);line-height:1.6;margin-bottom:8px}
.job-why{font-size:12.3px;color:#5b6675;line-height:1.68;flex:1}
.job-tags{display:flex;flex-wrap:wrap;gap:6px;margin:11px 0}
.job-tags span{font-size:11.5px;padding:3px 9px;border-radius:99px;background:var(--soft);color:#7b8497}
.job-search{display:flex;flex-wrap:wrap;gap:7px;margin-top:auto;padding-top:12px;border-top:1px dashed var(--line)}
.job-search a{
  font-size:12px;font-weight:700;padding:6px 12px;border-radius:8px;
  background:var(--primary-soft);color:var(--primary);border:1px solid #dde3ff;
}
.job-search a:hover{background:#e4e9ff}
/* 企业官方招聘入口：深色实心标签，与蓝色描边的平台检索一眼区分 */
.job-search a.off{background:#111a2e;color:#fff;border-color:#111a2e}
.job-search a.off:hover{background:#1d2a47;color:#fff}
.job-search a.off.career{background:linear-gradient(135deg,#1f3fa8,#3b6bf0);border-color:#2f56d0}
.job-search a.off.career:hover{filter:brightness(1.08);color:#fff}
.portal-row a.portal-off{background:var(--primary-soft);border-color:#dde3ff;color:var(--primary);font-weight:700}
.portal-row a.portal-off:hover{background:#e4e9ff;color:var(--primary)}

.portal-row{display:flex;flex-wrap:wrap;gap:9px;margin-top:14px}
.portal-row a{
  font-size:12.3px;font-weight:600;padding:9px 14px;border-radius:var(--r-sm);
  background:var(--soft2);border:1px solid var(--line);color:#5b6675;
}
.portal-row a:hover{border-color:#cfd6ff;color:var(--primary)}

.salary-box{
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  padding:16px 18px;border-radius:var(--r-sm);
  background:linear-gradient(120deg,#f2f6ff,#eef0ff);border:1px solid #e2e7fb;
}
.salary-box .sb-num{font-size:24px;font-weight:800;color:var(--primary)}
.salary-box .sb-num em{font-style:normal;font-size:13px;font-weight:600;color:var(--muted);margin-left:3px}
.salary-box p{font-size:12.6px;color:#5b6675;line-height:1.7;flex:1;min-width:180px}

@media(max-width:900px){
  .job-grid{grid-template-columns:1fr}
}

/* ============================================================
   13. v5 补充：工具类与新增组件
   ============================================================ */

.mt{margin-top:16px}
.mt-sm{margin-top:10px}
.mb-sm{margin-bottom:12px}
.grid-full{grid-column:1 / -1}

.sec-t{display:block;font-size:13.5px;color:var(--ink);margin-bottom:8px}
.warn-t{display:block;font-size:13.5px;color:var(--orange);margin-bottom:8px}

.form-card{padding:24px}

/* 简历预览弹层 */
.pv-img{width:100%;border:1px solid var(--line);border-radius:var(--r-sm)}
.pv-frame{
  width:100%;height:min(62vh,560px);border:1px solid var(--line);
  border-radius:var(--r-sm);background:#fff;
}
.pv-plain{
  max-height:min(60vh,520px);overflow:auto;padding:14px 16px;border-radius:var(--r-sm);
  background:var(--soft2);border:1px solid var(--line);
  font-size:12.5px;line-height:1.75;color:#4a5570;white-space:pre-wrap;word-break:break-word;
  font-family:-apple-system,"PingFang SC",sans-serif;margin:0;
}
.pv-sec{padding:13px 0;border-bottom:1px dashed var(--line)}
.pv-sec:last-child{border-bottom:0;padding-bottom:0}
.pv-sec > b{display:block;font-size:13.5px;color:var(--ink);margin-bottom:3px}
.pv-sec > .mut{display:block;font-size:12px;margin-bottom:7px}

/* 动态弹层内容容器 */
.mb-body{max-height:min(64vh,600px);overflow-y:auto;-webkit-overflow-scrolling:touch}
.mb-body > * + *{margin-top:12px}

/* 会员卡里 tierList 与说明的间距 */
.member .tiers{margin-bottom:14px}
.member .plan-name + .plan-sub{margin-top:0}

/* 弹层里"再想想/确定"在窄屏竖排更顺手 */
@media(max-width:560px){
  .cf-actions{flex-direction:column-reverse}
  .cf-actions .btn-ghost,.cf-actions .btn-primary{width:100%;min-width:0}
  .pv-frame{height:52vh}
}

/* ============================================================
   14. 顶栏标题：**永远显示**（v23 改）

   早先这里有一组 `.top.dup` 规则：当「顶栏标题 === 导航高亮项」时把 h1 折叠掉
   （`display:none`），只留一行 14px 的副标题，理由是「侧栏已经高亮过了，别重复」。

   实测这条规则在 PC 上打掉了 **10 个页面里的 8 个**标题（分析 / 诊断 / 经历优化 /
   岗位分析 / 面试题库 / AI 面试 / 邀请有礼 / 个人中心 —— 它们的导航名与页名同名）。
   结果就是大哥反馈的「PC 刷新后，渲染头部的信息不展示」：顶栏只剩一行灰色小字，
   看起来像标题没渲染出来（`.dup` 下副标题被改成 14px/#5b6675，更像残缺）。

   结论：**重复一个词，远比「标题消失」便宜。** 导航高亮和页面标题各有各的作用，
   后者是这一屏的主标识 —— 现在无条件显示，规则只剩下面这条移动端兜底。
   ============================================================ */

/* 手机端底栏是图标 + 小字，标题必须保留（留一条显式规则，防止以后有人加折叠） */
@media(max-width:900px){
  .top #pageTitle{display:block}
}

/* ============================================================
   15. 邀请入口卡（可配置在首页 / 个人中心）
   ============================================================ */

.invite-entry{
  display:flex;align-items:center;justify-content:space-between;gap:18px;
  background:linear-gradient(120deg,#fff7ec,#ffeada);
  border:1px solid #ffe0c2;
}
.invite-entry .ie-l{min-width:0}
.invite-entry .ie-l b{display:block;font-size:15px;color:#8a4b00;margin-bottom:6px}
.invite-entry .ie-l p{margin:0;font-size:13px;color:#a2702f;line-height:1.65}
.invite-entry .ie-btn{
  flex:none;white-space:nowrap;
  background:linear-gradient(135deg,#f59e0b,#ef7c1a);border:0;
}
.invite-entry .ie-btn:hover{filter:brightness(1.04)}

@media(max-width:900px){
  .invite-entry{flex-direction:column;align-items:stretch;gap:12px}
  .invite-entry .ie-btn{width:100%;text-align:center}
}

/* ============================================================
   16. 首页免费诊断入口
   ============================================================ */

.free-entry{
  display:flex;align-items:center;gap:14px;width:100%;text-align:left;cursor:pointer;
  background:linear-gradient(120deg,#eef4ff,#e6efff);
  border:1px solid #cfe0ff;font-family:inherit;color:inherit;
}
.free-entry .fe-ic{
  flex:none;width:44px;height:44px;border-radius:13px;display:grid;place-items:center;
  background:linear-gradient(135deg,#2f5bff,#5b8bff);color:#fff;
}
.free-entry .fe-ic .ic{width:22px;height:22px}
.free-entry .fe-body{flex:1;min-width:0;display:block}
.free-entry .fe-body b{display:block;font-size:15px;color:#1a3ec8;margin-bottom:5px}
.free-entry .fe-body span{display:block;font-size:12.6px;color:#5a72a8;line-height:1.6}
.free-entry .fe-go{
  flex:none;white-space:nowrap;font-size:12.8px;font-weight:700;color:#2f5bff;
  background:#fff;padding:8px 14px;border-radius:99px;border:1px solid #cfe0ff;
}
.free-entry:hover{border-color:#a9c4ff}

@media(max-width:900px){
  .free-entry{align-items:flex-start;gap:12px}
  .free-entry .fe-go{display:none}
}

/* ============================================================
   17. 目标行业下拉：未选时灰字提示 + 下拉箭头
   ============================================================ */

.fld select.fld-empty{color:#b3bbc9}
.fld select{
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5 11 1.5' fill='none' stroke='%23a8b2c6' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 14px center;background-size:12px 8px;
  padding-right:38px;
}
/* 聚焦态必须把 image + repeat + position + size 一起重申：
   只写 background-image 的话其余子属性会回落到默认值，箭头就会被平铺。 */
.fld select:focus{
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5 11 1.5' fill='none' stroke='%232f5bff' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 14px center;background-size:12px 8px;
  background-color:#fff;
}
/* 展开后的选项列表：某些 WebView 会继承半透明底，统一成白底深字 */
.fld select option{color:#28324a;background:#fff}
.fld .fld-tip{display:block;font-size:11.6px;color:#9aa4b8;margin-top:6px}

/* 快捷选择胶囊（期望月薪等，手机上不用调键盘） */
.chip-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin:-6px 0 14px}
.chip-row > span{font-size:11.8px;color:#9aa4b8}
.chip-row button{
  font-family:inherit;font-size:12.2px;font-weight:600;color:#42506b;
  background:#f2f5fb;border:1px solid var(--line);border-radius:99px;
  padding:6px 13px;cursor:pointer;transition:.15s;
}
.chip-row button:hover{border-color:#9db7f5;color:var(--primary)}
.chip-row button.on{background:var(--primary-soft);border-color:var(--primary);color:var(--primary)}

/* ============================================================
   18. 使用记录 · 可展开的历史明细
   ============================================================ */

.usage-cell{cursor:pointer;transition:.16s}
.usage-cell:hover{border-color:#c4d2f0;background:#fff}
.usage-cell.active{border-color:var(--primary);background:#fff;box-shadow:0 0 0 3px rgba(47,91,255,.09)}
.usage-cell.zero{cursor:default}
.usage-cell.zero:hover{border-color:var(--line);background:var(--soft2)}

.usage-history{margin-top:16px;border-top:1px dashed var(--line);padding-top:14px}
.uh-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}
.uh-head b{font-size:13.4px;color:var(--ink)}
.uh-head span{font-size:12.2px;color:var(--muted)}
.uh-item{
  padding:12px 13px;border-radius:var(--r-sm);background:var(--soft2);
  border:1px solid var(--line);margin-bottom:9px;
}
.uh-item:last-child{margin-bottom:0}
.uh-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.uh-top b{font-size:13.2px;color:var(--ink);font-weight:700;word-break:break-all}
.uh-top time{font-size:11.6px;color:#9aa4b8;white-space:nowrap;flex:none}
.uh-meta{font-size:12.2px;color:var(--muted);line-height:1.65;margin-top:5px}
.uh-acts{display:flex;gap:8px;margin-top:9px;flex-wrap:wrap}
.uh-acts button{padding:6px 12px;font-size:12.2px}
/* 有历史报告可看的明细：整条都能点，手机上不用去戳那个小按钮 */
.uh-item.is-clickable{cursor:pointer;transition:border-color .15s,background .15s,transform .1s}
.uh-item.is-clickable:hover{border-color:#9db7f5;background:#fafcff}
.uh-item.is-clickable:active{transform:scale(.995)}
.uh-item.is-clickable .uh-top b{color:var(--primary)}

/* 历史存档提示条：从「我的使用记录」翻回的旧报告会带上它 */
.arch-note{
  margin:0 0 14px;padding:10px 14px;border-radius:var(--r-xs);
  background:#fff8e8;border:1px solid #f2dfae;color:#8a6412;
  font-size:12.6px;line-height:1.6;display:flex;align-items:center;gap:8px;
}
.arch-note::before{content:"⏱";font-size:13px;flex:none}

/* 会员卡状态色 */
.free-chip.chip-member{color:#b8720a;background:#fff3e2}
.free-chip.chip-empty{color:#8a94a8;background:#eef1f6}
.plan-sub.sub-warn{color:#c2740a}

/* ============================================================
   19. 推荐岗位：竞争力打分 / JD 要点 / 「全部推荐岗位」表格
   ============================================================ */

.top-login{padding:9px 16px;font-size:13px}

.job-card-h{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.job-card-h h4{margin:0}
.jscore{
  flex:none;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;
  min-width:52px;padding:4px 8px;border-radius:11px;line-height:1.15;
  background:linear-gradient(135deg,#eef2ff,#e6efff);border:1px solid #dbe4ff;color:var(--primary);
}
.jscore b{font-size:16px;font-weight:800}
.jscore em{font-style:normal;font-size:10px;color:#8496c8;margin-top:1px}
.jscore.none{
  background:var(--soft);border-color:var(--line);color:var(--muted);
  font-size:11.5px;font-weight:600;padding:6px 9px;
}
.job-jd{margin:0 0 4px;padding:0;list-style:none}
.job-jd li{position:relative;padding-left:14px;font-size:12.3px;color:#5b6675;line-height:1.68}
.job-jd li::before{
  content:"";position:absolute;left:3px;top:8px;width:5px;height:5px;border-radius:50%;background:#c3cfe8;
}
.job-jd.sm li{font-size:12px;line-height:1.6}
.job-more{margin-top:14px}

.jobs-head{
  display:flex;align-items:flex-end;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:14px;
}
.jobs-head-l h2{font-size:16.5px}
.jobs-head-l .mut{display:block;font-size:12.2px;margin-top:5px}
.jobs-head-r{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.jobs-head-r .mut{font-size:12.2px}
.jobs-head-r input{
  width:200px;padding:9px 12px;border:1px solid var(--line);border-radius:var(--r-xs);
  background:#fcfdff;font-size:13px;
}
.jobs-head-r input:focus{outline:0;border-color:var(--primary);background:#fff;box-shadow:0 0 0 3px rgba(47,91,255,.1)}

.jobs-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-radius:var(--r-sm)}
.jobs-table{width:100%;min-width:1040px;border-collapse:collapse;font-size:12.4px}
.jobs-table th{
  text-align:left;font-size:11.8px;font-weight:700;color:#6b7488;white-space:nowrap;
  padding:10px;background:var(--soft2);border-bottom:1px solid var(--line);
}
.jobs-table th.c-rank{width:92px}
/* 九列要塞进 ~1100px：短字段一律不折行（否则「苏州」会断成「苏/州」、「9-13K」断成两行），
   把换行的压力集中交给 JD 与公司两列。 */
.jobs-table td{padding:11px 10px;border-bottom:1px solid var(--line);vertical-align:top;color:#4a5570;white-space:nowrap}
.jobs-table td[data-l="JD 要点"],.jobs-table td[data-l="公司 / 类型"],.jobs-table td[data-l="岗位"]{white-space:normal}
.jobs-table td[data-l="公司 / 类型"]{min-width:178px;max-width:250px}
.jobs-table td[data-l="JD 要点"]{min-width:186px}
.jobs-table tr:last-child td{border-bottom:0}
.jobs-table tbody tr:hover{background:#f8faff}
.jobs-table td b{color:var(--ink);font-size:12.8px}
.jobs-table .job-search{margin:0;padding:0;border-top:0;gap:5px}
.jobs-table .job-search a{font-size:11.2px;padding:4px 8px;border-radius:7px}

/* ---- 优先级徽标：分数用大字，名次退成小字，分数只在整行出现一次 ---- */
.jrank{display:inline-flex;flex-direction:column;align-items:flex-start;gap:2px}
.jrank b{font-size:17px;font-weight:800;line-height:1.05;letter-spacing:.2px;color:var(--ink)}
.jrank b small{font-size:10.5px;font-weight:700;margin-left:1px}
.jrank em{font-style:normal;font-size:11px;font-weight:700;color:#9aa3b8;white-space:nowrap}
.jrank.hi b{color:#1f47d6}
.jrank.hi em{color:#1f47d6}
.jrank.mid b{color:#3f59a8}
.jrank.lo b{color:#8b93a5}
.jrank.none b{color:#b6bece;font-size:15px}

/* ---- 岗位名下面的关键词胶囊（用上 AI 给的 keywords） ---- */
.job-kw{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
.job-kw i{
  font-style:normal;font-size:10.8px;font-weight:600;line-height:1.35;
  color:#5a6b96;background:#eef2fb;border-radius:6px;padding:2px 6px;white-space:nowrap;
}

/* ---- 公司列：主名 + 推荐理由（把原本空着的横向空间用起来） ---- */
.jobs-table .jco{display:block;color:#3c465e;font-size:12.6px;line-height:1.5}
.jobs-table .jwhy{display:block;margin-top:5px;font-size:11.3px;color:#8b94a9;line-height:1.55;white-space:normal}

/* ---- 手机端岗位卡：表头贴标签那套在手机上每卡十行，这里换成真卡片 ---- */
.jobs-cards{display:none}
.jc{border:1px solid var(--line);border-radius:14px;background:#fff;padding:13px 14px;margin-bottom:11px}
.jc:last-child{margin-bottom:0}
.jc-hd{display:flex;align-items:flex-start;gap:10px}
.jc-no{
  flex:none;width:23px;height:23px;border-radius:8px;display:grid;place-items:center;
  background:var(--soft);color:#5a6b96;font-size:12px;font-weight:800;
}
.jc-ht{flex:1;min-width:0}
.jc-ht h4{margin:1px 0 4px;font-size:14.5px;font-weight:800;color:var(--ink);line-height:1.35}
.jc-sub{margin:0;font-size:12px;color:var(--muted);line-height:1.6}
.jc-sub span{display:inline-block}          /* 中文默认任意处断行，「杭/州」会被拆开 */
.jc-sub i{font-style:normal;color:#c3cbdd;margin:0 4px}
.jc-sc{
  flex:none;display:flex;align-items:baseline;gap:1px;padding:4px 9px;border-radius:10px;
  background:linear-gradient(135deg,#eef3ff,#e3ebff);
}
.jc-sc b{font-size:15px;font-weight:800;color:#1f47d6;line-height:1.1}
.jc-sc em{font-style:normal;font-size:10.5px;color:#6d86c8}
.jc-sc.none{background:var(--soft);color:#9aa3b8;font-size:11.5px;font-weight:700;padding:6px 10px}
.jc-why{
  margin:10px 0 0;padding-left:9px;border-left:2px solid #dbe4fb;
  font-size:12.3px;color:#55606f;line-height:1.66;
}
.jc .job-kw{margin-top:9px}
.jc .job-jd{margin-top:9px}
/* 需求 8：卡片右侧一列（分数 + 发布时效），替代原来「时效挂在卡片底部」的排法 */
.jc-hr{flex:none;display:flex;flex-direction:column;align-items:flex-end;gap:5px}
.jc-ft{
  margin-top:11px;padding-top:10px;border-top:1px dashed var(--line);
}
.jc-ft .job-search{margin:0;padding:0;border-top:0;gap:7px}
.jc-ft .job-search a{font-size:11.4px;padding:6px 10px;border-radius:8px}
.jc-time{font-size:11.2px;color:#98a2b8;white-space:nowrap;line-height:1.2}

.jobs-loading{padding:26px 0;text-align:center;font-size:13px;color:var(--muted)}
.empty-box{
  padding:30px 20px;text-align:center;border:1px dashed var(--line);border-radius:var(--r-sm);background:var(--soft2);
}
.empty-box b{display:block;font-size:14.5px;color:var(--ink);margin-bottom:7px}
.empty-box .hint{max-width:420px;margin:0 auto 14px}

@media(max-width:900px){
  /* 手机走卡片：表格整块隐掉，不再做「表头贴回单元格前面」那套（每卡十行太啰嗦） */
  .jobs-table-wrap{display:none}
  .jobs-cards{display:block}
  .jobs-head-r{width:100%}
  .jobs-head-r input{width:100%}
  .top-login{padding:8px 13px;font-size:12.5px}

  /* 需求 8：投递入口在手机上排两行 —— 企业官方入口独占一整行（最重要，
     不用找），下面四个平台检索同排、按名字长度分剩余宽度（等分会把
     「BOSS直聘」压出省略号），名字再长也不换行不截断。 */
  .jc-ft .job-search{gap:7px}
  .jc-ft .job-search a{
    flex:1 1 auto;min-width:0;text-align:center;white-space:nowrap;
    overflow:hidden;text-overflow:ellipsis;padding:8px 8px;font-size:11.2px;
  }
  .jc-ft .job-search a.off{flex:1 1 100%;font-size:11.8px}
}

/* ============================================================
   16. V15.1 结果区排版修正（PC）
   —— 针对「诊断结果 / 求职分析」PC 版的分数位置排版。1440 视口实测
      （卡片内宽 1066px）有三个毛病：
      ① 维度行「名称 …… 分数」两端对齐后被拉成 980px 空档（占行宽 92%），
         分数跟它自己的名称完全脱节，看不出是一行；
      ② 雷达图限宽 400px 居中，左右各 333px 死白；
      ③ 结果渲染后脚本 scrollIntoView({block:'start'}) 把容器顶到视口最上沿，
         被 82px 的吸顶栏盖住 ——「诊断结果」标题整行看不见，
         分数环上方的标签也被压掉一半。
   —— 处理：宽屏（≥1024）把雷达图与维度条并排（维度条再分两列），
      并给结果容器留出吸顶栏高度。手机/平板不受影响，与改动前完全一致。
   ============================================================ */

/* ③ 结果容器留出吸顶栏的空间，别被盖住。
   实测顶栏高度：桌面端 **98px**（v23 恢复标题后；此前被 .top.dup 折叠成 82px）、
   手机端 96px。取 124px 两边都够用，桌面端余 26px、手机端余 28px。 */
#dgResult,#caResult,#jdResult,#exAi,#exEditor{scroll-margin-top:124px}
/* 顶栏是 sticky 的（高约 88~96px），锚到会员板块时必须留出这段高度，
   否则滚过去标题会被顶栏盖住 —— 付费墙「先去会员页看看」就靠这条。 */
[data-block="member"]{scroll-margin-top:120px}

@media(min-width:1024px){
  /* ① + ② 雷达图占左列，维度条占右列并排两列 */
  .viz-body.has-radar{
    display:grid;grid-template-columns:minmax(280px,380px) minmax(0,1fr);
    gap:30px;align-items:center;margin-top:10px;
  }
  .viz-body.has-radar .radar-wrap{margin:0}
  .viz-body.has-radar .radar{max-width:100%}
  .viz-body .dims-list{
    margin:0;border-top:0;padding-top:0;
    display:grid;grid-template-columns:1fr 1fr;column-gap:34px;align-content:start;
  }
  .viz-body .dim{margin-bottom:16px}
  /* 维度不足 3 个时不画雷达图，这时维度条保持整段宽并保留顶部分隔线 */
  .viz-body:not(.has-radar) .dims-list{
    margin-top:12px;border-top:1px solid var(--line);padding-top:14px;
  }

  /* 求职分析「你可以往这些方向投」：匹配度百分比同样被甩到 980px 外，改双列 */
  .dir-list{grid-template-columns:1fr 1fr;column-gap:34px}
}

/* ============================================================
   17. 云服务不可用提示条（v16）
   起因：云 SDK 曾同步从 CDN 加载，CDN 挂起会阻塞解析导致整站按钮失灵。
   现在 SDK 同源自托管 + defer；万一仍连不上，用这条常驻提示把原因说清楚。
   ============================================================ */
.cloud-down-bar{
  position:fixed;left:50%;transform:translateX(-50%);
  bottom:22px;z-index:900;
  display:flex;align-items:center;gap:12px;
  max-width:min(640px,calc(100vw - 28px));
  padding:12px 14px;border-radius:14px;
  background:#fff7ed;border:1px solid #fed7aa;color:#9a3412;
  box-shadow:0 12px 30px rgba(15,23,42,.14);
  font-size:13px;line-height:1.5;
}
.cloud-down-bar b{color:#b91c1c;font-weight:800}
.cloud-down-bar .btn-ghost{flex:none;color:#9a3412;border-color:#fdba74;background:#fff}
.cloud-down-bar .btn-ghost:hover{background:#ffedd5}

@media(max-width:1023px){
  .cloud-down-bar{bottom:calc(var(--nav-h) + env(safe-area-inset-bottom) + 14px)}
}
/* 提示条占位时，把瞬时 toast 抬上去，避免两件事叠在一起看不清 */
body.has-cloud-down .toast{bottom:96px}
@media(max-width:1023px){
  body.has-cloud-down .toast{bottom:calc(var(--nav-h) + env(safe-area-inset-bottom) + 96px)}
}

/* ============================================================
   18. 岗位分析三稿源（v16）
   粘贴文字 / 上传截图 / 贴链接三种入口共用一套表单；解析结果统一回填到 jdText。
   ============================================================ */
.seg.mb-sm{margin-bottom:14px}
.drop .btn-ghost{margin-top:4px}
.drop .mut{line-height:1.7;max-width:42em}
.row-inline{display:flex;gap:10px;align-items:center}
.row-inline input{flex:1;min-width:0}
.row-inline .btn-ghost{flex:none;white-space:nowrap}

/* 选填简历里的「不使用简历」：与真实简历项并列，视觉上弱一档 */
.rp-item.rp-skip{border-style:dashed;background:#fff}
.rp-item.rp-skip.on{border-style:solid}

@media(max-width:640px){
  .row-inline{flex-wrap:wrap}
  .row-inline .btn-ghost{width:100%}
}

/* ============================================================
   19. 游客态「我的」页（v16）
   原来游客会同时看到 me-head 按钮、上传简历、会员卡三处登录入口，
   既重复又没说清「登录能白拿什么」。现在只留一张 guest-hero 卡。
   ============================================================ */
.guest-hero{border:1px solid #dbe3ff;background:linear-gradient(180deg,#f7f9ff 0%,#fff 62%)}
.gh-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.gh-top b{font-size:15.5px;color:var(--ink);line-height:1.45}
.gh-badge{
  flex:none;padding:3px 10px;border-radius:999px;font-size:11.5px;font-weight:800;
  color:#fff;background:linear-gradient(135deg,var(--primary),var(--primary2));
}
.gh-list{list-style:none;margin:0 0 16px;padding:0;display:grid;gap:9px}
.gh-list li{
  position:relative;padding-left:22px;font-size:13.4px;line-height:1.7;color:var(--text);
}
.gh-list li::before{
  content:"";position:absolute;left:4px;top:9px;width:7px;height:7px;border-radius:50%;
  background:var(--primary);box-shadow:0 0 0 3px rgba(47,91,255,.12);
}
.gh-list li b{color:var(--primary);font-weight:800}
.guest-hero .actions{justify-content:flex-start}
.guest-hero .hint{margin-top:12px}
.guest-hero .btn-primary{min-width:200px}

/* 游客态：把重复的登录入口与空数据区一并收起
   account 区块（修改密码 / 退出登录 / 注册新账号）对未登录用户毫无意义，
   它曾让游客一屏看到 4 个「登录/注册」按钮，是这次反馈的直接原因。 */
#v-me.is-guest .me-head .btn-primary{display:none}
#v-me.is-guest [data-block="resumes"],
#v-me.is-guest [data-block="progress"],
#v-me.is-guest [data-block="member"],
#v-me.is-guest [data-block="account"]{display:none}

@media(max-width:640px){
  .guest-hero .btn-primary{width:100%;min-width:0}
}

/* 付费墙里的「日额度」补充说明（v16）：体验期内被当天次数拦下时才会出现 */
.pw-daily{
  margin:0 0 14px;padding:10px 12px;border-radius:var(--r-sm);
  background:#fff7ed;border:1px solid #fed7aa;color:#9a3412;text-align:left;
}

/* ============================================================
   20. 推荐岗位清单：工具栏 + 优先级列 + 手机端卡片（v16）
   起因：这个页面原来只有搜索框，无法换排序、也带不走内容；
   手机端「优先级打分」被压到卡片最底部，第一眼看不到排序结果。
   ============================================================ */
.jobs-toolbar{
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  margin:14px 0 12px;padding:10px 12px;border-radius:var(--r-sm);
  background:var(--soft2);border:1px solid var(--line);
}
.jt-sort{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.jt-sort em{font-style:normal;font-size:12.2px;color:var(--muted);margin-right:2px}
.jt-i{
  padding:5px 12px;border-radius:99px;border:1px solid var(--line);background:#fff;
  font-size:12.3px;color:#5b6675;cursor:pointer;transition:.16s;font-family:inherit;
}
.jt-i:hover{border-color:#cfd6ff;color:var(--primary)}
.jt-i.active{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:700}
.jt-act{display:flex;gap:8px;flex-wrap:wrap}

/* 求职分析结果页的「查看全部推荐岗位」：主色按钮 + 两行说明 */
.jobs-cta{display:flex;flex-direction:column;align-items:center;gap:3px;line-height:1.45;padding:13px 16px}
.jobs-cta b{font-size:14.6px;font-weight:800}
.jobs-cta span{font-size:11.8px;font-weight:500;opacity:.92}

/* 优先级列：分数 + 排名，排在第一列，第一眼就能看到顺序 */
.jobs-table .c-rank{width:98px;white-space:nowrap}
.jrank{display:flex;flex-direction:column;gap:4px}
.jrank-no{font-style:normal;font-size:11px;color:var(--muted)}
.jscore-m{display:none}

@media(max-width:900px){
  .jobs-toolbar{flex-direction:column;align-items:stretch;gap:10px}
  .jt-act .btn-ghost{flex:1}
  /* 卡片里第一行就是「优先级」，不用滚到底部才看到分 */
  .jobs-table td.c-rank{padding-top:0;margin-bottom:2px;align-items:center}
  .jobs-table td.c-rank::before{width:auto}
  .jobs-table td.c-rank .jrank{flex-direction:row;align-items:center;gap:8px}
  /* 手机上岗位名后面直接跟分数，省掉一行 */
  .jscore-m{
    display:inline-block;margin-left:8px;padding:2px 8px;border-radius:99px;
    font-size:11.2px;font-weight:800;color:var(--primary);background:var(--primary-soft);
  }
}


/* ============================================================
   21. 2027届校招信息库（v21.2 · 按设计稿重做）
   ------------------------------------------------------------
   版式：左「筛选」栏（PC）+ 右内容列。内容列自上而下
   搜索 → 渐变统计卡 → 会员条 → 工具条 → 筛选胶囊(H5) → 社群入口 → 列表 → 说明。
   配色：设计稿是靛紫渐变，用 --cp1/--cp2 局部覆盖，不动主站蓝。
   数据语义：不涉及涨跌；截止紧急度沿用 is-urgent(红) / is-soon(橙) / is-expired(灰)。
   ============================================================ */

/* 注意：详情弹层 #campusJobModal 在 DOM 上是 body 的子节点，不在 #v-campus 里面。
   这里的自定义属性必须同时挂到弹层上 —— 否则 var(--cp1) 解析失败，
   「去官方投递」这种渐变按钮会整条 background 声明被丢掉，渲染成一个白胶囊。 */
#v-campus,
#campusJobModal,
/* V105：AI 筛选抽屉 #campusAiDrawer 在 body 下、不在 #v-campus 里 ——
   不补这一行，抽屉里所有 var(--cp1) 都会解析失败（chips 选中变白字白底、单选圆点画不出来）。 */
#campusAiDrawer{
  --cp1:#5b57f5; --cp2:#8b7dff;
  --cp-soft:#eef0ff; --cp-soft2:#f5f6fd;
  --cp-line:#e6e8f5; --cp-ink:#171b33; --cp-mut:#6b7391;
  --cp-r:14px;
}

/* ---------- 21.0 两栏骨架 ---------- */

@media(min-width:901px){
  /* 关键：必须写成 #v-campus.active。
     单写 #v-campus 的话，id 选择器的权重会压过 .page{display:none}，
     结果是校招页在「首页 / 我的 / 邀请」等所有页面下面都跟着显示出来
     （首页内容长，把它挡在首屏之外，所以肉眼不容易发现）。 */
  #v-campus.active{display:flex;gap:20px;align-items:flex-start}
  /* align-self:stretch 是「左栏能吸住」的关键，别删。
     .cp-side 原来跟 .cp-side-in 一样高（810px = max-height 上限），而
     position:sticky 只能在**父级盒子里**移动 —— 父级只有这么高，等于没有
     可移动空间，实际表现就是完全不吸、跟着页面滚走。
     V24 实测（1440×900，滚到 1400px）：.cp-side-in.top = -1240，
     也就是滚下去以后筛选栏彻底离开视口，想换筛选得先滚回顶部。 */
  #v-campus>.cp-side{flex:none;width:236px;align-self:stretch}
  #v-campus>.cp-main{flex:1;min-width:0}
}
@media(max-width:900px){
  #v-campus>.cp-main{display:block}
}

/* ---------- 21.1 左侧筛选栏 ---------- */

.cp-side-in{
  background:var(--white);border:1px solid var(--cp-line);border-radius:var(--cp-r);
  overflow:hidden;
}
@media(min-width:901px){
  /* sticky 的 top 必须让开「横向导航(--topnav-h) + 顶栏(--topbar-h)」两层固定头。
     原来只减了 --topnav-h(62px)，而 .top 实际还有 98px 高且 z-index 更高，
     吸住以后筛选栏的表头会钻到 .top 底下被盖住。
     --topbar-h 由 app.js 的 syncTopbarH() 实测写入（.top 高度随页面标题浮动）。 */
  .cp-side-in{
    position:sticky;
    /* 刻意不加额外间距：这个值正好等于两层固定头的总高，也就是「未滚动时
       左栏的自然位置」。加 14px 的话未滚动就会被下推 14px、和右侧列表错位
       （V24 实测 .cp-side 自然 top=160，写成 174 就错开了）。 */
    top:calc(var(--topnav-h,62px) + var(--topbar-h,98px));
    max-height:calc(100vh - var(--topnav-h,62px) - var(--topbar-h,98px) - 28px);
    overflow-y:auto;
  }
  /* 左栏内部也要滚（城市 / 行业筛选项很长），表头跟着一起滚走的话，
     滚到底部选完城市就找不到「全部清除」了。所以表头单独吸在左栏顶部；
     背景必须给不透明色，否则下面的筛选项会从底下透出来。 */
  .cp-side-h{
    position:sticky;top:0;z-index:2;
    background:var(--white);
  }
  .cp-side-in::-webkit-scrollbar{width:5px}
  .cp-side-in::-webkit-scrollbar-thumb{background:#d8dced;border-radius:99px}
}
/* 顶部缓存自愈提示条出现时两层固定头会整体下移，左栏跟着让位（只在桌面端生效，
   手机端 .cp-side 是 display:none，这条规则不会起作用） */
body.has-build-tip .cp-side-in{
  top:calc(var(--topnav-h,62px) + var(--build-tip-h,48px) + var(--topbar-h,98px));
  max-height:calc(100vh - var(--topnav-h,62px) - var(--build-tip-h,48px) - var(--topbar-h,98px) - 28px);
}
.cp-side-h{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:14px 15px 11px;border-bottom:1px solid var(--cp-line);
}
.cp-side-h b{font-size:13.6px;font-weight:800;color:var(--cp-ink)}
.cp-clear{
  font-size:11.8px;font-weight:700;color:var(--cp-mut);background:none;border:0;
  padding:3px 2px;cursor:pointer;font-family:inherit;
}
.cp-clear:hover{color:var(--cp1)}
.cp-clear:disabled{color:#c3c8dd;cursor:default}
.cp-side-body{padding:4px 8px 12px}

.csf{padding:11px 7px;border-bottom:1px dashed var(--cp-line)}
.csf:last-child{border-bottom:0}
.csf>h4{
  font-size:12.4px;font-weight:800;color:var(--cp-ink);margin-bottom:8px;
  display:flex;align-items:center;justify-content:space-between;gap:6px;
}
.csf>h4 em{font-style:normal;font-size:11px;font-weight:700;color:#a6acc6}
.csf-list{display:flex;flex-direction:column;gap:1px}
.csf-i{
  display:flex;align-items:center;gap:8px;width:100%;text-align:left;
  padding:6px 7px;border-radius:8px;border:0;background:none;cursor:pointer;
  font-family:inherit;font-size:12.8px;color:#4c5573;transition:.13s;
}
.csf-i:hover{background:var(--cp-soft2)}
.csf-i.on{background:var(--cp-soft);color:var(--cp1);font-weight:800}
.csf-box{
  flex:none;width:15px;height:15px;border:1.6px solid #ccd2e8;border-radius:4.5px;
  display:grid;place-items:center;transition:.13s;background:#fff;
}
.csf-i.on .csf-box{background:var(--cp1);border-color:var(--cp1)}
.csf-i.on .csf-box::after{
  content:'';width:7px;height:3.5px;margin-top:-2px;
  border-left:1.8px solid #fff;border-bottom:1.8px solid #fff;transform:rotate(-45deg);
}
.csf-i .dot{flex:none;width:7px;height:7px;border-radius:50%;background:#c8cee6}
.csf-i .tx{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.csf-i .n{flex:none;font-size:11.2px;font-weight:700;color:#a6acc6}
.csf-more{
  margin-top:6px;font-size:12px;font-weight:800;color:var(--cp1);
  background:none;border:0;padding:3px 7px;cursor:pointer;font-family:inherit;
}
.csf-more:hover{text-decoration:underline}

/* 性质色点：和列表里的标签色一一对应，扫一眼就知道哪类多 */
.dot-nat-soe{background:#f0574d}
.dot-nat-foreign{background:#8b5cf6}
.dot-nat-fin{background:#0ea5b7}
.dot-nat-gov{background:#22a55a}
.dot-nat-private{background:#94a3b8}

/* ---------- 21.2 搜索框 ---------- */

.cp-search{
  display:flex;align-items:center;gap:10px;position:relative;
  background:#fff;border:1px solid var(--cp-line);border-radius:12px;
  padding:0 14px;margin-bottom:14px;transition:.15s;
}
.cp-search:focus-within{border-color:#c3c8ff;box-shadow:0 0 0 3px rgba(91,87,245,.1)}
.cp-search>.ic{width:17px;height:17px;color:#9aa1bb;flex:none}
.cp-search input{
  flex:1;min-width:0;border:0;background:none;outline:none;
  padding:12px 0;font-size:13.6px;color:var(--cp-ink);font-family:inherit;
}
.cp-search input::placeholder{color:#a6acc6}
.cp-search input::-webkit-search-cancel-button{display:none}
.cp-clr{flex:none;color:#a6acc6;font-size:13px;padding:4px 6px;background:none;border:0;cursor:pointer}
.cp-clr:hover{color:var(--cp1)}

/* ---------- 21.3 渐变统计卡 ---------- */

.cp-stat{
  display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap;
  padding:17px 22px;border-radius:var(--cp-r);color:#fff;
  background:linear-gradient(115deg,#5b57f5,#7a6bff 62%,#9a86ff);
  box-shadow:0 12px 28px rgba(91,87,245,.22);
}
.cp-stat-k{display:flex;align-items:center;gap:34px;flex-wrap:wrap}
.cp-k{display:flex;flex-direction:column;gap:3px}
.cp-k b{font-size:21px;font-weight:800;letter-spacing:-.5px;line-height:1.1}
.cp-k em{font-style:normal;font-size:11.4px;color:rgba(255,255,255,.78)}
.cp-stat-upd{
  font-size:11.4px;color:rgba(255,255,255,.8);white-space:nowrap;
  background:rgba(255,255,255,.16);padding:5px 11px;border-radius:99px;
}
.cp-stat-upd:empty{display:none}

/* ---------- 21.4 会员条 ----------
   需求：整条「免费预览中 / 校招会员已开通」不要了，这个位置换成社群入口条。
   所以 .cp-member-bar 这一组样式已删除（保留注释说明位置，避免以后有人以为是漏写）。 */

/* ---------- 21.4b 社群入口条（挪到统计卡正下方） ---------- */

/* 原来它跟在工具条后面、列表前面，现在紧贴统计卡，和统计卡留出同样的间距 */
.cp-hero .cp-group-strip{margin-top:12px}

/* ---------- 21.5 工具条 ---------- */

.cp-toolbar{
  display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
  margin-top:14px;
}
.cp-tb-l{display:flex;align-items:center;gap:9px;flex-wrap:wrap;min-width:0}
.cp-res{font-size:13px;color:var(--cp-ink);font-weight:700}
.cp-urg{
  font-size:11.4px;font-weight:800;color:#b45309;background:#fef3c7;
  padding:3px 9px;border-radius:99px;
}
.cp-urg:empty{display:none}
.cp-tb-r{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cp-sel{
  display:inline-flex;align-items:center;gap:7px;
  font-size:12.4px;color:var(--cp-mut);font-weight:600;
}
.cp-sel select{
  padding:7px 10px;font-size:12.8px;font-family:inherit;font-weight:700;color:var(--cp-ink);
  border:1px solid var(--cp-line);border-radius:9px;background:#fff;cursor:pointer;
}
.cp-sel select:focus{outline:0;border-color:#c3c8ff;box-shadow:0 0 0 3px rgba(91,87,245,.1)}
.cp-views{display:inline-flex;background:var(--cp-soft2);border:1px solid var(--cp-line);border-radius:9px;padding:2px}
.cp-views button{
  border:0;background:none;cursor:pointer;font-family:inherit;
  font-size:12.4px;font-weight:700;color:var(--cp-mut);padding:6px 13px;border-radius:7px;transition:.14s;
}
.cp-views button.on{background:#fff;color:var(--cp1);box-shadow:0 1px 3px rgba(30,40,80,.1)}

/* ---------- 21.6 H5 筛选胶囊 ---------- */

.cp-chips{display:none}
.cp-chip-panel{display:none}

@media(max-width:900px){
  /* 四个胶囊四等分铺满一行。用 grid 而不是横向滚动：390px 宽的机器上
     横向滚动会把第 4 个「投递截止」切掉一半，看着像坏了。 */
  .cp-chips{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-top:13px}
  .cp-chip{
    display:inline-flex;align-items:center;justify-content:center;gap:3px;min-width:0;
    font-family:inherit;font-size:12px;font-weight:700;color:var(--cp-mut);
    background:#fff;border:1px solid var(--cp-line);border-radius:99px;padding:7px 4px;
  }
  .cp-chip>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .cp-chip.on{background:var(--cp1);border-color:var(--cp1);color:#fff}
  .cp-chip .ic{width:10px;height:10px;flex:none;opacity:.65}
  .cp-chip-panel{
    display:block;margin-top:10px;padding:12px 13px;border-radius:12px;
    background:#fff;border:1px solid var(--cp-line);
  }
  .cp-chip-panel[hidden]{display:none}
  .cp-chip-panel .csf{border-bottom:0;padding:0}
}

/* ---------- 21.7 社群入口条（全页唯一） ---------- */

.cp-group-strip{
  display:flex;align-items:center;gap:13px;width:100%;text-align:left;
  margin-top:14px;padding:13px 17px;border-radius:var(--cp-r);cursor:pointer;
  font-family:inherit;color:inherit;transition:.16s;
  background:linear-gradient(110deg,#eef1ff,#f3eeff 70%,#fdf0f6);
  border:1px solid #dcdefb;
}
.cp-group-strip:hover{border-color:#c2c6f7;transform:translateY(-1px);box-shadow:0 10px 24px rgba(91,87,245,.12)}
.cgs-ic{
  flex:none;width:40px;height:40px;border-radius:12px;display:grid;place-items:center;
  background:linear-gradient(135deg,var(--cp1),var(--cp2));color:#fff;
  box-shadow:0 6px 15px rgba(91,87,245,.28);
}
.cgs-ic .ic{width:20px;height:20px}
.cgs-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.cgs-t b{font-size:13.8px;font-weight:800;color:var(--cp-ink)}
.cgs-t em{font-style:normal;font-size:12.2px;color:#6f7796;line-height:1.55}
.cgs-go{
  flex:none;white-space:nowrap;font-size:12.6px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,var(--cp1),var(--cp2));
  padding:8px 15px;border-radius:99px;box-shadow:0 5px 13px rgba(91,87,245,.25);
}

/* ---------- 21.8 已选条件 ---------- */

.cp-chosen{display:flex;flex-wrap:wrap;gap:6px;margin:14px 0 0}
.cp-chosen:empty{margin:0}
.cp-chosen i{
  font-style:normal;font-size:11.4px;font-weight:700;color:var(--cp1);
  background:var(--cp-soft);padding:4px 10px;border-radius:99px;
}

/* ---------- 21.9 列表 · 卡片视图 ---------- */

.cp-list{display:flex;flex-direction:column;gap:11px;margin-top:12px}
.cp-item{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:14px;
  background:#fff;border:1px solid var(--cp-line);border-radius:var(--cp-r);
  padding:15px 18px;transition:.16s;cursor:pointer;
}
.cp-item:hover{border-color:#c9cdf8;box-shadow:0 10px 26px rgba(30,40,80,.08)}
.cp-item.is-marked{background:#f7fdf9;border-color:#c9e9d5}
/* 需求 3：卡片也补上状态区分 —— 已截止压灰（省得在无效岗位上花时间），
   3 天内截止给一道橙线（该今天动手的），置顶给一道紫线。 */
.cp-item.is-expired{background:#fbfbfd;border-color:#eef0f6}
.cp-item.is-expired .cpi-name{color:#9aa1bb}
.cp-item.is-expired .cpi-logo{filter:grayscale(.5);opacity:.8}
.cp-item.is-urgent{border-color:#fbe0b8}
.cp-item.is-top{box-shadow:inset 3px 0 0 #fb923c}
.cpi-logo{
  flex:none;width:44px;height:44px;border-radius:12px;display:grid;place-items:center;
  font-size:14px;font-weight:800;color:#fff;letter-spacing:-.3px;
  background:linear-gradient(135deg,#6b6ff5,#9a86ff);
  box-shadow:inset 0 -2px 6px rgba(0,0,0,.08);
}
.cpi-main{min-width:0}
.cpi-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cpi-name{font-size:15px;font-weight:800;color:var(--cp-ink);letter-spacing:-.2px}
.cpi-pin{
  font-style:normal;font-size:10.8px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,#f97316,#fb923c);padding:2px 7px;border-radius:5px;
}
.cpi-tag{font-style:normal;font-size:11px;font-weight:700;padding:2.5px 8px;border-radius:6px;background:#f1f3fb;color:#5b6685}
.cpi-tag.nat-soe{color:#b91c1c;background:#fee2e2}
.cpi-tag.nat-foreign{color:#6d28d9;background:#ede9fe}
.cpi-tag.nat-fin{color:#0e7490;background:#cffafe}
.cpi-tag.nat-gov{color:#15803d;background:#dcfce7}
.cpi-tag.nat-private{color:#475569;background:#f1f5f9}
.cpi-tag.t-type{color:#1d4ed8;background:#e0e7ff}
.cpi-tag.t-batch{color:#92400e;background:#fef3c7}

.cpi-metas{display:flex;flex-wrap:wrap;gap:10px 20px;margin-top:9px}
.cpi-m{display:inline-flex;align-items:baseline;gap:6px;font-size:12.4px;color:#4c5573;min-width:0;max-width:100%}
.cpi-m em{font-style:normal;font-size:11.2px;font-weight:700;color:#a6acc6;flex:none}
.cpi-m span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cpi-foot{display:flex;flex-wrap:wrap;gap:14px;margin-top:9px}
.cpi-foot span{font-size:11.5px;color:#8d94ad}
.cpi-foot .is-host{color:#a6acc6}
.cpi-nt{
  display:inline-block;margin-top:8px;font-size:11.6px;font-weight:700;color:#b45309;
  background:#fff7e6;padding:3px 9px;border-radius:6px;
}
.cpi-right{flex:none;display:flex;flex-direction:column;align-items:flex-end;gap:9px;min-width:154px}
.cpi-ddl{text-align:right}
.cpi-ddl b{display:block;font-size:12.4px;font-weight:800;color:#4c5573;white-space:nowrap}
.cpi-ddl em{font-style:normal;display:block;font-size:11.2px;color:#a6acc6;margin-top:2px;white-space:nowrap}
.cpi-ddl.is-urgent b{color:#c0392b}
.cpi-ddl.is-soon b{color:#b45309}
.cpi-ddl.is-expired b{color:#9aa1bb}
.cpi-ddl.is-expired em{color:#b6bccf}
.cpi-acts{display:flex;align-items:center;gap:8px}
.cpi-mark{
  font-family:inherit;white-space:nowrap;font-size:12.2px;font-weight:700;color:#5b6685;
  background:#fff;border:1px solid var(--cp-line);border-radius:99px;padding:7px 13px;cursor:pointer;transition:.14s;
}
.cpi-mark:hover{border-color:#c9cdf8;color:var(--cp1)}
.cpi-mark.on{background:#eefaf2;border-color:#c7ecd6;color:#15803d}
.cpi-go{
  white-space:nowrap;font-size:12.4px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,var(--cp1),var(--cp2));
  padding:8px 15px;border-radius:99px;text-align:center;
  box-shadow:0 4px 12px rgba(91,87,245,.24);
}
.cpi-go:hover{filter:brightness(1.06)}
.cpi-go.is-off{background:#eef0f7;color:#a6acc6;box-shadow:none;font-weight:600}
/* V62：一条校招信息两个入口 ——「公告详情」（公众号原文，次要）+「去投递」（官网，主要）。
   次要的那个用描边胶囊，不跟主按钮抢眼。 */
.cpi-art{
  white-space:nowrap;font-size:12.2px;font-weight:700;color:var(--cp1);
  background:#fff;border:1px solid #cfd3f7;border-radius:99px;padding:7px 13px;text-align:center;transition:.14s;
}
.cpi-art:hover{border-color:var(--cp1);background:#f5f5ff}

/* ---------- 21.10 列表 · 表格视图 ---------- */
/* 需求 3：表格以前是「7 列均分、表头不吸、截止只是加粗文字」，
   现在按列表页该有的样子整过一遍：
   ① 表头 sticky（长列表往下滚，列名不丢）；
   ② 列宽分工明确 —— 公司名吃剩余宽度、操作列固定最右，不再挤在一起；
   ③ 发布 / 更新合成一列上下两行，省下一列给公司名；
   ④ 已截止整行压灰、3 天内截止行左侧给一道橙线，扫一眼就能分清轻重缓急。 */

.cpt-wrap{
  margin-top:12px;background:#fff;
  border:1px solid var(--cp-line);border-radius:var(--cp-r);
  max-height:min(74vh,880px);overflow:auto;-webkit-overflow-scrolling:touch;
}
.cpt{width:100%;border-collapse:separate;border-spacing:0}
.cpt th{
  position:sticky;top:0;z-index:3;
  text-align:left;font-size:11.8px;font-weight:800;color:#8d94ad;
  background:#f7f8fd;padding:11px 12px;border-bottom:1px solid var(--cp-line);white-space:nowrap;
}
.cpt td{padding:12px 12px;border-bottom:1px solid #f2f3fa;font-size:12.6px;color:#4c5573;vertical-align:middle}
.cpt tbody tr:last-child td{border-bottom:0}
.cpt tbody tr{cursor:pointer;transition:.13s}
.cpt tbody tr:nth-child(even){background:#fcfcff}
.cpt tbody tr:hover{background:#f6f7ff}
.cpt tbody tr.is-expired{background:#fbfbfd}
.cpt tbody tr.is-expired td{color:#a3a9bf}
.cpt tbody tr.is-expired .cpt-co b{color:#9aa1bb}
.cpt tbody tr.is-marked{background:#f7fdf9}
.cpt tbody tr.is-marked:hover{background:#f1faf5}
/* 3 天内截止的那一行，左侧给一道橙线（该今天动手的）。
   注意别用 `td:first-child` —— 公司名那列现在是 sticky 定位，
   上面已经有自己的阴影，两条 box-shadow 会互相覆盖，所以合并到下面
   `.cpt tbody tr.is-urgent .cpt-c-co` 一处写。 */

/* 列宽：宽屏按内容分工，窄屏交给 min-width 横向滚动。
   需求 3 实测：1440 视口下校招页主列只有 854px，行业并进公司名副行后
   这里按 6 列分配，整张表刚好不溢出（探针里有「不用横向拖」的断言守着）。 */
.cpt-c-co{width:auto;min-width:184px}
.cpt-c-nat{width:88px}
.cpt-c-city{width:132px}
.cpt-c-date{width:98px}
.cpt-c-ddl{width:118px}
.cpt-c-acts{width:200px}

/* 需求 3：「性质」以前被挤成竖排（外/企、事业单/位），加 nowrap 后
   浏览器按最长词（事业单位）撑开这一列，不再逐字换行。 */
.cpt-c-nat{white-space:nowrap}
.cpt-co{display:flex;align-items:center;gap:10px;min-width:0}
.cpt-co .cpi-logo{width:32px;height:32px;border-radius:9px;font-size:11.6px}
.cpt-co-t{min-width:0}
.cpt-co b{font-size:13.2px;font-weight:800;color:var(--cp-ink);display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px}
.cpt-co em{font-style:normal;display:block;font-size:11.2px;color:#a6acc6;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px}
.cpt-c-city{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cpt-d{display:block;font-size:11.6px;color:#8d94ad;line-height:1.5;white-space:nowrap}
.cpt-d.is-up{color:#aab0c6}
.cpt-c-ddl .cpi-ddl b{font-size:12.2px}
.cpt-c-ddl .cpi-ddl em{font-size:11px}
.cpt-acts{display:flex;gap:7px;justify-content:flex-end}
.cpt .cpi-mark,.cpt .cpi-art,.cpt .cpi-go{padding:5px 10px;font-size:11.4px}
.cpt-empty{padding:34px;text-align:center;color:var(--cp-mut);font-size:12.8px}

/* 需求 3：操作列粘在最右，公司名粘在最左 —— 1080 这类笔记本宽度下
   表格放不下全部列，「标记投递 / 去投递」会被挤出可视区、得横向拖才看得见。
   两端冻住后，中间几列随便滚，公司名和操作始终在手边。 */
.cpt-c-acts{position:sticky;right:0;z-index:2;background:#fff;box-shadow:-8px 0 10px -8px rgba(23,27,51,.13)}
.cpt th.cpt-c-acts{background:#f7f8fd;z-index:4}
.cpt tbody tr:nth-child(even) .cpt-c-acts{background:#fcfcff}
.cpt tbody tr:hover .cpt-c-acts{background:#f6f7ff}
.cpt tbody tr.is-expired .cpt-c-acts{background:#fbfbfd}
.cpt tbody tr.is-marked .cpt-c-acts{background:#f7fdf9}
.cpt tbody tr.is-marked:hover .cpt-c-acts{background:#f1faf5}

.cpt-c-co{position:sticky;left:0;z-index:2;background:#fff;box-shadow:8px 0 10px -8px rgba(23,27,51,.13)}
.cpt th.cpt-c-co{background:#f7f8fd;z-index:4}
.cpt tbody tr:nth-child(even) .cpt-c-co{background:#fcfcff}
.cpt tbody tr:hover .cpt-c-co{background:#f6f7ff}
.cpt tbody tr.is-expired .cpt-c-co{background:#fbfbfd}
.cpt tbody tr.is-marked .cpt-c-co{background:#f7fdf9}
.cpt tbody tr.is-marked:hover .cpt-c-co{background:#f1faf5}
.cpt tbody tr.is-urgent .cpt-c-co{box-shadow:inset 3px 0 0 #f59e0b,8px 0 10px -8px rgba(23,27,51,.13)}

/* 更窄的窗口：把公司名和地点再收一收，仍然不横向拖 */
@media(max-width:1300px){
  .cpt-c-co{min-width:176px}
  .cpt-c-city{width:136px}
  .cpt-co b,.cpt-co em{max-width:200px}
  .cpt th,.cpt td{padding-left:11px;padding-right:11px}
}
@media(max-width:1180px){
  .cpt-wrap{max-height:none}
  .cpt{min-width:760px}
  .cp-side{width:206px}
}

/* ---------- 21.11 分页 ---------- */

.cp-pager{display:flex;align-items:center;justify-content:center;gap:7px;flex-wrap:wrap;margin-top:18px}
.cp-pager:empty{display:none}
.cp-pg{
  min-width:38px;height:36px;padding:0 12px;border-radius:10px;cursor:pointer;
  font-family:inherit;font-size:13px;font-weight:700;color:#4c5573;
  background:#fff;border:1px solid var(--cp-line);transition:.14s;
}
.cp-pg:hover:not(:disabled){border-color:#c9cdf8;color:var(--cp1)}
.cp-pg.on{background:linear-gradient(135deg,var(--cp1),var(--cp2));border-color:transparent;color:#fff}
.cp-pg:disabled{opacity:.42;cursor:default}
.cp-pg-dots{color:#a6acc6;padding:0 2px}

/* 需求 8：PC 列表下方「每页多少条」。默认全隐藏，只在宽屏出现 ——
   H5 屏窄，翻页本身就要付费，多一排按钮只是挤占空间。
   断点跟前台其他规则保持一致（<=900 手机 / >=901 PC）。 */
.cp-pagesize{display:none}
@media(min-width:901px){
  .cp-pagesize{
    display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;
    margin-top:12px;font-size:12.5px;color:var(--cp-mut);
  }
  .cp-pagesize:empty{display:none}
  .cps-label{font-weight:700;color:#4c5573}
  .cp-ps{
    min-width:64px;height:32px;padding:0 12px;border-radius:9px;cursor:pointer;
    font-family:inherit;font-size:12.5px;font-weight:700;color:#4c5573;
    background:#fff;border:1px solid var(--cp-line);transition:.14s;
  }
  .cp-ps:hover{border-color:#c9cdf8;color:var(--cp1)}
  .cp-ps.on{background:linear-gradient(135deg,var(--cp1),var(--cp2));border-color:transparent;color:#fff}
  .cps-cur{color:#a6acc6}
}

/* ---------- 21.12 骨架 / 空态 / 锁屏 / 说明 ---------- */

.cp-skel{display:flex;flex-direction:column;gap:11px;margin-top:12px}
.cp-skel i{
  display:block;height:96px;border-radius:var(--cp-r);
  background:linear-gradient(90deg,#f2f3fa 25%,#e8eaf6 37%,#f2f3fa 63%);
  background-size:400% 100%;animation:cpskel 1.3s ease infinite;
}
@keyframes cpskel{0%{background-position:100% 0}100%{background-position:0 0}}

.cp-empty{
  display:flex;flex-direction:column;align-items:center;gap:9px;text-align:center;
  margin-top:12px;padding:44px 20px;background:#fff;border:1px dashed var(--cp-line);border-radius:var(--cp-r);
}
.cp-empty b{font-size:14.5px;font-weight:800;color:var(--cp-ink)}
.cp-empty span{font-size:12.6px;color:var(--cp-mut);max-width:420px;line-height:1.65}

.cp-locked{
  display:flex;flex-direction:column;align-items:center;gap:11px;text-align:center;
  margin-top:12px;padding:40px 24px;border-radius:var(--cp-r);
  background:linear-gradient(160deg,#f5f6ff,#fdf0f8);border:1px solid #dcdefb;
}
.cp-locked .cl-ic{
  width:56px;height:56px;border-radius:17px;display:grid;place-items:center;
  background:linear-gradient(135deg,var(--cp1),var(--cp2));color:#fff;
  box-shadow:0 8px 20px rgba(91,87,245,.3);
}
.cp-locked .cl-ic .ic{width:27px;height:27px}
.cp-locked b{font-size:16.5px;font-weight:800;color:var(--cp-ink)}
.cp-locked p{font-size:13px;color:var(--cp-mut);line-height:1.7;max-width:480px}
.cp-locked .btn-primary{margin-top:5px}

.cp-tips{
  margin-top:16px;padding:16px 18px;border-radius:var(--cp-r);
  background:var(--cp-soft2);border:1px solid var(--cp-line);
}
.cp-tips b{display:block;font-size:13.4px;font-weight:800;color:var(--cp-ink);margin-bottom:9px}
.cp-tips ul{display:flex;flex-direction:column;gap:7px}
.cp-tips li{position:relative;padding-left:15px;font-size:12.5px;color:#5b6685;line-height:1.7}
.cp-tips li::before{
  content:'';position:absolute;left:2px;top:8px;width:5px;height:5px;border-radius:50%;
  background:var(--cp1);opacity:.5;
}
.cp-tips li b{display:inline;font-size:12.5px;color:var(--cp-ink);margin:0}

/* ---------- 21.13 公司详情弹层 ---------- */

.cj-box{max-width:560px;text-align:left}
.cj-h{display:flex;align-items:flex-start;gap:13px;padding-right:22px}
.cj-h .cpi-logo{width:50px;height:50px;border-radius:14px;font-size:15px}
.cj-h-t{min-width:0;flex:1}
.cj-h-t h2{font-size:17.5px;font-weight:800;color:var(--cp-ink);letter-spacing:-.2px;line-height:1.35}
.cj-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.cj-grid{display:grid;grid-template-columns:74px minmax(0,1fr);gap:9px 12px;margin-top:17px}
.cj-grid dt{font-size:12.2px;color:#a6acc6;font-weight:700}
.cj-grid dd{font-size:12.8px;color:#3d4661;line-height:1.65;min-width:0;word-break:break-word}
.cj-note{
  margin-top:15px;padding:11px 13px;border-radius:11px;font-size:12.4px;line-height:1.7;
  background:#fff7e6;border:1px solid #ffe3b8;color:#8a6533;
}
.cj-acts{display:flex;gap:10px;margin-top:19px}
.cj-acts .cpi-mark,.cj-acts .cpi-art,.cj-acts .cpi-go{flex:1;text-align:center;padding:11px 14px;font-size:13px}
.cj-hint{margin-top:11px;font-size:11.8px;color:#a6acc6;text-align:center;line-height:1.6}

/* ---------- 21.14 社群弹层（沿用） ---------- */

.cg-box{max-width:420px;text-align:center}
.cg-qr{
  margin:16px auto 0;padding:14px;border-radius:16px;
  background:var(--soft);border:1px solid var(--line);width:fit-content;
}
.cg-qr img{width:190px;height:190px;object-fit:contain;border-radius:10px;background:#fff}
.cg-qr p{font-size:12px;margin-top:9px}
.cg-box.is-empty .cg-qr{display:none}
.cg-wx{
  display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;
  margin:14px auto 0;padding:11px 15px;border-radius:12px;
  background:var(--primary-soft);border:1px solid #dde3ff;
}
.cg-wx .mut{font-size:12.4px}
.cg-wx b{font-size:14px;font-weight:800;color:var(--primary);letter-spacing:.4px}

/* ---------- 21.15 首页入口卡 ---------- */

.campus-entry{
  display:block;width:100%;text-align:left;cursor:pointer;font-family:inherit;color:inherit;
  padding:18px 20px;
  background:linear-gradient(120deg,#fff7ed,#fff1f2 62%,#eef2ff);
  border:1px solid #ffd9b8;
}
.campus-entry:hover{border-color:#ffc48a;transform:translateY(-1px);box-shadow:0 10px 26px rgba(214,120,30,.12)}
.campus-entry .ce-top{display:flex;align-items:center;gap:13px}
.campus-entry .ce-ic{
  flex:none;width:44px;height:44px;border-radius:13px;display:grid;place-items:center;
  background:linear-gradient(135deg,#f97316,#fb923c);color:#fff;
  box-shadow:0 6px 16px rgba(249,115,22,.28);
}
.campus-entry .ce-ic .ic{width:22px;height:22px}
.campus-entry .ce-head{flex:1;min-width:0;display:block}
.campus-entry .ce-head b{display:block;font-size:15.5px;font-weight:800;color:#9a3412;letter-spacing:-.2px}
.campus-entry .ce-tags{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px}
.campus-entry .ce-hot{
  display:inline-flex;align-items:center;gap:4px;font-style:normal;
  font-size:11.4px;font-weight:800;color:#c2410c;background:#ffedd5;
  padding:3px 9px;border-radius:99px;
}
.campus-entry .ce-hot .ic{width:12px;height:12px;stroke-width:2}
.campus-entry .ce-used{
  font-style:normal;font-size:11.6px;font-weight:700;color:#8a6a4a;
  background:rgba(255,255,255,.75);padding:3px 9px;border-radius:99px;
}
.campus-entry .ce-go{
  flex:none;white-space:nowrap;font-size:12.8px;font-weight:800;color:#c2410c;
  background:#fff;padding:8px 14px;border-radius:99px;border:1px solid #ffd0a8;
}
.campus-entry .ce-desc{display:block;font-size:12.8px;color:#8a5a33;line-height:1.6;margin-top:11px}
.campus-entry .ce-metas{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px}
.campus-entry .ce-metas i{
  font-style:normal;font-size:11.4px;font-weight:700;color:#9a3412;
  background:rgba(255,255,255,.8);border:1px solid #ffe0c2;padding:3px 9px;border-radius:99px;
}

/* ---------- 21.16 PC 顶栏：导航火热标（需求 1） ---------- */

/* v22 需求 5：导航条上的全局搜索框整块删掉了（HTML 的 #sideSearch 与它的
   绑定一起移除）。它只能带关键词跳校招库，和校招页自带的 #cpKw 重复，
   还容易让人以为它能搜全站。样式一并清掉，不留死 CSS。
   注意 .side-foot{margin-left:14px} 要留着 —— 它给「升级会员」和导航之间留空隙。 */

@media(min-width:901px){
  .side-foot{margin-left:14px}
}

/* ---------- 21.16b 宽屏适配（v22 需求 2）----------
   大哥反馈「浏览器全屏（1920/2560）ui 不太适配」。实测确认：
   .main 被死锁在 max-width:1180px，1440 时两侧各空 130px 还好，
   1920 → 各空 370px、2560 → 各空 690px、3440 → 各空 1130px，
   整页就是中间一细条，工具卡也被压成 361px 宽。
   这里按屏宽分三档把内容列放宽，并在宽屏把首页工具卡从 3 列改 4 列
   （1620/4 ≈ 405px 一张，和原来 1180/3 ≈ 361px 差不多，卡片不会变窄）。
   分档必须放在这之后，越宽的规则越靠后 —— 同特异性下后写的胜。 */
@media(min-width:1600px){
  .main{max-width:1440px}
}
@media(min-width:1900px){
  .main{max-width:1620px}
  .grid{grid-template-columns:repeat(4,1fr)}
}
@media(min-width:2400px){
  /* 2560 的显示器上 1760 会让两侧各空 400px，看着还是「中间一条」。
     放宽到 1920（两侧各 320），同时首页工具卡从 4 列改 5 列 ——
     不过工具卡一共 6 张，5 列会剩 1 张孤零零在第二行，比 4 列（4+2）更难看，
     所以这里只放宽内容列，列数仍保持 4。 */
  .main{max-width:1920px}
}

.nav-hot{
  font-style:normal;font-size:10.4px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,#ff6a3d,#ff8f3c);
  padding:1.5px 6px;border-radius:99px;margin-left:5px;letter-spacing:.2px;
  box-shadow:0 2px 6px rgba(255,106,61,.3);
}

/* ---------- 21.17 移动端 ---------- */

@media(max-width:900px){
  .cp-side{display:none}
  .cp-search{margin-bottom:12px;padding:0 13px}
  .cp-search input{font-size:13px;padding:11px 0}

  .cp-stat{padding:14px 16px;border-radius:14px;gap:12px}
  .cp-stat-k{display:grid;grid-template-columns:1fr 1fr;gap:11px 14px;width:100%}
  .cp-k b{font-size:17.5px}
  .cp-k em{font-size:11px}
  .cp-stat-upd{font-size:11px;padding:4px 10px}

  /* .cp-member-bar 已按需求删除，这个位置换成社群入口条（见下方 .cp-group-strip） */
  .cp-hero .cp-group-strip{margin-top:11px}

  .cp-toolbar{margin-top:12px;gap:10px}
  .cp-res{font-size:12.6px}
  .cp-sel span{display:none}
  .cp-views{display:none}

  .cp-group-strip{padding:12px 14px;gap:11px}
  .cgs-ic{width:36px;height:36px;border-radius:11px}
  .cgs-t em{display:none}
  .cgs-go{padding:7px 13px;font-size:12.2px}

  /* 手机上列表变真卡片：logo 一行、胶囊一行、底部操作一行 */
  .cp-item{grid-template-columns:auto minmax(0,1fr);gap:11px;padding:14px}
  .cpi-logo{width:40px;height:40px;border-radius:11px;font-size:13px}
  .cpi-name{font-size:14.4px}
  .cpi-right{
    grid-column:1 / -1;flex-direction:row;align-items:center;justify-content:space-between;
    min-width:0;gap:10px;margin-top:3px;padding-top:11px;border-top:1px dashed var(--cp-line);
  }
  .cpi-ddl{text-align:left}
  .cpi-ddl b{font-size:12.2px}
  .cpi-ddl em{font-size:11px}
  .cpi-acts{margin-left:auto;flex-wrap:wrap;justify-content:flex-end;row-gap:7px}
  .cpi-acts .cpi-mark,.cpi-acts .cpi-art,.cpi-acts .cpi-go{padding:6px 11px;font-size:11.5px}
  .cpi-metas{gap:6px 14px;margin-top:8px}
  .cpi-m{font-size:12.1px}
  .cpi-foot{gap:11px;margin-top:8px}
  .cpi-foot span{font-size:11.2px}
  .cp-pg{min-width:34px;height:34px;padding:0 10px;font-size:12.4px}
  .cp-locked{padding:32px 18px}
  .cp-tips{padding:14px 15px}
  .cg-qr img{width:168px;height:168px}

  .cj-box{max-width:100%}
  .cj-h .cpi-logo{width:44px;height:44px;border-radius:12px}
  .cj-h-t h2{font-size:16px}
  .cj-grid{grid-template-columns:66px minmax(0,1fr);gap:8px 11px;margin-top:15px}
  .cj-acts{flex-direction:column;gap:9px}
  .cj-acts .cpi-mark,.cj-acts .cpi-art,.cj-acts .cpi-go{width:100%;padding:12px 14px}
}

/* 首页校招入口卡在窄屏收一收（原来在旧 21 节里，重构时被切掉了，补回） */
@media(max-width:900px){
  .campus-entry{padding:16px}
  .campus-entry .ce-go{display:none}
  .campus-entry .ce-ic{width:40px;height:40px;border-radius:12px}
}

/* ---------- 21.18 移动端底部导航上的「火热」标 ---------- */
/* 底部导航的按钮是 column 布局（图标 + 文字），火热标如果当第三个 flex 项
   就会挤到第三行，被导航条固定高度裁掉。改成绝对定位挂在图标右上角。 */
@media(max-width:900px){
  .mobile-nav button{position:relative}
  .mobile-nav .nav-hot{
    position:absolute;top:4px;left:50%;margin-left:11px;
    font-size:9px;font-weight:800;line-height:1.3;padding:1px 5px;
    box-shadow:0 1px 4px rgba(255,106,61,.32);
  }
}

/* ---------- 21.19 手机端付费墙收窄（需求 4） ---------- */
/* 手机本来屏窄，付费墙又是「档位卡 + 二维码 + 客服号 + 邀请」一长串，
   在手机上顶成整屏，看着像一整页而不是一个弹窗。这里收成贴底抽屉：
   留白更小、标题更紧、二维码缩一档，一屏能看完「标题 + 档位 + 怎么开通」。
   （最上面那条橙色提示已经在 app.js 里对校招场景整条去掉了，这里不再重复处理。） */
@media(max-width:900px){
  .pay-box{
    max-width:100%;
    padding:18px 16px calc(16px + env(safe-area-inset-bottom));
    border-radius:18px 18px 0 0;
    /* 88px 时在 390×844 上内容比容器多 8px，内部出现一条滚动条（实测
       boxScrollH 764 > boxClientH 756）。抽屉本来就可以贴得更上，
       这里把可用高度放到 64px 留白，配合下面的间距收紧，一屏能完整看完。 */
    max-height:calc(100vh - 64px);
    max-height:calc(100dvh - 64px);
  }
  .pay-box h2{font-size:16px;margin-bottom:5px;padding-right:34px;line-height:1.35}
  .pay-box .modal-x{top:11px;right:11px;width:28px;height:28px}
  .pay-box .tiers-modal{margin:10px 0 12px}
  .pay-box .pay-qr{margin:2px 0 8px}
  .pay-box .pay-qr img{width:148px;height:148px}
  .pay-box .pay-qr p{margin-top:6px;font-size:11.8px;line-height:1.5}
  .pay-box .pay-wx{padding:9px 12px;margin-bottom:8px;gap:9px}
  .pay-box .pay-alt{margin:9px 0 0;font-size:12.3px}
  /* 「先去会员页看看」原来 margin-top:12px，跟上面两个按钮贴太开 */
  .pay-box > .btn-link{margin-top:8px}
}
@media(max-width:380px){
  /* 小屏再收一档，避免档位卡里「¥9.9 / 月」被挤到换行 */
  .pay-box{padding:16px 13px calc(14px + env(safe-area-inset-bottom))}
  .pay-box h2{font-size:15.8px}
  .pay-box .pay-qr img{width:140px;height:140px}
}
/* 矮屏（横屏 / iPhone SE 这类）：宽度够但高度不够，二维码再降一档，
   保证「标题 + 档位 + 二维码 + 开通按钮」四件套仍在一屏内。
   这条必须排在 380px 那条**之后** —— 375×667 / 360×640 同时命中两条，
   排在前面会被上面那条 140px 盖掉，白写（第一版就踩了这个顺序坑）。 */
@media(max-width:900px) and (max-height:700px){
  .pay-box .pay-qr img{width:118px;height:118px}
  .pay-box .pay-qr p{font-size:11.4px}
  .pay-box .tiers-modal{margin:8px 0 10px}
  .pay-box .pay-alt{margin:7px 0 0}
}

/* ---------- 23. 构建号自检提示条（v23） ----------
   平时 hidden；只有「线上已经有新版本、而这个页面还是旧的」时才出现，
   用来救「按了刷新却还是老页面」的场景。
   必须挂在 body 直接子级：.page 上有 transform 动画，会把 fixed 的包含块改掉。
   注意 [hidden] 那条 —— 下面写了 display:flex，会盖掉浏览器的 hidden 默认样式。 */
.build-tip{
  position:fixed;left:0;right:0;top:0;z-index:9999;
  display:flex;align-items:center;justify-content:center;gap:12px;
  padding:9px 14px calc(9px + env(safe-area-inset-top, 0px));
  background:#fff7e6;border-bottom:1px solid #ffd591;color:#8a5200;
  font-size:13px;line-height:1.5;box-shadow:0 2px 10px rgba(120,80,0,.08);
}
.build-tip[hidden]{display:none!important}
.build-tip .bt-txt{min-width:0}
.build-tip .bt-btn{
  flex:none;border:0;border-radius:8px;padding:6px 12px;cursor:pointer;
  background:#f59e0b;color:#fff;font-family:inherit;font-size:12.5px;font-weight:600;
  transition:.16s;
}
.build-tip .bt-btn:hover{background:#d97706}
@media(max-width:640px){
  .build-tip{font-size:12.2px;gap:8px;justify-content:space-between;text-align:left}
}

/* 提示条出现时把内容顶下来，别让它盖住顶栏。
   ⚠️ 千万别给 .side 写 height：它在 PC 上其实是**横向顶栏**（高度由内容决定，约 62px），
   一写 height 就把它撑成整屏，直接把 .main 推到屏幕外 —— V23 实测踩过。
   只改 padding-top 和两个 sticky 元素的 top 就够了。 */
body.has-build-tip .app{padding-top:var(--build-tip-h, 38px)}
body.has-build-tip .side{top:var(--build-tip-h, 38px)}
body.has-build-tip .top{top:var(--build-tip-h, 38px)}

/* ==================== AI 求职深度分析报告（简历诊断结果页底部的付费入口） ====================
   需求：在现有诊断结果最底部加一个「深度分析 / 付费升级」模块，引导用户从「知道问题」到
   「知道下一步」。三条约束直接落到样式上：
   ① 不动现有诊断页 —— 只加一个 .card，不覆盖任何既有选择器；
   ② 不做成广告位 —— 配色只用现有 token（--primary/--line/--muted），没有大红大黄、
      没有闪烁与入场动效，跟旁边的诊断卡片是同一套语言；
   ③ 手机端不溢出 —— 卖点两列在 600px 以下收成一列，按钮撑满整行。 */
.deep-card{
  position:relative;overflow:hidden;
  border-color:#dfe4ff;
  background:linear-gradient(180deg,#f7f9ff,#fff 46%);
}
/* 顶上一条渐变细线做「这是升级入口」的暗示，比整块染色克制 */
.deep-card::before{
  content:"";position:absolute;left:0;right:0;top:0;height:3px;
  background:linear-gradient(90deg,var(--primary),var(--primary2));
}
.deep-ico{margin-right:2px}
/* V51（大哥 2026-09-27 需求 5）：「待解锁」角标。
   绝对定位在卡片右上角（.deep-card 本身就是 position:relative + overflow:hidden，
   角标不会被裁掉）；同时给标题栏留出右侧空档，长标题也不会顶到角标底下。
   配色只用现有 token，不引入新颜色 —— 它是「说明卡里有东西没拿到」，不是促销价签。 */
.deep-head{padding-right:78px}
.deep-badge{
  position:absolute;top:14px;right:14px;
  padding:3px 9px;border-radius:999px;
  background:var(--primary-soft);border:1px solid #dfe4ff;
  color:var(--primary);font-size:11.6px;font-weight:800;letter-spacing:.3px;
  line-height:1.5;white-space:nowrap;
}
.deep-sub{
  font-size:13.2px;color:var(--text);font-weight:600;
  line-height:1.68;margin:6px 0 0;
}
.deep-feats{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:10px;margin-top:14px;
}
.deep-feat{
  background:var(--white);border:1px solid var(--line);
  border-radius:var(--r-sm);padding:11px 13px;
}
.deep-feat b{display:block;font-size:13.4px;color:var(--ink);margin-bottom:4px;line-height:1.5}
.deep-feat b::before{
  content:"";display:inline-block;width:6px;height:6px;border-radius:50%;
  background:var(--primary);margin-right:7px;vertical-align:2px;
}
.deep-feat p{font-size:12.4px;color:var(--muted);line-height:1.66;margin:0}
.deep-quote{
  margin:14px 0 0;padding:11px 14px;
  border-left:3px solid var(--primary);
  border-radius:0 var(--r-xs) var(--r-xs) 0;
  background:var(--primary-soft);
  font-size:13.2px;font-weight:700;color:var(--primary);line-height:1.62;
}
.deep-acts{display:flex;align-items:center;gap:12px;margin-top:16px;flex-wrap:wrap}
/* 入口卡上的「解锁深度报告」按钮不带价格前缀 —— 去掉 <em> 之后左边会多出
   一块由 em 撑开的间距，这里把内边距拉回来，让文字居中、观感与原按钮一致。 */
.deep-buy-plain{padding-left:18px;padding-right:18px;justify-content:center}
.deep-buy-plain em{display:none}
.deep-buy{
  /* 不继承 .btn-primary 的宽度策略：这个按钮要独占一行且带价格，所以单独写 */
  flex:1 1 240px;display:flex;align-items:center;justify-content:center;gap:8px;
  padding:14px 20px;border:0;border-radius:var(--r-sm);cursor:pointer;
  background:linear-gradient(135deg,var(--primary),var(--primary2));
  color:#fff;font-size:15px;font-weight:800;letter-spacing:.2px;
  font-family:inherit;
  box-shadow:0 10px 24px rgba(47,91,255,.28);
}
.deep-buy em{font-style:normal;font-size:18px;font-weight:800}
/* V42 需求 4：「原价 ¥99 / 首发特惠 ¥9.9」这套价格口径 —— 原价划掉、加一枚价签。
   入口卡与解锁卡共用（两边都挂了 deep-buy-deal）。 */
.deep-buy-deal{gap:7px;padding:13px 16px;font-size:14.6px}
.deep-buy-deal .buy-was{font-style:normal;text-decoration:line-through;opacity:.6;font-size:12.6px;font-weight:600}
.deep-buy-deal .buy-tag{font-style:normal;font-size:10.6px;font-weight:800;padding:2.5px 7px;border-radius:999px;background:rgba(255,255,255,.24);letter-spacing:.2px;white-space:nowrap}
.deep-buy:active{transform:translateY(1px)}
.deep-note{flex:1 1 180px;margin:0;font-size:12.2px;color:var(--muted);line-height:1.66}
@media(max-width:600px){
  .deep-feats{grid-template-columns:1fr}
  .deep-buy{flex:1 1 100%}
}

/* ==================== 24. AI 求职深度分析报告（独立页面 · v231） ====================
   这一页是「诊断 → 深度报告」的落点：诊断页只放一个小小的入口卡，点进来才是完整内容。
   视觉上刻意跟诊断页同一套语言（同 token、同 radius、同卡片），
   只在「这是下一步」的地方用一点点渐变与左边框做提示，不做成促销页。 */

/* ---------- 页头 ---------- */
.deep-plan-head{padding:2px 2px 0;margin-bottom:2px}
.deep-plan-head h2{font-size:21px;font-weight:800;letter-spacing:-.2px}
.deep-plan-head > p{margin:7px 0 0;font-size:13.4px;color:var(--text);line-height:1.7}
.deep-plan-meta{padding:0 2px;font-size:12.4px;color:var(--muted);line-height:1.7}
.deep-plan-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}

/* ---------- 加载 / 提示态 ---------- */
.deep-msg{text-align:center;padding:34px 20px}
.deep-msg > b{display:block;font-size:16px;color:var(--ink);margin-bottom:8px}
.deep-msg > p{font-size:13.2px;color:var(--muted);line-height:1.75;max-width:520px;margin:0 auto 6px}
.deep-msg .btn-primary{margin-top:14px}
.deep-msg-loading{display:flex;flex-direction:column;align-items:center;gap:12px}
.deep-msg-loading b{font-size:13.6px;color:var(--text);font-weight:600}

/* ---------- 预览：报告目录 ---------- */
.deep-plan-list{display:flex;flex-direction:column;gap:2px;margin-top:4px}
.deep-plan-item{display:flex;gap:9px;align-items:flex-start;padding:10px 2px;border-bottom:1px dashed var(--line)}
.deep-plan-item:last-child{border-bottom:0}
.deep-plan-item > i{
  font-style:normal;flex:none;font-size:12.5px;font-weight:800;color:var(--primary);
  padding-top:1px;letter-spacing:.3px;
}
.dpi-b{min-width:0}
.dpi-b > b{display:block;font-size:14px;color:var(--ink);font-weight:700;line-height:1.55}
.dpi-b > p{margin:3px 0 0;font-size:12.5px;color:var(--muted);line-height:1.66}

/* ---------- 预览：成长路线 ---------- */
.deep-route{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:6px}
.deep-route-node{
  font-size:12.6px;font-weight:700;color:var(--text);
  background:var(--soft);border:1px solid var(--line);
  padding:7px 12px;border-radius:99px;white-space:nowrap;
}
.deep-route-node.now{background:#fff;color:var(--muted)}
.deep-route-node.hi{
  color:#fff;border-color:transparent;font-size:13.4px;
  background:linear-gradient(135deg,var(--primary),var(--primary2));
  box-shadow:0 6px 16px rgba(47,91,255,.22);
}
.deep-route-arrow{color:#c2cadf;font-weight:700;font-size:13px}

/* ---------- 预览：解锁条 ---------- */
.deep-gate-tip{margin:0 0 14px;font-size:12.6px;color:var(--muted);line-height:1.75}
/* flex-basis 写 0 而不是百分比：.deep-gate 是**纵向** flex，百分比基准要拿容器高度去解，
   而容器是 height:auto —— 规范上回落成 auto，各浏览器一致但没必要赌这一条。 */
.deep-buy-lg{flex:0 0 auto;width:100%}
/* V34 需求 8：原来这里有一条 .deep-refresh（那颗「我已经付过了，点这里刷新」的按钮），
   按钮已删，规则一并删掉 —— 留着会让人以为前台还有这么个元素。 */
.deep-gate{display:flex;flex-direction:column}
/* ⚠️ .deep-note 那条 `flex:1 1 180px` 是给**横向**排布（.deep-acts）当「宽度基准」写的。
   落到 .deep-gate 这个纵向 flex 里，同一个 180px 会被当成**高度**基准 ——
   父容器 height:auto 不会收缩它，于是说明文字下面凭空顶出一大块空白（实测约 140px）。
   门控卡里的文案一律退回内容高度。
   顺带给 8px 上间距：「生成不收费…」（讲生成）和「这是一份独立的付费报告…」（讲付款）
   是两件事，紧贴在一起会被读成一段连续的话。 */
.deep-gate .deep-note{flex:0 0 auto;min-height:0;margin:8px 0 0}

/* ---------- 已解锁未生成 / 生成中 ---------- */
.deep-start > b{display:block;font-size:15.5px;color:var(--ink);margin-bottom:8px}
.deep-start > p{font-size:13px;color:var(--text);line-height:1.75}
.deep-gen{margin-top:14px}
.deep-err{
  margin:10px 0 0;font-size:12.6px;color:var(--red);
  background:#fef2f2;border:1px solid #fecaca;border-radius:var(--r-xs);padding:9px 12px;line-height:1.7;
}
.deep-gen-card{display:flex;flex-direction:column;gap:2px}
.deep-step{display:flex;align-items:center;gap:11px;padding:9px 2px;transition:opacity .25s}
.deep-step.wait{opacity:.42}
.deep-step .ds-ic{
  flex:none;width:20px;height:20px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:800;line-height:1;
  border:1.5px solid var(--line);color:transparent;background:var(--white);
}
.deep-step.done .ds-ic{
  border-color:transparent;color:#fff;
  background:linear-gradient(135deg,var(--primary),var(--primary2));
}
.deep-step.cur .ds-ic{
  border-color:var(--primary);border-top-color:transparent;
  animation:deepSpin .8s linear infinite;
}
@keyframes deepSpin{to{transform:rotate(360deg)}}
.deep-step b{font-size:13.6px;font-weight:600;color:var(--text)}
.deep-step.cur b{color:var(--ink);font-weight:700}

/* ---------- 完整报告：板块 ---------- */
.deep-sec{
  margin-top:16px;background:var(--white);
  border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--shadow);padding:17px 19px 19px;
}
.deep-sec-h{
  margin:0 0 13px;font-size:15.5px;font-weight:800;color:var(--ink);
  padding-left:11px;border-left:4px solid var(--primary);line-height:1.35;
  display:flex;align-items:baseline;gap:2px;flex-wrap:wrap;
}
.deep-sec-h > i{font-style:normal;color:var(--primary);font-weight:800;letter-spacing:.3px}
.deep-sec-x{margin-left:auto;font-size:12px;font-weight:600;color:var(--muted)}

.dr-p{margin:0 0 9px;font-size:13.6px;color:var(--text);line-height:1.78}
.dr-sub{margin:13px 0 6px;font-size:12.4px;font-weight:800;color:var(--muted);letter-spacing:.2px}
.dr-fine{margin:11px 0 0;font-size:12.2px;color:var(--muted);line-height:1.7}
.dr-ul{margin:0;padding-left:19px;list-style:disc;color:var(--text);font-size:13.4px;line-height:1.78}
.dr-ul li{margin:4px 0}
.dr-ul.tight li{margin:2px 0}
.dr-lab{display:inline-block;font-size:11.6px;font-weight:800;color:var(--muted);margin-right:7px}

/* 竞争力 */
.dr-score{display:flex;align-items:baseline;gap:8px;margin:0 0 11px}
.dr-score b{font-size:38px;font-weight:800;letter-spacing:-1px;color:var(--primary);line-height:1}
.dr-score i{font-style:normal;font-size:13px;color:var(--muted)}
.dr-score em{
  font-style:normal;margin-left:6px;font-size:12.4px;font-weight:700;color:#8a5a00;
  background:#fff4d9;border:1px solid #ffe4a8;padding:2px 10px;border-radius:99px;
}
.dr-two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:10px}
.dr-box{border:1px solid var(--line);border-radius:var(--r-sm);padding:11px 13px}
.dr-box > b{display:block;font-size:12.8px;font-weight:800;margin-bottom:5px}
.dr-box.ok{border-color:#c6eeda;background:#f8fdfa}
.dr-box.ok > b{color:#1f6b47}
.dr-box.bad{border-color:#f9c9d1;background:#fffafb}
.dr-box.bad > b{color:#a81b31}
.dr-box .dr-ul{padding-left:17px;font-size:13px}

/* 提升空间 */
.dr-room{margin:4px 0 14px}
.dr-room-bar{position:relative;height:13px;border-radius:99px;background:#eef0f6;overflow:hidden}
.dr-room-bar > span{position:absolute;top:0;bottom:0;display:block}
.dr-room-bar .now{left:0;background:#c9d2ea;border-radius:99px}
.dr-room-bar .gain{background:linear-gradient(90deg,var(--primary),var(--primary2))}
.dr-room-leg{display:flex;justify-content:space-between;gap:10px;margin-top:8px;font-size:12.6px;color:var(--muted);flex-wrap:wrap}
.dr-room-leg b{color:var(--ink);font-size:13.4px}
.dr-room-leg .hi b{color:var(--primary)}
.dr-points{display:flex;flex-direction:column;gap:9px}
.dr-pt{border:1px solid var(--line);border-left:4px solid var(--primary);border-radius:var(--r-sm);padding:11px 14px}
.dpt-h{display:flex;align-items:baseline;gap:10px;margin-bottom:3px}
.dpt-h > b{font-size:13.8px;color:var(--ink)}
.dpt-h > em{font-style:normal;margin-left:auto;font-size:12px;font-weight:800;color:var(--green);white-space:nowrap}
.dr-pt > p{margin:0;font-size:13px;color:var(--text);line-height:1.72}

/* 行动计划（周 / 月） */
.dr-plans{display:flex;flex-direction:column;gap:10px}
.dr-plan{border:1px solid var(--line);border-radius:var(--r-sm);padding:12px 14px;background:var(--white)}
.dpl-h{display:flex;align-items:baseline;gap:9px;margin-bottom:6px;flex-wrap:wrap}
.dpl-h > i{
  font-style:normal;flex:none;font-size:12px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,var(--primary),var(--primary2));
  padding:2px 10px;border-radius:99px;
}
.dpl-h > b{font-size:13.8px;color:var(--ink)}
.dr-out{
  margin:8px 0 0;font-size:12.4px;color:#1f6b47;line-height:1.66;
  background:#f2fbf6;border-radius:var(--r-xs);padding:6px 11px;
}
.dr-mile{display:flex;flex-direction:column;gap:8px}
.dr-mi{display:flex;gap:11px;align-items:baseline;font-size:13.2px}
.dr-mi > i{font-style:normal;flex:none;min-width:76px;font-size:12.4px;font-weight:800;color:var(--primary)}
.dr-mi > span{color:var(--text);line-height:1.7}

/* 方向 */
.dr-dirs{display:flex;flex-direction:column;gap:12px}
.dr-dir{border:1px solid var(--line);border-radius:var(--r-sm);padding:14px 16px;background:var(--white)}
.dd-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.dd-h > b{font-size:15px;font-weight:800;color:var(--ink)}
.dd-m{font-style:normal;margin-left:auto;font-size:12.6px;font-weight:800;color:var(--primary)}
.dd-bar{height:7px;border-radius:99px;background:#eef0f6;overflow:hidden;margin:9px 0 11px}
.dd-bar > span{display:block;height:100%;background:linear-gradient(90deg,var(--primary),var(--primary2))}
.dr-kw{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
.dr-kw > span{
  font-size:12px;color:#2b3555;background:var(--primary-soft);
  border:1px solid #dde4ff;padding:3px 10px;border-radius:99px;
}

/* 差距表 */
.dr-tw{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r-sm)}
.dr-t{width:100%;border-collapse:collapse;font-size:13.2px;min-width:660px}
.dr-t th{
  text-align:left;font-size:12.4px;font-weight:800;color:var(--muted);
  background:var(--soft);padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap;
}
.dr-t td{padding:10px 12px;border-bottom:1px solid #f0f2f8;color:var(--text);vertical-align:top;line-height:1.68}
.dr-t tr:last-child td{border-bottom:0}
.dr-t .c-dir{font-weight:800;color:var(--ink);white-space:nowrap}
.dr-t .c-lack{color:#a81b31}
.dr-t .c-when{white-space:nowrap;color:var(--muted)}

/* TOP5 */
.dr-acts{display:flex;flex-direction:column;gap:10px}
.dr-act{border:1px solid var(--line);border-radius:var(--r-sm);padding:12px 15px}
.da-h{display:flex;align-items:center;gap:9px;margin-bottom:6px}
.da-h > i{
  font-style:normal;flex:none;font-size:11.6px;font-weight:800;color:#fff;
  padding:3px 9px;border-radius:99px;letter-spacing:.3px;
}
.da-h > i.p-p0{background:var(--red)}
.da-h > i.p-p1{background:var(--orange)}
.da-h > i.p-p2{background:var(--muted)}
.da-h > b{font-size:14.2px;color:var(--ink);font-weight:700}
.da-n{margin-left:auto;font-size:12px;color:var(--muted);font-weight:700}

/* 页脚 */
.deep-foot{margin-top:20px;font-size:12.4px;color:var(--muted);line-height:1.75}
.deep-foot > p{margin:0 0 12px}

/* ---------- v232 质量控制系统（需求 §十三）新增的块 ---------- */

/* 报告顶部的「质量审核通过」标记 */
.deep-audit-ok{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0 0;padding:10px 13px;
  border:1px solid #bfe9cf;background:#f0fbf4;border-radius:var(--r-sm);font-size:13px;font-weight:700;color:#0f7a45}
.deep-audit-ok i{font-style:normal;flex:none;width:19px;height:19px;display:flex;align-items:center;
  justify-content:center;border-radius:50%;background:#0f9d58;color:#fff;font-size:12px}
.deep-audit-ok span{font-weight:400;color:#5b8c74;font-size:12.2px}

/* 审核未通过：报告不展示，只给这一页 */
.deep-audit-fail{border:1px solid #ffe2b0;background:#fffdf7}
.deep-audit-fail>b{display:block;font-size:15.5px;color:#b45309;margin-bottom:6px}
.deep-audit-fail>p{margin:0 0 8px;font-size:13.6px;color:var(--text);line-height:1.72}
.deep-audit-fail .deep-gen{margin-top:4px}

/* ---------------- 我的求职画像（V2 §五 / §二十二） ----------------
   报告页顶部的「当前阶段」横幅 + 采集表单。PC 两列、窄屏单列。
   表单控件显式给 height:38px —— 移动端 Safari 的 select 默认高度很矮，点不准。 */
.deep-profile .dp-stage{margin-top:10px;padding:12px 14px;border-radius:var(--r-sm);
  background:linear-gradient(135deg,#eff5ff,#e7f0fe);border:1px solid #cfe0ff}
.dp-stage-lb{display:inline-block;font-size:12px;color:#4b6fae;margin-right:7px}
.dp-stage-v{font-size:17px;color:#1b4b9e;letter-spacing:.2px}
.dp-conf{margin-left:8px;font-size:11.6px;padding:2px 7px;border-radius:999px;vertical-align:2px;
  font-weight:400;white-space:nowrap}
.dp-conf.mid{background:#fff5e6;color:#a8620a;border:1px solid #ffe0b0}
.dp-conf.low{background:#fdf0f0;color:#a83232;border:1px solid #f6d4d4}
.dp-why{margin:7px 0 0;font-size:13px;color:#42566f;line-height:1.7}

.dp-body{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 18px;margin-top:14px}
.dp-row{display:flex;flex-direction:column;gap:5px;min-width:0}
.dp-row>label{font-size:12.6px;color:var(--mut);font-weight:600}
.dp-fld{display:flex;flex-direction:column;gap:4px;min-width:0}
.dp-fld select,.dp-fld input[type=text]{width:100%;height:38px;padding:0 10px;font-size:13.6px;
  color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:9px;outline:none;
  -webkit-appearance:none;appearance:none}
.dp-fld input[type=text]{-webkit-appearance:none}
.dp-fld select:focus,.dp-fld input[type=text]:focus{border-color:#9cc0ff;box-shadow:0 0 0 3px #eaf2ff}
.dp-hint{font-size:11.8px;color:var(--mut);line-height:1.5}
.dp-inline{display:flex;gap:8px}
.dp-inline select{flex:1 1 0;min-width:0}
.dp-chk{display:flex;align-items:flex-start;gap:8px;margin-top:13px;font-size:13.2px;color:var(--text);cursor:pointer}
.dp-chk input{margin-top:2px;flex:none;width:16px;height:16px}
.dp-acts{display:flex;align-items:center;gap:12px;margin-top:14px;flex-wrap:wrap}
@media (max-width:640px){
  .dp-body{grid-template-columns:1fr}
  .dp-stage-v{font-size:16px}
}

/* 核心问题：问题 / 简历证据 / 为什么重要 / 怎么解决 */
.dr-probs{display:flex;flex-direction:column;gap:10px;margin-top:10px}
.dr-prob{border:1px solid var(--line);border-radius:var(--r-sm);padding:11px 14px}
.dp-h{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.dp-h i{font-style:normal;flex:none;width:20px;height:20px;display:flex;align-items:center;justify-content:center;
  border-radius:6px;background:var(--primary-soft);color:var(--primary);font-size:12px;font-weight:800}
.dp-h b{font-size:14.5px}
.dp-ev{margin:0 0 6px;padding:8px 11px;border-left:3px solid #c9dcff;background:#f7faff;border-radius:0 9px 9px 0;
  font-size:13.2px;color:var(--ink2);line-height:1.66}

/* 任务四件套（做什么 / 执行时间 / 产出物 / 完成标准） */
.dr-tasks{display:flex;flex-direction:column;gap:8px;margin-top:9px}
.dr-task{border:1px solid var(--line);border-radius:var(--r-xs);padding:9px 12px;background:#fcfdff}
.dt-t{margin:0;font-size:13.6px;font-weight:600;color:var(--ink)}
.dt-meta{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:6px}
.dt-meta span{font-size:12.2px;color:var(--muted)}
.dt-meta i{font-style:normal;font-weight:700;color:#5b6b85;margin-right:5px}
.dr-done{color:#1f6b47}
.dr-t .c-ok{color:#1f6b47;font-weight:700;white-space:nowrap}
.dr-verify li{color:#1f6b47}

/* ===== V2 §三十五：12 节新增块（01 画像 / 02 阶段解读 / 05 岗位差距 / 06 提升空间 / 12 工具） ===== */
.dr-lead{margin:0 0 12px;font-size:14.2px;color:var(--ink);line-height:1.75}
.dr-prof{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
.dpf{border:1px solid var(--line);border-radius:var(--r-xs);padding:8px 11px;background:#fbfcff;min-width:0}
.dpf i{display:block;font-style:normal;font-size:11.6px;color:var(--muted);margin-bottom:3px}
.dpf b{display:block;font-size:13.4px;font-weight:600;color:var(--ink);word-break:break-all}
.dr-focus{margin:12px 0 0;padding:9px 12px;border-left:3px solid var(--primary);background:var(--primary-soft);border-radius:0 9px 9px 0;font-size:13.4px;color:var(--ink2);line-height:1.7}
.dr-stages{border:1px solid #dfe6f7;background:linear-gradient(135deg,#f4f7ff,#fbfaff);border-radius:var(--r-xs);padding:12px 14px}
.drs-v{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.drs-v b{font-size:17px;font-weight:800;color:var(--primary)}
.drs-conf{font-style:normal;font-size:11.8px;font-weight:700;padding:2px 9px;border-radius:99px}
.drs-conf.mid{color:#8a5a00;background:#fff4d9;border:1px solid #ffe4a8}
.drs-conf.low{color:#8a3040;background:#fff1f3;border:1px solid #ffd5dc}
.drs-why{margin:8px 0 0;font-size:13.2px;color:var(--ink2);line-height:1.7}
.dr-say{display:flex;flex-direction:column;gap:9px;margin-top:11px}
.drsay{border:1px solid var(--line);border-radius:var(--r-xs);padding:10px 13px}
.drsay b{display:block;font-size:12.6px;color:var(--primary);margin-bottom:4px}
.drsay p{margin:0;font-size:13.4px;color:var(--ink2);line-height:1.72}
.dr-space-lv{margin:2px 0 10px;font-size:13.4px;color:var(--ink2)}
.dr-space-lv b{color:var(--primary);font-size:15px;font-weight:800}
.dr-spaces{display:flex;flex-direction:column;gap:9px}
.dsp{border:1px solid var(--line);border-radius:var(--r-xs);padding:11px 14px}
.dsp-h{display:flex;align-items:flex-start;gap:8px;margin-bottom:6px}
.dsp-h i{font-style:normal;flex:none;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:6px;background:var(--primary-soft);color:var(--primary);font-size:12px;font-weight:800}
.dsp-h b{font-size:14.2px;line-height:1.6}
.dsp-l{margin:0 0 5px;font-size:13.2px;color:var(--ink2);line-height:1.7}
.dsp-l:last-child{margin-bottom:0}
.dsp-adv{color:#1f6b47}
.dr-room-sum{margin:10px 0 0;font-size:12.6px;color:var(--muted);line-height:1.7}
.dr-tools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.dtool{border:1px solid var(--line);border-radius:var(--r-xs);padding:11px 14px;background:#fbfcff;min-width:0}
.dtl-h{font-size:14.2px;font-weight:700;color:var(--primary);margin-bottom:6px}
.dtool .dr-p{margin:0 0 5px;font-size:13.2px}
.dtool .dr-p:last-child{margin-bottom:0}

@media(max-width:600px){
  .deep-sec{padding:15px 15px 17px;border-radius:var(--r-sm)}
  .deep-plan-head h2{font-size:19px}
  .dr-two{grid-template-columns:1fr}
  .dr-score b{font-size:33px}
  .dd-m{margin-left:0;width:100%}
  /* 任务四件套在小屏竖排，避免「执行时间」被挤到换行后看不见 */
  .dt-meta{flex-direction:column;gap:3px}
  .dp-ev{padding:7px 10px}
  /* 07 的 5 列表：手机上一行只能看到两列，横向滑很容易漏掉「怎么补 / 预计周期」。
     小屏改成「一行 = 一张卡」，用 td 上的 data-l 当字段名，信息一条都不少。 */
  .dr-tw{overflow:visible;border:0}
  .dr-t{display:block;min-width:0;font-size:13px}
  .dr-t thead{display:none}
  .dr-t tbody,.dr-t tr,.dr-t td{display:block}
  .dr-t tr{border:1px solid var(--line);border-radius:var(--r-sm);padding:11px 13px;margin-bottom:10px;background:var(--soft)}
  .dr-t tr:last-child{margin-bottom:0}
  .dr-t td{border:0;padding:3px 0;white-space:normal !important}
  .dr-t td::before{content:attr(data-l);display:inline-block;min-width:64px;margin-right:8px;color:var(--muted);font-weight:700}
  .dr-t td.c-dir{padding-bottom:7px;margin-bottom:6px;border-bottom:1px dashed var(--line)}
  .dr-t td.c-dir::before{content:'';min-width:0;margin:0}
  .dr-prof{grid-template-columns:1fr 1fr}
  .dr-tools{grid-template-columns:1fr}
  .drs-v b{font-size:16px}
}

/* ============================================================================
   V33 · 深度报告生成流程（需求 2 / 3 / 4 / 5）
   落地页排版（目录 → 画像 → 生成按钮）、画像折叠、生成中进度、失败页、免费预览锁。
   ⚠️ 这一组类只出现在**页面里**，不会进导出容器（导出永远是完整报告），
      所以**不需要**同步 app.js 里的 DEEP_EXPORT_CSS —— 别顺手去改那一份。
   ============================================================================ */

/* ---------- 求职画像卡：默认收起（需求 2） ---------- */
.dp-toggle{
  /* V37 需求 5：30px 的点击区偏小（探针量到），抬到 34px —— 与页面其他小按钮同高 */
  margin-left:auto;flex:none;height:34px;padding:0 13px;font-size:12.6px;font-weight:700;
  color:var(--primary);background:var(--primary-soft);border:1px solid #cfe0ff;border-radius:999px;
  cursor:pointer;transition:background .18s;
}
.dp-toggle:hover{background:#e2edff}
.dp-tip{margin:12px 0 0;font-size:12.8px;line-height:1.75;color:var(--text)}
.dp-miss{
  margin:11px 0 0;padding:10px 13px;border-radius:var(--r-sm);font-size:12.8px;line-height:1.75;
  background:#fffaf0;border:1px solid #ffe6bd;color:#8a5a12;
}
.dp-miss b{color:#7a4a06}
.dp-miss.ok{background:#f1fbf4;border-color:#c9ecd6;color:#2f7a4d}
/* 收起时表单与保存按钮一起藏掉，把主视觉让给报告目录。
   ⚠️ 刻意不用 [hidden]：.dp-body 是 grid 容器，各浏览器对 grid 上的 hidden 行为不一致，
      这里显式 display:none，和 MEMORY 里「隐藏节点要显式写 display」的教训一致。 */
.deep-profile:not(.open) .dp-body,
.deep-profile:not(.open) .dp-acts,
.deep-profile:not(.open) > .deep-note{display:none}

/* ---------- 生成中：预计时长 + 真实处理量（需求 4） ---------- */
.deep-eta{
  display:flex;flex-direction:column;gap:5px;padding:15px 16px;border-radius:var(--r-sm);
  background:linear-gradient(135deg,#eff5ff,#e9f1ff);border:1px solid #d4e3ff;
}
.deep-eta > b{font-size:15px;color:#1b4b9e;font-weight:800}
.deep-eta em{font-style:normal;font-size:21px;letter-spacing:.5px;color:var(--primary);margin:0 3px}
.deep-eta > span{font-size:12.4px;color:#5b7bab;line-height:1.7}
/* V34 需求 4：真实进度条。阶段驱动 + 封顶 96%（见 app.js deepProgressPct），
   和上面那句「预计还需 N 分钟」是同一套口径 —— 不许一个说快完了、另一个还在原地。
   百分比刻意放在条**右侧外部**：进度 3% 时压在条里根本看不清。 */
.deep-bar{position:relative;height:12px;border-radius:99px;background:#e8eefb;margin:12px 52px 2px 0}
.deep-bar > i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#3b6fe0,#5b8cff);transition:width .5s ease}
.deep-bar > em{position:absolute;left:100%;top:-3px;margin-left:9px;font-style:normal;font-size:12px;font-weight:800;color:#2b53a8}
.deep-live{margin:13px 0 4px;min-height:20px;font-size:13.2px;font-weight:600;color:var(--primary);line-height:1.75}
.deep-steps{display:flex;flex-direction:column;gap:2px;margin-top:6px}

/* ---------- 生成失败（三类：信息不足 / 系统异常 / 超时） ---------- */
.deep-fail{border:1px solid #ffe2b0;background:#fffdf7}
.deep-fail>b{display:block;font-size:15.5px;color:#b45309;margin-bottom:7px}
.deep-fail>p{margin:0 0 12px;font-size:13.4px;color:var(--text);line-height:1.78}
.deep-fail .deep-gen{margin-top:14px}
/* V42 需求 2：按钮下面紧跟着 .deep-note（它自带 margin:0），手机上看着像和按钮叠在一起。
   给「紧跟按钮的那一条」留出 12px —— 只影响挨着按钮的第一条，不影响别处的 .deep-note。 */
.deep-fail .deep-gen + .deep-note{margin-top:12px}
/* V42 需求 6：连续失败 2 次后出现的「联系客服」块 —— 虚线框 + 淡蓝底，
   与上面那颗实心主按钮明确区分开（一个是「再试一次」，一个是「换条路」）。 */
.deep-kefu{margin-top:14px;padding:14px 16px;border:1px dashed #c7d3f0;border-radius:var(--r-sm);background:#f6f9ff}
.deep-kefu>b{display:block;font-size:13.3px;font-weight:700;color:var(--ink);line-height:1.72;margin-bottom:11px}
.deep-miss{
  margin:0 0 14px;padding:11px 15px 11px 32px;border-radius:var(--r-sm);list-style:disc;
  background:#fffaf0;border:1px solid #ffe6bd;
}
.deep-miss li{font-size:13.2px;color:#8a5a12;line-height:1.85}
.deep-retry{margin-top:12px;align-self:flex-start}

/* ---------- 免费预览：被锁住的后 9 节（需求 4） ---------- */
.deep-locked{padding:0;overflow:hidden}
/* V48（大哥 2026-09-26 报「标题上方一大块留白」）：
   这里原来有 `.dl-fade{height:62px;background:linear-gradient(180deg,rgba(255,255,255,0),var(--white))}`
   —— 它是**流内块元素**，坐在白底卡片最顶上，「透明 → 白」的渐变在白底上肉眼完全不可见，
   却硬占 62px。实测标题上方净空 H5/PC 都是 65px（= 62 + 原 .dl-body 的 2px 上内边距），
   与屏宽无关 ⇒ 是固定死高度，不是响应式问题。
   该元素已从 app.js 的 deepLockHtml 里删除，这里同步删掉规则；上留白改由 .dl-body 收口。 */
.dl-body{padding:22px 22px 22px}
.dl-body>b{display:block;font-size:14.5px;color:var(--ink);margin-bottom:11px}
.dl-secs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.dl-secs>span{
  display:inline-flex;align-items:center;gap:6px;padding:6px 11px;border-radius:999px;
  font-size:12.4px;color:var(--muted);background:var(--soft);border:1px solid var(--line);
}
.dl-secs i{font-style:normal;font-weight:800;color:var(--primary);letter-spacing:.3px}
/* V42 需求 7：这颗按钮原来是**紧贴**着上面的胶囊（.dl-secs 只有 14px 下边距、
   而 .deep-note 是 margin:0），在窄屏上看着像「叠」在标题上。往下挪 18px 并加厚。 */
.deep-locked .deep-buy{flex:0 0 auto;width:100%;margin-top:18px;min-height:56px;
  box-shadow:0 12px 26px rgba(47,91,255,.32)}

/* 落地页 / 免费预览底部那块「没有付费按钮」的门控卡的收边 */
.deep-gate-bare{padding-top:2px}

/* V39e（大哥 2026-09-25 需求 2）：落地页那颗主 CTA 单独收一版视觉 ——
   这一页只有这一个动作，之前它跟表单里的小按钮同尺寸，点击区偏小、存在感也弱。
   去掉按钮下面那句灰字之后，按钮就是这张卡里唯一的内容，上下留白一起调匀。 */
.deep-gate .deep-genfree{
  margin-top:10px;padding:16px 24px;font-size:15.5px;border-radius:14px;min-height:54px;
  box-shadow:0 12px 28px rgba(47,91,255,.30);
}
.deep-gate .deep-genfree:hover{transform:translateY(-1px);box-shadow:0 16px 34px rgba(47,91,255,.36)}

/* V39e（大哥需求 3）：报告页底部「去个人中心 / 再做一次诊断」等宽平分。
   ⚠️ 只给 .deep-foot-acts 用 —— 报告顶部那组（下载 PDF / 导出图片 / 重新生成）
      是按内容宽度排的，套上等宽会挤成一排一样宽的大按钮。 */
.deep-foot-acts{display:flex;gap:10px}
.deep-foot-acts > button{flex:1 1 0;min-width:0;justify-content:center}


/* ---- V34（需求 3）：使用记录里「简历诊断」下方那条深度报告入口 ---- */
.uh-deep{display:flex;align-items:center;gap:10px;margin-top:10px;padding-top:10px;border-top:1px dashed #e3e9f5;flex-wrap:wrap}
.uh-deep-lb{font-size:12.2px;font-weight:700;color:#4b6fae}
.uh-deep button{padding:6px 12px;font-size:12.2px;flex:0 0 auto}

/* ---- V34（需求 7）：求职画像卡上的「本次规划依据」---- */
.dp-basis{margin-top:10px;padding:10px 12px;border-radius:var(--r-sm);background:#f7faff;border:1px solid #dce6fa}
.dp-basis b{display:block;font-size:12.4px;font-weight:800;color:#2b53a8;margin-bottom:3px}
.dp-basis p{margin:0;font-size:12.4px;line-height:1.7;color:var(--text)}
.dp-basis .dp-src{margin-top:4px;font-size:12.1px;color:var(--muted)}



/* ============================================================
   AI 一键简历
   流程：素材 → AI优化（通用/岗位定向两模式）→ 模板 → 在线编辑 → 导出
   V52 的增量样式在文件末尾，见「AI 一键简历 V52」
   ============================================================ */
.rb-shell{max-width:1180px;margin:0 auto;padding-bottom:60px}
.rb-hero{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:28px 30px;margin-bottom:14px;background:linear-gradient(135deg,#fff 0%,#f6f9ff 100%)}
.rb-hero h1{margin:8px 0 8px;font-size:30px;line-height:1.2;letter-spacing:-.5px}
.rb-hero p{margin:0;color:var(--muted);max-width:720px;line-height:1.7}
.rb-badge{display:inline-flex;padding:5px 9px;border-radius:999px;background:var(--soft);color:var(--primary);font-size:12px;font-weight:800}
.rb-hero-actions{display:flex;gap:9px;flex:none}
.rb-stepbar{display:flex;align-items:center;justify-content:center;gap:12px;margin:14px 0;color:var(--muted);font-size:13px}
.rb-stepbar span{padding:8px 12px;border-radius:999px;background:var(--soft2)}
.rb-stepbar span.active{color:var(--primary);font-weight:800;background:var(--soft)}
.rb-stepbar i{font-style:normal;color:#b7c0cb}
.rb-panel{margin-bottom:14px;padding:24px}
.rb-panel-head{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:20px}
.rb-panel-head h2{margin:0 0 6px;font-size:22px}
.rb-panel-head p{margin:0;color:var(--muted);font-size:13px}
.rb-count{font-size:12px;color:var(--muted);background:var(--soft2);padding:7px 10px;border-radius:999px;white-space:nowrap}
.rb-source-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:18px}
.rb-source{appearance:none;border:1px solid var(--line);background:#fff;border-radius:12px;padding:15px;text-align:left;cursor:pointer;display:flex;flex-direction:column;gap:5px}
.rb-source:hover{border-color:#b9c7dc}
.rb-source.active{border-color:var(--primary);box-shadow:0 0 0 2px rgba(55,105,210,.08);background:var(--soft)}
.rb-source b{font-size:14px}.rb-source span{font-size:12px;color:var(--muted);line-height:1.5}
.rb-pane{margin-bottom:18px}
.rb-drop{border:1.5px dashed #b9c5d6;border-radius:14px;min-height:170px;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:8px;background:#fafcff;cursor:pointer}
.rb-drop:hover{border-color:var(--primary);background:var(--soft)}
.rb-drop-icon{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;background:var(--soft);color:var(--primary);font-size:22px;font-weight:800}
.rb-drop b{font-size:15px}.rb-drop span{font-size:12px;color:var(--muted)}
.rb-materials{border-top:1px solid var(--line);padding-top:20px}
.rb-section-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.rb-section-head h3{margin:0;font-size:16px}
.rb-empty{padding:24px;text-align:center;color:var(--muted);background:var(--soft2);border-radius:10px;font-size:13px}
.rb-exp-card{border:1px solid var(--line);border-radius:12px;padding:15px;margin-bottom:10px;background:#fff}
.rb-exp-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.rb-exp-title{font-weight:800}.rb-exp-meta{font-size:12px;color:var(--muted);margin-top:3px}
.rb-exp-actions{display:flex;gap:6px;flex:none}
.rb-exp-raw{margin-top:10px;font-size:13px;line-height:1.7;color:#46515e;white-space:pre-wrap}
.rb-exp-ai{margin-top:12px;padding:12px;background:var(--soft2);border-radius:10px}
.rb-exp-ai-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:7px}
.rb-tag{display:inline-block;font-size:11px;padding:3px 6px;border-radius:5px;background:var(--soft);color:var(--primary);margin-right:6px}
.rb-ai-line{font-size:13px;line-height:1.7;margin:5px 0}
.rb-truth{font-size:11px;color:#8b5b12;background:#fff8e8;border:1px solid #f0dfb0;padding:8px 10px;border-radius:8px;margin-top:10px}
.rb-actions{display:flex;justify-content:flex-end;align-items:center;gap:9px;margin-top:20px}
/* ============================================================
   AI 一键简历 V52（2026-09-27）
   1) 创建方式收敛成两个（删掉「根据岗位创建」）
   2) 目标岗位改成创建后的可选区域
   3) 新增 AI 经历挖掘
   —— 旧的 .rb-target-card 是个只读的两栏小卡（目标岗位/目标公司），
      现在那个数据来源已经不存在了，整块重写。
   ============================================================ */

/* —— 两个创建入口 —— */
.rb-source-grid{grid-template-columns:repeat(2,1fr);gap:12px}
.rb-source{min-height:140px;gap:6px}
.rb-source .btn-primary.sm,.rb-source .btn-ghost.sm{margin-top:auto;align-self:flex-start}
.rb-hero-sub{margin:14px 0 0;padding:11px 13px;background:var(--soft2);border-radius:10px;color:var(--text);font-size:13px;line-height:1.7}
.rb-hero-sub b{color:var(--primary)}

/* —— AI 优化页顶部的模式徽标 —— */
.rb-mode-badge{display:inline-block;margin-bottom:14px;padding:7px 11px;border-radius:999px;background:var(--soft);color:var(--primary);font-size:12px;font-weight:800}

/* —— AI 经历挖掘 —— */
.rb-mine{margin:18px 0;padding:16px;border:1px solid #dbe6f7;border-radius:12px;background:linear-gradient(135deg,#fbfdff 0%,#f4f8ff 100%)}
.rb-mine-head{display:flex;gap:11px;align-items:flex-start}
.rb-mine-icon{font-size:20px;line-height:1.2;flex:none}
.rb-mine-head b{display:block;font-size:14px;margin-bottom:4px}
.rb-mine-head p{margin:0;font-size:12.5px;line-height:1.7;color:var(--muted)}
.rb-mine-chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}
.rb-mine-chip{appearance:none;border:1px solid #c8d8f2;background:#fff;color:#2b53a8;border-radius:999px;padding:6px 12px;font-size:12.5px;cursor:pointer}
.rb-mine-chip:hover{border-color:var(--primary);background:var(--soft)}
.rb-mine-note{margin-top:12px;padding:10px 12px;border-radius:9px;background:#eefaf1;border:1px solid #c6ebd3;color:#256b41;font-size:12.5px;line-height:1.7}

/* —— 经历挖掘问答弹窗 —— */
.rb-mine-box{max-width:660px}
.rb-mine-lead{margin:2px 0 14px;font-size:13px;line-height:1.7;color:var(--muted)}
.rb-mine-tip{margin:0 0 12px;padding:9px 11px;border-radius:9px;background:var(--soft);color:var(--primary);font-size:12.5px;line-height:1.7}
.rb-mine-q{margin-bottom:12px}
.rb-mine-qt{font-weight:700;color:var(--text)}
.rb-mine-box textarea{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:9px;padding:9px 10px;font-size:13px;line-height:1.7;resize:vertical;background:#fff}
.rb-mine-box .actions{display:flex;justify-content:flex-end;gap:9px;margin-top:16px}

/* —— 目标岗位：创建后的可选区域 —— */
.rb-target-card{display:block;padding:16px;background:var(--soft2);border-radius:12px;margin-bottom:18px}
.rb-target-card .rb-target-lead{display:flex;gap:11px;align-items:flex-start;margin-bottom:14px}
.rb-target-card .rb-target-emoji{font-size:20px;line-height:1.2;flex:none}
.rb-target-card .rb-target-lead b{display:block;font-size:14px;margin-bottom:4px}
.rb-target-card .rb-target-lead p{margin:0;font-size:12.5px;line-height:1.7;color:var(--muted)}
.rb-target-card .rb-target-soft{color:var(--primary);font-weight:700;margin-top:2px}
.rb-target-fields{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.rb-target-fields .rb-target-jd{grid-column:1/-1}
.rb-target-fields .fld span{font-size:12px;color:var(--muted)}
.rb-target-foot{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:14px;flex-wrap:wrap}
.rb-target-card .rb-target-hint{font-size:12.5px;line-height:1.7;color:var(--muted);flex:1;min-width:220px}
.rb-target-card .rb-target-hint b{color:var(--primary)}

@media(max-width:900px){
  .rb-source-grid{grid-template-columns:1fr}
  .rb-target-fields{grid-template-columns:1fr}
}
@media(max-width:640px){
  .rb-mine{padding:13px}
  .rb-mine-chip{font-size:12px;padding:6px 10px}
  .rb-target-card .rb-target-foot{display:block}
  .rb-target-card .rb-target-foot .btn-primary{width:100%;margin-top:10px}
  .rb-mine-box .actions{flex-wrap:wrap}
  .rb-mine-box .actions .btn-primary{width:100%}
}
.rb-opt-card{border:1px solid var(--line);border-radius:12px;margin-bottom:12px;overflow:hidden}
.rb-opt-head{padding:14px 16px;background:#fafbfc;display:flex;justify-content:space-between;gap:10px}
.rb-opt-head b{font-size:14px}.rb-opt-head span{font-size:12px;color:var(--muted)}
.rb-opt-body{padding:14px 16px}.rb-opt-row{display:flex;gap:8px;margin:7px 0;font-size:13px;line-height:1.7}
.rb-opt-score{font-size:12px;color:var(--primary);font-weight:800}
.rb-editor-layout{display:grid;grid-template-columns:300px minmax(0,1fr);gap:18px}
.rb-side{border-right:1px solid var(--line);padding-right:18px}
.rb-mini-title{font-size:12px;font-weight:800;color:var(--muted);margin:2px 0 9px}
.rb-templates{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:18px}
.rb-template{border:1px solid var(--line);background:#fff;border-radius:9px;padding:8px;cursor:pointer;text-align:left}
.rb-template.active{border-color:var(--primary);box-shadow:0 0 0 2px rgba(55,105,210,.08)}
.rb-template-preview{height:80px;border:1px solid #e8ebef;border-radius:5px;background:#fff;overflow:hidden;padding:8px}
.rb-template-preview .tp-line{height:4px;background:#c9d1dc;margin:4px 0;border-radius:3px}.rb-template-preview .tp-title{height:8px;width:55%;background:#202631;margin-bottom:7px;border-radius:2px}
.rb-template b{display:block;font-size:11px;margin-top:6px}.rb-template span{display:block;font-size:10px;color:var(--muted);margin-top:2px}
.rb-edit-field{margin-bottom:10px}.rb-edit-field label{display:block;font-size:11px;color:var(--muted);margin-bottom:4px}.rb-edit-field input,.rb-edit-field textarea{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:7px;padding:8px;font-size:12px;background:#fff}
.rb-edit-field textarea{min-height:70px;resize:vertical;line-height:1.6}
/* V56 需求 1：右栏 sticky + 自己滚 —— 左边编辑器很长，滚下去时右边简历必须还能看。
   ⚠️ 光给 .rb-preview-scroll 加 overflow:auto 没用（它会撑到内容高、整页一起滚）
   ⇒ 必须让 wrap 有 max-height 并做成 flex 列，滚动容器才是 preview-scroll。 */
.rb-preview-wrap{min-width:0;position:sticky;top:14px;align-self:start;max-height:calc(100vh - 28px);display:flex;flex-direction:column}
.rb-preview-toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-size:12px;color:var(--muted);flex:none}
/* V59 需求 1：可收起的「简历样式」区 */
.rb-style-toggle{display:flex;align-items:center;gap:6px;appearance:none;border:0;background:transparent;padding:2px 4px 2px 0;cursor:pointer;font-family:inherit;border-radius:6px}
.rb-style-toggle:hover .rb-mini-title{color:var(--primary)}
.rb-style-toggle .rb-mini-title{margin:0}
.rb-style-sum{font-size:11px;color:var(--muted);max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-style-body{display:block;flex:none}
/* ⚠️ 必须补这一条：上面那句 display:block 会把 `hidden` 属性自带的 display:none 压掉 */
.rb-style-body[hidden]{display:none!important}
.rb-preview-toolbar>div{display:flex;gap:7px}
.rb-preview-scroll{background:#eef1f5;border-radius:10px;padding:18px;min-height:0;flex:1 1 auto;overflow:auto}
#rbResumePreview{width:max-content;margin:0 auto}
/* ⚠️ 基础规则必须自带 padding：不是每套模板都写了自己的内边距
   （tech / academic / executive / finance / media / sales 只有配色）
   ⇒ 少了这一行，这 6 套模板渲染出来文字是**贴边**的。
   各模板自己的 padding 规则排在本行之后 ⇒ 单类同权重、后者胜，覆盖正常。 */
.rb-page{width:794px;min-height:1123px;background:#fff;box-shadow:0 3px 20px rgba(25,35,50,.12);box-sizing:border-box;color:#20252c;font-family:Arial,"PingFang SC","Microsoft YaHei",sans-serif;position:relative;padding:44px 48px}
.rb-page .r-name{font-size:30px;font-weight:800;line-height:1.15}.rb-page .r-headline{font-size:13px;color:#5e6977;margin-top:5px}.rb-page .r-contact{font-size:11px;color:#5e6977;margin-top:8px}.rb-page .r-sec{margin-top:20px}.rb-page .r-sec-title{font-size:14px;font-weight:800;padding-bottom:6px;margin-bottom:9px;border-bottom:1px solid #dfe4ea}.rb-page .r-item{margin-bottom:12px}.rb-page .r-item-head{display:grid;grid-template-columns:1fr auto 1fr;align-items:baseline;gap:12px;font-size:12px}.rb-page .r-item-head>.r-org{justify-self:start;min-width:0}.rb-page .r-item-head>.r-role{justify-self:center;text-align:center}.rb-page .r-item-head>.r-time{justify-self:end}.rb-page .r-org{font-weight:800}.rb-page .r-role{color:#4e5967}.rb-page .r-time{color:#727d8b;white-space:nowrap}.rb-page .r-bullets{margin:5px 0 0 15px;padding:0}.rb-page .r-bullets li{font-size:11px;line-height:1.65;margin:2px 0}.rb-page .r-skills{font-size:11px;line-height:1.8}
.rb-template-classic{padding:44px 48px}.rb-template-classic .r-name{color:#17202b}.rb-template-classic .r-sec-title{color:#17202b}
.rb-template-modern{padding:42px 48px}.rb-template-modern .r-name{color:#245dc4}.rb-template-modern .r-sec-title{color:#245dc4;border-bottom:2px solid #245dc4}
.rb-template-campus{padding:38px 48px}.rb-template-campus .r-name{font-size:28px;color:#202631}.rb-template-campus .r-sec-title{background:#f4f7fb;border-bottom:0;padding:6px 9px;border-radius:4px;color:#344a67}
.rb-template-minimal{padding:50px 55px}.rb-template-minimal .r-name{font-size:28px}.rb-template-minimal .r-sec-title{border-bottom:0;border-left:3px solid #222;padding-left:8px}
/* V60 需求 1：水印层 = 一张铺满整张纸的 <canvas>（斜纹平铺「职见AI」+ 每页右下角角标），
   由 resume-builder.js 的 wmLayer() 画。pointer-events:none ⇒ 不挡右栏的编辑与圈选。
   ⚠️ z-index 必须低于 .rb-pg-breaks(4)，否则分页线被水印层盖住。 */
.rb-wm-layer{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:1}
.rb-check-result{margin-top:18px;padding:16px;background:var(--soft2);border-radius:10px}.rb-check-result h3{margin:0 0 10px}.rb-check-item{font-size:13px;padding:7px 0;border-bottom:1px solid var(--line)}.rb-check-item:last-child{border-bottom:0}
.rb-export-head{text-align:center;padding:10px 0 20px}.rb-export-head h2{margin:10px 0 7px;font-size:25px}.rb-export-head p{margin:0 auto;color:var(--muted);font-size:13px;max-width:620px;line-height:1.7}
.rb-export-preview{background:#eef1f5;border-radius:10px;padding:22px;overflow:auto;display:flex;justify-content:center;align-items:flex-start}
.rb-export-actions{display:flex;justify-content:center;gap:10px;margin:16px 0}
.rb-member-callout{display:flex;align-items:center;gap:10px;padding:14px 16px;border:1px solid #e3d6a5;background:#fffaf0;border-radius:10px;font-size:12px}.rb-member-callout span{color:#765f27;flex:1}
@media(max-width:900px){
  .rb-hero{display:block;padding:22px}.rb-hero h1{font-size:24px}.rb-hero-actions{margin-top:15px}
  .rb-source-grid{grid-template-columns:1fr}.rb-editor-layout{grid-template-columns:1fr}.rb-side{border-right:0;border-bottom:1px solid var(--line);padding:0 0 15px}
  /* V56：单列布局下必须关掉 sticky，否则右栏被压在 100vh 里滚不动 */
  .rb-preview-wrap{position:static;max-height:none;display:block}.rb-preview-scroll{min-height:520px}
  .rb-templates{grid-template-columns:repeat(4,1fr)}.rb-preview-scroll{padding:12px}
}
@media(max-width:640px){
  .rb-shell{padding-bottom:30px}.rb-panel{padding:16px}.rb-stepbar{justify-content:flex-start;overflow:auto;white-space:nowrap;font-size:11px}.rb-stepbar i{display:none}
  .rb-hero-actions{width:100%}.rb-hero-actions button{flex:1}.rb-panel-head{display:block}.rb-count{display:inline-block;margin-top:9px}
  .rb-target-card{gap:16px;flex-wrap:wrap}.rb-templates{grid-template-columns:repeat(2,1fr)}
  .rb-preview-scroll{min-height:450px}.rb-preview-wrap{overflow:visible}
  .rb-page{transform-origin:top left}
  .rb-member-callout{align-items:flex-start;flex-wrap:wrap}.rb-member-callout span{flex-basis:100%}
}

/* ============================================================
   AI 一键简历 V53（2026-09-28）—— 大哥 9 条
   ① 12 个模板 ② 入口两路 / 删手动填写 ③ PC 左右结构 + 拉宽
   ④ 单页（导出改弹窗） ⑤ 撤销 ⑥ 目标岗位折叠条
   ⑦ 每段一句话总结 + 红字待补 ⑧ 同类经历归一个表头 ⑨ 细顶栏

   ⚠️ 这里只放「新增」与「显式覆盖」。V52 之前那批 .rb-* 规则多数仍然适用，
      刻意没去删它们（删了要重排 3000 行、风险大于收益）；
      与之冲突的几处（.rb-shell 宽度 / .rb-source 手型 / .rb-mode-badge 外边距 /
      .rb-editor-layout 列宽 / .rb-templates 栅格）在下面逐条改写。
   ============================================================ */

/* —— ① 整体拉宽（原来 1180 太窄，右侧塞不下 A4 预览） ——
   ⚠️ 光改 .rb-shell 没用：app 级 `main{max-width:1180px;padding:0 34px}` 会把它卡在 1112px
      ⇒ 必须同时放宽 main。类由 app.js applyView() 按当前页切（只有简历页带 rb-wide）。 */
body.rb-wide main{max-width:none;padding-left:20px;padding-right:20px}
.rb-shell{max-width:none}

/* —— ⑨ 细顶栏 —— */
.rb-topbar{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:12px 16px;margin-bottom:12px;background:#fff;border:1px solid var(--line);border-radius:12px}
.rb-topbar-l{display:flex;align-items:center;gap:10px;min-width:0}
.rb-topbar-tip{font-size:12.5px;color:var(--muted);line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-topbar-r{display:flex;align-items:center;gap:8px;flex:none}
/* 轻提示（撤销 / 已优化 N 段）：app.js 的 toast() 没挂 window，这里自己在顶栏挂一条，2.2s 消失 */
.rb-flash{font-size:12.5px;font-weight:700;color:#0f7b3f;background:#e8f6ee;border:1px solid #bfe6ce;border-radius:999px;padding:4px 10px;white-space:nowrap;animation:rbFlashIn .18s ease-out}
@keyframes rbFlashIn{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}

/* —— ② 入口：两张卡 + 「我的简历」列表 —— */
.rb-start-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px}
.rb-source{cursor:default;min-height:150px;gap:6px}
.rb-source:hover{border-color:var(--line);background:#fff}
.rb-source.active{border-color:var(--line);box-shadow:none;background:#fff}
.rb-src-meta{font-style:normal;font-weight:400;font-size:11.5px;color:var(--muted)}
.rb-saved-list{display:flex;flex-direction:column;gap:6px;max-height:132px;overflow:auto;margin:2px 0}
.rb-saved-item{appearance:none;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid var(--line);background:#fff;border-radius:8px;padding:7px 10px;cursor:pointer;text-align:left;font-size:12.5px}
.rb-saved-item:hover{border-color:var(--primary);background:var(--soft)}
.rb-saved-item b{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-saved-item span{color:var(--muted);flex:none;font-size:11px}

/* —— ⑥ 目标岗位：一行折叠条 —— */
.rb-work{display:block}
.rb-target-bar{background:#fff;border:1px solid var(--line);border-radius:12px;margin-bottom:12px;overflow:hidden}
.rb-target-toggle{appearance:none;width:100%;display:flex;align-items:center;gap:9px;padding:11px 15px;background:#fff;border:0;cursor:pointer;text-align:left}
.rb-target-toggle:hover{background:var(--soft2)}
.rb-target-emoji{font-size:15px;flex:none}
.rb-target-toggle b{font-size:13.5px;flex:none}
.rb-target-summary{font-style:normal;color:var(--muted);font-size:12.5px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-caret{font-style:normal;color:var(--muted);font-size:11px;transition:transform .15s;flex:none}
.rb-target-toggle.open .rb-caret{transform:rotate(180deg)}
.rb-mode-badge{display:inline-block;margin:0;padding:4px 9px;border-radius:999px;background:var(--soft);color:var(--primary);font-size:11.5px;font-weight:800;flex:none}
.rb-target-body{padding:0 15px 15px;border-top:1px solid var(--line)}
.rb-target-body .rb-target-fields{margin-top:13px}
.rb-target-hint{font-size:12.5px;line-height:1.7;color:var(--muted);flex:1;min-width:200px}
.rb-target-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px;flex-wrap:wrap}

/* —— ③ 左右分栏：左边编辑器加宽，右边模板 + A4 预览 —— */
/* V54 需求 2：左栏收窄、宽度让给预览 —— 794px 的 A4 页面必须能**完整放进**右栏，
   否则会出现横向滚动条（这才是「全屏时不好看」的真正原因）。 */
/* V56 需求 6：左栏从 24% 放大到 34%（编辑器更好写），右栏相应收窄；
   右栏最小可用宽度仍是 794px 的 A4 + 内边距，不会出横向滚动条。 */
.rb-editor-layout{display:grid;grid-template-columns:minmax(340px,34%) minmax(0,1fr);gap:18px;align-items:start}
.rb-side{border-right:1px solid var(--line);padding-right:16px}
.rb-side-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}
.rb-side-head .rb-mini-title{margin:0}

/* —— 左侧：逐段编辑器（每段一个 AI 优化 / 深度优化按钮） —— */
.rb-ed-group{margin-top:16px}
.rb-ed-group-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.rb-ed-group-head span{font-size:12px;font-weight:800;color:var(--muted)}
.rb-ed-empty{font-size:12.5px;color:var(--muted);background:var(--soft2);border-radius:9px;padding:12px;line-height:1.7}
.rb-ed-card{border:1px solid var(--line);border-radius:11px;padding:12px;margin-bottom:9px;background:#fff}
.rb-ed-card:focus-within{border-color:#b9c7dc}
.rb-ed-head{display:flex;align-items:center;gap:7px;margin-bottom:8px}
.rb-ed-label{font-size:12px;font-weight:800;color:var(--muted);flex:1}
.rb-ed-type{appearance:none;border:1px solid var(--line);border-radius:7px;padding:5px 7px;font-size:12px;background:#fff;font-weight:700;cursor:pointer;max-width:130px}
.rb-ed-ai{flex:none}
.rb-ed-del{flex:none;color:var(--muted)}
.rb-ed-sum{font-size:12.5px;line-height:1.7;color:#1d5fa8;background:var(--soft);border-radius:8px;padding:8px 10px;margin-bottom:8px}
.rb-ed-sum.empty{color:var(--muted);background:var(--soft2)}
.rb-ed-meta{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-bottom:7px}
.rb-ed-meta.two{grid-template-columns:1fr 1fr}
.rb-ed-meta input{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:7px;padding:7px 8px;font-size:12px;background:#fff}
.rb-ed-card textarea{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:8px;padding:8px 9px;font-size:12.5px;line-height:1.7;resize:vertical;background:#fff}
.rb-ed-miss{margin-top:7px;font-size:11.5px;color:#b3261e;line-height:1.7}
.rb-ed-miss b{font-weight:700}

/* —— 右侧：模板栅格 + 排版建议 + 预览 —— */
.rb-layout-note{font-size:12.5px;line-height:1.7;color:var(--primary);background:var(--soft);border-radius:9px;padding:9px 11px;margin-bottom:10px;flex:none}
.rb-templates{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:7px;margin-bottom:12px;flex:none}
.rb-template{padding:6px;border-radius:9px;cursor:pointer}
.rb-tpl-thumb{display:block;height:46px;border:1px solid #e8ebef;border-radius:5px;background:#fff;overflow:hidden;padding:6px}
.rb-tpl-thumb i{display:block;height:3px;background:#c9d1dc;margin:3px 0;border-radius:3px}
.rb-tpl-thumb i:first-child{height:6px;width:55%;background:#202631;margin-bottom:5px}
.rb-template b{font-size:10.5px;margin-top:5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-tpl-desc{font-size:9.5px;margin-top:1px}

/* —— 12 个模板的配色 / 气质（结构同一套，差的只是这几个值） —— */
.rb-template-classic .r-name{color:#17202b}.rb-template-classic .r-sec-title{color:#17202b}
.rb-template-modern .r-name{color:#245dc4}.rb-template-modern .r-sec-title{color:#245dc4;border-bottom:2px solid #245dc4}
.rb-template-campus{padding:38px 48px}.rb-template-campus .r-name{font-size:28px;color:#202631}.rb-template-campus .r-sec-title{background:#f4f7fb;border-bottom:0;padding:6px 9px;border-radius:4px;color:#344a67}
.rb-template-minimal{padding:50px 55px}.rb-template-minimal .r-name{font-size:28px}.rb-template-minimal .r-sec-title{border-bottom:0;border-left:3px solid #222;padding-left:8px}
.rb-template-executive .r-name{color:#1b2a41;letter-spacing:.5px}.rb-template-executive .r-sec-title{color:#1b2a41;border-bottom:2px solid #1b2a41;letter-spacing:.6px}
.rb-template-executive .r-item-head{background:#f7f9fc;padding:4px 7px;border-radius:4px}
.rb-template-tech{font-family:"SF Mono",Menlo,Consolas,"PingFang SC",monospace}.rb-template-tech .r-name{color:#0f6ab4}.rb-template-tech .r-sec-title{color:#0f6ab4;border-bottom:1px dashed #9dc3e6}
.rb-template-finance .r-name{color:#2f3a45}.rb-template-finance .r-sec-title{color:#2f3a45;border-bottom:2px solid #b9c2cc;letter-spacing:.4px}
.rb-template-design{padding:42px 50px}.rb-template-design .r-name{color:#6b3fa0;font-size:32px}.rb-template-design .r-sec-title{color:#6b3fa0;border-bottom:0;border-left:4px solid #6b3fa0;padding-left:9px}
.rb-template-media .r-name{color:#11807a}.rb-template-media .r-sec-title{color:#11807a;border-bottom:2px solid #a8ded9}
.rb-template-academic{font-family:Georgia,"Songti SC","PingFang SC",serif}.rb-template-academic .r-name{color:#3d4a5c}.rb-template-academic .r-sec-title{color:#3d4a5c;border-bottom:1px solid #8b95a3;font-variant:small-caps}
.rb-template-sales .r-name{color:#c2571a}.rb-template-sales .r-sec-title{color:#c2571a;border-bottom:2px solid #f0b98d}
.rb-template-simple{padding:40px 46px}.rb-template-simple .r-name{color:#374151;font-size:26px}.rb-template-simple .r-sec-title{color:#374151;border-bottom:1px solid #d1d5db;font-size:13px}
.rb-template-simple .r-item{margin-bottom:9px}
/* V58R 需求 7：新增 6 套配色（骨架仍是同一套，只差主色 / 标题 / 留白） */
.rb-template-product{padding:42px 46px}
.rb-template-product .r-name{color:#0b7285;letter-spacing:.3px}
.rb-template-product .r-sec-title{color:#0b7285;border-bottom:2px solid #8fd3dd}
.rb-template-data .r-name{color:#4c1d95}
.rb-template-data .r-sec-title{color:#4c1d95;border-bottom:1px solid #c4b5fd;font-variant-numeric:tabular-nums}
.rb-template-legal{padding:44px 52px}
.rb-template-legal .r-name{color:#1f2d3d;letter-spacing:1px}
.rb-template-legal .r-sec-title{color:#1f2d3d;border-bottom:1px solid #8894a3;letter-spacing:.8px}
.rb-template-medical .r-name{color:#0f766e}
.rb-template-medical .r-sec-title{color:#0f766e;background:#eefaf7;padding:5px 9px;border-radius:4px;border-bottom:0}
.rb-template-edu .r-name{font-size:28px;color:#b45309}
.rb-template-edu .r-sec-title{color:#b45309;border-left:4px solid #f59e0b;padding-left:8px;border-bottom:0}
.rb-template-ops .r-name{color:#334155}
.rb-template-ops .r-sec-title{color:#334155;border-bottom:2px dashed #94a3b8}
/* V78 需求 1：校招专业版 —— 青蓝主色 + 标题左侧色条 + 淡底（只走配色 / 标题样式） */
.rb-template-campuspro{padding:40px 46px}
.rb-template-campuspro .r-name{font-size:30px;color:#15507a;letter-spacing:.4px}
.rb-template-campuspro .r-headline{color:#3d6b8f}
.rb-template-campuspro .r-sec-title{color:#15507a;background:#eef6fb;border-left:4px solid #2b8ec4;padding:5px 10px;border-radius:4px;border-bottom:0}

/* 紧凑模式（AI 排版建议可能给）：整体收紧，尽量压到一页 */
.rb-density-compact{padding-top:30px!important;padding-bottom:30px!important}
.rb-density-compact .r-sec{margin-top:13px}
.rb-density-compact .r-item{margin-bottom:7px}
.rb-density-compact .r-bullets li{font-size:10.5px;line-height:1.5}
.rb-density-compact .r-name{font-size:26px}

/* V59 需求 10：简历里的红字「［待补充：…］」占位已删（.r-todo / .r-miss 随之作废） */

/* —— ④ 导出弹窗 —— */
.rb-export-box{max-width:900px;width:100%;max-height:calc(100vh - 60px);overflow:auto}
.rb-export-box .rb-export-preview{margin-top:12px;max-height:52vh}
.rb-export-box .rb-export-actions{position:sticky;bottom:0;background:#fff;padding:10px 0;margin:10px 0 0}
/* V59 需求 5：去水印导出（会员）那一行 */
.rb-clean-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:9px;padding:9px 11px;border:1px dashed var(--line);border-radius:9px;background:var(--soft2)}
.rb-clean-row.is-member{border-style:solid;border-color:#cfe6d8;background:#f5fbf7}
.rb-clean-label{font-size:12px;font-weight:700;color:var(--ink)}
/* V60 需求 4：去水印导出「改的明显点」—— 从两个小 ghost 按钮换成一个主色实心大按钮 */
.rb-clean-btn{flex:1 1 230px;min-height:42px;padding:11px 18px;border:0;border-radius:10px;cursor:pointer;font-family:inherit;font-size:14px;font-weight:800;letter-spacing:.3px;color:#fff;background:linear-gradient(135deg,#3b5bdb,#5b7cfa);box-shadow:0 4px 14px rgba(59,91,219,.28);transition:transform .12s,box-shadow .12s,filter .12s}
.rb-clean-btn:hover{filter:brightness(1.06);box-shadow:0 6px 18px rgba(59,91,219,.34)}
.rb-clean-btn:active{transform:translateY(1px);box-shadow:0 2px 8px rgba(59,91,219,.28)}
.rb-clean-btn[disabled]{cursor:default;filter:grayscale(.35);box-shadow:none;opacity:.72}
.rb-clean-note{font-size:11px;color:var(--muted)}
/* ⚠️ 会闪的只有背景 —— 带 transform 的动画会给弹窗里的 fixed 元素造包含块（V58 踩过） */
@keyframes rbCalloutFlash{0%{background:#fff3d6}100%{background:transparent}}
.rb-callout-flash{animation:rbCalloutFlash 1.5s ease-out}

/* —— 响应式：PC → 平板 → 手机 —— */
@media(max-width:1100px){
  .rb-editor-layout{grid-template-columns:minmax(0,1fr)}
  .rb-side{border-right:0;border-bottom:1px solid var(--line);padding:0 0 14px}
}
@media(max-width:860px){
  .rb-start-grid{grid-template-columns:1fr}
  .rb-topbar{display:block}
  .rb-topbar-l{margin-bottom:9px}
  .rb-topbar-tip{white-space:normal}
  .rb-topbar-r{justify-content:flex-end}
  .rb-templates{grid-template-columns:repeat(3,1fr)}
  .rb-ed-meta{grid-template-columns:1fr}
  .rb-target-body .rb-target-fields{grid-template-columns:1fr}
  .rb-target-toggle b{display:none}
}
@media(max-width:640px){
  .rb-templates{grid-template-columns:repeat(2,1fr)}
  .rb-target-foot{display:block}
  .rb-target-foot .btn-primary{width:100%;margin-top:9px}
  .rb-ed-card{padding:10px}
}

/* ============================================================
   V54（2026-09-28）· 简历编辑重构相关样式
   ============================================================ */

/* —— 需求 4：简历预览里**板块与板块之间的空隙**收紧 ——
   ⚠️ 刻意放在上面基础规则**之后**（同权重、后者胜），不去改那行原规则。 */
.rb-page .r-sec{margin-top:var(--rb-gap,14px)}
.rb-page .r-sec-title{margin-bottom:7px}
.rb-page .r-item{margin-bottom:9px}
/* V59 需求 8：每段经历下方的「一句话总结」行已删（.r-item-sum 随之作废） */
/* 自我评价板块 */
.rb-page .r-self{font-size:11px;line-height:1.75;white-space:pre-line}

/* —— 需求 1：一份简历都没有的人，从入口页**直接进编辑器**（次要入口，
   刻意做成一行链接、不复刻 V53 已删掉的「从零开始创建」大卡） —— */
.rb-direct{display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;margin-top:12px;padding-top:12px;border-top:1px dashed var(--line);font-size:12px;color:#6b7280}

/* —— 需求 5：左侧固定板块（折叠 / 排序 / 显隐 / 增删） —— */
.rb-board{border:1px solid var(--line);border-radius:12px;background:#fff;margin-bottom:10px;overflow:hidden}
.rb-board.is-hidden{background:#fafafa;border-style:dashed}
.rb-board-head{display:flex;align-items:center;gap:8px;padding:9px 11px;background:#f7f9fc;border-bottom:1px solid var(--line)}
.rb-board.is-hidden .rb-board-head{background:#f2f2f2}
.rb-board.is-hidden .rb-board-head b,.rb-board.is-hidden .rb-board-n{opacity:.5}
.rb-board-head b{font-size:12.5px}
.rb-board-n{font-size:11px;color:var(--muted);flex:1}
.rb-board-fold{border:0;background:transparent;cursor:pointer;font-size:12px;color:var(--muted);padding:0 2px;line-height:1;transition:transform .15s}
.rb-board-fold.fold{transform:rotate(-90deg)}
.rb-board-tools{display:flex;gap:4px}
.rb-ico{border:1px solid var(--line);background:#fff;border-radius:6px;padding:2px 6px;font-size:11px;line-height:1.6;cursor:pointer;font-family:inherit}
.rb-ico:hover{border-color:#b9c7dc;color:var(--primary)}
.rb-eye{font-size:10.5px;white-space:nowrap}
.rb-board-body{padding:11px}
.rb-board-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:9px}
.rb-ed-tip{font-size:11px;color:var(--muted);flex:1;min-width:150px}
.rb-add{margin-top:2px}
.rb-ed-raw{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:8px;padding:8px 9px;font-size:12.5px;line-height:1.7;resize:vertical;background:#fff;font-family:inherit}
.rb-ed-meta input.full{grid-column:1/-1}
.rb-ed-deep{border-color:#d9c8ec;color:#6b3fa0}

/* —— 需求 7：深度优化跑完后的「包装依据 / 要你确认」说明块 —— */
.rb-ed-deepnote{margin-top:7px;border:1px solid #e2d3f0;background:#faf5ff;border-radius:8px;padding:8px 10px;font-size:11.5px;line-height:1.7}
.rb-ed-deepnote>b{color:#6b3fa0}
.rb-dn-row{margin-top:4px}
.rb-dn-row>span{display:inline-block;min-width:56px;font-weight:700;color:#6b3fa0}
.rb-dn-row.warn{color:#b3261e}
.rb-dn-row.warn>span{color:#b3261e}
.rb-dn-tip{margin-top:5px;color:var(--muted)}

/* 需求 5：窄屏下板块工具条换行，别把标题挤没 */
@media(max-width:860px){
  .rb-board-head{flex-wrap:wrap}
  .rb-board-n{flex:0 0 auto}
}


/* ============================================================
   V56（2026-09-28）· 大哥 8 条
   ① 右栏独立滚动 ② 每段可收起 ③ 间距可调 ④ 识别纠错
   ⑤ 板块级一键优化 ⑥ 左大右小 ⑦ 选中文字加粗/变色 ⑧ 首页工具位
   ============================================================ */

/* —— 需求 3：整份简历一套间距（三个值由 buildResumeHtml 写成 CSS 变量） ——
   ⚠️ 全部挂 .rb-page 上，让**预览与导出**共用同一套值。 */
.rb-page{line-height:var(--rb-lh,1.7);letter-spacing:var(--rb-ls,normal)}
.rb-page .r-bullets li{line-height:var(--rb-lh,1.7)}
.rb-page .r-self{line-height:var(--rb-lh,1.7)}
.rb-page .r-skills{line-height:var(--rb-lh,1.7)}
.rb-page .r-contact,.rb-page .r-headline,.rb-page .r-sec-title,.rb-page .r-item-head{letter-spacing:inherit}

/* —— 需求 3：右侧「简历样式」里的三个滑块 —— */
.rb-typography{display:flex;gap:16px;flex-wrap:wrap;background:#fff;border:1px solid var(--line);border-radius:10px;padding:9px 12px;margin-bottom:10px;flex:none}
.rb-typo{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--muted);white-space:nowrap}
.rb-typo input[type=range]{width:92px;accent-color:var(--primary)}
.rb-typo b{color:var(--ink);font-size:11.5px;min-width:38px;text-align:right;font-variant-numeric:tabular-nums}
/* V59 需求 6：自动排版（比「恢复默认」显眼一档 —— 它是主操作） */
.rb-typo-fit{appearance:none;border:1px solid #c9d8f2;background:#eef4ff;border-radius:6px;padding:3px 10px;font-size:11.5px;cursor:pointer;color:var(--primary);font-weight:700;font-family:inherit}
.rb-typo-fit:hover{background:#e2ecff;border-color:var(--primary)}
.rb-typo-reset{appearance:none;border:1px solid var(--line);background:#fff;border-radius:6px;padding:3px 8px;font-size:11.5px;cursor:pointer;color:var(--muted);font-family:inherit}
.rb-typo-reset:hover{border-color:#b9c7dc;color:var(--primary)}

/* —— 需求 2：每段经历的「收起」按钮 —— */
.rb-ed-card.is-fold{padding-bottom:10px}
.rb-ed-card.is-fold .rb-ed-head{margin-bottom:6px}
.rb-ed-fold{border:1px solid var(--line);background:#fff;border-radius:6px;padding:2px 6px;font-size:10.5px;line-height:1.6;cursor:pointer;font-family:inherit;color:var(--muted);flex:none}
.rb-ed-fold:hover{border-color:#b9c7dc;color:var(--primary)}
/* 收起时把 **一行摘要**（edBrief：单位 · 角色  时间）留在外面，方便一眼扫。
   ⚠️ 这里不是「一句话总结」—— 那套已按 V59 需求 8 删除（edBrief 只是把抬头拼一行）。 */

/* —— 需求 5：板块头的「一键优化本板块」 —— */
.rb-board-ai{appearance:none;border:1px solid #cfe0ff;background:#f2f7ff;border-radius:6px;padding:2px 7px;font-size:10.5px;line-height:1.6;cursor:pointer;font-family:inherit;color:#245dc4;white-space:nowrap}
.rb-board-ai:hover{background:#e6f0ff}
.rb-board-ai:disabled{opacity:.55;cursor:default}

/* V59 需求 3：左栏格式条已删（.rb-ed-rich 随之作废）—— 格式只在**右侧浮动工具条**上改 */
/* 渲染出来的三种颜色（预览 + 导出共用） */
.r-rt-b{font-weight:800}
.r-rt-red{color:#c62828}
.r-rt-blue{color:#1d5fa8}
.r-rt-black{color:#20252c}
/* V59 需求 4：字号两档（用 em ⇒ 跟着所在板块的基础字号走，换模板不用改）+ 字体两种 */
.r-rt-n{font-weight:400}
.r-rt-sm{font-size:.85em}
.r-rt-lg{font-size:1.25em}
.r-rt-f1{font-family:"Songti SC","SimSun","宋体",serif}
.r-rt-f2{font-family:"Kaiti SC","KaiTi","楷体",serif}
/* 基本信息里合进来的「个人信息 / 其他信息」类文本行 */
.rb-page .r-basic-extra{font-size:11px;color:#4e5967;margin-top:5px;line-height:var(--rb-lh,1.7);white-space:pre-line}

/* ═══ V57-START ═══ */
/* ══════════════════════════════════════════════════════════════════
   V57 · 2026-09-29（在 jobai-resume/ 工作副本上做，未发布）
   需求 1  收起伏按钮做得明显
   需求 2  版式轴（细线分隔 / 左侧色条 / 通栏色块 / 卡片分块 / 时间轴）
   需求 3  一句话总结行 + 「一键总结」
   需求 4  原版 ↔ 优化后 并排对比
   需求 5  条目标题行可居中
   ⚠️ 本块排在各模板定义**之后**：模板只定配色，版式只定骨架，两轴互不覆盖。
   ══════════════════════════════════════════════════════════════════ */

/* ---------- 需求 1：收起伏按钮（原来 10.5px 灰字，几乎看不见） ---------- */
.rb-ed-fold{display:inline-flex;align-items:center;gap:5px;min-height:27px;box-sizing:border-box;
  border:1px solid #a9c0e6;background:linear-gradient(180deg,#f8fbff,#e3edfd);border-radius:999px;
  padding:3px 14px 3px 11px;font-size:12px;font-weight:700;line-height:1.5;cursor:pointer;
  font-family:inherit;color:#2a5bbd;flex:none;box-shadow:0 1px 2px rgba(47,95,191,.16)}
.rb-ed-fold:hover{border-color:var(--primary);background:#dfebff;color:var(--primary);box-shadow:0 2px 5px rgba(47,95,191,.22)}
.rb-ed-fold:active{transform:translateY(1px)}
.rb-ed-fold:focus-visible{outline:2px solid var(--primary);outline-offset:1px}
.rb-ed-fold .rb-ed-fold-i{font-size:10px;line-height:1}
.rb-ed-card.is-fold .rb-ed-fold{border-color:#d3dbe6;background:#f4f6f9;color:#5a6b82;box-shadow:none}
.rb-ed-card.is-fold .rb-ed-fold:hover{border-color:var(--primary);background:#eaf1ff;color:var(--primary)}
/* 折叠态：整条标题行可点（点击区从 ~60px 放大到整行） */
.rb-ed-card.is-fold .rb-ed-head{cursor:pointer}
.rb-ed-card.is-fold .rb-ed-sum{background:#f7f9fc;border:1px dashed #dfe5ee;color:#3d4a5c;margin-bottom:0}

/* ---------- V59 需求 8：总结行只剩「折叠态摘要」与「其他内容提示」两种用途 ---------- */
.rb-ed-sum-hint{color:#8a94a3}

/* ---------- 需求 2：版式（骨架轴，与配色模板自由组合） ---------- */
.rb-layouts{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:7px;margin-bottom:12px;flex:none}
.rb-layout{border:1px solid var(--line);background:#fff;border-radius:9px;padding:6px;cursor:pointer;text-align:left}
.rb-layout.active{border-color:var(--primary);box-shadow:0 0 0 2px rgba(55,105,210,.08)}
.rb-layout b{display:block;font-size:10.5px;margin-top:5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-layout span{display:block;font-size:9.5px;color:var(--muted);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-lo-thumb{display:block;height:44px;border:1px solid #e8ebef;border-radius:5px;background:#fff;overflow:hidden;padding:6px}
.rb-lo-thumb i{display:block;height:3px;background:#cfd8e4;margin:3px 0;border-radius:3px}
.rb-lo-thumb i.hd{height:5px;width:44%;background:#8c9bb0;margin-bottom:5px}
/* V60 需求 2：「主题配色」/「版式」两块的标题行从一行死字改成**可点按钮**（各自可收起）
   V61 需求 6：大哥说「收起来的按钮不明显」⇒ 从「一行透明小字」改成**看得见的按钮**：
   有边框、有浅底、hover 有反馈，箭头做成一个圆形小徽标（收起 ▸ / 展开 ▾）。 */
.rb-sec-toggle{display:flex;align-items:center;gap:8px;width:100%;appearance:none;
  border:1px solid var(--line);background:#f5f8fc;padding:8px 11px;margin:0 0 8px;cursor:pointer;
  font-family:inherit;border-radius:9px;text-align:left;box-sizing:border-box;
  transition:background .15s ease,border-color .15s ease,box-shadow .15s ease}
.rb-sec-toggle:hover{border-color:#a9bcd8;background:#eaf1fb;box-shadow:0 1px 3px rgba(23,35,58,.06)}
.rb-sec-toggle:active{transform:translateY(1px)}
.rb-sec-toggle:hover .rb-sec-name{color:var(--primary)}
.rb-sec-toggle .rb-caret{flex:none;width:20px;height:20px;border-radius:50%;background:#fff;
  border:1px solid #cfdaea;display:grid;place-items:center;font-size:10px;line-height:1;
  color:var(--primary);font-weight:700;font-style:normal;margin:0}
.rb-sec-name{font-size:12.5px;color:var(--ink);font-weight:700;flex:none}
.rb-sec-sum{font-size:11.5px;color:var(--primary);font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:auto}
/* ⚠️ display:block 会压掉 hidden 的 display:none ⇒ 必须补这一条（V59 踩过同一个坑） */
.rb-sec-body{display:block;flex:none}
.rb-sec-body[hidden]{display:none!important}

/* ① 细线分隔 —— 板块之间一根横线（大哥点名的就是这个） */
.rb-layout-line .r-sec+.r-sec{border-top:1px solid #dfe5ee;padding-top:calc(var(--rb-gap,14px) + 6px)}
.rb-layout-line .r-sec-title{border-bottom:1px solid #edf0f5;padding-bottom:5px}
/* ② 左侧色条 —— 沿用模板主色（currentColor），换配色时色条自动跟着变 */
.rb-layout-bar .r-sec-title{border-left:4px solid currentColor;padding-left:9px;border-bottom:0}
/* ③ 通栏色块 —— 标题整条底色 */
.rb-layout-band .r-sec-title{background:#eef3fa;padding:5px 10px;border-radius:4px;border-bottom:0}
/* ④ 卡片分块 —— 每段经历一张描边卡片 */
.rb-layout-card .r-sec-title{background:#f4f7fb;padding:5px 10px;border-radius:4px 4px 0 0;border-bottom:0;margin-bottom:8px}
.rb-layout-card .r-item{background:#fafbfd;border:1px solid #e6ebf3;border-radius:8px;padding:9px 12px}
/* ⑤ 时间轴 —— 左侧竖线 + 圆点 */
.rb-layout-timeline .r-item{position:relative;border-left:2px solid #dbe3ee;padding-left:16px;margin-left:3px}
.rb-layout-timeline .r-item::before{content:"";position:absolute;left:-5px;top:6px;width:8px;height:8px;
  border-radius:50%;background:#fff;border:2px solid #9fb4d4}
/* ⚠️ 必须给每个子元素**钉死 grid-column:1**：只写 grid-template-columns:1fr 的话，
   自动布局会为第 2、3 个子元素**生成隐式列** ⇒ 三段仍横排（实测 role 左移 338px、time 左移 633px）。 */
.rb-layout-timeline .r-item-head{grid-template-columns:1fr;gap:1px}
/* ⚠️ 必须写到 .rb-page.rb-layout-timeline（=3 类）：基础规则是 `.rb-page .r-item-head>.r-org`
   （也是 3 类），只写 2 类会被它压住 ⇒ justify-self 仍是 center/end，三段虽然同列却仍横向错开。 */
.rb-page.rb-layout-timeline .r-item-head>*{grid-column:1;justify-self:start;text-align:left}

/* ═══ V78-START ═══
   V78 · 2026-10-06
   需求 1  新增「校招专业版」模板（配色在模板区，见 .rb-template-campuspro）
   需求 2  板块标题图标（内置内联 SVG，颜色跟随标题 currentColor）
   需求 3  基本信息「字段级自由排版」（列数 0/1/2/3）
   ══════════════════ */

/* ---------- 需求 2：板块标题前的图标 ---------- */
/* 图标插在 .r-sec-title **内部**、作为 inline-flex 参与行内布局 ——
   这样任何版式（色条 / 色块 / 卡片 / 时间轴）与标题对齐（rtAlignOf 的 text-align）都不用改。 */
.rb-page .r-sec-title .r-sec-ico{display:inline-flex;vertical-align:-2px;margin-right:6px;color:currentColor}
.rb-page .r-sec-title .r-sec-ico svg{display:block}

/* ---------- 需求 3：基本信息网格 ---------- */
/* ⚠️ 只在 .r-basic-grid 上生效；cols=0（经典一行）时这块 DOM 根本不渲染 ⇒ 老简历零影响。 */
.rb-page .r-basic-grid{display:grid;gap:4px 18px;margin-top:7px}
.rb-page .r-basic-grid.c1{grid-template-columns:1fr}
.rb-page .r-basic-grid.c2{grid-template-columns:1fr 1fr}
.rb-page .r-basic-grid.c3{grid-template-columns:1fr 1fr 1fr}
.rb-page .r-basic-grid .r-bf{display:flex;align-items:center;gap:5px;min-width:0;font-size:11.5px;color:#3a4657}
.rb-page .r-basic-grid .r-bf-full{grid-column:1/-1;align-items:flex-start}
.rb-page .r-basic-grid .r-bf-ico{display:inline-flex;flex:none;color:#5b7ba0}
.rb-page .r-basic-grid .r-bf-ico svg{display:block}
.rb-page .r-basic-grid .r-bf-k{flex:none;font-weight:700;color:#26313f}
.rb-page .r-basic-grid .r-bf-v{min-width:0;white-space:pre-line}

/* ---------- 两块面板（左侧编辑器已有的 .rb-ico / .rb-eye / .btn-ghost 直接复用） ---------- */
.rb-icon-panel,.rb-basic-panel{font-size:12px}
.rb-ic-sw{display:flex;align-items:center;gap:6px;margin-bottom:9px;color:#3d4a5c;cursor:pointer}
.rb-ic-secs{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:9px}
.rb-ic-chip{border:1px solid var(--line);background:#fff;border-radius:999px;padding:3px 10px;font-size:11.5px;cursor:pointer;font-family:inherit;color:#44546a}
.rb-ic-chip:hover{border-color:#a9bcd8;color:var(--primary)}
.rb-ic-chip.on{border-color:var(--primary);background:#eaf1ff;color:var(--primary);font-weight:700}
.rb-ic-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:6px}
.rb-ic-opt{height:34px;display:grid;place-items:center;border:1px solid var(--line);background:#fff;border-radius:8px;cursor:pointer;font-family:inherit;color:#44546a}
.rb-ic-opt:hover{border-color:#a9bcd8;color:var(--primary)}
.rb-ic-opt.on{border-color:var(--primary);background:#eaf1ff;color:var(--primary);box-shadow:0 0 0 2px rgba(55,105,210,.1)}
.rb-ic-none{font-size:11px;color:#8a94a3}
.rb-ic-note{margin-top:9px;font-size:11.5px;line-height:1.7;color:var(--muted)}
.rb-bl-cols{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:9px}
.rb-bl-col{border:1px solid var(--line);background:#fff;border-radius:8px;padding:5px 12px;font-size:11.5px;cursor:pointer;font-family:inherit;color:#44546a}
.rb-bl-col:hover{border-color:#a9bcd8;color:var(--primary)}
.rb-bl-col.on{border-color:var(--primary);background:#eaf1ff;color:var(--primary);font-weight:700}
.rb-bl-list{border:1px solid var(--line);border-radius:9px;overflow:hidden;margin-bottom:9px}
.rb-bl-row{display:flex;align-items:center;gap:6px;padding:6px 9px;border-bottom:1px solid var(--line);background:#fff}
.rb-bl-row:last-child{border-bottom:0}
.rb-bl-row.off{background:#fafafa}
.rb-bl-row.off .rb-bl-nm{opacity:.5;text-decoration:line-through}
.rb-bl-nm{flex:1;min-width:0;font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-bl-tools{display:flex;gap:4px;flex:none}
.rb-bl-tools .rb-ico[disabled]{opacity:.35;cursor:default}
.rb-bl-add{display:grid;grid-template-columns:1fr 1fr auto;gap:6px;margin-bottom:9px}
.rb-bl-add input{border:1px solid var(--line);border-radius:8px;padding:6px 8px;font-size:11.5px;font-family:inherit;min-width:0;box-sizing:border-box}
.rb-bl-del{display:flex;flex-wrap:wrap;gap:6px}
@media(max-width:640px){.rb-bl-add{grid-template-columns:1fr 1fr}.rb-bl-add .btn-ghost{grid-column:1/-1}}

/* ═══ V80-START ═══
   V80 · 2026-10-06
   需求 2  板块并排（双栏）—— 相邻的「左 + 右」两个板块并成一排
   需求 4  板块标题图标「实心方块」样式
   ⛔ 需求 3 页脚寄语：大哥 17:57 明确「这个不要了，不用做这个能力」⇒ 没有 .r-footnote
   ══════════════════ */

/* ---------- 需求 4：图标「实心方块」 ---------- */
/* ⚠️ 千万**不能**在 .solid 上写 color:#fff —— currentColor 会跟着变成白，
      底色也就跟着白了（白底白图 = 图标消失）。正确做法：底色吃继承来的主色，
      只把 <svg> 的描边强制成白（CSS 的 stroke 会盖过 SVG 的 stroke="currentColor" 属性）。 */
.rb-page .r-sec-title .r-sec-ico.solid{
  width:18px;height:18px;box-sizing:border-box;border-radius:5px;padding:2px;
  align-items:center;justify-content:center;vertical-align:-4px;margin-right:7px;
  background:currentColor}
.rb-page .r-sec-title .r-sec-ico.solid svg{stroke:#fff}

/* ---------- 需求 2：板块并排（双栏） ---------- */
/* 两栏等宽；min-width:0 让长英文/长链接能正常换行而不是把整行撑破。 */
.rb-page .r-sec-row{display:flex;align-items:flex-start;gap:18px}
.rb-page .r-sec-row>.r-sec{flex:1 1 0;min-width:0}
/* 并排的两栏要对齐**顶部**：第一条板块的上边距归零，第二条本来就靠 gap 起，
   否则两栏会因为各自的 margin-top 错开。 */
.rb-page .r-sec-row>.r-sec:first-child{margin-top:0}

/* ---------- 面板：图标样式切换（左侧编辑器，不是纸上） ---------- */
.rb-ic-style{display:flex;align-items:center;gap:6px;margin-bottom:9px}
.rb-ic-style-nm{font-size:11.5px;color:#8a94a3}
.rb-ic-sb{border:1px solid var(--line);background:#fff;border-radius:8px;padding:3px 10px;font-size:11.5px;cursor:pointer;font-family:inherit;color:#44546a}
.rb-ic-sb:hover{border-color:#a9bcd8;color:var(--primary)}
.rb-ic-sb.on{border-color:var(--primary);background:#eaf1ff;color:var(--primary);font-weight:700}
/* 图标格里的小样也按当前样式画（所见即所得） */
.rb-ic-face{display:inline-flex;align-items:center;justify-content:center;color:#44546a}
.rb-ic-face.solid{width:18px;height:18px;border-radius:5px;background:currentColor}
.rb-ic-face.solid svg{stroke:#fff}

/* ---------- 面板：板块并排 ---------- */
.rb-lp-list{border:1px solid var(--line);border-radius:9px;overflow:hidden;margin-bottom:9px}
.rb-lp-row{display:flex;align-items:center;gap:6px;padding:6px 9px;border-bottom:1px solid var(--line);background:#fff}
.rb-lp-row:last-child{border-bottom:0}
.rb-lp-nm{flex:1;min-width:0;font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-lp-seg{display:flex;flex:none;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.rb-lp-seg button{border:0;background:#fff;padding:3px 9px;font-size:11px;cursor:pointer;font-family:inherit;color:#44546a;border-left:1px solid var(--line)}
.rb-lp-seg button:first-child{border-left:0}
.rb-lp-seg button:hover{color:var(--primary)}
.rb-lp-seg button.on{background:#eaf1ff;color:var(--primary);font-weight:700}
.rb-lp-preset{margin-bottom:9px}
@media(max-width:640px){
  /* 窄屏上两栏容易挤成豆腐块 ⇒ 并排自动拆成上下两段（与纸宽无关，只看预览宽度） */
  .rb-page .r-sec-row{display:block}
  .rb-page .r-sec-row>.r-sec{margin-top:0}
}

/* ═══ V80b-START ═══
   V80 收尾修复（2026-10-06 · 真 Chrome 探针实测逼出来的两处）
   ══════════════════ */

/* ---------- ① 并排两栏的垂直间距 ---------- */
/* .r-sec 自带 margin-top:var(--rb-gap)（见上方 .rb-page .r-sec 规则）——
   只归零 :first-child 会让**右栏比左栏低一份 gap**（实测 14px）。
   行内所有子板块一律归零，这一份间距由 .r-sec-row 自己承担。 */
.rb-page .r-sec-row{margin-top:var(--rb-gap,14px)}
.rb-page .r-sec-row>.r-sec{margin-top:0}
/* 「细线分隔」版式会给 .r-sec+.r-sec 画 border-top + padding-top；
   并排的右栏并不在左栏「下方」⇒ 行内要中和掉，否则右栏顶部多一条横线。 */
.rb-page .r-sec-row>.r-sec+.r-sec{border-top:0;padding-top:0}

/* ---------- ② 预览不能被样式面板挤扁 ---------- */
/* .rb-style-body 原来是 flex:none（不缩、也不滚）⇒ 它一长，flex:1 的预览就被压到 0 附近。
   改成可缩 + 自己滚，并给预览一个下限：两块各滚各的，谁也别挤谁。 */
@media(min-width:901px){
  .rb-style-body{flex:0 1 auto;min-height:0;overflow:auto}
  .rb-preview-scroll{min-height:420px}
}

/* ═══ V58R-START ═══
   V58 · 2026-09-29（在 jobai-resume/ 工作副本上做，未发布）
   需求 4  超一页：纸张定高成 A4 整数倍 + 分页线 + 每页水印；导出按 A4 切片（不再截断）
   ══════════════════ */
/* 分页线层：盖在纸上，不参与排版、不吃鼠标事件 ⇒ 不会被拍进导出图 */
.rb-pg-breaks{position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;z-index:4}
.rb-pg-break{position:absolute;left:0;right:0;height:0;pointer-events:none}
.rb-pg-break i{position:absolute;top:0;height:0;width:38px;border-top:2px dashed #a9b8cf}
.rb-pg-break i.l{left:5px}.rb-pg-break i.r{right:5px}
.rb-pg-break span{position:absolute;left:100%;margin-left:9px;top:-10px;background:#3b5bdb;color:#fff;
  font-size:9.5px;font-weight:700;padding:2px 8px;border-radius:999px;letter-spacing:.2px;white-space:nowrap}
/* 预览工具条里的页数（超一页时变橙，提醒用户精简） */
.rb-pagecount{font-size:11.5px;font-weight:700;color:#6b7280}
.rb-pagecount.warn{color:#c2571a}
/* —— 需求 2/6：右侧简历可编辑 + 浮动格式工具条 —— */
.rb-rt-hint{font-size:11.5px;color:#3f5372;background:#eef3fd;border:1px solid #d6e2f8;border-radius:8px;
  padding:7px 10px;margin-bottom:9px;line-height:1.6;flex:none}
.rb-page [data-rt]{outline:none;border-radius:3px;transition:background .12s}
.rb-page [data-rt]:hover{background:rgba(59,91,219,.06)}
.rb-page [data-rt]:focus{background:rgba(59,91,219,.1)}
.r-rt-i{font-style:italic}
.rb-rtbar{position:fixed;z-index:300;display:flex;align-items:center;gap:2px;background:#1f2937;
  border-radius:9px;padding:4px 5px;box-shadow:0 10px 26px rgba(15,23,42,.34)}
.rb-rtbar button{appearance:none;border:0;background:transparent;color:#e8edf7;min-width:26px;height:26px;
  border-radius:6px;font-size:12px;font-weight:800;cursor:pointer;font-family:inherit;padding:0 5px}
.rb-rtbar button:hover{background:rgba(255,255,255,.16)}
.rb-rtbar button.on{background:#3b5bdb;color:#fff}
.rb-rtbar .rb-rt-it{font-style:italic}
.rb-rtbar .rb-rt-c{font-weight:800}
.rb-rtbar .rb-rt-c.r-c1{color:#ff7b7b}.rb-rtbar .rb-rt-c.r-c2{color:#8cbcff}.rb-rtbar .rb-rt-c.r-c3{color:#dfe6f2}
.rb-rtbar .rb-rt-sp{width:1px;height:15px;background:rgba(255,255,255,.22);margin:0 3px}
/* —— 需求 8：右侧聚焦时闪一下（⚠️ 只用 background，绝不碰 transform）—— */
.rb-sec-flash{animation:rbSecFlash 1.45s ease}
@keyframes rbSecFlash{0%{background:rgba(59,91,219,.17)}70%{background:rgba(59,91,219,.08)}100%{background:transparent}}
/* —— 需求 10：小结（tag 加粗 + 冒号 + 正文）—— */
.rb-page .r-sumtag{font-weight:800;color:#1f2b3a}
/* —— 需求 12：底部 toast + 历史记录列表 —— */
.rb-toast{position:fixed;left:50%;bottom:34px;transform:translate(-50%,14px);z-index:400;
  background:#111827;color:#f3f6fc;font-size:13px;font-weight:600;line-height:1.5;
  padding:11px 18px;border-radius:11px;box-shadow:0 14px 34px rgba(15,23,42,.34);
  max-width:min(88vw,540px);opacity:0;transition:opacity .22s ease,transform .22s ease;pointer-events:none}
.rb-toast.show{opacity:1;transform:translate(-50%,0)}
.rb-history{margin-top:18px;padding-top:16px;border-top:1px dashed var(--line)}
.rb-history-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:9px}
.rb-history-hd b{font-size:13px}.rb-history-meta{font-size:11.5px;color:var(--muted)}
.rb-history-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px}
/* V61 需求 2：每条保存的简历从「整块可点的一个按钮」改成**卡片 + 两个明确按钮**
   （查看 / 修改）—— 大哥要的就是「在上传简历这个部分有个查看/修改的按钮入口」。 */
.rb-hist-item{display:flex;flex-direction:column;gap:4px;align-items:stretch;text-align:left;
  border:1px solid var(--line);background:#fff;border-radius:10px;padding:10px 12px;font-family:inherit}
.rb-hist-item:hover{border-color:#b9c7dc}
.rb-hist-item b{font-size:12.5px;color:var(--ink);word-break:break-all;line-height:1.45}
.rb-hist-item span{font-size:11px;color:var(--muted)}

/* ══════════════════ V61 新增 ══════════════════ */
/* V61-1：左上「上传新简历」卡 = 唯一入口，整张卡同时是拖拽投放区 */
.rb-drop-tip{font-size:11px;color:var(--muted);font-style:normal;margin-top:1px}
.rb-source.dragover{border-color:var(--primary)!important;background:var(--soft)!important;
  box-shadow:0 0 0 2px rgba(55,105,210,.14)!important}
/* V61-2：卡片上的「已保存」页脚提示 */
.rb-hist-foot{font-size:11px;color:var(--muted);margin:9px 0 0}
/* V61-3：游客态 —— 顶部拦截条 + 被锁住的两个入口卡 */
.rb-guest-note{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap;
  border:1px solid #c3d6fb;background:#f4f8ff;border-radius:11px;padding:13px 15px;margin:0 0 14px}
.rb-guest-note .rb-guest-txt{min-width:0}
.rb-guest-note b{font-size:13.5px;color:#204d9c;display:block;margin-bottom:2px}
.rb-guest-note span{font-size:12.5px;color:#3d4a5c;line-height:1.6}
.rb-guest-note .btn-primary.sm{flex:none}
.rb-source.is-locked{opacity:.6}
/* V61-4：手机端「去电脑端操作更方便」提示 */
.rb-mobile-note{display:flex;flex-direction:column;gap:4px;border:1px solid #ffd79a;background:#fff8ec;
  border-radius:10px;padding:11px 13px;margin:0 0 12px}
.rb-mobile-note b{font-size:12.5px;color:#8a4b00}
.rb-mobile-note span{font-size:12px;color:#8a4b00;line-height:1.6;opacity:.92}
/* 手机端：手机上把两个入口卡竖排时，提示条要能占满宽 */
@media (max-width:760px){ .rb-guest-note{flex-direction:column;align-items:stretch} .rb-guest-note .btn-primary.sm{align-self:flex-start} }
/* V61-2：「查看」= 只读态 —— 工作页顶部一条提示条 + 左侧编辑器整体禁用（右边预览照常看） */
.rb-ro-bar{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap;
  border:1px solid #c3d6fb;background:#f4f8ff;border-radius:11px;padding:12px 15px;margin:0 0 14px}
/* ⚠️ 同一个坑第三次踩：上面 display:flex 会压掉 hidden 的 display:none ⇒ 必须补这一条 */
.rb-ro-bar[hidden]{display:none!important}
.rb-ro-txt{min-width:0}
.rb-ro-txt b{font-size:13.5px;color:#204d9c;display:block;margin-bottom:2px}
.rb-ro-txt span{font-size:12.5px;color:#3d4a5c;line-height:1.6}
.rb-readonly .rb-side{pointer-events:none;opacity:.6}
.rb-readonly .rb-target-bar{pointer-events:none;opacity:.6}
@media (max-width:760px){ .rb-ro-bar{flex-direction:column;align-items:stretch} }

.rb-hist-acts{display:flex;gap:6px;margin-top:5px}
.rb-hist-acts .btn-ghost.sm,.rb-hist-acts .btn-primary.sm{flex:1 1 0;justify-content:center;min-height:28px;padding:0 8px}

/* V61-1 收尾：左上「上传新简历」卡现在是**唯一的**上传入口，而且要能整张卡接受拖拽
   ⇒ 必须要手型和 hover 反馈（文件前面那段 `.rb-source{cursor:default}` 是 V53 的旧覆盖，
     因为它在本文件更靠后，所以这条只能追加到文件末尾才压得过它）。 */
.rb-source#rbUploadCard{cursor:pointer}
.rb-source#rbUploadCard:hover{border-color:#a9bcd8;background:#fbfdff}
.rb-source#rbUploadCard.is-locked{cursor:default}
.rb-source#rbUploadCard.is-locked:hover{border-color:var(--line);background:#fff}

/* V61 收尾（同一坑第 4 次）：`.rb-guest-note` / `.rb-mobile-note` 都写了 display:flex，
   会把 UA 的 `[hidden]{display:none}` 压掉（author origin > user-agent origin，与特异性无关）
   ⇒ 这两个元素上的 hidden 属性失效。各补一条！ */
.rb-guest-note[hidden]{display:none!important}
.rb-mobile-note[hidden]{display:none!important}

/* ══════════ V84-START：右栏「对齐」对**容器型**块生效 ══════════
   .r-item-head 是 grid（三格：单位 / 岗位 / 时间）、.r-bf 是 flex（图标 + 标签 + 值），
   光给容器 text-align 是**挪不动子项**的 ⇒ 按 data-ta 派生 justify-self / justify-content。
   ⚠️ 必须留在 app.css **最后**：与既有的
      .rb-page.rb-layout-timeline .r-item-head > * （justify-self:start / text-align:left）
      特异性相同（3 个类选择器 + 元素），只能靠源码顺序取胜。 */
.rb-page .r-item-head[data-ta="center"]>*{justify-self:center;text-align:center}
.rb-page .r-item-head[data-ta="right"]>*{justify-self:end;text-align:right}
.rb-page .r-item-head[data-ta="left"]>*{justify-self:start;text-align:left}
.rb-page .r-basic-grid .r-bf[data-ta="center"]{justify-content:center}
.rb-page .r-basic-grid .r-bf[data-ta="right"]{justify-content:flex-end}
.rb-page .r-basic-grid .r-bf[data-ta="left"]{justify-content:flex-start}
/* ══════════ V84-END ══════════ */

/* ══════════ V90（大哥 2026-10-08 需求 2）：「编辑器和简历展示区，分别可以向左 向右收起来」══════════
   纯视图状态：左侧编辑器 ⇤ 向左收起（宽度让给简历），右侧简历展示区 ⇥ 向右收起（宽度让给编辑器）。
   收起后各自的「展开」入口留在**对面面板**里（.rb-expand-side / .rb-expand-prev）
   ⇒ 不需要绝对定位浮层，也不新增行高。
   ⚠️ 只在 >1100px（两列布局）生效：≤1100px 本来就是上下堆叠，收起没意义；
      窄屏下哪怕残留 is-* 类也不会出事（下面的 max-width 块把 4 个开关全隐掉，上面的规则根本不匹配）。
   ⚠️ 本块必须留在文件最末尾 —— 与 L3335 的 .rb-editor-layout 同特异性时为「后出现者胜」。 */
@media(min-width:1101px){
  /* —— 两个栏位**钉死在各自的列**上 ——
     ⚠️ 必须显式定位：收起用的是 display:none，被摘掉的那个 grid item 会从 grid 里消失，
        剩下那个会**自动落到第 1 列**；左收起时第 1 列宽恰好是 0
        ⇒ 简历展示区被挤成一条 40px 竖线（V90 首轮真 Chrome 探针实测 906px → 40px）。
     ⚠️ 这条只写在 >1100px 块里：窄屏是单列，钉 grid-column:2 会造出隐式第二列把布局搞坏。 */
  .rb-editor-layout>.rb-side{grid-column:1}
  .rb-editor-layout>.rb-preview-wrap{grid-column:2}
  /* —— 左：编辑器向左收起 —— */
  .rb-editor-layout.rb-l-collapsed{grid-template-columns:0 minmax(0,1fr);gap:0}
  .rb-editor-layout.rb-l-collapsed>.rb-side{display:none}
  /* —— 右：简历展示区向右收起 —— */
  .rb-editor-layout.rb-r-collapsed{grid-template-columns:minmax(0,1fr) 0;gap:0}
  .rb-editor-layout.rb-r-collapsed>.rb-preview-wrap{display:none}
  /* —— 4 个开关：默认只露「收起」，收起后才露对面的「展开」 —— */
  .rb-expand-side,.rb-expand-prev{display:none}
  .rb-editor-layout.rb-l-collapsed .rb-expand-side{display:inline-flex}
  .rb-editor-layout.rb-r-collapsed .rb-expand-prev{display:inline-flex}
  /* 编辑器头部从小标题 + 1 个按钮变成 + 3 个按钮，给它们一组自己的排布 */
  .rb-side-head-btns{display:flex;align-items:center;gap:8px;flex:none}
  /* 工具栏那个「简历样式」左侧多出「‹ 编辑器」时，靠 margin-right:auto 保证
     平时（2 项）= 与现状完全一致；收起态（3 项）= 前两个靠左、页码/排版/收起仍靠右。 */
  .rb-preview-toolbar>.rb-style-toggle{margin-right:auto}
}
@media(max-width:1100px){
  .rb-collapse-side,.rb-expand-side,.rb-collapse-prev,.rb-expand-prev{display:none!important}
}
/* ══════════ V90-END ══════════ */

/* ══════════ V91（大哥 2026-10-08 反馈）：「两侧都收起后回不来了」══════════
   背景：V90 的两个「展开」入口各自住在**对面面板里** ⇒ 两边同时收起时，
        两个入口随各自面板一起 display:none，整页空白，且 __paneL/__paneR 已落盘被 load() 还原
        ⇒ 刷新也回不来（真死锁）。
   修法：在 .rb-editor-layout 内、两个面板**之外**放一个独立出口 .rb-pane-rescue，
        只在「两侧同时收起」时浮出；position:absolute ⇒ 脱离 grid，不占列、不改平时布局。
   ⚠️ 双收起时两个面板都 display:none ⇒ 容器高度会塌成 0，所以必须给 min-height，
      否则绝对定位的出口没有可落脚的盒子（浮层会被 0 高容器带跑）。
   ⚠️ 只写在 >1100px：≤1100px 是单列堆叠、收起规则本就不生效，两栏都可见、无需出口。
   ⚠️ 本块必须留在文件最末尾（与 L3335 的 .rb-editor-layout 同特异性时「后出现者胜」）。 */
.rb-pane-rescue{display:none}
@media(min-width:1101px){
  .rb-editor-layout{position:relative}
  .rb-editor-layout.rb-l-collapsed.rb-r-collapsed{min-height:104px}
  .rb-editor-layout.rb-l-collapsed.rb-r-collapsed>.rb-pane-rescue{
    display:flex;position:absolute;left:50%;top:18px;transform:translateX(-50%);
    align-items:center;gap:8px;z-index:6;
  }
}
/* ══════════ V91-END ══════════ */
/* ══════════ V92（大哥 2026-10-09 反馈「icon 与小标题没对齐」）══════════ */
/* 根因：.r-sec-ico 是 inline-flex，Chrome 拿**内部 svg 的底边**当它的基线（svg 是 replaced
   element，基线 = margin-box 底边）。svg 固定 13x13；实心方块 18x18 + padding:2px + 居中
   ⇒ svg 底边比方块底边高 2.5px ⇒ 原 -4px 摆的是 svg 底边，方块整块被多压 2.5px：
   方块中心只到基线上方 2.50px，而 14px 汉字墨迹中心在 5.061px（canvas actualBoundingBox 实测）
   ⇒ 视觉偏下 2.56px（非实心款 -2px 也偏 0.56px，两种样式彼此还不一致）。
   修法：让图标盒中心落在汉字墨迹中心 ⇒ 方块中心 5.061 ⇒ 方块底边基线下 3.939 ⇒ svg 底边
   基线下 1.439 ⇒ vertical-align 取 -1.44px（非实心款盒高 13，推导后同为 -1.44px）。
   ⚠️ 13px 字号（.rb-template-simple）最优 -1.80px，与 -1.44px 只差 0.36px（亚像素，肉眼不可见）；
      将来若新增明显更大/更小字号的模板，按 V = 6.5 - 0.3616 x 字号(px) 复核。 */
.rb-page .r-sec-title .r-sec-ico{vertical-align:-1.44px}
.rb-page .r-sec-title .r-sec-ico.solid{vertical-align:-1.44px}
/* ══════════ V92-END ══════════ */

/* ══════════ V101 · 校招信息库「AI筛选企业」（原标 V100，与并发会话撞名，此处正名） ══════════
   定位：**校招库内部功能** —— 不加全站一级导航、不加移动底栏、不跳独立页。
   结构：入口卡（搜索下 / 工具栏上）→ 配置抽屉（桌面右侧 / 手机全屏）
        → 同一列表区切到「AI推荐」看报告。
   沿用品牌色 var(--cp1) / var(--cp2) 与既有圆角（--cp-r）、字体。 */

/* ---------- 入口卡 ---------- */
.cai-entry{margin-top:12px}
.cai-card{
  display:flex;flex-direction:column;gap:8px;
  padding:15px 17px;border-radius:var(--cp-r);
  background:linear-gradient(110deg,#f2f4ff,#f5f1ff 68%,#fdf1f7);
  border:1px solid #dcdefb;
}
.cai-card.is-running{background:linear-gradient(110deg,#f4f5ff,#f2f6ff);}
.cai-card.is-ready{padding:13px 16px}
.cai-h{display:flex;align-items:center;gap:10px}
.cai-ic{
  flex:none;width:34px;height:34px;border-radius:11px;display:grid;place-items:center;
  background:linear-gradient(135deg,var(--cp1),var(--cp2));color:#fff;
  box-shadow:0 6px 15px rgba(91,87,245,.28);
}
.cai-ic .ic{width:17px;height:17px}
.cai-ht b{font-size:15px;font-weight:800;color:var(--cp-ink);letter-spacing:-.2px}
.cai-d{margin:0;font-size:13px;color:#5c6480;line-height:1.65}
.cai-d b{color:var(--cp-ink);font-weight:800}
.cai-n{margin:0;font-size:12.2px;color:#7b83a0;line-height:1.6}
.cai-n.warn{color:#b45309;font-weight:700}
.cai-warn{color:#c0392b;font-weight:700}
.cai-ok{margin:6px 0 0;font-size:12.2px;color:#15803d;line-height:1.6}
/* V106-P2 · 即时改善：偏好维度全空时的提示条（条件触发 —— 不全空时不渲染） */
.cai-phint{margin:10px 0;padding:10px 12px;border:1px solid #f0d9a8;border-radius:8px;background:#fffaf0}
.cai-phint>b{display:block;margin-bottom:4px;font-size:13px;color:#b45309}
.cai-phint>p{margin:0 0 7px;font-size:12.2px;color:#6b6252;line-height:1.62}
.cai-phint>p.cai-n{margin-bottom:9px}
.cai-acts{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:2px}

/* ---------- 工具条：模式切换 + 社群文字按钮 ---------- */
.cai-mode{display:inline-flex;background:var(--cp-soft2);border:1px solid var(--cp-line);border-radius:9px;padding:2px;flex:none}
.cai-mode button{
  border:0;background:none;cursor:pointer;font-family:inherit;
  font-size:12.6px;font-weight:800;color:var(--cp-mut);padding:6px 14px;border-radius:7px;transition:.14s;
}
.cai-mode button.on{background:#fff;color:var(--cp1);box-shadow:0 1px 3px rgba(30,40,80,.1)}
.cai-groupbtn{
  display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-family:inherit;
  font-size:12.4px;font-weight:700;color:#5b57f5;background:#fff;
  border:1px solid #dcdefb;border-radius:99px;padding:6px 12px;transition:.14s;
}
.cai-groupbtn:hover{border-color:#c2c6f7;background:#f7f8ff}
.cai-groupbtn .ic{width:13px;height:13px}
.cai-groupbtn[hidden]{display:none}

/* ---------- AI推荐模式：把手动浏览那一套收起来 ---------- */
#v-campus.cai-mode .cai-entry,
#v-campus.cai-mode .cp-search,
#v-campus.cai-mode .cp-side,
#v-campus.cai-mode .cp-chips,
#v-campus.cai-mode #cpChipPanel,
#v-campus.cai-mode .cp-chosen,
#v-campus.cai-mode #cpPager,
#v-campus.cai-mode #cpPageSize{display:none!important}
#v-campus.cai-mode .cp-sel,
#v-campus.cai-mode .cp-views{display:none!important}

/* ---------- 配置面板：桌面右侧抽屉 / 手机全屏 ---------- */
.cai-modal{padding:0!important;align-items:stretch!important;justify-content:flex-end!important}
.cai-modal[hidden]{display:none}
.cai-panel{
  position:relative;width:min(520px,100%);max-width:520px!important;
  height:100%;max-height:100%!important;margin:0;border-radius:0!important;
  padding:22px 22px calc(22px + env(safe-area-inset-bottom,0px))!important;
  display:flex;flex-direction:column;overflow:hidden;
  animation:caiSlideIn .22s ease;
}
@keyframes caiSlideIn{from{transform:translateX(24px);opacity:.4}to{transform:none;opacity:1}}
.cai-panel-h1{flex:none;font-size:18px;outline:0}
.cai-body{flex:1;min-height:0;overflow:auto;margin-top:10px;padding-bottom:8px;-webkit-overflow-scrolling:touch}
.cai-body input,.cai-body select{font-size:16px}   /* ≥16px：iOS 聚焦不放大 */
body.cai-lock{overflow:hidden}

.cai-sec{padding:12px 0;border-bottom:1px solid #eceffa}
.cai-sec:last-child{border-bottom:0}
.cai-sec h4{margin:0 0 9px;font-size:13px;font-weight:800;color:var(--cp-ink)}
.cai-fld{display:flex;flex-direction:column;gap:5px;margin:0 0 10px}
.cai-fld>span{font-size:12px;font-weight:700;color:var(--cp-mut)}
.cai-fld input,.cai-fld select{
  width:100%;padding:9px 11px;font-family:inherit;font-size:13.4px;color:var(--cp-ink);
  border:1px solid var(--cp-line);border-radius:10px;background:#fff;
}
.cai-fld input:focus,.cai-fld select:focus{outline:0;border-color:#c3c8ff;box-shadow:0 0 0 3px rgba(91,87,245,.12)}
.cai-pic{display:grid;grid-template-columns:1fr 1fr;gap:8px 10px}
/* ══ V104：② 画像区改成「只读事实」+ 教育经历逐条（本科 / 硕士都列出来）══
   背景：原来那 4 个框是 data-pic 输入框，但值只写进 st.form.pic、**从没人读**
   ⇒ 改了不生效；且「学历 / 毕业时间」与 ③ 的「届别 / 学历门槛」视觉上重复。
   现在 ② 只展示、不编辑：教育经历从所选简历的 parsed.sections 里抽（可多条）。 */
.cai-ro{display:block;padding:9px 11px;font-size:13.4px;font-weight:600;color:var(--cp-ink);
  border:1px dashed var(--cp-line);border-radius:10px;background:#fafbff;min-height:38px;box-sizing:border-box}
.cai-ro i{font-style:normal;font-weight:500;color:var(--cp-mut)}
.cai-edu{display:flex;flex-direction:column;gap:8px}
.cai-edu-i{display:flex;flex-wrap:wrap;align-items:baseline;gap:3px 9px;padding:10px 12px;
  border:1px solid var(--cp-line);border-radius:10px;background:#fafbff}
.cai-edu-i>b{font-size:13.4px;color:var(--cp-ink)}
.cai-edu-i>span{font-size:12.4px;color:var(--cp-mut);font-variant-numeric:tabular-nums}
.cai-edu-i>em{flex-basis:100%;font-style:normal;font-size:12.4px;color:var(--cp-mut)}
.cai-grp{margin:10px 0}
.cai-grp>b{display:block;font-size:12px;font-weight:800;color:var(--cp-mut);margin-bottom:6px}
.cai-chips{display:flex;flex-wrap:wrap;gap:6px}
.cai-chip{
  cursor:pointer;font-family:inherit;font-size:12.2px;font-weight:700;color:var(--cp-mut);
  background:#fff;border:1px solid var(--cp-line);border-radius:99px;padding:6px 12px;transition:.13s;
}
/* V105：选中态要一眼看出来 —— 主色实底 + 白字 + 轻投影（原来只有底色，视觉太弱） */
.cai-chip.on{background:var(--cp1);border-color:var(--cp1);color:#fff;font-weight:800;box-shadow:0 3px 10px rgba(91,87,245,.3)}
.cai-chip:hover:not(.on){border-color:#c3c8ff;color:var(--cp1)}
/* V104：去掉「只显示前 12 份」的截断后，长列表改用滚动承载，底部操作不被挤走 */
.cai-radios{display:flex;flex-direction:column;gap:8px;max-height:min(46vh,340px);overflow:auto;overscroll-behavior:contain;padding-right:2px}
.cai-radio{
  flex:none;display:flex;align-items:flex-start;gap:9px;text-align:left;cursor:pointer;font-family:inherit;
  background:#fff;border:1px solid var(--cp-line);border-radius:12px;padding:11px 13px;transition:.13s;
}
/* V105：选中 = 主色边框 + 更明显的浅紫底 + 投影（原来 #f7f8ff 太淡，看着像没选中） */
.cai-radio.on{border-color:var(--cp1);background:#f4f5ff;box-shadow:0 2px 10px rgba(91,87,245,.12)}
.cai-radio:hover:not(.on){border-color:#c3c8ff;background:#fbfbff}
.cai-rb{
  flex:none;width:15px;height:15px;border-radius:50%;border:1.6px solid #c6cbe6;margin-top:2px;position:relative;
}
/* V105：大哥要「圆框里面勾上了」—— 圆点改成实心主色圈 + 白色对勾 */
.cai-radio.on .cai-rb{border-color:var(--cp1);background:var(--cp1)}
.cai-radio.on .cai-rb::after{
  content:'';position:absolute;left:4.4px;top:1.4px;width:4.2px;height:8px;
  border:solid #fff;border-width:0 1.8px 1.8px 0;border-radius:1px;transform:rotate(43deg);
}
.cai-rt{display:flex;flex-direction:column;gap:3px;min-width:0}
.cai-rt b{font-size:13.2px;font-weight:800;color:var(--cp-ink);word-break:break-all}
.cai-rt em{font-style:normal;font-size:11.8px;color:#7b83a0;line-height:1.5}
.cai-scope{display:flex;flex-direction:column;gap:8px}
.cai-more{margin-top:8px;padding-top:9px;border-top:1px dashed #e3e7f7}
.cai-sum ul{margin:0;padding-left:18px}
.cai-sum li{font-size:12.4px;color:#5c6480;margin:3px 0}
.cai-nav{position:sticky;bottom:0;padding-top:12px;margin-top:8px;background:linear-gradient(#fff0,#fff 22%)}
.cai-nav.two{display:grid;grid-template-columns:96px 1fr;gap:10px}
.cai-guest{display:flex;flex-direction:column;gap:12px;padding:16px 0}
.cai-guest p{margin:0;font-size:13px;color:#5c6480}

/* ---------- AI推荐：报告 ---------- */
.cai-sum2{
  border:1px solid #e3e6f7;border-radius:var(--cp-r);background:#fafbff;
  padding:13px 15px;margin-bottom:12px;
}
.cai-sum2-t{display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap}
.cai-sum2-t b{font-size:14px;font-weight:800;color:var(--cp-ink)}
.cai-sum2-t span{font-size:11.8px;font-weight:700;color:var(--cp1)}
.cai-sum2-l{margin:8px 0 0;padding-left:18px}
.cai-sum2-l li{font-size:12.2px;color:#5c6480;margin:2px 0}
.cai-sum2-a{margin-top:9px}
.cai-filter{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 11px}
.cai-filter>span{font-size:12px;color:var(--cp-mut);font-weight:700}
.cai-filter .cai-chip{padding:5px 10px;font-size:11.8px}

.cai-co{
  position:relative;border:1px solid var(--cp-line);border-radius:var(--cp-r);background:#fff;
  padding:14px 15px;margin-bottom:11px;
}
.cai-co-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;padding-right:74px}
.cai-co-h b{font-size:14px;font-weight:800;color:var(--cp-ink);word-break:break-all}
.cai-tag{
  flex:none;font-size:10.8px;font-weight:800;color:#5b57f5;background:#eef1ff;
  border-radius:99px;padding:2px 8px;
}
.cai-co-m{margin-top:5px;font-size:12px;color:#7b83a0;line-height:1.55;word-break:break-all}
.cai-co-pri{
  position:absolute;top:13px;right:14px;font-size:11.4px;font-weight:800;color:#fff;
  background:linear-gradient(135deg,var(--cp1),var(--cp2));border-radius:99px;padding:3px 10px;
}
.cai-why{margin:9px 0 0;padding-left:17px}
.cai-why li{font-size:12.4px;color:#4b5370;line-height:1.6;margin:2px 0}
.cai-gap{margin:8px 0 0;font-size:12.2px;color:#8a5a00;background:#fff8ec;border-radius:8px;padding:7px 10px;line-height:1.6}
.cai-src{margin:7px 0 0;font-size:11.6px;color:#9aa1ba}
.cai-co-a{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:11px}
.cai-co-a button,.cai-co-a a{
  cursor:pointer;font-family:inherit;font-size:12.2px;font-weight:800;border-radius:99px;
  padding:7px 13px;text-decoration:none;display:inline-block;
}
.cai-a1{color:var(--cp1);background:#fff;border:1px solid #cfd4f7}
.cai-a2{color:#5c6480;background:#f4f5fa;border:1px solid #e6e9f4}
.cai-a3{color:#fff;background:linear-gradient(135deg,var(--cp1),var(--cp2));border:0}
.cai-a3.off{background:#f1f2f7;color:#9aa1ba;font-weight:700}
.cai-detail{margin-top:10px;border-top:1px dashed #e3e7f7;padding-top:9px}
.cai-det p{margin:0 0 6px;font-size:12.2px;color:#4b5370;line-height:1.65}
.cai-det b{color:var(--cp-ink)}

.cai-pager{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:16px}
.cai-pager button{
  cursor:pointer;font-family:inherit;font-size:12.4px;font-weight:700;color:var(--cp-ink);
  background:#fff;border:1px solid var(--cp-line);border-radius:9px;padding:7px 14px;
}
.cai-pager button[disabled]{opacity:.45;cursor:default}
.cai-pager span{font-size:12.4px;color:var(--cp-mut);font-weight:700}

.cai-gate{
  display:flex;flex-direction:column;align-items:center;gap:9px;text-align:center;
  border:1px solid #e0e3f8;border-radius:var(--cp-r);background:linear-gradient(110deg,#f6f7ff,#faf6ff);
  padding:22px 18px;
}
.cai-gate b{font-size:14.4px;font-weight:800;color:var(--cp-ink)}
.cai-gate p{margin:0;font-size:12.6px;color:#5c6480;line-height:1.65;max-width:420px}
.cai-empty{
  display:flex;flex-direction:column;align-items:center;gap:7px;text-align:center;
  padding:30px 18px;border:1px dashed #dfe3f3;border-radius:var(--cp-r);background:#fbfcff;
}
.cai-empty b{font-size:14px;font-weight:800;color:var(--cp-ink)}
.cai-empty span{font-size:12.6px;color:#7b83a0;line-height:1.6;max-width:420px}

/* ══════════ V105 · AI筛选交互控件 ══════════ */
/* V105 · 问题 3：城市支持手动补充 */
.cai-grp-h{display:inline-block;margin-left:6px;font-style:normal;font-size:11.4px;font-weight:600;color:#9aa1ba}
.cai-add{display:flex;gap:6px;margin-top:7px}
.cai-add input{
  flex:1 1 auto;min-width:0;font-family:inherit;font-size:12.4px;color:var(--cp-ink);
  background:#fff;border:1px solid var(--cp-line);border-radius:9px;padding:8px 11px;transition:.13s;
}
.cai-add input::placeholder{color:#aab0c6}
.cai-add input:focus{outline:0;border-color:#b9c0f5;box-shadow:0 0 0 3px rgba(91,87,245,.12)}
.cai-add button{
  flex:none;cursor:pointer;font-family:inherit;font-size:12.4px;font-weight:800;color:var(--cp1);
  background:#eef0ff;border:1px solid #d5d9f7;border-radius:9px;padding:8px 14px;transition:.13s;
}
.cai-add button:hover{background:#e5e8ff;border-color:#c3c8ff}

/* V105 · 问题 7：结果页筛选 = 分段控件（只列真有企业的档位 + 真实条数） */
.cai-seg{
  display:flex;gap:5px;flex-wrap:wrap;margin:0 0 12px;padding:4px;
  background:#f3f4fb;border:1px solid #e6e8f5;border-radius:12px;
}
.cai-seg-b{
  flex:1 1 auto;min-width:0;cursor:pointer;font-family:inherit;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  font-size:12.4px;font-weight:700;color:#6b7391;background:transparent;border:0;
  border-radius:9px;padding:8px 11px;white-space:nowrap;transition:.13s;
}
.cai-seg-b b{font-weight:800}
.cai-seg-b i{
  font-style:normal;font-size:11.2px;font-weight:800;color:#8b93ad;background:#fff;
  border-radius:99px;padding:1px 7px;min-width:20px;text-align:center;
  font-variant-numeric:tabular-nums;
}
.cai-seg-b:hover:not(.on){color:var(--cp1);background:#eceefe}
.cai-seg-b.on{
  color:#fff;background:linear-gradient(135deg,var(--cp1),var(--cp2));
  box-shadow:0 3px 10px rgba(91,87,245,.28);
}
.cai-seg-b.on i{color:var(--cp1);background:#fff}
.cai-seg-h{margin:-6px 0 12px;font-size:11.4px;color:#9aa1ba;line-height:1.5}

/* V105 · 问题 5：结果页摘要改成「这次是怎么推荐的」（理由 + 条件标签 + 数据来源） */
.cai-sum2-t span b{font-weight:800}
.cai-sum2-d{margin:8px 0 0;font-size:12.4px;color:#4b5370;line-height:1.68}
.cai-sum2-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
.cai-sum2-tags span{
  font-size:11.6px;font-weight:700;color:#5b57f5;background:#eef1ff;
  border:1px solid #dfe3ff;border-radius:99px;padding:3px 10px;
}
.cai-sum2-s{margin:9px 0 0;font-size:11.6px;color:#8b93ad;line-height:1.62}

/* V105 · 问题 6：结果页摘要卡里的「调整条件」（桌面显式按钮，不再是裸文字链） */
.cai-sum2-a{display:flex;margin-top:11px}
#caiAdjust2,.cai-adj{
  cursor:pointer;font-family:inherit;font-size:12.4px;font-weight:800;color:var(--cp1);
  background:#fff;border:1px solid #d5d9f7;border-radius:10px;padding:8px 15px;
  display:inline-flex;align-items:center;gap:6px;transition:.13s;
}
#caiAdjust2:hover,.cai-adj:hover{background:#f4f5ff;border-color:#b9c0f5}
#caiAdjust2 .ic,.cai-adj .ic{width:14px;height:14px;stroke-width:1.9}
/* 入口卡上的同名按钮（#caiAdjust）统一观感 —— 用 ID 覆盖 .btn-ghost，不动全局按钮体系 */
#caiAdjust{
  cursor:pointer;font-family:inherit;font-size:12.4px;font-weight:800;color:var(--cp1);
  background:#fff;border:1px solid #d5d9f7;border-radius:10px;padding:8px 15px;transition:.13s;
}
#caiAdjust:hover{background:#f4f5ff;border-color:#b9c0f5}

/* ---------- 手机：全屏面板 + 单列卡片 ---------- */
@media(max-width:760px){
  .cai-panel{width:100%;max-width:100%!important;border-radius:0!important;padding:18px 16px calc(18px + env(safe-area-inset-bottom,0px))!important}
  .cai-pic{grid-template-columns:1fr}
  .cai-mode button{padding:6px 10px;font-size:12px}
  .cai-co{padding:13px 13px}
  .cai-co-h{padding-right:0}
  .cai-co-pri{position:static;display:inline-block;margin-top:7px}
  .cai-co-a{gap:7px}
  .cai-co-a button,.cai-co-a a{padding:7px 11px;font-size:12px}
}

/* ══════════ V107 · 片 1（不依赖 v4 数据那批）══════════
   依据：V106-深度匹配/05-前端呈现口径确认稿.html 第 04/05 章 + V106-P2-分片计划.html 第三节。
   本片只动**呈现层** —— 不碰 v4 RPC、不碰算分。 */

/* ---- 1.3 结果首屏：统计横幅从首屏拿掉 ----
   设计稿第 04 章：「原有全库统计在『全部企业』视图保留，不与 AI 摘要重复堆叠」。
   ⇒ AI 模式下收起 .cp-stat（渐变统计卡 = 全库统计），「全部企业」一字不改。
   探针实测（1280×1000 · 改前）：首屏第一张卡片 top=576，其中 .cp-stat 占 100px。 */
#v-campus.cai-mode .cp-stat{display:none!important}

.cai-sum3{border:1px solid #e3e6f7;border-radius:var(--cp-r);background:#fafbff;padding:9px 13px;margin-bottom:9px}
/* 一行到底：意向摘要 · 条数 · 两个轻入口（窄屏自动换行）*/
.cai-sum3-l{display:flex;align-items:baseline;gap:6px 14px;flex-wrap:wrap}
.cai-sum3-l b{font-size:13.6px;font-weight:800;color:var(--cp-ink);word-break:break-all}
.cai-sum3-n{font-size:11.8px;font-weight:700;color:var(--cp1)}
.cai-sum3-n b{font-size:12.4px}
.cai-sum3-a{display:inline-flex;align-items:baseline;gap:14px;margin-left:auto}
.cai-sum3-a .cai-link{font-size:12.2px}
/* 「调整条件」在本行是**文字入口**（设计稿 §08 承接表第 6 条）。
   ⚠️ 必须压过 `#caiAdjust2,.cai-adj`（1,0,0）⇒ 用 `#caiAdjust2` + 1 个类（1,1,0）。 */
#caiAdjust2.cai-link{background:none;border:0;padding:0;border-radius:0;display:inline-flex;align-items:center;gap:5px;color:var(--cp1)}
#caiAdjust2.cai-link .ic{width:13px;height:13px;stroke-width:1.9}
@media(max-width:760px){.cai-sum3-a{margin-left:0}}
.cai-sum3-x{margin-top:9px;padding-top:9px;border-top:1px dashed #e3e7f7}
.cai-sum3-x p{margin:0 0 6px;font-size:12.2px;color:#4b5370;line-height:1.66}
.cai-sum3-x p:last-child{margin-bottom:0}

/* 文字级次级动作（规格：「三级动作全部保持文字级」）*/
.cai-link{
  cursor:pointer;font-family:inherit;font-size:12.2px;font-weight:800;color:var(--cp1);
  background:none;border:0;padding:0;border-radius:0;text-decoration:none;
}
.cai-link:hover{text-decoration:underline}
/* ⚠️ 必须压过 .cai-co-a button（0,1,1）⇒ 用 2 个类（0,2,0）*/
.cai-co-a .cai-link{background:none;border:0;padding:0;border-radius:0;font-size:12.2px;color:var(--cp1)}

/* ---- 1.2 卡片结构：岗位名主标题 + 两句证据 + 一个主动作 ---- */
.cai-co-h{padding-right:0}   /* 右上角档位胶囊已去掉，不再留 74px 让位 */
.cai-co-job{margin:6px 0 0;font-size:14.6px;font-weight:800;color:var(--cp-ink);line-height:1.35;word-break:break-all}
.cai-co-job i{font-style:normal;font-weight:700;font-size:12.6px;color:#9aa1ba}
.cai-ev{margin:9px 0 0}
.cai-ev-h{display:block;margin-bottom:3px;font-size:11.6px;font-weight:800;color:var(--cp-mut)}
.cai-ev p{margin:0;font-size:12.6px;color:#4b5370;line-height:1.66}
.cai-ev.is-gap p{color:#8a5a00}
@media(max-width:760px){.cai-co-h{padding-right:0}}

/* ═══ V107 · 片 1 · 1.1 单面板 ═══ */
/* 简历一行卡（原来简历独占一整屏 + 列表常驻） */
#campusAiDrawer .cai-rcard{border:1px solid var(--ln,#e6e9f2);border-radius:10px;padding:11px 13px;background:#fafbff}
#campusAiDrawer .cai-rc-h{display:flex;flex-direction:column;gap:3px}
#campusAiDrawer .cai-rc-h b{font-size:14.5px}
#campusAiDrawer .cai-rc-h em{font-style:normal;font-size:12.5px;color:#68718b}
#campusAiDrawer .cai-rc-a{display:flex;gap:16px;margin-top:9px;flex-wrap:wrap}
/* 严格度二选一（设计稿：一组 chip + 一个二选一） */
#campusAiDrawer .cai-cmode{margin-top:10px;padding:10px 12px;border:1px solid var(--ln,#e6e9f2);border-radius:10px;background:#fff}
#campusAiDrawer .cai-cmode label{display:flex;align-items:center;gap:8px;padding:5px 0;cursor:pointer;font-size:13.5px}
#campusAiDrawer .cai-cmode label i{width:15px;height:15px;border-radius:50%;border:1.5px solid #c3c9da;flex:none;position:relative}
#campusAiDrawer .cai-cmode label.on i{border-color:#2f5bff}
#campusAiDrawer .cai-cmode label.on i::after{content:"";position:absolute;inset:3px;border-radius:50%;background:#2f5bff}
#campusAiDrawer .cai-cmode p{margin:7px 0 2px}
/* 移动端硬指标（设计稿第 10 章）：正文 ≥16px、主按钮触控 ≥44px。
   ⚠️ 只在窄屏生效 —— 不动 1280 桌面端，避免影响「首屏第一张卡 top<380」那条判据。 */
@media (max-width:760px){
  #campusAiDrawer .cai-panel{font-size:16px}
  #campusAiDrawer .cai-rc-h b{font-size:16px}
  #campusAiDrawer .cai-rc-h em{font-size:14px}
  #campusAiDrawer .cai-fld span{font-size:14px}
  #campusAiDrawer .cai-fld input,#campusAiDrawer .cai-fld select{font-size:16px;min-height:44px}
  #campusAiDrawer .cai-chip{min-height:36px;font-size:15px}
  #campusAiDrawer .cai-cmode label{font-size:16px;min-height:44px}
  #campusAiDrawer .cai-nav .btn-primary,#campusAiDrawer .cai-nav .btn-ghost{min-height:44px;font-size:16px}
  #campusAiDrawer .cai-rc-a .cai-link{min-height:36px;font-size:15px}
}


/* ═══ V107 · 片 1 · 1.4 岗位详情四段式 ═══
   规格第 06 章：要求↔证据 / 为什么是这一档 / 来源与核验 / 一个主按钮。
   ⚠️ 前两段**留占位**（要 v4 的岗位级数据）—— 占位文案说明白，不假装有。 */
.cai-det .cai-det-s{margin:0 0 11px}
.cai-det .cai-det-s:last-child{margin-bottom:0}
.cai-det .cai-det-h{display:block;margin-bottom:4px;font-size:11.8px;font-weight:800;color:var(--cp-mut);letter-spacing:.2px}
.cai-det .cai-pri{color:var(--cp1)}
.cai-det .cai-pairs{margin-top:2px}
.cai-det .cai-pair{padding:7px 0;border-bottom:1px solid #f0f2fa;font-size:12.2px;color:#4b5370;line-height:1.6}
.cai-det .cai-pair:last-child{border-bottom:0}
.cai-det .cai-pair-r{display:block}
.cai-det .cai-pair-s{margin-left:4px;font-weight:800;color:#9aa1ba}
.cai-det .cai-pair-s.ok{color:#15803d}
.cai-det .cai-pair em{display:block;font-style:normal;color:#7b83a0;margin-top:1px}
.cai-det .cai-det-a{margin-top:10px;display:flex;flex-direction:column;gap:7px}
.cai-det .cai-det-a .btn-primary{text-decoration:none}
.cai-det .cai-det-a .cai-n{margin:0;text-align:center}
/* 无入口时用与卡片同款的置灰胶囊，不再画一个像按钮的东西 */
.cai-det .cai-det-a .cai-a3{display:inline-block;text-align:center;padding:9px 13px;border-radius:99px;font-size:12.6px}

/* ═══ V112 · 校招 AI 筛选：失败可读 + 进度可见 ═══ */
/* 进度块（入口卡 / 结果区共用）：4 步真实步骤 + 一句阶段文案 */
.cai-prog{margin-top:9px}
.cai-prog-t{margin:0;font-size:12.6px;font-weight:800;color:var(--cp1)}
.cai-steps{list-style:none;margin:9px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:6px 14px}
.cai-step{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#9aa1ba;line-height:1.5}
.cai-step-d{width:7px;height:7px;border-radius:50%;background:#ccd2e6;flex:none}
.cai-step.done{color:#4b5370}
.cai-step.done .cai-step-d{background:#2f9e6e}
.cai-step.on{color:var(--cp1);font-weight:800}
.cai-step.on .cai-step-d{background:var(--cp1);box-shadow:0 0 0 3px rgba(47,91,255,.16);animation:caiPulse 1.2s ease-in-out infinite}
@keyframes caiPulse{0%,100%{opacity:1}50%{opacity:.3}}
/* 上一次筛选失败的提示条：留在主区，不用一闪而过的 toast */
.cai-fail{display:flex;align-items:center;gap:12px;flex-wrap:wrap;border:1px solid #f2d5cf;background:#fff7f5;border-radius:var(--cp-r);padding:10px 13px;margin-bottom:9px}
.cai-fail p{margin:0;flex:1 1 240px;font-size:12.6px;color:#8a3a2a;line-height:1.6}
#cpList .cai-fail .btn-ghost{margin-left:auto;flex:none}

/* ══════════ V114 · 路径A：为什么只有这几家（待确认 / 职能范围 / 硬性条件 / 证据不足） ══════════
   ⚠️ 新块必须插在 V101-END **之前**（追加到文件末尾会被后续规则覆盖 —— MEMORY 红线）。 */
.cai-pend{
  border:1px solid #e6e8f5;border-radius:var(--cp-r);background:#fbfcff;
  padding:12px 14px;margin:0 0 12px;
}
.cai-pend>b{display:block;font-size:13.2px;font-weight:800;color:var(--cp-ink);margin-bottom:8px}
.cai-pend ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:6px}
.cai-pend li{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;color:#4b5370;line-height:1.6}
.cai-pend li i{
  flex:none;font-style:normal;font-size:11.4px;font-weight:800;color:#5b57f5;background:#eef1ff;
  border-radius:99px;padding:0 8px;min-width:24px;height:19px;line-height:19px;text-align:center;
  font-variant-numeric:tabular-nums;margin-top:1px;
}
.cai-pend li.func i{color:#2f7a5e;background:#eaf7f1}
.cai-pend li.hard i{color:#a35a2a;background:#fff3e8}
.cai-pend-h{margin:9px 0 0;font-size:11.4px;color:#9aa1ba;line-height:1.55}

/* ══════════ V125 需求 1：一键简历三栏布局（左编辑 / 中预览撑满 / 右模版排版） ══════════
   🔴 三条硬约束（改这块前必读）：
     ① 每个直接子元素**必须显式 grid-column** —— 被收起的那栏 display:none 后会退出网格流，
        不钉列的话中栏会掉到第 1 列（V90 原设计就是这么解的，这里延续同一手法）。
     ② 中栏（.rb-preview-wrap，简历预览）**永不收起**；可收起的只有左（rb-l-collapsed）与右（rb-r-collapsed）。
     ③ 本块插在 V101-END 之前；下面的收起矩阵同时覆盖 V90 那套两栏规则。 */
.rb-editor-layout{display:grid;gap:16px;align-items:start;
  grid-template-columns:minmax(300px,23%) minmax(0,1fr) minmax(270px,21%)}
.rb-editor-layout>.rb-side{grid-column:1}
.rb-editor-layout>.rb-preview-wrap{grid-column:2}
.rb-editor-layout>.rb-style-pane{grid-column:3}

/* ── 中栏：撑满视口高度、自己滚；简历纸按栏宽自动缩放（--rb-zoom 由 JS 写） ── */
.rb-preview-wrap{position:sticky;top:12px;align-self:start;min-width:0;
  max-height:calc(100vh - 24px);display:flex;flex-direction:column}
.rb-preview-toolbar{display:flex;justify-content:space-between;align-items:center;gap:10px;
  margin-bottom:10px;font-size:12px;color:var(--muted);flex:none}
.rb-preview-tools{display:flex;align-items:center;gap:8px}
.rb-zoom{display:inline-flex;align-items:center;gap:4px}
.rb-zoom-use{appearance:none;border:1px solid var(--line);background:#fff;color:var(--muted);
  font:inherit;font-size:11.5px;border-radius:999px;padding:2px 9px;cursor:pointer;white-space:nowrap}
.rb-zoom-use.on{color:#2f5bff;border-color:#bcd0ff;background:#f2f6ff;font-weight:700}
.rb-preview-scroll{background:#eef1f5;border-radius:10px;padding:16px;min-height:0;flex:1 1 auto;overflow:auto}
.rb-zoom-outer{width:100%;display:flex;justify-content:center;overflow:hidden}
.rb-zoom-inner{flex:none;width:max-content;transform-origin:top center;transform:scale(var(--rb-zoom,1))}

/* ── 右栏：模版与排版（原 V59「简历样式」整块搬过来） ── */
.rb-style-pane{min-width:0;position:sticky;top:12px;align-self:start;
  max-height:calc(100vh - 24px);display:flex;flex-direction:column;
  border-left:1px solid var(--line);padding-left:16px}
.rb-style-pane-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex:none;margin-bottom:8px}
.rb-style-pane .rb-style-body{flex:1 1 auto;min-height:0;overflow:auto;padding-right:2px}
.rb-style-pane .rb-ai-layout{flex:none;margin-top:10px;width:100%}

/* ── 收起矩阵（三栏版）：左收起 / 右收起 / 双收起；中栏不参与 ── */
@media(min-width:1101px){
  .rb-expand-side,.rb-expand-style{display:none}
  .rb-editor-layout.rb-l-collapsed{grid-template-columns:0 minmax(0,1fr) minmax(270px,21%);gap:0 16px}
  .rb-editor-layout.rb-l-collapsed>.rb-side{display:none}
  .rb-editor-layout.rb-l-collapsed .rb-expand-side{display:inline-flex}
  .rb-editor-layout.rb-r-collapsed{grid-template-columns:minmax(300px,23%) minmax(0,1fr) 0;gap:0 16px}
  .rb-editor-layout.rb-r-collapsed>.rb-style-pane{display:none}
  /* 🔴 V90 残留覆盖（V125 补丁8）：V90 的「右收起」收的是**预览**
     （.rb-editor-layout.rb-r-collapsed>.rb-preview-wrap{display:none}），
     V125 三栏后改收第三栏 .rb-style-pane，中栏预览**永不收起**。
     V90 那条在前、与本条特异性相同 ⇒ 必须在这里显式改回，否则点「收起 ›」中栏会一起消失。 */
  .rb-editor-layout.rb-r-collapsed>.rb-preview-wrap{display:flex}
  .rb-editor-layout.rb-r-collapsed .rb-expand-style{display:inline-flex}
  .rb-editor-layout.rb-l-collapsed.rb-r-collapsed{grid-template-columns:0 minmax(0,1fr) 0;gap:0}
  .rb-editor-layout.rb-l-collapsed.rb-r-collapsed{min-height:104px;position:relative}
  .rb-editor-layout.rb-l-collapsed.rb-r-collapsed>.rb-pane-rescue{
    display:flex;position:absolute;left:50%;top:18px;transform:translateX(-50%);align-items:center;gap:10px;z-index:3}
}
@media(max-width:1100px){
  .rb-collapse-side,.rb-collapse-style,.rb-expand-side,.rb-expand-style{display:none!important}
  .rb-editor-layout,
  .rb-editor-layout.rb-l-collapsed,
  .rb-editor-layout.rb-r-collapsed,
  .rb-editor-layout.rb-l-collapsed.rb-r-collapsed{grid-template-columns:minmax(0,1fr);gap:14px}
  .rb-editor-layout>.rb-side,
  .rb-editor-layout>.rb-preview-wrap,
  .rb-editor-layout>.rb-style-pane{grid-column:auto;position:static;max-height:none;display:block}
  .rb-editor-layout>.rb-side{border-right:0;border-bottom:1px solid var(--line);padding:0 0 14px}
  .rb-editor-layout>.rb-style-pane{border-left:0;border-top:1px solid var(--line);padding:14px 0 0}
  .rb-pane-rescue{display:none!important}
  .rb-zoom-outer{overflow:visible}
}

/* ══════════ V125 需求 2：AI 处理中的进度浮层 ══════════
   大哥原话：「需要优化的进度，可以是个 toast，圆圈什么的」。
   右下角浮出的一张卡：圆环进度（跑批时是确定进度，单段/不确定时是转圈）+ 标题 + 阶段说明。
   三态：进行中（蓝）/ 完成（绿勾）/ 失败（红叉 + 原因 + 重试）。
   ⚠️ 一律由 resume-builder.js 的 rbProgOpen/Set/Done/Fail/Close 驱动，别在别处手搓 DOM。 */
.rb-prog{position:fixed;right:22px;bottom:22px;z-index:420;width:300px;box-sizing:border-box;
  background:#fff;border:1px solid #d6e2f8;border-radius:14px;box-shadow:0 12px 34px rgba(20,40,80,.16);
  padding:14px 15px;display:flex;align-items:center;gap:12px;font-size:13px;color:#20252c;
  opacity:0;transform:translateY(10px);transition:opacity .18s ease,transform .18s ease}
.rb-prog.show{opacity:1;transform:translateY(0)}
.rb-prog.is-done{border-color:#bfe6ce;background:#f6fdf9}
.rb-prog.is-fail{border-color:#f2c2c2;background:#fff7f7}
.rb-prog-ring{flex:none;width:38px;height:38px;position:relative}
.rb-prog-ring svg{display:block;width:38px;height:38px}
.rb-prog-ring .rb-pr-bg{fill:none;stroke:#e6ecf6;stroke-width:3.4}
.rb-prog-ring .rb-pr-fg{fill:none;stroke:#2f5bff;stroke-width:3.4;stroke-linecap:round;
  stroke-dasharray:100.5;stroke-dashoffset:100.5;transform:rotate(-90deg);transform-origin:50% 50%;
  transition:stroke-dashoffset .45s ease}
.rb-prog.is-done .rb-pr-fg{stroke:#12a150}
.rb-prog.is-fail .rb-pr-fg{stroke:#e24b4a}
.rb-prog-ring.is-spin .rb-pr-fg{stroke-dasharray:26 100.5;animation:rbProgSpin 1.1s linear infinite}
@keyframes rbProgSpin{to{transform:rotate(270deg)}}
.rb-pr-ico{position:absolute;left:0;top:0;width:38px;height:38px;display:none;align-items:center;justify-content:center;
  font-size:17px;font-weight:700;line-height:1}
.rb-prog.is-done .rb-pr-ico,.rb-prog.is-fail .rb-pr-ico{display:flex}
.rb-prog.is-done .rb-pr-ico{color:#12a150}
.rb-prog.is-fail .rb-pr-ico{color:#e24b4a}
.rb-prog.is-done .rb-prog-ring svg,.rb-prog.is-fail .rb-prog-ring svg{display:none}
.rb-prog-txt{min-width:0;flex:1}
.rb-prog-txt b{display:block;font-size:13px;font-weight:700;margin-bottom:2px}
.rb-prog-txt span{display:block;font-size:11.5px;color:#6b7280;line-height:1.5}
.rb-prog-act{flex:none;display:flex;align-items:center}
.rb-prog-retry{appearance:none;border:1px solid #f2c2c2;background:#fff;color:#c22;font:inherit;
  font-size:11.5px;font-weight:700;border-radius:999px;padding:3px 11px;cursor:pointer;white-space:nowrap}
@media(prefers-reduced-motion:reduce){.rb-prog-ring.is-spin .rb-pr-fg{animation:none}}
@media(max-width:640px){.rb-prog{right:10px;left:10px;width:auto;bottom:12px}}

.rb-ai-layout{white-space:nowrap}

/* ---------- 21.13b 公司详情 · 单位速览（V126） ----------
   ⚠️ 原先是 .cj-note：把 campus_jobs.note（「来源=…校招锚定=…实测 200/xxB…」
   这类运营核验口径）摊给用户看，属于内部留痕外泄，已下线。
   这里改成用库内字段拼出来的「单位速览」，中性底色、不用黄色警示底。
   注意：本块必须插在 V101-END 之前 —— MEMORY 红线。 */
.cj-sum{
  margin-top:15px;padding:12px 14px;border-radius:12px;
  background:var(--soft);border:1px solid var(--line);
  font-size:12.6px;line-height:1.7;color:#3d4661;
}
.cj-sum-k{display:block;font-size:11.4px;font-weight:800;letter-spacing:.5px;color:#a6acc6;margin-bottom:5px}
.cj-sum p{margin:0}
.cj-sum .cj-sum-tip{margin-top:4px;color:#6b7280}
.cj-sum .cj-sum-tip.is-urgent{color:#c2410c;font-weight:700}
.cj-sum .cj-sum-tip.is-off{color:#a6acc6}

/* ══════════ V101-END ══════════ */
