/* 构建产物：由 tools/build-detail-v2-css.js 从 assets/css/src/detail.v2.src.css 生成，勿手改 */
/* ============================================================
 * 任务详情页 v2 —— 样式源文件（写 Ndp，构建时换算成 calc(N * var(--dp))）
 * 唯一基准：真机 1440×3066 @ 538dpi（var(--dp) = 3.3625px），设计宽 calc(428.25 * var(--dp))
 * 每个数值后面的注释是它在真机截图上的像素值，便于回溯核对
 * ============================================================ */

.v2 {
  /* var(--dp) = 1 CSS px，与 Android 的 dp 定义一致。
     基准必须是**设备实际 CSS 宽**（这台真机 1440px @dpr 3.3645 → 428 CSS px），
     不能写 360：写 360 时 428 宽视口下 --dp = 1.189，整页等比放大 19%
     （实测描述字号 16.62 CSS px = 55.9 设备px，真机是 47px），
     与真机并排看就是「克隆的字明显更大、整体更高」。
     改成 /428 后 --dp = 1.0002，calc(14 * var(--dp)) = 47.0 设备px，与真机 14sp×3.3625 完全一致。 */
  --dp: calc(min(100vw, 430px) / 428);
  position: relative;
  min-height: 100vh;
  background: #fafafa;
  color: #000;
  /* 全角标点压半宽：真机 Android 对中文标点有压缩，Chrome 默认不压，导致整行偏宽、换行点错位 */
  font-family: "Noto Sans SC", "Noto Sans CJK SC", "Source Han Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
  -webkit-text-size-adjust: 100%;
}

.v2 *,
.v2 *::before,
.v2 *::after { box-sizing: border-box; }

/* 原生是 ScrollView + 固定底栏：滚动区在底栏之上截止（真机白色卡片止于 y=2847，
   2848..2863 是 #fafafa + 底栏投影，底栏 2864..3065）。这里用内部滚动容器还原。 */
.v2-scroll {
  position: relative;
  height: calc(100vh - calc(64.2 * var(--dp)));       /* 3065-2847 = 218px */
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  padding-bottom: calc(17.5 * var(--dp));            /* 59px：真机滚到底时最后一张卡距滚动区底 218-... 实测 59 */
}

/* 头图底图：calc(170 * var(--dp)) 高，fitXY 拉伸（与原生 <View background=@mipmap> 一致） */
.v2-hero-bg {
  position: absolute;
  top: 0; left: 0;
  width: 100%;
  height: calc(170 * var(--dp));
  overflow: hidden;
}
.v2-hero-bg img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: fill;
}

.v2-body {
  position: relative;
  /* 用 padding 而不是 margin：margin 会和 .v2-hero 的 margin-top 折叠，导致整卡上移 calc(30 * var(--dp)) */
  padding: calc(50 * var(--dp)) calc(8 * var(--dp)) 0;               /* 顶部 168px；底部留给 .v2-scroll 的 padding */
}

/* ---------------- 任务卡 ---------------- */

.v2-hero {
  position: relative;
  margin-top: calc(30 * var(--dp));                  /* 101px */
  padding-top: calc(30 * var(--dp));                 /* 再 101px：与卡片自身的 calc(30 * var(--dp)) 叠加成 calc(60 * var(--dp))，用 padding 防折叠 */
}

.v2-card {
  position: relative;
  margin: 0 calc(2 * var(--dp)) 0;                   /* 左右 7px（上下间距由 .v2-sec 的 margin-top 统一给） */
  height: calc(171.31 * var(--dp));                  /* 576px */
  background: #fff;
  border-radius: calc(8 * var(--dp));
}

.v2-card__title {
  position: absolute;
  left: calc(80 * var(--dp));                        /* 269px */
  top: calc(5.06 * var(--dp));                       /* 17px */
  max-width: calc(180 * var(--dp));
  height: calc(21.71 * var(--dp));                   /* 73px */
  line-height: calc(21.71 * var(--dp));
  font-size: calc(16 * var(--dp));
  font-weight: 700;
  color: #000;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.v2-card__id {
  position: absolute;
  left: calc(80 * var(--dp));
  top: calc(29.73 * var(--dp));                      /* 100px */
  height: calc(16.06 * var(--dp));                   /* 54px */
  line-height: calc(16.06 * var(--dp));
  font-size: calc(12 * var(--dp));
  color: #666;
  white-space: nowrap;
}

.v2-card__copy {
  position: absolute;
  left: calc(187.44 * var(--dp));                    /* 630px */
  top: calc(31.52 * var(--dp));                      /* 106px */
  height: calc(13.7 * var(--dp));                    /* 46px（detail-2 实测 496..541） */
  line-height: calc(11.7 * var(--dp));               /* 46 - 2*var(--dp) padding */
  padding: var(--dp) calc(5 * var(--dp));
  border-radius: calc(2 * var(--dp));
  background: #ff445b;
  color: #fff;
  font-size: calc(8.7 * var(--dp));                  /* 真机按钮内文字宽 calc(17.4 * var(--dp)) ÷ 2 字 */
  white-space: nowrap;
}

.v2-card__star {
  position: absolute;
  left: calc(223.66 * var(--dp));                    /* 752px */
  top: calc(30.32 * var(--dp));                      /* 102px */
  width: calc(15.46 * var(--dp));                    /* 52px */
  height: calc(14.87 * var(--dp));                   /* 50px */
}

.v2-card__price {
  position: absolute;
  right: calc(25 * var(--dp));                       /* 1322 → 1406 是 84px */
  top: calc(15.17 * var(--dp));                      /* 51px */
  height: calc(28.26 * var(--dp));                   /* 95px */
  line-height: calc(28.26 * var(--dp));
  font-size: calc(21 * var(--dp));
  color: #ec343b;
  white-space: nowrap;
}
.v2-card__price i {
  font-style: normal;
  font-size: calc(21 * var(--dp));
}

.v2-card__uid {
  position: absolute;
  left: calc(32.36 * var(--dp));                     /* 109px */
  top: calc(41.92 * var(--dp));                      /* 141px */
  height: calc(12.4 * var(--dp));                    /* 42px */
  line-height: calc(12.4 * var(--dp));
  font-size: calc(9.65 * var(--dp));                 /* 真机 "ID:1023315" 165px = calc(49 * var(--dp))，10 字符 → em 9.65 */
  color: #666;
}

.v2-card__tags {
  position: absolute;
  left: calc(20.22 * var(--dp));                     /* 68px → 绝对 x=102（真机标签行左缘） */
  top: calc(55.62 * var(--dp));                      /* 187px → 绝对 y=557，胶囊高 calc(16.4 * var(--dp)) 后中心不变 */
  height: calc(16.4 * var(--dp));                    /* 55px */
  white-space: nowrap;
}

.v2-tag {
  display: inline-block;
  height: calc(16.4 * var(--dp));                    /* 55px（detail-2 实测 582..636） */
  line-height: calc(16.4 * var(--dp));
  padding: 0 calc(5.3 * var(--dp));
  margin-right: calc(8 * var(--dp));
  border-radius: calc(2 * var(--dp));
  font-size: calc(10.43 * var(--dp));                /* 联立 4 字 calc(52.3 * var(--dp)) / 7 字 calc(83.6 * var(--dp)) → F=10.43 P=5.3 */                /* 真机 em = 34px（calc(10 * var(--dp))=33.625px 会被 Android 取整成 34）。
                                        实测四个胶囊右缘：真机 252/472/771/972，calc(10 * var(--dp)) 时克隆 252/470/766/965
                                        （每个窄 1~3px，累计 -5）；按 34px 折算后逐一对齐 */
  color: #fff;
  vertical-align: top;
}
.v2-tag--line {
  width: calc(45 * var(--dp));                       /* 真机「联系TA」胶囊 calc(45 * var(--dp)) 宽（d2.xml bounds 30→74.5） */
  padding: 0;
  text-align: center;
  font-size: calc(11.25 * var(--dp));                /* (47 - calc(2 * var(--dp)) 边框) ÷ 4 字 */
  line-height: calc(14.4 * var(--dp));               /* 55 - 2*var(--dp) 边框 */
  margin-right: calc(15 * var(--dp));                /* 真机间距 51px（其余标签 calc(8 * var(--dp)) / 27px） */
  color: #ff2c26;
  background: #fff;
  border: var(--dp) solid #ff2c26;
}
.v2-tag--c1 { background: #fb665e; }  /* 后续回收 */
.v2-tag--c2 { background: #f55881; }  /* 元气小队长后续 */
.v2-tag--c3 { background: #eb3549; }  /* 剩余xx单 */

.v2-card__stats {
  position: absolute;
  left: calc(11 * var(--dp));                        /* 37px → 绝对 x=71（真机等分格间距 324px） */
  right: calc(11 * var(--dp));                       /* 不能写死 calc(385.44 * var(--dp))：那是 calc(428 * var(--dp)) 屏上的宽，calc(360 * var(--dp)) 屏会溢出被裁 */
  top: calc(81.49 * var(--dp));                      /* 274px */
  height: calc(49.96 * var(--dp));                   /* 168px */
  display: flex;
}
.v2-stat {
  flex: 1 1 0;
  text-align: center;
  position: relative;
}
.v2-stat + .v2-stat::before {
  content: "";
  position: absolute;
  left: 0;
  top: calc(5.06 * var(--dp));                       /* 17px */
  width: calc(0.3 * var(--dp));                      /* 1px */
  height: calc(39.85 * var(--dp));                   /* 134px */
  background: #dcdcdc;
}
.v2-stat__v {
  height: calc(24.6 * var(--dp));                    /* 83px */
  line-height: calc(24.6 * var(--dp));
  margin-top: calc(9.3 * var(--dp));                 /* 31px（数字行盒加高后总高不变） */
  font-size: calc(12 * var(--dp));
  color: #000;
}
.v2-stat__v b {
  /* RelativeSizeSpan 1.4 × 12sp = 16.8sp；真机行带高 27px÷1.34 ≈ 16.9sp
     （之前写 19.5 是按墨高误推的，导致数字偏大、第 4 列被挤出卡片） */
  font-size: calc(16.8 * var(--dp));
  font-weight: 400;
}
.v2-stat__v i {
  font-style: normal;
  font-size: calc(12 * var(--dp));
}
.v2-stat__l {
  height: calc(16.06 * var(--dp));                   /* 54px */
  line-height: calc(16.06 * var(--dp));
  margin-top: calc(-0.6 * var(--dp));                /* 真机标签墨迹顶 767（数值行盒底 759 + 8.5） */
  font-size: calc(12 * var(--dp));
  color: #999;
}

.v2-card__hr {
  position: absolute;
  left: calc(5.06 * var(--dp));                      /* 17px */
  right: calc(5.06 * var(--dp));                     /* 同上：不写死 calc(398 * var(--dp)) */
  top: calc(141.55 * var(--dp));                     /* 476px */
  height: calc(0.3 * var(--dp));
  background: #dcdcdc;
}

.v2-card__meta {
  position: absolute;
  left: calc(22.9 * var(--dp));                      /* 77px（真机图标墨迹 x=114，PNG 自带 3px 透明边） */
  top: calc(146.61 * var(--dp));                     /* 493px → 绝对 y=863，行盒 863..945 */
  height: calc(24.39 * var(--dp));                   /* 82px */
  font-size: calc(11.9 * var(--dp));                 /* 真机 em = 40px（calc(12 * var(--dp))=40.35）。实测文字墨宽 真机 328/287，克隆 332/290 */
  color: #999;
  white-space: nowrap;
}
.v2-card__mi {
  position: absolute;
  top: 0;
  height: calc(24.39 * var(--dp));
  line-height: calc(24.39 * var(--dp));
  display: flex;
  align-items: center;
}
.v2-card__mi--1 { left: 0; }
.v2-card__mi--2 { left: calc(185.87 * var(--dp)); }  /* 730 - 105 = 625px */
.v2-card__mi img {
  display: block;
  margin-right: calc(7.58 * var(--dp));              /* 25.5px：实测图标墨右缘→文字墨左缘 真机 31/28，15px 时克隆只有 19（偏窄 10.5px） */
}
.v2-card__mi--1 img { width: calc(15.16 * var(--dp)); height: calc(16.06 * var(--dp)); }   /* 51×54px */
.v2-card__mi--2 img { width: calc(14.57 * var(--dp)); height: calc(14.27 * var(--dp)); }   /* 49×48px */

/* 头像徽标：压在卡片左上角，向上溢出 calc(30 * var(--dp)) */
.v2-avatar {
  position: absolute;
  left: calc(14.87 * var(--dp));                     /* 50px → 绝对 x=77（.v2-hero 左缘在 27px） */
  top: 0;                            /* 绝对 y=269（红圈 272 起，竖椭圆到 507） */
  width: calc(60.07 * var(--dp));                    /* 202px */
  height: calc(70.19 * var(--dp));                   /* 236px */
  pointer-events: none;
}
.v2-avatar__img {
  display: block;
  width: calc(60.07 * var(--dp));                    /* 202px */
  height: calc(60.07 * var(--dp));                   /* 202px：真机红圈 x77..278 / y303..504，是正圆 */
  border-radius: 50%;
  margin-top: calc(10.11 * var(--dp));               /* 34px → 绝对 y=303 */
  background: #fff;
  object-fit: cover;
}
.v2-avatar__vip {
  position: absolute;
  left: calc(40.15 * var(--dp));                     /* 135px → 绝对 x=212 */
  top: calc(52.93 * var(--dp));                      /* 178px → 绝对 y=447（黄带底部 504） */
  width: calc(20.22 * var(--dp));                    /* 68px */
  height: calc(15.76 * var(--dp));                   /* 53px */
}

/* ---------------- 内容卡（官方提示 / 任务描述 / 任务步骤） ---------------- */

.v2-sec {
  /* 原生：卡片间距 = 卡片 marginBottom calc(2 * var(--dp)) + 区块 marginTop calc(15 * var(--dp)) = calc(17 * var(--dp))（57px）
     CSS 相邻 margin 会取 max 而不是相加，所以这里直接写 calc(16.96 * var(--dp)) */
  margin: calc(16.96 * var(--dp)) calc(2 * var(--dp)) 0;
  padding: calc(15 * var(--dp)) calc(15 * var(--dp)) calc(11.6 * var(--dp));         /* 上/左右 50px，下 39px（真机卡片底到正文末行 39px） */
  background: #fff;
  border-radius: calc(8 * var(--dp));
}

.v2-sec__head {
  display: flex;
  align-items: center;
  height: calc(21.71 * var(--dp));                   /* 73px */
  /* 注：真机标题重心 1549.82 / 1954.69，克隆 1547.65 / 1951.72（高 2.2~3.0px）。
     试过 position:relative + top 补 2.5px：栅格只吃下 0.7px（重心 -2.17→-1.44），
     第二个标题几乎没动，整页 6.5→6.6，故不加。属亚像素相位死结。 */
  font-size: calc(16 * var(--dp));
  font-weight: 700;
  color: #ff445b;
  line-height: calc(21.71 * var(--dp));
}
.v2-sec__icon {
  display: block;
  width: calc(13.38 * var(--dp));                    /* 45px */
  height: calc(13.38 * var(--dp));
  margin-right: calc(5.95 * var(--dp));              /* 20px */
}
.v2-sec__icon--doc {
  width: calc(12.49 * var(--dp));                    /* 42px */
  height: calc(13.38 * var(--dp));
  margin-right: calc(5.95 * var(--dp));
}
.v2-sec__os {
  display: block;
  width: calc(14.27 * var(--dp));                    /* 48px */
  height: calc(15.46 * var(--dp));                   /* 52px */
  margin-left: calc(5.35 * var(--dp));               /* 18px */
}

.v2-tips {
  margin-top: calc(7.13 * var(--dp));                /* 24px：标题行盒底 1126 → 正文行盒顶 1150（A/B 实测均值更优） */
  padding: 0;
  font-size: calc(11.9 * var(--dp));                 /* 真机 em = 40.00px，不是 calc(12 * var(--dp))=40.35px。
                                        依据：逐字切分（glyph-split）三行右端 真机 930/810/1089，
                                        calc(12 * var(--dp)) 时克隆 937/816/1098（每字多 0.35px × 23 字 ≈ +7px），
                                        calc(11.9 * var(--dp)) 时 930/810/1089 完全重合；提示带差分 14.91 → 6.29 */
  line-height: calc(21.11 * var(--dp));              /* 71px：真机三行墨迹顶 1169/1240/1311，行距 71 */
  color: #333;
}

.v2-desc {
  margin-top: calc(7.9 * var(--dp));                 /* 26.6px（A/B：calc(9.09 * var(--dp)) 让首行对齐但整页均值 8.8→10.4，回退） */
  padding: 0;
  font-size: calc(13.98 * var(--dp));                /* 真机 em = 47.00px（不是 calc(14 * var(--dp))=47.075px）。扫点（tmp-sweep2）：
                                        calc(13.98 * var(--dp)) 描述带差分 16.60 → 16.18，13.95/14.0 都更差 */
  line-height: calc(23.3 * var(--dp));               /* 视觉行距 77.32px。Chrome 在本页把行距量化成 4px 台阶（实扫 23.2~calc(24.4 * var(--dp))）：
                                        23.2~23.6 → 77.32，23.8~24.0 → 81.32，24.2 以上整块再跳。
                                        真机 79.31 落空，两档各偏 2px。23.8 档虽让描述带 16.18→15.18，
                                        但会把「任务步骤」块的亚像素相位翻档（步骤带 13.18→16.34 且不可调回），
                                        整页 6.6→8.4，故取 23.3 并用 margin-bottom 锁住块高 */
  position: relative;
  top: calc(0.54 * var(--dp));                       /* 1.82px：行距换台阶后首行仍高 4.41px（line-centroid 实测），用相对定位平移不吃布局 */
  margin-bottom: calc(0.34 * var(--dp));             /* 1.15px：补回行距台阶造成的块高缩水，保证下方「任务步骤」卡不动 */
  letter-spacing: -0.027em;          /* 真机粗体行每字比克隆窄 1.29px（28 字累积 36px），
                                        前 10 字逐像素重合，误差从引号处开始累积 */
  color: #333;
  font-weight: 700;
  word-break: break-word;
}

/* ---------------- 上级任务 / 后续任务 ---------------- */
/* 真机：整卡 1372×370，上半 150（标题）+ 1px 分隔线 + 下半 219（任务行） */

.v2-rel {
  position: relative;
  margin: calc(16.96 * var(--dp)) calc(2 * var(--dp)) 0;
  height: calc(110.04 * var(--dp));                  /* 370px */
  background: #fff;
  border-radius: calc(8 * var(--dp));
  overflow: hidden;
}

.v2-rel__h {
  position: absolute;
  left: calc(14.87 * var(--dp));                     /* 50px → 绝对 x=84（墨迹 87） */
  top: calc(14.87 * var(--dp));                      /* 50px → 墨迹顶 2051 */
  height: calc(21.71 * var(--dp));                   /* 73px */
  line-height: calc(21.71 * var(--dp));
  font-size: calc(16 * var(--dp));
  font-weight: 700;
  color: #000;
  white-space: nowrap;
}
.v2-rel__h i {
  font-style: normal;
  font-weight: 400;
  font-size: calc(12.5 * var(--dp));
  color: #92979e;
  margin-left: calc(8.6 * var(--dp));                /* 30px */
  vertical-align: middle;
}
.v2-rel__star {
  display: inline-block;
  vertical-align: middle;
  width: calc(20.82 * var(--dp));                    /* 70px */
  height: calc(14.57 * var(--dp));                   /* 49px */
  margin-left: calc(1.19 * var(--dp));
}

.v2-rel__line {
  position: absolute;
  left: 0; right: 0;
  top: calc(44.61 * var(--dp));                      /* 150px */
  height: calc(0.3 * var(--dp));
  background: #dcdcdc;
}

.v2-rl {
  position: absolute;
  left: 0; right: 0;
  top: calc(44.9 * var(--dp));                       /* 151px */
  height: calc(65.14 * var(--dp));                   /* 219px */
  display: block;
  color: inherit;
  text-decoration: none;
}
.v2-rl__av {
  position: absolute;
  left: calc(14.27 * var(--dp));                     /* 48px → 绝对 x=82 */
  top: calc(14.87 * var(--dp));                      /* 50px → 绝对 y=2192 */
  width: calc(34.5 * var(--dp));                     /* 116px */
  height: calc(35.69 * var(--dp));                   /* 120px */
  border-radius: 50%;
}
.v2-rl__t {
  position: absolute;
  left: calc(58.58 * var(--dp));                     /* 197px：实测首个汉字墨左缘 真机 232 / 克隆 225（calc(56.5 * var(--dp))=190px 偏左 7px） */
  top: calc(14.61 * var(--dp));                      /* 49.1px：真机首字墨顶 2200，克隆 2193；行盒内落位（半行距）已被字体定死，只能整体下移 */
  max-width: calc(104 * var(--dp));
  height: calc(14.87 * var(--dp));                   /* 50px */
  line-height: calc(14.87 * var(--dp));
  font-size: calc(12 * var(--dp));
  font-weight: 700;
  color: #333;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.v2-rl__top {
  position: absolute;
  left: calc(167.4 * var(--dp));                     /* 563px → 绝对 x=597 */
  top: calc(14.87 * var(--dp));                      /* 50px → 2192 */
  width: calc(17.84 * var(--dp));                    /* 60px */
  height: calc(17.25 * var(--dp));                   /* 58px */
  line-height: calc(17.25 * var(--dp));
  text-align: center;
  border-radius: calc(1.5 * var(--dp));
  background: #ff4558;
  color: #fff;
  font-size: calc(10 * var(--dp));
}
.v2-rl__p {
  position: absolute;
  right: calc(20.5 * var(--dp));                     /* 69px（墨迹右缘 1337） */
  top: calc(15.02 * var(--dp));                      /* 50.5px → 行盒 2192.5 */
  height: calc(16.06 * var(--dp));                   /* 54px */
  line-height: calc(16.06 * var(--dp));
  font-size: calc(11 * var(--dp));
  font-weight: 700;
  color: #ff0310;
  white-space: nowrap;
}
.v2-rl__p i { font-style: normal; }

.v2-rl__m {
  position: absolute;
  left: calc(58.26 * var(--dp));                     /* 196px → 绝对 x=230 */
  top: calc(36.02 * var(--dp));                      /* 121px → 绝对 y=2263 */
  height: calc(13.98 * var(--dp));                   /* 47px */
  display: flex;
  align-items: center;
  white-space: nowrap;
  font-size: calc(11 * var(--dp));
  color: #999;
}
.v2-rl__tag {
  height: calc(13.98 * var(--dp));
  line-height: calc(13.98 * var(--dp));
  padding: 0 calc(5.5 * var(--dp));                  /* 18.5px */
  border-radius: calc(3 * var(--dp));
  background: #f3f3f3;
  color: #999;
  font-size: calc(8.7 * var(--dp));
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: calc(72.88 * var(--dp));                /* 245px：原生第二个标签超出即省略（rel2 实测 245） */
}
.v2-rl__tag + .v2-rl__tag { margin-left: calc(6.25 * var(--dp)); }   /* 21px */
.v2-rl__n { margin-left: calc(9.22 * var(--dp)); }                   /* 31px */
.v2-rl__n em { font-style: normal; color: #ec343b; }
.v2-rl__s { margin-left: calc(8.92 * var(--dp)); }                   /* 30px */

/* ---------------- 任务步骤 ---------------- */

.v2-steps {
  margin-top: calc(10.11 * var(--dp));               /* 34px */
}

/* 步骤卡底部：真机最后一张配图底 1770 → 卡片底 1932，留 162px */
.v2-sec--steps {
  padding-bottom: calc(50 * var(--dp));              /* 168px：真机末图底 1765 → 步骤卡底 1933 */
}

/* 弯引号单独压半角（安卓 Noto CJK 的默认行为） */
.v2-q {
  font-style: normal;
  font-feature-settings: "halt" 1;
}

.v2-step {
  position: relative;
}
.v2-step + .v2-step {
  margin-top: calc(35.4 * var(--dp));                /* 119px：真机上一张配图底 → 下一步序号圆顶（r_up 1802→1921，r_up2 394→523 / 1938→2068） */
}
.v2-step__no {
  position: absolute;
  left: 0;
  top: 0;
  width: calc(19.93 * var(--dp));                    /* 67px */
  height: calc(19.93 * var(--dp));
  border-radius: 50%;
  background: #ff4040;
  color: #fff;
  font-size: calc(12 * var(--dp));
  line-height: calc(19.93 * var(--dp));
  text-align: center;
  font-weight: 700;
}
.v2-step__body {
  margin-left: calc(24.98 * var(--dp));              /* 84px */
}
.v2-step__txt {
  font-size: calc(13.95 * var(--dp));                /* 真机 em = 47.00px 量级；扫点最优 13.95（步骤带 17.70 → 13.18），
                                        13.90/13.98 都回升，是单峰 */
  line-height: calc(20.52 * var(--dp));              /* 69px（实测墨顶差 66.54，真机 68.46；Chrome 行盒只有 66.5/69.5 两档） */
  color: #000;                       /* 真机步骤正文是纯黑；描述/提示才是 #333（text-color.py 实测） */
  position: relative;
  top: calc(0.44 * var(--dp));                       /* 1.48px。扫点（tools/tmp-sweep2.js）：0.25~calc(0.55 * var(--dp)) 是同一档，
                                       步骤带差分 21.86 → 17.70；calc(0.70 * var(--dp)) 起跳回 21.86。取档中点
                                       不用 0.62（紧贴台阶上沿，字体/DPR 一变就掉档） */
}
.v2-step__txt.is-indent {
  text-indent: calc(10.11 * var(--dp));              /* 原生正文首行前导制表符 ≈34px */
}
.v2-step__row {
  display: flex;
  align-items: center;               /* 真机：右侧按钮与配图垂直居中（三条实拍均吻合） */
  margin-top: calc(14.87 * var(--dp));               /* 50px */
  margin-left: calc(-24.98 * var(--dp));             /* 真机配图左缘 x=84（与卡片内容区对齐），不进序号缩进列 */
}
.v2-step__imgwrap {
  position: relative;
  display: block;
  flex: none;
  width: calc(170.1 * var(--dp));                    /* 572px */
}
.v2-step__img {
  display: block;
  width: 100%;
}
/* 真机在配图左下角压一枚红色角标（154×68，遮住原图水印位） */
.v2-step__tag {
  position: absolute;
  left: 0;
  bottom: calc(0.3 * var(--dp));                     /* 1765 vs 图底 1770 */
  width: calc(45.8 * var(--dp));                     /* 154px */
  height: calc(20.23 * var(--dp));                   /* 68px */
  line-height: calc(20.23 * var(--dp));
  text-align: center;
  background: #fb3030;
  color: #fff;
  font-size: calc(12 * var(--dp));
  border-radius: 0 calc(5.95 * var(--dp)) 0 0;
}
/* 配图右侧红色"上传数据图"方块：234×238，左缘 x=931（图右缘 656 → 间距 275px） */
.v2-step__up {
  flex: none;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: calc(8.03 * var(--dp));                       /* 图标底 1180 → 文字顶 1207 = 27px */
  margin-left: auto;                 /* 同上：原生右对齐，不写死 calc(81.78 * var(--dp)) */
  width: calc(69.59 * var(--dp));                    /* 234px */
  height: calc(70.78 * var(--dp));                   /* 238px */
  padding: 0;
  border: 0;
  border-radius: calc(3.27 * var(--dp));             /* ≈11px */
  background: #ff4040;
  color: #fff;
  font-size: calc(12 * var(--dp));                   /* 文字墨高 38px */
  font-weight: 700;
  cursor: pointer;
}
.v2-step__upicon {
  display: block;
  width: calc(36.28 * var(--dp));                    /* 122px */
  height: calc(29.14 * var(--dp));                   /* 98px */
}
.v2-step__uptxt {
  display: block;
  line-height: 1;
  white-space: nowrap;
}

/* ty=2 扫码步骤：黑底占位 + 右侧两枚按钮 */
.v2-step__row--qr {
  align-items: flex-start;           /* 真机：按钮列顶对齐黑框，不居中 */
}
.v2-step__qr {
  flex: none;
  position: relative;
  width: calc(170.1 * var(--dp));                    /* 572px */
  height: calc(170.1 * var(--dp));                   /* 572px 正方形 */
  background: #000;
  color: #fff;
  font-size: calc(13.38 * var(--dp));                /* 文字墨高 43px */
  display: flex;
  align-items: center;
  justify-content: center;
}
.v2-step__qr i {
  font-style: normal;
}
.v2-step__qracts {
  flex: none;
  display: flex;
  flex-direction: column;
  gap: calc(10.11 * var(--dp));                      /* 2253 → 2287 = 34px */
  margin-left: auto;                 /* 原写死 calc(88.33 * var(--dp))（calc(428 * var(--dp)) 屏的固定间距），calc(360 * var(--dp)) 屏会顶出屏幕；
                                        原生是右对齐约束，用 auto 推到右边缘 */
  margin-top: calc(14.87 * var(--dp));               /* 按钮顶 2153 = 黑框顶 2103 + 50px */
}
.v2-step__qrbtn {
  width: calc(120.15 * var(--dp));                   /* 404px */
  height: calc(29.74 * var(--dp));                   /* 100px */
  border: 0;
  border-radius: calc(2.68 * var(--dp));             /* ≈9px */
  background: #ff4040;
  color: #fff;
  font-size: calc(14.28 * var(--dp));                /* 文字墨高 46-47px */
  font-weight: 400;
  cursor: pointer;
}
.v2-step__qrbtn--ghost {
  background: #ffecec;
  color: #ff4040;
}

/* ---------------- 标题栏 ---------------- */

.v2-nav {
  /* 桌面浏览器下 #app 是居中的 430px 手机列，fixed 元素不跟着收窄，
     否则会铺满整个窗口形成一条横贯全屏的红带。这里夹回列宽并居中。 */
  position: fixed;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: min(100%, 430px);
  height: calc(74.94 * var(--dp));                   /* 252px */
  padding-top: calc(24.98 * var(--dp));              /* calc(25 * var(--dp)) */
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
  z-index: 20;
}
.v2.is-scrolled .v2-nav {
  background: #ff4040;               /* 滚动后原生标题栏变实心红 */
}
.v2-nav__title {
  font-size: calc(18 * var(--dp));
  font-weight: 700;
  color: #fff;
  line-height: calc(24.39 * var(--dp));              /* 82px */
  letter-spacing: 0;
}
.v2-nav__back,
.v2-nav__menu {
  position: absolute;
  padding: 0;
  border: 0;
  background: none;
  pointer-events: auto;
  cursor: pointer;
}
.v2-nav__back {
  left: calc(10.41 * var(--dp));                     /* 35px */
  top: calc(41.34 * var(--dp));                      /* 139px */
  width: calc(9.22 * var(--dp));                     /* 31px */
  height: calc(16.65 * var(--dp));                   /* 56px */
}
.v2-nav__menu {
  right: calc(14.57 * var(--dp));                    /* 1391 → 1440 是 49px */
  top: calc(43.43 * var(--dp));                      /* 146px */
  width: calc(15.76 * var(--dp));                    /* 53px */
  height: calc(12.79 * var(--dp));                   /* 43px */
}
.v2-nav__back img,
.v2-nav__menu img { display: block; width: 100%; height: 100%; }

/* ---------------- 吸底栏 ---------------- */

.v2-bar {
  position: fixed;
  left: 50%;
  transform: translateX(-50%);
  bottom: 0;
  width: min(100%, 430px);
  height: calc(59.96 * var(--dp));                   /* 202px */
  padding: calc(8 * var(--dp)) calc(10 * var(--dp));
  background: #fff;
  box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.045);  /* 真机 2858..2863 投影渐变 */
  display: flex;
  z-index: 20;
}

.v2-bar__swap {
  width: calc(110.04 * var(--dp));                   /* 370px */
  border: 0;
  background: none;
  padding: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  color: #666;
}
.v2-bar__swap img {
  display: block;
  width: calc(19 * var(--dp));                       /* 64px */
  height: calc(18.7 * var(--dp));                    /* 63px */
}
.v2-bar__swap span {
  font-size: calc(15.5 * var(--dp));                 /* APK 16sp bold（detail-2 底部实测字高 26px ≈ calc(15.5 * var(--dp))） */
  font-weight: 700;
  line-height: calc(19 * var(--dp));                 /* 64px */
  margin-top: calc(0.6 * var(--dp));
}

.v2-bar__apply {
  flex: 1 1 auto;
  border: 0;
  border-radius: calc(8 * var(--dp));
  background: #ff4040;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  font-family: inherit;
}
.v2-bar__apply img {
  display: block;
  width: calc(21.99 * var(--dp));                    /* 74px */
  height: calc(21.11 * var(--dp));                   /* 71px */
  margin-right: calc(5.35 * var(--dp));              /* 18px */
}
.v2-bar__apply span {
  font-size: calc(21.5 * var(--dp));
  line-height: calc(23.5 * var(--dp));
}
