/* 软件源浏览器 —— 样式表（由 index.html 拆出） */
  :root{
    --blue:#007aff; --bg:#f2f3f5; --card:rgba(255,255,255,.72);
    --line:rgba(0,0,0,.07); --t1:#1d1d1f; --t2:#6e6e73; --t3:#a1a1a6;
    --shadow:0 8px 30px rgba(0,0,0,.06);
  }
  *{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
  html,body{margin:0;padding:0}
  body{
    background:var(--bg); color:var(--t1);
    font:15px/1.5 -apple-system,BlinkMacSystemFont,"SF Pro Text","PingFang SC","Microsoft YaHei",sans-serif;
    padding-bottom:calc(78px + env(safe-area-inset-bottom,0px));
  }
  .wrap{max-width:1280px;margin:0 auto;padding:0 16px}

  /* ---------- 顶部配置 ---------- */
  header{
    position:sticky; top:0; z-index:50;
    background:rgba(242,243,245,.82);
    backdrop-filter:saturate(180%) blur(20px);
    -webkit-backdrop-filter:saturate(180%) blur(20px);
    border-bottom:1px solid var(--line);
    padding:14px 0 12px;
    transition:transform .28s ease;
    will-change:transform;
  }
  /* 顶栏自动隐藏：页面一滚动就滑出视野，回到页面顶部才滑回来 */
  header.hide{ transform:translateY(-102%); }
  .title{display:flex;align-items:center;gap:9px;margin-bottom:12px}
  .title h1{font-size:19px;margin:0;font-weight:700;letter-spacing:-.3px}
  .title .dot{
    width:13px;height:13px;border-radius:50%;background:var(--blue);
    box-shadow:0 0 0 5px rgba(0,122,255,.14);
    animation:dot-pulse 2s ease-in-out infinite;
  }
  /* 动态状态灯：默认呼吸脉冲；加载数据时快闪；成功变绿、失败变红 */
  @keyframes dot-pulse{
    0%,100%{ box-shadow:0 0 0 4px rgba(0,122,255,.12); transform:scale(1); }
    50%    { box-shadow:0 0 0 9px rgba(0,122,255,.22); transform:scale(1.12); }
  }
  @keyframes dot-blink{
    0%,100%{ opacity:1; transform:scale(.88); }
    50%    { opacity:.35; transform:scale(1.2); }
  }
  .title .dot.loading{
    background:var(--blue);
    animation:dot-blink .8s ease-in-out infinite;
  }
  .title .dot.ok{
    background:#34c759;
    box-shadow:0 0 0 5px rgba(52,199,89,.16);
    animation:dot-pulse-ok 2s ease-in-out infinite;
  }
  @keyframes dot-pulse-ok{
    0%,100%{ box-shadow:0 0 0 4px rgba(52,199,89,.12); transform:scale(1); }
    50%    { box-shadow:0 0 0 9px rgba(52,199,89,.24); transform:scale(1.12); }
  }
  .title .dot.err{
    background:#ff3b30;
    box-shadow:0 0 0 5px rgba(255,59,48,.16);
    animation:dot-blink 1.2s ease-in-out infinite;
  }
  .title .sp{flex:1}
  .title .ghost{
    border:1px solid var(--line);background:#fff;color:var(--t2);
    border-radius:9px;padding:5px 11px;font-size:13px;cursor:pointer
  }
  .title a.ghost{display:inline-flex;align-items:center;height:31px;text-decoration:none;box-sizing:border-box}
  .title .ghost:hover{color:var(--t1);border-color:rgba(0,0,0,.16)}

  .cfg{display:flex;flex-direction:column;gap:9px}
  .cfg.off{display:none}                              /* 后台「显示源地址栏」开关=关闭时整体隐藏 */
  /* 用户自定义值角标：该值只存本机 localStorage，不入库，其他访客看不到 */
  .fld .utag{
    position:absolute;right:9px;top:50%;transform:translateY(-50%);
    font-size:11px;font-weight:600;line-height:1;white-space:nowrap;
    color:var(--blue);background:rgba(0,122,255,.12);
    border-radius:20px;padding:4px 8px;pointer-events:none;display:none
  }
  .fld.user-set .utag{display:block}
  .fld.user-set input{padding-right:66px}
  .row{display:flex;gap:9px;flex-wrap:wrap}
  .fld{flex:1;min-width:220px;position:relative;display:flex;align-items:center}
  .fld .tag{
    position:absolute;left:11px;font-size:12px;color:var(--t3);
    pointer-events:none;background:transparent
  }
  .fld input,.fld select{
    width:100%;height:40px;border:1px solid var(--line);background:#fff;
    border-radius:11px;padding:0 12px;font-size:14px;color:var(--t1);outline:none;
    font-family:inherit;transition:border-color .15s,box-shadow .15s
  }
  .fld.has-tag input{padding-left:56px}
  .fld input:focus,.fld select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(0,122,255,.13)}
  /* 移动端把表单输入框字号提到 16px：iOS Safari 对 <16px 的输入框聚焦时会强制整页缩放，表现为「页面抖动」 */
  @media (max-width:768px){
    .fld input,.fld select,.tools .fld input{font-size:16px}
    /* 手机端搜索框提示语「搜索名称 / 说明 / 版本…」太长，缩小占位文字；
       输入框字号仍保持 16px 以免触发 iOS 聚焦缩放，电脑端不受影响 */
    .tools .fld input::-webkit-input-placeholder{font-size:12.5px}
    .tools .fld input::placeholder{font-size:12.5px}
  }
  .fld select{cursor:pointer;min-width:130px;flex:0 0 auto}
  .btn{
    height:40px;padding:0 20px;border:none;border-radius:11px;background:var(--blue);
    color:#fff;font-size:14px;font-weight:600;cursor:pointer;font-family:inherit;
    box-shadow:0 4px 14px rgba(0,122,255,.28);transition:transform .12s,background .15s;white-space:nowrap
  }
  .btn:hover{background:#0062cc}
  .btn:active{transform:scale(.97)}
  .btn:disabled{opacity:.5;cursor:not-allowed;transform:none}

  /* ---------- 状态条 ---------- */
  .status{
    margin-top:11px;font-size:12.5px;color:var(--t2);
    display:flex;align-items:center;gap:7px;min-height:18px
  }
  .status .pill{
    background:rgba(0,0,0,.05);border-radius:20px;padding:2px 9px;
    font-size:11.5px;color:var(--t2)
  }
  .status .pill.ok{background:rgba(52,199,89,.13);color:#1e8e3e}
  .status .pill.err{background:rgba(255,59,48,.12);color:#d93025}
  .status .pill.blue{background:rgba(0,122,255,.13);color:#0062cc}   /* 数据库缓存态 */
  .spin{
    width:12px;height:12px;border:2px solid rgba(0,0,0,.12);
    border-top-color:var(--blue);border-radius:50%;animation:sp .7s linear infinite;display:none
  }
  @keyframes sp{to{transform:rotate(360deg)}}

  /* ---------- 幻想图（顶部栏下方的轮播） ----------
     后台「前台配置 → 幻想图列表」上传，可放多张：
     横向滚动 + scroll-snap 实现手指左右滑动（原生惯性，无 JS 拖动算位移），
     文字标题绝对定位在图片内左下角；圆点与左右箭头用于快速切换。 */
  /* 与顶部栏只留很窄的间距：顶栏自身还有 12px 下内边距，
     所以这里的 6px 已经是「分类按钮那一行到幻想图」= 19px 的紧凑效果，
     再加大就会显得顶部空一大截（原来是 20px，合计 33px 明显过高） */
  .bn{margin:6px 0 2px;display:none}
  .bn.on{display:block}
  .bn-main{position:relative}
  .bn-track{
    display:flex;overflow-x:auto;overflow-y:hidden;
    scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
    border-radius:16px;box-shadow:var(--shadow);background:#e9eaec;
    scrollbar-width:none
  }
  .bn-track::-webkit-scrollbar{display:none}
  .bn-slide{
    position:relative;flex:0 0 100%;width:100%;min-width:100%;
    scroll-snap-align:start;scroll-snap-stop:always;overflow:hidden
  }
  /* 高度由图片自身的 aspect-ratio 撑开（父级高度 auto，不能再给 img 写 height:100%，
     否则百分比高度对 auto 父级是循环引用，部分内核会把图压成 0 高） */
  .bn-slide img{display:block;width:100%;height:auto;aspect-ratio:16/5;object-fit:cover;background:#e9eaec}
  .bn-link{display:block;width:100%;color:inherit;text-decoration:none}
  /* 文字标题：幻想图内左侧下方 */
  .bn-cap{
    position:absolute;left:14px;bottom:12px;max-width:calc(100% - 28px);
    padding:6px 14px;border-radius:999px;
    background:rgba(0,0,0,.42);color:#fff;font-size:13.5px;font-weight:600;letter-spacing:.2px;
    backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    text-shadow:0 1px 2px rgba(0,0,0,.28)
  }
  /* 分页点：放在幻想图内部右下角，从右向左排列；颜色用白色系避免在暗图上看不清 */
  .bn-dots{position:absolute;right:12px;bottom:10px;z-index:2;display:flex;justify-content:flex-end;align-items:center;gap:6px;padding:0}
  .bn-dot{width:6px;height:6px;border-radius:50%;background:rgba(255,255,255,.72);cursor:pointer;
    transition:width .2s,background .2s,border-radius .2s;box-shadow:0 1px 3px rgba(0,0,0,.25)}
  .bn-dot.on{width:18px;border-radius:3px;background:#fff}
  /* 窄屏：图片改高一点，标题与点缩小，避免在手机上显得又扁又挤 */
  @media (max-width:768px){
    .bn-slide img{aspect-ratio:16/9}
    .bn-cap{left:10px;bottom:10px;font-size:12.5px;padding:5px 11px}
    .bn-dots{right:10px;bottom:8px}
  }
  @media (max-width:599px){
    .bn{margin:5px 0 2px}
  }

  /* ---------- 源信息 ---------- */
  .src{
    display:none;gap:13px;align-items:flex-start;
    background:var(--card);backdrop-filter:blur(20px);
    border:1px solid rgba(255,255,255,.6);border-radius:16px;
    padding:15px;margin:16px 0 12px;box-shadow:var(--shadow)
  }
  .src.on{display:flex}
  .src img{width:52px;height:52px;border-radius:13px;background:#fff;object-fit:cover;flex-shrink:0}
  .src .meta{flex:1;min-width:0}
  .src .nm{font-size:16px;font-weight:700;margin-bottom:2px}
  .src .id{font-size:12px;color:var(--t3);margin-bottom:7px;word-break:break-all}
  .src .msg{
    font-size:12.5px;color:var(--t2);white-space:pre-wrap;line-height:1.55;
    max-height:76px;overflow:auto;background:rgba(0,0,0,.03);
    padding:8px 10px;border-radius:9px
  }

  /* ---------- 工具栏 ---------- */
  .tools{display:flex;gap:9px;margin-bottom:12px;flex-wrap:wrap}
  .tools .fld{flex:1;min-width:200px}
  .tools .fld input{padding-left:36px}
  .tools .ico{position:absolute;left:12px;color:var(--t3);font-size:14px;pointer-events:none}

  /* ---------- 顶部分类导航（从左向右，横向可滑） ---------- */
  .cats{
    display:none;flex-direction:row;justify-content:flex-start;
    gap:8px;margin:14px 0 0;padding-bottom:3px;
    overflow-x:auto;overflow-y:hidden;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;
    scroll-snap-type:x proximity;
  }
  .cats::-webkit-scrollbar{display:none}
  .cats.on{display:flex}
  .cat{
    flex:0 0 auto;scroll-snap-align:start;
    border:1px solid var(--line);background:#fff;color:var(--t2);
    border-radius:20px;padding:6px 15px;font-size:13px;font-weight:600;
    cursor:pointer;white-space:nowrap;font-family:inherit;
    transition:background .15s,color .15s,border-color .15s,box-shadow .15s,transform .12s
  }
  .cat .n{margin-left:5px;font-size:11.5px;font-weight:500;opacity:.62}
  .cat:hover{color:var(--blue);border-color:rgba(0,122,255,.34);background:rgba(0,122,255,.05)}
  .cat:active{transform:scale(.95)}
  .cat.on{
    background:var(--blue);border-color:var(--blue);color:#fff;
    box-shadow:0 4px 13px rgba(0,122,255,.26)
  }
  .cat.on .n{opacity:.8}

  /* ---------- 分类条移入顶栏标题行：可左右滑动，搜索展开时随标题一起隐藏 ---------- */
  .title .dot,.title h1{flex:0 0 auto}          /* 小蓝点与标题不可压缩，永远横排完整显示 */
  .title h1{white-space:nowrap}
  .title .cats{margin:0;flex:1 1 auto;min-width:0;padding-left:10px}  /* 吃掉标题行剩余全部宽度 → 恒铺满整行；完整胶囊平分多出来的宽度，放不下的进滑动区 */
  .title .sp{display:none}                 /* 分类条 flex:1 自行占位，原弹簧占位符隐藏 */
  .title .sbtn{margin-left:auto}           /* 无分类（未加载数据）时搜索图标仍靠右 */
  .title .cats .cat,.title .cats .sort{padding:5px 13px;font-size:12.5px}
  /* 窄到一行放不下 2 个「完整」胶囊时，逐档收紧内边距/间距（字号不变），
     用来避免出现「半截胶囊」；档位由 fitCats() 按实测宽度自动切换 */
  .title .cats.tight .cat,.title .cats.tight .sort{padding:5px 8px}
  .title .cats.tight{gap:6px}
  .title .cats.tighter .cat,.title .cats.tighter .sort{padding:5px 5px}
  .title .cats.tighter{gap:5px}
  /* 放不下的胶囊藏进滑动区：右缘渐隐，提示还能左右滑（滑到最右端自动去掉） */
  .cats.clip{
    -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent 100%);
            mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent 100%);
  }
  .cats.clip.at-end{-webkit-mask-image:none;mask-image:none}

  /* ---------- 排序按钮：与分类按钮同款，排在同一行右侧 ---------- */
  .sort{
    flex:0 0 auto;scroll-snap-align:start;
    border:1px solid var(--line);background:#fff;color:var(--t2);
    border-radius:20px;padding:6px 15px;font-size:13px;font-weight:600;
    cursor:pointer;white-space:nowrap;font-family:inherit;
    display:inline-flex;align-items:center;gap:5px;
    transition:background .15s,color .15s,border-color .15s,box-shadow .15s,transform .12s
  }
  .sort:hover{color:var(--blue);border-color:rgba(0,122,255,.34);background:rgba(0,122,255,.05)}
  .sort:active{transform:scale(.95)}
  .sort.on{
    background:var(--blue);border-color:var(--blue);color:#fff;
    box-shadow:0 4px 13px rgba(0,122,255,.26)
  }
  /* 分类与排序之间的竖线分隔 */
  .sort-sep{flex:0 0 auto;width:1px;height:20px;background:var(--line);margin:0 2px;align-self:center}

  /* ---------- 顶栏搜索：图标按钮 + 从右往左推入的搜索条 ---------- */
  .sbtn{
    flex:0 0 auto;width:32px;height:32px;border-radius:50%;
    border:1px solid var(--line);background:#fff;color:var(--t2);
    cursor:pointer;display:inline-flex;align-items:center;justify-content:center;
    font-family:inherit;padding:0;
    transition:background .15s,color .15s,border-color .15s,transform .12s
  }
  .sbtn svg{width:17px;height:17px;display:block}
  .sbtn:hover{color:var(--blue);border-color:rgba(0,122,255,.34);background:rgba(0,122,255,.05)}
  .sbtn:active{transform:scale(.92)}
  .sbtn.on{background:var(--blue);border-color:var(--blue);color:#fff;box-shadow:0 4px 13px rgba(0,122,255,.26)}

  /* 搜索条：绝对定位覆盖在标题行上，从右往左推入 */
  .tools.sbar{
    position:absolute;left:0;right:0;top:14px;
    display:none;gap:9px;padding:0 16px;align-items:center;margin:0;
    transform:translateX(40px);opacity:0;pointer-events:none;
    transition:transform .24s cubic-bezier(.22,.61,.36,1), opacity .2s ease;
    will-change:transform,opacity;             /* 抬到独立合成层，避免顶栏 backdrop-filter 每帧重绘卡成抖动 */
    backface-visibility:hidden;
  }
  .tools.sbar.show{transform:translateX(0);opacity:1;pointer-events:auto}
  .tools.sbar .fld{flex:1;min-width:0}
  .tools.sbar .ico{display:inline-flex;align-items:center;color:var(--t3)}
  .tools.sbar .ico svg{width:15px;height:15px;display:block}
  /* 状态条被后台关闭时：顶栏自动收紧（去掉为状态条预留的空隙） */
  header.no-status{padding:10px 0 10px}
  header.no-status .title{margin-bottom:0}
  header.no-status .cfg{margin-top:10px}
  header.no-status .sbar{top:10px}

  /* 搜索时：站点标题、小蓝灯、保存/重置按钮隐藏，收起后自动恢复 */
  .title{transition:opacity .18s ease, transform .18s ease}
  header.searching .title{opacity:0;transform:translateX(-14px);pointer-events:none;will-change:opacity,transform}

  /* ---------- 搜索：清空按钮 / 历史 / 高亮 ---------- */
  .tools .fld{position:relative}
  .tools .fld input{padding-right:34px}
  .clr{
    position:absolute;right:6px;top:50%;transform:translateY(-50%);
    width:22px;height:22px;border:none;border-radius:50%;
    background:rgba(0,0,0,.08);color:var(--t2);font-size:12px;line-height:22px;
    cursor:pointer;display:none;padding:0;font-family:inherit
  }
  .clr:hover{background:rgba(0,0,0,.16);color:var(--t1)}
  .clr.on{display:block}
  /* 最近搜索：聚焦/点击搜索框后浮出 */
  .his{
    display:none;flex-direction:column;gap:9px;
    position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:80;
    background:#fff;border:1px solid var(--line);border-radius:13px;
    box-shadow:0 18px 44px rgba(0,0,0,.13);padding:11px 12px;
    max-height:300px;overflow:auto;overscroll-behavior:contain
  }
  .his.on{display:flex;animation:hisIn .16s ease}
  @keyframes hisIn{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:none}}
  .his .hh{
    display:flex;align-items:center;justify-content:space-between;gap:8px
  }
  .his .hl{font-size:12px;color:var(--t3);font-weight:600}
  .his .hh .clr-his{
    border:none;background:none;color:var(--t3);font-size:12px;
    cursor:pointer;padding:2px 4px;font-family:inherit
  }
  .his .hh .clr-his:hover{color:var(--t1)}
  .his .chips{display:flex;flex-wrap:wrap;gap:7px}
  .his .none{font-size:12.5px;color:var(--t3);padding:2px 0 4px}
  .chip{
    border:1px solid var(--line);background:#fff;color:var(--t2);
    border-radius:20px;padding:4px 12px;font-size:12.5px;cursor:pointer;
    white-space:nowrap;flex-shrink:0;font-family:inherit;transition:.15s
  }
  .chip:hover{color:var(--blue);border-color:rgba(0,122,255,.35);background:rgba(0,122,255,.05)}
  .chip.cur{background:var(--blue);border-color:var(--blue);color:#fff}
  .chip.clr-his{color:var(--t3)}
  .his .chip{background:rgba(0,0,0,.04);border-color:transparent}
  mark{background:rgba(0,122,255,.2);color:inherit;border-radius:3px;padding:0 1px}
  .empty-act{margin-top:14px}
  .empty-act button{
    border:1px solid var(--line);background:#fff;color:var(--blue);
    border-radius:10px;padding:8px 20px;font-size:13.5px;cursor:pointer;font-family:inherit
  }
  .empty-act button:hover{background:rgba(0,122,255,.06)}

  /* ---------- 列表：电脑 4 宫格 / 手机卡片 ---------- */
  .list{
    display:grid;
    grid-template-columns:repeat(4,minmax(0,1fr));
    gap:12px;
    align-items:stretch;
  }
  .item{
    position:relative;display:flex;flex-direction:column;gap:11px;min-width:0;
    background:var(--card);backdrop-filter:blur(20px);
    border:1px solid rgba(255,255,255,.6);border-radius:16px;
    padding:14px;box-shadow:0 2px 8px rgba(0,0,0,.03);
    transition:transform .16s,box-shadow .16s,background .16s
  }
  .item:hover{transform:translateY(-3px);box-shadow:0 14px 30px rgba(0,0,0,.09);background:rgba(255,255,255,.94)}
  .top{display:flex;flex-direction:column;align-items:center;text-align:center;gap:9px;flex:1;min-width:0}
  .ic{
    position:relative;width:64px;height:64px;border-radius:15px;flex-shrink:0;
    background:#fff;border:1px solid rgba(0,0,0,.05);
    display:flex;align-items:center;justify-content:center;
    font-size:22px;font-weight:700;color:#fff;overflow:hidden
  }
  .ic img{width:100%;height:100%;object-fit:cover;display:block}
  /* 卡片左上角分类徽章（外凸贴在卡片左上角，不遮图标） */
  .ribbon{
    position:absolute;left:-6px;top:-6px;z-index:3;
    background:linear-gradient(135deg,#5e5ce6,#8b5cf6);color:#fff;
    font-size:10px;font-weight:700;line-height:1;
    padding:4px 8px;border-radius:6px 8px 6px 6px;
    box-shadow:0 3px 8px rgba(94,92,230,.35),0 0 0 1px rgba(255,255,255,.5) inset;
    max-width:60%;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
    letter-spacing:.3px;pointer-events:none;
  }
  .ribbon::before{
    content:"";position:absolute;left:0;bottom:-4px;width:6px;height:4px;
    background:linear-gradient(135deg,transparent 50%,#3a39b8 50%);
  }
  .ribbon.r-game{background:linear-gradient(135deg,#ff6b6b,#ff9558);box-shadow:0 3px 8px rgba(255,107,107,.4),0 0 0 1px rgba(255,255,255,.5) inset}
  .ribbon.r-game::before{background:linear-gradient(135deg,transparent 50%,#c94a4a 50%)}
  .info{flex:1;min-width:0;width:100%}
  .nm{font-size:15px;font-weight:650;margin-bottom:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .sb{font-size:12px;color:var(--t3);display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin-bottom:5px;min-width:0}
  .sb b{color:var(--blue);font-weight:600;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .ds{
    font-size:12.5px;color:var(--t2);line-height:1.45;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden
  }
  /* 卡片操作按钮：下载 / 复制链接 / 签名 / 到服务器 排成一行、等分铺满整行。
     用「按数量自动分列」而不是写死 4 列，按钮被后台关掉后自动少占一份、不留空位 */
  .act{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:6px;flex-shrink:0}
  .mini{
    border:none;border-radius:9px;height:32px;padding:0 8px;font-size:13px;
    font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap;
    transition:transform .12s,background .15s,color .15s;width:100%
  }
  .mini:active{transform:scale(.94)}
  .m-dl{background:var(--blue);color:#fff;box-shadow:0 3px 10px rgba(0,122,255,.25)}
  .m-dl:hover{background:#0062cc}
  .m-cp{background:rgba(0,0,0,.06);color:var(--t2)}
  .m-cp:hover{background:rgba(0,0,0,.1);color:var(--t1)}
  .m-sv{background:rgba(52,199,89,.15);color:#1a7f37}
  .m-sv:hover{background:rgba(52,199,89,.26)}
  /* 在线安装（zsign 签名后直接装到本机） */
  .m-si{background:rgba(255,149,0,.16);color:#c77700}
  .m-si:hover{background:rgba(255,149,0,.28)}

  /* ---------- 拉取进度面板 ---------- */
  .mask{position:fixed;inset:0;background:rgba(0,0,0,.32);backdrop-filter:blur(4px);z-index:200;display:none}
  .mask.on{display:block}
  .panel{
    position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);
    width:min(440px,92vw);background:#fff;border-radius:18px;z-index:201;
    box-shadow:0 30px 80px rgba(0,0,0,.28);padding:22px;display:none
  }
  .panel.on{display:block}
  .panel h3{margin:0 0 4px;font-size:17px}
  .panel .sub{font-size:12.5px;color:var(--t3);margin-bottom:16px;word-break:break-all}
  .pbar{height:10px;background:rgba(0,0,0,.06);border-radius:6px;overflow:hidden}
  .pfill{height:100%;width:0;background:linear-gradient(90deg,#007aff,#34c759);transition:width .25s;border-radius:6px}
  .ppct{font-size:30px;font-weight:800;color:var(--blue);text-align:center;margin:14px 0 4px;letter-spacing:-.5px}
  .pinfo{font-size:12.5px;color:var(--t2);text-align:center;margin-bottom:14px;line-height:1.9}
  .pinfo b{color:var(--t1);font-weight:600}
  .pinfo .err{color:#d93025}
  .pinfo .ok{color:#1a7f37;font-weight:600}
  .panel .rowb{display:flex;gap:9px;margin-top:6px}
  .panel .rowb button{
    flex:1;height:38px;border-radius:10px;border:none;font-size:14px;
    font-weight:600;cursor:pointer;font-family:inherit
  }
  .b-close{background:rgba(0,0,0,.06);color:var(--t2)}
  .b-copy{background:var(--blue);color:#fff;display:none}
  .b-copy.on{display:block}

  /* 手机端：下载 / 进度面板改为底部弹出（替代居中 modal，与任务抽屉交互一致） */
  @media (max-width:768px){
    .panel{
      left:0;right:0;top:auto;bottom:0;
      width:auto;max-width:100vw;
      border-radius:20px 20px 0 0;
      padding:20px 18px calc(20px + env(safe-area-inset-bottom,0px));
      box-shadow:0 -18px 50px rgba(0,0,0,.25);
      transform:translateY(100%);
      /* 用 visibility/opacity 实现滑入动画：display:none 无法过渡 transform */
      display:block;visibility:hidden;opacity:0;pointer-events:none;
      transition:transform .28s cubic-bezier(.22,1,.36,1),opacity .2s ease,visibility .28s
    }
    .panel.on{
      display:block;visibility:visible;opacity:1;pointer-events:auto;
      transform:translateY(0)
    }
  }

  /* ---------- 空态 / 更多 ---------- */
  .empty{grid-column:1 / -1;text-align:center;padding:70px 20px;color:var(--t3);font-size:14px}
  .empty-sub{margin-top:9px;font-size:12.5px;line-height:1.7;color:var(--t3);opacity:.85}
  .more{display:flex;justify-content:center;padding:22px 0 8px}
  .more button{
    border:1px solid var(--line);background:#fff;color:var(--t2);
    border-radius:11px;padding:9px 26px;font-size:14px;cursor:pointer;font-family:inherit
  }
  .more button:hover{color:var(--t1);box-shadow:var(--shadow)}
  .sentinel{height:1px}

  /* ---------- 提示 ---------- */
  #toast{
position:fixed;left:50%;bottom:calc(88px + env(safe-area-inset-bottom,0px));transform:translate(-50%,20px);
    background:rgba(29,29,31,.92);color:#fff;padding:10px 20px;border-radius:11px;
    font-size:14px;opacity:0;pointer-events:none;transition:.25s;z-index:999;backdrop-filter:blur(10px)
  }
  #toast.on{opacity:1;transform:translate(-50%,0)}
  /* ---------- 自适应 ---------- */
  /* 大屏：4 宫格 */
  @media (min-width:1100px){
    .list{grid-template-columns:repeat(4,minmax(0,1fr))}
  }
  /* 中屏：3 列 */
  @media (min-width:860px) and (max-width:1099px){
    .list{grid-template-columns:repeat(3,minmax(0,1fr))}
  }
  /* 小平板 / 大手机横屏：2 列 */
  @media (min-width:600px) and (max-width:859px){
    .list{grid-template-columns:repeat(2,minmax(0,1fr))}
    .ic{width:58px;height:58px}
  }
  /* 手机：单列卡片（图标在左、信息在右、按钮成行） */
  @media (max-width:599px){
    .wrap{padding:0 12px}
    .list{grid-template-columns:1fr;gap:10px}
    .item{padding:12px;gap:10px;border-radius:15px}
    .top{flex-direction:row;align-items:center;text-align:left;gap:12px}
    .ic{width:54px;height:54px;border-radius:13px;font-size:20px}
    .sb{justify-content:flex-start;margin-bottom:3px}
    .ds{-webkit-line-clamp:2}
    /* 手机端同样一行四个、自动等分（高度与字号由下面的 .mini 微调） */
    .mini{height:34px;padding:0 6px;font-size:12.5px}
    .src{gap:11px;padding:13px}
    .src img{width:46px;height:46px;border-radius:11px}
    .tools .fld{min-width:0}
    .tools #in-sort{flex:0 0 auto;min-width:116px}
    .cats{margin:12px 0 0;gap:7px}
    .cat{padding:6px 13px;font-size:12.5px}
    .title h1{font-size:17px}
    .fld{min-width:0}
    .fld select{flex:1 1 auto;min-width:0}
    .row{gap:8px}
    .btn{width:100%}
    /* 手机端：图标在卡片左侧，把徽章挪到卡片右上角，避免压在图标上 */
    .ribbon{left:auto;right:-6px;font-size:9.5px;padding:3px 7px;max-width:55%}
    .ribbon::before{display:none}
  }
  @media (max-width:380px){
    .ic{width:48px;height:48px}
    .mini{font-size:12px;padding:0 4px}
  }

/* ---------- 移动端：禁止聚焦时自动放大 / 禁止缩放 ---------- */
html{
  -webkit-text-size-adjust:100%;
  -ms-text-size-adjust:100%;
  text-size-adjust:100%;
}
body{
  touch-action:manipulation;      /* 去掉双击缩放与 300ms 点击延迟 */
  -webkit-touch-callout:none;
}
/* iOS：文本输入类控件字号 < 16px 会触发自动放大，这里统一锁到 16px */
@media (max-width:768px){
  input, select, textarea{
    font-size:16px !important;
    line-height:1.4;
  }
  .fld input, .fld select{ height:42px; }
  .fld.has-tag input{ padding-left:56px; }
  .tools .fld input{ padding-left:36px; padding-right:34px; }
}

/* ---------- 底部导航栏 ---------- */
/* 手机：通栏 tab bar；桌面：居中悬浮胶囊 */
.tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:90;
  display:flex;align-items:stretch;
  background:rgba(255,255,255,.9);
  backdrop-filter:saturate(180%) blur(20px);
  -webkit-backdrop-filter:saturate(180%) blur(20px);
  border-top:1px solid var(--line);
  padding-bottom:env(safe-area-inset-bottom,0px);
  box-shadow:0 -4px 20px rgba(0,0,0,.05);
}
.tab{
  position:relative;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  height:54px;border:none;background:none;color:var(--t3);
  font-size:11px;font-weight:600;font-family:inherit;cursor:pointer;
  transition:color .15s,transform .12s;
  -webkit-tap-highlight-color:transparent;
}
.tab .ti{font-size:19px;line-height:1;display:block}
.tab .ti svg{display:block;width:23px;height:23px;stroke:currentColor}
.tab .tl{display:block;letter-spacing:.2px}
.tab:active{transform:scale(.9)}
.tab.on{color:var(--blue)}
.tab.on .ti{transform:translateY(-1px)}
.tab .badge{
  position:absolute;top:6px;left:50%;margin-left:8px;
  min-width:15px;height:15px;padding:0 4px;border-radius:8px;
  background:#ff3b30;color:#fff;font-size:10px;line-height:15px;
  text-align:center;font-weight:700;display:none
}
.tab .badge.on{display:block}

@media (min-width:769px){
  .tabbar{
    left:50%;right:auto;transform:translateX(-50%);
    bottom:18px;border:1px solid var(--line);border-radius:26px;
    padding:6px 8px;gap:2px;
    box-shadow:0 14px 38px rgba(0,0,0,.16);
  }
  .tab{
    flex:0 0 auto;flex-direction:row;gap:7px;height:38px;
    padding:0 17px;border-radius:20px;font-size:13px;color:var(--t2)
  }
  .tab:hover{background:rgba(0,0,0,.05);color:var(--t1)}
  .tab.on{background:var(--blue);color:#fff}
  .tab.on:hover{background:#0062cc;color:#fff}
  .tab .ti{font-size:15px}
}

@keyframes flashBox{
  0%,100%{ box-shadow:0 0 0 0 rgba(0,122,255,0) }
  35%   { box-shadow:0 0 0 3px rgba(0,122,255,.32) }
}
.flash{ animation:flashBox .85s ease; border-radius:14px }
/* ---------- 最小化按钮 ---------- */
.b-min{
  background:rgba(0,122,255,.1);color:var(--blue);display:none
}
.b-min.on{display:block}
.b-min:hover{background:rgba(0,122,255,.18)}

.tk-acts{display:flex;align-items:center;gap:6px;flex-shrink:0}

/* ---------- 任务中心（底部抽屉） ---------- */
#tmask{z-index:210}
.sheet{
  position:fixed;left:0;right:0;bottom:0;z-index:211;
  background:#fff;border-radius:20px 20px 0 0;
  box-shadow:0 -18px 50px rgba(0,0,0,.22);
  max-height:74vh;display:none;flex-direction:column;
  transform:translateY(100%);transition:transform .26s cubic-bezier(.22,1,.36,1);
  padding-bottom:env(safe-area-inset-bottom,0px);
}
.sheet.on{display:flex;transform:translateY(0)}
.sh-hd{
  display:flex;align-items:center;gap:9px;
  padding:16px 16px 12px;border-bottom:1px solid var(--line)
}
.sh-hd h3{margin:0;font-size:16px;font-weight:700}
.sh-sub{font-size:12px;color:var(--t3);flex:1}
.sh-hd button{
  border:none;background:rgba(0,0,0,.06);color:var(--t2);
  border-radius:9px;padding:6px 14px;font-size:13px;cursor:pointer;font-family:inherit
}
.sh-hd button:hover{background:rgba(0,0,0,.11);color:var(--t1)}
.sh-list{overflow:auto;padding:8px 12px 14px;-webkit-overflow-scrolling:touch}

.tk{
  display:flex;align-items:center;gap:11px;
  padding:11px 10px;border-radius:13px;transition:background .15s
}
.tk:hover{background:rgba(0,0,0,.035)}
.tk + .tk{border-top:1px solid var(--line)}
.tk-ic{
  width:38px;height:38px;border-radius:11px;flex-shrink:0;
  background:rgba(0,0,0,.05);display:flex;align-items:center;justify-content:center;font-size:18px
}
.tk.live .tk-ic{background:rgba(0,122,255,.1)}
.tk-main{flex:1;min-width:0}
.tk-nm{
  font-size:14px;font-weight:600;margin-bottom:3px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis
}
.tk-nm span{font-weight:500;color:var(--t3);font-size:12px}
.tk-st{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--t3);margin-bottom:6px}
.tk-st .tk-txt{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tk-pct{flex:0 0 auto;font-size:12px;font-weight:600;color:#007aff;font-variant-numeric:tabular-nums}
.tk.done .tk-pct{color:#1a7f37}
.tk.err  .tk-pct{display:none}
.tk-kind{display:inline-block;font-style:normal;font-size:11px;line-height:16px;padding:0 6px;margin-right:6px;border-radius:5px;background:rgba(0,122,255,.12);color:#007aff}
.tk-kind.sg{background:rgba(255,149,0,.18);color:#b25000}
.tk.done .tk-st{color:#1a7f37}
.tk.err  .tk-st{color:#d93025}
.tk-bar{height:5px;background:rgba(0,0,0,.07);border-radius:3px;overflow:hidden}
.tk-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,#007aff,#34c759);border-radius:3px;transition:width .3s}
.tk.err .tk-bar i{background:#ff3b30}
.tk-btn{
  border:none;background:var(--blue);color:#fff;border-radius:9px;
  padding:7px 14px;font-size:13px;font-weight:600;cursor:pointer;
  font-family:inherit;flex-shrink:0
}
.tk-btn:active{transform:scale(.94)}
.tk.done .tk-btn,.tk.err .tk-btn{background:rgba(0,0,0,.06);color:var(--t2)}
.tk-empty{
  text-align:center;padding:44px 16px;color:var(--t3);font-size:13.5px;line-height:1.9
}
.tk-empty span{font-size:12px;color:#b8b8bd}

@media (min-width:769px){
  .sheet{
    left:50%;right:auto;transform:translateX(-50%) translateY(120%);
    width:min(560px,92vw);border-radius:20px;bottom:80px;max-height:66vh;
    border:1px solid var(--line)
  }
  .sheet.on{transform:translateX(-50%) translateY(0)}
}
/* ---------- 面板 / 任务项 应用图标 ---------- */
.p-hd{display:flex;align-items:center;gap:11px;margin-bottom:14px}
.p-ic{
  position:relative;width:46px;height:46px;border-radius:12px;flex-shrink:0;
  background:#f2f3f5;display:flex;align-items:center;justify-content:center;
  font-size:19px;overflow:hidden
}
.p-ic img{
  position:absolute;left:0;top:0;width:100%;height:100%;
  object-fit:cover;display:block
}
.p-ht{flex:1;min-width:0}
.p-ht h3{margin:0 0 3px;font-size:16.5px}
.p-ht .sub{margin-bottom:0}

.tk-ic{position:relative;overflow:hidden}
.tk-ic img{
  position:absolute;left:0;top:0;width:100%;height:100%;
  object-fit:cover;display:block;border-radius:11px
}
