
  :root{
    --bg:#f5f6f8;
    --card:#ffffff;
    --line:#e6e8ec;
    --line-strong:#d8dbe2;
    --text:#1a1d24;
    --text-2:#5b6270;
    --text-3:#8b93a3;
    --accent:#2f6bff;
    --accent-soft:#eef3ff;
    --green:#0e9f6e;
    --red:#e5484d;
    --amber:#c47f17;
    --violet:#7c5cff;
    --radius:14px;
  }
  *{box-sizing:border-box;margin:0;padding:0}
  body{
    font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Helvetica Neue","Microsoft YaHei",sans-serif;
    background:var(--bg); color:var(--text);
    padding:28px 20px 56px; line-height:1.5;
    -webkit-font-smoothing:antialiased;
  }
  .wrap{max-width:1060px;margin:0 auto}

  header.page{margin-bottom:18px}
  header.page h1{
    font-size:22px;font-weight:650;letter-spacing:-.01em;
    display:flex;align-items:center;gap:8px;
  }
  header.page p{color:var(--text-2);font-size:13.5px;margin-top:6px}

  /* 版本号：默认不显示，等原生把 Info.plist 里的版本报上来才点亮 */
  .ver{
    display:none;flex:0 0 auto;
    font-size:11px;font-weight:600;line-height:18px;letter-spacing:0;
    padding:0 7px;border-radius:9px;
    background:var(--accent-soft);color:var(--accent);
    border:1px solid rgba(47,107,255,.22);
    cursor:pointer;user-select:none;-webkit-user-select:none;
  }
  .ver.show{display:inline-block}
  .ver:hover{background:#e2eaff}
  .ver:active{transform:translateY(1px)}

  /* ---------- 标签页 ---------- */
  .tabs{
    display:inline-flex;gap:4px;padding:4px;margin-bottom:20px;
    background:#eceef2;border-radius:11px;
  }
  .tab{
    font:inherit;font-size:13.5px;font-weight:550;cursor:pointer;
    padding:8px 20px;border:none;border-radius:8px;background:transparent;
    color:var(--text-2);transition:.16s;
  }
  .tab:hover{color:var(--text)}
  .tab.active{
    background:#fff;color:var(--text);
    box-shadow:0 1px 3px rgba(16,24,40,.10),0 1px 1px rgba(16,24,40,.04);
  }
  .panel{display:none}
  .panel.active{display:block;animation:fade .18s ease}
  @keyframes fade{from{opacity:0;transform:translateY(3px)}to{opacity:1;transform:none}}

  .grid{display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:start}
  @media (max-width:880px){.grid{grid-template-columns:1fr}}

  .card{
    background:var(--card);border:1px solid var(--line);
    border-radius:var(--radius);padding:18px 18px 20px;
    box-shadow:0 1px 2px rgba(16,24,40,.04),0 6px 20px -12px rgba(16,24,40,.10);
  }
  .card h2{
    font-size:13px;font-weight:600;color:var(--text-2);
    text-transform:uppercase;letter-spacing:.06em;
    display:flex;align-items:center;gap:8px;margin-bottom:16px;
  }
  .card h2::before{content:"";width:6px;height:6px;border-radius:2px;background:var(--accent)}
  .card.tokens h2::before{background:var(--violet)}
  .card.image h2::before{background:var(--green)}

  .field{margin-bottom:14px}
  .field:last-child{margin-bottom:0}
  .field label{display:block;font-size:13px;font-weight:550;color:var(--text);margin-bottom:6px}
  .field .hint{font-weight:400;color:var(--text-3);font-size:12px;margin-left:4px}

  .inputwrap{position:relative;display:flex;align-items:center}
  .prefix{
    position:absolute;left:12px;color:var(--text-3);font-size:14px;
    font-variant-numeric:tabular-nums;pointer-events:none;
  }
  .suffix{
    position:absolute;right:12px;color:var(--text-3);font-size:12px;
    pointer-events:none;white-space:nowrap;
  }
  input[type=text],input[type=password],select,textarea{
    width:100%;font:inherit;font-size:14px;
    font-variant-numeric:tabular-nums;
    padding:10px 12px;border:1px solid var(--line-strong);
    border-radius:9px;background:#fcfcfd;color:var(--text);
    transition:border-color .15s,box-shadow .15s,background .15s;
  }
  input.has-suffix{padding-right:80px}
  input.has-prefix{padding-left:26px}
  input:focus,select:focus,textarea:focus{
    outline:none;border-color:var(--accent);background:#fff;
    box-shadow:0 0 0 3px rgba(47,107,255,.12);
  }
  input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
  select{
    appearance:none;-webkit-appearance:none;cursor:pointer;
    background-image:url("data:image/svg+xml;charset=utf8,%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='%238b93a3' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat:no-repeat;background-position:right 12px center;
    padding-right:32px;
  }
  textarea{resize:vertical;line-height:1.6;font-family:inherit}

  .field-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
  .field-row .field{margin-bottom:14px}

  .divider{height:1px;background:var(--line);margin:16px 0}

  /* ---------- 按钮 ---------- */
  button{
    font:inherit;font-size:13px;font-weight:550;cursor:pointer;
    padding:9px 16px;border-radius:9px;border:1px solid var(--line-strong);
    background:#fff;color:var(--text);transition:.15s;
  }
  button:hover{background:#f7f8fa;border-color:#c9cdd6}
  button:disabled{opacity:.5;cursor:not-allowed}
  button:disabled:hover{background:#fff;border-color:var(--line-strong)}
  button.primary{background:var(--accent);border-color:var(--accent);color:#fff}
  button.primary:hover:not(:disabled){background:#2359e0;border-color:#2359e0}
  button.primary.copied{background:var(--green);border-color:var(--green)}
  button.big{width:100%;padding:12px 16px;font-size:14px}
  button.ghost{background:transparent;border-color:transparent;color:var(--text-2);padding:4px 8px}
  button.ghost:hover{background:#f0f1f4;color:var(--text)}
  button.danger{background:var(--red);border-color:var(--red);color:#fff}
  button.danger:hover:not(:disabled){background:#e05257;border-color:#e05257}
  button.eye{
    position:absolute;right:6px;z-index:2;
    padding:5px 11px;font-size:12px;border-radius:7px;
    border:1px solid var(--line-strong);background:#fff;color:var(--text-2);
  }
  button.eye:hover{background:#f2f4f7;border-color:#c9cdd6;color:var(--text)}
  button.eye.on{background:var(--accent-soft);border-color:#c9d8ff;color:var(--accent)}

  /* 用 CSS 打码而不是 input[type=password]，避免 WKWebView 的密码框干扰 */
  input.masked{-webkit-text-security:disc}
  input.has-eye{padding-right:68px}

  button.mini{
    padding:5px 10px;font-size:11.5px;font-weight:500;border-radius:7px;
    border:1px solid var(--line-strong);background:#fff;color:var(--text-2);
  }
  button.mini:hover{background:#f2f4f7;border-color:#c9cdd6;color:var(--text)}

  /* ---------- 结果面板 ---------- */
  .result{
    background:var(--card);border:1px solid var(--line);
    border-radius:var(--radius);padding:20px;
    box-shadow:0 1px 2px rgba(16,24,40,.04),0 6px 20px -12px rgba(16,24,40,.10);
    margin-top:18px;
  }
  .result-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
  .total-label{font-size:12.5px;color:var(--text-2);font-weight:550;letter-spacing:.04em;text-transform:uppercase}
  .total-value{
    font-size:40px;font-weight:680;letter-spacing:-.02em;
    font-variant-numeric:tabular-nums;margin:4px 0 2px;color:var(--text);
  }
  .total-value .cur{font-size:24px;font-weight:600;color:var(--text-2);margin-right:2px}

  .rows{margin-top:16px;border-top:1px solid var(--line)}
  .row{
    display:flex;align-items:center;justify-content:space-between;
    padding:9px 0;border-bottom:1px solid var(--line);font-size:13.5px;
  }
  .row .k{color:var(--text-2);display:flex;align-items:center;gap:8px}
  .dot{width:7px;height:7px;border-radius:50%;flex:none}
  .dot.in{background:var(--accent)} .dot.cache{background:var(--amber)} .dot.out{background:var(--violet)}
  .row .v{font-variant-numeric:tabular-nums;font-weight:550}
  .row.sub .k,.row.sub .v{color:var(--text-3);font-weight:450}
  .row.total-line{border-bottom:none;padding-top:11px;font-weight:600}
  .row.total-line .k,.row.total-line .v{color:var(--text)}

  .formula{
    margin-top:16px;background:#f8f9fb;border:1px dashed var(--line-strong);
    border-radius:10px;padding:12px 13px;
    font-size:12.5px;color:var(--text-2);line-height:1.75;
    word-break:break-word;font-variant-numeric:tabular-nums;
  }
  .formula .hl{color:var(--text);font-weight:600}
  .formula .op{color:var(--text-3);padding:0 1px}

  .actions{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}

  /* ---------- 生图 ---------- */
  .prompt-foot{display:flex;align-items:center;justify-content:space-between;margin-top:6px}
  .prompt-foot span{font-size:12px;color:var(--text-3)}
  .tip{font-size:12px;color:var(--text-3);margin-top:10px;line-height:1.6}
  .tip code{
    background:#f0f1f4;padding:1px 5px;border-radius:4px;
    font-size:11.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  }

  /* 分段控件 */
  .segmented{display:inline-flex;gap:3px;padding:3px;background:#eceef2;border-radius:9px;margin-bottom:16px}
  .segmented button{
    font:inherit;font-size:13px;font-weight:550;cursor:pointer;
    padding:6px 18px;border:none;border-radius:7px;background:transparent;color:var(--text-2);
    box-shadow:none;
  }
  .segmented button:hover{background:transparent;color:var(--text)}
  .segmented button.active{
    background:#fff;color:var(--text);
    box-shadow:0 1px 3px rgba(16,24,40,.10),0 1px 1px rgba(16,24,40,.04);
  }
  /* 字段里的分段控件：比页签那种小一号，也不要下面那一大截留白 */
  .segmented.compact{margin-bottom:0;padding:2px;border-radius:8px}
  .segmented.compact button{padding:4px 12px;font-size:12.5px;border-radius:6px}

  /* 尺寸：档位一行、方向一行。
     左侧配置栏只有 220 多像素宽，两组按钮挤一行放不下，
     所以直接纵向排开，按钮尺寸跟别的控件保持一致。 */
  .size-picks{
    display:flex;flex-direction:column;align-items:flex-start;
    gap:7px;margin-bottom:8px;
  }

  /* 参考图 */
  .dropzone{
    border:1.5px dashed var(--line-strong);border-radius:10px;
    padding:18px 14px;text-align:center;cursor:pointer;
    background:#fafbfc;transition:.15s;
  }
  .dropzone:hover,.dropzone.over{border-color:var(--accent);background:var(--accent-soft)}
  .dropzone .dz-title{font-size:13px;font-weight:550;color:var(--text-2)}
  .dropzone .dz-sub{font-size:11.5px;color:var(--text-3);margin-top:3px}

  .thumbs{display:grid;grid-template-columns:repeat(auto-fill,minmax(82px,1fr));gap:9px;margin-top:11px}
  .thumb{position:relative;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:#fff}
  .thumb img{width:100%;display:block;aspect-ratio:1/1;object-fit:cover}
  .thumb .rm{
    position:absolute;top:4px;right:4px;width:20px;height:20px;padding:0;
    border:none;border-radius:50%;background:rgba(16,20,28,.62);color:#fff;
    font-size:13px;line-height:1;display:flex;align-items:center;justify-content:center;
    cursor:pointer;
  }
  .thumb .rm:hover{background:var(--red)}
  .thumb .nm{
    font-size:10.5px;color:var(--text-3);padding:3px 6px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .hidden{display:none !important}

  /* 保留渲染但不可见 —— WebKit 会拒绝触发 display:none 的文件选择框 */
  .file-hidden{
    position:absolute;width:1px;height:1px;margin:-1px;padding:0;
    border:0;opacity:0;overflow:hidden;pointer-events:none;clip:rect(0 0 0 0);
  }

  /* 模型名下拉 */
  .combo-field{position:relative}
  .combo{
    position:absolute;left:0;right:0;top:100%;z-index:30;margin-top:6px;
    background:#fff;border:1px solid var(--line-strong);border-radius:10px;
    box-shadow:0 12px 32px -10px rgba(16,24,40,.28);
    overflow:hidden;
  }
  .combo-head{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    padding:8px 11px;border-bottom:1px solid var(--line);
    font-size:11.5px;color:var(--text-3);background:#fafbfc;
  }
  .combo-filter{
    display:flex;align-items:center;gap:5px;
    font-size:11.5px;color:var(--text-2);cursor:pointer;user-select:none;
  }
  .combo-filter input{margin:0;cursor:pointer}
  .combo-list{max-height:232px;overflow-y:auto;overscroll-behavior:contain}
  .combo-item{
    display:block;width:100%;text-align:left;
    padding:8px 12px;font-size:12.5px;line-height:1.45;
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
    border:none;border-radius:0;background:#fff;color:var(--text);cursor:pointer;
  }
  .combo-item:hover{background:var(--accent-soft);color:var(--accent)}
  .combo-item + .combo-item{border-top:1px solid var(--line)}
  .combo-empty{padding:12px;font-size:12px;color:var(--text-3);text-align:center}
  button.eye[disabled]{opacity:.55;cursor:default}
  button.eye.busy{background:var(--accent-soft);border-color:#c9d8ff;color:var(--accent)}

  .state{padding:8px 0}
  .empty{
    text-align:center;color:var(--text-3);font-size:13.5px;
    padding:44px 20px;border:1px dashed var(--line-strong);border-radius:11px;
  }
  .empty .big-ico{font-size:26px;display:block;margin-bottom:8px;opacity:.45}
  .empty .empty-sub{display:block;margin-top:7px;font-size:12px;opacity:.8}

  .spinner{
    display:flex;align-items:center;gap:11px;justify-content:center;
    padding:40px 20px;color:var(--text-2);font-size:13.5px;
  }
  .spinner i{
    width:16px;height:16px;border:2px solid var(--line-strong);
    border-top-color:var(--accent);border-radius:50%;
    animation:spin .7s linear infinite;flex:none;
  }
  @keyframes spin{to{transform:rotate(360deg)}}

  .err{
    background:#fef2f2;border:1px solid #fbd5d6;color:#a8262a;
    border-radius:11px;padding:13px 15px;font-size:13px;line-height:1.65;
    word-break:break-word;
  }
  .err b{display:block;margin-bottom:3px;font-size:13.5px}

  /* ---------- 结果网格 ----------
     整块区域铺成横排的卡片网格，一屏能看到很多张；
     每张图的文件名/按钮平时收起，指上去才浮出来，省下纵向空间。 */

  #genState{
    display:grid;
    grid-template-columns:repeat(auto-fill,minmax(190px,1fr));
    gap:12px;margin-top:14px;align-items:start;
  }
  #genState .empty{grid-column:1/-1}

  .img-grid{
    display:grid;grid-template-columns:1fr;gap:6px;min-width:0;
  }
  .img-grid.two{grid-template-columns:1fr 1fr}

  .img-item{
    position:relative;border:1px solid var(--line);border-radius:9px;
    overflow:hidden;background:#e9ecf1;min-width:0;
  }
  .img-item img{
    width:100%;display:block;cursor:zoom-in;
    aspect-ratio:4/3;object-fit:contain;background:#e9ecf1;
  }

  .img-bar,.img-btns{
    position:absolute;left:0;right:0;z-index:2;
    opacity:0;transition:opacity .14s;pointer-events:none;
  }
  .img-bar{
    top:0;display:flex;align-items:center;justify-content:space-between;gap:6px;
    padding:5px 7px;font-size:10.5px;color:#fff;
    background:linear-gradient(180deg,rgba(10,12,16,.68),rgba(10,12,16,0));
  }
  .img-name{
    min-width:0;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  }
  /* 单张图的规格（尺寸 · 格式 · 体积）。文件名先让位，规格整段不折行 */
  .img-spec{
    flex:none;white-space:nowrap;font-variant-numeric:tabular-nums;
    color:rgba(255,255,255,.86);
  }
  .img-btns{
    bottom:0;display:flex;gap:5px;padding:6px;
    background:linear-gradient(0deg,rgba(10,12,16,.68),rgba(10,12,16,0));
  }
  .img-btns button{
    flex:1;padding:4px 6px;font-size:11px;border-radius:6px;font-weight:550;
    border:1px solid rgba(255,255,255,.4);background:rgba(255,255,255,.93);color:#1a1f2b;
  }
  .img-btns button:hover{background:#fff;border-color:#fff}
  .img-item:hover .img-bar,.img-item:hover .img-btns,
  .img-item:focus-within .img-bar,.img-item:focus-within .img-btns{
    opacity:1;pointer-events:auto;
  }
  /* 勾选框给文件名条让出位置 */
  .img-bar{padding-left:29px}

  /* ---------- 多选下载 ---------- */
  /* 勾选框一直在（否则没人发现能多选），但做得很轻；
     用半透明底 + 白描边，压在深色或浅色图上都看得见 */
  .img-pick{
    position:absolute;top:5px;left:5px;z-index:3;
    width:17px;height:17px;border-radius:5px;cursor:pointer;
    border:1.5px solid rgba(255,255,255,.62);
    background:rgba(10,12,16,.38);
    display:flex;align-items:center;justify-content:center;
    transition:background .14s,border-color .14s,transform .14s;
  }
  .img-pick:hover{border-color:#fff;background:rgba(10,12,16,.66)}
  .img-pick.on{background:var(--accent);border-color:var(--accent)}
  .img-pick.on::after{
    content:'';width:9px;height:5px;margin-top:-2px;
    border-left:2px solid #fff;border-bottom:2px solid #fff;
    transform:rotate(-45deg);
  }
  .img-item.picked{
    border-color:var(--accent);
    box-shadow:0 0 0 2px rgba(47,107,255,.28);
  }
  .img-item.picked img{opacity:.86}

  /* 选中之后从底部浮出来的操作条 */
  .pick-bar{
    position:fixed;left:50%;bottom:22px;z-index:50;
    display:flex;align-items:center;gap:9px;
    padding:9px 11px;border-radius:13px;
    background:rgba(24,28,36,.95);
    box-shadow:0 14px 40px rgba(0,0,0,.34);
    color:#fff;font-size:13px;
    opacity:0;pointer-events:none;
    transform:translateX(-50%) translateY(14px);
    transition:opacity .18s,transform .18s;
  }
  .pick-bar.show{opacity:1;pointer-events:auto;transform:translateX(-50%) translateY(0)}
  .pick-count{font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
  .pick-sep{width:1px;height:18px;background:rgba(255,255,255,.22)}
  .pick-bar button{
    padding:6px 11px;font-size:12.5px;border-radius:8px;
    border:1px solid rgba(255,255,255,.28);
    background:rgba(255,255,255,.08);color:#fff;
  }
  .pick-bar button:hover{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.42)}
  .pick-bar button.primary{
    background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600;
  }
  .pick-bar button.primary:hover:not(:disabled){background:#2359e0;border-color:#2359e0}

  /* ---------- 任务卡片（网格里的一格） ---------- */
  .task{
    display:flex;flex-direction:column;gap:6px;min-width:0;
    border:1px solid var(--line);border-radius:11px;
    padding:9px;background:#fff;
  }
  /* 多图 / 报错的卡片占两格，缩略图不至于太小，报错信息也有地方铺开 */
  .task.multi,.task.failed{grid-column:span 2}
  .task.running{border-color:#c9d8ff;background:#fbfcff}
  .task.failed{border-color:#fbd5d6;background:#fffbfb}
  .task-head{display:flex;align-items:center;gap:6px;min-width:0}
  .task-prompt{
    flex:1;min-width:0;font-size:12.5px;color:var(--text);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  /* 卡片右上角的「参数」入口：一条记录一个，点了看这条的请求参数 */
  .task-info{
    flex:none;font:inherit;font-size:10.5px;font-weight:600;line-height:1;
    cursor:pointer;height:19px;padding:0 7px;border-radius:5px;
    border:1px solid var(--line);background:#fff;color:var(--text-3);
    transition:background .14s,color .14s,border-color .14s;
  }
  .task-info:hover{background:#f2f5fb;border-color:#d5ddec;color:var(--accent)}
  /* 说明行：一排小标签（模型 / 尺寸 / 格式 / 张数 / 耗时 / 大小 / 时间）。
     放不下就换行，不再整行省略号 —— 模型名一长，后面几项就全看不见了。
     标签做得很紧凑：237px 的卡片里七个标签要能收在两行内 */
  .task-meta{
    display:flex;flex-wrap:wrap;gap:3px;
    font-size:10.5px;color:var(--text-3);
  }
  .task-meta:empty{display:none}
  .mtag{
    display:inline-block;max-width:100%;
    padding:0 5px;border-radius:5px;line-height:16px;
    background:#f3f5f8;border:1px solid #e8ebf0;color:var(--text-2);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .mtag.model{
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
    background:#eef2fb;border-color:#dbe4f8;color:#33518f;
  }
  .mtag.dims{font-variant-numeric:tabular-nums}
  .mtag.fmt{font-weight:650;letter-spacing:.03em}
  .mtag.busy{background:var(--accent-soft);border-color:transparent;color:var(--accent)}
  .task .err{margin:0;padding:9px 10px;font-size:12px;border-radius:9px}
  .task .err b{font-size:12.5px}

  /* 窄窗口时自动退回单列，避免 span 2 撑破容器 */
  @media (max-width:520px){
    .task.multi,.task.failed{grid-column:auto}
  }
  .badge{
    font-size:11px;font-weight:600;padding:2px 8px;border-radius:20px;
    white-space:nowrap;flex:none;
  }
  .badge.queued{background:#f0f1f4;color:var(--text-2)}
  .badge.running{background:var(--accent-soft);color:var(--accent)}
  .badge.done{background:#e7f7f0;color:var(--green)}
  .badge.failed{background:#fdecec;color:var(--red)}
  .badge.ref{background:#f4f0ff;color:var(--violet)}
  .task-loading{
    display:flex;align-items:center;gap:8px;
    font-size:12px;color:var(--text-2);line-height:1.5;
  }
  .task-loading i{
    width:13px;height:13px;border:2px solid var(--line-strong);
    border-top-color:var(--accent);border-radius:50%;
    animation:spin .7s linear infinite;flex:none;
  }
  .queue-summary{font-size:12px;color:var(--text-3)}
  .result-title{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}

  /* 结果面板的两个页签：本次生成 / 历史记录 */
  .result-tabs{margin:14px 0 2px}
  .result-tabs button{display:inline-flex;align-items:center;gap:7px}
  .result-tabs b{
    font-size:11px;font-weight:650;line-height:1;font-variant-numeric:tabular-nums;
    min-width:20px;text-align:center;padding:2px 6px;border-radius:20px;
    background:#dfe2e8;color:var(--text-2);transition:.16s;
  }
  .result-tabs button.active b{background:var(--accent-soft);color:var(--accent)}
  .gen-summary{
    font-size:12.5px;color:var(--text-2);margin-top:14px;
    padding-top:12px;border-top:1px solid var(--line);
  }
  .gen-summary b{color:var(--text)}

  /* 大图预览（可缩放 / 平移） */
  .lightbox{
    position:fixed;inset:0;background:rgba(12,14,18,.9);
    display:none;z-index:60;
    /* 上下两条浮层各占多高，由 JS 量出来（提示词长短会影响高度）。
       图片只在中间这条空出来的带子里居中，免得被提示词卡片和工具条压住。 */
    --lb-top:0px;--lb-bottom:0px;
  }
  .lightbox.show{display:block}
  .lb-stage{
    position:absolute;left:0;right:0;z-index:1;
    top:var(--lb-top,0px);bottom:var(--lb-bottom,0px);
    display:flex;align-items:center;justify-content:center;
    overflow:hidden;cursor:zoom-in;
  }
  .lb-stage.grabbing{cursor:grabbing}
  .lb-stage img{
    max-width:none;max-height:none;width:auto;height:auto;
    transform-origin:center center;will-change:transform;
    border-radius:8px;box-shadow:0 24px 70px rgba(0,0,0,.5);
    user-select:none;-webkit-user-select:none;-webkit-user-drag:none;
  }
  .lb-stage img.loading{opacity:.25}
  .lb-bar{
    position:absolute;left:50%;bottom:22px;transform:translateX(-50%);z-index:2;
    display:flex;align-items:center;gap:5px;
    padding:6px 8px;border-radius:12px;
    background:rgba(30,33,40,.94);border:1px solid rgba(255,255,255,.13);
    box-shadow:0 14px 38px rgba(0,0,0,.5);
    backdrop-filter:blur(8px);
  }
  .lb-bar button{
    font:inherit;font-size:12.5px;font-weight:550;line-height:1;
    min-width:32px;height:30px;padding:0 9px;cursor:pointer;
    border:1px solid rgba(255,255,255,.14);border-radius:8px;
    background:rgba(255,255,255,.06);color:#eef1f6;transition:.14s;
  }
  .lb-bar button:hover{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.26)}
  .lb-bar button:active{transform:scale(.95)}
  .lb-bar button.wide{min-width:auto}
  .lb-pct{
    min-width:58px;text-align:center;font-size:12.5px;font-weight:600;
    color:#eef1f6;font-variant-numeric:tabular-nums;
  }
  .lb-sep{width:1px;height:18px;background:rgba(255,255,255,.16);margin:0 3px}

  /* 顶部这一列：提示词在上、操作提示在下 */
  .lb-top{
    position:absolute;left:0;right:0;top:22px;z-index:2;
    display:flex;flex-direction:column;align-items:center;gap:10px;
    padding:0 22px;pointer-events:none;
  }
  .lb-prompt{
    display:none;width:100%;max-width:760px;pointer-events:auto;
    background:rgba(30,33,40,.94);border:1px solid rgba(255,255,255,.13);
    border-radius:12px;box-shadow:0 14px 38px rgba(0,0,0,.45);
    backdrop-filter:blur(8px);overflow:hidden;
  }
  .lb-prompt.show{display:block}
  .lb-prompt-head{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    padding:7px 9px 7px 13px;
    border-bottom:1px solid rgba(255,255,255,.10);
    font-size:11.5px;font-weight:600;letter-spacing:.04em;
    color:rgba(255,255,255,.55);
  }
  .lb-prompt-head button{
    font:inherit;font-size:12px;font-weight:550;line-height:1;cursor:pointer;
    height:26px;padding:0 11px;
    border:1px solid rgba(255,255,255,.16);border-radius:7px;
    background:rgba(255,255,255,.07);color:#eef1f6;transition:.14s;
  }
  .lb-prompt-head button:hover{background:rgba(255,255,255,.16)}
  .lb-prompt-head button.copied{
    background:var(--accent);border-color:var(--accent);color:#fff;
  }
  /* 预览顶部的「模型 · 尺寸 · 格式」，贴在复制按钮左边 */
  .lb-prompt-meta{
    margin-left:auto;min-width:0;
    font-size:11px;font-weight:500;letter-spacing:0;
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
    color:rgba(255,255,255,.48);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .lb-prompt-meta:empty{display:none}
  .lb-prompt-text{
    padding:11px 13px;max-height:32vh;overflow:auto;
    font-size:13px;line-height:1.68;color:#eef1f6;
    white-space:pre-wrap;word-break:break-word;
    -webkit-user-select:text;user-select:text;cursor:text;
  }
  .lb-hint{
    font-size:12px;color:rgba(255,255,255,.62);pointer-events:none;
    background:rgba(0,0,0,.34);padding:5px 12px;border-radius:20px;
    transition:opacity .5s;white-space:nowrap;
  }
  .lb-hint.fade{opacity:0}

  /* ---------- 请求参数面板 ---------- */
  .sheet{
    position:fixed;inset:0;z-index:60;
    display:flex;align-items:center;justify-content:center;
    padding:26px 18px;background:rgba(16,20,28,.44);
    opacity:0;pointer-events:none;transition:opacity .16s;
  }
  .sheet.show{opacity:1;pointer-events:auto}
  .sheet-card{
    display:flex;flex-direction:column;
    width:100%;max-width:560px;max-height:82vh;
    background:#fff;border:1px solid var(--line);border-radius:14px;
    box-shadow:0 24px 60px rgba(16,24,40,.3);
    transform:translateY(10px);transition:transform .18s;
  }
  .sheet.show .sheet-card{transform:translateY(0)}
  .sheet-head{
    display:flex;align-items:center;gap:9px;
    padding:10px 11px 10px 16px;border-bottom:1px solid var(--line);
  }
  .sheet-title{flex:none;font-size:13.5px;font-weight:650}
  .sheet-sub{
    min-width:0;font-size:11px;color:var(--text-3);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .sheet-head .ghost{
    flex:none;font:inherit;font-size:12px;font-weight:550;line-height:1;cursor:pointer;
    height:27px;padding:0 10px;border-radius:7px;
    border:1px solid var(--line);background:#fff;color:var(--text-2);
    transition:background .14s,color .14s;
  }
  .sheet-head .ghost:hover{background:#f4f6f9;color:var(--text)}
  /* 第一个按钮顶到右边，剩下的跟在它后面 */
  .sheet-head .ghost{margin-left:0}
  .sheet-head .ghost.copy{margin-left:auto}
  .sheet-head .ghost.icon{min-width:27px;padding:0 7px}
  .sheet-body{
    overflow:auto;padding:2px 16px 16px;
    -webkit-user-select:text;user-select:text;
  }
  /* ---------- 页内确认弹层（代替 WKWebView 里没人实现的 confirm）---------- */
  .ask-card{max-width:400px}
  .ask-text{
    margin-top:14px;font-size:12.5px;line-height:1.65;color:var(--text);
    white-space:pre-wrap;word-break:break-word;
  }
  .ask-foot{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}
  /* ---------- 产物大图 ---------- */
  .art-card{max-width:920px}
  .art-body{padding-top:12px}
  .art-stage{position:relative;width:100%;height:68vh;min-height:320px;
    border:1px solid var(--line);border-radius:10px;background:#fff;overflow:hidden}
  .art-frame{display:block;border:0;background:#fff}
  .pgroup{margin-top:14px}
  .pgroup-title{
    margin-bottom:5px;font-size:11px;font-weight:650;
    letter-spacing:.06em;color:var(--text-3);
  }
  .prow{
    display:flex;align-items:baseline;gap:10px;
    padding:4px 0;border-bottom:1px dashed #eef0f4;
  }
  .prow:last-child{border-bottom:0}
  .prow .pk{flex:none;width:76px;font-size:12px;color:var(--text-3)}
  .prow .pv{
    flex:1;min-width:0;font-size:12.5px;color:var(--text);word-break:break-all;
  }
  .prow .pv.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}
  .prow.block{display:block}
  .prow.block .pv{margin-top:5px}
  .prow .pv.prompt{
    white-space:pre-wrap;line-height:1.68;
    background:#f7f8fa;border:1px solid #eef0f4;border-radius:8px;padding:9px 10px;
  }
  .prow .pv.code{
    white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
    font-size:11.5px;background:#f7f8fa;border:1px solid #eef0f4;
    border-radius:8px;padding:9px 10px;
  }

  .toast{
    position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(8px);
    background:#1a1d24;color:#fff;font-size:13px;padding:9px 16px;border-radius:9px;
    opacity:0;pointer-events:none;transition:.22s;z-index:70;
  }
  .toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

  .foot{color:var(--text-3);font-size:12px;margin-top:22px;text-align:center}
  .badge{
    display:inline-flex;align-items:center;gap:4px;
    font-size:11px;font-weight:600;padding:2px 7px;border-radius:20px;
    background:var(--accent-soft);color:var(--accent);
  }
  /* ---------- 服务器 ---------- */
  .sv-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:16px}
  .sv-toolbar .spacer{flex:1;min-width:0}
  .sv-auto{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-2)}
  .sv-auto select{width:auto;min-width:100px;padding:7px 10px;font-size:12.5px}
  .sv-updated{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}

  .sv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));gap:14px}
  .sv-grid:empty{display:none}
  .sv-card{
    background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
    padding:14px 15px 13px;
    box-shadow:0 1px 2px rgba(16,24,40,.04),0 6px 20px -12px rgba(16,24,40,.10);
  }
  .sv-card.offline{border-color:#efcaca}

  .sv-head{display:flex;align-items:center;gap:7px;margin-bottom:11px}
  .sv-dot{flex:none;width:8px;height:8px;border-radius:50%;background:#c9cdd6}
  .sv-dot.on{background:var(--green)}
  .sv-dot.off{background:var(--red)}
  .sv-dot.busy{background:var(--amber);animation:svpulse 1s ease-in-out infinite}
  @keyframes svpulse{0%,100%{opacity:1}50%{opacity:.3}}
  .sv-name{flex:none;max-width:46%;font-size:13.5px;font-weight:650;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .sv-host{min-width:0;font-size:11px;color:var(--text-3);
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .sv-acts{margin-left:auto;display:flex;gap:3px;flex:none}

  .sv-err{
    margin:0 0 10px;padding:7px 9px;border-radius:8px;
    background:#fdf2f2;color:#a32d2d;font-size:11.5px;line-height:1.5;
    word-break:break-word;
  }
  .sv-warn{
    margin:0 0 10px;padding:7px 9px;border-radius:8px;
    background:#fdf8ee;color:#8a5a10;font-size:11.5px;line-height:1.5;
  }
  .sv-warn code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}

  .sv-metric{margin-bottom:10px}
  .sv-metric:last-child{margin-bottom:0}
  .sv-metric-head{display:flex;align-items:baseline;gap:6px;
    font-size:11.5px;color:var(--text-2);margin-bottom:4px}
  .sv-metric-head b{margin-left:auto;font-size:12.5px;font-weight:600;color:var(--text);
    font-variant-numeric:tabular-nums}
  .sv-bar{height:6px;border-radius:3px;background:#eceef2;overflow:hidden}
  .sv-bar i{display:block;height:100%;border-radius:3px;background:var(--green);
    transition:width .3s}
  .sv-bar i.warn{background:var(--amber)}
  .sv-bar i.hot{background:var(--red)}
  .sv-sub{font-size:11px;color:var(--text-3);margin-top:4px;
    font-variant-numeric:tabular-nums}
  .sv-foot{margin-top:11px;padding-top:9px;border-top:1px solid var(--line);
    display:flex;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--text-3)}

  .sv-pick{display:flex;gap:8px}
  .sv-pick input{flex:1;min-width:0}
  .sv-tip{margin-top:7px;font-size:11.5px;line-height:1.65;color:var(--text-3)}
  .sv-tip code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;
    background:#f3f5f8;padding:1px 4px;border-radius:4px}
  .field label.sv-check{display:flex;align-items:center;gap:7px;font-weight:550}
  .sv-check input{width:auto;margin:0;flex:none}

  /* ---------- 鹈鹕测试（多站点） ---------- */
  .pt-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
  .pt-bar h2{margin:0}
  .pt-bar .spacer{flex:1;min-width:0}
  .pt-bar-sub{font-size:12.5px;color:var(--text-3)}
  .pt-sites{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,310px),1fr));gap:14px;margin-top:16px}
  .pt-sites:empty{display:none}
  .pt-overview.hidden,.pt-detail.hidden{display:none}
  .pt-summary-card{display:flex;flex-direction:column;transition:border-color .16s,box-shadow .16s;cursor:pointer}
  .pt-summary-card:hover{border-color:var(--accent);box-shadow:0 5px 18px rgba(16,24,40,.08)}
  .pt-site-open{display:flex;flex-direction:column;gap:12px;width:100%;padding:17px;
    text-align:left;border:0;border-radius:0;background:transparent;color:var(--text);font:inherit}
  .pt-site-open:hover{background:#fafbfe}
  .pt-site-open:focus-visible{outline:2px solid var(--accent);outline-offset:-3px}
  .pt-site-open .pt-site-head{padding:0;border:0;background:transparent;width:100%}
  .pt-site-open .pt-site-id{flex:1}
  .pt-site-open .pt-site-name,.pt-site-open .pt-site-sub{display:block}
  .pt-site-open .pt-site-sub{white-space:normal;overflow-wrap:anywhere;line-height:1.6}
  .pt-site-open .pt-site-sum{white-space:normal;line-height:1.6}
  .pt-site-open .pt-cd{font-size:14.5px;font-weight:600}
  .pt-site-link{font-size:12px;color:var(--accent)}
  .pt-latest{flex:1;min-width:0;padding:0 14px 14px}
  .pt-latest-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;
    font-size:11.5px;color:var(--text-3)}
  .pt-latest-state{font-size:11px;color:var(--green)}
  .pt-latest-state.fail{color:var(--red)}
  .pt-latest .pt-card{cursor:pointer;box-shadow:none}
  .pt-latest .pt-meta{flex-wrap:wrap}
  .pt-latest-empty{display:flex;align-items:center;justify-content:center;min-height:190px;
    border:1px dashed var(--line);border-radius:12px;color:var(--text-3);font-size:12px;background:#fafbfc}
  .pt-site-actions .pt-site-link{margin-right:auto;color:var(--accent);border:0;background:transparent;padding-left:0}
  .pt-site-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;border-top:1px solid var(--line);padding:10px 14px}
  .pt-site-actions button{font-size:12px;padding:5px 12px}
  .pt-detail-nav{display:flex;align-items:center;gap:12px;margin-bottom:14px}
  .pt-detail-nav span{font-size:13px;color:var(--text-3)}
  .pt-detail-site>.pt-site-head{flex-wrap:wrap}
  .pt-editor-card{max-width:760px}
  #ptEditorSheet:not(.show){visibility:hidden}
  #ptEditorClose{margin-left:auto}
  #ptEditorForm{border:0;padding:0 4px 4px}
  .pt-editor-note{font-size:12px;color:var(--text-3);line-height:1.6;margin:12px 0 0}
  .pt-site{
    background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
    box-shadow:0 1px 2px rgba(16,24,40,.04);overflow:hidden;
  }
  .pt-site-head{
    display:flex;align-items:center;gap:10px;padding:11px 14px;
    background:#fcfcfd;border-bottom:1px solid var(--line);
  }
  .pt-dot{width:8px;height:8px;border-radius:50%;background:#c9ced8;flex:none}
  .pt-dot[data-state="ok"]{background:var(--green)}
  .pt-dot[data-state="fail"]{background:var(--red)}
  .pt-dot[data-state="running"]{background:var(--accent);animation:ptpulse 1.1s ease-in-out infinite}
  @keyframes ptpulse{0%,100%{opacity:1}50%{opacity:.28}}
  .pt-site-id{min-width:0}
  .pt-site-name{
    font-size:13.5px;font-weight:650;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .pt-site-sub{
    font-size:11.5px;color:var(--text-3);margin-top:1px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .pt-cd{
    font-size:12px;color:var(--text-2);flex:none;
    font-variant-numeric:tabular-nums;white-space:nowrap;
  }
  .pt-cd.off{color:var(--text-3)}
  /* 头部那个倒计时是用户要盯着的数，比表单里的说明字号大一档 */
  .pt-site-head .pt-cd{font-size:14.5px;font-weight:600}
  .pt-site-head .spacer{flex:1;min-width:0}
  .pt-site-head button{font-size:12px;padding:5px 11px}
  .pt-del{color:var(--red);border-color:rgba(229,72,77,.28)}
  .pt-del:hover{background:#fdf3f3}
  .pt-form{padding:0 14px 14px;border-bottom:1px solid var(--line)}
  .pt-form.hidden{display:none}
  .pt-stop{color:var(--red);border-color:rgba(229,72,77,.30)}
  .pt-stop:hover:not(:disabled){background:#fdf3f3}
  .pt-stop.hidden{display:none}
  .pt-form .field{margin-top:12px}
  .pt-row3{display:grid;grid-template-columns:1.35fr 1fr 1fr;gap:12px}
  .pt-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
  @media (max-width:880px){
    .pt-row3,.pt-row{grid-template-columns:1fr}
  }
  .pt-form-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px}
  .pt-form-actions .spacer{flex:1;min-width:0}
  .pt-interval{display:flex;align-items:center;gap:8px}
  .pt-interval select{flex:1;min-width:0}
  .pt-interval .inputwrap{flex:0 0 112px}
  .pt-interval input{padding-right:46px}
  .pt-interval .suffix{right:10px;font-size:11px}
  .pt-hint{font-size:12px;color:var(--text-3)}
  .pt-site-body{padding:12px 14px 14px}
  .pt-site-sum{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .pt-grid{
    display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
    gap:12px;margin-top:11px;
  }
  .pt-grid:empty{display:none}
  .pt-none{display:block;font-size:12.5px;color:var(--text-3);padding:12px 0 2px}
  .pt-card{
    background:#fff;border:1px solid var(--line);border-radius:12px;overflow:hidden;
    display:flex;flex-direction:column;
    box-shadow:0 1px 2px rgba(16,24,40,.04);
  }
  .pt-card.failed{border-color:rgba(229,72,77,.30)}
  /* 产物按独立页面布局，再等比缩进卡片；父页面只读布局，产物脚本仍禁止执行。
     pointer-events:none 让点击落到卡片上，点开历史或大图。 */
  .pt-card.art{cursor:zoom-in}
  .pt-art{position:relative;height:190px;background:#fff;overflow:hidden}
  .pt-art-frame{border:0;pointer-events:none;background:#fff}
  .pt-art-frame,.art-frame{position:absolute;width:1000px;height:625px;
    left:0;top:0;transform-origin:0 0;visibility:hidden}
  .pt-art-frame[data-fitted],.art-frame[data-fitted]{visibility:visible}
  .pt-art-badge{
    position:absolute;right:7px;bottom:7px;padding:2px 7px;border-radius:6px;
    font-size:10.5px;color:#fff;background:rgba(16,20,28,.62);pointer-events:none;
  }
  .pt-reply{
    padding:11px 11px 2px;font-size:12.5px;line-height:1.6;color:var(--text);
    white-space:pre-wrap;word-break:break-word;
    max-height:190px;overflow:auto;
  }
  .pt-reply-empty{color:var(--text-3);font-style:normal}
  .pt-wait{display:flex;flex-direction:column;align-items:center;gap:9px;
    font-size:12px;color:var(--text-3);padding:22px 0}
  .pt-wait i{width:20px;height:20px;border-radius:50%;
    border:2px solid #dfe3ea;border-top-color:var(--accent);
    animation:ptspin .9s linear infinite}
  @keyframes ptspin{to{transform:rotate(360deg)}}
  .pt-body{padding:9px 11px 11px}
  .pt-model{font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;
    text-overflow:ellipsis}
  .pt-model-group{margin-top:14px}
  .pt-model-group:first-child{margin-top:0}
  .pt-model-group-title{display:flex;align-items:center;gap:8px;margin:0 0 8px;
    font-size:12.5px;font-weight:650;color:var(--text)}
  .pt-model-group-title::before{content:'模型';font-size:10px;font-weight:500;
    color:var(--text-3);padding:2px 5px;border:1px solid var(--line);border-radius:5px}
  .pt-latest-models{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .pt-model-latest{min-width:0}
  .pt-model-latest:only-child{grid-column:1/-1}
  .pt-summary-card.pt-multi-model{grid-column:1/-1}
  @media(max-width:480px){.pt-latest-models{grid-template-columns:minmax(0,1fr)}}
  .pt-model-latest-title{display:flex;align-items:center;gap:7px;margin:0 0 6px;
    font-size:11px;color:var(--text-3)}
  .pt-model-latest-title b{font-size:11.5px;color:var(--text);font-weight:650;
    min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
  .pt-model-latest-title span{flex:none}
  .pt-model-fields{display:flex;flex-direction:column;gap:7px}
  .pt-model-field{display:flex;gap:7px;align-items:center}
  .pt-model-field input{flex:1;min-width:0}
  .pt-model-field button{flex:none}
  .pt-model-batch-hint{margin-top:6px;font-size:11px;line-height:1.5;color:var(--text-3)}
  .pt-model-add{margin-top:7px}
  .pt-meta{margin-top:3px;display:flex;gap:8px;align-items:baseline;
    font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .pt-meta .pt-time{margin-left:auto;white-space:nowrap}
  .pt-err{
    margin:0 11px 11px;padding:7px 8px;border-radius:7px;background:#fdf3f3;
    color:var(--red);font-size:11px;line-height:1.5;word-break:break-word;
    white-space:pre-wrap;
  }

  /* ---------- 用户用量分析 ---------- */
  .tabs{max-width:100%;flex-wrap:wrap}
  #panel-usage{font-size:13px}
  .ua-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:14px}
  .ua-eyebrow{font-size:12px;color:var(--text-2);margin-bottom:7px}
  .ua-eyebrow span{display:inline-block;margin-left:8px;padding:1px 7px;border:1px solid var(--line-strong);border-radius:5px;font-size:11px}
  .ua-heading h2{font-size:23px;font-weight:650;letter-spacing:-.025em;margin-bottom:6px}
  .ua-heading p,.ua-muted{color:var(--text-2);font-size:12px}
  .ua-actions{display:flex;gap:8px;flex-wrap:wrap}
  .ua-actions select{width:auto;min-width:145px;padding:8px 30px 8px 10px;font-size:12px}
  .ua-actions a{padding:8px 12px;border-radius:8px;background:white;border:1px solid var(--line-strong);color:var(--text);text-decoration:none;font-size:12px;font-weight:550}
  .ua-actions a:first-child{background:var(--accent);border-color:var(--accent);color:white}
  .ua-actions a:hover{filter:brightness(.96)}
  .ua-actions a:focus-visible,.ua-contents button:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
  .ua-snapshot{padding:11px 14px;margin-bottom:16px;border:1px solid var(--line);border-radius:9px;background:#eef0f4;color:var(--text-2);font-size:12px;line-height:1.7}
  .ua-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}
  .ua-metric{padding:16px}
  .ua-metric h3{font-size:12px;color:var(--text-2);font-weight:500;margin-bottom:10px}
  .ua-metric>strong{display:block;font-size:27px;font-weight:650;letter-spacing:-.04em;font-variant-numeric:tabular-nums;line-height:1.3;white-space:nowrap}
  .ua-metric small{font-size:12px;font-weight:500;letter-spacing:0;color:var(--text-2)}
  .ua-metric p{color:var(--text-3);font-size:11px;margin-top:8px}
  .ua-green{color:var(--green)}
  .ua-conclusion{padding:16px 18px;background:var(--accent-soft);border:1px solid #d9e4ff;border-radius:12px;margin-bottom:16px}
  .ua-conclusion h3{font-size:14px;color:#234d99;margin-bottom:6px}
  .ua-conclusion p{font-size:12px;line-height:1.8;color:#4a6083}
  .ua-charts{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:18px;align-items:stretch}
  .ua-charts h2{margin-bottom:10px}
  .ua-cost-bar{display:flex;gap:3px;height:24px;margin:22px 0;border-radius:6px;overflow:hidden}
  .ua-cost-bar span:nth-child(1),.ua-cost-row:nth-of-type(2) i{background:var(--accent)}
  .ua-cost-bar span:nth-child(2),.ua-cost-row:nth-of-type(3) i{background:var(--violet)}
  .ua-cost-bar span:nth-child(3),.ua-cost-row:nth-of-type(4) i{background:#29b59b}
  .ua-cost-row{display:grid;grid-template-columns:1fr auto 65px;gap:12px;align-items:center;padding:9px 0;border-bottom:1px solid var(--line);font-size:12px;font-variant-numeric:tabular-nums}
  .ua-cost-row>span:first-child{display:flex;align-items:center;gap:7px}
  .ua-cost-row>span:last-child{color:var(--text-2);text-align:right}
  .ua-cost-row i{width:8px;height:8px;border-radius:2px;display:inline-block}
  .ua-chart-note{margin-top:14px;font-size:11px;line-height:1.7;color:var(--text-2)}
  .ua-hour-label{display:flex;justify-content:space-between;margin-bottom:12px;color:var(--text-3);font-size:11px}
  .ua-hour-row{display:grid;grid-template-columns:40px minmax(30px,1fr) 53px 55px;gap:9px;align-items:center;margin:13px 0;font-size:11px;font-variant-numeric:tabular-nums}
  .ua-hour-row>strong,.ua-hour-hit{text-align:right}
  .ua-hour-hit{color:var(--text-2)}
  .ua-hour-track{height:13px;border-radius:3px;background:#f0f3f8;overflow:hidden}
  .ua-hour-track>div{height:100%;border-radius:3px;background:#6e95ff}
  .ua-hour-track>div.ua-hour-low{background:#dfaa53}
  .ua-report{padding:22px 24px 28px}
  .ua-report-heading{display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap;align-items:baseline}
  .ua-report-heading>span{font-size:11px;color:var(--text-3)}
  .ua-report h2{margin-bottom:12px}
  .ua-contents{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 20px;padding-bottom:18px;border-bottom:1px solid var(--line)}
  .ua-contents button{font:inherit;font-size:11px;color:var(--text-2);background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:5px 9px;cursor:pointer}
  .ua-contents button:hover{color:var(--accent);border-color:#b6ccff;background:var(--accent-soft)}
  .ua-report-body{line-height:1.9;color:var(--text-2);overflow-wrap:anywhere}
  .ua-report-body h3{font-size:16px;color:var(--text);font-weight:650;margin:28px 0 12px;scroll-margin-top:20px}
  .ua-report-body h3:focus{outline:none}
  .ua-report-body p{margin:12px 0}
  .ua-report-body ul,.ua-report-body ol{padding-left:22px;margin:14px 0}
  .ua-report-body li{padding-left:3px;margin:8px 0}
  .ua-report-body code{padding:3px 6px;background:var(--bg);border:1px solid var(--line);border-radius:4px;font-size:12px;color:var(--text);white-space:normal}
  .ua-table-wrap{overflow-x:auto;margin:14px 0 18px;border:1px solid var(--line);border-radius:8px}
  .ua-report-body table{border-collapse:collapse;width:100%;font-size:12px;color:var(--text);font-variant-numeric:tabular-nums}
  .ua-report-body th,.ua-report-body td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
  .ua-report-body th{background:var(--bg);font-weight:600;color:var(--text-2)}
  .ua-report-body tbody tr:last-child td{border-bottom:0}
  .ua-report-body tbody tr:hover{background:#fafbfe}
  @media(max-width:900px){.ua-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}
  @media(max-width:640px){.ua-charts{grid-template-columns:1fr}.ua-report{padding:16px}.ua-heading h2{font-size:20px}.ua-metric>strong{font-size:24px}.ua-metrics{gap:8px}.ua-metric{padding:12px}.tab{padding:8px 12px}}


  .ua-query{margin-bottom:18px}
  .ua-query-fields{display:flex;gap:14px;align-items:end;flex-wrap:wrap}
  .ua-query-fields .field{margin:0;flex:1 1 180px}
  .ua-query-fields input,.ua-connection input{width:100%;padding:9px 11px;border:1px solid var(--line-strong);border-radius:8px;font:inherit;background:#fff;color:var(--text);min-width:0}
  .ua-query-fields>button{padding:10px 18px;font-size:13px;min-height:39px}
  .ua-connection{margin-top:17px;padding-top:14px;border-top:1px solid var(--line)}
  .ua-connection summary{cursor:pointer;font-size:12px;color:var(--text-2)}
  .ua-connection>p{font-size:12px;color:var(--text-2);margin:12px 0}
  .ua-connection-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .ua-connection-fields .field{margin:0;min-width:0}
  .ua-status{font-size:12px;color:var(--text-2);margin-top:15px;line-height:1.8;overflow-wrap:anywhere}
  .ua-status.ua-error{color:var(--red)}
  .ua-empty{padding:45px 22px;text-align:center;color:var(--text-2)}
  .ua-empty[hidden]{display:none}
  .ua-empty strong{font-size:15px;color:var(--text)}
  .ua-empty p{font-size:12px;line-height:1.9;max-width:580px;margin:10px auto 0}
  .ua-actions button{padding:8px 12px;font-size:12px}
  .ua-hour-row{grid-template-columns:40px minmax(24px,1fr) 75px 55px}
  .ua-report-body td:first-child,.ua-report-body th:first-child{white-space:normal;min-width:130px;max-width:480px;overflow-wrap:anywhere}
  .ua-heading p{overflow-wrap:anywhere}
  @media(max-width:640px){.ua-connection-fields{grid-template-columns:1fr}.ua-query-fields>button{width:100%}}
  /* 用户管理 */
  #panel-account{font-size:13px}
  #panel-account [hidden]{display:none!important}
  .um-login{max-width:570px;margin:24px auto;padding:28px}
  .um-login>p,.um-muted{color:var(--text-2);line-height:1.8}
  .um-login .field{margin-top:18px}
  #panel-account input:not([type=checkbox]),#panel-account select,#panel-account textarea{width:100%;min-width:0;border:1px solid var(--line-strong);border-radius:8px;padding:10px 12px;font:inherit;background:#fff;color:var(--text);box-sizing:border-box}
  #panel-account textarea{resize:vertical;min-height:68px}
  #panel-account button{font:inherit;cursor:pointer;padding:9px 13px;border-radius:8px;border:1px solid var(--line-strong);background:#fff;color:var(--text)}
  #panel-account button.primary{background:var(--accent);border-color:var(--accent);color:#fff}
  #panel-account button.danger{color:var(--red)}
  #panel-account button:disabled{cursor:default;opacity:.5}
  .um-login button[type=submit]{width:100%;margin-top:20px}
  .um-top,.um-section-head,.um-pager{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
  .um-top{margin-bottom:18px}.um-top h2{font-size:21px;margin:0 0 6px}
  .um-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
  .um-section{margin-top:18px;padding:22px;min-width:0}
  .um-section h2{margin:0;font-size:16px}
  .um-subscriptions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:16px}
  .um-sub{padding:16px;border:1px solid var(--line);border-radius:10px;overflow-wrap:anywhere}
  .um-sub-head{display:flex;justify-content:space-between;gap:12px;margin-bottom:12px}
  .um-badge{font-size:11px;color:var(--accent);white-space:nowrap}.um-badge.inactive{color:var(--text-3)}
  .um-progress{height:8px;border-radius:4px;background:var(--bg);overflow:hidden;margin:10px 0}
  .um-progress>i{display:block;height:100%;background:#7196ff;border-radius:4px}
  .um-sub p{margin:5px 0;color:var(--text-2);font-size:12px}
  .um-redeem{display:flex;gap:10px;margin-top:16px}.um-redeem input{flex:1}.um-redeem button{flex-shrink:0}
  .um-table{width:100%;border-collapse:collapse;font-size:12px;font-variant-numeric:tabular-nums}
  .um-table th,.um-table td{padding:12px 10px;text-align:left;border-bottom:1px solid var(--line);white-space:nowrap}
  .um-table th{color:var(--text-2);background:var(--bg);font-weight:500}
  .um-table td:first-child{white-space:normal;min-width:120px;max-width:220px;overflow-wrap:anywhere}
  .um-table code{font-size:11px}.um-table button{padding:5px 8px!important;font-size:12px!important}
  .um-pager{font-size:12px;color:var(--text-2);margin-top:12px}
  .um-editor{border:1px solid #b6ccff;background:#fafcff;padding:18px;border-radius:10px;margin-top:16px}
  .um-editor h3{margin:0 0 16px}.um-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
  .um-form-grid .field{margin:0;min-width:0}.um-editor details{margin-top:18px}.um-editor details>div{margin-top:14px}
  .um-check{display:flex;align-items:center;gap:7px;font-size:12px;margin:10px 0}.um-check input{width:auto}
  .um-key-value{display:flex;gap:8px;align-items:center;margin-top:15px;padding:12px;background:var(--bg);border-radius:8px}
  .um-key-value code{flex:1;min-width:0;overflow-wrap:anywhere;user-select:all}
  .um-inline-status{font-size:12px;line-height:1.8;color:var(--text-2);overflow-wrap:anywhere;margin-top:10px}
  .um-inline-status.error{color:var(--red)}
  .um-day{width:155px!important}.um-empty{padding:24px;text-align:center;color:var(--text-2)}
  #accountMetrics .ua-metric>strong{font-size:24px;overflow-wrap:anywhere}
  @media(max-width:640px){.um-subscriptions,.um-form-grid{grid-template-columns:1fr}.um-login{padding:20px;margin:10px 0}.um-section{padding:15px}.um-redeem{flex-wrap:wrap}.um-redeem button{width:100%}}

#panel-account{display:block}.ua-metric>strong{white-space:normal}.um-section{background:transparent;border:0;border-top:1px solid var(--line-strong);border-radius:0;box-shadow:none;padding:24px 0 10px}.um-sub{background:#fff;border-radius:8px}.um-editor{border-radius:8px}#loginChallenge{margin-top:18px}.um-login>h2{font-size:20px;color:var(--text)}.um-badge{color:#087b53}#panel-account *{letter-spacing:0}

  .um-tabs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;border-bottom:1px solid var(--line-strong);margin-top:24px}
  #panel-account .um-tabs button{min-width:0;min-height:46px;padding:12px 8px;border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;white-space:nowrap;font-weight:600}
  #panel-account .um-tabs button[aria-selected="true"]{color:var(--accent);border-bottom-color:var(--accent)}
  #panel-account .um-tabs button:hover{background:#edf2ff}
  #panel-account .um-tabs button:focus-visible,.um-section:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
  #accountDashboard>.um-section{margin-top:0;border-top:0;padding-top:20px}
  .um-subscriptions-toggle{display:block;min-width:200px;min-height:42px;max-width:100%;margin:16px auto 0}
  .um-quota-unlimited{display:flex;align-items:center;min-height:42px;box-sizing:border-box;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:#f5f7fa;color:var(--text-2);font-size:13px}
  .um-table .um-key-value{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));max-width:220px;margin-top:8px;padding:8px;white-space:normal}
  .um-table .um-key-value code{grid-column:1/-1;overflow-wrap:anywhere}
  #accountLogs .um-table th,#accountLogs .um-table td{padding:12px 8px}
  @media(max-width:480px){.um-tabs{grid-template-columns:repeat(2,minmax(0,1fr));gap:4px 0}.um-tabs button{min-height:44px}}

  #portalFeedback[hidden],#portalProgress[hidden]{display:none!important}
  #panel-account button,#askSheet button{position:relative;transition:background-color .15s,border-color .15s,color .15s,box-shadow .15s,transform .12s}
  #panel-account button:not(:disabled):hover{box-shadow:0 0 0 2px #3267ff12}
  #panel-account button:not(:disabled):active,#panel-account button.um-pressed,#askSheet button:not(:disabled):active,#askSheet button.um-pressed{transform:translateY(1px);box-shadow:inset 0 1px 3px #17203324}
  #panel-account button:focus-visible,#askSheet button:focus-visible,#accountTokenAdvanced summary:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
  #panel-account button.um-button-loading{opacity:1;cursor:wait}
  .um-button-caption{display:inline-block}
  .um-button-loading>.um-button-caption{visibility:hidden}
  .um-button-progress{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:8px;white-space:nowrap;font:inherit;pointer-events:none}
  .um-spinner,.um-inline-status[data-state="loading"]:before{display:inline-block;width:14px;height:14px;box-sizing:border-box;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:um-spin .8s linear infinite;flex-shrink:0}
  .um-inline-status[data-state="loading"]:before{content:"";width:12px;height:12px;margin-right:7px;vertical-align:-2px}
  .um-inline-status[data-state="success"]{color:#087b53}
  #panel-account input[type="checkbox"]{accent-color:var(--accent)}
  #accountTokenAdvanced summary{cursor:pointer;padding:4px 0;transition:color .15s}
  #accountTokenAdvanced summary:hover{color:var(--accent)}
  .um-enter{animation:um-enter .16s ease-out}
  .um-request-progress{position:fixed;z-index:100;top:0;left:0;right:0;height:3px;overflow:hidden;background:#dce6ff;pointer-events:none}
  .um-request-progress:after{content:"";display:block;width:35%;height:100%;background:var(--accent);animation:um-travel 1.2s ease-in-out infinite}
  .um-feedback{position:fixed;z-index:80;right:24px;bottom:24px;display:flex;align-items:center;gap:12px;width:max-content;max-width:min(440px,calc(100vw - 32px));box-sizing:border-box;padding:14px 18px;border:1px solid #b9ccff;border-radius:8px;background:#fff;box-shadow:0 5px 24px #17203318;color:var(--text);font-size:13px;line-height:1.6;animation:um-enter .16s ease-out;pointer-events:none}
  .um-feedback>div{min-width:0;overflow-wrap:anywhere}
  .um-feedback strong{font-size:13px;font-weight:600}
  .um-feedback p{margin:3px 0 0;font-size:12px;color:var(--text-2)}
  .um-feedback-icon{display:flex;align-items:center;justify-content:center;flex:0 0 20px;height:20px;color:var(--accent)}
  .um-feedback[data-state="loading"] .um-feedback-icon:before{content:"";width:17px;height:17px;box-sizing:border-box;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:um-spin .8s linear infinite}
  .um-feedback[data-state="success"]{border-color:#a5d8be}
  .um-feedback[data-state="success"] .um-feedback-icon{color:#087b53}
  .um-feedback[data-state="success"] .um-feedback-icon:before{content:"✓";font-size:20px}
  .um-feedback[data-state="error"]{border-color:#f1b3b9}
  .um-feedback[data-state="error"] .um-feedback-icon{color:var(--red)}
  .um-feedback[data-state="error"] .um-feedback-icon:before{content:"!";font-size:18px;font-weight:700}
  .um-feedback[data-state="info"] .um-feedback-icon:before{content:"i";font-size:18px;font-weight:700}
  .toast{top:20px;bottom:auto;max-width:calc(100vw - 32px);white-space:normal;box-sizing:border-box;overflow-wrap:anywhere}
  @keyframes um-spin{to{transform:rotate(360deg)}}
  @keyframes um-travel{from{transform:translateX(-100%)}to{transform:translateX(386%)}}
  @keyframes um-enter{from{opacity:.55}to{opacity:1}}
  @media(max-width:640px){.um-feedback{left:16px;right:16px;bottom:max(16px,env(safe-area-inset-bottom));width:auto;padding:12px 14px}.toast{top:12px}}
  @media(prefers-reduced-motion:reduce){#panel-account button,#askSheet button{transition:none}.um-enter,.um-feedback,.um-spinner,.um-inline-status[data-state="loading"]:before,.um-feedback[data-state="loading"] .um-feedback-icon:before,.um-request-progress:after{animation:none}.um-request-progress:after{width:100%;opacity:.55}}
