/* DSM 管理后台 / 我的空间业务样式。
 *
 * 分层（2026-10-23 起，见 docs/ref/UI-DESIGN.md）：
 *   design-tokens.css  上游 DSH 设计变量（生成文件，勿手改）
 *   dsm-ui.css         按钮/输入/表格/卡片/徽章/提示条等组件层
 *   admin.css（本文件）只放业务布局与页面专属结构，不再复制 token 与控件外观。
 */

.panel, .dir-tree, #skill-installed, #skill-candidates, #mcp-list, #tier-list,
#defaults-skill-defaults, #defaults-skill-candidates, #defaults-mcp-defaults,
#defaults-mcp-candidates, #defaults-plugin-defaults, #defaults-plugin-candidates,
#defaults-plugin-builtin, #defaults-model-defaults, #defaults-model-catalog,
#defaults-package-defaults, #defaults-package-candidates,
#my-packages-pushed, #my-packages-local,
#model-providers, #model-defaults {
  overflow: hidden;
  margin: 0 0 16px;
  border: 1px solid var(--dsw-alias-border-l3);
  border-radius: 12px;
  background: var(--dsw-alias-bg-module-platform);
}
/* 可折叠面板（details.panel）统一外观：内边距 + 折叠指示。
   历史：只有 .create-panel 带 padding，导致 JS 生成的（内置提供方/默认模型）
   与新加的面板内容贴边，故下沉到 details.panel 这一层统一。 */
details.panel { display: grid; gap: 10px; padding: 12px 14px; }
details.panel > summary {
  cursor: pointer;
  list-style: none;
  display: grid;
  gap: 4px;
}
details.panel > summary::-webkit-details-marker { display: none; }
details.panel > summary::after {
  content: "展开";
  color: var(--dsw-alias-label-secondary);
  font-size: 13px;
}
details.panel[open] > summary::after { content: "收起"; }
/* 面板内首个子元素的标题不再额外撑高（如用量页的 details 直接以 summary 开头） */
details.panel > summary ~ h3:first-of-type { margin-top: 0; }
.create-copy p { margin: 0; }
.create-copy h2 { margin: 0; }
#create-user-form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: end;
  gap: 12px 16px;
}
#create-user-form .span-2 { grid-column: 1 / -1; }
#create-user-form > button,
#defaults-add-provider > button,
#defaults-add-package > button {
  justify-self: start;
  width: auto;
}
#create-user-form .check-row,
.dsm-options .check-row {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 8px;
  color: var(--dsw-alias-label-primary);
}
.actions, .skill-actions, .cap-row-actions, .share-row-actions, .provider-card-actions {
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
}
.section-head { margin-bottom: 10px; }
.section-head h2 { margin: 0 0 2px; }
.section-head p { margin: 0; }
.manage-bar { display: flex; align-items: end; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
.manage-bar h2 { margin: 0; }
.btn-chip-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin: 0 0 12px;
}
.push-kind-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; margin: 8px 0 14px; }
.dir-tree { max-height: min(480px, 52vh); overflow: auto; padding: 8px; }
.dir-node { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px; }
.dir-node.child { padding-left: 28px; }
.dir-node:hover { background: var(--dsw-alias-interactive-bg-hover); }
.dir-node label {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 8px;
  color: var(--dsw-alias-label-primary);
  font-size: 14px;
}
.provider-card {
  border: 1px solid var(--dsw-alias-border-l2);
  border-radius: 12px;
  padding: 12px 14px;
  margin-bottom: 8px;
  background: var(--dsw-alias-bg-layer-2);
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.provider-card > summary {
  list-style: none;
  cursor: pointer;
}
.provider-card > summary::-webkit-details-marker { display: none; }
.provider-card-head {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}
.provider-card-identity {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
}
.provider-card-title {
  font-size: 14px;
  line-height: 22px;
  font-weight: 500;
  color: var(--dsw-alias-label-primary);
}
.provider-card-tag {
  flex: none;
  padding: 1px 6px;
  border: 1px solid var(--dsw-alias-border-l3);
  border-radius: 4px;
  font-size: 11px;
  line-height: 16px;
  color: var(--dsw-alias-label-secondary);
}
.provider-card-meta {
  font-size: 12px;
  line-height: 18px;
  color: var(--dsw-alias-label-tertiary);
  white-space: nowrap;
}
.provider-card-actions {
  margin-left: auto;
}
.provider-card-status {
  box-sizing: border-box;
  display: inline-block;
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--dsw-alias-state-error-primary);
}
.provider-card-status.on {
  background: var(--dsw-alias-state-success-primary);
}
.provider-key-status {
  margin-left: 8px;
  font-size: 12px;
  line-height: 18px;
  color: var(--dsw-alias-state-success-primary);
}
.provider-card-body {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.provider-model {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 0;
  border-top: 1px solid var(--dsw-alias-border-l2);
  font-size: 13px;
}
.provider-model-list {
  display: flex;
  flex-direction: column;
  padding: 2px 12px;
  border: 1px solid var(--dsw-alias-border-l2);
  border-radius: 10px;
  background: var(--dsw-alias-bg-layer-2);
}
.provider-model-list .provider-model:first-child { border-top: none; }
/* 行内右侧说明（如模型协议）不抢主标题视觉 */
.provider-model .provider-model-meta {
  color: var(--dsw-alias-label-tertiary);
  font-size: 12px;
  white-space: nowrap;
}
/* zen 同步策略的三个字段：固定栅格，避免 manage-bar 的 end 对齐把
   无 label 的元素错位；窄屏自动换行 */
.zen-field-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 220px));
  gap: 12px 18px;
  margin: 4px 0 2px;
}
.zen-field-grid label { display: grid; gap: 6px; }
.zen-field-grid input, .zen-field-grid select { width: 100%; min-width: 0; }
.provider-add-model {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: end;
  margin-top: 4px;
}
.provider-add-model input { min-width: 120px; }
.pkg-cat {
  margin: 0;
  padding: 10px 12px 4px;
  color: var(--dsw-alias-label-tertiary);
  font-size: 12px;
  font-weight: 500;
}
.pkg-row-main { min-width: 0; flex: 1; }
.pkg-row-name { display: flex; align-items: center; gap: 8px; }
.pkg-row-desc {
  margin-top: 2px;
  color: var(--dsw-alias-label-tertiary);
  font-size: 12px;
  line-height: 18px;
  white-space: normal;
}
.skill-row, .mcp-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 12px;
  border-bottom: 1px solid var(--dsw-alias-border-l2);
  gap: 10px;
  min-width: 0;
}
.skill-row > :first-child,
.mcp-row > :first-child {
  min-width: 0;
  flex: 1;
  overflow: hidden;
}
.skill-row > :first-child {
  white-space: nowrap;
  text-overflow: ellipsis;
}
.skill-row > button {
  flex-shrink: 0;
}
.share-row {
  align-items: flex-start;
}
.share-row > :first-child,
.mcp-row > .pkg-row-main {
  white-space: normal;
  overflow: visible;
  text-overflow: unset;
}
.share-row-main {
  min-width: 0;
  flex: 1;
}
.share-row-path {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}
.share-row-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.share-row-meta {
  margin-top: 4px;
  padding-left: 2px;
  color: var(--dsw-alias-label-tertiary);
  font-size: 12px;
  line-height: 18px;
}
.share-row-actions { gap: 8px; }
/* 「共享给用户」多选：入口按钮点开才出现的浮层面板（默认隐藏，窄屏不超宽）。 */
/* 多选面板：行内展开、占满整行（把下面的内容推开）。
   2026-10-23 用户报「选择用户被下边线挡住」—— 原来是绝对定位浮层，卡片底边与
   .dsm-options 滚动容器会把它裁掉，只留一条边；行内展开不再有裁剪问题。 */
.share-user-picker .share-user-panel {
  flex-basis: 100%;
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 10px;
  background: var(--dsw-alias-bg-layer-1, #fafbfc);
  border: 1px solid var(--dsw-alias-border-l2, #d9dde3);
  border-radius: 10px;
}
.share-user-panel[hidden] { display: none; }
.share-user-panel-row { display: flex; align-items: center; gap: 10px; }
.share-user-panel-row input:not([type=checkbox]) { flex: 1; min-width: 0; }
.share-user-panel-row label {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 13px;
  white-space: nowrap;
}
.share-user-options {
  display: flex;
  flex-direction: column;
  gap: 2px;
  max-height: 240px;
  overflow-y: auto;
}
.share-user-options label {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 6px;
  border-radius: 6px;
  font-size: 13px;
  min-width: 0;
  /* 列表 30+ 项时 flex 列会把每行压到 7px、文字互相裁切：行高必须不参与收缩。 */
  flex: 0 0 auto;
  overflow: hidden;
  white-space: nowrap;
}
/* 勾选框不能被 nowrap 文本挤成 1–2px 的竖条（min-width:0 是全局 checkbox 规则）。 */
.share-user-options label input[type=checkbox] {
  flex: 0 0 16px;
  min-width: 16px;
}
/* 文本单独成段才能做省略号（flex 容器上的 text-overflow 对文本节点无效）。 */
.share-user-options .share-user-name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* 入口按钮「选择用户 已选 N」两个片段之间要有间距。 */
#share-user-toggle {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
#share-user-count { opacity: .72; }
.share-user-options label[hidden] { display: none; }
.share-user-options label:hover {
  background: var(--dsw-alias-interactive-bg-hover, #f2f4f8);
}
/* 子文件夹共享行：相对根文件夹缩进，视觉上成组。 */
.share-subrow .share-row-path { padding-left: 26px; }
/* 管理权限面板：行内展开、独占一行（把下面的行推开）。
   2026-10-23 用户报「管理权限打开也是被下方挡住了」—— 原来是锚在行内的绝对定位浮层，
   卡片 .skill-group-body 的 overflow:hidden 直接把浮层裁掉；改成行内后不再被裁。 */
.share-row { flex-wrap: wrap; }
.share-manager-panel {
  flex-basis: 100%;
  width: 100%;
  margin-top: 8px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  max-height: 260px;
  overflow-y: auto;
  padding: 10px;
  background: var(--dsw-alias-bg-layer-1, #fafbfc);
  border: 1px solid var(--dsw-alias-border-l2, #d9dde3);
  border-radius: 10px;
}
.share-manager-panel[hidden] { display: none; }
.share-manager-panel label {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 6px;
  border-radius: 6px;
  font-size: 13px;
  flex: 0 0 auto;
  min-width: 0;
  white-space: nowrap;
}
.share-manager-panel label[hidden] { display: none; }
.share-manager-panel label:hover {
  background: var(--dsw-alias-interactive-bg-hover, #f2f4f8);
}
.share-manager-panel input[type=checkbox] {
  flex: 0 0 16px;
  min-width: 16px;
}
.share-manager-name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
.share-manager-hint,
.share-manager-empty {
  margin: 4px 2px 0;
  font-size: 12px;
  line-height: 1.5;
  color: var(--dsw-alias-label-tertiary);
  white-space: normal;
}
/* ── 共享页：三块可折叠模块（用户 2026-10-23 重做 UI）─────────────
   进来先看「我的共享文件夹 / 我接收的分享」；「共享管理」（建文件夹 ·
   选子文件夹 · 授权）是动作区，默认收起。summary 带计数，收起也知道有几项。
   复用 .skill-group 的 details 折叠外观，只调间距与标题字号。 */
.share-module { margin-bottom: 14px; }
.share-module > summary { padding: 0 2px 8px; }
.share-module > summary h3 { font-size: 14px; }
.share-module .section-count { font-weight: 400; }
.share-manage-block { padding: 12px; }
.share-manage-block .manage-bar:last-child { margin-bottom: 0; }
/* 「共享对象」这行没有 label，用同字号占位与上面两行左对齐。 */
.share-bar-label {
  align-self: center;
  font-size: 13px;
  color: var(--dsw-alias-label-secondary);
}
/* 子文件夹逐层下钻：每层一个下拉，横向排列、窄屏换行。 */
.share-subfolder-group { min-width: 0; }
.share-subfolder-levels { display: flex; flex-wrap: wrap; gap: 8px; }
.share-subfolder-levels select { min-width: 130px; max-width: 220px; }
.share-subfolder-new[hidden] { display: none; }
.skill-row:last-child, .mcp-row:last-child { border-bottom: 0; }
/* ── 默认配置：分配式渲染（一个清单 + 每项一个开关）─────────────
   与代码域「能力分配」同形：开 = 属于当前用户组（或基线层）的默认集。
   历史：两栏式（已设默认 / 候选）要先点「取消默认」再点「设为默认」，
   用户 2026-10-16 要求改成分配式（台账 T4-UI）。 */
.cap-row-main {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
  flex: 1;
}
.cap-row-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
  flex: 1;
}
.cap-row-actions { gap: 8px; }
.skill-block { border-bottom: 1px solid var(--dsw-alias-border-l2); }
.skill-block:last-child { border-bottom: 0; }
.skill-block .skill-row { border-bottom: 0; }
.skill-keys {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 0 12px 10px 28px;
}
.skill-key-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}
.skill-key-name {
  font-size: 12px;
  color: var(--dsw-alias-label-secondary);
  min-width: 12em;
}
.skill-key-row input { flex: 1; min-width: 140px; }
.skill-block.collapsible > .skill-row { cursor: pointer; }
.skill-row-main {
  display: flex;
  align-items: center;
  min-width: 0;
  flex: 1;
  overflow: hidden;
}
.skill-caret {
  flex-shrink: 0;
  width: 16px;
  height: 16px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 9px;
  line-height: 1;
  color: var(--dsw-alias-label-tertiary);
  transition: transform .15s ease;
  user-select: none;
}
.skill-block.open .skill-caret { transform: rotate(90deg); }
/* 技能开关（语义与 skill-hub 一致：开=启用，关=移入回收站可恢复） */
.skill-toggle { position: relative; display: inline-flex; align-items: center; cursor: pointer; }
.skill-toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
.skill-toggle-slider {
  position: relative;
  width: 38px;
  height: 20px;
  border-radius: 999px;
  background: #cfd4dc;
  transition: background .15s ease;
}
.skill-toggle-slider::after {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 2px rgba(0, 0, 0, .25);
  transition: transform .15s ease;
}
.skill-toggle input:checked + .skill-toggle-slider { background: #2f6feb; }
.skill-toggle input:checked + .skill-toggle-slider::after { transform: translateX(18px); }
.skill-toggle input:disabled + .skill-toggle-slider { opacity: .5; cursor: not-allowed; }
/* 「我的空间 → 界面」的偏好行：说明在左、开关贴右，窄屏自动换行。 */
.dsm-pref-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 16px 0;
  border-bottom: 0.5px solid var(--dsw-alias-border-l2);
}
.dsm-pref-copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; padding-right: 24px; }
.dsm-pref-copy strong { font-size: 14px; font-weight: 400; line-height: 22px; color: var(--dsw-alias-label-primary); }
.dsm-pref-copy p { margin: 0; font-size: 12px; line-height: 18px; color: var(--dsw-alias-label-tertiary); }
.dsm-pref-row .skill-toggle { flex: none; margin-top: 0; }
.dsm-pref-row input[type="number"] {
  width: 5.5em;
  min-width: 0;
  flex: none;
}
@media (max-width: 560px) {
  .dsm-pref-row { flex-direction: column; }
}
.tag.version { font-variant-numeric: tabular-nums; color: var(--dsw-alias-label-tertiary); }
.skill-block:not(.open) .skill-keys { display: none; }
/* 技能说明（只放 frontmatter 的 description，绝不放 SKILL.md 正文） */
.skill-desc {
  margin: 0;
  padding: 0 12px 10px 28px;
  font-size: 12px;
  line-height: 1.6;
  color: var(--dsw-alias-label-secondary);
  white-space: pre-wrap;
}
/* 说明默认折叠，点行展开才显示（用户 2026-10-14 口径） */
.skill-block:not(.open) .skill-desc { display: none; }
.skill-group { margin: 0 0 16px; }
.skill-group > summary {
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  cursor: pointer;
  user-select: none;
  padding: 2px 0 8px;
}
.skill-group > summary::-webkit-details-marker { display: none; }
.skill-group > summary h3 {
  margin: 0;
  display: flex;
  align-items: center;
  gap: 8px;
}
.skill-group > summary::after {
  content: "展开";
  color: var(--dsw-alias-label-secondary);
  font-size: 13px;
}
.skill-group[open] > summary::after { content: "收起"; }
.skill-group-body {
  overflow: hidden;
  border: 1px solid var(--dsw-alias-border-l3);
  border-radius: 12px;
  background: var(--dsw-alias-bg-module-platform);
}
.skill-group-body > .muted {
  margin: 0;
  padding: 12px;
}
.section-count { color: var(--dsw-alias-label-tertiary); font-size: 13px; font-weight: 500; }
.skill-dropzone {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  margin: 12px;
  padding: 18px 14px;
  border: 1px dashed var(--dsw-alias-border-l3);
  border-radius: 10px;
  background: var(--dsw-alias-bg-layer-1);
  cursor: pointer;
  text-align: center;
  color: var(--dsw-alias-label-secondary);
}
.skill-dropzone:hover,
.skill-dropzone.is-dragover {
  border-color: var(--dsw-alias-button-info-fill);
  background: var(--dsw-alias-interactive-bg-hover);
  color: var(--dsw-alias-label-primary);
}
.skill-dropzone.is-dragover {
  box-shadow: inset 0 0 0 1px var(--dsw-alias-button-info-fill);
}
.skill-dropzone-title { font-size: 13px; }
.skill-dropzone-actions {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-top: 4px;
}
.skill-dropzone input[type="file"] {
  position: absolute;
  width: 1px;
  height: 1px;
  min-width: 0;
  padding: 0;
  border: 0;
  opacity: 0;
  overflow: hidden;
  pointer-events: none;
}
.tag { margin-right: 8px; background: var(--dsw-static-deepseek-50); color: var(--dsw-alias-state-business-primary); white-space: nowrap; }
.tag.on { background: var(--dsw-static-green-100); color: var(--dsw-alias-state-success-primary); }
.tag.off { background: var(--dsw-static-red-100); color: var(--dsw-alias-state-error-primary); }
/* 管理权限（委派管理）徽标：琥珀色，与「授予/共享」的绿色区分开 */
.tag.manager {
  background: rgba(245, 158, 11, .14);
  color: var(--dsw-alias-state-warn-primary, #b45309);
}

/* 更新日志发布表单：字段纵向排列，与既有 .provider-form / .create-panel 同风格 */
.release-form {
  display: grid;
  gap: 10px;
  max-width: 720px;
}
.release-form > label {
  display: grid;
  gap: 4px;
  font-size: 13px;
  color: var(--dsw-alias-label-secondary);
}
.release-form input,
.release-form select,
.release-form textarea {
  padding: 6px 8px;
  border: 1px solid var(--dsw-alias-border-l2);
  border-radius: 6px;
  background: var(--dsw-alias-bg-layer-3);
  color: var(--dsw-alias-label-primary);
  font: inherit;
}
.release-form textarea { resize: vertical; }
.ro-on { background: var(--dsw-static-red-100); color: var(--dsw-alias-state-error-primary); }
body[data-ds-dark-theme] .role,
body[data-ds-dark-theme] .tag {
  background: rgba(103, 158, 254, 0.18);
}
body[data-ds-dark-theme] .status,
body[data-ds-dark-theme] .tag.on {
  background: rgba(34, 197, 94, 0.18);
}
body[data-ds-dark-theme] .status.disabled,
body[data-ds-dark-theme] .tag.off,
body[data-ds-dark-theme] .ro-on {
  background: rgba(239, 68, 68, 0.18);
}
.muted { color: var(--dsw-alias-label-tertiary); font-size: 12px; line-height: 18px; }
.muted:empty { display: none; }
.forward-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
}
.forward-grid table { width: 100%; }
@media (max-width: 900px) {
  .forward-grid { grid-template-columns: 1fr; }
}
.dsm-panel .hide-small { display: none; }
@media (max-width: 680px) {
  #create-user-form { grid-template-columns: 1fr; }
  #create-user-form .span-2 { grid-column: auto; }
  .dsm-options input, .dsm-options select { width: 100%; min-width: 0; }
  .dsm-options th, .dsm-options td { padding: 10px 8px; }
  .preset-row,
  .preset-row.span-2 { display: grid; grid-template-columns: 1fr; }
}

/* 用户备注名称（管理后台用户列表） */
.user-display-name { font-weight: 600; line-height: 1.3; }
.user-login-name { color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 1.3; }
/* 用户列表「授权目录」列：固定 260px + 单行省略号（悬停看完整路径，见 cell.title）。
   历史：整串路径直接写进单元格，把表格撑成无限宽、右侧「技能/MCP」「沙盒」等列被挤出屏
   （用户 2026-10-16 截图 1，台账 T1）。内层块级 span 才是省略号的载体：
   table-layout:auto 下 td 上的 max-width 不生效。 */
.dsm-options td.dirs-cell {
  width: 260px;
  min-width: 260px;
}
.dirs-cell-text {
  display: block;
  max-width: 240px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ── 用户组（tier）配置 ─────────────────────────────────── */
.dsm-tier-bar {
  display: none;
  align-items: center;
  gap: 12px;
  padding: 8px 0 12px;
  border-bottom: 0.5px solid var(--dsw-alias-border-l2);
  background: var(--dsw-alias-bg-layer-2);
  position: sticky;
  top: 0;
  z-index: 2;
}
body.is-defaults .dsm-tier-bar {
  display: flex;
}
.dsm-tier-bar label { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; }
.tier-badge {
  font-size: 12px;
  padding: 1px 8px;
  border: 1px solid var(--dsm-border);
  border-radius: 10px;
  background: #f6f7f9;
  white-space: nowrap;
}
.tier-inline-select { min-width: 96px; font-size: 12px; }
/* 用户页：用户组分组头行（默认折叠，点击展开/收起） */
tr.tier-group td {
  background: var(--dsw-static-neutral-150, rgb(237, 237, 237));
  font-weight: 600;
  cursor: pointer;
  user-select: none;
}
tr.tier-group .tier-group-arrow { margin-right: 6px; }
tr.tier-group.open .tier-group-arrow { color: var(--dsw-static-blue-600, rgb(37, 99, 235)); }
/* 域标题行：用户列表两级分组「域 → 用户组」（代码域在前、工作域在后，不可折叠） */
tr.domain-group td {
  padding-top: 12px;
  border-top: 1px solid var(--dsm-border);
  background: var(--dsw-static-neutral-100, rgb(244, 244, 244));
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.05em;
  color: var(--dsw-alias-label-secondary, rgb(107, 107, 107));
}
/* 跨域用户标记（复用 .tag 徽章基类） */
.tag.cross-domain { font-size: 11px; padding: 0 6px; margin-left: 6px; vertical-align: middle; }
.preset-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 8px 18px;
  margin: 4px 0 12px;
}
.preset-grid .span-2 { grid-column: 1 / -1; }
.preset-row {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
}
.preset-row .preset-label {
  flex: 1;
  min-width: 0;
  color: var(--dsw-alias-label-primary);
  font-size: 13px;
}
.preset-row .preset-mode {
  flex: none;
  min-width: 148px;
}
.preset-row.span-2 {
  display: grid;
  grid-template-columns: minmax(180px, 1fr) minmax(160px, 2fr) 148px;
  align-items: center;
}
.preset-row.span-2 .preset-label { flex: none; }
.preset-row.span-2 input { min-width: 0; width: 100%; }
.tier-members {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 4px 16px;
  padding: 8px 0;
}
.tier-members .muted { font-size: 12px; }

/* 用量统计卡片（我的空间 / 管理后台共用） */
.usage-cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 10px;
  margin: 12px 0 18px;
}
.usage-card {
  padding: 12px 14px;
  border: 1px solid var(--dsw-alias-border-neutral-secondary, #e5e6eb);
  border-radius: 8px;
  background: var(--dsw-alias-bg-base-secondary, #fafafa);
}
.usage-card-value {
  font-size: 20px;
  font-weight: 600;
  line-height: 1.3;
  font-variant-numeric: tabular-nums;
}
.usage-card-label {
  margin-top: 2px;
  font-size: 12px;
  opacity: 0.7;
}
body[data-ds-dark-theme] .usage-card {
  border-color: rgba(255, 255, 255, 0.12);
  background: rgba(255, 255, 255, 0.04);
}

/* 状态徽标：工作域容器五态（运行中/启动中/已休眠/离线/已停用）与代码域成员态
   （运行中/启动中/已停止/服务故障/未知）共用一套色阶；两域语义不同，词表各自定义。 */
.tenant-state {
  display: inline-block;
  border-radius: 999px;
  padding: 3px 8px;
  font-size: 12px;
  line-height: 18px;
  white-space: nowrap;
}
.tenant-state.running { background: var(--dsw-static-green-100); color: var(--dsw-alias-state-success-primary); }
.tenant-state.starting { background: var(--dsw-static-deepseek-50); color: var(--dsw-alias-state-business-primary); }
.tenant-state.sleeping { background: var(--dsw-static-neutral-100, #eef0f3); color: var(--dsw-alias-label-secondary, #4e5969); }
.tenant-state.offline { background: var(--dsw-static-red-100); color: var(--dsw-alias-state-error-primary); }
.tenant-state.disabled { background: var(--dsw-static-neutral-100, #eef0f3); color: var(--dsw-alias-label-tertiary, #86909c); }
.tenant-state.stopped { background: var(--dsw-static-neutral-100, #eef0f3); color: var(--dsw-alias-label-secondary, #4e5969); }
.tenant-state.failed { background: var(--dsw-static-red-100); color: var(--dsw-alias-state-error-primary); }
.tenant-state.unknown { opacity: 0.6; }
body[data-ds-dark-theme] .tenant-state.sleeping,
body[data-ds-dark-theme] .tenant-state.stopped,
body[data-ds-dark-theme] .tenant-state.disabled {
  background: rgba(255, 255, 255, 0.08);
  color: rgba(255, 255, 255, 0.72);
}

/* 租户日志：等宽、可滚动、可选中。
   只读视图，不装 xterm 之类的终端——这里要的是「能复制报错」而不是交互。 */
.dsm-logview {
  margin: 0;
  max-height: 60vh;
  overflow: auto;
  padding: 12px 14px;
  border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1));
  border-radius: 8px;
  background: var(--dsw-alias-bg-base, #f7f8fa);
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 12px;
  line-height: 1.6;
  white-space: pre-wrap;
  word-break: break-all;
  -webkit-user-select: text;
  user-select: text;
}
.dsm-logview:empty::before {
  content: '（无日志）';
  color: var(--dsw-alias-label-tertiary, #86909c);
}
body[data-ds-dark-theme] .dsm-logview {
  background: rgba(0, 0, 0, 0.24);
  border-color: rgba(255, 255, 255, 0.12);
}

/* ── 租户工单 ────────────────────────────────────────────── */
#issues-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin: 0 0 16px;
}

.issue-card {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 12px 14px;
  border: 1px solid var(--dsw-alias-border-l3);
  border-radius: 12px;
  background: var(--dsw-alias-bg-module-platform);
}

.issue-head {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  font-size: 15px;
}

/* 状态片只在 currentColor 上着色：静态色板不随主题翻转，暗色下会变成浅底浅字 */
.issue-state {
  font-size: 12px;
  background: transparent;
  border: 1px solid currentColor;
}

.issue-state-open { color: var(--dsw-alias-state-error-primary); }
.issue-state-replied { color: var(--dsw-alias-state-warn-primary); }
.issue-state-resolved { color: var(--dsw-alias-state-business-primary); }
.issue-state-verified { color: var(--dsw-alias-state-success-primary); }

.issue-body {
  white-space: pre-wrap;
  word-break: break-word;
  color: var(--dsw-alias-label-secondary);
}

.issue-events {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding-left: 10px;
  border-left: 2px solid var(--dsw-alias-border-l2);
  color: var(--dsw-alias-label-secondary);
}

.issue-card .manage-bar {
  margin-bottom: 0;
}


/* ── 管理域切换器：仅两个按钮，与官方设置页控件同高 ── */
.dsm-domain-switcher {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 0 12px;
}
.dsm-domain-cell {
  height: 28px;
  padding: 0 12px;
  border-radius: 999px;
  border: 1px solid var(--dsw-alias-border-l2);
  background: transparent;
  color: var(--dsw-alias-label-primary);
  font-family: inherit;
  font-size: 13px;
  line-height: 20px;
  cursor: pointer;
}
.dsm-domain-cell:hover {
  background: var(--dsw-alias-interactive-bg-hover);
}
.dsm-domain-cell.active {
  background: var(--dsw-specific-sidebar-nav-item-active);
  border-color: transparent;
  color: var(--dsw-alias-label-primary);
}
#dsm-group-switcher {
  padding: 0 12px;
}
#dsm-group-switcher select,
.dsm-group-select {
  height: 28px;
  min-width: 0;
  width: 100%;
  padding: 0 8px;
  border: 1px solid var(--dsw-alias-border-l2);
  border-radius: 8px;
  background: var(--dsw-specific-selector);
  color: var(--dsw-alias-label-primary);
  font: inherit;
  font-size: 13px;
}

/* 域限页：代码域下端口转发 / 租户日志只对工作域开放，展示空态 */
.dsm-section-domain-blocked > *:not(.dsm-domain-empty) { display: none; }
.dsm-domain-empty { padding: 16px 0; }
.dir-path { font-family: var(--dsm-mono, ui-monospace, SFMono-Regular, Menlo, monospace); font-size: 12px; }
/* 成员配置页成员的 AGENTS.md 编辑区（admin.js::renderHostAgentsEditor）：与上方能力分配分隔 */
.host-agents { margin-top: 24px; padding-top: 12px; border-top: 1px solid var(--dsw-alias-border-l3); }
.host-agents-textarea { min-width: 0; }

/* 成员配置页能力分配的三块可折叠块（技能 / 插件 / AGENTS.md，admin.js::hostBlock）：
   默认折叠（页面不再被三块长列表撑长），点标题展开/收起；展开态按成员存在
   admin.js 的 hostBlockOpen 里，切换成员各自恢复。样式沿用技能分组的
   「summary + 展开/收起」观感，避免同一页两套折叠观感。 */
.host-block { margin: 0 0 16px; }
.host-block > summary {
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  cursor: pointer;
  user-select: none;
  padding: 2px 0 8px;
}
.host-block > summary::-webkit-details-marker { display: none; }
.host-block > summary h4 {
  margin: 0;
  display: flex;
  align-items: center;
  gap: 8px;
}
.host-block > summary::after {
  content: "展开";
  flex: none;
  color: var(--dsw-alias-label-secondary);
  font-size: 13px;
}
.host-block[open] > summary::after { content: "收起"; }
/* 标题旁的一句话状态（AGENTS.md 块用）：换行不挤掉右侧「展开/收起」 */
.host-block-note { font-weight: 400; font-size: 13px; text-align: right; }
.host-block-body {
  overflow: hidden;
  padding: 4px 14px 10px;
  border: 1px solid var(--dsw-alias-border-l3);
  border-radius: 12px;
}
.host-block-body > .muted:first-child { margin-top: 8px; }

/* 「我的空间」按域裁剪（my.js::applyMyDomainScope）：代码域成员的「共享 / 环境」
   入口整节隐藏。导航项有 overlay-shell.css 的 .dsm-nav-cell[hidden]，但分节的
   .dsm-section.active{display:block} 会压过 UA 的 [hidden]，故这里用更高优先级补一条。 */
.dsm-options > .dsm-section[hidden] { display: none; }

/* 环境变量矩阵：一行一个键（键 / 说明 + 每域一组「列」勾选框）。
   2026-10-22 用户口径：原来每个键一张折叠卡片 —— 键、标签、「N 个组可见」、展开
   四行里有两三行是同一套域选择的重复展示；改成「组 = 列」的矩阵后，一套组选择只在
   表头出现一次，整列还能一次勾选。 */
.env-filter { width: 200px; min-width: 140px; }
.env-table-wrap {
  /* 自己滚：表头用 sticky 吸在这层顶部，46 行滚下去仍知道哪一列是哪个组。
     外层 .dsm-options 只滚工具栏与说明，表格高度封顶。 */
  max-height: min(72vh, 680px);
  overflow: auto;
  border: 1px solid var(--dsw-alias-border-l3);
  border-radius: 12px;
}
.env-table { width: 100%; min-width: 760px; border-collapse: collapse; table-layout: fixed; }
/* 组列固定窄宽（列头两行 + 人数），键/说明列吃掉剩余宽度 */
.env-col-group { width: 76px; }
.env-col-main { width: auto; }
.env-table th, .env-table td {
  padding: 3px 8px;
  border-bottom: 1px solid var(--dsw-alias-border-l2);
  text-align: left;
  vertical-align: middle;
}
.env-table tbody tr:last-child td { border-bottom: 0; }
/* 表头吸顶：sticky 要打在 <thead> 上（打在 th 上时它的包含块只有本行，
   两行表头在滚动容器里跟不走，实测完全不吸）。两行一起吸：域带 + 组列。 */
.env-table thead {
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--dsw-alias-bg-module-platform);
}
.env-table thead th { background: var(--dsw-alias-bg-module-platform); }
.env-table thead tr:nth-child(2) th {
  height: 66px;
  box-shadow: inset 0 -1px 0 var(--dsw-alias-border-l3);
}
.env-domain {
  height: 27px;
  padding: 0 8px;
  font-size: 11px;
  font-weight: 500;
  line-height: 27px;
  color: var(--dsw-alias-label-tertiary);
  white-space: nowrap;
}
.env-domain-current { color: var(--dsw-alias-label-secondary); }
.env-head-main { font-size: 12px; font-weight: 500; color: var(--dsw-alias-label-tertiary); white-space: nowrap; }
.env-head-group { padding: 5px 4px; text-align: center; vertical-align: top; }
.env-group-head { display: flex; flex-direction: column; align-items: center; gap: 2px; cursor: pointer; }
.env-group-head input { width: 13px; height: 13px; margin: 0; accent-color: var(--dsw-alias-state-business-primary); }
.env-group-name {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  white-space: normal;
  font-size: 10.5px;
  line-height: 12px;
  font-weight: 500;
  color: var(--dsw-alias-label-secondary);
  word-break: break-all;
}
.env-group-sub { display: block; margin-top: 1px; font-size: 10px; line-height: 12px; color: var(--dsw-alias-label-tertiary); }
/* 键格：键名（可省略）+ 凭据标 + 受限键的「↺ 全组可见」，说明只做悬停提示 */
.env-cell-main { display: flex; align-items: center; gap: 8px; min-width: 0; overflow: hidden; cursor: help; }
.env-cell-main code {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 12px;
  font-weight: 600;
}
.env-cell-main .env-tag {
  flex: none;
  padding: 0 4px;
  border: 1px solid currentColor;
  border-radius: 4px;
  font-size: 10px;
  line-height: 14px;
  color: var(--dsw-alias-label-tertiary);
}
.env-row-all {
  flex: none;
  margin-left: auto;
  height: 18px;
  padding: 0 6px;
  border: 1px solid var(--dsw-alias-border-l3);
  border-radius: 6px;
  background: transparent;
  color: var(--dsw-alias-label-secondary);
  font-size: 10px;
  line-height: 16px;
  cursor: pointer;
}
.env-row-all[hidden] { display: none; }
.env-row-all:hover { background: var(--dsw-alias-interactive-bg-hover); }
.env-cell { padding: 3px 0; text-align: center; }
.env-cell-hit { display: block; cursor: pointer; }
.env-cell-hit input[type="checkbox"] { width: 15px; height: 15px; margin: 0; }
.env-table input[type="checkbox"] { accent-color: var(--dsw-alias-state-business-primary); }
.env-table tbody tr:hover td { background: var(--dsw-alias-interactive-bg-hover); }
/* 改动标记：行 = 琥珀色竖条 + 淡底；格 = 该键该组的状态真的变了 */
.env-table tbody tr.env-dirty td { background: rgba(245, 158, 11, 0.07); }
.env-table tbody tr.env-dirty td:first-child { box-shadow: inset 3px 0 0 var(--dsw-alias-state-warn-primary); }
.env-table td.env-cell-dirty { background: rgba(245, 158, 11, 0.18); }
/* 未保存改动计数：只在有改动时才有字（保存/撤销按钮常驻工具栏，靠 disabled 表达状态） */
.env-dirty-count { font-size: 12px; }
.env-dirty-count.on { color: var(--dsw-alias-state-warn-primary); }
.env-orphans { margin: 8px 0 0; }
.env-orphans button { margin-left: 8px; }
@media (max-width: 720px) {
  .env-filter { width: 100%; }
  /* 窄屏：表格在自己的 .env-table-wrap 里横向滚（页面不横滚）。
     键列必须给死宽度：组列 7×58 已经超过屏宽，auto 的键列会被压成 0 宽、键名整列消失。 */
  .dsm-section .env-table {
    display: table;
    width: 100%;
    min-width: 0;
    overflow: visible;
    white-space: normal;
  }
  .env-col-main { width: 150px; }
  .env-col-group { width: 58px; }
  /* 窄屏键列只有 150px：收回按钮只留 ↺，否则键名被挤成「AGE…」 */
  .env-row-all { padding: 0 4px; }
  .env-row-all-label { display: none; }
  .env-head-group { padding: 4px 2px; }
  .env-group-name { font-size: 10px; }
}

/* 我的空间插件行：语义图标与状态标签/名称的间距。 */
.skill-row .dsm-icon { margin-right: 6px; flex: none; }
