/* 管理站外壳 —— 只管布局与骨架，颜色/字号一律来自 design-tokens 与 dsm-ui */
:root {
  --adm-side-w: 232px;
  --adm-gap: 16px;
}
html, body { height: 100%; }
body.dsm-standalone, body { margin: 0; }

.adm-shell {
  display: grid;
  grid-template-columns: var(--adm-side-w) minmax(0, 1fr);
  min-height: 100vh;
  background: var(--dsw-alias-bg-base, #fff);
  color: var(--dsw-alias-label-primary, #222);
  font-family: var(--dsw-font-family, system-ui);
}

.adm-side {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 14px 10px;
  border-right: 0.5px solid var(--dsw-alias-border-l2, #e6e6e6);
  background: var(--dsw-alias-bg-layer-1, #fafafa);
  min-height: 100vh;
  position: sticky;
  top: 0;
  overflow-y: auto;
}
.adm-brand { display: flex; align-items: center; gap: 8px; padding: 4px 8px 10px; }
.adm-brand-mark {
  width: 18px; height: 18px; border-radius: 6px;
  background: var(--dsw-alias-label-primary, #222);
  opacity: .85;
}
.adm-brand-text { font-weight: 600; font-size: 15px; }

.adm-domain { display: flex; gap: 4px; padding: 0 6px 6px; }
.adm-domain-btn {
  flex: 1; padding: 5px 8px; border-radius: 8px; cursor: pointer;
  border: 0.5px solid var(--dsw-alias-border-l2, #e6e6e6);
  background: transparent; color: var(--dsw-alias-label-secondary, #555);
  font-size: 12px; font-family: inherit;
}
.adm-domain-btn.active {
  background: var(--dsw-alias-bg-layer-2, #fff);
  color: var(--dsw-alias-label-primary, #222);
  border-color: var(--dsw-alias-border-l1, #ccc);
}

.adm-side .dsm-nav { display: flex; flex-direction: column; gap: 1px; }
.adm-side .dsm-nav-group > .dsm-nav-sub { display: none; }
.adm-side .dsm-nav-group.open > .dsm-nav-sub { display: flex; flex-direction: column; }
/* 分组标题右侧的展开指示：收起时指向右，展开时转 90°。
   没有它，分组标题与普通菜单项视觉无法区分——用户会以为分组「显示不出来」
   （2026-10-31 实发：用户组 / 默认配置 两组看着像空项）。 */
.adm-side .dsm-nav-caret {
  margin-left: auto; flex: 0 0 auto; font-size: 15px; line-height: 1;
  color: var(--dsw-alias-label-tertiary, #888);
  transition: transform .12s ease;
}
.adm-side .dsm-nav-group.open .dsm-nav-caret { transform: rotate(90deg); }
.adm-side .dsm-nav-cell {
  display: flex; align-items: center; gap: 8px; width: 100%;
  padding: 7px 10px; border-radius: 8px; text-decoration: none;
  color: var(--dsw-alias-label-primary, #222); font-size: 13px;
  background: transparent; border: 0;
  cursor: pointer; text-align: left; font-family: inherit;
}
.adm-side .dsm-nav-cell:hover { background: var(--dsw-alias-bg-layer-2, #fff); }
.adm-side .dsm-nav-cell.active {
  background: var(--dsw-alias-bg-layer-2, #fff);
  font-weight: 600;
  box-shadow: inset 2px 0 0 var(--dsw-alias-label-primary, #222);
}
.adm-side .dsm-nav-subcell { padding-left: 34px; font-size: 12.5px; }
.adm-side-foot { margin-top: auto; padding: 8px; font-size: 11px; color: var(--dsw-alias-label-tertiary, #888); }

.adm-main { display: flex; flex-direction: column; min-width: 0; }
.adm-top {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; padding: 12px 22px;
  border-bottom: 0.5px solid var(--dsw-alias-border-l2, #e6e6e6);
  position: sticky; top: 0; z-index: 5;
  background: var(--dsw-alias-bg-base, #fff);
}
.adm-top-left { display: flex; align-items: center; gap: 10px; min-width: 0; }
.adm-crumb { font-size: 15px; font-weight: 600; margin: 0; }
.adm-top-right { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.adm-user { color: var(--dsw-alias-label-secondary, #555); }
.adm-content { padding: 18px 22px 60px; display: flex; flex-direction: column; gap: 14px; }
#banners { display: flex; flex-direction: column; gap: 8px; padding: 0 22px; }
#banners:not(:empty) { padding-top: 12px; }

.adm-error { display: flex; flex-direction: column; gap: 8px; }
.adm-modal-back {
  position: fixed; inset: 0; background: rgba(0,0,0,.35);
  display: flex; align-items: center; justify-content: center; z-index: 50; padding: 24px;
}
.adm-modal { width: min(720px, 96vw); max-height: 86vh; overflow: auto; }
.dsm-card-body { padding: 8px 0; }
/* 可折叠小节（ui.js collapsibleCard）：<details> + <summary>。
   默认收起由 <details> 的 open 属性决定，这里只管观感。
   summary 去掉浏览器默认三角，改用 ::before 画一个会转的尖角——原生标记在
   dsm-card 的 flex 头里对不齐，各浏览器样式也不一致。 */
.dsm-card > summary.dsm-card-head {
  cursor: pointer; user-select: none; list-style: none;
  align-items: center; justify-content: flex-start; gap: 8px;
}
.dsm-card > summary.dsm-card-head::-webkit-details-marker { display: none; }
.dsm-card > summary.dsm-card-head::before {
  content: "\203a"; display: inline-block; flex: 0 0 auto;
  width: 1em; text-align: center; font-size: 15px; line-height: 1;
  color: var(--dsw-alias-label-tertiary, #888);
  transition: transform .12s ease;
}
.dsm-card[open] > summary.dsm-card-head::before { transform: rotate(90deg); }
/* 收起时内容不占位（<details> 默认行为）。显式写：UI-DESIGN §折叠容器 指出
   作者规则的 display:flex 会盖掉 UA 的 [hidden]。 */
/* 只在 <details> 折叠卡上隐藏 body：写成 .dsm-card:not([open]) 会误伤**所有**
   div.dsm-card（div 永远没有 open 属性 → :not([open]) 恒真），
   实测把 folders / models / tiers-* 共 5 个页面的卡片内容整片隐藏
   （2026-10-31 用户报「共享目录授权显示不出来」）。 */
details.dsm-card:not([open]) > .dsm-card-body { display: none; }
.adm-toast {
  position: fixed; right: 20px; bottom: 20px; z-index: 60;
  padding: 8px 14px; border-radius: 10px;
  background: var(--dsw-alias-bg-layer-2, #fff);
  box-shadow: 0 6px 24px rgba(0,0,0,.16);
}
.dsm-table .num { text-align: right; font-variant-numeric: tabular-nums; }
/* 表格比容器宽时在容器内横向滚动，不要被页面右边缘裁掉（状态监控 12 列会超宽）。
   最后一列（说明/备注）允许折行，避免「组容器·按需启...」这种半截文案。 */
.dsm-table-wrap { overflow-x: auto; max-width: 100%; }
.dsm-table th, .dsm-table td { white-space: nowrap; }
.dsm-table th:last-child, .dsm-table td:last-child { white-space: normal; min-width: 96px; }
/* 操作列不是文字列：按钮不折行（「备 注」竖排是上一条 nowrap 规则的反例）。 */
.dsm-table td.actions { white-space: nowrap; }
/* 组归属下拉固定宽度：native select 的 max-width 会被内在最小宽度顶开，
   要写 width；否则它按最长组名撑列，把「操作」按钮顶出可视区。 */
.tier-inline-select { width: 124px; }
.dsm-form { display: flex; flex-direction: column; gap: 12px; max-width: 720px; }
.dsm-form input, .dsm-form select, .dsm-form textarea {
  width: 100%; box-sizing: border-box; padding: 7px 10px;
  border-radius: 8px; font-family: inherit; font-size: 13px;
  border: 0.5px solid var(--dsw-alias-border-l2, #e6e6e6);
  background: var(--dsw-alias-bg-base, #fff);
  color: var(--dsw-alias-label-primary, #222);
}
.dsm-field { display: flex; flex-direction: column; gap: 4px; }

/* 卡片网格（总览页）：vendor 里没有这个容器类，这里只做布局，不碰颜色 */
.dsm-card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 14px;
}
.dsm-card-grid .dsm-card { display: flex; flex-direction: column; gap: 10px; }
.dsm-card-grid .dsm-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
/* 用户页分组卡片头：可折叠。▾/▸ 记作该组的默认状态（存本浏览器），点整行都触发。 */
.dsm-card-head.user-group-head { cursor: pointer; user-select: none; align-items: center; justify-content: flex-start; gap: 8px; }
.dsm-card-head.user-group-head .user-group-toggle { min-width: 26px; padding: 2px 6px; line-height: 1; flex: 0 0 auto; }
.dsm-card-head.user-group-head .dsm-card-title { display: inline-flex; align-items: center; gap: 6px; }
.dsm-card-grid .dsm-card-head .dsm-badge { flex: 0 0 auto; white-space: nowrap; }

/* 把 <a class="secondary|primary small"> 渲染成与 vendor 按钮一致的观感（链接当按钮用） */
a.primary, a.secondary, a.ghost, a.danger {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 12px; border-radius: 8px; font-size: 12.5px;
  text-decoration: none; cursor: pointer;
  border: 0.5px solid var(--dsw-alias-border-l2, #e6e6e6);
  color: var(--dsw-alias-label-primary, #222);
  background: var(--dsw-alias-bg-layer-2, #fff);
}
a.primary {
  background: var(--dsw-alias-label-primary, #222);
  color: var(--dsw-alias-bg-base, #fff);
  border-color: transparent;
}
a.small { padding: 3px 9px; font-size: 12px; }

@media (max-width: 900px) {
  .adm-shell { grid-template-columns: 1fr; }
  .adm-side { position: static; min-height: auto; }
}

/* ── 一级视图 tab（管理站 / 中枢平台 / 系统架构）与主题开关 ──────────────
   2026-10-26：管理站与中枢平台从「侧栏分组」提升为平级一级 tab；
   主题改为可切换（默认亮），域切换只在一级=管理站时出现。 */
.adm-views { display: flex; gap: 4px; padding: 0 6px 8px; }
.adm-view-btn {
  flex: 0 0 auto;
  padding: 6px 9px; border-radius: 8px; cursor: pointer;
  border: 0.5px solid transparent; background: transparent;
  color: var(--dsw-alias-label-secondary, #555); font-size: 13px; font-weight: 600;
  font-family: inherit; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.adm-view-btn:hover { background: var(--dsw-alias-bg-layer-2, #fff); }
.adm-view-btn.active {
  background: var(--dsw-alias-bg-layer-2, #fff);
  color: var(--dsw-alias-label-primary, #222);
  border-color: var(--dsw-alias-border-l1, #ccc);
}
.adm-domain[hidden] { display: none; }
.adm-top-status { display: flex; align-items: center; gap: 8px; }
.adm-theme {
  padding: 3px 10px; border-radius: 999px; cursor: pointer;
  border: 0.5px solid var(--dsw-alias-border-l1, #ccc);
  background: transparent; color: var(--dsw-alias-label-secondary, #555);
  font-size: 12px; font-family: inherit;
}
.adm-theme:hover { background: var(--dsw-alias-bg-layer-2, #fff); color: var(--dsw-alias-label-primary, #222); }

/* 登出：与主题按钮同款胶囊，但用 <a>，页面脚本挂了也能点（2026-11-03 用户：右上角缺登出）。 */
.adm-logout {
  padding: 3px 10px; border-radius: 999px; text-decoration: none;
  border: 0.5px solid var(--dsw-alias-border-l1, #ccc);
  background: transparent; color: var(--dsw-alias-label-secondary, #555);
  font-size: 12px; line-height: 1.4;
}
.adm-logout:hover { background: var(--dsw-alias-bg-layer-2, #fff); color: var(--dsw-alias-label-primary, #222); }

/* ── pageHead 右侧动作区不许被标题挤窄 ──────────────────────────────────
   标题+描述很长时，动作区（.dsm-toolbar）作为 flex 子项会被压缩，按钮里的
   两个字被折成两行（实测「刷新」渲染成「刷 / 新」）。动作区按内容定宽靠右，
   按钮文字不折行；vendor 副本不动（那份与网关逐字节同源）。*/
.dsm-page-head > .dsm-toolbar { flex: 0 0 auto; margin-left: auto; }
.dsm-page-head > .dsm-toolbar button,
.dsm-page-head > .dsm-toolbar a { white-space: nowrap; }

/* ── 亮色对比度修正 ──────────────────────────────────────────────────────
   vendor 里 --dsw-alias-state-success-primary / -warn-label 在亮暗两个 scope
   解析到同一批 static 色（当初按暗色调定），放到浅底上对比度只有 2.0~2.5
   （WCAG < 3）。它们全站高频出现（「网关在线」徽标、成功横幅、租户运行态），
   所以在外壳层按主题 scope 覆盖，不去改 vendor 副本（那份要与网关逐字节同源）。*/
body:not([data-ds-dark-theme]) .dsm-badge.success { color: #1a7f37; }
body:not([data-ds-dark-theme]) .dsm-badge.warn { color: #8a4b00; }
body:not([data-ds-dark-theme]) .dsm-banner.success { color: #1a7f37; border-color: #1a7f37; }
body:not([data-ds-dark-theme]) .dsm-banner.warn { color: #8a4b00; border-color: #8a4b00; }
body:not([data-ds-dark-theme]) .tenant-state.running { color: #1a7f37; }
body:not([data-ds-dark-theme]) .tenant-state.offline,
body:not([data-ds-dark-theme]) .tenant-state.failed { color: #b3261e; }
/* 暗色下 green-100 底偏暗，成功文字换成浅绿才看得清 */
body[data-ds-dark-theme] .tenant-state.running { color: #7ee2a8; }

/* 状态监控分组头：组名 + 汇总 + 批量操作，可折叠（组内行由 JS 置 display:none）。
   颜色一律走 design-tokens，避免与官方表格底色打架。 */
.dsm-table tr.group-row td {
  background: var(--dsw-alias-bg-layer-1, #fafafa);
  border-top: 0.5px solid var(--dsw-alias-border-l2, #e6e6e6);
  padding: 6px 8px;
}
/* td 必须保持 table-cell（改成 flex 会破坏 colspan 的列宽计算，实测整行被挤成一条）；
   内层包一层 div 做 flex 布局。 */
.dsm-table tr.group-row .group-head-wrap {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}
.dsm-table tr.group-row .group-head { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.dsm-table tr.group-row .group-toggle { min-width: 26px; padding: 2px 6px; line-height: 1; }
.dsm-table tr.group-row .group-name { font-weight: 600; }
.dsm-table tr.group-row .group-meta {
  color: var(--dsw-alias-label-secondary, #666);
  font-size: 12px;
}
.dsm-table tr.group-row .group-actions { display: inline-flex; gap: 6px; flex: 0 0 auto; margin-left: auto; }


/* 默认 AGENTS.md 编辑器（2026-10-27 用户实测「显示太小」）：
   它不在 .dsm-form 里，所以没有 width:100% —— 浏览器默认 ~20 列宽、字号也偏小。
   规则文本是给人通读的，给足高度与等宽字体，纵向可拉。 */
.agents-editor {
  width: 100%;
  box-sizing: border-box;
  min-height: 56vh;
  padding: 12px 14px;
  border-radius: 10px;
  border: 0.5px solid var(--dsw-alias-border-l2, #e6e6e6);
  background: var(--dsw-alias-bg-base, #fff);
  color: var(--dsw-alias-label-primary, #222);
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 13px;
  line-height: 1.6;
  tab-size: 2;
  resize: vertical;
}
.agents-editor:focus { outline: 2px solid var(--dsw-alias-border-l1, #d0d0d0); outline-offset: 1px; }
/* 只读视图（继承基线 / 合并后全文）：同字体、可滚动、不抢编辑区高度 */
.agents-view {
  margin: 0;
  padding: 10px 12px;
  max-height: 42vh;
  overflow: auto;
  border-radius: 8px;
  border: 0.5px dashed var(--dsw-alias-border-l2, #e6e6e6);
  background: var(--dsw-alias-bg-layer-1, #fafafa);
  color: var(--dsw-alias-label-secondary, #555);
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 12.5px;
  line-height: 1.55;
  white-space: pre-wrap;
  word-break: break-word;
}
.agents-block { margin: 10px 0 4px; }
.agents-block > summary {
  cursor: pointer;
  color: var(--dsw-alias-label-primary, #222);
  font-size: 13px;
  padding: 4px 0;
}

