/* ============================================================
   打卡有数 · 萌猫数据榜单
   自托管版设计语言。奶油白底、阳光黄主色，大圆角卡片 + 极轻阴影，
   胶囊按钮，数字用黑色粗体压住版面，排行用奖牌，空状态配猫咪和鼓励语。

   说明：这一版不再是小程序 wxss 的机器转换。类名保持不变（页面结构不动），
   但取值整套重写，所以自托管版和小程序现在是两套外观，这是有意为之。
   ============================================================ */

:root{
  /* 圆头字体。西文/数字走 Baloo 2（有真字重），汉字自动落到阿里健康体。
     两套字体文件都在 public/fonts/ 里随包发布，断网也能用。 */
  --font: 'Baloo 2','AlibabaHealthFont',-apple-system,BlinkMacSystemFont,
          "PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;

  /* ---- 底色 ---- */
  --cream:      #fffaf0;   /* 页面奶油白 */
  --cream-deep: #fff3d9;   /* 稍深一档，用于分区 */
  --card:       #ffffff;

  /* ---- 主色：阳光黄 ---- */
  --sun:        #ffc22e;
  --sun-deep:   #ffab00;
  --sun-soft:   #fff4d1;
  --sun-line:   #ffe4a0;

  /* ---- 辅助色 ---- */
  --sky:        #4d9df7;   --sky-soft:   #e6f1ff;
  --coral:      #ff7a45;   --coral-soft: #ffece2;
  --green:      #34c07a;   --green-soft: #e3f8ee;
  --pink:       #ff8fab;   --pink-soft:  #ffeef3;

  /* ---- 文字 ---- */
  --ink:        #2b2b2b;   /* 标题与数字 */
  --ink-2:      #5a5a5a;   /* 正文 */
  --ink-3:      #9b9b9b;   /* 次要说明 */
  --ink-4:      #c2c2c2;   /* 占位 */

  /* ---- 形状 ---- */
  --r-card:     18px;
  --r-inner:    14px;
  --r-pill:     999px;
  --shadow:     0 4px 16px rgba(255,178,54,.10);
  --shadow-up:  0 -3px 14px rgba(255,178,54,.10);
  --hairline:   1px solid #f4ece0;

  --tabbar-h:   58px;
  --tabbar-safe: calc(58px + env(safe-area-inset-bottom));
}

[hidden]{display:none!important}

*{scrollbar-width:none;-ms-overflow-style:none;box-sizing:border-box}
*::-webkit-scrollbar{width:0;height:0;display:none}

html{
  background:var(--cream-deep);
  touch-action:pan-x pan-y;
  -webkit-text-size-adjust:100%;text-size-adjust:100%;
  -webkit-tap-highlight-color:transparent;
}
html,body{height:100%;overflow:hidden}
body{
  margin:0;padding:0;line-height:1.6;
  background:var(--cream);
  font-size:14px;color:var(--ink-2);
  font-family:var(--font);
  -webkit-font-smoothing:antialiased;
  touch-action:pan-x pan-y;
  /* 阿里健康体这一份是单字重，让浏览器合成粗体会糊成一团。
     关掉合成：汉字始终用它本来的圆头粗度，层级靠字号和颜色拉开；
     数字和西文走 Baloo 2，那套有真的 700/800，加粗是真加粗。 */
  font-synthesis-weight:none;
  -webkit-font-synthesis:none;
}
/* 表单控件默认不继承字体，要单独指一次，否则输入框里会变回系统黑体 */
input,textarea,select,button{font-family:var(--font)}

/* ============ 外壳：顶栏 + 可滚内容 + 标签栏 ============ */

#shell{
  max-width:480px;margin:0 auto;
  height:100vh;height:100dvh;
  display:flex;flex-direction:column;
  background:var(--cream);position:relative;overflow:hidden;
  box-shadow:0 0 40px rgba(255,178,54,.13);
}
#app{
  flex:1 1 auto;min-height:0;
  overflow-y:auto;overflow-x:hidden;
  -webkit-overflow-scrolling:touch;overscroll-behavior:contain;
}

.navbar{
  flex:0 0 auto;z-index:40;height:50px;
  background:var(--cream);
  display:flex;align-items:center;padding:0 6px;
  border-bottom:var(--hairline);
}
.navbar .back{
  width:38px;height:38px;border:none;background:none;cursor:pointer;
  font-size:24px;color:var(--ink);line-height:1;padding:0;font-family:inherit;
}
.navbar .title{
  position:absolute;left:0;right:0;text-align:center;
  font-size:16.5px;font-weight:800;color:var(--ink);pointer-events:none;
}
.navbar .act{
  margin-left:auto;z-index:1;border:none;background:var(--sun-soft);cursor:pointer;
  font-size:12.5px;color:var(--sun-deep);font-weight:700;
  padding:6px 12px;border-radius:var(--r-pill);font-family:inherit;
}

/* 底部标签栏：图标 + 文字，图标取自品牌素材 */
.tabbar{
  flex:0 0 auto;z-index:40;
  background:var(--card);border-top:var(--hairline);
  display:flex;padding-bottom:env(safe-area-inset-bottom);
}
.tabbar a{
  flex:1;text-align:center;height:var(--tabbar-h);position:relative;z-index:0;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  font-size:11.5px;color:var(--ink-3);text-decoration:none;font-weight:600;
}
/* 选中态用图标后面的柔和黄色胶囊来表示。
   不要给未选中的图标加 grayscale —— 这套素材是彩色 3D 渲染，灰度化之后发脏。 */
.tabbar a::after{
  content:"";position:absolute;top:5px;left:50%;transform:translateX(-50%);z-index:-1;
  width:44px;height:30px;border-radius:var(--r-pill);background:transparent;
}
.tabbar a::before{
  content:"";width:25px;height:25px;
  background-size:contain;background-repeat:no-repeat;background-position:center;
  opacity:.55;transition:none;
}
/* 图标由 app.js 通过 --ic 变量注入，标签栏是按身份动态生成的 */
.tabbar a::before{background-image:var(--ic)}
/* 五项的时候一格只有 20% 宽，字号和胶囊都要收一点 */
.tabbar.t5 a{font-size:10.5px}
.tabbar.t5 a::before{width:23px;height:23px}
.tabbar.t5 a::after{width:38px;height:28px}
.tabbar a.on{color:var(--sun-deep);font-weight:800}
.tabbar a.on::after{background:var(--sun-soft)}
.tabbar a.on::before{opacity:1}

/* ============ 容器与卡片 ============ */

.container{padding:12px;box-sizing:border-box}
.card{
  background:var(--card);
  border-radius:var(--r-card);
  padding:15px;margin-bottom:12px;
  box-shadow:var(--shadow);
}
.card-title{
  font-size:15.5px;font-weight:800;color:var(--ink);
  margin-bottom:11px;display:flex;align-items:center;justify-content:space-between;gap:8px;
}
/* 标题右边那句附注：**标题优先**。
   附注长了就让它自己换行、自己缩，绝不能把左边的标题挤成两行 ——
   「3. 打卡凭证」被挤成「3. 打卡凭 / 证」是这条规则没写时的真实样子。 */
.card-title .muted{font-weight:500;text-align:right;font-size:11.5px;min-width:0}
.card-title > span:first-child{flex:none}

.row{display:flex;align-items:center}
.row-between{display:flex;align-items:center;justify-content:space-between}
.column{display:flex;flex-direction:column}
.divider{height:1px;background:#f4ece0;margin:11px 0;border:none}

.muted{color:var(--ink-3);font-size:12px}
.hint,.hint-line{font-size:11.5px;color:var(--ink-3);line-height:1.7;margin:-2px 0 10px}
.notice{color:var(--ink-3);font-size:12px}

/* 空状态：猫咪 + 鼓励语 */
.empty{
  text-align:center;color:var(--ink-3);font-size:13px;
  padding:26px 20px 30px;line-height:1.8;
}
.empty::before{
  content:"";display:block;width:96px;height:96px;margin:0 auto 6px;
  background:url(/art/cat-wink.png) center/contain no-repeat;
}

/* ============ 文字与数字 ============ */

.title{font-size:19px;font-weight:800;color:var(--ink)}
.desc{font-size:13px;color:var(--ink-3);line-height:1.8}
.version{text-align:center;color:var(--ink-4);font-size:11px;padding:6px 0 4px}

/* 数据格子：数字是主角，黑色粗体 */
.grid{display:flex;flex-wrap:wrap;margin:-4px}
.grid-item{width:25%;padding:4px;box-sizing:border-box}
.stat-tile{
  background:var(--sun-soft);border-radius:var(--r-inner);
  padding:11px 6px;text-align:center;
}
.stat-num{font-size:20px;font-weight:900;color:var(--ink);letter-spacing:-.5px}
.stat-label{font-size:11px;color:var(--ink-3);margin-top:3px;font-weight:600}
.grid-item:nth-child(4n+2) .stat-tile{background:var(--sky-soft)}
.grid-item:nth-child(4n+3) .stat-tile{background:var(--green-soft)}
.grid-item:nth-child(4n+4) .stat-tile{background:var(--pink-soft)}

/* ============ 按钮：胶囊 ============ */

button{padding:0;margin:0;border:none;line-height:normal;background:none;font-family:inherit}
button::after{border:none;border-radius:0;content:none}

.btn{
  display:flex;align-items:center;justify-content:center;gap:6px;
  height:46px;min-height:46px;line-height:1;padding:0 16px;margin:0;
  border-radius:var(--r-pill);text-align:center;
  font-size:15px;font-weight:800;box-sizing:border-box;white-space:nowrap;
  font-family:inherit;cursor:pointer;
}
.btn-primary{
  background:linear-gradient(180deg,var(--sun) 0%,var(--sun-deep) 100%);
  color:#4a3200;box-shadow:0 4px 12px rgba(255,171,0,.32);
}
.btn-plain{background:var(--card);color:var(--sun-deep);border:1.5px solid var(--sun-line)}
.btn-gray{background:#f3efe6;color:var(--ink-2)}
/* 「限制账号 / 停用账号 / 暂停这个号」这一类。
   这些动作会让一个人当场登不进来，或者让一个号从所有人的列表里消失 ——
   在一排米白按钮里长得跟「编辑资料」一模一样，是迟早要点错的。
   所以给它自己一档颜色：珊瑚红实心，跟主按钮的黄一样醒目，但一眼就知道不是一路的。
   **不配图标**：小锁、暂停这些符号在 46px 的按钮里只有十几像素，
   既认不出来又把字挤窄，颜色本身已经把话说完了。 */
.btn-danger{
  background:linear-gradient(180deg,#ff8a5c 0%,var(--coral) 100%);
  color:#fff;box-shadow:0 4px 12px rgba(255,122,69,.34);
}
.btn-danger:active{transform:scale(.98)}
.btn[disabled]{opacity:.5}
.btn-sm{height:32px;min-height:32px;padding:0 14px;font-size:13px;display:inline-flex}
button.btn{width:100%}
.full{width:100%}
.mt20{margin-top:14px}
.mt24{margin-top:16px}

.quick-row{display:flex;gap:10px;margin-top:10px}
.quick-btn{
  flex:1;background:var(--sun-soft);border-radius:var(--r-inner);
  padding:10px 8px;text-align:center;font-size:13px;font-weight:700;color:var(--ink);
}
/* 按键（或一整行按键）与紧随其后的说明文字、内容之间统一留出 10px。
   说明文字自带的 margin-top 为 6px（.mt8）或 -2px（.hint），贴在按键下方显得拥挤。 */
:is(.btn, .btn-row, .quick-row, .blogger-picks, .dialog-btns) + :is(.muted, .hint, .hint-line, .bdl-g, .bdl-acc){margin-top:10px}

/* ============ 标签 ============ */

/* ---- 药丸里的文字和图标怎么摆到视觉中线上 ----

   这套字体（Baloo 2 + 阿里健康体）的行盒下方给西文的降部（g p y 那一截）
   留了空间，而中文字形根本没有降部 —— 于是「行盒居中」和「看得见的字居中」
   差了一截。实测：11px 的标签在 23.6px 的药丸里，墨迹偏上 **1.9px**。

   光把 padding 写成上下对称是修不好的：对称的是行盒，不是字。
   两件事一起做才行：
     line-height:1      把行盒收到跟字号一样高
     上下 padding 差 D   把剩下的那点压回视觉中线（内容盒整体下移 D/2）

   **D 补多少必须一个字号一个字号地量，不能按比例推。**
   浏览器把字体的 ascent/descent 按像素取整之后再用，取整余数每个字号都不一样，
   所以「墨迹中心离行盒中心多远」（记作 k）是锯齿状的，不是一条直线。
   拿「国」字（墨迹正好是表意字框，上下对称）在 DPR 2/3/8 各量一遍，三档一致：

       字号   10.5    11    11.5     12    12.5     13   13.5     14     15
       k     -0.89 -0.79  -1.26  -0.16  -0.51  +0.48  +0.22  +0.16  -0.72

   要墨迹落在几何中线上，就要 D/2 = −k，即 **D = −2k**：
       11px → D=2   11.5px → D=3   12.5px → D=1   13px → D=−1（下边反而要多留）
   13px 那档 k 是正的，字本来就偏下，再往下压就成了 ev-close 以前偏 1.6px 的样子。
   改字体、改字号之后这张表全部作废，要用 scratchpad 里那套 8 倍图重新量。

   **图标分两种，行为不一样：**
     · background-image 画的（tag-* 那几枚符号）：background-position 的 center
       认的是 padding box 的中心，上下 padding 不等也不影响，不用补。
     · ::before 画的（ic-f 那几枚）：它是 flex 子项，align-items:center 认的是
       **内容盒**的中心，而内容盒已经被不对称的 padding 往下推了 D/2 ——
       于是文字居中了、图却低了 D/2。所以这一类要 margin-top:−D 原样补回来。 */
.tag{
  display:inline-flex;align-items:center;line-height:1;
  padding:7px 9px 5px;border-radius:var(--r-pill);
  font-size:11px;font-weight:700;margin-right:6px;white-space:nowrap;
  vertical-align:middle;
}
/* 各类状态各缀一个 13px 的符号：不用读完那几个字就知道是好是坏。
   位置用 background-position 定，认的是 padding box 的中心，
   所以上面那套「上下 padding 差 D」的居中修法不会把符号带歪。 */
.tag-draft,.tag-pending,.tag-submitted,.tag-approved,.tag-rejected,
.tag-off,.tag-warn,.tag-link,.tag-count,.tag-who{
  padding-left:23px;
  background-repeat:no-repeat;background-position:5px center;background-size:13px 13px;
}
/* 「草稿」和「待审核」共用沙漏和黄底 —— 它们从来不会出现在同一张列表里
   （一个说的是打卡记录、一个说的是账号），但**必须是两个类名**：
   待审核以前跟「已拒绝」共用红叉，改回来之后要有个地方钉住
   「待审核不是被拒绝」这件事，自测查的就是这个类名。

   **沙漏用 st-wait，不是 s-pending。** 这两张都是正式素材，分工不同：
   st-* 是一套简笔符号，专给 13px 的徽章用 —— 那个尺寸上，立体、带高光、
   有三四种颜色的图会糊成一团，认不出是什么；s-* 是一套立体图标，
   给几十像素的大位置用（色卡、标题、状态页）。
   v2.28.0 把徽章换成了 s-pending，是把两套的分工弄混了，这一版改回来。 */
.tag-pending  {background-color:var(--sun-soft);  color:#b07800;
               background-image:url(/art/st-wait.png)}
/* v2.32.1：「草稿」改用铅笔 st-draft —— 草稿是本人尚未写完、尚未提交，
   不是在等待他人处理；沙漏只留给「待审核」「抽检待复核」这类等待中的状态。 */
.tag-draft    {background-color:var(--sun-soft);  color:#b07800;
               background-image:url(/art/st-draft.png)}
/* 「已提交」是这条打卡已经交上去了 —— 事情办完了，不是还在等。
   沙漏留给真正还没落定的「草稿」。 */
.tag-submitted{background-color:var(--sky-soft);  color:#2273cf;
               background-image:url(/art/st-ok.png)}
.tag-approved {background-color:var(--green-soft);color:#1d8f58;
               background-image:url(/art/st-ok.png)}
.tag-rejected {background-color:var(--coral-soft);color:#e0552a;
               background-image:url(/art/st-no.png)}
/* 「未签约」「没人可见」「凭证已清理」这类以前一律套 tag-rejected，
   于是屏幕上到处是红叉 —— 可它们没有一个是「被拒绝」：
   都是「还差一步，去补上」。单开一档黄色警示，红叉留给真的被否掉的事。 */
.tag-warn    {background-color:var(--sun-soft);   color:#b07800;
              background-image:url(/art/st-warn.png)}
/* 「免登录」是一条打卡的来路，不是状态好坏，所以用中性的链条 */
.tag-link    {background-color:var(--sky-soft);   color:#2273cf;
              background-image:url(/art/st-link.png)}
/* 两档**中性信息**，都是蓝的（蓝在这套里专指「只是告诉你一件事，没有好坏」）：
   · 计数 —— 「3 个凭证」。以前缀红叉，0 个的时候读起来像凭证被否了。
   · 谁 —— 「XX 建的」「申请小助理」。以前一个缀沙漏、一个缀黄三角，
     可它们说的是**人**，跟等待、警告都没关系。 */
.tag-count   {background-color:var(--sky-soft);   color:#2273cf;
              background-image:url(/art/st-image.png)}
.tag-who     {background-color:var(--sky-soft);   color:#2273cf;
              background-image:url(/art/st-user.png)}
.tag-right{margin-left:auto;display:flex;align-items:center;flex-shrink:0}
.tag-right .tag{margin-right:0;margin-left:6px}
.tag-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}
.role-tag{
  display:inline-flex;align-items:center;line-height:1;
  padding:7px 10px 5px;border-radius:var(--r-pill);
  background:var(--sun);color:#4a3200;font-size:11px;font-weight:800;
  vertical-align:middle;
}

/* ============ 表单 ============ */

/* 这条 reset 必须保持「一个元素选择器」的权重（0,0,1）。
   上一版为了排除勾选框写成 input:not([type=checkbox]):not([type=radio])，
   权重涨到 (0,2,1)，反而压过了 .search-input / .dialog-input / .textarea 这些
   只有一个类名（0,1,0）的规则 —— 它们的 border 和 background 被这里的 none 覆盖掉，
   搜索框直接变成透明的，界面上就「不见了」。
   勾选框改在下面用 input[type="checkbox"]（0,1,1）单独盖回来，天然赢过这一条。 */
input,select,textarea{
  font:inherit;color:inherit;border:none;background:none;outline:none;
  border-radius:0;-webkit-appearance:none;appearance:none;
}
/* 多行输入框一律**不给拖拽手柄**。
   右下角那个小三角是浏览器默认送的，拖一下就能把框拉成整屏那么高、
   或者拉出卡片边界盖住下面的按钮 —— 这套界面每个框的高度都是按版式定好的，
   让人能随手拉坏它没有任何好处。高度不够的地方我们自己把 min-height 调大。 */
textarea{resize:none}

/* ---- 勾选框 ----
   不用系统默认那个，各个浏览器长得都不一样，跟这套圆头圆脑的界面也不搭。
   自己画一个圆角方块，勾用两条边框转 45° 拼出来，不需要额外的图片素材。 */
input[type="checkbox"]{
  -webkit-appearance:none;appearance:none;
  position:relative;flex-shrink:0;box-sizing:border-box;
  width:22px;height:22px;margin:0;cursor:pointer;
  border:2px solid #ddd4c4;border-radius:7px;background:#fff;
  transition:background .14s,border-color .14s;
}
/* 勾的位置用**百分比**定，不用像素。
   以前写死的是 left:6px/top:2px/5×10px，在 22px 的框里勉强对得上；
   可是 .chk-line 里的勾选框只有 17px（内框 13×13），
   那个勾从 left:6 一直画到 13.5、从 top:2 画到 14.5 ——
   右边和下边直接戳出框外，看着就是「勾没打在框里」。
   改成百分比 + translate 居中之后，框做多大勾都跟着缩放，不会再出这种事。
   位移里那两个数不是 50%：勾是个旋转过的 L 形，
   几何中心和看上去的中心差一点，-50%/-58% 是照着渲染结果调的。 */
input[type="checkbox"]::after{
  content:"";position:absolute;left:50%;top:50%;
  width:26%;height:52%;
  border:solid #fff;border-width:0 2.5px 2.5px 0;
  transform:translate(-50%,-58%) rotate(42deg) scale(.5);
  opacity:0;
  transition:transform .14s,opacity .14s;
}
input[type="checkbox"]:checked{background:var(--sun);border-color:var(--sun)}
input[type="checkbox"]:checked::after{
  transform:translate(-50%,-58%) rotate(42deg) scale(1);opacity:1;
}
input[type="checkbox"]:disabled{opacity:.45;cursor:default}
input[type="checkbox"]:focus-visible{outline:2px solid var(--sun-deep);outline-offset:2px}

/* 数字框右边那对上下小箭头。新版 Chrome 里光给 input 设 appearance:none 已经关不掉了，
   得单独关这个伪元素 —— 它会占掉十几像素，把窄行里的「名」「元」挤出去。 */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
input[type="number"]{-moz-appearance:textfield;appearance:textfield}
.form-item{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:12px 0;border-bottom:var(--hairline);
}
.form-item:last-child{border-bottom:none}
/* 上下排列的一项（标签在上、多行输入框在下）：标签与其他项一样左对齐，输入框占满整行 */
.form-item.column{flex-direction:column;align-items:stretch;gap:8px}
.form-label{color:var(--ink-2);flex-shrink:0;font-weight:600}
.form-value{flex:1;text-align:right;color:var(--ink)}
.input{flex:1;text-align:right;font-size:14px;color:var(--ink);min-width:0}
.input::placeholder{color:var(--ink-4)}
select.input,select.pick-sel{text-align:right;direction:rtl}
select.input option{direction:ltr}
.textarea{
  width:100%;min-height:76px;background:var(--cream);
  border-radius:var(--r-inner);padding:11px;box-sizing:border-box;
  font-size:14px;margin-top:6px;display:block;color:var(--ink);
  border:1px solid #f2e8d8;
}
.picker-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:15px}
.pick-sel{flex:1;text-align:right;font-size:14px;color:var(--ink)}
.req{color:var(--coral);font-style:normal;font-size:11px;font-weight:700;margin:0 3px 0 5px;vertical-align:1px;letter-spacing:0;white-space:nowrap}
.req-legend{font-size:11.5px;color:var(--ink-3);margin:-2px 0 10px 2px;line-height:1.6}

/* ============ 提示条 ============ */

.tips,.notice-card,.setup-tip,.review-tip,.rank-intro{
  border-radius:var(--r-card);padding:12px 14px;
  font-size:12.5px;line-height:1.8;
}
.tips{background:var(--sun-soft);color:#8a6412;box-shadow:none;margin-bottom:12px}
.tips b{color:#7a5400}
.notice-card{background:var(--sky-soft);color:#2f6ea8;margin-bottom:12px}
.notice-card b{color:#215a8d}
.setup-tip{background:var(--coral-soft);color:#c2532a;margin-bottom:12px;font-weight:600}
.review-tip{background:var(--sun-soft);color:#8a6412;margin-top:12px}

/* ---- 注册页的「归属」小节 ----
   这一段是选填的，跟上面那几行必填的不是一回事，所以拿一条浅槽单独框起来。
   不框的话它会跟「申请备注」黏成一片，让人以为编号也是必须填的。 */
.reg-codes{
  margin-top:14px;padding:4px 12px 10px;
  border-radius:var(--r-inner);background:#faf7f1;
}
.reg-codes-h{
  font-size:12px;font-weight:800;color:var(--ink-3);
  padding:10px 0 2px;
}
.reg-codes .form-item:last-of-type{border-bottom:none}
.reg-codes-tip{
  font-size:11.5px;color:var(--ink-3);line-height:1.8;font-weight:600;margin-top:8px;
}
.reg-codes-tip b{color:var(--sun-deep)}
.rank-intro{background:var(--pink-soft);color:#c2537a;margin-bottom:12px}
.rank-intro b{color:#a83f63}

/* 排行榜说明条右下角放个领奖台，点一下题就够了，不抢文字 */
.rank-intro{position:relative;padding-right:74px;overflow:hidden}
/* t-podium 是横的（约 2:1），框也跟着改成横的 —— 还用 62×62 的方框的话，
   contain 会把它缩成一根 28px 高的细条。 */
.rank-intro::after{
  content:"";position:absolute;right:8px;bottom:8px;width:60px;height:32px;
  opacity:.9;pointer-events:none;
  background:url(/art/t-podium.png) center/contain no-repeat;
}

/* 博主的打卡说明：左边挂个小铃铛，一眼看出是「这个博主对你说的话」 */
.blogger-notice{
  background:linear-gradient(135deg,var(--sun-soft),#fff8e6);
  border-radius:var(--r-card);padding:13px 15px 13px 14px;margin-bottom:12px;
  border-left:4px solid var(--sun);
}
.bn-title{
  font-size:13.5px;font-weight:800;color:#8a6412;margin-bottom:5px;
  /* 打卡说明是一则说明，用公告图 t-notice；铃铛留给「消息提醒」（v2.37.16） */
  padding-left:26px;background:url(/art/t-notice.png) left center/20px 20px no-repeat;
}
.bn-body{font-size:12.5px;color:#8a6412;line-height:1.8;white-space:pre-wrap;word-break:break-word}

/* ============ 列表与菜单 ============ */

.list-item{
  background:var(--card);border-radius:var(--r-card);
  padding:13px;margin-bottom:10px;box-shadow:var(--shadow);
}
.list-head{display:flex;align-items:center;gap:6px}
.list-name{font-size:15px;font-weight:800;color:var(--ink)}
.list-ops{
  display:flex;flex-wrap:wrap;gap:16px;
  margin-top:10px;padding-top:9px;border-top:var(--hairline);
}
.list-ops .op-link{margin-right:0}
.op-link{font-size:12.5px;color:var(--sky);font-weight:700;cursor:pointer}
.op-link.danger{color:var(--coral)}
.op-link.gray{color:var(--ink-3)}

.menu-item,.menu-line{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:13px 0;border-bottom:var(--hairline);font-weight:600;color:var(--ink);
}
.menu-item:last-child,.menu-line:last-child{border-bottom:none}
/* 列表行里「名字 + 一两个标签」的那种写法：名字是一段纯文本，标签是 inline-flex，
   两者之间没有任何间隙 —— 名字最后一个字直接顶在药丸的左边缘上，挤成一团。
   .tag 自带的 margin-right 只管右边，管不到这一侧，所以这里补左边距。
   （.list-head / .tag-row / .record-actions 那几处是 flex + gap，本来就有间隙。） */
.menu-line > span > .tag,.menu-line > span > .ucode{margin-left:6px}
.menu-item .muted,.menu-line .muted{font-weight:500}

.acc-list{display:flex;flex-direction:column}
.acc-line{
  display:flex;align-items:center;justify-content:space-between;
  padding:9px 0;border-bottom:var(--hairline);font-size:13px;
}
.bacc{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:9px 0;border-bottom:var(--hairline);
}
.bacc:last-child{border-bottom:none}
.bacc-name{font-size:13.5px;color:var(--ink);font-weight:600}
.bacc-num{font-size:16px;font-weight:900;color:var(--sun-deep)}

/* ============ 筛选条 / 分段 / 页签 ============ */

.filter-bar,.range-bar{display:flex;overflow-x:auto;margin-bottom:10px;gap:7px;padding-bottom:2px}
.filter-chip,.range-chip{
  flex-shrink:0;padding:6px 14px;background:var(--card);
  border-radius:var(--r-pill);font-size:12.5px;color:var(--ink-2);
  font-weight:700;box-shadow:0 1px 5px rgba(255,178,54,.08);cursor:pointer;
}
.filter-chip.active,.range-chip.active{
  background:var(--sun);color:#4a3200;box-shadow:0 3px 9px rgba(255,171,0,.3);
}

/* ---- 打卡项目那五个药丸前面的小图 ----
   点赞 / 收藏 / 点好 / 评论 / 转发，哪个是哪个，扫一眼图比读两个字快。
   由 app.js 按项目的 key 发下来（不是按名字 —— 名字超管可以改）。
   新增的项目没有对应素材，拿不到 --ic，这里的 ::before 就不画，
   药丸退回纯文字，不会出现一个空方块。 */
.filter-chip.ic-f,.qact.ic-f,.action-pill.ic-f{
  display:inline-flex;align-items:center;gap:5px;
}
.filter-chip.ic-f::before,.qact.ic-f::before,.action-pill.ic-f::before{
  content:"";width:15px;height:15px;flex-shrink:0;
  background:var(--ic) center/contain no-repeat;
}
/* 这枚图没有不对称 padding 要补（.qact 上下 padding 相等），
   但 13.5px 那档的字本身比行盒中心高半像素，图不跟着走就跟字错开半像素 ——
   所以这里补的是**字的位置**，不是 padding。 */
.qact.ic-f::before{width:17px;height:17px;margin-top:-1px}

.segs{
  display:flex;background:var(--card);border-radius:var(--r-pill);
  padding:4px;margin-bottom:12px;box-shadow:var(--shadow);gap:2px;
}
.seg{
  flex:1;text-align:center;padding:8px 4px;border-radius:var(--r-pill);
  font-size:13px;color:var(--ink-3);font-weight:700;cursor:pointer;white-space:nowrap;
}
.seg.on{background:var(--sun-soft);color:var(--sun-deep);font-weight:800}

.tabs{
  display:flex;background:var(--card);border-radius:var(--r-pill);
  padding:4px;margin-bottom:12px;box-shadow:var(--shadow);
}
.tab{
  flex:1;text-align:center;padding:9px 4px;border-radius:var(--r-pill);
  font-size:14px;color:var(--ink-3);font-weight:700;cursor:pointer;
}
.tab.active{background:var(--sun-soft);color:var(--sun-deep);font-weight:800}

/* 统计筛选面板 */
.flt{background:var(--card);border-radius:var(--r-card);padding:3px 15px;margin-bottom:12px;box-shadow:var(--shadow)}

/* ============ 排行榜：奖牌 + 皇冠 ============ */

.rank{display:flex;align-items:center;gap:11px;padding:10px 0;border-bottom:var(--hairline)}
.rank:last-child{border-bottom:none}
.rk{
  width:34px;height:34px;flex-shrink:0;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:14px;font-weight:900;
  background:#f3efe6;color:var(--ink-3);
}
/* 第四名起用底盘素材，数字写在盘心。盘子本身是正圆且居中，
   所以 flex 居中出来的数字就正落在中央，不用另外微调。 */
.rk-normal{
  background:url(/art/rank-plate.png) center/contain no-repeat;
  color:var(--ink-2);width:40px;height:40px;border-radius:0;
}
/* 前三名换成奖牌图，数字本身隐掉 */
.rk-1,.rk-2,.rk-3{
  background:center/contain no-repeat;color:transparent;
  width:40px;height:40px;border-radius:0;
}
.rk-1{background-image:url(/art/medal-1.png)}
.rk-2{background-image:url(/art/medal-2.png)}
.rk-3{background-image:url(/art/medal-3.png)}
.rank .info{flex:1;display:flex;flex-direction:column;min-width:0}
.rank-account{font-size:14px;font-weight:700;color:var(--ink)}
.rank .muted{font-size:11.5px;line-height:1.55}
.n2{font-size:19px;font-weight:900;color:var(--sun-deep);flex-shrink:0}

.bar-row{position:relative;height:38px;border-radius:var(--r-inner);background:var(--cream);margin-bottom:7px;overflow:hidden}
.bar-fill{position:absolute;left:0;top:0;bottom:0;background:var(--sun-soft)}
.bar-content{position:relative;height:38px;padding:0 13px;display:flex;align-items:center;justify-content:space-between}
.bar-name{font-size:12.5px;color:var(--ink-2);font-weight:600}
.bar-value{font-size:15px;font-weight:900;color:var(--sun-deep)}

.my-rank{background:var(--sun-soft)!important;border-radius:var(--r-inner)}
.my-rank-title{font-size:12px;color:#8a6412;font-weight:800;margin-bottom:6px}
.my-rank-row{display:flex;align-items:center;justify-content:space-between;padding:4px 0}
.my-rank-name{font-size:13px;color:var(--ink);font-weight:600}
.my-rank-num{font-size:16px;font-weight:900;color:var(--sun-deep)}
.merged{background:var(--cream);border-radius:var(--r-inner);padding:9px 11px}
.merged-title{font-size:11.5px;color:var(--ink-3);font-weight:700;margin-bottom:4px}
.merged-item{font-size:12.5px;color:var(--ink-2);padding:2px 0}
.group-name{font-size:14px;font-weight:800;color:var(--ink)}

/* ============ 打卡记录卡片 ============ */

.record{background:var(--card);border-radius:var(--r-card);padding:14px;margin-bottom:11px;box-shadow:var(--shadow)}
.record-head{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.record-blogger{display:flex;align-items:center;gap:7px;min-width:0}
/* 平台改用图标，不再拿一个色块写平台名 —— 每个平台自己的标志一眼就认出来，
   也不会因为平台多了几个而挤成一排颜色一样的小方块。
   图认不出来的时候，title / aria-label 里还写着平台名。 */
/* 平台名小标签（v2.31 起代替平台 logo，原因见 app.js 里 PLATFORM_STYLE 那段）。
   字色是各家 logo 的主色压深一档，底色是同色 9% 的淡底 —— 在浅底上对比度都过 3。
   上下 padding 3/2：11px 这一档字的墨迹偏上，照徽章那套量法补 1px。 */
.pf-tag{
  display:inline-block;flex-shrink:0;vertical-align:middle;
  font-size:11px;font-weight:800;line-height:1.35;letter-spacing:.2px;
  padding:3px 6px 2px;border-radius:6px;margin-right:6px;
  max-width:5.5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:#5a6b80;background:#eef0f2;
}
.pf-xhs   {color:#e8192f;background:#fde8ea}
.pf-douyin{color:#161823;background:#ececed;text-shadow:-.6px 0 #25f4ee,.6px 0 #fe2c55}
.pf-weibo {color:#d35f00;background:#fdf0e3}
.pf-bili  {color:#d93d6e;background:#fbecf0}
.list-head .pf-tag{margin-left:auto;margin-right:0}
/* v2.37.17：凡是标识平台的地方都用这枚徽章。
   .pf-in 跟在一行说明里（后面紧接文字，不再写「 · 」）；.pf-end 放在行尾或单独一格，不留外边距。
   徽章带 overflow:hidden（名字过长时省略），这种行内块的基线落在底边，必须用 middle 对齐，否则会整体上浮。 */
.pf-tag.pf-in{margin:0 6px 0 0;vertical-align:middle}
.pf-tag.pf-end{margin:0;vertical-align:middle}
/* v2.37.18：原在名字下方的徽章挪到名字右侧（.pf-nm）。在带 gap 的横排里不另加左边距 */
.pf-tag.pf-nm{margin:0 0 0 6px;vertical-align:middle;flex-shrink:0}
.list-head .pf-tag.pf-nm,.arow-t .pf-tag.pf-nm,.sheet-row .sr-t .pf-tag.pf-nm,.bpick-name .pf-tag.pf-nm{margin-left:0}
.bpick-name{display:flex;align-items:center;gap:6px;min-width:0}
.bpick-n{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bpick-name .pf-tag,.pick-sub .pf-tag,.lk-name .pf-tag,.arow-t .pf-tag{font-size:10.5px;padding:2px 5px 1px}
.lk-name .pf-tag + .pf-tag{margin-left:4px}
.menu-line > span > .pf-tag.pf-nm + .pf-tag.pf-nm{margin-left:4px}
.profile-name:has(.pf-nm){display:flex;align-items:center;gap:6px;min-width:0}
.profile-name .pf-tag.pf-nm{margin-left:0}
.fan-name .fan-pf{align-self:center}
.fd-chip.fd-pf{padding:4px 6px 3px}
.fd-chip.fd-pf .pf-tag{display:block}
.fd-chip.fd-pf.on{border-color:var(--sun-deep)}
/* 下拉框：收起时在选中文字右侧显示平台徽章（系统弹出的选项列表里画不了徽章，按平台分组） */
.pf-sel-w{position:relative;flex:1;min-width:0;display:flex;align-items:center}
.pf-sel-w > select{flex:1;min-width:0;width:100%}
.pf-sel-b{position:absolute;right:0;top:50%;transform:translateY(-50%);pointer-events:none;display:flex;align-items:center}
.pf-sel-b:empty{display:none}
select[data-pfonly].has-pf{color:transparent}
select[data-pfonly] option,select[data-pfonly] optgroup{color:var(--ink)}
.pf-sel-dlg{display:flex;margin-bottom:11px}
.pf-sel-dlg > .dialog-input{margin-bottom:0}
.pf-sel-dlg .pf-sel-b{left:13px;right:auto}

.blogger-name{font-size:15px;font-weight:800;color:var(--ink)}
/* 「用账号 XXX」这一行。原来跟 .acc-line 共用一条规则，于是白白继承了
   justify-content:space-between —— 那时候挂在这儿的「免登录」标签被推到了
   卡片最右边。现在那枚标签已经挪到第一行跟状态标签并排了，
   但这条规则仍旧要跟 .acc-line 分开写：这一行是卡片里的一句说明，
   不是「左边一项右边一项」的设置行，两端对齐对它没有意义。 */
.account-line{
  display:flex;align-items:center;flex-wrap:wrap;gap:6px;
  font-size:12px;color:var(--ink-3);margin-top:5px;border:none;padding:0;
}
.record-title{font-size:13.5px;color:var(--ink);margin-top:5px;font-weight:600}
.record-url{font-size:11.5px;color:var(--ink-3);margin-top:3px;word-break:break-all}
.record-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
/* 这一行里站着三种药丸：带小图的打卡项目、不带图的打卡项目（超管新加的项目
   没有对应素材）、还有末尾那枚「x 个凭证」标签。高度要是各自由内容撑出来，
   带图的被 15px 的图撑到 29px、不带图的只有 25.5px、标签又只有 23px。
   挤在同一行时上下居中看不出来，**一旦标签被挤到第二行单独站着，
   比上一行矮一截就很扎眼**。所以这一行里的药丸统一钉死一个高度，谁都不靠内容撑。 */
.record-actions .action-pill,.record-actions .tag{height:26px;box-sizing:border-box}
.record-actions .tag{margin-right:0}
.action-pill{
  display:inline-flex;align-items:center;line-height:1;
  background:var(--pink-soft);color:#c2537a;font-size:11.5px;font-weight:700;
  padding:4px 10px 1px;border-radius:var(--r-pill);   /* D=3：11.5px 那档要补 3 */
}
/* ::before 画的图标要把不对称 padding 带来的 D/2 补回来，见本文件开头那段说明 */
.action-pill.ic-f::before{margin-top:-3px}
.record-foot{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  margin-top:10px;padding-top:9px;border-top:var(--hairline);
}
.record-ops{display:flex;gap:14px}

/* ============ 凭证 ============ */

.evidence-grid{display:flex;flex-wrap:wrap;gap:8px;margin-top:9px}
.evidence-item,.evidence-add{
  width:82px;height:82px;border-radius:var(--r-inner);
  position:relative;overflow:hidden;display:block;flex-shrink:0;
}
/* 能点开看的缩略图才给手型；上传预览那几个（没有 data-evk）不点开 */
.evidence-item[data-evk]{cursor:pointer}
.evidence-item[data-evk]:focus-visible{outline:2px solid var(--sun-deep);outline-offset:2px}
.evidence-img,.evidence-item img,.evidence-item video{
  width:100%;height:100%;object-fit:cover;display:block;
}
.evidence-video{
  width:100%;height:100%;background:#3a3a3a;color:#fff;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
}
.video-icon{font-size:20px}
.video-text{font-size:11px}
.evidence-del{
  position:absolute;top:0;right:0;width:22px;height:22px;
  background:rgba(0,0,0,.55);color:#fff;font-size:14px;line-height:22px;
  text-align:center;border-bottom-left-radius:10px;cursor:pointer;
}
.evidence-add{
  background:var(--cream);border:1.5px dashed var(--sun-line);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  color:var(--sun-deep);cursor:pointer;
}
.add-plus{font-size:22px;font-weight:700;line-height:1}
.add-text{font-size:11px;font-weight:600}

/* ---- 凭证查看器 ----
   为什么不开新标签页：见 app.js 里 openEvidence 上面那段注释
   （PWA standalone 模式下没有地址栏，点开凭证就退不出来了）。

   高度用 dvh 不用 vh：Safari 的 100vh 算的是地址栏收起之后的高度，
   写 vh 的话底下那行提示会被工具条压住。dvh 不认的旧机器退回 vh。 */
body.no-scroll{overflow:hidden}

.ev-view{
  position:fixed;left:0;right:0;top:0;bottom:0;z-index:200;
  height:100vh;height:100dvh;
  /* 背景压到几乎不透明：留一点点底色是为了让人知道自己还在原来那一页上，
     但底下的字必须糊掉 —— 半透明遮罩下面还能读出「我的打卡记录」，
     眼睛会一直去对焦后面那层，凭证本身反而看不进去。 */
  background:rgba(18,13,3,.97);
  display:flex;flex-direction:column;
  animation:ev-in .16s ease-out;
}
@keyframes ev-in{from{opacity:0}to{opacity:1}}

.ev-bar{
  flex-shrink:0;display:flex;align-items:center;justify-content:space-between;
  padding:calc(11px + env(safe-area-inset-top)) 14px 11px;
}
.ev-n{font-size:13px;font-weight:700;color:#fff;opacity:.8}
/* 关闭做成药丸而不是一个光秃秃的 ×：
   手机上 × 的点击区域小得可怜，指头一盖上去就不知道有没有点中。
   它是 13px 那一档 —— 字本来就落在中线上（见本文件开头那张 k 表），D=0，
   上下 padding 不用差。以前照抄了 .tag 那档的 9/7，量出来偏低 1.6px。 */
.ev-close{
  display:inline-flex;align-items:center;line-height:1;
  padding:8px 15px;border:none;border-radius:var(--r-pill);
  background:rgba(255,255,255,.18);color:#fff;
  font-family:var(--font);font-size:13px;font-weight:700;cursor:pointer;
}
.ev-close:active{background:rgba(255,255,255,.32)}

/* min-height:0 是给 flex 子项解开默认的最小高度，
   不写的话图片再高也压不下来，底部提示会被顶出屏幕。 */
.ev-stage{
  flex:1;min-height:0;display:flex;align-items:center;justify-content:center;
  padding:0 12px;
  overflow:auto;-webkit-overflow-scrolling:touch;
}
.ev-media{
  max-width:100%;max-height:100%;
  display:block;object-fit:contain;border-radius:8px;
}
/* 放大态：图按舞台宽度的 2.6 倍铺开，超出的部分交给舞台自己滚。
   flex 的居中要改成靠边对齐 —— 居中的 flex 子项一旦比容器宽，
   左边溢出的那一截是滚不到的（overflow 只往右边滚）。 */
.ev-stage.zoom{align-items:flex-start;justify-content:flex-start;padding:0}
.ev-stage.zoom .ev-media{
  max-width:none;max-height:none;width:260%;height:auto;
  border-radius:0;flex-shrink:0;
}

.ev-nav{
  position:absolute;top:50%;transform:translateY(-50%);
  width:38px;height:56px;border:none;border-radius:var(--r-pill);
  background:rgba(255,255,255,.16);color:#fff;
  font-size:26px;line-height:1;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
}
.ev-nav:active{background:rgba(255,255,255,.3)}
.ev-prev{left:6px}
.ev-next{right:6px}
/* 放大之后把翻页键收起来：这时候整屏都是拖着看的区域，
   两侧再压两个按钮，拖到边上就容易误触到下一张。
   ~ 选得到它们，是因为这两个按钮在 DOM 里排在舞台后面。 */
.ev-stage.zoom ~ .ev-nav{display:none}

.ev-tip{
  flex-shrink:0;text-align:center;color:#fff;opacity:.55;
  font-size:11.5px;
  padding:12px 16px calc(14px + env(safe-area-inset-bottom));
}

/* ============ 弹窗 ============ */

.mask{
  position:fixed;left:0;right:0;top:0;bottom:0;
  background:rgba(60,45,20,.42);
  display:flex;align-items:center;justify-content:center;z-index:100;padding:20px;
}
.dialog{
  width:100%;max-width:320px;max-height:82vh;overflow-y:auto;
  background:var(--card);border-radius:22px;padding:22px 18px;
  box-shadow:0 12px 40px rgba(80,60,20,.25);
}
.dialog-title{font-size:17px;font-weight:900;text-align:center;margin-bottom:14px;color:var(--ink)}
.dialog-label{font-size:12px;color:var(--ink-3);margin-bottom:5px;font-weight:600}
.dialog-input{
  background:var(--cream);border-radius:var(--r-inner);padding:11px 13px;
  margin-bottom:11px;font-size:13.5px;width:100%;display:block;box-sizing:border-box;
  color:var(--ink);border:1px solid #f2e8d8;
}
.dialog-btns{display:flex;gap:10px;margin-top:12px}
.dialog-btns .btn{flex:1}
.dialog-check{
  display:flex;align-items:center;gap:8px;padding:9px 2px;
  font-size:14px;color:var(--ink);border-bottom:var(--hairline);
}
.dialog-check:last-of-type{border-bottom:none}
.dialog-check input{margin:0}

/* ============ 固定条 ============ */

.footer-bar{
  position:fixed;left:0;right:0;bottom:0;z-index:20;
  max-width:480px;margin:0 auto;
  background:var(--card);
  padding:9px 12px calc(9px + env(safe-area-inset-bottom));
  box-shadow:var(--shadow-up);display:flex;gap:10px;
}
.footer-bar .btn{flex:1}
.page-with-footer{padding-bottom:92px}
.has-tabbar{padding-bottom:10px}
.with-tab .footer-bar{bottom:var(--tabbar-safe);padding-bottom:9px}
.with-tab .page-with-footer{padding-bottom:80px}
.fab{
  position:fixed;right:20px;bottom:calc(30px + env(safe-area-inset-bottom));
  width:56px;height:56px;border-radius:50%;
  background:linear-gradient(180deg,var(--sun),var(--sun-deep));
  color:#4a3200;font-size:28px;line-height:54px;text-align:center;
  box-shadow:0 6px 18px rgba(255,171,0,.4);z-index:30;
}
.with-tab .fab{bottom:calc(var(--tabbar-safe) + 20px)}
@media (min-width:520px){ .fab{right:calc(50vw - 240px + 20px)} }

/* ============ 登录 / 注册 ============ */

.login-page{padding:26px 18px 30px;min-height:100%}
.brand{text-align:center;margin-bottom:26px}
/* 品牌猫代替原来的文字方块 */
.logo{
  width:96px;height:96px;margin:6px auto 12px;
  background:url(/art/brand-cat.png) center/contain no-repeat;
  font-size:0;color:transparent;
}
.app-name{font-size:21px;font-weight:900;color:var(--ink)}
.app-desc{font-size:12.5px;color:var(--ink-3);margin-top:6px;line-height:1.7}
.agreement{margin-top:22px;font-size:11px;color:var(--ink-4);text-align:center;line-height:1.7}

.identity{padding-bottom:2px}
.identity-title{font-size:13px;color:var(--ink-2);margin-bottom:9px;font-weight:700}
.identity-opts{display:flex;gap:10px}
/* 三个身份并排时每格更窄，说明文字要能换行，不然会被挤出格子 */
.identity-opts.identity-3{gap:7px}
.identity-opts.identity-3 .identity-opt{padding:11px 7px}
.identity-opts.identity-3 .identity-name{font-size:13.5px}
.identity-opts.identity-3 .identity-desc{font-size:10.5px;line-height:1.5}

/* 用户编号：等宽数字，跟在用户名后面。
   人互相指认用的就是这串数字 —— 昵称会重名也会改，编号不会。

   以前它是一枚黄底药丸，跟旁边「待审核」「已停用」那些标签长得一模一样，
   可它根本不是状态，只是一串认人的数字 —— 一眼扫过去，读的人得先判断
   「这个黄块是在说他有问题吗」，判断完才发现不是。所以改成普通文字，
   前面缀一个「编号」自报家门，别再占用标签那套视觉语言。 */
.ucode{
  margin-left:7px;color:var(--ink-3);
  font-size:11.5px;font-weight:700;
  font-variant-numeric:tabular-nums;letter-spacing:.5px;
}
.ucode::before{content:"编号 ";letter-spacing:0;font-weight:600;opacity:.85}
.identity-opt{
  flex:1;background:var(--cream);border-radius:var(--r-inner);
  padding:12px 11px;border:1.5px solid transparent;cursor:pointer;
}
.identity-opt.on{border-color:var(--sun);background:var(--sun-soft)}
.identity-name{display:block;font-size:14px;font-weight:800;color:var(--ink)}
.identity-opt.on .identity-name{color:var(--sun-deep)}
.identity-desc{display:block;font-size:11.5px;color:var(--ink-3);margin-top:4px;line-height:1.6}
.identity-hint{font-size:11.5px;color:var(--ink-3);margin-top:9px;line-height:1.7}

/* ============ 待审核 / 状态页 ============ */

.page{padding:40px 22px;text-align:center}
/* 「等待审核中 / 审核未通过 / 账号已停用」那三张状态页顶上的大圆。
   里头原来是一个 emoji（⏳ ✕ 🔒）—— emoji 长什么样由系统决定，
   同一个页面在安卓和 iPhone 上是两幅画，跟平台自己那套素材也接不上。
   换成素材图：这个位置有 46px，放得下 s-* 那套立体图标。
   （13px 的徽章放不下，那边用的是 st-* 那套简笔符号，两套别混。） */
.icon{
  width:92px;height:92px;margin:0 auto 16px;border-radius:50%;
  background:var(--sun-soft);display:flex;align-items:center;justify-content:center;
  font-size:40px;
}
.icon::before{
  content:"";width:46px;height:46px;
  background:var(--ic) center/contain no-repeat;
}
.icon-pending {--ic:url(/art/s-pending.png)}
.icon-rejected{--ic:url(/art/s-fail.png)}
.icon-disabled{--ic:url(/art/st-ban.png)}
.icon-pending {background:var(--sun-soft)}
.icon-rejected{background:var(--coral-soft)}
.icon-disabled{background:#f0ece4}
.icon-mustpass{--ic:url(/art/t-key.png);background:var(--sun-soft)}
.info{text-align:left;margin-top:18px}
.info-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:9px 0;border-bottom:var(--hairline)}
.info-row:last-child{border-bottom:none}
.info-row .k{color:var(--ink-3);font-size:13px;flex-shrink:0}
.info-row .v{color:var(--ink);font-size:13px;text-align:right;word-break:break-all}
.actions{display:flex;flex-direction:column;gap:10px;margin-top:20px}

/* ============ 我的 ============ */

.profile-card{display:flex;align-items:center;gap:13px}
.avatar{
  width:56px;height:56px;border-radius:50%;flex-shrink:0;
  background:var(--sun-soft) url(/art/avatar.png) center/contain no-repeat;
}
.avatar-text{
  display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,var(--sun),var(--sun-deep));
  color:#4a3200;font-size:22px;font-weight:900;
}
.profile-info{flex:1;min-width:0}
.profile-name{font-size:17px;font-weight:900;color:var(--ink)}

/* ============ 可见范围 / 多选 ============ */

.bulk{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  background:var(--sun-soft);border-radius:var(--r-inner);
  padding:9px 13px;margin-bottom:10px;
}
.bulk-count{font-size:12.5px;color:#8a6412;font-weight:700}
.bulk-count b{font-size:15px;color:var(--sun-deep)}
.bulk-ops{display:flex;gap:14px}
.pick{
  display:flex;align-items:center;gap:11px;background:var(--card);
  border-radius:var(--r-inner);padding:11px 13px;margin-bottom:8px;
  box-shadow:0 1px 5px rgba(255,178,54,.07);cursor:pointer;
}
.box{
  width:22px;height:22px;border-radius:7px;flex-shrink:0;
  border:1.5px solid #e4dcce;background:var(--card);
  display:flex;align-items:center;justify-content:center;
  font-size:13px;color:#fff;font-weight:800;
}
.box.on{background:var(--sun);border-color:var(--sun);color:#4a3200}
.pick-main{flex:1;display:flex;flex-direction:column;min-width:0}
.pick-name{font-size:14px;color:var(--ink);font-weight:600}
.pick-sub{font-size:11.5px;color:var(--ink-3);margin-top:2px}

/* ============ 签约 / 结算 ============ */

.type-opts{display:flex;gap:10px;margin-bottom:12px}
.type-opt{
  flex:1;background:var(--cream);border-radius:var(--r-inner);
  padding:12px;border:1.5px solid transparent;cursor:pointer;
}
.type-opt.on{border-color:var(--sun);background:var(--sun-soft)}
.type-name{display:block;font-size:14px;font-weight:800;color:var(--ink)}
.type-desc{display:block;font-size:11.5px;color:var(--ink-3);margin-top:4px;line-height:1.6}

/* 「按哪个口径排名」的单选列表。
   跟上面那两格并排的 .type-opt 不同：口径有几条是超管配出来的，
   并排排五六条会把每条压成一列一个字的竖条，只能竖着一条一条来。 */
.fopts{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.fopt{
  display:flex;align-items:flex-start;gap:10px;
  background:var(--cream);border-radius:var(--r-inner);
  padding:11px 12px;border:1.5px solid transparent;cursor:pointer;
}
.fopt.on{border-color:var(--sun);background:var(--sun-soft)}
/* 选中标记用一个实心圆点，不用对勾图 —— 这是单选，一次只有一个亮着 */
.fopt-dot{
  flex:0 0 auto;width:16px;height:16px;margin-top:2px;border-radius:50%;
  border:1.5px solid #e2d5bd;background:#fff;
}
.fopt.on .fopt-dot{border-color:var(--sun-deep);background:var(--sun-deep);box-shadow:inset 0 0 0 3px #fff}
.fopt-body{min-width:0}
.fopt-name{display:block;font-size:13.5px;font-weight:800;color:var(--ink)}
.fopt-desc{display:block;font-size:11.5px;color:var(--ink-3);margin-top:3px;line-height:1.6}

/* 一档报酬是一个竖着排的小块：「第 X 到第 Y 名」一行、「每人 N 元」一行、下面一句预览。
   原来 .rule 自己也是 flex 行，于是这三样被并排挤在一行里，
   在窄屏上会互相叠住 —— 外层要竖排，只有里面的每一行才是 flex。 */
.rule{padding:10px 0;border-bottom:var(--hairline)}
.rule:last-child{border-bottom:none}
.rule-line{display:flex;align-items:center;gap:8px;padding:4px 0}
.rule-input,.rate-input{
  background:var(--cream);border-radius:10px;padding:8px 10px;
  font-size:13.5px;text-align:center;width:64px;flex-shrink:0;color:var(--ink);
  border:1px solid #f2e8d8;
}
.rule-txt{font-size:13px;color:var(--ink-2);flex-shrink:0}
/* 金额那一格占掉这一行剩下的空间，但不能是 100% ——
   那会把后面的「元」和「删除」挤出行外，窄屏上直接看不见。 */
.rule-input.wide{width:auto;flex:1;min-width:0}
.rule-del{color:var(--coral);font-size:13px;margin-left:auto;flex-shrink:0;cursor:pointer}
/* 「改为及以后 / 改为区间」：切换该档的写法，靠右放在名次那一行 */
.rule-mode{color:var(--sky);font-size:12.5px;font-weight:700;margin-left:auto;flex-shrink:0;cursor:pointer}
.rule-preview{font-size:11.5px;color:var(--ink-3);margin-top:8px;line-height:1.7}
.rate{display:flex;align-items:center;gap:8px;padding:9px 0;border-bottom:var(--hairline)}
.rate:last-child{border-bottom:none}
.rate-name{flex:1;font-size:13.5px;color:var(--ink);font-weight:600}
.rate-unit{font-size:12px;color:var(--ink-3);flex-shrink:0}

.total-card{
  background:linear-gradient(135deg,#ffd75e,var(--sun) 60%,#ffb01f);
  border-radius:22px;padding:20px;text-align:center;margin-bottom:12px;
  box-shadow:0 6px 20px rgba(255,171,0,.28);position:relative;overflow:hidden;
}
.total-card::after{
  content:"";position:absolute;right:-10px;bottom:-14px;width:96px;height:96px;opacity:.9;
  background:url(/art/cat-cheer.png) center/contain no-repeat;
}
.total-label{font-size:12.5px;color:#7a5400;font-weight:700;position:relative;z-index:1}
.total-num{font-size:34px;font-weight:900;color:#4a3200;line-height:1.25;position:relative;z-index:1}
.total-sub{font-size:11.5px;color:#7a5400;position:relative;z-index:1}
.g-total{font-size:16px;font-weight:900;color:var(--sun-deep)}

.srow{display:flex;align-items:flex-start;gap:11px;padding:10px 0;border-bottom:var(--hairline)}
.srow:last-child{border-bottom:none}
.s-rank{
  width:28px;height:28px;border-radius:50%;background:var(--sun-soft);
  color:var(--sun-deep);font-size:13px;font-weight:900;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
}
.s-main{flex:1;display:flex;flex-direction:column;min-width:0}
.s-acc{font-size:14px;font-weight:700;color:var(--ink)}
.s-sub{font-size:11.5px;color:var(--ink-3);margin-top:2px}
.s-formula{font-size:11px;color:var(--ink-4);margin-top:3px;line-height:1.6}
.s-amt{font-size:15px;font-weight:900;color:var(--coral);flex-shrink:0}

.user-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}
.user-name{font-size:15px;font-weight:800;color:var(--ink)}
.user-amt{font-size:17px;font-weight:900;color:var(--coral)}
.user-item{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 0;font-size:12.5px}
.ui-left{color:var(--ink-2);flex:1;min-width:0}
.ui-right{color:var(--ink-3);flex-shrink:0}

.reward-card{
  background:linear-gradient(135deg,#ffe3ec,var(--pink-soft));
  border-radius:22px;padding:17px;margin-bottom:12px;position:relative;overflow:hidden;
  box-shadow:0 4px 16px rgba(255,143,171,.22);
}
.reward-title{font-size:12.5px;color:#c2537a;font-weight:700}
.reward-total{font-size:30px;font-weight:900;color:#a83f63;line-height:1.3;margin-bottom:6px}
.reward-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:5px 0;font-size:12px}
.reward-left{color:#b4536f;flex:1;min-width:0}
.reward-right{color:#a83f63;font-weight:800;flex-shrink:0}
.reward-note{font-size:10.5px;color:#c47a92;margin-top:8px;line-height:1.7}

/* ============ 审核页 ============ */

.rv-ops{display:flex;align-items:center;gap:16px;margin-top:10px;padding-top:9px;border-top:var(--hairline)}
.rv-pick{margin-right:auto;display:flex;align-items:center;font-size:12px;color:var(--ink-3);cursor:pointer}
.rv-pick input{margin-right:7px}
.rv-meta{font-size:11.5px;color:var(--ink-3);margin-top:6px;line-height:1.7}

/* ============ Toast / 加载 ============ */

.toast{
  position:fixed;left:50%;top:42%;transform:translate(-50%,-50%);
  background:rgba(43,43,43,.9);color:#fff;padding:13px 22px;border-radius:16px;
  font-size:13.5px;z-index:200;max-width:74vw;text-align:center;line-height:1.6;
  box-shadow:0 8px 24px rgba(0,0,0,.2);
}
.boot{padding:70px 20px;text-align:center;color:var(--ink-4);font-size:13px}
.boot::before{
  content:"";display:block;width:72px;height:72px;margin:0 auto 10px;opacity:.65;
  background:url(/art/cat-cheer.png) center/contain no-repeat;
}

/* ============ 加到主屏幕引导 ============ */

.a2hs{
  background:var(--sky-soft);color:#2f6ea8;border-radius:var(--r-card);
  padding:12px 14px;margin-bottom:12px;line-height:1.8;font-size:12px;
}
.a2hs b{color:#215a8d;font-size:13.5px}
.a2hs .a2hs-x{float:right;color:#8bb4d8;font-size:15px;line-height:1;padding:0 0 6px 8px;cursor:pointer}
/* v2.36：提示卡带「一键添加」按钮 */
.a2hs{position:relative;display:flex;align-items:center;gap:12px;padding-right:32px}
.a2hs .a2hs-x{position:absolute;right:12px;top:10px;float:none;padding:2px 2px 6px 8px}
.a2hs .a2hs-body{flex:1;min-width:0}
.a2hs .a2hs-go{flex-shrink:0;width:auto;height:34px;padding:0 14px;font-size:13px;border-radius:var(--r-pill)}
.a2hs-steps{margin:4px 0 0;padding-left:20px;line-height:1.9;font-size:14px;color:var(--ink-2);text-align:left}

/* ============ 杂项 ============ */

.wide{width:100%}
.k{color:var(--ink-3)}
.v{color:var(--ink)}
.gray{color:var(--ink-3)}
.danger{color:var(--coral)}

/* 可点元素不要出现长按菜单和双击缩放 */
a,button,.btn,.op-link,.tab,.seg,.filter-chip,.range-chip,
.pick,.bpick,.mod,.todo,.type-opt,.fopt,.identity-opt,.menu-item,.menu-line,.quick-btn,
.period-chip,.board-chip,.me-go,.today-btn,.search-go,
.rule-del,.rule-mode,.tabbar a,.evidence-add,.evidence-del,.dialog-check,
.evidence-item[data-evk],.ev-close,.ev-nav{
  touch-action:manipulation;-webkit-user-select:none;user-select:none;
}
.record-url,.v,.s-formula,.info-row .v,.bn-body,input,textarea{
  -webkit-user-select:text;user-select:text;
}
body{overscroll-behavior-y:none}

/* 独立启动（加到主屏幕后）：顶栏自己让开状态栏 */
@media (display-mode: standalone){
  .navbar{height:calc(50px + env(safe-area-inset-top));padding-top:env(safe-area-inset-top)}
  .navbar .title{top:env(safe-area-inset-top);height:50px;line-height:50px}
}
html.pwa .navbar{height:calc(50px + env(safe-area-inset-top));padding-top:env(safe-area-inset-top)}
html.pwa .navbar .title{top:env(safe-area-inset-top);height:50px;line-height:50px}

/* 月份选择行（结算页）：跟 picker-row 同一套外观 */
.month-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:15px}
/* 开关：平台设置里那几个「开 / 关」。用真的 checkbox 撑着，
   键盘和读屏都能用，外面那层 <i> 只负责画成一个滑块。 */
/* 全站公告：登录页和首页顶部那条。橙底比灰底更像「请看一眼」，
   但不用红 —— 红是出错，公告大多数时候只是通知。 */
.site-notice{
  background:var(--sun-soft);color:#8a6412;border-radius:var(--r-inner);
  padding:11px 13px;font-size:13px;line-height:1.7;font-weight:600;
  margin-bottom:12px;white-space:pre-wrap;word-break:break-word;
  border-left:4px solid var(--sun);box-sizing:border-box;
}
/* 下载类的按钮是 <a>，得把默认下划线和行高压回来，跟 <button> 长一样 */
a.btn{text-decoration:none;display:flex;align-items:center;justify-content:center}
/* 选文件：浏览器默认那个按钮太素，包一层跟卡片同一套圆角 */
.file-pick{
  display:block;width:100%;box-sizing:border-box;margin:12px 0;padding:11px;
  background:var(--cream);border:1px dashed #e3d6bd;border-radius:var(--r-inner);
  font-size:13px;color:var(--ink-2);
}
.file-pick::file-selector-button{
  font:inherit;margin-right:10px;padding:6px 12px;border-radius:999px;
  border:none;background:#fff;color:var(--ink);font-weight:700;cursor:pointer;
  box-shadow:0 1px 3px rgba(0,0,0,.08);
}
/* 登录页上「账号密码」和「一键登录」之间那条分隔线 */
.or-line{
  display:flex;align-items:center;gap:10px;margin:16px 0 12px;
  font-size:12px;color:var(--ink-4);
}
.or-line::before,.or-line::after{content:"";flex:1;height:1px;background:#eee5d6}
.sw{position:relative;display:inline-block;width:48px;height:28px;flex-shrink:0}
.sw input,.sw input[type="checkbox"]{
  position:absolute;inset:0;opacity:0;margin:0;width:100%;height:100%;cursor:pointer;
  border:none;border-radius:0;background:none;
}
.sw input[type="checkbox"]::after{content:none}
.sw i{
  position:absolute;inset:0;border-radius:999px;background:#e2ddd4;
  transition:background .18s;pointer-events:none;display:block;
}
.sw i::after{
  content:"";position:absolute;left:3px;top:3px;width:22px;height:22px;border-radius:50%;
  background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.18);transition:transform .18s;
}
.sw input:checked + i{background:var(--sun)}
.sw input:checked + i::after{transform:translateX(20px)}
.sw input:focus-visible + i{outline:2px solid var(--sun-deep);outline-offset:2px}
.mb10{margin-bottom:10px}
.mt8{margin-top:6px}

/* ============================================================
   v2.6：重构后的首页 / 排行榜 / 打卡 / 消息
   ============================================================ */

/* ---- 空状态的几只猫：不同场景换不同表情 ---- */
.empty-box::before   {background-image:url(/art/empty-box.png);   width:120px;height:auto;aspect-ratio:332/307}
.empty-sleep::before {background-image:url(/art/empty-sleep.png); width:140px;height:auto;aspect-ratio:560/452}
.empty-search::before{background-image:url(/art/empty-search.png);width:130px;height:auto;aspect-ratio:318/299}

/* ---- 首页：今日打卡横幅 ---- */
.today-card{
  position:relative;overflow:hidden;
  background:linear-gradient(135deg,#ffe08a 0%,var(--sun) 52%,#ffb01f 100%);
  border-radius:22px;padding:18px 16px 18px;margin-bottom:12px;
  box-shadow:0 6px 20px rgba(255,171,0,.28);
}
/* 猫咪压在右下角，主内容留出 112px 让位，不跟文字打架 */
.today-card::after{
  content:"";position:absolute;right:-8px;bottom:-10px;width:118px;height:118px;
  pointer-events:none;
  background:url(/art/cat-clipboard.png) center/contain no-repeat;
}
.today-main{position:relative;z-index:1;padding-right:104px}
/* 首页第一眼看到的就是它，用的是设计好的标题素材，不是实时渲染的字体。
   素材只有 alpha 通道，所以当遮罩使：形状来自素材，颜色仍旧由这里给，
   将来卡片配色变了不用重新导图。宽高比 547:128 ≈ 4.273，按高度定宽。 */
.today-title{
  width:132px;height:31px;
  background:#4a3200;
  -webkit-mask:url(/art/title-today.png) left center/contain no-repeat;
  mask:url(/art/title-today.png) left center/contain no-repeat;
}
.today-sub{font-size:12.5px;color:#7a5400;font-weight:600;margin:7px 0 13px;line-height:1.6}
.today-btn{
  display:inline-flex;align-items:center;justify-content:center;
  height:44px;padding:0 24px;border-radius:var(--r-pill);
  background:#fff;color:#b07800;font-size:17px;font-weight:800;
  /* 按钮里的字要真的居中：line-height 跟按钮一样高，align-items 才有东西可居中。
     缺了这条，行盒由字体的默认行高决定，汉字就会整体偏上一两个像素。 */
  line-height:44px;
  box-shadow:0 3px 10px rgba(160,110,0,.18);
}
.today-btn:active{transform:translateY(1px)}

/* ---- 一行四格的数据条 ---- */
.stat-row{display:flex;gap:8px}
/* 大数字下面那句说明和这排色卡之间原来是 0 间距 —— 以前有枚药丸垫在中间，
   把这段距离占住了，药丸一撤就贴上了。补一个真正的间距，
   别再靠一个内容元素去充当留白。 */
.muted + .stat-row{margin-top:9px}
.stat-row .stat-tile{flex:1;min-width:0;padding:12px 4px}
/* 带图标的数据格：图标走 --ic 变量，由 app.js 里的 TILE_IC 按格子标签发下来。
   原来首页那四张白底日历插画要单独放大到 46px（同样大小下看着比实心图标「轻」），
   新素材实心度一致，那一档就撤了 —— 全平台色卡统一 36px。 */
.stat-tile.ic::before{
  /* 这一排放的是有细节的小插画（日历上的格子和勾、火苗里的数字），
     小了只剩一团色块，认不出画的是什么。格子本身够宽，36 不会把数字挤下去。 */
  content:"";display:block;width:36px;height:36px;margin:0 auto 5px;
  background:var(--ic) center/contain no-repeat;
}
.stat-row .t-sun  {background:var(--sun-soft)}
.stat-row .t-sky  {background:var(--sky-soft)}
.stat-row .t-green{background:var(--green-soft)}
.stat-row .t-pink {background:var(--pink-soft)}

/* ---- 首页的「我的排名」 ---- */
.myrank{display:flex;align-items:center;gap:11px;padding:4px 0 2px}
.myrank-medal{
  width:42px;height:42px;flex-shrink:0;
  background-size:contain;background-repeat:no-repeat;background-position:center;
  font-size:0;color:transparent;
}
.myrank-medal.rk-normal{
  background:url(/art/rank-plate.png) center/contain no-repeat;
  font-size:15px;font-weight:900;color:var(--ink-2);
  display:flex;align-items:center;justify-content:center;
}
.myrank-info{flex:1;min-width:0}
.myrank-board{font-size:14px;font-weight:800;color:var(--ink)}
.myrank-num{font-size:22px;font-weight:900;color:var(--sun-deep);flex-shrink:0}
.myrank-num .unit{font-size:11px;font-weight:700;color:var(--ink-3);margin-left:2px}

/* ---- 博主选择卡片（首页 + 打卡第一步共用） ---- */
.blogger-picks{display:flex;flex-wrap:wrap;gap:8px}
.bpick{
  flex:1 1 calc(50% - 4px);min-width:0;box-sizing:border-box;
  background:var(--sun-soft);border-radius:var(--r-inner);padding:11px 12px;
  border:1.5px solid transparent;
}
.bpick:active{transform:scale(.98)}
.bpick-name{font-size:14px;font-weight:800;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bpick-plat{font-size:11px;color:var(--ink-3);font-weight:600;margin-top:1px}
.bpick-state{font-size:11.5px;font-weight:800;color:var(--sun-deep);margin-top:6px}
/* 今天已经打过的压暗，让没打的那些先被看见 */
/* 「点一下选中、留在原地」的那一版：免登录打卡页挑号、建链接时挑号都用它。
   .bpick 本身是「点了就跳走」的入口（登录后的打卡页），所以多给一个 .on 的样子。
   这两处原来用的是药丸（.qact）—— 可药丸是全圆角的，里头塞「名字 + 平台」两行
   一撑，名字短的成了个圆饼、名字长的成了根橄榄球，一排下来高矮胖瘦全不一样。 */
.bpick.pick{cursor:pointer;background:var(--cream);border-color:#efe6d6}
/* 圆角跟上面那排博主名（.qact）一个弧度。
   .qact 是全圆角的药丸，实测高 40.6px，所以它的弯就是半径 20px 的弯；
   这里也给 20px，而不是跟着 999px 走 —— 两行字的卡片高 46px，
   999px 会把两头压成半圆、短名字的卡成一个圆饼，那正是 v2.28 修掉的问题。
   左右各多 4px 内边距：弯变大了，字不能贴到弯里去。 */
.pub-wrap .bpick.pick,#pp-b .bpick.pick{border-radius:20px;padding-left:16px;padding-right:16px}
/* 建链接的弹窗只有 320px 宽，一行两张的话名字只剩三四个字、平台名被挤成两行 ——
   弹窗里一行一张。 */
#pp-b .bpick.pick{flex-basis:100%}
.bpick.pick.on{background:var(--sun-soft);border-color:var(--sun)}
.bpick.pick.on .bpick-name{color:var(--sun-deep)}
.bpick.done{background:#f6f3ee}
.bpick.done .bpick-name{color:var(--ink-3)}
.bpick.done .bpick-state{color:var(--green)}

/* ---- 分步标题 ---- */
.step-head{display:flex;align-items:center;gap:10px;margin:2px 2px 12px}
.step-n{
  width:26px;height:26px;flex-shrink:0;border-radius:50%;
  background:var(--sun);color:#fff;font-size:14px;font-weight:900;
  display:flex;align-items:center;justify-content:center;
}
.step-t{font-size:16px;font-weight:900;color:var(--ink)}
.step-s{font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:1px}

/* ============ 排行榜 ============ */

.rank-page{padding-bottom:78px}   /* 给底部「我的排名」悬浮条留位 */
.rank-head{margin-bottom:10px}
.period-bar{display:flex;gap:6px;background:var(--sun-soft);border-radius:var(--r-pill);padding:4px}
.period-chip{
  /* 原来靠 line-height:34px 撑满整格来居中，量出来偏上 0.44px ——
     行盒居中不等于字居中。改成跟本文件里其它药丸一样的 flex 居中 + line-height:1，
     13.5px 那档 D=0（字本身就在中线附近），所以上下 padding 不用补。 */
  flex:1;display:flex;align-items:center;justify-content:center;line-height:1;
  height:34px;box-sizing:border-box;border-radius:var(--r-pill);
  font-size:13.5px;font-weight:800;color:#a67c00;
}
.period-chip.active{background:#fff;color:var(--sun-deep);box-shadow:0 2px 6px rgba(160,110,0,.14)}
.board-bar{display:flex;gap:6px;overflow-x:auto;margin-top:8px;padding-bottom:2px}
.board-chip{
  flex:0 0 auto;height:32px;line-height:32px;padding:0 13px;border-radius:var(--r-pill);
  background:var(--card);font-size:12.5px;font-weight:700;color:var(--ink-2);
  border:1px solid #f2e8d8;
}
.board-chip.active{background:var(--sun);color:#4a3200;border-color:var(--sun)}
.board-mine{margin-left:5px;font-size:11px;color:var(--sun-deep);font-weight:800}
.board-chip.active .board-mine{color:#7a5400}
/* 排名口径的切换条（只有博主有）。跟上面那条换博主的长得像，
   所以矮一档、字号小一档，看一眼就知道是两件事。 */
.board-bar-f{margin-top:6px}
.board-bar-f .board-chip{height:27px;line-height:27px;padding:0 11px;font-size:11.5px}
.board-bar-f .board-chip.active{background:var(--ink-2);color:#fff;border-color:var(--ink-2)}

/* ---- TOP3 领奖台 ----
   台子是一整张插画（podium-3d.png），三根柱子的位置是固定的，
   所以三个人只是「站」在上面，不再用色块拼台阶。 */
.podium-card{
  background:linear-gradient(180deg,#fff6dd 0%,var(--card) 62%);
  border-radius:var(--r-card);box-shadow:var(--shadow);
  padding:14px 10px 10px;margin-bottom:12px;overflow:hidden;position:relative;
}
/* 标题两侧各一颗小星星，衬一下「颁奖」的氛围，不抢主体 */
.podium-card::before,.podium-card::after{
  content:"";position:absolute;top:14px;width:20px;height:20px;opacity:.7;
  background:url(/art/t-star.png) center/contain no-repeat;
}
.podium-card::before{left:26px}
.podium-card::after{right:26px}
.podium-title{
  position:relative;z-index:1;text-align:center;
  font-size:15px;font-weight:900;color:var(--ink);margin-bottom:10px;
}
/* 台子插画铺满整宽，三个人贴着各自柱子的台面站。
   下面这些百分比是量出来的：插画 640×229，
   二号柱中心 x≈19.4% / 台面 y≈30.6%，一号 50% / 0%，三号 81.9% / 42.4%。
   left 和 bottom 都按插画自身的尺寸算，所以卡片变宽变窄都不会错位。 */
.podium{position:relative;z-index:1;padding-top:112px;margin:0 14px}
.podium-base{
  position:relative;width:100%;aspect-ratio:640/229;
  background:url(/art/podium-3d.png) center bottom/100% 100% no-repeat;
}
.po{
  position:absolute;width:34%;text-align:center;
  transform:translateX(-50%);padding-bottom:2px;
}
.po-1{left:50%;bottom:100%}
.po-2{left:19.4%;bottom:69.4%}
.po-3{left:81.9%;bottom:57.6%}
.po-medal{
  width:44px;height:44px;margin:0 auto 3px;
  background-size:contain;background-repeat:no-repeat;background-position:center;
}
.po-1 .po-medal{width:56px;height:56px}
.po-name{
  font-size:12.5px;font-weight:800;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.po-1 .po-name{font-size:14px}
.po-owner{font-size:10.5px;color:var(--ink-3);font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.po-num{font-size:17px;font-weight:900;color:var(--sun-deep);margin-top:2px;line-height:1.2}
.po-1 .po-num{font-size:20px}
.po-unit{font-size:10px;font-weight:700;color:var(--ink-3);margin-left:1px}
.po-empty{opacity:0}
/* 并列：一个台子上站好几个人（v2.31）。
   奖牌只一枚、数字只印一次（并列就是数字一样），名字一人一行、去掉昵称省高度。
   人多了列前两个，第三行「等 N 人 ›」，点开看全部。 */
.po-tie{cursor:pointer}
.po-tie-n{
  display:inline-block;margin:0 auto 3px;padding:2px 8px 1px;border-radius:var(--r-pill);
  background:var(--sun-soft);color:#8a6412;font-size:10.5px;font-weight:800;line-height:1.4;
}
.po-name-s{font-size:12px;line-height:17px}
.po-1 .po-name-s{font-size:12.5px}
.po-more{font-size:11px;font-weight:800;color:var(--sun-deep);line-height:17px}
.tie-row{display:flex;justify-content:space-between;gap:10px;padding:10px 2px;border-bottom:var(--hairline)}
.tie-row:last-of-type{border-bottom:none}
.tie-row b{font-size:14px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.basis-note{text-align:left;line-height:1.75}

/* ---- 底部「我的排名」悬浮条 ---- */
.me-bar{
  position:fixed;left:0;right:0;bottom:var(--tabbar-safe);z-index:20;
  /* fixed 是对着「窗口」定位的，不是对着 480px 的外壳，所以得自己居中。
     原来写了 margin-left/right:auto，又被后面那句 margin 简写覆盖掉了，
     宽屏上整条就贴在窗口左边。宽度自己定死，再用 auto 左右外边距居中。 */
  width:calc(100% - 20px);max-width:460px;margin:0 auto 8px;
  display:flex;align-items:center;gap:10px;
  padding:9px 10px;
  background:var(--card);border-radius:var(--r-card);
  box-shadow:0 -2px 16px rgba(255,178,54,.22);
  border:1.5px solid var(--sun-line);
}
/* 悬浮条外面还有 10px 的外边距，所以最大宽度比外壳窄一点 */
.me-rk{
  width:38px;height:38px;flex-shrink:0;
  background-size:contain;background-repeat:no-repeat;background-position:center;
  font-size:0;color:transparent;
}
.me-rk.rk-normal,.me-rk-none{
  background:url(/art/rank-plate.png) center/contain no-repeat;
  font-size:14px;font-weight:900;color:var(--ink-2);
  display:flex;align-items:center;justify-content:center;
}
.me-rk-none{color:var(--ink-4)}
.me-info{flex:1;min-width:0}
.me-line{font-size:13.5px;font-weight:700;color:var(--ink-2)}
.me-line b{font-size:18px;font-weight:900;color:var(--ink)}
.me-cnt{font-size:11.5px;color:var(--ink-3);margin-left:7px;font-weight:700}
.me-sub{font-size:11.5px;color:var(--sun-deep);font-weight:800;margin-top:1px}
.me-go{
  flex-shrink:0;height:34px;padding:0 15px;border-radius:var(--r-pill);
  background:var(--sun);color:#4a3200;font-size:13px;font-weight:800;
}

/* ============ 消息 ============ */

.msg-list{padding:2px 0}
.msg{display:flex;gap:10px;padding:12px 14px;border-bottom:var(--hairline);position:relative}
/* 能动手的那几条消息做成可点的。**只有带落点的才做成可点** ——
   纯通知（排行榜已结算之类）点了什么都不会发生，做成可点比不能点还让人疑惑。 */
.msg-go{cursor:pointer}
.msg-go:active{background:var(--cream)}
/* 「去处理 ›」跟时间同一行、靠右。用 float 而不是 flex：
   .msg-time 里本来只有一段文字，改成 flex 会把那段文字变成匿名 flex 项，
   行高和基线都跟着变，旁边几条不可点的消息时间就跟这条对不齐了。 */
.msg-arrow{float:right;color:var(--sun-deep);font-weight:800}
.msg:last-child{border-bottom:none}
.msg-ic{
  width:30px;height:30px;flex-shrink:0;margin-top:1px;
  background-size:contain;background-repeat:no-repeat;background-position:center;
}
.msg-body{flex:1;min-width:0}
.msg-title{font-size:14px;font-weight:800;color:var(--ink)}
.msg-text{font-size:12.5px;color:var(--ink-2);line-height:1.7;margin-top:2px;word-break:break-word}
.msg-time{font-size:11px;color:var(--ink-4);margin-top:4px;font-weight:600}
/* 未读的左侧点一下颜色，不做整条高亮，免得一屏全是色块 */
.msg.unread::before{
  content:"";position:absolute;left:5px;top:18px;width:6px;height:6px;border-radius:50%;
  background:var(--coral);
}
.msg.tone-up    .msg-title{color:#1d8f58}
.msg.tone-down  .msg-title{color:#c2532a}
.msg.tone-bad   .msg-title{color:#e0552a}
/* 数字气泡：固定高度的那一类，用 flex 居中再补 1px。
   它们里头是数字，数字比汉字矮，所以补的量比标签小一半。 */
.tab-n{
  display:inline-flex;align-items:center;justify-content:center;line-height:1;
  min-width:16px;height:16px;padding:0 4px;box-sizing:border-box;
  border-radius:var(--r-pill);background:var(--coral);color:#fff;
  font-size:10.5px;font-weight:800;vertical-align:1px;
}

/* ============ 确认打卡 ============ */

.confirm-list{background:var(--sun-soft);border-radius:var(--r-inner);padding:4px 12px;margin-top:4px}
.confirm-row{
  display:flex;justify-content:space-between;gap:12px;
  padding:8px 0;font-size:13px;border-bottom:1px solid rgba(180,140,40,.12);
}
.confirm-row:last-child{border-bottom:none}
.confirm-row > span:last-child{font-weight:800;color:var(--ink);text-align:right;word-break:break-all}

/* ============ 打卡成功动效 ============

   一条时间线，1.1 秒之内全部落位：

     0.00  遮罩淡入、卡片弹上来
     0.06  光圈从对勾位置扩出去（只扩一次，不循环）
     0.10  圆环描一圈
     0.28  对勾描出来  ←  庆祝的那一下就在这里
     0.30  彩带迸发、+1 弹出、数字开始跳
     0.44  猫落下来，弹两下停住

   上一版的问题是**太长也太串行**：对勾画完还要再等 0.2 秒才轮到 +1，
   +1 完了再等猫，整条线拖到 1.5 秒开外。极简模式 2.2 秒就自动跳下一个号，
   猫刚站稳画面就没了。现在把「对勾落定」当成一个爆点，
   彩带、+1、数字三样一起在那一刻发生，猫紧跟着收尾 —— 短，但更像一件事。 */

.cheer{
  position:fixed;inset:0;z-index:120;
  display:flex;align-items:center;justify-content:center;padding:24px;
  background:rgba(60,42,10,.42);backdrop-filter:blur(2px);
  animation:cheer-in .16s ease-out both;
}
.cheer.out{animation:cheer-out .2s ease-in both}
@keyframes cheer-in {from{opacity:0} to{opacity:1}}
@keyframes cheer-out{from{opacity:1} to{opacity:0}}

.cheer-box{
  position:relative;overflow:hidden;
  width:100%;max-width:320px;text-align:center;
  background:var(--card);border-radius:24px;padding:22px 20px 18px;
  box-shadow:0 12px 40px rgba(120,80,0,.28);
  animation:cheer-pop .42s cubic-bezier(.18,1.5,.42,1) both;
}
/* 弹上来的时候带一点点旋转，落定时归零 —— 纯缩放看着像个对话框，
   带这半度的偏转才像「啪」地拍上来 */
@keyframes cheer-pop{
  0%  {transform:scale(.84) translateY(14px) rotate(-1.2deg)}
  70% {transform:scale(1.02) translateY(-2px) rotate(.3deg)}
  100%{transform:none}
}

.cheer-check{position:relative;width:76px;height:76px;margin:2px auto 10px}
.cheer-check svg{width:76px;height:76px;position:relative;z-index:1}

/* 对勾背后扩出去的那圈光。只扩一次，不循环 ——
   循环的光圈会让人以为还在加载，这里的意思是「成了」，是个瞬间。 */
.cheer-check::before{
  content:"";position:absolute;left:50%;top:50%;width:76px;height:76px;
  margin:-38px 0 0 -38px;border-radius:50%;
  border:2px solid var(--green);
  animation:ck-ripple .6s ease-out .06s both;
}
@keyframes ck-ripple{
  0%  {opacity:.55;transform:scale(.55)}
  100%{opacity:0;transform:scale(1.5)}
}

.ck-c{fill:none;stroke:var(--green);stroke-width:3;opacity:.3;
  stroke-dasharray:145;stroke-dashoffset:145;animation:ck-draw .38s ease-out .1s forwards}
.ck-p{fill:none;stroke:var(--green);stroke-width:5;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:44;stroke-dashoffset:44;animation:ck-draw .26s cubic-bezier(.3,.9,.4,1) .28s forwards}
@keyframes ck-draw{to{stroke-dashoffset:0}}

/* ---- 彩带 ----
   十几个小方块，角度、距离、颜色、转速都由 JS 写在行内变量里，
   每次打开都不一样。用 CSS 画而不是放一张 GIF：
   一是省一个素材，二是 GIF 的时长固定，对不上这条时间线。 */
.cheer-confetti{position:absolute;left:50%;top:64px;width:0;height:0;pointer-events:none}
.cheer-confetti i{
  position:absolute;left:0;top:0;width:7px;height:9px;margin:-4px 0 0 -3px;
  background:var(--cf);border-radius:2px;opacity:0;
  animation:cf-fly .72s cubic-bezier(.16,.7,.35,1) .3s both;
}
@keyframes cf-fly{
  0%  {opacity:0;transform:translate(0,0) rotate(0) scale(.4)}
  18% {opacity:1}
  100%{opacity:0;
       transform:translate(var(--dx),var(--dy)) rotate(var(--rot)) scale(1)}
}

.cheer-plus{
  position:absolute;right:-6px;top:2px;z-index:2;
  font-size:19px;font-weight:900;color:var(--sun-deep);
  opacity:0;animation:plus-up .5s cubic-bezier(.2,1.4,.4,1) .3s both;
}
@keyframes plus-up{
  0%  {opacity:0;transform:translateY(10px) scale(.6)}
  45% {opacity:1;transform:translateY(-8px) scale(1.2)}
  100%{opacity:1;transform:translateY(-11px) scale(1)}
}

.cheer-title{font-size:19px;font-weight:900;color:var(--ink);
  animation:cheer-rise .34s ease-out .22s both}
.cheer-count{font-size:13px;color:var(--ink-2);margin-top:6px;font-weight:600;
  animation:cheer-rise .34s ease-out .28s both}
@keyframes cheer-rise{from{opacity:0;transform:translateY(7px)} to{opacity:1;transform:none}}
.cheer-count b{font-size:22px;font-weight:900;color:var(--sun-deep);display:inline-block;margin:0 2px}
.cheer-count b.pop{animation:num-pop .22s ease-out}
@keyframes num-pop{0%{transform:scale(1)}45%{transform:scale(1.45)}100%{transform:scale(1)}}

.cheer-cat{
  width:120px;height:120px;margin:6px auto 2px;
  background:url(/art/cat-hooray.png) center/contain no-repeat;
  animation:cat-in .62s cubic-bezier(.2,1.2,.4,1) .44s both;
}
/* 落下来弹两下再停。一下太干，三下就开始像玩具了 */
@keyframes cat-in{
  0%  {opacity:0;transform:translateY(18px) scale(.78)}
  45% {opacity:1;transform:translateY(-6px) scale(1.07)}
  72% {transform:translateY(2px) scale(.98)}
  100%{opacity:1;transform:none}
}

.cheer-note{
  font-size:12px;color:#8a6412;background:var(--sun-soft);
  border-radius:var(--r-inner);padding:8px 10px;margin-top:6px;line-height:1.7;
}
.cheer-btns{display:flex;gap:9px;margin-top:14px;
  animation:cheer-rise .3s ease-out .56s both}
.cheer-btns .btn{flex:1;height:42px;min-height:42px}

/* 极简模式下这条进度条走完就自动跳下一个号。
   有它才知道「还有一下就走」，不然画面自己动起来会吓一跳。 */
.cheer-auto{
  height:3px;border-radius:2px;background:var(--sun-soft);margin-top:12px;overflow:hidden;
}
.cheer-auto i{
  display:block;height:100%;width:100%;background:var(--sun);
  transform-origin:left center;
  animation:auto-bar linear both;
}
@keyframes auto-bar{from{transform:scaleX(0)} to{transform:scaleX(1)}}

/* 关掉动画偏好时只保留结果，不做位移 */
@media (prefers-reduced-motion: reduce){
  .cheer,.cheer-box,.cheer-cat,.cheer-plus,.ck-c,.ck-p,
  .cheer-title,.cheer-count,.cheer-btns,.cheer-check::before{animation:none!important}
  .ck-c,.ck-p{stroke-dashoffset:0}
  .cheer-plus{opacity:1}
  /* 彩带整块不出现 —— 它本身就是个纯装饰的位移动画，没有静态形态 */
  .cheer-confetti{display:none}
}

/* ---- 标签栏上的未读红点 ---- */
.tab-dot{
  position:absolute;top:3px;left:calc(50% + 6px);
  min-width:15px;height:15px;line-height:15px;padding:0 4px;box-sizing:border-box;
  border-radius:var(--r-pill);background:var(--coral);color:#fff;
  font-size:10px;font-weight:800;font-style:normal;text-align:center;
  box-shadow:0 0 0 2px var(--card);
}

/* ---- 卡片标题的小图标：用 --ic 指定用哪张素材 ----
   v2.24 之前这里有 19 / 26 / 30 三档。分档的原因是老素材繁简不一：
   有的是单个形状，有的是两件东西拼起来的插画，19px 只剩一团糊，
   只好把糊的那些单独放大。现在整套素材重画成了同一种繁简程度，
   分档就没有依据了 —— 三档并成一档，图标之间不再时大时小。
   ic-lg / ic-md 留着不删：页面里还有几十处在用，留成同义词，
   一处一处去删只会制造一次没有收益的大改。 */
.card-title.ic::before{
  content:"";width:26px;height:26px;flex-shrink:0;
  background:var(--ic) center/contain no-repeat;
}
.card-title.ic{justify-content:flex-start;gap:8px}
.card-title.ic-lg::before,.card-title.ic-md::before{width:26px;height:26px}
.card-title.ic-lg,.card-title.ic-md{gap:8px}
.card-title.ic > span:last-child{margin-left:auto}
/* 上面那条推的是「标题右边那句附注」。可要是标题本身被 <span> 包起来、
   后面又没有附注（免登录页的「1. 给哪位博主打卡*」就是这样：
   span 里装着标题和那颗必填星号），它自己既是 first 又是 last ——
   auto 边距就把整个标题推到卡片最右边去了。这一条把那种情况排除掉。 */
.card-title.ic > span:first-child:last-child{margin-left:0}

/* ---- 报酬卡片右下角的星星猫 ---- */
.reward-card::after{
  content:"";position:absolute;right:-10px;bottom:-14px;width:96px;height:96px;
  opacity:.85;pointer-events:none;
  background:url(/art/cat-star.png) center/contain no-repeat;
}
.reward-title,.reward-total,.reward-row,.reward-note{position:relative;z-index:1}
.reward-note{padding-right:70px}

/* ---- 「我的」页头像卡右侧的爱心猫 ---- */
.profile-card{position:relative;overflow:hidden}
.profile-card::after{
  content:"";position:absolute;right:-6px;bottom:-12px;width:78px;height:78px;
  opacity:.9;pointer-events:none;
  background:url(/art/cat-heart.png) center/contain no-repeat;
}
.profile-info{position:relative;z-index:1;padding-right:62px}

/* ============================================================
   v2.7：超级管理员控制台（总览 / 运营 / 管理）
   ============================================================ */

/* ---- 总览顶部 ---- */
/* 三张首页（超管总览 / 小助理工作台 / 博主首页）共用的问候横幅。
   以前只有超管有，叫 .adm-hero；另外两张还停在老的 .hero 上，
   同一个平台三种长相。现在归一，身份的差别只剩右下角那只猫。 */
.role-hero{
  --cat:url(/art/cat-analyst.png);
  position:relative;overflow:hidden;
  background:linear-gradient(135deg,#ffe08a 0%,var(--sun) 52%,#ffb01f 100%);
  border-radius:22px;padding:16px 16px 17px;margin-bottom:12px;
  box-shadow:0 6px 20px rgba(255,171,0,.28);
}
/* 猫压在右下角，主内容留出 120px 让位，不跟文字打架。
   哪只猫由页面自己用 --cat 指定：总览是拿放大镜看报表的，
   小助理是抱着记事板的，博主是顶着星星的。 */
.role-hero::after{
  content:"";position:absolute;right:-10px;bottom:-8px;width:150px;height:92px;
  pointer-events:none;
  background:var(--cat) right bottom/contain no-repeat;
}
.role-hero-main{position:relative;z-index:1;padding-right:120px}
.role-hero-app{font-size:12px;font-weight:800;color:#8a6412;letter-spacing:.5px}
.role-hero-hi{font-size:23px;font-weight:900;color:#4a3200;letter-spacing:-.5px;margin-top:2px;line-height:1.25}
.role-hero-sub{font-size:12px;color:#7a5400;font-weight:600;margin-top:5px;line-height:1.6}

/* ---- 今日对比 ---- */
.delta-line{font-size:11.5px;color:var(--ink-3);margin-top:9px;line-height:1.7;font-weight:600}
.delta-line .up{color:#1d8f58;font-weight:800}
.delta-line .down{color:#e0552a;font-weight:800}
.delta-line .flat{color:var(--ink-3);font-weight:800}

/* ---- 七日柱状图：纯 CSS，不引图表库 ---- */
.spark{display:flex;align-items:flex-end;gap:6px;height:110px;padding-top:4px}
.spark-col{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;height:100%}
.spark-n{font-size:11px;font-weight:800;color:var(--ink);margin-bottom:3px}
.spark-bar{
  flex:1;width:100%;min-height:0;border-radius:8px 8px 4px 4px;
  background:var(--sun-soft);display:flex;align-items:flex-end;overflow:hidden;
}
.spark-bar i{
  display:block;width:100%;border-radius:8px 8px 4px 4px;
  background:linear-gradient(180deg,var(--sun),var(--sun-deep));
}
.spark-col:last-child .spark-bar i{background:linear-gradient(180deg,#ff9d3d,var(--coral))}
.spark-x{font-size:10px;color:var(--ink-3);margin-top:5px;font-weight:600}

/* ---- 一屏里最大的那个数字 ----
   博主数据页、小助理统计页的第一行。放大到 40px 是有意的：
   这一页存在的理由就是这个数，其它都是它的注解。 */
.bignum{display:flex;align-items:baseline;flex-wrap:wrap;gap:8px;margin:4px 0 5px}
.bignum b{font-size:40px;font-weight:900;color:var(--ink);line-height:1;letter-spacing:-1px}
.bignum-u{font-size:13px;font-weight:700;color:var(--ink-3)}

/* ---- 环比标签 ----
   一个月的总数单看没有意义，所以凡是月度数字旁边都挂一个它。
   涨用绿、跌用珊瑚橙，跟「今日对比」那一行是同一套颜色语言。 */
.cmp{
  display:inline-flex;align-items:center;line-height:1;
  padding:7px 9px 4px;border-radius:var(--r-pill);   /* D=3：11.5px 那档要补 3 */
  font-size:11.5px;font-weight:800;white-space:nowrap;
}
/* ---- 同一件事的「一句话」版 ----
   给旁边已经写着上月数字的行用：只上色，不给底、不给 padding。
   关键就在不给底 —— 药丸 21.5px，而这些行的 line-height 只有 19.2px，
   一挂上去行就被撑破，「我负责的打卡用户」那张卡里
   药丸底边离下面那排色卡正好 0px，看着就是贴上去了。
   纯文字不改变行高，贴不上去。 */
.cmp-t{font-weight:800}
.cmp-t.up{color:#1d8f58}
.cmp-t.down{color:#e0552a}

.cmp.up{background:var(--green-soft);color:#1d8f58}
.cmp.down{background:var(--coral-soft);color:#e0552a}
.cmp.flat{background:#f2f2f2;color:var(--ink-3)}

/* ---- 本月每天一根柱子 ----
   31 根柱子挤在 400px 里写不下数字，所以柱子上不写数，
   只在下面标首 / 中 / 末三个日号，具体数值走 title。 */
.mbars{display:flex;align-items:flex-end;gap:2px;height:96px;padding-top:4px}
/* 每一天都先画一条到顶的浅色槽，实心部分是当天的量 ——
   跟「近 7 天」那张图同一套读法：空槽 = 那天没人打卡，一眼看得出断在哪几天。 */
.mbar{
  flex:1;min-width:0;height:100%;overflow:hidden;
  border-radius:3px 3px 2px 2px;background:var(--sun-soft);
  display:flex;flex-direction:column;justify-content:flex-end;
}
/* 还没到的日子用中性灰，别跟「到了但没人打」混成一种颜色 */
.mbar.future{background:#f4f0e8}
.mbar i{
  display:block;width:100%;
  background:linear-gradient(180deg,var(--sun),var(--sun-deep));
}
.mbar.today i{background:linear-gradient(180deg,#ff9d3d,var(--coral))}
.mbars-x{
  display:flex;justify-content:space-between;margin-top:5px;
  font-size:10px;color:var(--ink-3);font-weight:600;
}

/* ============ 新手指导 ============
   一步只讲一件事：一张图、一句标题、一段话、一排按钮。
   图放在最上面而不是当背景 —— 它是这一步的「这是在说什么」，不是装饰。 */
.gd-dots{display:flex;justify-content:center;gap:6px;margin:2px 0 14px}
.gd-dots i{
  width:7px;height:7px;border-radius:50%;background:#eee5d6;
  transition:width .18s ease;
}
.gd-dots i.past{background:var(--sun-line)}
.gd-dots i.on{width:20px;border-radius:4px;background:var(--sun-deep)}
.gd-art{
  width:120px;height:120px;margin:0 auto 12px;
  background-size:contain;background-repeat:no-repeat;background-position:center;
}
.gd-h{font-size:19px;font-weight:900;color:var(--ink);text-align:center;letter-spacing:-.3px}
.gd-p{
  font-size:13.5px;color:var(--ink-2);line-height:1.9;font-weight:600;
  margin:10px 2px 0;
  /* 内容长短不一，给个上限自己滚，别把按钮顶出屏幕 */
  max-height:38vh;overflow-y:auto;-webkit-overflow-scrolling:touch;
}
.gd-p b{color:var(--ink);font-weight:800}
.gd-btns{display:flex;gap:8px;margin-top:16px}
.gd-btns .btn{flex:1;height:44px;min-height:44px;font-size:14px;padding:0 10px}
.gd-skip{
  text-align:center;margin-top:10px;font-size:12px;
  color:var(--ink-4);font-weight:600;padding:4px;
}

/* ============ 极简打卡 ============
   完整流程是五屏，这一页把同一件事压成一屏一个号。
   所以版式上只做一件事：把「当前这个号 + 那个大按钮」放到最显眼的位置，
   其余全部退成参考信息。 */
.quick-bar{
  display:flex;align-items:center;justify-content:space-between;
  font-size:12.5px;color:var(--ink-3);font-weight:600;margin:2px 4px 10px;
}
.quick-bar b{font-size:16px;color:var(--sun-deep);font-weight:900;margin:0 2px}
.quick-card{
  background:var(--card);border-radius:var(--r-card);
  padding:18px 16px 16px;box-shadow:var(--shadow);margin-bottom:12px;
}
.quick-name{font-size:22px;font-weight:900;color:var(--ink);letter-spacing:-.4px;line-height:1.25}
.quick-plat{font-size:12.5px;color:var(--ink-3);font-weight:600;margin-top:3px}
.quick-notice{
  margin-top:11px;padding:10px 12px;border-radius:var(--r-inner);
  background:var(--sky-soft);color:#2f6ea8;
  font-size:12.5px;line-height:1.75;font-weight:600;
}
.quick-label{font-size:12px;color:var(--ink-3);font-weight:700;margin:14px 0 7px}
.quick-acts{display:flex;flex-wrap:wrap;gap:7px}
/* 项目按钮做得够大：这一页的前提是「单手、快速、不看仔细」 */
.qact{
  padding:9px 15px 8px;border-radius:var(--r-pill);   /* D=1 */
  background:#f4f1ea;color:var(--ink-3);
  font-size:13.5px;font-weight:800;border:1.5px solid transparent;
}
.qact.on{background:var(--sun-soft);color:#8a6412;border-color:var(--sun-line)}
.qact:active{transform:scale(.96)}
/* 主按钮比别处更高更沉：整页就这一个动作 */
.quick-go{height:52px;min-height:52px;font-size:17px;margin-top:16px}
.quick-go:disabled{opacity:.6}
.quick-hint{font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:8px;text-align:center;line-height:1.7}
.quick-skip{
  margin-top:12px;text-align:center;font-size:13px;
  color:var(--sun-deep);font-weight:800;padding:6px;
}
.quick-foot{font-size:11.5px;color:var(--ink-4);line-height:1.8;text-align:center;margin:4px 6px 0}
.quick-done{
  background:linear-gradient(135deg,#ffe08a 0%,var(--sun) 52%,#ffb01f 100%);
  border-radius:22px;padding:22px 16px;margin-bottom:12px;text-align:center;
  box-shadow:0 6px 20px rgba(255,171,0,.28);
}
.quick-done-t{font-size:21px;font-weight:900;color:#4a3200}
.quick-done-s{font-size:12.5px;color:#7a5400;font-weight:600;margin-top:4px}
/* 进度清单：已打的压暗，当前的高亮，没打的可点 */
.qrow{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:11px 0;border-bottom:var(--hairline);
  font-size:14px;font-weight:700;color:var(--ink);
}
.qrow:last-child{border-bottom:none}
.qrow.done{color:var(--ink-4)}
.qrow.cur{color:var(--sun-deep)}

/* ---- 模式切换卡 ---- */
.mode-pick{
  border:1.5px solid var(--sun-line);border-radius:var(--r-inner);
  padding:12px 13px;margin-top:10px;background:#fffdf7;
}
.mode-pick.on{background:var(--sun-soft);border-color:var(--sun-deep)}
.mode-t{font-size:15px;font-weight:900;color:var(--ink);display:flex;align-items:center;gap:8px}
.mode-now:not(:empty){
  display:inline-flex;align-items:center;line-height:1;
  padding:5px 8px 3px;border-radius:var(--r-pill);
  background:var(--sun-deep);color:#fff;font-size:10.5px;font-weight:800;
}
.mode-s{font-size:12px;color:var(--ink-2);font-weight:600;line-height:1.75;margin-top:4px}
.mode-s b{color:var(--ink)}

/* ---- 规则正文 ----
   使用规范 / 注册须知在三个地方出现（登录页弹窗、独立页面、补确认弹窗），
   共用这一套排版。 */
.terms{font-size:13px;color:var(--ink-2);line-height:1.85}
.terms-t{font-size:16px;font-weight:900;color:var(--ink);margin-bottom:4px}
.terms-i{font-size:12.5px;color:var(--ink-3);font-weight:600;margin-bottom:12px;line-height:1.8}
.terms-s{margin-top:14px}
.terms-h{font-size:14px;font-weight:900;color:var(--ink);margin-bottom:5px}
.terms ol{margin:0;padding-left:20px}
.terms li{margin:5px 0}
.terms b{color:var(--ink);font-weight:800}
/* 弹窗里放得下的高度，超了自己滚 —— 不能让「同意」按钮被挤出屏幕 */
.terms-box{max-height:46vh;overflow-y:auto;-webkit-overflow-scrolling:touch;
  padding:2px 2px 6px;margin-bottom:10px}
.terms-box .terms + .terms{margin-top:18px;padding-top:16px;border-top:var(--hairline)}

/* ---- 同意勾选 ---- */
.chk-line{
  display:flex;align-items:flex-start;gap:8px;margin-top:14px;
  font-size:12.5px;color:var(--ink-2);font-weight:600;line-height:1.7;
}
/* 这里曾经把框缩到 17px 又留着上面那套像素定位的勾，勾就戳出框外了。
   现在勾是按比例画的，缩放没问题；顺手把 17 抬到 18，
   跟旁边 12.5px 的两行文字高度更配。accent-color 是多余的（我们自己画的勾），删掉。 */
.chk-line input{
  width:18px;height:18px;flex-shrink:0;margin:2px 0 0;
}
.chk-line .op-link{cursor:pointer}

/* ---- 分组小标题 ----
   小助理统计页的「该去看看的人」里，每一档单独成组：
   该做的动作不一样（没分配号要去分配，断档要去催），不能混成一张长名单。 */
.grp{margin-top:12px}
.grp:first-child{margin-top:2px}
.grp-t{
  display:flex;align-items:center;gap:7px;
  font-size:13.5px;font-weight:900;color:var(--ink);
}
.grp-n{
  display:inline-flex;align-items:center;justify-content:center;line-height:1;
  min-width:20px;height:20px;padding:3px 7px 0;box-sizing:border-box;  /* D=3 */
  border-radius:var(--r-pill);background:var(--coral-soft);color:#e0552a;
  font-size:11.5px;font-weight:900;
}
.grp-s{font-size:11.5px;color:var(--ink-3);font-weight:600;margin:2px 0 4px;line-height:1.6}

/* ---- 带大数字的列表行 ----
   跟 .todo 同一个骨架，右边换成「大数字 + 一行小字」。
   博主首页列名下的号用它：左边是号和状态，右边是本月被打卡多少次。 */
.arow{display:flex;align-items:center;gap:10px;padding:11px 0;border-bottom:var(--hairline)}
.arow:last-child{border-bottom:none}
.arow-body{flex:1;min-width:0}
.arow-t{
  font-size:14px;font-weight:800;color:var(--ink);
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
}
.arow-s{font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:2px}
.arow-n{flex-shrink:0;text-align:right;min-width:52px}
.arow-n b{display:block;font-size:20px;font-weight:900;color:var(--sun-deep);line-height:1.1}
.arow-n i{display:block;font-size:10.5px;font-style:normal;font-weight:600;color:var(--ink-3);margin-top:1px}

/* ---- 待处理条目 ---- */
.todo{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:var(--hairline)}
.todo:last-child{border-bottom:none}
.todo-body{flex:1;min-width:0}
.todo-t{font-size:14px;font-weight:800;color:var(--ink)}
.todo-s{font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:1px}
.todo-n{
  display:inline-flex;align-items:center;justify-content:center;line-height:1;
  flex-shrink:0;min-width:26px;height:26px;padding:0 8px;box-sizing:border-box;
  border-radius:var(--r-pill);background:var(--coral-soft);color:#e0552a;
  font-size:13px;font-weight:900;   /* D=0：13px 那档字本来就偏下，不用再往下压 */
}

/* ---- 搜索条 ---- */
.searchbar{display:flex;gap:8px;margin-bottom:12px}
.search-input{
  flex:1;min-width:0;height:42px;padding:0 15px;box-sizing:border-box;
  border:1.5px solid var(--sun-line);border-radius:var(--r-pill);
  background:var(--card);font-size:14px;color:var(--ink);outline:none;
}
.search-input::placeholder{color:var(--ink-4)}
.search-go{
  flex-shrink:0;height:42px;padding:0 18px;border-radius:var(--r-pill);
  background:var(--sun);color:#4a3200;font-size:14px;font-weight:800;
}

/* ---- 运营工作区的模块格 ----
   浅色底衬 + 左上角一个图标 + 标题 + 一行说明。
   插画只当图标用，不铺满整格：格子是「可点的功能入口」，
   让插画占满就成了六张贴纸，扫一眼反而找不到要去哪。 */
.mod-grid{display:flex;flex-wrap:wrap;gap:8px}
.mod{
  flex:1 1 calc(50% - 4px);min-width:0;box-sizing:border-box;
  background:var(--sun-soft);border-radius:var(--r-inner);padding:13px 12px;
}
/* 「点进去有几件事等着你做」。跟底部导航上那个未读角标是同一个样子 ——
   同一种红气泡在这个平台里只能有一个意思，换个长相就得让人重新学一遍。
   **只在有事的时候出现**（没事时 hidden）：一个永远挂在那儿的数字，
   两周之后就没人看了。 */
.mod-n{
  /* 紧跟在模块标题右侧（v2.31.3 起不再定位于卡片右上角） */
  display:inline-block;vertical-align:middle;margin-left:6px;flex-shrink:0;
  min-width:18px;height:18px;line-height:18px;padding:0 5px;box-sizing:border-box;
  border-radius:var(--r-pill);background:var(--coral);color:#fff;
  font-size:11px;font-weight:800;font-style:normal;text-align:center;
  box-shadow:0 0 0 2px rgba(255,255,255,.75);
}
.mod:active{transform:scale(.98)}
.mod:nth-child(4n+2){background:var(--sky-soft)}
.mod:nth-child(4n+3){background:var(--green-soft)}
.mod:nth-child(4n+4){background:var(--pink-soft)}
.mod-ic{
  /* 六张插画都按「圆角底板」的高度归一化过（底板 300px / 画布 388px），
     所以这里给同一个尺寸，它们看上去就一样大。 */
  display:block;width:52px;height:52px;margin:-2px 0 4px -3px;
  background-size:contain;background-repeat:no-repeat;background-position:left center;
}
.mod-t{font-size:14.5px;font-weight:800;color:var(--ink);display:flex;align-items:center;min-width:0}
.mod-t > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mod-n[hidden]{display:none}
/* 本人头像可点击，打开「修改资料」浮窗 */
.avatar-self{cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}
.avatar-self:active{transform:scale(.96)}
/* 说明只占一行（v2.40.4）：说明长短不一时换行会把同一行的两格撑高，各格高度不一致 */
.mod-s{font-size:11px;color:var(--ink-3);font-weight:600;margin-top:2px;line-height:1.5;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* ---- 档案页的键值行 ---- */
.info-row{
  display:flex;justify-content:space-between;gap:12px;
  padding:9px 0;border-bottom:var(--hairline);font-size:13px;
}
.info-row:last-child{border-bottom:none}
.info-row .k{color:var(--ink-3);flex-shrink:0;font-weight:600}
.info-row .v{color:var(--ink);font-weight:700;text-align:right;word-break:break-all}

.btn-row{display:flex;gap:9px}
.btn-row .btn{flex:1;height:42px;min-height:42px;font-size:14px}

/* ---- 操作日志 ---- */
.log{padding:10px 0;border-bottom:var(--hairline)}
.log:last-child{border-bottom:none}
.log-head{display:flex;justify-content:space-between;gap:10px;align-items:baseline}
.log-a{font-size:13.5px;font-weight:800;color:var(--ink)}
.log-t{font-size:11px;color:var(--ink-4);flex-shrink:0;font-weight:600}
.log-who{font-size:11.5px;color:var(--ink-3);margin-top:2px;font-weight:600}
.log-d{font-size:11px;color:var(--ink-4);margin-top:2px;word-break:break-all}

/* ---- 打卡管理里的记录行 ---- */
.ck-row{display:flex;gap:10px;padding:10px 0;border-bottom:var(--hairline)}
.ck-row:last-child{border-bottom:none}
.ck-main{flex:1;min-width:0}
.ck-b{font-size:14px;font-weight:800;color:var(--ink)}
.ck-side{flex-shrink:0;text-align:right;display:flex;flex-direction:column;align-items:flex-end;gap:4px}

/* ============================================================
   v2.8：本月打卡日历 + 场景猫提示条
   ============================================================ */

/* ---- 打卡页第一步的「打卡须知」 ----
   借用 .rule-line 会跟签约编辑器那套样式缠在一起，那边改一下这边就歪，所以单开一个。 */
.note-line{
  display:flex;align-items:baseline;gap:10px;
  padding:7px 0;border-bottom:var(--hairline);font-size:13px;
}
.note-line:last-of-type{border-bottom:none}
.note-line span{color:var(--ink-3);font-weight:700;flex-shrink:0}
.note-line b{margin-left:auto;text-align:right;color:var(--ink);font-weight:800}

/* ---- 本月打卡日历 ----
   （v2.12.2 换掉了原来的成就徽章：徽章写的是自己编的门槛，日历写的是真实记录） */
.cal-head,.cal{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}
.cal-head{margin-bottom:5px}
.cal-head i{
  font-style:normal;text-align:center;font-size:11px;
  font-weight:700;color:var(--ink-4);
}
.cal-d{
  font-style:normal;aspect-ratio:1;display:flex;align-items:center;justify-content:center;
  border-radius:9px;font-size:12px;font-weight:800;
  /* 没打卡的那天要一眼看出是「空的」。用 --sun-soft 会偏暖，
     跟 lv1 那档挨得太近，扫一眼分不出打没打过。 */
  background:#f2efe8;color:var(--ink-4);
}
/* 三档深浅：打过的格子越深说明那天打得越多 */
.cal-d.lv1{background:#ffe6a8;color:#8a5c00}
.cal-d.lv2{background:var(--sun);color:#4a3200}
.cal-d.lv3{background:var(--sun-deep);color:#fff}
.cal-d.cal-pad{background:none}
/* 还没到的日子淡一点，免得看着像「漏打了」 */
.cal-d.cal-future{opacity:.38}
/* 今天那一格：用 outline + offset，中间那道缝露出卡片底色。
   直接描一圈 sun-deep 的话，遇上 lv3（底色就是 sun-deep）等于没画。 */
.cal-d.cal-today{outline:2px solid var(--ink-2);outline-offset:2px}
.cal-legend{
  display:flex;align-items:center;justify-content:flex-end;gap:4px;
  margin-top:9px;font-size:10.5px;color:var(--ink-4);font-weight:700;
}
.cal-legend .cal-d{width:14px;height:14px;aspect-ratio:auto;border-radius:4px;font-size:0}

/* 报酬挂在「我的排名」下面：这笔钱是按名次算的，放一起才说得通 */
.myrank-pay{
  display:flex;align-items:center;gap:8px;
  margin-top:10px;padding-top:10px;border-top:var(--hairline);
  font-size:13px;font-weight:800;color:var(--ink-2);
}
.myrank-pay b{font-size:19px;font-weight:900;color:var(--sun-deep)}
.myrank-pay .muted{margin-left:auto;font-weight:600}

/* ---- 场景猫提示条 ---- */
.scene-note{
  position:relative;overflow:hidden;min-height:86px;
  background:var(--sun-soft);border-radius:var(--r-card);
  padding:14px 150px 14px 15px;margin-bottom:12px;
  display:flex;align-items:center;
}
.scene-note::after{
  content:"";position:absolute;right:-8px;bottom:-6px;width:158px;height:96px;
  pointer-events:none;background-position:right bottom;
  background-size:contain;background-repeat:no-repeat;
}
.scene-tired{background:var(--coral-soft)}
.scene-tired::after{background-image:url(/art/cat-tired.png)}
.scene-analyst{background:var(--sky-soft)}
.scene-analyst::after{background-image:url(/art/cat-analyst.png)}
.scene-txt{position:relative;z-index:1;font-size:12.5px;line-height:1.75;color:var(--ink-2)}
.scene-txt b{font-size:14.5px;color:var(--ink);font-weight:800}

/* 窄屏时猫让位，别把字挤成一列 */
@media (max-width:360px){
  .scene-note{padding-right:118px}
  .scene-note::after{width:124px;height:76px}
}

/* ---- v2.8.1：更多素材上墙 ---- */

/* 搜索框里的放大镜 */
.searchbar{position:relative}
.search-ic{
  position:absolute;left:13px;top:50%;transform:translateY(-50%);
  width:19px;height:19px;pointer-events:none;z-index:1;
  background:url(/art/t-search.png) center/contain no-repeat;
}
.searchbar .search-input{padding-left:39px}

/* 今日对比的升/降箭头（素材由 app.js 用 --ic 指定，st-up / st-down） */
.d-ic{
  display:inline-block;width:13px;height:13px;vertical-align:-2px;margin-right:3px;
  background:var(--ic) center/contain no-repeat;
}

/* 页签上的小图标（筛选统计） */
.tab.ic{display:flex;align-items:center;justify-content:center;gap:5px}
.tab.ic::before{
  content:"";width:15px;height:15px;flex-shrink:0;
  background:var(--ic) center/contain no-repeat;
}

/* 「已停用」标签：配一个关掉的开关，一眼分得出是停用不是拒绝 */
.tag-off{
  background-color:#eeeae2;color:#8a8177;
  background-image:url(/art/st-ban.png);
}

.thin-note{
  text-align:center;color:var(--ink-3);font-size:12px;
  padding:4px 12px 12px;line-height:1.7;
}

/* ---- 头像 ---- */
.avatar-wrap{position:relative;width:56px;height:56px;flex-shrink:0}
.avatar-wrap .avatar{width:100%;height:100%}
/* 身份默认头像：四张素材都归一到 256×256 的画布，里头那个圆一律 222px，
   所以整张图是圆的 256/222 ≈ 1.153 倍 —— 把圆撑到头像大小时，
   日历、画笔、耳机、皇冠就自然露在圆外面，不会被切。
   （素材交过来时四张的圆直径是 202~222 不等，接进来的时候统一量过、缩过一遍。） */
.avatar-art{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:115.3%;height:115.3%;pointer-events:none;
  background-size:contain;background-repeat:no-repeat;background-position:center;
}
/* 用身份头像时，底下那层橙色圆盘要撤掉。
   两个圆一样大、边缘都有抗锯齿，差一个像素就会在上沿露出一道橙边，
   看着像「有个图层没盖住」。素材本身是不透明的，不需要任何衬底。 */
.avatar-wrap .avatar.avatar-blank{background:none}
/* 自己传的头像：图是方的，用 border-radius 裁成圆，cover 铺满不留白边。
   跟身份头像不一样 —— 身份头像自带圆和外露的挂件，所以要 contain 且放大；
   这张是一张普通照片，要的是正好填满那个圆。 */
.avatar-own{
  position:absolute;left:0;top:0;width:100%;height:100%;
  border-radius:50%;pointer-events:none;
  background-size:cover;background-repeat:no-repeat;background-position:center;
}
/* 弹窗里的大号预览 */
.avatar-wrap.avatar-lg{width:76px;height:76px}

/* 「修改资料」里的头像那一块 */
.av-edit{display:flex;align-items:center;gap:14px;margin:6px 0 14px}
.av-ops{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:8px}
.av-ops .btn{flex:1;min-width:88px;padding:9px 10px;font-size:13px}
.av-ops .btn[disabled]{opacity:.45}
.av-tip{width:100%;font-size:11.5px}

/* ============ 统计口径编辑器 / 按口径试算（v2.20） ============ */

/* 口径列表里那一句机读生成的说明。
   组合一多，光看名字和几个勾没人说得清它在算什么，所以每条都印一句人话。 */
.sf-text{
  margin-top:7px;padding:8px 11px;border-radius:var(--r-inner);
  background:var(--sun-soft);color:#8a6412;
  font-size:12.5px;line-height:1.7;font-weight:700;
}

/* ---- 弹窗里的两段式 ---- */
.sf-sec{
  display:flex;align-items:center;gap:7px;
  margin:16px 0 9px;font-size:13px;font-weight:800;color:var(--ink);
}
.sf-sec::before{
  content:'';width:4px;height:13px;border-radius:2px;background:var(--sun);
}
/* 弹窗里的分段控件不再投影：白底压白底只会糊成一坨，改用浅槽 */
.sf-segs{background:#f4f1ea;box-shadow:none;margin-bottom:10px}
.sf-segs .seg{padding:7px 3px;font-size:12.5px}
.sf-segs .seg.on{background:var(--card);color:var(--sun-deep);box-shadow:0 2px 6px rgba(255,171,0,.18)}

/* 「至少 N 项」那一行 */
.sf-row{
  display:flex;align-items:center;gap:8px;margin-top:10px;
  font-size:13px;font-weight:700;color:var(--ink-2);
}
.sf-num{width:64px;margin:0;padding:7px 8px;text-align:center;font-weight:800}
.sf-of{font-size:12px;color:var(--ink-3);font-weight:600}

/* 加权和的权重表：一行一个项目，右边一个数字框 */
.sf-w{
  margin-top:10px;border-radius:var(--r-inner);
  background:#faf7f1;padding:4px 12px;
}
.sf-wrow{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:7px 0;border-bottom:var(--hairline);
}
.sf-wrow:last-child{border-bottom:none}
.sf-wrow span{font-size:13px;font-weight:700;color:var(--ink-2)}

/* 实时预览。边勾边念，不用存了再猜 */
.sf-preview{
  margin-top:14px;padding:10px 12px;border-radius:var(--r-inner);
  background:var(--sky-soft);line-height:1.75;
}
.sf-preview span{
  display:block;font-size:11.5px;font-weight:700;color:#5b8cb8;margin-bottom:2px;
}
.sf-preview b{font-size:13px;font-weight:800;color:#215a8d}

/* ---- 试算页 ---- */

/* 「当前算法 ¥X → 按这个口径 ¥Y」。两个金额一样大，让人自己比 */
.sim-total{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-top:10px;padding:12px;border-radius:var(--r-inner);
  background:var(--cream-deep);
}
.sim-total>div{flex:1;min-width:92px}
.sim-total span{display:block;font-size:11.5px;font-weight:700;color:var(--ink-3)}
.sim-total b{font-size:19px;font-weight:800;color:var(--ink);letter-spacing:.3px}

/* 箭头是个纯 CSS 的小三角，省一张图，也不怕字体缺字 */
.sim-arrow{
  flex:none;width:0;height:0;
  border-top:5px solid transparent;border-bottom:5px solid transparent;
  border-left:8px solid var(--ink-4);
}

.sim-row{
  display:flex;align-items:center;gap:10px;
  padding:11px 0;border-bottom:var(--hairline);
}
.sim-row:last-of-type{border-bottom:none}
/* 一条都没命中的号：整行压暗，但仍然列出来 ——
   「谁被这个口径筛掉了」正是这一页最该让人看见的东西。 */
.sim-row.out{opacity:.55}

.sim-who{flex:1;min-width:0}
.sim-name{
  font-size:14px;font-weight:800;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.sim-who .muted{font-size:11.5px;margin-top:1px}

.sim-rank{display:flex;align-items:center;gap:6px;flex:none}
.sim-old{font-size:12.5px;font-weight:700;color:var(--ink-3)}
.sim-new{
  display:inline-flex;align-items:center;line-height:1;
  font-size:12.5px;font-weight:800;color:var(--ink-2);
  padding:6px 8px 5px;border-radius:var(--r-pill);background:#f2f2f2;  /* D=1：12.5px 那档 */
}
.sim-new.up{background:var(--green-soft);color:#1d8f58}
.sim-new.down{background:var(--coral-soft);color:#e0552a}

.sim-money{flex:none;min-width:78px;text-align:right}
.sim-money b{display:block;font-size:14.5px;font-weight:800;color:var(--ink)}
.sim-money i{font-style:normal;font-size:11px;font-weight:700;color:var(--ink-3)}

/* ============ 免登录打卡页（v2.22） ============ */

/* 这一页没有顶栏也没有底栏（见 app.js 里 render() 那条 #/p/ 分流），
   所以四周的留白、标题、页脚全要自己长出来 —— 不能靠外壳。 */
.p-pub{background:var(--cream)}
.pub-wrap{padding:22px 16px 34px;max-width:520px;margin:0 auto}

.pub-head{text-align:center;margin-bottom:20px}
.pub-head .logo{width:72px;height:72px;margin:0 auto 10px}
.pub-title{font-size:20px;font-weight:900;color:var(--ink)}
.pub-note{
  font-size:12.5px;color:var(--ink-2);margin-top:8px;line-height:1.75;
  background:var(--sun-soft);border-radius:var(--r-inner);padding:9px 12px;text-align:left;
}

/* 「已经认出你是谁」那一条。放在最上面，而且一直留着 ——
   连打好几个号的时候，人需要随时能确认自己没有打到别人的账号上。 */
.pub-who{display:flex;align-items:center;justify-content:space-between;gap:10px}
.pub-who-n{font-size:16px;font-weight:900;color:var(--ink)}

.pub-label{font-size:12px;color:var(--ink-3);font-weight:700;margin:14px 0 7px}
.pub-url{width:100%;box-sizing:border-box;background:var(--cream);
  border:1px solid #f2e8d8;border-radius:var(--r-inner);padding:11px 13px;font-size:14px}
.pub-go{margin-top:4px}

.pub-foot{
  margin-top:20px;text-align:center;
  font-size:11.5px;color:var(--ink-4);line-height:1.8;
}

/* ---- 登录页上那个入口 ---- */
.pub-entry{cursor:pointer;background:var(--sky-soft);box-shadow:none}
.pub-entry-t{font-size:14px;font-weight:800;color:#215a8d}
.pub-entry-s{font-size:12px;color:#5b8cb8;margin-top:4px;line-height:1.7;font-weight:600}
.pub-entry:active{transform:scale(.99)}

/* ---- 链接管理页 ---- */
/* 链接本身就是凭据，所以要能整串看见、整串复制 ——
   截断成「…」再让人去猜后半截是最糟的做法。 */
.pub-url-box{
  margin-top:8px;padding:9px 11px;border-radius:var(--r-inner);
  background:#faf7f1;border:1px dashed var(--sun-line);
  font-size:11.5px;color:var(--ink-2);line-height:1.6;
  word-break:break-all;cursor:pointer;
}
.pub-url-box:active{background:var(--sun-soft)}

/* ============ 长列表的搜索（v2.31） ============
   见 app.js 里 enhanceLists 那段：选项超过 8 个的勾选列表 / 下拉框，自动加。 */

/* 被筛掉的项靠 hidden 属性藏。可这几种元素自己写了 display:flex，
   会把 [hidden] 的 display:none 盖掉 —— 这里压回去。 */
.pick[hidden],.bpick[hidden],.pk-group[hidden],.sheet-opt[hidden],.sheet-group[hidden],
.list-search-none[hidden]{display:none!important}

.list-search{
  display:flex;align-items:center;gap:8px;margin:0 0 10px;
  flex:1 1 100%;               /* 落在 .blogger-picks 那种 flex-wrap 容器里时，独占一行 */
}
.list-search-in{
  flex:1;min-width:0;box-sizing:border-box;height:38px;
  border:1.5px solid #efe3cc;border-radius:var(--r-pill);background:var(--card);
  padding:0 14px 0 36px;font:inherit;font-size:13.5px;color:var(--ink);
  background-image:url(/art/t-search.png);background-repeat:no-repeat;
  background-position:12px center;background-size:16px 16px;
  -webkit-appearance:none;appearance:none;outline:none;
}
.list-search-in:focus{border-color:var(--sun)}
.list-search-only{
  flex:0 0 auto;font-size:12px;font-weight:800;color:var(--ink-3);
  padding:9px 12px 8px;border-radius:var(--r-pill);background:#f4f1ea;cursor:pointer;
  border:1.5px solid transparent;
}
.list-search-only.on{background:var(--sun-soft);color:#8a6412;border-color:var(--sun-line)}
.list-search-none{padding:18px 0}

/* 链接编辑弹窗里按博主分组 */
.pk-group{margin-bottom:12px}
.pk-ghead{
  display:flex;justify-content:space-between;align-items:center;
  font-size:12.5px;font-weight:800;color:var(--ink-2);margin:2px 2px 7px;
}
.pp-n-sel{float:right;font-weight:700;color:var(--ink-3)}
.pp-n-sel b{color:var(--sun-deep)}
.dialog .list-search{
  /* 弹窗里的列表是在弹窗自己里面滚的，搜索框钉在弹窗顶上，滚到底也不用回头找它。
     弹窗有 22px 上内边距，贴顶时要吃掉它。页面上不钉：页面顶上有导航条，钉上去会钻到它底下。 */
  position:sticky;top:-22px;z-index:2;background:var(--card);padding:8px 0 6px;margin-top:-8px;
}

/* 下拉框换成的按钮：长得跟原来那个下拉一样，右边一个小三角 */
.sel-btn{
  display:flex;align-items:center;cursor:pointer;position:relative;padding-right:30px;
  overflow:hidden;white-space:nowrap;text-overflow:ellipsis;
}
.sel-btn::after{
  content:"";position:absolute;right:13px;top:50%;margin-top:-3px;
  border:5px solid transparent;border-top:6px solid var(--ink-3);border-bottom:0;
}
.sel-btn.placeholder{color:var(--ink-3)}

/* 可搜的清单：从底下升上来的一张卡 */
.sheet-mask{
  position:fixed;inset:0;z-index:60;background:rgba(40,30,10,.38);
  display:flex;align-items:flex-end;justify-content:center;
}
.sheet{
  width:100%;max-width:480px;max-height:78vh;display:flex;flex-direction:column;
  background:var(--card);border-radius:22px 22px 0 0;
  padding:14px 14px calc(12px + env(safe-area-inset-bottom));box-sizing:border-box;
  box-shadow:0 -8px 30px rgba(80,60,20,.18);
}
.sheet-head{display:flex;justify-content:space-between;align-items:center;margin:0 2px 10px;font-size:15px;color:var(--ink)}
.sheet-q{flex:0 0 auto;margin-bottom:8px}
.sheet-list{overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1;min-height:0}
.sheet-group{font-size:11.5px;font-weight:800;color:var(--ink-3);margin:10px 4px 4px}
.sheet-opt{
  padding:12px 12px;border-radius:var(--r-inner);font-size:14px;font-weight:700;color:var(--ink);
  cursor:pointer;
}
.sheet-opt + .sheet-opt{border-top:var(--hairline)}
.sheet-opt.on{background:var(--sun-soft);color:var(--sun-deep)}
.sheet-opt.off{color:var(--ink-3);pointer-events:none}
.sheet-opt.off::after{content:'平台不符';float:right;font-size:12px;color:var(--ink-3)}
.sheet-opt:active{background:var(--cream)}

/* ============ 电脑挡在门外（v2.31） ============ */
.desk-block{text-align:center;padding:28px 20px;margin-top:40px}
/* 顶部的大图标与「等待审核中」等状态页一致：92px 的圆底，中间放 s-* 立体图标 s-device（144px 源图） */
.desk-block-ic{
  width:92px;height:92px;margin:0 auto 14px;border-radius:50%;background:var(--sky-soft);
  display:flex;align-items:center;justify-content:center;
}
.desk-block-ic::before{content:"";width:62px;height:62px;background:url(/art/s-device.png) center/contain no-repeat}
.desk-block-t{font-size:18px;font-weight:900;color:var(--ink);margin-bottom:8px}
.desk-block-s{font-size:13px;color:var(--ink-2);line-height:1.8}
.desk-block-url{margin-top:14px;word-break:break-all}
.desk-hint{background:var(--sky-soft);color:#215a8d}
/* 排名列表右侧数字的单位（次 / 项 / 分），跟领奖台上的一致 */
.n2-u{font-size:10.5px;font-weight:700;color:var(--ink-3);margin-left:2px}

/* ============ v2.31.4：长列表查找（月度结算 / 免登录打卡链接） ============ */
/* 顶部查找条：搜索框 + 排序 / 筛选小标签 + 一行结果统计 */
.finder{
  background:var(--card);border-radius:var(--r-card, 18px);padding:12px 12px 10px;margin-bottom:12px;
  box-shadow:0 1px 6px rgba(255,178,54,.08);
}
.finder .list-search-in{width:100%;height:40px}
.fd-row{display:flex;align-items:center;flex-wrap:wrap;gap:7px;margin-top:10px}
.fd-chip{
  font-size:12px;font-weight:800;color:var(--ink-3);cursor:pointer;
  padding:7px 12px 6px;border-radius:var(--r-pill);background:#f4f1ea;border:1.5px solid transparent;
  touch-action:manipulation;-webkit-user-select:none;user-select:none;
}
.fd-chip.on{background:var(--sun-soft);color:#8a6412;border-color:var(--sun-line)}
.fd-sp{flex:1}
.fd-sum{font-size:12px;color:var(--ink-3);margin-top:9px;font-weight:600}
.fd-sum b{color:var(--ink);font-weight:900}

/* 可折叠的结算卡片：收起时只剩一行摘要 */
.st-card{padding-top:12px;padding-bottom:12px}
.st-head{display:flex;align-items:center;gap:10px;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}
.st-main{flex:1;min-width:0;display:flex;flex-direction:column}
.st-main .user-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-sub{font-size:11.5px;color:var(--ink-3);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-chev{
  width:9px;height:9px;flex-shrink:0;margin-left:2px;
  border-right:2px solid var(--ink-4);border-bottom:2px solid var(--ink-4);
  transform:rotate(45deg) translate(-2px,-2px);transition:transform .15s;
}
.st-card.open .st-chev{transform:rotate(-135deg) translate(-2px,-2px)}
.st-body{margin-top:10px;padding-top:6px;border-top:var(--hairline)}
.st-meta{font-size:11.5px;line-height:1.7;margin-bottom:4px}
.st-all{display:block;text-align:center;padding:10px 0 2px}

/* 名次标记：前三名奖牌、第四名起底盘 + 数字（素材与排行榜一致） */
.rkm{
  display:inline-flex;align-items:center;justify-content:center;vertical-align:-5px;
  width:20px;height:20px;flex-shrink:0;margin-right:3px;
  background:center/contain no-repeat;font-style:normal;
  font-size:9px;font-weight:900;color:var(--ink-2);line-height:1;
}
.rkm-1{background-image:url(/art/medal-1.png)}
.rkm-2{background-image:url(/art/medal-2.png)}
.rkm-3{background-image:url(/art/medal-3.png)}
.rkm-n{background-image:url(/art/rank-plate.png)}
.rkm-none{color:var(--ink-4);font-size:13px}
.rkm.rkm-lg{width:34px;height:34px;font-size:12.5px;margin-right:0;vertical-align:middle}
.rki{display:inline-flex;align-items:center;white-space:nowrap}
.rki-sep{margin:0 4px;color:var(--ink-4)}
.s-rank-m{width:34px;flex-shrink:0;display:flex;justify-content:center}
.s-rank2{width:34px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;gap:2px}
.s-rank2 .rkm{margin-right:0}

/* 免登录链接编辑：按博主一行、可展开 */
.lk-sel{
  font-size:12.5px;color:#8a6412;background:var(--sun-soft);border-radius:var(--r-inner);
  padding:9px 12px;margin-bottom:9px;line-height:1.6;font-weight:600;
}
.lk-sel b{font-size:15px;color:var(--sun-deep);font-weight:900}
.lk-sel.empty-sel{background:#f4f1ea;color:var(--ink-3)}
.lk-q{width:100%;height:40px;display:block}
.lk-filters{margin-top:9px}
.lk-acts{margin:8px 0 6px}
.lk-acts .op-link{margin-left:12px}
.lk-list{display:flex;flex-direction:column;gap:7px}
.lk{background:#fbf8f1;border-radius:var(--r-inner);border:1.5px solid transparent}
.lk.has{border-color:var(--sun-line);background:#fffbef}
.lk-head{display:flex;align-items:center;gap:10px;padding:10px 12px}
.lk-head .box{cursor:pointer}
.box.part{background:var(--sun-soft);border-color:var(--sun);color:var(--sun-deep);font-size:0}
/* 部分选中的横线（v2.37.2）：用图形绘制，不再用「–」字符 —— 字符的位置随字体基线偏移，无法居中 */
.box.part::after{content:"";width:10px;height:2.5px;border-radius:2px;background:var(--sun-deep)}
.lk-main{flex:1;min-width:0;display:flex;flex-direction:column;cursor:pointer;touch-action:manipulation}
.lk-name{font-size:14px;font-weight:800;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lk-sub{font-size:11.5px;color:var(--ink-3);margin-top:2px}
.lk .st-chev{cursor:pointer}
.lk.open .st-chev{transform:rotate(-135deg) translate(-2px,-2px)}
.lk-accs{padding:0 12px 8px 44px;display:flex;flex-direction:column}
.lk-acc{
  display:flex;align-items:center;gap:10px;padding:9px 0;border-top:var(--hairline);cursor:pointer;
  touch-action:manipulation;-webkit-user-select:none;user-select:none;
}
.lk-acc .box{width:20px;height:20px;border-radius:6px;font-size:12px}
.lk-acc-n{flex:1;min-width:0;font-size:13.5px;color:var(--ink);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lk-acc-p{font-size:11.5px;color:var(--ink-3);flex-shrink:0}

/* 免登录打卡页：博主较多时的列表行，以及选中后收起的那一行 */
.lk-row{
  display:flex;align-items:center;gap:10px;padding:11px 12px;border-radius:var(--r-inner);
  background:#fbf8f1;cursor:pointer;touch-action:manipulation;
}
.lk-row:active{background:var(--sun-soft)}
.lk-go{font-size:12.5px;font-weight:800;color:var(--sun-deep);flex-shrink:0}
.lk-picked{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  background:var(--sun-soft);border-radius:var(--r-inner);padding:11px 13px;
}
.lk-picked-n{font-size:14.5px;font-weight:900;color:#8a6412}
#pb-oq{margin-bottom:10px}

/* ============ v2.31.4：本人头像卡 ============
   按身份区分浅色底与右上角插画；头像带白色描边和「修改」角标；下方三格数字。
   保持克制：只有一层渐变底、一只猫、一排数字，不再叠加其他装饰。 */
.profile-card{
  display:block;position:relative;overflow:hidden;padding:16px 16px 14px;
  background:linear-gradient(135deg,#fff8e4 0%,#ffeec4 100%);
  box-shadow:0 4px 16px rgba(255,171,0,.14);
}
.profile-card.pc-blogger{background:linear-gradient(135deg,#fff3f6 0%,#ffe0ea 100%);box-shadow:0 4px 16px rgba(255,120,160,.14)}
.profile-card.pc-assistant{background:linear-gradient(135deg,#f0f7ff 0%,#dcebff 100%);box-shadow:0 4px 16px rgba(80,150,240,.14)}
.profile-card.pc-superadmin{background:linear-gradient(135deg,#f6f1ff 0%,#e8ddff 100%);box-shadow:0 4px 16px rgba(140,100,230,.14)}
/* 右上角的身份插画，半透明衬在后面，不与文字争抢 */
.profile-card::after{
  content:"";position:absolute;right:-8px;top:-6px;bottom:auto;width:92px;height:92px;
  opacity:.9;pointer-events:none;
  background:var(--pc-cat,url(/art/cat-heart.png)) center/contain no-repeat;
}
.pc-top{display:flex;align-items:center;gap:14px;position:relative;z-index:1}
.pc-av{position:relative;flex-shrink:0}
.pc-av .avatar-wrap{
  width:64px;height:64px;border-radius:50%;
  box-shadow:0 0 0 3px #fff,0 4px 12px rgba(0,0,0,.10);
}
/* 「修改」角标：提示头像可点击 */
.pc-edit{
  position:absolute;left:50%;bottom:-7px;transform:translateX(-50%);z-index:2;pointer-events:none;
  font-style:normal;font-size:10px;font-weight:800;line-height:1;white-space:nowrap;
  padding:4px 7px 3px;border-radius:var(--r-pill);background:#fff;color:var(--ink-2);
  box-shadow:0 1px 4px rgba(0,0,0,.12);
}
.pc-edit::after{content:"修改"}
.profile-card .profile-info{padding-right:70px;position:relative;z-index:1}
.profile-card .profile-name{font-size:18px;font-weight:900;color:var(--ink);letter-spacing:-.2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.profile-card .tag-row{margin-top:5px}
.pc-blogger .role-tag{background:#ff8fb1;color:#fff}
.pc-assistant .role-tag{background:#5ea8f2;color:#fff}
.pc-superadmin .role-tag{background:#9b7be8;color:#fff}
.pc-id{font-size:12px;color:var(--ink-3);margin-top:6px;font-weight:600;display:flex;flex-wrap:wrap;gap:4px 10px}
.pc-code{color:var(--ink-2)}
.pc-stats{
  display:flex;gap:8px;margin-top:16px;position:relative;z-index:1;
}
.pc-stat{
  flex:1;min-width:0;background:rgba(255,255,255,.72);border-radius:var(--r-inner);
  padding:9px 6px 8px;text-align:center;
}
.pc-stat b{display:block;font-size:18px;font-weight:900;color:var(--ink);line-height:1.2}
.pc-stat span{display:block;font-size:11px;color:var(--ink-3);font-weight:700;margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 行内名次标记与文字垂直居中（保持行内排版，避免文字间空格被 flex 吞掉） */
.rki{display:inline;white-space:nowrap}
.rki .rkm{display:inline-block;vertical-align:middle;position:relative;top:-1px;text-align:center;line-height:20px}

/* ============ v2.32：打包排名 ============ */
.bdl-tag{
  display:inline-block;vertical-align:1px;margin-left:6px;padding:2px 6px 1px 19px;border-radius:var(--r-pill);
  background:var(--sky-soft) url(/art/st-bundle.png) no-repeat 5px center/11px 11px;
  color:#2f6fb5;font-size:10.5px;font-weight:800;line-height:1.4;white-space:nowrap;
}
.bdl-mem{display:block;font-size:11px;color:var(--ink-3);line-height:1.6}
.bdl-g{display:flex;align-items:center;gap:8px;margin:0 0 8px}
.bdl-gi{font-size:12.5px;font-weight:800;color:var(--sun-deep);flex-shrink:0;min-width:34px}
.bdl-gn{flex:1;min-width:0;height:38px;padding:0 12px;box-sizing:border-box;font-size:13px;color:var(--ink);
  background:var(--cream);border:1px solid #f2e8d8;border-radius:var(--r-inner);outline:none}
.bdl-gn::placeholder{color:var(--ink-4)}
.bdl-gn:disabled{opacity:.75}
.bdl-acc{padding:10px 0;border-top:var(--hairline)}
.bdl-acc-h{display:flex;flex-direction:column;gap:2px}
.bdl-acc-n{font-size:14px;font-weight:700;color:var(--ink)}
.bdl-opts{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.bdl-row{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:var(--hairline)}
.bdl-row:last-of-type{border-bottom:none}
.bdl-rk{width:34px;flex-shrink:0;display:flex;justify-content:center}
.bdl-main{flex:1;min-width:0;display:flex;flex-direction:column}
.bdl-n{font-size:14px;font-weight:700;color:var(--ink)}
.bdl-ex{font-size:12px;color:#b4536f;margin-top:8px;line-height:1.7}

/* ---- 系统维护公告（v2.33）：首页顶部、登录页、免登录打卡页 ---- */
.maint-card{
  background:var(--sky-soft);border-radius:var(--r-inner);border-left:4px solid var(--sky);
  padding:12px 14px;margin-bottom:12px;box-sizing:border-box;color:var(--ink);
}
.maint-card .mt-title{font-size:14px;font-weight:800;color:#2273cf;margin-bottom:6px}
.maint-card .mt-row{display:flex;gap:10px;font-size:13px;line-height:1.7}
.maint-card .mt-k{flex-shrink:0;color:#2273cf;font-weight:700}
.maint-card .mt-v{flex:1;min-width:0;word-break:break-word;white-space:pre-wrap}
.maint-card .mt-note{font-size:12px;color:var(--ink-3);line-height:1.7;margin-top:6px}
.maint-card .mt-ack{width:100%;margin-top:10px}
.maint-card.compact{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;padding:10px 14px}
.maint-card.compact .mt-title{margin:0;font-size:13px}
.maint-card.compact .mt-line{flex:1;min-width:0;font-size:12.5px;color:var(--ink-2)}
.maint-card.compact .op-link{font-size:12.5px}
.pub-wrap .maint-card{margin:0 0 12px}

/* ---- 密码框的「显示密码」按钮（v2.33.2） ---- */
.pw-wrap{flex:1;min-width:0;display:flex;align-items:center;gap:4px}
.pw-wrap .input{flex:1;min-width:0}
.pw-eye{
  flex-shrink:0;width:32px;height:32px;margin:-6px -6px -6px 0;padding:0;border:0;background:none;
  display:inline-flex;align-items:center;justify-content:center;color:var(--ink-4);cursor:pointer;
  -webkit-tap-highlight-color:transparent;
}
.pw-eye svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.pw-eye.on{color:var(--sun-deep)}
/* 弹窗里的整行密码框：按钮叠在输入框右端 */
.pw-wrap.pw-block{display:block;position:relative;margin-bottom:11px}
.pw-wrap.pw-block .dialog-input{margin-bottom:0;padding-right:44px}
.pw-wrap.pw-block .pw-eye{position:absolute;right:8px;top:50%;margin:0;transform:translateY(-50%)}

/* ---- 排行榜每日快照（v2.35） ---- */
.board-mine.board-mine-off{color:var(--ink-3);font-weight:700}
.rank-asof{color:var(--ink-3)}

/* ============ v2.36：下拉刷新 ============
   提示条位于内容区上方，内容区随手指下移；松手后内容区平滑回位。 */
.ptr{
  position:absolute;left:0;right:0;height:0;z-index:5;overflow:hidden;pointer-events:none;
  display:flex;align-items:flex-end;justify-content:center;gap:7px;padding-bottom:14px;
  font-size:12.5px;font-weight:700;color:var(--ink-3);opacity:0;transition:opacity .15s;
}
.ptr.on{opacity:1}
.ptr-ic{
  position:relative;width:16px;height:16px;flex-shrink:0;border-radius:50%;
  border:2px solid var(--sun-deep);transition:transform .2s;
}
/* 箭头（v2.37.2 修正居中）：以右、下两条边画成「V」，旋转后 V 的视觉中心低于方框中心，
   故先整体上移 V 高度的一半，再旋转，使箭头落在圆圈正中 */
.ptr-ic{box-sizing:border-box}
.ptr-ic::after{
  content:"";position:absolute;left:50%;top:50%;width:6px;height:6px;box-sizing:border-box;
  border-right:2px solid var(--sun-deep);border-bottom:2px solid var(--sun-deep);
  transform:translate(-50%,-72%) rotate(45deg);
}
.ptr.ready .ptr-ic{transform:rotate(180deg)}
.ptr.ready{color:var(--sun-deep)}
.ptr.spin .ptr-ic{border-color:var(--sun-soft);border-top-color:var(--sun-deep);animation:ptr-spin .7s linear infinite}
.ptr.spin .ptr-ic::after{display:none}
@keyframes ptr-spin{to{transform:rotate(360deg)}}
#app.ptr-back{transition:transform .25s ease}
@media (prefers-reduced-motion:reduce){#app.ptr-back{transition:none}.ptr.spin .ptr-ic{animation-duration:1.6s}}

/* ============ v2.36：新消息提示条（站内实时推送） ============ */
.rt-banner{
  position:fixed;z-index:150;left:50%;top:calc(env(safe-area-inset-top) + 58px);
  width:calc(100% - 24px);max-width:456px;transform:translate(-50%,-16px);opacity:0;pointer-events:none;
  display:flex;align-items:center;gap:11px;padding:11px 12px 11px 13px;cursor:pointer;
  background:#fff;border-radius:16px;box-shadow:0 8px 26px rgba(60,40,0,.16);
  border-left:4px solid var(--sky);transition:transform .22s ease,opacity .22s ease;
}
.rt-banner.show{transform:translate(-50%,0);opacity:1;pointer-events:auto}
.rt-banner.tone-good{border-left-color:var(--green)}
.rt-banner.tone-bad{border-left-color:var(--coral)}
.rt-ic{flex-shrink:0;width:30px;height:30px;background:url(/art/bell.png) center/contain no-repeat}
.rt-main{flex:1;min-width:0}
.rt-title{font-size:14px;font-weight:800;color:var(--ink);line-height:1.4;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rt-text{font-size:12px;color:var(--ink-3);line-height:1.5;margin-top:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rt-x{flex-shrink:0;align-self:flex-start;color:var(--ink-4);font-size:17px;line-height:1;padding:2px 2px 6px 8px}
@media (prefers-reduced-motion:reduce){.rt-banner{transition:opacity .2s}}

/* 对话框中的说明文字 */
.dialog-text{font-size:14px;line-height:1.8;color:var(--ink-2);text-align:left}

/* ============ 忘记密码：答题自助重置（v2.37） ============ */
.lg-forgot{text-align:right;margin-top:12px}
.lg-forgot .op-link{font-size:12.5px;color:var(--ink-3);font-weight:600}
.fp-page{padding-top:14px}
.fp-top{position:relative;height:40px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}
.fp-back{position:absolute;left:0;top:50%;transform:translateY(-50%);font-size:13.5px;color:var(--sky);font-weight:700;cursor:pointer}
.fp-title{font-size:18px;font-weight:900;color:var(--ink)}
.fp-steps{display:flex;align-items:center;justify-content:center;margin:6px 0 14px}
.fp-step{display:flex;flex-direction:column;align-items:center;gap:5px;min-width:64px}
.fp-step i{width:24px;height:24px;border-radius:50%;background:var(--cream-deep);color:var(--ink-3);
  font-style:normal;font-size:12.5px;font-weight:800;display:flex;align-items:center;justify-content:center}
.fp-step span{font-size:11.5px;color:var(--ink-3);font-weight:600;white-space:nowrap}
.fp-step.on i{background:var(--sun);color:#fff}
.fp-step.on span{color:var(--ink);font-weight:800}
.fp-step.done i{background:var(--green);color:#fff}
.fp-step-line{flex:0 1 34px;height:2px;background:var(--sun-line);margin:0 2px 18px;border-radius:2px}
.fp-card{padding:16px 15px 18px}
.fp-lead{font-size:12.5px;color:var(--ink-2);line-height:1.8;margin-bottom:12px}
.fp-lead b{color:var(--ink)}
.fp-who{display:block;position:relative;padding-left:12px;color:var(--ink-2)}
.fp-who::before{content:"";position:absolute;left:2px;top:.8em;width:4px;height:4px;border-radius:50%;background:var(--sun-deep)}
.fp-q{margin-top:14px;padding-top:12px;border-top:1px dashed var(--sun-line)}
.fp-q-h{display:flex;align-items:center;gap:8px;margin-bottom:9px}
.fp-q-h b{font-size:14.5px;color:var(--ink);font-weight:800}
.fp-q-h span{font-size:10.5px;color:var(--sun-deep);background:var(--sun-soft);border-radius:8px;padding:1px 7px;font-weight:700}
.fp-opts{display:grid;grid-template-columns:1fr 1fr;gap:7px}
.fp-opt{display:flex;align-items:center;gap:7px;min-width:0;padding:9px 9px;border-radius:var(--r-inner);
  background:var(--cream);border:1.5px solid transparent;cursor:pointer;font-size:13px;color:var(--ink);font-weight:600;
  -webkit-tap-highlight-color:transparent;user-select:none}
.fp-opt span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fp-opt.on{background:var(--sun-soft);border-color:var(--sun)}
.fp-box{flex-shrink:0;width:16px;height:16px;border-radius:5px;border:1.5px solid var(--ink-4);background:#fff;position:relative}
.fp-opt.on .fp-box{background:var(--sun);border-color:var(--sun)}
.fp-opt.on .fp-box::after{content:"";position:absolute;left:4.5px;top:1.5px;width:4px;height:8px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.fp-none{grid-column:1 / -1;justify-content:center;color:var(--ink-2)}
.fp-err{margin-top:14px;padding:9px 11px;border-radius:var(--r-inner);background:var(--coral-soft);
  color:var(--coral);font-size:12.5px;font-weight:700;line-height:1.7}
.fp-note{margin-top:10px;font-size:11.5px;color:var(--ink-3);text-align:center;line-height:1.7}
.fp-ok-line{font-size:12.5px;color:var(--green);font-weight:700;margin-bottom:10px;padding:8px 11px;
  background:var(--green-soft);border-radius:var(--r-inner)}
.fp-state{text-align:center;padding:10px 4px 0}
.fp-state-ic{width:78px;height:78px;margin:0 auto 12px;border-radius:50%;background:var(--sun-soft);
  display:flex;align-items:center;justify-content:center}
.fp-state-ic::before{content:"";width:42px;height:42px;background:var(--ic) center/contain no-repeat}
.fp-ic-ok{background:var(--green-soft);--ic:url(/art/s-pass.png)}
.fp-ic-lock{background:var(--coral-soft);--ic:url(/art/s-lock.png)}
.fp-state-t{font-size:17px;font-weight:900;color:var(--ink)}
.fp-state-s{font-size:12.5px;color:var(--ink-2);margin-top:8px;line-height:1.8}

/* ============ 博主头像卡：为我打卡的打卡用户 / 打卡账号（v2.37） ============ */
/* 六项时三列两行，各格大小一致 */
.pc-stats.pc-stats-6{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
.pc-stat.pc-link{cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background .15s,transform .15s}
.pc-stat.pc-link:active{background:rgba(255,255,255,.98);transform:scale(.97)}

/* 为我打卡的用户 */
.fan-sum{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;padding:13px 8px}
.fan-sum-i{text-align:center;min-width:0}
.fan-sum-i b{display:block;font-size:19px;font-weight:900;color:var(--ink);line-height:1.25}
.fan-sum-i span{display:block;font-size:10.5px;color:var(--ink-3);font-weight:700;margin-top:2px;white-space:nowrap}
.fan-sum-i:nth-child(-n+2) b{color:var(--sun-deep)}
.fan-list{padding:4px 14px}
.fan-row{display:flex;align-items:flex-start;gap:11px;padding:12px 0;border-bottom:1px solid var(--cream-deep)}
.fan-row:last-child{border-bottom:0}
.fan-row .avatar-wrap{flex-shrink:0;width:40px;height:40px}
.fan-row .avatar-wrap .avatar{width:40px;height:40px}
/* 「为我打卡的账号」列表的行图标：打卡账号用 t-account（单部手机）；s-account 是「博主账号」的色卡图（v2.37.16） */
.fan-ic{flex-shrink:0;width:40px;height:40px;border-radius:50%;background:var(--sky-soft) url(/art/t-account.png) center/24px no-repeat}
.fan-main{flex:1;min-width:0}
.fan-name{font-size:14.5px;font-weight:800;color:var(--ink);display:flex;align-items:baseline;gap:8px;min-width:0}
.fan-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fan-code{font-size:11px;color:var(--ink-3);font-weight:700;flex-shrink:0}
.fan-sub{font-size:12px;color:var(--ink-2);margin-top:3px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fan-nums{display:flex;align-items:baseline;gap:12px;margin-top:6px;font-size:11.5px;color:var(--ink-3);font-weight:700}
.fan-nums b{font-size:14px;color:var(--ink);font-weight:900;margin:0 1px}
.fan-nums .fan-last{margin-left:auto}
.fan-note{padding:0 4px;line-height:1.7}

/* ============ v2.37.1：本账号要求完成的项目、凭证说明 ============ */
.card-title .need-req,.need-req{color:var(--coral);font-weight:800}
/* 要求完成的项目：芯片右上角带「须」字 */
#c-acts .req-act,#pb-f .req-act{position:relative}
#c-acts .req-act::after,#pb-f .req-act::after{
  content:"须";position:absolute;top:-6px;right:-5px;width:15px;height:15px;border-radius:50%;
  background:var(--coral);color:#fff;font-size:9.5px;font-weight:800;line-height:15px;text-align:center;
}
.req-miss{margin-top:10px;padding:9px 11px;border-radius:var(--r-inner);background:var(--coral-soft);
  color:var(--coral);font-size:12.5px;font-weight:700;line-height:1.7}
.req-miss b{color:#d9480f}
.ev-limit{line-height:1.7}
.note-line b .note-sub{display:block;font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:2px}

/* ============ v2.37.1：博主账号档案页名片 ============ */
.acct-av{width:64px;height:64px;border-radius:50%;background:#fff url(/art/t-blogger-acct.png) center/34px no-repeat;
  box-shadow:0 0 0 3px #fff,0 4px 12px rgba(0,0,0,.10)}
.acct-av.off{filter:grayscale(1);opacity:.7}
.acct-owner{position:relative;z-index:1;display:flex;align-items:center;gap:9px;margin-top:14px;
  padding:9px 12px;border-radius:var(--r-inner);background:rgba(255,255,255,.75);cursor:pointer;
  font-size:13px;color:var(--ink);-webkit-tap-highlight-color:transparent}
.acct-owner:active{background:rgba(255,255,255,.95)}
.acct-owner .avatar-wrap{width:28px;height:28px}
.acct-owner .avatar-wrap .avatar{width:28px;height:28px;font-size:12px}
.acct-owner-k{color:var(--ink-3);font-weight:700;font-size:12px;flex-shrink:0}
.acct-owner b{font-weight:800;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acct-owner-go{margin-left:auto;color:var(--sky);font-weight:700;font-size:12px;flex-shrink:0}
.acct-owner.none{display:block;cursor:default;color:var(--coral);font-weight:700;font-size:12px;line-height:1.7;background:rgba(255,255,255,.8)}

/* ============ v2.37.1：博主待办与引导 ============ */
.todo-n.hot{background:var(--coral);color:#fff}
.setup-card .card-title .muted{font-size:11.5px}
.setup-step{display:flex;align-items:center;gap:11px;padding:10px 0;border-bottom:var(--hairline);cursor:default}
.setup-step[data-go]{cursor:pointer}
.setup-step:last-of-type{border-bottom:none}
.setup-step > i{flex-shrink:0;width:26px;height:26px;border-radius:50%;background:var(--cream-deep);color:var(--ink-3);
  font-style:normal;font-size:13px;font-weight:900;display:flex;align-items:center;justify-content:center}
.setup-step.cur > i{background:var(--coral);color:#fff;box-shadow:0 0 0 4px var(--coral-soft)}
.setup-step.done > i{background:var(--green);position:relative}
.setup-step.done > i::after{content:"";position:absolute;left:9.5px;top:5.5px;width:5px;height:10px;
  border:solid #fff;border-width:0 2.5px 2.5px 0;transform:rotate(45deg)}
.setup-b{flex:1;min-width:0}
.setup-t{font-size:14px;font-weight:800;color:var(--ink)}
.setup-step.done .setup-t{color:var(--ink-3)}
.setup-s{font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:1px}
.setup-step.cur .setup-s{color:var(--coral)}
.setup-go{flex-shrink:0;font-size:12.5px;font-weight:800;color:var(--sky)}
.setup-step.cur .setup-go{color:var(--coral)}
.mt12{margin-top:12px}
.setup-empty{text-align:center;padding:22px 16px}
.setup-empty-t{font-size:16px;font-weight:900;color:var(--ink)}
.setup-empty-s{font-size:12.5px;color:var(--ink-2);margin-top:8px;line-height:1.8}
.acc-warns{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}
.acc-warn{font-size:11px;font-weight:700;padding:2px 8px;border-radius:var(--r-pill);background:var(--sun-soft);color:#b57800}
.acc-warn.hot{background:var(--coral-soft);color:#e0552a}
.op-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--coral);margin-left:3px;vertical-align:5px}
.menu-line .tab-n,.menu-item .tab-n{vertical-align:1px}
.sample-entry{display:flex;align-items:center;gap:12px;cursor:pointer}
.se-ic{flex-shrink:0;width:42px;height:42px;border-radius:12px;background:var(--sun-soft) url(/art/t-sampling.png) center/28px no-repeat}
.se-b{flex:1;min-width:0}
.se-t{font-size:15px;font-weight:900;color:var(--ink)}
.se-s{font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:2px;line-height:1.6}
.se-go{flex-shrink:0;font-size:12.5px;font-weight:800;color:var(--sky)}

/* ============ v2.37.2 ============ */
/* 列表卡片标题行右侧的日期靠右对齐（打卡抽检、全部打卡记录、博主打卡明细） */
.list-head .list-date{margin-left:auto;flex-shrink:0;white-space:nowrap}
.list-head .list-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.list-item.card-link{cursor:pointer;-webkit-tap-highlight-color:transparent}
.rv-sample-go{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:10px;padding:9px 11px;
  border-radius:var(--r-inner);background:var(--sun-soft);font-size:12.5px;font-weight:700;color:#8a6412;cursor:pointer}
.rv-sample-go b{color:var(--sun-deep);font-weight:800;flex-shrink:0}
.list-item.flash{animation:flash-ring 1.6s ease 2}
@keyframes flash-ring{0%,100%{box-shadow:var(--shadow)}40%{box-shadow:0 0 0 3px var(--sun),var(--shadow)}}
/* 可点击的数字格（v2.37.2）：按下时轻微缩放，不加箭头 */
.stat-tile.tile-link{cursor:pointer;-webkit-tap-highlight-color:transparent;transition:transform .15s}
.stat-tile.tile-link:active{transform:scale(.96)}
.op-link.name-link{font-size:inherit;font-weight:700}
/* 尚未添加账号时的空状态卡片配插画（v2.37.2） */
.setup-empty::before{content:"";display:block;width:110px;height:92px;margin:0 auto 6px;
  background:url(/art/empty-box.png) center/contain no-repeat}
/* 选中的勾同样改为图形绘制，与部分选中的横线一致居中（v2.37.2） */
.box.on{font-size:0}
.box.on::after{content:"";width:5px;height:10px;margin-top:-2px;border:solid #4a3200;border-width:0 2.5px 2.5px 0;transform:rotate(45deg)}

/* ============ v2.37.3 ============ */
/* 可见范围「按用户」：博主分组标题与组内账号缩进 */
.pick.pick-head{background:var(--sun-soft);border-radius:var(--r-inner);margin-top:8px;border-bottom:none}
.pick.pick-head .pick-name{font-weight:800}
.pick.pick-in{margin-left:16px}
/* 打卡日期靠右对齐（v2.37.3）：iOS Safari 的日期框内部文字默认靠左，须单独指定；
   Chromium 的日期文字区也推到右侧，与同一张卡片中「打卡账号」「打卡博主账号」对齐 */
input.input[type="date"]{text-align:right;-webkit-appearance:none;appearance:none;background:transparent;border:none;
  min-height:22px;display:flex;justify-content:flex-end;align-items:center;font-family:inherit}
input.input[type="date"]::-webkit-date-and-time-value{text-align:right;margin:0}
input.input[type="date"]::-webkit-datetime-edit{flex:0 0 auto;margin-left:auto;padding:0}
input.input[type="date"]::-webkit-datetime-edit-fields-wrapper{padding:0}

/* ============ v2.37.4：新素材 ============ */
/* 「添加到桌面」提示卡左侧图标 */
.a2hs .a2hs-ic{flex-shrink:0;width:40px;height:40px;background:url(/art/s-a2hs.png) center/contain no-repeat}
/* 忘记密码页顶部插画 */
.fp-cat{width:96px;height:102px;margin:0 auto 4px;background:url(/art/cat-key.png) center/contain no-repeat}

/* ============ v2.37.7：昵称提醒 ============ */
.fp-note.left{text-align:left;margin-top:8px}
/* 与上方「昵称」一行留出间隙（v2.39.0，此前上边距为负，文字紧贴分割线） */
.reg-nick-tip{margin:8px 0 10px;font-size:11.5px;color:var(--ink-3);line-height:1.7}

/* ============ v2.37.16：平台文字不可选中、不可复制 ============
   页面上平台展示的文字一律不可选中（长按也不弹出复制菜单）；
   输入框、文本框，以及用户自己输入后显示出来的内容（作品标题与链接、备注、申请说明、复核意见、打卡说明等）除外。
   复制操作另由 app.js 拦截：选中范围不在上述位置时不写入剪贴板。 */
html, body, #app { -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; }
input, textarea, select, [contenteditable="true"],
.sel, .record-title, .record-url, .bn-body, .quick-notice, .rv-meta, .site-notice, .wants, .pub-url-box {
  -webkit-user-select: text; user-select: text; -webkit-touch-callout: default;
}

/* ============ v2.37.17：仅竖屏（横放手机时页面保持竖向） ============
   锁不住屏幕方向的浏览器里，由 app.js 在横屏时给 html 加 force-portrait，
   并按竖屏尺寸写入 --pv-w（竖屏宽）、--pv-h（竖屏高）。
   body 按竖屏尺寸排版，再整体反向旋转 90°，贴满横屏视口：
   手机怎么放，页面相对手机都是竖着的，与原生应用的竖屏锁定一致，不显示任何遮罩。
   body 带了 transform，页面里 position:fixed 的元素（顶栏、底栏、弹窗、提示）都以 body 为准，跟着一起转。 */
html.force-portrait{overflow:hidden;background:var(--cream)}
html.force-portrait body{
  position:fixed;top:0;left:0;margin:0;overflow:hidden;
  width:var(--pv-w);height:var(--pv-h);transform-origin:0 0;
}
html.fp-ccw body{transform:translateY(var(--pv-w)) rotate(-90deg)}
html.fp-cw body{transform:translateX(var(--pv-h)) rotate(90deg)}
/* 以下几处原来按视口（vh / vw）取尺寸；旋转后视口的宽高对调，改按竖屏尺寸算 */
html.force-portrait #shell,html.force-portrait .ev-view{height:var(--pv-h)}
html.force-portrait .dialog{max-height:calc(var(--pv-h) * .82)}
html.force-portrait .gd-p{max-height:calc(var(--pv-h) * .38)}
html.force-portrait .terms-box{max-height:calc(var(--pv-h) * .46)}
html.force-portrait .sheet{max-height:calc(var(--pv-h) * .78)}
html.force-portrait .dialog.sheet{height:calc(var(--pv-h) * .66);max-height:calc(var(--pv-h) * .66)}
html.force-portrait .toast{max-width:calc(var(--pv-w) * .74)}
html.force-portrait .fab{right:20px}

/* ============ v2.37.16：半高滑出页（sheet） ============ */
.mask.sheet-mask{align-items:flex-end;padding:0}
.dialog.sheet{max-width:560px;height:66vh;max-height:66vh;border-radius:22px 22px 0 0;padding:0;display:flex;flex-direction:column;
  overflow:hidden;animation:sheet-up .22s ease-out;padding-bottom:env(safe-area-inset-bottom)}
@keyframes sheet-up{from{transform:translateY(100%)}to{transform:none}}
.sheet-h{display:flex;align-items:center;gap:10px;padding:14px 16px 10px;border-bottom:var(--hairline);flex-shrink:0;position:relative}
.sheet-h::before{content:"";position:absolute;left:50%;top:6px;width:36px;height:4px;margin-left:-18px;border-radius:2px;background:var(--cream-deep,#eee3cc)}
.sheet-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;padding-top:4px}
.sheet-t b{font-size:16px;font-weight:900;color:var(--ink)}
.sheet-t span{font-size:11.5px;color:var(--ink-3)}
.sheet-x{flex-shrink:0;width:30px;height:30px;border-radius:50%;border:0;background:var(--cream);color:var(--ink-2);font-size:18px;line-height:30px;padding:0}
.sheet-b{flex:1;overflow-y:auto;padding:6px 16px 16px;-webkit-overflow-scrolling:touch}
.sheet-row{display:flex;align-items:center;gap:10px;padding:11px 0;border-bottom:var(--hairline)}
.sheet-row:last-child{border-bottom:0}
.sheet-row .sr-b{flex:1;min-width:0}
.sheet-row .sr-t{font-size:14px;font-weight:800;color:var(--ink);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.sheet-row .sr-s{font-size:11.5px;color:var(--ink-3);margin-top:2px}
.sheet-row .sr-n{flex-shrink:0;font-size:13px;font-weight:800;color:var(--sun-deep)}
.sheet-row[data-go]{cursor:pointer}
.sheet-foot{margin-top:12px}
/* 日历（本月活跃天数） */
.cal{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;margin-top:8px}
.cal-w{font-size:11px;color:var(--ink-3);text-align:center;font-weight:700}
.cal-d{aspect-ratio:1;border-radius:10px;background:var(--cream);display:flex;flex-direction:column;align-items:center;justify-content:center;
  font-size:12.5px;font-weight:700;color:var(--ink-3)}
.cal-d.on{background:var(--sun-soft);color:#8a6412;border:1.5px solid var(--sun)}
.cal-d.on i{font-style:normal;font-size:10px;font-weight:800;color:var(--sun-deep);line-height:1.1}
.cal-d.today{box-shadow:inset 0 0 0 1.5px var(--sky,#5aa9e6)}
.cal-d.blank{background:transparent}
.cal-d[data-go]{cursor:pointer}
/* 打卡内容 / 我的打卡记录：从数字格点进来时，对象打卡内容加边框高亮 */
.hl-bar{display:flex;align-items:center;gap:10px;padding:11px 14px;margin-bottom:12px;border-radius:var(--r-card,18px);
  background:var(--sun-soft);border:1.5px solid var(--sun);font-size:13px;color:#8a6412;font-weight:700}
.hl-bar b{color:var(--ink);font-weight:900}
.hl-bar .op-link{margin-left:auto;flex-shrink:0}
.is-hl{box-shadow:0 0 0 2px var(--sun), 0 6px 18px rgba(240,170,20,.18) !important}
.flash-hl{animation:flash-hl 1.6s ease-out 1}
@keyframes flash-hl{0%,40%{box-shadow:0 0 0 3px var(--sun)}100%{box-shadow:0 0 0 0 transparent}}

/* ============ v2.37.18：说明性文字的对齐（按内容与位置区分） ============
   1. 成段的说明（两行及以上的提示、说明、弹窗正文、排行榜口径说明等）：两端对齐。
      左右边缘整齐，符合中文正文的排版习惯。
   2. 居中构图里的短文字：居中。
      · 空状态：插画与下方短句作为一个整体居中；
      · 图标 + 标题 + 一句说明的状态页、按钮下方的一行附注、页脚、协议提示：居中；
      · 居中的文字若折成两行，用 text-wrap:balance 让各行长短接近，不出现「一长一短」。
   3. 位置固定、长短不定的（.al-auto、排行榜下方的说明等）：一行时居中，折成两行及以上时改为两端对齐
      （app.js 的 syncAlign() 按实际行数加 .al-multi）。 */
.hint, .hint-line, .setup-tip, .desc, .gd-p, .fan-note, .dialog-text, .dialog .muted,
.bn-body, .card > .muted, .container > .muted {
  text-align: justify; text-justify: inter-character;
}
.empty, .agreement, .ev-tip, .pub-foot, .al-auto:not(.al-multi), .page .desc, .desk-block-s, .fp-state-s,
.setup-empty-s, .cheer-note, .fp-note, .thin-note {
  text-align: center; text-wrap: balance;
}
.al-auto.al-multi, .page .desc.al-multi, .desk-block-s.al-multi, .fp-state-s.al-multi, .setup-empty-s.al-multi,
.cheer-note.al-multi, .fp-note.al-multi, .pub-note.al-multi, .thin-note.al-multi:not(.c) {
  text-align: justify; text-justify: inter-character; text-wrap: wrap;
}
.pub-note { text-align: center; text-wrap: balance; }
.fp-note.left { text-align: justify; }

/* ============ v2.38.1：下拉形式的筛选 ============
   此前月份、博主、榜单、状态等筛选是一排可点的浮动标签，项目一多就挤成一长条、还得左右滑。
   改为「标签 + 下拉」：一行一项，几行放在同一张卡片里；右侧带一个小箭头，一看就知道能点开选。 */
.pick-card{padding:2px 15px}
.pick-card .form-item{padding:12px 0}
.pick-row select.input,.picker-row select.input,.month-row select.input{
  padding-right:18px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23b08a3c' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 2px center/10px 6px;
}
.pick-row select.input.has-pf{padding-right:0}
/* 搜索框下方那一行里的小下拉（排序、状态、平台），外观与旁边的开关标签一致 */
.fd-sel{
  font-size:12px;font-weight:800;color:#8a6412;cursor:pointer;
  padding:6px 26px 5px 12px;border-radius:var(--r-pill);border:1.5px solid var(--sun-line);
  background:var(--sun-soft) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%238a6412' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 10px center/10px 6px;
}
.fd-row .pf-sel-w{flex:0 0 auto}
.fd-row .pf-sel-w > select.fd-sel{min-width:104px}
.fd-row .pf-sel-b{left:10px;right:auto}
.picker-row .pf-sel-b,.pick-row .pf-sel-b,.month-row .pf-sel-b{right:18px}
/* 选项较多（≥8 项）的下拉会换成可搜索的清单按钮（.sel-btn）。在筛选卡片里让它与普通下拉同一外观：
   文字靠右、右侧同一个小箭头，否则同一张卡片里一行靠左带实心三角、一行靠右带细箭头，看着不齐 */
.pick-row .sel-btn,.picker-row .sel-btn,.month-row .sel-btn{
  justify-content:flex-end;padding-right:18px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23b08a3c' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 2px center/10px 6px;
}
.pick-row .sel-btn::after,.picker-row .sel-btn::after,.month-row .sel-btn::after{display:none}

/* v2.39.0 打卡页：所选博主账号所在平台没有可用的打卡账号时的提示 */
.form-tip{font-size:13px;line-height:1.6;color:var(--ink-2);padding:2px 0 8px}
.form-tip.warn{color:#b4541a}
.form-tip[hidden]{display:none}

/* ============ v2.39.0 ============ */
/* 排行榜：日榜/月榜分段与下方筛选卡片之间的间距 */
.rank-head .period-bar + .pick-card{margin-top:10px}
.rank-head .tabs + .period-bar{margin-top:2px}

/* 我的打卡记录：不计入的说明、补交凭证注记、消息直达的那一条 */
.rec-warn{margin-top:8px;font-size:12.5px;line-height:1.7;color:#e0552a;background:var(--coral-soft);border-radius:10px;padding:7px 10px}
.ev-supply{font-size:11.5px;margin-top:6px}
.focus-head{font-size:12.5px;font-weight:800;color:var(--ink-2);margin:4px 2px 8px}

/* 打卡评论（不公开） */
.cmt-box{margin-top:10px;border-top:var(--hairline);padding-top:9px}
.cmt-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:12.5px;font-weight:800;color:var(--ink)}
.cmt-priv{font-size:11px;font-weight:600;color:var(--ink-3)}
.cmt{margin-top:7px;background:var(--cream,#fff8ec);border-radius:10px;padding:8px 10px}
.cmt-who{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-2)}
.cmt-who b{color:var(--ink);font-weight:800}
.cmt-role{font-size:10.5px;padding:1px 6px;border-radius:999px;background:var(--sky-soft);color:#2273cf;font-weight:700}
.cmt-t{color:var(--ink-3);font-size:11px}
.cmt-del{margin-left:auto;font-size:11.5px}
.cmt-body{margin-top:4px;font-size:13px;line-height:1.7;color:var(--ink);text-align:justify;word-break:break-word}
.cmt-add{margin-top:8px;text-align:right}

/* 抽检复核卡片：需要核对的项目 */
.chk-items{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px}
.chk-lab{font-size:12px;font-weight:800;color:var(--ink-2);margin-right:2px}
.chk-items .action-pill{margin:0}

/* 排行榜下方的「本榜打卡记录」入口 */
.rr-entry{display:flex;align-items:center;gap:8px;background:var(--card);border-radius:var(--r-card);box-shadow:var(--shadow);
  padding:11px 14px;margin:0 0 12px;cursor:pointer}
.rr-ic{width:26px;height:26px;flex:0 0 26px;background:url(/art/t-board.png) center/contain no-repeat}   /* 公告栏：本榜打卡记录公示（v2.40.15，此前借用 t-checklist） */
.rr-t{font-size:14px;font-weight:800;color:var(--ink);white-space:nowrap}
.rr-s{font-size:11.5px;color:var(--ink-3);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rr-go{color:var(--ink-3);font-weight:800}
.rr-mine{box-shadow:0 0 0 2px var(--sun-soft), var(--shadow)}
.rr-rec .record-foot{display:flex;justify-content:space-between}

/* 打包排名：月份下拉 */
.bd-mrow{padding:6px 0 10px;border-bottom:var(--hairline);margin-bottom:8px}

/* 用户档案：打卡来源（仅超级管理员） */
.src-h{font-size:12.5px;font-weight:800;color:var(--ink-2);margin:10px 0 4px}
.src-h.danger{color:#e0552a}
.src-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:var(--hairline);font-size:13px}
.src-row:last-of-type{border-bottom:none}
.src-n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink)}
.src-c{font-size:11.5px;white-space:nowrap}
.src-anom{background:var(--coral-soft);border-radius:10px;padding:8px 10px;margin-top:6px;font-size:12.5px;line-height:1.7;color:#a8461f}
.cmt-add.solo{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px;text-align:left}
.cmt-add.solo .cmt-priv{font-size:11px}
.rank-head + .rr-entry{margin-top:0}

/* ============ v2.40.0 ============ */
/* 打卡记录：「选择」后才出现勾选框与批量操作 */
.rv-pick{display:none}
.rv-selecting .rv-pick{display:inline-flex}
.rv-pick{position:relative;flex-shrink:0;align-items:center;justify-content:center;width:44px;height:44px;margin:-10px -10px -10px 2px;cursor:pointer}
.rv-pick input{position:absolute;opacity:0;width:1px;height:1px}
/* 对勾居中（v2.40.3）：圆圈用 flex 居中对勾；对勾本身是旋转 45° 的 L 形，视觉重心偏下，上移 1.5px 补正 */
.rv-pick i{box-sizing:border-box;width:22px;height:22px;border-radius:50%;border:2px solid #d9cdb4;background:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.rv-pick input:checked + i{background:var(--sun);border-color:var(--sun)}
.rv-pick input:checked + i::after{content:'';box-sizing:border-box;width:6px;height:11px;border:solid #fff;border-width:0 2.5px 2.5px 0;transform:translateY(-1.5px) rotate(45deg)}
.rv-pick input:focus-visible + i{outline:2px solid #3b82f6;outline-offset:2px}
.rv-selecting .list-item{cursor:pointer;transition:box-shadow .15s,background .15s}
.rv-selecting .list-item.rv-on{box-shadow:0 0 0 2px var(--sun) inset;background:#fff8e6}
.rv-sum{display:flex;align-items:center;justify-content:space-between;margin:2px 2px 10px;font-size:12.5px}
.rv-segs,.own-segs{margin-bottom:12px}

/* 一行要点 + 「说明」 */
.tipx-s{display:flex;align-items:center;justify-content:space-between;gap:8px}
.tipx-s > span:first-child{flex:1;min-width:0}
/* 超过两行的说明默认收起 */


/* 「更多」操作清单 */
.op-more{color:var(--ink-2)}
.act-sheet{padding:8px 0 calc(8px + env(safe-area-inset-bottom))}
.act-item{min-height:48px;display:flex;align-items:center;justify-content:center;font-size:15.5px;color:var(--ink);border-bottom:var(--hairline);cursor:pointer}
.act-item.danger{color:#e0552a}
.act-item.act-cancel{color:var(--ink-3);border-bottom:none;margin-top:6px}
.act-item:active{background:var(--cream)}
/* 行内操作的点按区域不小于 44px */
.list-ops .op-link{display:inline-flex;align-items:center;min-height:44px;padding:0 6px}

/* 审核中心：逐行通过 / 拒绝 */
.audit-row .audit-ops{display:flex;align-items:center;gap:10px;flex-shrink:0}
.audit-row .audit-ops .op-link{min-height:36px;display:inline-flex;align-items:center}

/* 负责的小助理清单 */
.mgr-list{max-height:50vh;overflow:auto;margin-bottom:6px}
.mgr-row{display:flex;align-items:center;gap:10px;min-height:44px;border-bottom:var(--hairline);font-size:14px}
.mgr-row input{width:18px;height:18px;flex-shrink:0}

/* 只作提示的待办（本人处理不了） */
.todo.todo-info{cursor:default}
.todo.todo-info .todo-n{background:var(--sun-soft);color:#8a6412}

/* 为我打卡的用户：页签下方的本月人数 */
.fan-mon{margin:-2px 2px 10px}
.ar-ops{display:flex;align-items:center;gap:10px}

/* ============ v2.40.3 ============ */
/* 排行榜只有一个榜时，博主一行直接显示名称（不是下拉） */
.pick-static{flex:1;min-width:0;text-align:right;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pick-note{font-size:12px;line-height:1.6;padding:2px 0 8px}
/* 凭证查看器的左右滑动由页面处理（v2.40.3）：不让浏览器把横向滑动当成「返回上一页」手势；放大后恢复横向拖动 */
.ev-view{touch-action:pan-y;overscroll-behavior:contain}
.ev-view .ev-stage.zoom{touch-action:pan-x pan-y}
/* 双指缩放（v2.40.12）：图片上的手势由查看器处理；放大后隐藏左右切换按钮，舞台不滚动 */
.ev-view .ev-stage:not(.zoom) img.ev-media{touch-action:none;will-change:transform}
.ev-view.ev-pz .ev-nav{display:none}
.ev-view.ev-pz .ev-stage{overflow:hidden}
/* 「可见范围」入口（v2.40.4）：与「本榜打卡记录」入口同一样式，图标换为负责范围 */
.vis-entry .rr-ic{background-image:url(/art/t-scope.png)}

/* ---- 说明浮窗（v2.40.4）：圆圈问号 + 点开的浮窗 ---- */
.qm{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;
  width:22px;height:22px;padding:0;margin:-3px 0 -3px 4px;border:0;border-radius:50%;background:none;
  color:#c79a3a;vertical-align:middle;cursor:pointer;-webkit-tap-highlight-color:transparent;font:inherit}
.qm::before{content:'';position:absolute;inset:-9px}          /* 点按区域 40px */
.qm svg{width:17px;height:17px;display:block}
.qm.on,.qm:active{color:#a8761a;background:rgba(255,194,46,.18)}
.notice-card .qm{color:#4d8ccc}
.notice-card .qm.on{color:#2f6ea8;background:rgba(77,157,247,.15)}
.thin-note .qm,.muted .qm{color:#b9a27a}
.qm-pop{position:fixed;z-index:9000;box-sizing:border-box;width:max-content;max-width:min(320px,calc(100vw - 32px));
  max-height:min(60vh,420px);overflow:auto;-webkit-overflow-scrolling:touch;
  background:#fff;border-radius:14px;padding:12px 14px;box-shadow:0 10px 32px rgba(74,50,0,.18),0 0 0 1px rgba(138,100,18,.08);
  font-size:13px;line-height:1.75;color:var(--ink-2,#555);text-align:justify;animation:qmIn .14s ease-out}
.qm-pop.below{transform-origin:top center}
.qm-pop.above{transform-origin:bottom center}
@keyframes qmIn{from{opacity:0;transform:scale(.96)}to{opacity:1;transform:none}}
.qm-arrow{position:absolute;width:12px;height:12px;background:#fff;transform:translateX(-50%) rotate(45deg);
  box-shadow:-1px -1px 0 rgba(138,100,18,.08)}
.qm-pop.below .qm-arrow{top:-6px}
.qm-pop.above .qm-arrow{bottom:-6px;box-shadow:1px 1px 0 rgba(138,100,18,.08)}
.qm-h{font-weight:800;color:var(--ink);font-size:13.5px;margin-bottom:4px;position:relative}
.qm-b{position:relative}
.qm-b p{margin:0}
.qm-b p + p{margin-top:6px}
/* 移进问号的说明不再在原位置显示 */
.help-moved{display:none !important}
/* 没有明确归属的长说明：只留完整的第一句（最多两行，不截半行），句末紧跟一个问号 */
.help-line{text-align:left !important}
.help-line .qm{margin-left:2px}
.help-line .hl-end{white-space:nowrap}
.thin-note.help-line{text-align:center !important}

/* ============ v2.40.5 ============ */
/* 浮窗底部的危险操作（移除账号）：与「取消 / 保存」隔开，避免误点 */
.dialog-danger{margin-top:14px;padding-top:12px;border-top:1px dashed #eadfca;text-align:center;font-size:13px}
/* 打卡记录卡片的信息区：「名称 | 内容」两列对齐，过长的打卡账号、作品以省略号结尾 */
.rec-kv{margin-top:8px;padding:8px 10px;border-radius:10px;background:#fbf7ef;font-size:12.5px;line-height:1.5}
.rec-kv .kv{display:flex;align-items:baseline;gap:10px;min-width:0;padding:2px 0}
.rec-kv .kv-k{flex:0 0 4.2em;color:var(--ink-3);font-weight:600}
.rec-kv .kv-v{flex:1;min-width:0;color:var(--ink);font-weight:600;display:flex;align-items:baseline;gap:8px}
.rec-kv .kv-ell{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rec-kv .kv-v > .muted{font-weight:500}
.rec-kv .kv-sub{color:var(--ink-3);font-weight:500;font-size:11.5px;white-space:nowrap}
.rec-kv .name-link{font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rec-kv .name-link::after{content:' ›';font-weight:700}
/* 我的打卡记录、本榜打卡记录中的打卡账号：放不下时以省略号结尾 */
.account-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 打卡账号名过长时以省略号结尾（v2.40.5）：排行榜、领奖台、结算、为我打卡的用户 */
.rank-account,.s-acc,.po-name,.fan-sub{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* v2.40.5 打卡页：博主账号 / 打卡账号 / 打卡日期的名称与下方卡片标题同一字号、字重 */
.ce-main .form-label{font-size:15.5px;font-weight:800;color:var(--ink)}
.ce-final b{color:inherit;font-weight:800}
/* 必填标识在标题右侧，用红色「必填」二字，比标题小一号 */
.card-title .req,.form-label .req,.dialog-label .req{font-size:11px}
.step-s .req,.req-legend .req{margin:0 2px;font-size:11px}
/* v2.40.5 打卡账号名过长：其余显示打卡账号名的地方同样以省略号结尾 */
.list-head .list-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.list-head .pf-tag{flex-shrink:0}
.my-rank-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.my-rank-row{gap:10px}.my-rank-num{flex-shrink:0}
.pub-who>div:first-child{min-width:0}
.pub-who-n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pub-who .op-link{flex-shrink:0}
/* 卡片最后一项的说明移进问号后，不再留一条悬空的分隔线 */
.form-item:has(+ .help-moved:last-child){border-bottom:none}

/* ============ v2.40.8 ============ */
/* 视频凭证缩略图：第一帧预览图铺满，播放标记叠加在中间 */
.evidence-video{position:relative;overflow:hidden}
.evidence-video .ev-thumb{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.evidence-video .ev-thumb ~ .video-icon{position:relative;z-index:1;width:30px;height:30px;border-radius:50%;
  background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;font-size:13px;padding-left:2px;box-sizing:border-box}
.evidence-video .ev-thumb ~ .video-text{display:none}
/* 抽检复核：「需核对的项目」标签单独一行，项目徽章在其下方 */
.chk-items .chk-lab{flex-basis:100%;margin:0 0 2px}
/* 打卡日期筛选：起止两个日期 */
.dr-row .dr-box{flex:1;display:flex;align-items:center;justify-content:flex-end;gap:6px;min-width:0}
.dr-row .dr-in{flex:0 1 auto;width:auto;min-width:0;max-width:128px;text-align:center;font-size:13px;padding:0}
.dr-row .dr-sep{color:var(--ink-3);font-size:12.5px;flex-shrink:0}
.dr-row .dr-x{font-size:12.5px;flex-shrink:0;margin-left:2px}
.rr-evoff{margin-top:8px;font-size:12.5px}

/* 运维数据（v2.40.12） */
.ops-bar{height:10px;border-radius:6px;background:#eef0f4;overflow:hidden;margin:4px 0 6px}
.ops-bar i{display:block;height:100%;background:linear-gradient(90deg,#4d9df7,#34c07a);border-radius:6px}
.ops-bar i.hot{background:linear-gradient(90deg,#ff9f45,#ef4444)}
.ops-bar-t{display:flex;justify-content:space-between;font-size:13px;color:#5b6475;margin-bottom:6px}
.ops-tiles .stat-tile{min-width:0}
.ops-sub{font-size:12px;color:#5b6475;margin-top:2px}
.ops-tbl{font-size:13px}
.ops-tr{display:grid;grid-template-columns:1.2fr 1fr 1fr 1.2fr;gap:6px;padding:7px 0;border-bottom:1px solid #f0f1f4}
.ops-tr span:not(:first-child){text-align:right;font-variant-numeric:tabular-nums}
.ops-th{color:#8a93a3;font-size:12px}
.ops-tr:last-child{border-bottom:0}

/* 多账号快捷切换（v2.40.15） */
.sw-list{display:flex;flex-direction:column;gap:8px}
.sw-row{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:14px;background:var(--card);border:1px solid #f0e6d2;cursor:pointer}
.sw-row.on{background:var(--sun-soft);border-color:#ffd666;cursor:default}
.sw-row .sw-av{width:40px;height:40px;flex:0 0 40px}
.sw-main{flex:1;min-width:0}
.sw-n{font-weight:700;font-size:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sw-s{display:flex;gap:6px;align-items:center;margin-top:3px}
.sw-cur{font-size:12px;color:#b8860b;font-weight:700}
.sw-go{font-size:13px;color:var(--sky);font-weight:700}
.sw-x{font-size:12px;color:#e05a4f;margin-left:10px;padding:4px 2px}
