  /* ---------- v71/v79：右侧图层面板（仿 PS）—— v79 起 = 独立矩形窗口（上下留白相等） ---------- */
  .layers{
    position:fixed;top:120px;right:0;bottom:120px;width:280px;z-index:31;
    background:rgba(255,255,255,.97);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
    border-left:1px solid var(--line);border-radius:14px 0 0 14px;
    box-shadow:-14px 0 34px rgba(20,22,35,.09);
    display:flex;flex-direction:column;transition:transform .2s;
  }
  .layers.collapsed{transform:translateX(100%)}
  .layers[hidden]{display:none}   /* v268：图层面板只在地图绘制页露出（工作流页 hidden 退役） */
  /* 收纳拉手：钉在面板左缘外侧、**垂直居中** —— 展开收起都在画布右侧中间（v79） */
  /* v113：拉手加高（36 → 68px）+ 箭头字形加大居中；left/top/width 不动 = 位置不变 */
  .layers-tab{
    position:absolute;left:-26px;top:50%;transform:translateY(-50%);width:26px;height:68px;
    border:1px solid var(--line);border-right:none;border-radius:9px 0 0 9px;
    background:#fff;color:var(--text-2);font:inherit;font-size:17px;font-weight:700;cursor:pointer;
    display:grid;place-items:center;padding:0;line-height:1;
    box-shadow:-6px 0 16px rgba(20,22,35,.10);transition:color .15s;
  }
  .layers-tab:hover{color:var(--accent);border-color:var(--accent)}
  /* v81：账号设置小菜单（⚙ 弹出，仅「退出登录」；点窗外才关） */
  .acct-menu{
    position:fixed;top:64px;right:14px;z-index:34;min-width:216px;padding:10px;   /* v350：加头部块 ⇒ 加宽 + 内边距 */
    background:rgba(255,255,255,.97);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
    border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 30px rgba(20,22,35,.14);
  }
  .acct-menu[hidden]{display:none}
  .acct-menu .link-btn{width:100%;text-align:center;padding:6px 10px}
  /* v350：菜单头部 = 头像 + 账号名（草图：最上面一整块，区别于下面的功能行）；
     主题色 / 退出登录前加 accent 图标（草图：蓝 = 图标）。颜色全走 var() —— 两套主题自动成立。 */
  .am-head350{display:flex;align-items:center;gap:10px;padding:8px 8px 12px;margin:0 0 8px;border-bottom:1px solid var(--line)}
  .am-ava350{width:34px;height:34px;flex:0 0 34px;display:grid;place-items:center;border-radius:50%;background:var(--accent-soft);color:var(--accent);font-size:15px;font-weight:700;line-height:1}
  .am-name350{font-size:13px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .am-ico350{width:15px;height:15px;flex:0 0 15px;color:var(--accent)}
  .am-ico350 svg{display:block;width:100%;height:100%}
  .am-out350{display:flex;align-items:center;justify-content:flex-start;gap:7px;padding:8px 10px}
  /* v370：快捷键窗口（设置菜单里的「快捷键」按钮点开）——
     v366 的菜单内嵌说明区整块退役；窗口正文 = 分组小标题 + 行（左说明 / 右键帽）。
     全走 token（--line-strong / --sunken / --card / --accent），亮暗两套自动成立。
     v371：**必须连写 `.modal.keys-win370`（0,2,0）** —— 单类写法与 `.modal` 同权重且定义更靠前，
     `width` 与 `max-width:none` 会被 `.modal`（width:100% / max-width:400px）整条压掉（窗口变 400px 窄条）。 */
  .modal.keys-win370{width:min(620px,94vw);max-width:none}
  .keys-body370{margin-top:10px;display:flex;flex-direction:column}
  .keys-g370{margin:12px 0 4px;font-size:11.5px;font-weight:600;letter-spacing:.03em;color:var(--text-3)}
  .keys-body370 .keys-g370:first-child{margin-top:0}
  .keys-r370{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:7px 9px;border-radius:9px;font-size:13px;line-height:1.45;color:var(--text)}
  .keys-r370:hover{background:var(--sunken)}
  .keys-k370{display:flex;align-items:center;gap:4px;flex:0 0 auto}
  .keys-key370{
    min-width:22px;height:22px;padding:0 7px;display:inline-grid;place-items:center;
    font-size:11.5px;font-weight:600;line-height:1;border:1px solid var(--line-strong);
    border-radius:6px;background:var(--card);color:var(--accent);
  }
  /* v351：角色子画布（三类产物）—— 颜色全走 var()，两套主题自动成立 */
  /* v368：窗口按 **16 : 9** 定尺寸（用户口径「子画布尺寸为 16:9」）。
     ⚠️ 选择器必须连写 `.modal.entc-win351`（0,2,0）：`.modal` 在本样式表里**更靠后**且同为单类，
        老写法 `.entc-win351` 的 width / max-height 全被它压掉，连 `.modal` 的 max-width:400px
        也一并生效 ⇒ 实际渲染成 400px 宽的窄条（16:9 根本立不起来）。
     宽度同时受 vw 与 vh 两向夹取（(可用窗高 − 标题栏等文字高度) × 16/9 + 左右内边距）⇒ 整窗 16:9 且永不出屏。
     v393：去掉 1060px 固定上限 —— 放大到视口容得下的最大 16:9（用户红框口径）。 */
  .modal.entc-win351{width:min(94vw,calc((92vh - 104px) * 16 / 9 + 44px));max-width:none;max-height:92vh;overflow:auto}
  /* v356：子画布改迷你节点画布 —— body = 画布容器（overflow hidden），canvas 铺满；
     交互与工作流画布同一套：节点拖拽 / 背景平移 / 滚轮缩放
     v368：画布区**恒 16:9**（aspect-ratio，宽度撑满窗口内宽）+ 底色 var(--canvas)
     （与工作流画布 .canvas-wrap 同款；点阵由 entSubDots356 画进 canvas 本身） */
  .entc-body351{margin-top:10px;position:relative;width:100%;aspect-ratio:16/9;border:1px solid var(--line);border-radius:12px;overflow:hidden;background-color:var(--canvas)}
  .entc-body351 canvas{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none;cursor:grab}
  /* v317：版本新鲜度胶囊 —— 顶部居中、顶栏正下方；只在「跑的是旧 build」时出现。
     z 88 = 高于所有页面层（#homeView 60 / .ai-page285 48 / #mapOverlay 80），
     低于 #askOverlay 90 与 #authModal 95。颜色全走 var() → 深浅两套自动成立。 */
  .ver-new317{
    position:fixed;top:62px;left:50%;transform:translateX(-50%);z-index:88;
    appearance:none;border:1px solid var(--accent);background:var(--accent-soft);color:var(--accent);
    font:inherit;font-size:12px;font-weight:600;padding:6px 14px;border-radius:999px;cursor:pointer;
    box-shadow:var(--shadow);
  }
  .ver-new317:hover{filter:brightness(1.04)}
  .ver-new317[hidden]{display:none}
  /* v313：⚙ 菜单里的「主题色」—— 亮色 / 暗色两选一（当前项高亮；无记录 = 默认暗色）。
     顶栏菜单（#acctMenu）与主页菜单（#homeMenu204）共用同一套类名 + 同一个事件委托 + 同一个同步函数；
     以后再加菜单，只要放一份 .at-opt313 就会自动跟上。颜色全走 var() —— 两套主题自动成立。 */
  .at-row313{display:flex;align-items:center;gap:8px;margin:2px 0 8px;padding:0 3px}   /* v350：一行 = 图标 + 标签 左，亮 / 暗 右 */
  .at-lab313{display:flex;align-items:center;gap:6px;flex:1 1 auto;font-size:12px;line-height:1;color:var(--text-2);margin:0;padding:0;text-align:left}
  .at-row313 .at-opt313{flex:0 0 auto;padding:6px 12px}   /* v350：行内定宽（原 flex:1 1 0 在 flex 行里会把宽度挤没） */
  /* v315：全站选项类按钮统一 —— 与视频生成（.spec-opt249）同款三态：
     未选 = line 描边 + card 底 + 正常字色；悬停 = 描边/字色转 accent；已选 = accent 描边 + accent-soft 底 + accent 字色。 */
  .at-pick313{display:flex;gap:6px}
  .at-opt313{
    flex:1 1 0;appearance:none;border:1px solid var(--line);background:var(--card);color:var(--text);
    font:500 12.5px/1 var(--sans);padding:8px 0;border-radius:10px;cursor:pointer;transition:.15s;
  }
  .at-opt313:hover{border-color:var(--accent);color:var(--accent)}
  .at-opt313.on{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}
  html[data-theme="dark"] .at-opt313{background:#232631;border-color:transparent;color:#e8eaf1}
  html[data-theme="dark"] .at-opt313:hover{background:#262a35;color:var(--accent)}
  html[data-theme="dark"] .at-opt313.on{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}
  .layers-head{display:flex;align-items:center;gap:7px;padding:10px 12px;border-bottom:1px solid var(--line)}
  .layers-head strong{font-size:12.5px}
  .layers-count{font-size:11px;color:var(--text-3)}
  .layers-list{flex:1;min-height:0;overflow:auto;padding:6px}
  .layers-empty{font-size:11px;color:var(--text-3);padding:10px 8px;line-height:1.6}
  /* v151：条目 = 名称 + 实际像素尺寸（v148 加的那张缩略图撤掉了 ——
     用户口径「图层里面不需要显示缩略图」，要看的是**画布上**那个框的显示尺寸）。
     名称与尺寸仍是两个独立字段、并排左对齐（尺寸不被 flex:1 顶到行尾）。 */
  .layer{
    display:flex;align-items:center;gap:9px;padding:7px 8px;margin-bottom:2px;
    border-radius:9px;border:1px solid transparent;cursor:pointer;user-select:none;position:relative;
  }
  .layer:hover{background:#f5f6fa}
  .layer.on{background:var(--accent-soft);border-color:var(--accent-2)}
  .layer .lrow{flex:1;min-width:0;display:flex;align-items:baseline;gap:8px;overflow:hidden}
  .layer .lname{flex:0 1 auto;min-width:0;font-size:12px;font-weight:600;color:var(--text);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .layer .lmeta{font-size:10.5px;color:var(--text-3);flex:0 0 auto;font-variant-numeric:tabular-nums}
  /* 改名时让名称那一格吃满剩余宽度（输入框才够长）；改完失焦自动收回 */
  .layer .lname:focus-within{flex:1 1 0%;overflow:visible}
  .layer .lname input{width:100%;box-sizing:border-box}
  /* v100：地图图层行的小叉（悬浮 / 选中时出现），工作流行不带 */
  .layer .layer-x{
    flex:0 0 auto;width:18px;height:18px;border:none;border-radius:6px;background:transparent;
    color:var(--text-3);font:inherit;font-size:12px;line-height:1;cursor:pointer;padding:0;
    display:none;place-items:center;
  }
  .layer:hover .layer-x,.layer.on .layer-x{display:grid}
  .layer .layer-x:hover{background:#fde8e8;color:#d33}
  .layer input{
    flex:1;min-width:0;font:inherit;font-size:12px;font-weight:600;color:var(--text);
    padding:3px 6px;border:1px solid var(--accent);border-radius:6px;outline:none;background:#fff;
  }
  /* 画布里的改名输入框：盖在节点标题栏上，字号跟标题栏一起缩放 */
  .head-rename{
    position:absolute;z-index:45;font-family:inherit;font-weight:700;color:var(--text);
    border:2px solid var(--accent);border-radius:7px;background:#fff;padding:0 6px;
    outline:none;box-shadow:0 6px 18px rgba(20,22,35,.22);
  }

  /* ---------- 开关 / 复选 ---------- */
  .switch{display:flex;align-items:center;gap:10px;cursor:pointer;user-select:none;position:relative}
  .switch input{position:absolute;opacity:0;width:0;height:0}
  .switch .track{
    width:38px;height:22px;border-radius:20px;background:#d8dbe4;position:relative;
    transition:.2s;flex:0 0 38px;
  }
  .switch .track::after{
    content:"";position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;
    background:#fff;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.22);
  }
  .switch input:checked + .track{background:#fff}
  .switch input:checked + .track::after{transform:translateX(16px)}
  .switch em{font-style:normal;font-size:12.5px;color:var(--text);font-weight:600;line-height:1.45}



  /* ---------- 参数 ---------- */
  /* 迭代 48：抠图这一段不再折叠 —— 内容常驻可见（v387：它就是像素卡两列栅格里的一格） */
  .note{margin:10px 0 0;font-size:11.5px;color:var(--text-3);line-height:1.7}
  .note.warn{color:#b45309;background:#fffbeb;border:1px solid #fde68a;border-radius:9px;padding:8px 10px}
  .note.ok{color:#0f766e;background:#f0fdfa;border:1px solid #99f6e4;border-radius:9px;padding:8px 10px}
  .note b{color:inherit;font-weight:600}

  /* ---------- 切片结果（面板底部） ---------- */
  .dock{display:flex;flex-direction:column;max-height:214px}
  .dock[hidden]{display:none}
  .dock-head{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:9px}
  .dock-head .count{font-size:12px;font-weight:600;color:var(--text)}
  .dock-head .dock-tip{font-size:10.5px;color:var(--text-3)}
  .dock-head .spacer{flex:1}
  /* 迭代 21：全选/反选 + 打包 ZIP 从"图片下面那个小窗"搬进来，跟缩略图同一栏 */
  .dock-foot{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:9px}
  .dock-foot .spacer{flex:1}
  .slice-grid{
    display:flex;flex-wrap:wrap;gap:8px;overflow-y:auto;overflow-x:hidden;padding:2px;
  }
  .slice-item{
    flex:0 0 92px;width:92px;border:1px solid var(--line);border-radius:10px;padding:6px;background:#fff;position:relative;
    transition:.15s;
  }
  .slice-item:hover{border-color:var(--accent);box-shadow:0 4px 14px rgba(20,214,255,.13)}
  .slice-item.off{opacity:.4}
  .slice-item.active{border-color:#f59e0b;box-shadow:0 0 0 2px #fde9c8}
  .slice-thumb{
    height:58px;border-radius:7px;display:grid;place-items:center;overflow:hidden;
  }
  .slice-thumb img{max-width:100%;max-height:100%;display:block;image-rendering:pixelated}
  .slice-meta{
    display:flex;align-items:center;justify-content:space-between;gap:4px;margin-top:7px;
    font-size:10.5px;color:var(--text-3);
  }
  .slice-idx{
    position:absolute;top:6px;left:6px;background:rgba(26,29,38,.78);color:#fff;
    font-size:10px;font-weight:700;border-radius:6px;padding:1px 6px;line-height:1.5;
  }
  .slice-ck{position:absolute;top:6px;right:6px;width:15px;height:15px;cursor:pointer;accent-color:var(--accent);margin:0}
  .mini-btn{
    font:inherit;font-size:11px;padding:4px 9px;border-radius:7px;border:1px solid var(--line);
    background:#fafbfd;color:var(--text-2);cursor:pointer;transition:.15s;white-space:nowrap;
  }
  .mini-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
  .busy{
    display:flex;align-items:center;gap:8px;font-size:12px;color:var(--accent);
    padding:10px 0;justify-content:center;
  }



  /* ---------- 账号 ---------- */
  .acct-name{font-size:12.5px;color:var(--text-2);max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

  /* ---------- 弹窗 ---------- */
  .overlay{
    position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:80;padding:18px;
    display:flex;align-items:center;justify-content:center;
  }
  .overlay[hidden]{display:none}
  #authModal{z-index:95}
  .modal{
    background:#fff;border-radius:16px;width:100%;max-width:400px;padding:22px;
    box-shadow:0 24px 60px rgba(0,0,0,.3);max-height:92vh;overflow:auto;
  }
  .modal h3{margin:0 0 4px;font-size:16px}
  .modal .sub{margin:0 0 16px;font-size:12px;color:var(--text-3)}
  .modal-close{
    float:right;border:none;background:transparent;font-size:16px;color:var(--text-3);
    cursor:pointer;line-height:1;padding:2px 4px;
  }
  /* v315：与视频生成选项按钮同款三态（原灰底分段控件退役） */
  .tabs{display:flex;gap:6px;margin-bottom:16px}
  .tabs button{
    flex:1;border:1px solid var(--line);background:var(--card);padding:9px 4px;border-radius:10px;
    font:500 12.5px/1 var(--sans);color:var(--text);cursor:pointer;transition:.15s;
  }
  .tabs button:hover{border-color:var(--accent);color:var(--accent)}
  .tabs button.on{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}
  .fld{margin-bottom:12px}
  .fld label{display:block;font-size:11.5px;color:var(--text-3);margin-bottom:5px}
  .fld input{
    width:100%;padding:10px 11px;border:1px solid var(--line-strong);border-radius:9px;
    font:inherit;font-size:13.5px;color:var(--text);outline:none;transition:.15s;background:#fff;
  }
  .fld input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
  .code-row{display:flex;gap:8px}
  .code-row input{flex:1;min-width:0}
  .code-hint{font-size:11px;color:var(--text-3);margin:7px 0 0;line-height:1.5}
  .msg{font-size:12px;padding:9px 11px;border-radius:9px;margin-bottom:12px;line-height:1.65}
  .msg.err{background:#fef2f2;color:#b91c1c;border:1px solid #fecaca}
  .msg.ok{background:#f0fdfa;color:#0f766e;border:1px solid #99f6e4}
  .msg.info{background:var(--accent-soft);color:var(--accent);border:1px solid var(--accent-2)}
  .link-btn{
    border:none;background:transparent;color:var(--accent);font:inherit;font-size:12px;
    cursor:pointer;padding:4px 0;text-decoration:underline;
  }
  .modal-foot{margin-top:14px;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap}

  @media (max-width:640px){
    .sheet{max-height:calc(100vh - 108px)}
    .sheet-cols{gap:10px}
    .sheet-body{padding:10px 12px 12px}
    .sheet-foot{padding:9px 12px 11px}
    .dock-foot{gap:6px}
  }
