/* ============================================================
   NAS 门户 — 飞牛 OS 亮面主题（原创实现）
   ============================================================ */
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { height: 100%; overflow: hidden; }
body {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "HarmonyOS Sans SC", "Microsoft YaHei", sans-serif;
  color: #232a35;
  background: #eef1f6;
  transition: background 0.8s ease;
  user-select: none;
  -webkit-font-smoothing: antialiased;
}

/* ---------- 壁纸（亮面 mesh 渐变） ---------- */
.wp-aurora { background:
  radial-gradient(1100px 700px at 12% 15%, rgb(196, 223, 254), transparent 60%),
  radial-gradient(950px 650px at 88% 12%, rgb(215, 221, 254), transparent 60%),
  radial-gradient(1000px 750px at 70% 92%, rgb(214, 251, 244), transparent 60%),
  linear-gradient(160deg, #eef4ff 0%, #e4ecfb 45%, #eaf7f5 100%); }
.wp-sunset { background:
  radial-gradient(1100px 700px at 18% 22%, rgb(254, 221, 186), transparent 60%),
  radial-gradient(950px 650px at 82% 18%, rgb(253, 220, 238), transparent 60%),
  linear-gradient(160deg, #fff4ea 0%, #ffe9f0 55%, #fdf0ff 100%); }
.wp-forest { background:
  radial-gradient(1100px 700px at 15% 20%, rgb(195, 247, 214), transparent 60%),
  radial-gradient(950px 650px at 85% 80%, rgb(215, 250, 254), transparent 60%),
  linear-gradient(160deg, #effcf3 0%, #e6f7ee 55%, #ecfbf7 100%); }
.wp-mono { background:
  radial-gradient(1100px 700px at 25% 18%, rgb(229, 234, 240), transparent 60%),
  linear-gradient(160deg, #f4f6f9 0%, #e9edf3 55%, #f2f4f8 100%); }

/* ---------- 顶部状态栏 ---------- */
#topbar {
  position: fixed; top: 0; left: 0; right: 0; height: 32px; z-index: 900;
  display: flex; align-items: center; gap: 14px; padding: 0 16px;
  background: rgb(255, 255, 255);
  font-size: 12px; color: #3b4557;
}
.tb-strong { font-weight: 600; letter-spacing: 0.3px; color: #1e2634; }
.tb-flex { flex: 1; }
#top-clock { font-variant-numeric: tabular-nums; }
#top-logo { flex: none; margin-right: -6px; }

/* ---------- 登录层 ---------- */
#login-screen { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; }
.login-card {
  width: 350px; padding: 44px 36px 28px; text-align: center;
  background: rgb(255, 255, 255);
  border-radius: 24px;
}
.login-avatar {
  width: 78px; height: 78px; margin: 0 auto 14px; border-radius: 22px;
  background: #2563eb;
  display: flex; align-items: center; justify-content: center;
  font-size: 36px; font-weight: 700; color: #fff;
}
.login-site { font-size: 22px; font-weight: 700; color: #1e2634; }
.login-sub { font-size: 12px; color: #64748b; margin: 6px 0 24px; }
.login-card input {
  width: 100%; height: 44px; margin-bottom: 12px; padding: 0 15px;
  border-radius: 12px; border: 0;
  background: rgb(238, 241, 246); color: #1e2634; font-size: 14px; outline: none;
  transition: background 0.2s;
}
.login-card input:focus { background: rgb(227, 236, 253); }
#login-err { min-height: 18px; font-size: 12px; color: #dc2626; margin-bottom: 4px; }
#login-btn {
  width: 100%; height: 46px; border: none; border-radius: 13px;
  background: #2563eb;
  color: #fff; font-size: 15px; font-weight: 600; letter-spacing: 8px; cursor: pointer;
  transition: filter 0.2s, transform 0.12s;
}
#login-btn:hover { filter: brightness(1.08); }
#login-btn:active { transform: scale(0.98); }
.login-foot { margin-top: 18px; font-size: 11px; color: #94a3b8; }

/* ---------- 桌面图标 ---------- */
#desktop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; }
#icons {
  position: absolute; top: 44px; left: 16px; bottom: 86px; right: 16px;
  display: flex; flex-direction: column; flex-wrap: wrap; align-content: flex-start;
  gap: 4px; overflow: hidden;
}
.desk-icon { width: 104px; padding: 12px 4px 9px; border-radius: 14px; text-align: center; cursor: pointer; transition: background 0.14s; }
.desk-icon:hover { background: rgb(238, 239, 240); }
.desk-icon .di-emoji {
  width: 72px; height: 72px; margin: 0 auto; border-radius: 20px;
  display: flex; align-items: center; justify-content: center; font-size: 34px;
  transition: transform 0.14s cubic-bezier(0.2, 0.9, 0.3, 1.4);
}
.desk-icon .di-name { margin-top: 7px; font-size: 12px; color: #273142; }
.desk-icon.locked .di-emoji { opacity: 0.5; }
.desk-icon.locked .di-name { color: #94a3b8; }

/* ---------- 窗口（飞牛亮面） ---------- */
.window {
  position: absolute; min-width: 380px; min-height: 260px;
  background: rgb(255, 255, 255);
  border-radius: 9px;
  display: flex; flex-direction: column; overflow: hidden; resize: both;
  animation: winIn 0.24s cubic-bezier(0.2, 0.9, 0.27, 1.18);
}
@keyframes winIn { from { opacity: 0; transform: scale(0.92) translateY(14px); } to { opacity: 1; transform: none; } }
.window.focused .win-title { background: #e3ecfd; }
.win-title {
  height: 40px; flex: none; display: flex; align-items: center; gap: 10px; padding: 0 12px;
  cursor: default; background: rgb(255, 255, 255);
  position: relative;
}

.win-name { font-size: 13px; font-weight: 600; flex: 1; text-align: center; color: #2b3547; padding: 0 140px 0 36px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.win-icon { font-size: 15px; position: absolute; left: 10px; top: 50%; margin-top: -8px; display: inline-flex; align-items: center; z-index: 2; }
.win-btns { display: flex; position: absolute; right: 0; top: 0; height: 40px; }
.wb { width: 46px; height: 40px; border: none; border-radius: 0; cursor: pointer; padding: 0; background: transparent; color: #4a5568; position: relative; transition: background 0.12s, color 0.12s; }
.wb:hover { background: rgb(238, 239, 240); }
.wb.close:hover { background: #c42b1c; color: #fff; }
.wb::before, .wb.close::after { content: ""; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }
.wb.min::before { width: 11px; height: 1.4px; background: currentColor; transform: translate(-50%, calc(-50% + 4px)); }
.wb.max::before { width: 10px; height: 10px; border: 1.4px solid currentColor; border-radius: 1px; }
.wb.close::before, .wb.close::after { width: 12px; height: 1.4px; background: currentColor; border-radius: 1px; }
.wb.close::before { transform: translate(-50%, -50%) rotate(45deg); }
.wb.close::after { transform: translate(-50%, -50%) rotate(-45deg); }
.win-body { flex: 1; overflow: auto; padding: 16px 18px; font-size: 13px; }

/* ---------- Dock(macOS 风格,半透明) ---------- */
#dock {
  position: absolute; left: 50%; bottom: 12px; transform: translateX(-50%);
  display: flex; align-items: flex-end; gap: 16px; padding: 10px 22px;
  background: rgba(255, 255, 255, 0.78);   /* 半透明,无羽化 */
  border-radius: 20px;
  z-index: 500; max-width: calc(96vw - 16px);
}
/* 桌面端必须 visible:overflow-x:auto 会把另一轴的 visible 强制为 auto,
   悬停放大的图标与名称气泡会被容器裁剪(顶部"被覆盖") */
#dock-items { display: flex; align-items: flex-end; gap: 16px; overflow: visible; }
/* transform 由 JS 逐帧缓动驱动(rAF 插值),不设 CSS 过渡,避免迟滞或瞬跳 */
#dock:hover .dock-item { transition: background 0.15s; }
.dock-item {
  width: 44px; height: 44px; flex: none; border: 0; border-radius: 13px;
  background: #eef1f6; color: #3b4557; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  position: relative; transform-origin: bottom center;
  transition: background 0.15s;
}
.dock-item svg { width: 23px; height: 23px; }
.dock-item.focused { background: #e3ecfd; }
.dock-item .dock-dot {
  position: absolute; bottom: -6px; left: 50%; margin-left: -2.5px;
  width: 5px; height: 5px; border-radius: 50%; background: #94a3b8; opacity: 0;
}
.dock-item.open .dock-dot { opacity: 1; }
/* 提示气泡:Docker 级单例,#dock 无 scale,不会被图标放大动画连带放大/遮挡;
   位置在放大后图标(上浮约 62px)再往上,由 JS 定位到悬停图标水平中心 */
#dock-tip {
  position: absolute; bottom: calc(100% + 82px); transform: translateX(-50%);
  background: #1f2937; color: #fff; font-size: 12px; padding: 5px 11px; border-radius: 9px;
  white-space: nowrap; display: none; pointer-events: none; z-index: 600;
}
.dock-start { background: #2563eb; }
.dock-sep { width: 1px; height: 36px; background: #e2e8f0; align-self: center; flex: none; }

/* ---------- 启动台 ---------- */
#start-menu {
  position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 800;
  background: rgb(247, 249, 253);
  display: flex; align-items: center; justify-content: center;
}
.lp-panel { width: min(620px, 90vw); animation: lpIn 0.24s cubic-bezier(0.2, 0.9, 0.27, 1.15); }
@keyframes lpIn { from { opacity: 0; transform: scale(0.94) translateY(16px); } to { opacity: 1; transform: none; } }
#app-search {
  width: 100%; height: 42px; margin-bottom: 20px; padding: 0 16px;
  border-radius: 12px; border: 0;
  background: rgb(255, 255, 255); color: #1e2634; outline: none;
  font-size: 13px; text-align: center;
}
#app-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.sm-app { padding: 14px 4px 10px; border-radius: 16px; text-align: center; cursor: pointer; transition: background 0.14s, transform 0.14s; }
.sm-app:hover { background: rgb(238, 239, 240); transform: translateY(-3px); }
.sm-app .di-emoji {
  width: 62px; height: 62px; margin: 0 auto; border-radius: 17px;
  display: flex; align-items: center; justify-content: center; font-size: 34px;
}
.sm-app .di-name { font-size: 11.5px; margin-top: 8px; color: #2b3547; }
.sm-app.locked .di-emoji { opacity: 0.5; }
.sm-app.locked .di-name { color: #94a3b8; }
.sm-footer {
  margin-top: 20px; padding-top: 14px; border-top: 1px solid rgb(231, 232, 234);
  display: flex; align-items: center; justify-content: space-between; font-size: 12px; color: #64748b;
}
#logout-btn {
  height: 32px; padding: 0 16px; border: none; border-radius: 10px;
  background: rgb(252, 233, 234); color: #dc2626; font-size: 12px; cursor: pointer;
}
#logout-btn:hover { background: rgb(249, 215, 216); }

/* ---------- 通用组件（亮面） ---------- */
.stat-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; }
.stat-card {
  background: rgb(255, 255, 255);
  border-radius: 16px; padding: 15px 17px;
}
.stat-card h4 { font-size: 12px; color: #64748b; font-weight: 500; margin-bottom: 8px; }
.stat-big { font-size: 27px; font-weight: 700; font-variant-numeric: tabular-nums; color: #16202f; }
.stat-sub { font-size: 11px; color: #7c8aa0; margin-top: 5px; }
.bar { height: 6px; border-radius: 3px; background: rgb(233, 234, 236); margin-top: 10px; overflow: hidden; }
.bar > i { display: block; height: 100%; border-radius: 3px; background: #2563eb; transition: width 0.5s; }
.bar > i.warn { background: #f97316; }
table.list { width: 100%; border-collapse: collapse; font-size: 12.5px; }
table.list th {
  text-align: left; padding: 9px 10px; color: #64748b; font-weight: 500;
  position: sticky; top: 0; background: rgb(255, 255, 255);
}
table.list td { padding: 9px 10px; border-bottom: 1px solid rgb(243, 243, 244); color: #2b3547; }
table.list tr:hover td { background: rgb(245, 249, 255); }
.badge { padding: 3px 10px; border-radius: 20px; font-size: 11px; }
.badge.running { background: rgb(224, 247, 232); color: #15803d; }
.badge.exited { background: rgb(238, 239, 240); color: #64748b; }
.badge.created, .badge.paused { background: rgb(254, 241, 221); color: #b45309; }
.btn {
  height: 29px; padding: 0 13px; border: none; border-radius: 9px;
  background: rgb(238, 239, 240); color: #2b3547;
  font-size: 12px; cursor: pointer; margin-right: 5px; transition: background 0.15s;
}
.btn:hover { background: rgb(224, 225, 227); }
.btn.red { background: rgb(252, 233, 234); color: #dc2626; }
.btn.red:hover { background: rgb(249, 211, 212); }
.crumb { margin-bottom: 10px; font-size: 12.5px; color: #64748b; word-break: break-all; }
.crumb a { color: #2563eb; cursor: pointer; text-decoration: none; }
.crumb a:hover { text-decoration: underline; }
.app-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 12px; }
.app-card { background: rgb(255, 255, 255); border: 0; border-radius: 16px; padding: 16px; }
.app-card .ac-top { display: flex; align-items: center; gap: 10px; margin-bottom: 9px; }
.app-card .ac-emoji {
  width: 40px; height: 40px; border-radius: 12px; font-size: 22px;
  display: flex; align-items: center; justify-content: center;
  background: rgb(243, 243, 244);
}
.app-card .ac-name { font-weight: 600; font-size: 14px; color: #16202f; }
.app-card p { font-size: 11.5px; color: #64748b; line-height: 1.6; }
.app-card .ac-status { margin-top: 10px; }
.setting-row { margin-bottom: 22px; }
.setting-row h4 { font-size: 13px; margin-bottom: 10px; color: #374151; }
.setting-row input {
  height: 38px; width: 250px; padding: 0 12px; border-radius: 10px;
  background: rgb(255, 255, 255); color: #1e2634; outline: none; font-size: 13px; margin-right: 8px;
}
.wp-pick { display: flex; gap: 10px; }
.wp-item { width: 92px; height: 58px; border-radius: 12px; cursor: pointer; border: 2px solid transparent; }
.wp-item.sel { border-color: #2563eb; }
.wp-item.wp-aurora { background: linear-gradient(135deg, #eef4ff, #cfe0fb); }
.wp-item.wp-sunset { background: linear-gradient(135deg, #fff4ea, #fbd5e8); }
.wp-item.wp-forest { background: linear-gradient(135deg, #effcf3, #bdeedd); }
.wp-item.wp-mono { background: linear-gradient(135deg, #f4f6f9, #cfd6e0); }
.sys-line { font-size: 12px; color: #55607a; line-height: 1.9; }
.sys-line b { color: #1e2634; font-weight: 600; }
#toast {
  position: fixed; left: 50%; bottom: 84px; transform: translateX(-50%);
  background: rgb(255, 255, 255); color: #1e2634;
  padding: 11px 22px; border-radius: 13px; font-size: 13px;
  z-index: 2000;
  animation: toastIn 0.25s cubic-bezier(0.2, 0.9, 0.3, 1.3);
}
@keyframes toastIn { from { opacity: 0; transform: translateX(-50%) translateY(14px) scale(0.94); } to { opacity: 1; transform: translateX(-50%); } }
.hidden { display: none !important; }

/* ---------- 控制台 tabs / 日志 ---------- */
.tabs { display: flex; gap: 6px; flex-wrap: wrap; border-bottom: 1px solid rgb(233, 234, 236); padding-bottom: 10px; }
.tab {
  height: 31px; padding: 0 16px; border: none; border-radius: 10px;
  background: rgb(243, 243, 244); color: #55607a;
  font-size: 12.5px; cursor: pointer; transition: background 0.15s, color 0.15s, transform 0.12s;
}
.tab:hover { background: rgb(231, 232, 234); }
.tab:active { transform: scale(0.94); }
.tab.on { background: #2563eb; color: #fff; }
pre.raw {
  background: #f3f5f9; padding: 13px 15px; border-radius: 12px;
  font-size: 11.5px; line-height: 1.6; color: #37415a;
  font-family: "SF Mono", Consolas, "Courier New", monospace;
  max-height: 330px; overflow: auto; white-space: pre-wrap; word-break: break-all; margin: 8px 0;
}
.svc-row {
  display: flex; align-items: center; gap: 10px; padding: 11px 15px;
  border-radius: 12px; background: rgb(255, 255, 255); margin-bottom: 8px;
}
.svc-row:hover { background: rgb(245, 249, 255); }
.svc-name { font-weight: 600; font-size: 13px; min-width: 120px; color: #1e2634; }
.svc-note { color: #64748b; font-size: 11px; flex: 1; }
.power-zone { text-align: center; padding: 30px 0; }
.power-btn {
  height: 52px; padding: 0 42px; margin: 0 12px; border: none; border-radius: 14px;
  font-size: 16px; font-weight: 600; cursor: pointer; color: #fff;
}
.power-btn.reboot { background: #d97706; }
.power-btn.off { background: #dc2626; }
.power-btn.armed { animation: pulse 0.8s infinite alternate; }
@keyframes pulse { from { filter: brightness(1); } to { filter: brightness(1.35); } }
select.sel {
  height: 31px; border-radius: 9px; padding: 0 8px;
  background: #fff; color: #2b3547; font-size: 12px; outline: none;
}

/* ---------- 硬件 / 存储 ---------- */
.hw-sec { margin-bottom: 18px; }
.hw-sec > h3 { font-size: 13px; color: #374151; margin-bottom: 10px; font-weight: 600; }
.hw-sec > h3::before { content: ""; display: inline-block; width: 4px; height: 13px; border-radius: 2px; background: linear-gradient(#4f8cff, #2ad4ee); margin-right: 8px; vertical-align: -1px; }
.hw-note { font-size: 11px; color: #8a94a8; margin-top: 8px; }
details.rawbox { margin-top: 14px; }
details.rawbox summary { cursor: pointer; font-size: 12px; color: #64748b; }

/* ---------- 米家 ---------- */
.mj-card {
  background: rgb(255, 255, 255); border: 0;
  border-radius: 16px; padding: 16px; margin-bottom: 12px;
}
.mj-top { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.mj-emoji {
  width: 44px; height: 44px; border-radius: 13px; font-size: 24px;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(145deg, rgb(227, 237, 255), rgb(229, 250, 253));
}
.mj-name { font-weight: 600; font-size: 14px; color: #1e2634; }
.mj-meta { font-size: 11px; color: #7c8aa0; }
.mj-actions { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-top: 6px; }
.mj-actions input { height: 28px; width: 130px; border-radius: 8px; padding: 0 9px; border: 0; background: rgb(255, 255, 255); color: #1e2634; font-size: 11.5px; outline: none; }

/* ---------- 商店详情 / 动效 ---------- */
.st-hero { display: flex; gap: 14px; align-items: center; margin: 14px 0 10px; }
.st-desc { line-height: 1.8; color: #3c4656; }
.view-in { animation: viewIn 0.22s cubic-bezier(0.2, 0.9, 0.3, 1) both; }
@keyframes viewIn { from { opacity: 0; transform: translateX(16px); } to { opacity: 1; transform: none; } }
.app-card.tappable { cursor: pointer; }
button { transition: transform 0.12s cubic-bezier(0.2, 0.9, 0.3, 1), background 0.15s ease, filter 0.15s ease; }
button:active:not(.wb) { transform: scale(0.955); }
.di-emoji.svg { background: none; border: none; padding: 0; }
.di-emoji.svg svg { width: 100%; height: 100%; display: block; border-radius: 16px; }
.task-item svg { width: 22px; height: 22px; border-radius: 6px; flex: none; }
.win-icon svg { width: 16px; height: 16px; border-radius: 4px; }
.ac-emoji svg { width: 100%; height: 100%; display: block; }
input { transition: background 0.18s ease; }
::-webkit-scrollbar { width: 9px; height: 9px; }
::-webkit-scrollbar-thumb { background: rgb(212, 213, 217); border-radius: 5px; }
::-webkit-scrollbar-thumb:hover { background: rgb(183, 185, 191); }
::-webkit-scrollbar-track { background: transparent; }
@media (max-width: 860px) {
  .desk-icon { width: 76px; }
  .desk-icon .di-emoji { width: 48px; height: 48px; border-radius: 13px; font-size: 24px; }
  .desk-icon .di-name { font-size: 11px; }
  #start-menu #app-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 560px) {
  #topbar { gap: 10px; font-size: 11px; }
  #top-status { display: none; }
}
@media (max-height: 680px) {
  #icons { bottom: 74px; }
  .desk-icon { width: 72px; padding: 6px 2px 5px; }
  .desk-icon .di-emoji { width: 44px; height: 44px; }
}

.st-more { margin-left: 8px; color: #2563eb; font-size: 11px; font-weight: 600; opacity: 0; transition: opacity 0.15s; }
.app-card.tappable:hover .st-more { opacity: 1; }

/* ---------- fnOS 式右键菜单 ---------- */
#ctx-menu { position: fixed; z-index: 3000; min-width: 190px; padding: 6px; border-radius: 14px;
  background: rgb(255, 255, 255); border: 0; }
#ctx-menu .ctx-item { padding: 9px 14px; border-radius: 9px; font-size: 13px; color: #2b3547; cursor: pointer; }
#ctx-menu .ctx-item:hover { background: rgb(235, 243, 254); color: #2563eb; }
#ctx-menu .ctx-sep { height: 1px; background: rgb(236, 236, 238); margin: 5px 8px; }
/* ---------- 通知中心 ---------- */
#notify-bell { position: relative; cursor: pointer; display: inline-flex; align-items: center; padding: 0 4px; }
#notify-dot { position: absolute; top: -2px; right: -2px; width: 8px; height: 8px; border-radius: 50%; background: #ef4444; border: 2px solid rgb(255, 255, 255); display: none; }
#notify-panel { position: fixed; top: 40px; right: 12px; width: 340px; max-height: 60vh; overflow: auto; z-index: 2500;
  background: rgb(255, 255, 255); border: 0; border-radius: 18px;
  padding: 14px 16px; box-sizing: border-box;
  animation: viewIn 0.2s ease; }
/* 标题行:flex 两端对齐,按钮在流内,不再 float 突出面板 */
#notify-panel h4 { display: flex; align-items: center; justify-content: space-between; font-size: 14px; margin-bottom: 10px; color: #1e2634; line-height: 1.2; }
.ntf-item { padding: 10px 12px; border-radius: 12px; background: rgb(245, 246, 246); margin-bottom: 8px; }
.ntf-item .ntf-t { font-size: 12.5px; font-weight: 600; color: #2b3547; }
.ntf-item .ntf-d { font-size: 11.5px; color: #64748b; margin-top: 3px; line-height: 1.5; }
.ntf-item .ntf-time { font-size: 10.5px; color: #94a3b8; margin-top: 4px; }
.ntf-item .ntf-n { display: inline-block; font-size: 10.5px; background: #e3ecfd; color: #1d4ed8; border-radius: 8px; padding: 1px 7px; margin-left: 4px; font-weight: 700; }
.ntf-empty { text-align: center; color: #94a3b8; font-size: 12px; padding: 26px 0; }
/* ---------- 仪表盘 ---------- */
.dash-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 14px; }
.dash-card { background: rgb(255, 255, 255); border: 0; border-radius: 18px; padding: 18px 20px; position: relative; overflow: hidden; }
.dash-card h4 { font-size: 12.5px; color: #64748b; font-weight: 500; }
.dash-card .dash-big { font-size: 34px; font-weight: 700; margin-top: 8px; font-variant-numeric: tabular-nums; color: #16202f; }
.dash-card .dash-big small { font-size: 14px; color: #7c8aa0; font-weight: 500; }
.dash-card .dash-icon { position: absolute; right: 16px; top: 16px; width: 40px; height: 40px; border-radius: 13px;
  display: flex; align-items: center; justify-content: center; }
.dash-hero { grid-column: 1 / -1; background: #eaf1fe}
.dash-hero .dash-big { font-size: 24px; }

@keyframes winOut { to { opacity: 0; transform: scale(0.94); } }
.st-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 14px; padding-bottom: 10px; border-bottom: 1px solid rgb(236, 236, 238); }
.st-head .st-title { font-size: 17px; font-weight: 700; color: #16202f; }
.st-head .st-hint { font-size: 12px; color: #2563eb; }
.app-card { transition: transform 0.18s cubic-bezier(0.2,0.9,0.3,1.2); }
.app-card:hover { transform: translateY(-3px); }

.st-backmain { background: rgb(230, 239, 254); color: #2563eb; font-weight: 600; padding: 0 16px; height: 32px; }
.st-backmain:hover { background: rgb(212, 228, 253); }
.st-head .st-title { flex: none; margin-right: auto; }

.st-backmain { white-space: nowrap; }

/* ---------- Docker 镜像市场 ---------- */
.mk-bar { display: flex; gap: 8px; }
.mk-bar input { flex: 1; height: 34px; border: 0; border-radius: 10px; padding: 0 12px; font-size: 13px; background: #fff; outline: none; }
.mk-bar input:focus { background: rgb(227, 236, 253); }
.mk-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; }
.mk-chip { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; padding: 10px 12px; border-radius: 12px;
  transition: transform 0.15s ease; }
.mk-chip:hover:not(:disabled) { transform: translateY(-2px); }
.mk-chip b { font-size: 13px; color: #1e2634; }
.mk-chip span { font-size: 10.5px; color: #8a94a8; font-family: ui-monospace, monospace; word-break: break-all; }
.mk-chip i { font-style: normal; font-size: 11px; color: #2563eb; margin-top: 2px; }
.mk-chip:disabled { opacity: 0.75; cursor: default; }

/* ========== v1.6 新增 ========== */
/* ---------- 新壁纸 ---------- */
.wp-night { background:
  radial-gradient(1100px 700px at 20% 18%, rgb(200, 201, 250), transparent 60%),
  radial-gradient(900px 620px at 82% 30%, rgb(231, 207, 253), transparent 60%),
  radial-gradient(1000px 700px at 60% 95%, rgb(195, 233, 250), transparent 60%),
  linear-gradient(160deg, #0f172a 0%, #1e1b4b 50%, #0f172a 100%); }
body.wp-night .desk-icon .di-name { color: #dbe4f3; }
body.wp-night .desk-icon .di-emoji { background: none; }
body.wp-night #topbar { background: rgb(111, 116, 127); border-bottom-color: rgb(255, 255, 255); }
body.wp-night .tb-strong { color: #e2e8f0; }
body.wp-night .tb-item { color: #a7b4c9; }
body.wp-night .tb-item svg path { stroke: #a7b4c9; }
.wp-sakura { background:
  radial-gradient(1100px 700px at 15% 20%, rgb(253, 226, 241), transparent 60%),
  radial-gradient(950px 650px at 85% 15%, rgb(255, 235, 213), transparent 60%),
  radial-gradient(900px 700px at 70% 90%, rgb(250, 226, 254), transparent 60%),
  linear-gradient(160deg, #fff5f7 0%, #fde8ef 55%, #fdf0ff 100%); }
.wp-ocean { background:
  radial-gradient(1100px 700px at 18% 15%, rgb(184, 231, 253), transparent 60%),
  radial-gradient(950px 650px at 85% 25%, rgb(191, 219, 253), transparent 60%),
  radial-gradient(1000px 750px at 55% 95%, rgb(182, 240, 233), transparent 60%),
  linear-gradient(160deg, #eef8ff 0%, #e0f2fe 50%, #e8fbf8 100%); }
.wp-peach { background:
  radial-gradient(1100px 700px at 20% 20%, rgb(255, 228, 210), transparent 60%),
  radial-gradient(950px 650px at 80% 18%, rgb(254, 226, 232), transparent 60%),
  linear-gradient(160deg, #fff7ed 0%, #ffedd5 45%, #ffe4e6 100%); }
.wp-item.wp-night { background: linear-gradient(135deg, #0f172a, #312e81); }
.wp-item.wp-sakura { background: linear-gradient(135deg, #fff5f7, #fbcfe8); }
.wp-item.wp-ocean { background: linear-gradient(135deg, #eef8ff, #7dd3fc); }
.wp-item.wp-peach { background: linear-gradient(135deg, #fff7ed, #fecaca); }
.wp-item.wp-custom { display: flex; align-items: center; justify-content: center; background: rgb(243, 243, 244); border: 2px dashed rgb(212, 213, 217); }
.wp-item.wp-custom .wp-cust-in { text-align: center; font-size: 12px; color: #64748b; line-height: 1.5; }
.wp-item.wp-custom.has { border-style: solid; background: linear-gradient(135deg, #c7d2fe, #93c5fd); color: #fff; }
.wp-item.wp-custom.has .wp-cust-in { color: #fff; }

/* ---------- 文件管理 v1.6 ---------- */
.fm-bar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
.fm-spring { flex: 1; }
.fm-filter { height: 29px; width: 150px; border-radius: 9px; border: 0; background: rgb(255, 255, 255); padding: 0 10px; font-size: 12px; outline: none; }
.fm-filter:focus { background: rgb(227, 236, 253); }
.fm-hidden { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: #64748b; cursor: pointer; }
#f-drop { border: 2px dashed transparent; border-radius: 12px; transition: background 0.15s, border-color 0.15s; }
#f-drop.fm-drag { border-color: rgb(135, 169, 244); background: rgb(241, 246, 254); }
.up-item { display: flex; align-items: center; padding: 8px 12px; border-radius: 10px; background: rgb(255, 255, 255); border: 0; margin-bottom: 6px; font-size: 12px; }
.up-item .up-name { max-width: 40%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #2b3547; }
.up-item .up-pct { width: 38px; text-align: right; color: #2563eb; font-variant-numeric: tabular-nums; }
.up-item.up-fail .up-pct { color: #dc2626; }

/* ---------- 首页概览快捷入口 ---------- */
.dash-quick { margin-top: 12px; display: flex; gap: 8px; flex-wrap: wrap; }
.dash-qbtn { background: rgb(255, 255, 255); border: 0; }

/* ---------- 设置：图标管理 ---------- */
.icon-mgr { display: flex; flex-wrap: wrap; gap: 6px 16px; }
.icon-chk { display: inline-flex; align-items: center; gap: 5px; font-size: 12.5px; color: #2b3547; background: rgb(255, 255, 255); border: 0; border-radius: 9px; padding: 6px 11px; cursor: pointer; }
.icon-chk input { accent-color: #2563eb; }

/* ---------- 通知清空按钮(流内小按钮,不突出面板) ---------- */
#ntf-clear { flex: none; min-height: 24px; padding: 3px 12px; border: 0; border-radius: 8px; background: rgb(238, 239, 240); color: #64748b; font-size: 12px; line-height: 1.2; cursor: pointer; }
#ntf-clear:hover { background: rgb(251, 229, 230); color: #dc2626; }

/* ---------- Ctrl+K 命令面板 ---------- */
#cmdk { position: fixed; inset: 0; z-index: 4000; display: flex; align-items: flex-start; justify-content: center; padding-top: 14vh; background: rgb(195, 197, 202); }
#cmdk .cmdk-panel { width: min(560px, 92vw); background: rgb(255, 255, 255); border-radius: 18px; overflow: hidden; animation: lpIn 0.18s ease; }
#cmdk-in { width: 100%; height: 52px; border: none; border-bottom: 1px solid rgb(236, 236, 238); padding: 0 18px; font-size: 15px; outline: none; background: transparent; color: #1e2634; }
#cmdk-list { max-height: 46vh; overflow: auto; padding: 8px; }
.cmdk-item { padding: 11px 14px; border-radius: 10px; font-size: 13.5px; color: #2b3547; cursor: pointer; }
.cmdk-item.on, .cmdk-item:hover { background: rgb(231, 240, 254); color: #1d4ed8; }
.cmdk-empty { text-align: center; color: #94a3b8; font-size: 12px; padding: 18px 0; }

/* ========== v1.7 ========== */
/* ---------- 首页概览:固定排版公式 ---------- */
.dash-grid2 {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 12px;
}
.dash-grid2 .dash-hero2 { grid-column: 1 / -1; }
.dash-grid2 .dash-card { min-height: 168px; display: flex; flex-direction: column; }
.hero2-head { display: flex; align-items: center; gap: 10px; }
.hero2-head h4 { font-size: 15px; }
.hero2-badge { font-size: 11px; color: #2563eb; background: rgb(235, 243, 254); border-radius: 999px; padding: 3px 10px; }
.hero2-kv { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 8px 14px; margin-top: 10px; }
.hero2-kv .kv { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.hero2-kv .kv span { font-size: 11px; color: #8a94a8; }
.hero2-kv .kv b { font-size: 12.5px; color: #1e2634; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hero2-note { margin-top: 10px; font-size: 11px; color: #b45309; background: rgb(254, 246, 233); border-radius: 8px; padding: 6px 10px; }

/* ---------- 米家 v1.7(米家APP 风格) ---------- */
.mj7-tabs { display: flex; align-items: center; gap: 6px; margin-bottom: 12px; border-bottom: 1px solid rgb(238, 239, 240); padding-bottom: 8px; }
.mj7-tab { border: none; background: transparent; font-size: 13.5px; color: #64748b; padding: 7px 14px; border-radius: 10px; cursor: pointer; }
.mj7-tab.on { background: #2563eb; color: #fff; }
.mj7-spring { flex: 1; }
.mj7-stat { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: #64748b; margin-bottom: 10px; }
.mj7-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 10px; }
.mj7-card { background: rgb(255, 255, 255); border: 0; border-radius: 16px; padding: 13px 14px; display: flex; flex-direction: column; gap: 4px; }
.mj7-card.off { opacity: 0.62; }
.mj7-c-head { display: flex; align-items: center; justify-content: space-between; }
.mj7-c-ico { font-size: 30px; width: 52px; height: 52px; display: flex; align-items: center; justify-content: center; background: linear-gradient(145deg, rgb(232, 240, 255), rgb(234, 251, 253)); border-radius: 15px; }
.mj7-c-name { font-size: 13.5px; font-weight: 600; color: #1e2634; margin-top: 4px; }
.mj7-c-state { font-size: 12px; color: #64748b; }
.mj7-c-siid { font-size: 10.5px; color: #94a3b8; font-family: ui-monospace, monospace; }
.mj7-sw { position: relative; display: inline-block; width: 46px; height: 26px; flex: none; }
.mj7-sw input { opacity: 0; width: 0; height: 0; }
.mj7-sw i { position: absolute; inset: 0; background: #cbd5e1; border-radius: 999px; transition: 0.2s; cursor: pointer; }
.mj7-sw i::before { content: ""; position: absolute; width: 20px; height: 20px; left: 3px; top: 3px; background: #fff; border-radius: 50%; transition: 0.2s; }
.mj7-sw input:checked + i { background: #2563eb; }
.mj7-sw input:checked + i::before { transform: translateX(20px); }
.mj7-sw input:disabled + i { opacity: 0.5; cursor: not-allowed; }
.mj7-login-tip { background: rgb(255, 255, 255); border: 0; border-radius: 16px; padding: 22px; text-align: left; }
.mj7-login-tip h4 { margin-bottom: 8px; font-size: 15px; }
.mj7-tip-sub { font-size: 12px; color: #8a94a8; margin: 8px 0 12px; }
.mj7-gologin { background: #2563eb; color: #fff; }
.mj7-card-ok, .mj7-card-warn { border-radius: 14px; padding: 14px 16px; margin-bottom: 12px; }
.mj7-card-ok { background: rgb(233, 249, 239); border: 0; color: #15803d; }
.mj7-card-warn { background: rgb(254, 245, 231); border: 0; color: #b45309; }
.mj7-login { background: rgb(255, 255, 255); border: 0; border-radius: 16px; padding: 14px 16px; margin-bottom: 10px; }
.mj7-login h4 { font-size: 13.5px; margin-bottom: 10px; color: #1e2634; }
.mj7-l-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.mj7-l-row input { height: 34px; border-radius: 10px; border: 0; background: rgb(255, 255, 255); padding: 0 11px; font-size: 12.5px; outline: none; min-width: 130px; }
.mj7-primary { background: #2563eb; color: #fff; font-weight: 600; }
.mj7-meta { font-size: 12px; color: #64748b; }
.mj7-qrbox { display: flex; justify-content: center; margin-top: 12px; }
.mj7-exp { background: rgb(245, 248, 251); border-radius: 14px; padding: 12px 14px; font-size: 12px; color: #475569; line-height: 1.9; }
.mj7-exp h4 { font-size: 12.5px; color: #1e2634; margin-bottom: 4px; }
.mj7-rule { display: flex; align-items: center; gap: 10px; background: rgb(255, 255, 255); border: 0; border-radius: 14px; padding: 11px 14px; margin-bottom: 8px; }
.mj7-rule.dis { opacity: 0.6; }
.mj7-r-main { flex: 1; min-width: 0; }
.mj7-r-main b { font-size: 13.5px; }
.mj7-r-sub { font-size: 11.5px; color: #8a94a8; margin-top: 3px; }
.mj7-r-acts { display: flex; gap: 6px; align-items: center; }
.mj7-en { font-size: 12px; color: #475569; display: inline-flex; gap: 4px; align-items: center; }
.mj7-en input { accent-color: #2563eb; }
.mj7-newrule { background: rgb(255, 255, 255); border: 1px dashed rgb(179, 200, 248); border-radius: 14px; padding: 14px 16px; margin-top: 12px; }
.mj7-newrule h4 { font-size: 13.5px; margin-bottom: 10px; }
.mj7-frow { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
.mj7-frow > span { font-size: 12.5px; color: #64748b; width: 40px; }
.mj7-frow input, .mj7-frow select { height: 32px; border-radius: 9px; border: 0; background: #fff; padding: 0 10px; font-size: 12.5px; outline: none; }
.mj7-actlist { margin: 4px 0 10px; }
.mj7-actitem { font-size: 12.5px; color: #2563eb; background: rgb(239, 245, 254); border-radius: 8px; padding: 5px 10px; margin: 4px 0; display: flex; justify-content: space-between; align-items: center; }
.mj7-save { background: #15803d; color: #fff; font-weight: 600; }


/* ============================================================
   LeetaNAS v2.0 追加层 — 窗口缩放/磁贴预览/模态框/文件管理v2/应用中心v2/移动端
   ============================================================ */

/* ---------- 窗口缩放手柄 ---------- */
.rz { position: absolute; z-index: 5; }
.rz-n { top: -3px; left: 8px; right: 8px; height: 6px; cursor: ns-resize; }
.rz-s { bottom: -3px; left: 8px; right: 8px; height: 6px; cursor: ns-resize; }
.rz-e { right: -3px; top: 8px; bottom: 8px; width: 6px; cursor: ew-resize; }
.rz-w { left: -3px; top: 8px; bottom: 8px; width: 6px; cursor: ew-resize; }
.rz-ne { top: -3px; right: -3px; width: 12px; height: 12px; cursor: nesw-resize; }
.rz-nw { top: -3px; left: -3px; width: 12px; height: 12px; cursor: nwse-resize; }
.rz-se { bottom: -3px; right: -3px; width: 12px; height: 12px; cursor: nwse-resize; }
.rz-sw { bottom: -3px; left: -3px; width: 12px; height: 12px; cursor: nesw-resize; }
@keyframes winOut { to { opacity: 0; transform: scale(0.96); } }

/* ---------- 磁贴预览 ---------- */
#snap-preview {
  display: none; position: fixed; z-index: 800; pointer-events: none;
  border-radius: 14px;
  background: rgb(224, 233, 252);
  transition: all 0.12s ease;
}

/* ---------- Toast 堆叠 ---------- */
#toast-stack { position: fixed; right: 18px; bottom: 64px; z-index: 1200; display: flex; flex-direction: column; gap: 8px; pointer-events: none; }
.toast-item {
  background: rgb(42, 48, 59); color: #fff; font-size: 13px;
  padding: 10px 16px; border-radius: 12px; max-width: 380px;
  animation: toastIn 0.22s ease;
  transition: opacity 0.35s, transform 0.35s;
}
.toast-item.out { opacity: 0; transform: translateY(6px); }
.toast-item.toast-err { background: rgb(194, 32, 72); }
.toast-item.toast-ok { background: rgb(35, 136, 73); }
@keyframes toastIn { from { opacity: 0; transform: translateY(10px); } }

/* ---------- 模态框 ---------- */
.modal-overlay {
  position: fixed; inset: 0; z-index: 1100; background: rgb(178, 181, 187);
  display: flex; align-items: center; justify-content: center;
  animation: fadeIn 0.14s ease;
}
@keyframes fadeIn { from { opacity: 0; } }
.modal-panel {
  width: min(460px, 92vw); max-height: 86vh; display: flex; flex-direction: column;
  background: rgb(255, 255, 255);
  border-radius: 18px;
  animation: modalIn 0.16s cubic-bezier(0.2, 0.9, 0.3, 1.2);
  overflow: hidden;
}
.modal-panel.modal-wide { width: min(760px, 94vw); }
.modal-panel.closing { opacity: 0; transform: scale(0.97); transition: 0.14s; }
@keyframes modalIn { from { opacity: 0; transform: scale(0.94) translateY(8px); } }
.modal-title {
  display: flex; align-items: center; justify-content: space-between;
  font-size: 14.5px; font-weight: 700; color: #1e2634;
  padding: 15px 18px 12px; border-bottom: 1px solid rgb(241, 241, 242);
}
.modal-x { border: 0; background: rgb(243, 243, 244); width: 26px; height: 26px; border-radius: 8px; cursor: pointer; color: #64748b; }
.modal-x:hover { background: rgb(231, 232, 234); }
.modal-body { padding: 16px 18px; overflow: auto; font-size: 13px; color: #3b4557; }
.modal-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px 16px; }
.modal-btn { min-width: 76px; }
.modal-primary { background: #2563eb; color: #fff; font-weight: 600; }
.modal-danger { background: #dc2626; color: #fff; font-weight: 600; }
.modal-msg { line-height: 1.7; white-space: pre-wrap; }
.modal-warn { color: #b45309; background: rgb(254, 245, 231); border-radius: 10px; padding: 8px 10px; }
.modal-label { display: block; font-size: 12.5px; color: #64748b; margin-bottom: 6px; }
.modal-input {
  width: 100%; height: 38px; border-radius: 10px; border: 0;
  background: #fff; padding: 0 12px; font-size: 13.5px; outline: none;
}
.modal-input:focus { background: #e3ecfd; }
.modal-hint { font-size: 12px; color: #8a94a8; margin-top: 8px; }
.modal-totp-secret { font-family: ui-monospace, monospace; font-size: 15px; letter-spacing: 2px; background: rgb(240, 244, 254); border-radius: 8px; padding: 6px 10px; display: inline-block; margin-top: 4px; }

/* ---------- 命令面板 ---------- */
#cmdk { position: fixed; inset: 0; z-index: 1050; background: rgb(195, 197, 202); display: none; align-items: flex-start; justify-content: center; padding-top: 16vh; }
.cmdk-panel { width: min(520px, 92vw); background: rgb(255, 255, 255); border-radius: 16px; overflow: hidden; animation: modalIn 0.15s ease; }
#cmdk-in { width: 100%; border: 0; border-bottom: 1px solid rgb(238, 239, 240); padding: 15px 18px; font-size: 14.5px; outline: none; background: transparent; }
#cmdk-list { max-height: 320px; overflow: auto; padding: 6px; }
.cmdk-item { padding: 10px 14px; border-radius: 10px; font-size: 13.5px; cursor: pointer; color: #3b4557; }
.cmdk-item.on, .cmdk-item:hover { background: rgb(233, 239, 253); color: #1d4ed8; }
.cmdk-empty { padding: 18px; text-align: center; color: #94a3b8; font-size: 13px; }

/* ---------- 通用小组件 ---------- */
.btn.mini { padding: 3px 8px; font-size: 12px; border-radius: 8px; }
.btn.red { background: rgb(252, 233, 233); color: #dc2626; }
.btn.red:hover { background: rgb(249, 216, 216); }
.ctx-item.danger { color: #dc2626; }
.ctx-item.disabled { opacity: 0.4; pointer-events: none; }
.sel { height: 32px; border-radius: 9px; border: 0; background: #fff; padding: 0 8px; font-size: 12.5px; outline: none; color: #3b4557; }
.fm-spring { flex: 1; }
.fm-sep { width: 1px; height: 22px; background: rgb(231, 232, 234); margin: 0 4px; }
.on-day { background: rgb(222, 232, 252) !important; color: #1d4ed8 !important; font-weight: 600; }
.hw-body { overflow: auto; padding-right: 4px; }

/* ---------- 文件管理 v2 ---------- */
.fm2 { display: flex; height: 100%; min-height: 0; }
.fm2-side { width: 158px; flex: none; border-right: 1px solid rgb(238, 239, 240); padding: 10px 8px; overflow: auto; }
.fm2-side-title { font-size: 11px; color: #94a3b8; margin: 10px 6px 6px; font-weight: 700; letter-spacing: 1px; }
.fm2-side-item {
  display: flex; align-items: center; gap: 7px; font-size: 13px; color: #3b4557;
  padding: 8px 10px; border-radius: 10px; cursor: pointer; margin-bottom: 2px;
}
.fm2-side-item:hover { background: rgb(238, 243, 253); }
.fm2-side-item.on { background: rgb(227, 235, 252); color: #1d4ed8; font-weight: 600; }
.fm2-wr { font-size: 10px; color: #16a34a; background: rgb(228, 248, 236); border-radius: 6px; padding: 1px 5px; margin-left: auto; }
.fm2-main { flex: 1; min-width: 0; display: flex; flex-direction: column; padding: 10px 12px 0 12px; }
.fm-bar, .fm-bar2 { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; flex-wrap: wrap; }
.fm2-crumbbar { flex: 1; min-width: 140px; background: rgb(255, 255, 255); border: 0; border-radius: 10px; padding: 5px 10px; }
.crumb a { color: #2563eb; text-decoration: none; font-size: 12.5px; cursor: pointer; }
.crumb a:hover { text-decoration: underline; }
#f-pathin { width: 100%; border: 0; background: transparent; font-size: 12.5px; outline: none; font-family: ui-monospace, monospace; }
.fm-filter { height: 32px; border-radius: 9px; border: 0; background: #fff; padding: 0 10px; font-size: 12.5px; outline: none; width: 240px; }
.fm-hidden { display: flex; align-items: center; gap: 4px; font-size: 12px; color: #64748b; }
.fm-hidden input { accent-color: #2563eb; }
.fm2-hintbar { font-size: 12px; color: #64748b; background: rgb(242, 246, 254); border-radius: 9px; padding: 6px 12px; margin-bottom: 8px; }
#f-drop { flex: 1; min-height: 0; overflow: auto; border: 2px dashed transparent; border-radius: 12px; padding: 2px; }
#f-drop.fm-drag { border-color: rgb(146, 177, 245); background: rgb(246, 249, 254); }
.fm2-table tr { cursor: default; }
.fm2-selrow { background: rgb(233, 239, 253) !important; }
.fm2-selrow td { border-top: 1px solid rgb(229, 236, 253) !important; border-bottom: 1px solid rgb(229, 236, 253) !important; }
.fm2-empty { text-align: center; color: #94a3b8; padding: 60px 0; font-size: 13px; }
.fm2-searchpath { font-size: 12.5px; color: #475569; word-break: break-all; }
.fm2-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 10px; padding: 6px; }
.fm2-cell { border-radius: 12px; padding: 8px 6px; text-align: center; cursor: default; border: 2px solid transparent; }
.fm2-cell:hover { background: rgb(242, 246, 254); }
.fm2-cell.sel { background: rgb(229, 236, 253); }
.fm2-thumb { width: 78px; height: 58px; border-radius: 8px; background-size: cover; background-position: center; margin: 0 auto; background-color: rgb(241, 241, 242); }
.fm2-thumb-ico { font-size: 34px; line-height: 58px; }
.fm2-cell-name { font-size: 11.5px; color: #3b4557; margin-top: 5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.up-item { display: flex; align-items: center; padding: 6px 10px; background: rgb(244, 247, 254); border-radius: 9px; margin-bottom: 5px; font-size: 12.5px; }
.up-name { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.up-pct { font-size: 12px; color: #2563eb; min-width: 34px; text-align: right; }
.up-item.up-fail .up-pct { color: #dc2626; }
.fm2-lightbox { text-align: center; }
.fm2-lightbox img { max-width: 100%; max-height: 62vh; border-radius: 12px; }
.fm2-player { text-align: center; }
.fm2-player video { max-width: 100%; max-height: 60vh; border-radius: 12px; background: #000; }
.fm2-player audio { width: 100%; }
.fm2-pdf { width: 100%; height: 64vh; border: 0; border-radius: 10px; background: rgb(241, 241, 242); }
.fm2-editwrap textarea.fm2-editor {
  width: 100%; min-height: 320px; border-radius: 10px; border: 0;
  background: #fff; padding: 12px; font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  font-size: 12.5px; line-height: 1.6; outline: none; resize: vertical; white-space: pre;
}
.fm2-detailgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }

/* ---------- 应用中心 v2 ---------- */
.st2-grid { display: flex; flex-direction: column; gap: 10px; }
.st2-card {
  display: flex; align-items: center; gap: 14px; padding: 14px 16px;
  background: rgb(255, 255, 255); border: 0;
  border-radius: 16px;
}
.st2-card.st2-dim { opacity: 0.62; }
.st2-ico { font-size: 30px; flex: none; }
.st2-main { flex: 1; min-width: 0; }
.st2-name { font-weight: 700; font-size: 14px; color: #1e2634; }
.st2-acts { display: flex; gap: 6px; flex: none; }

/* ---------- 首页 v2 ---------- */
.dash-grid2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 12px; }
.dash-card { background: rgb(255, 255, 255); border: 0; border-radius: 16px; padding: 14px 16px; }
.dash-hero2 { grid-column: span 2; }
.dash-icon { width: 34px; height: 34px; border-radius: 10px; display: flex; align-items: center; justify-content: center; margin-bottom: 8px; }
.dash-big { font-size: 30px; font-weight: 700; color: #1e2634; line-height: 1.2; }
.dash-big small { font-size: 14px; color: #8a94a8; font-weight: 400; }
.hero2-head { display: flex; align-items: baseline; gap: 10px; }
.hero2-head h4 { font-size: 19px; }
.hero2-badge { font-size: 11.5px; color: #16a34a; background: rgb(228, 248, 236); padding: 2px 9px; border-radius: 999px; }
.hero2-kv { margin: 12px 0; display: grid; grid-template-columns: 1fr 1fr; gap: 6px 16px; }
.hero2-kv .kv { display: flex; justify-content: space-between; font-size: 12.5px; border-bottom: 1px dashed rgb(236, 236, 238); padding: 4px 0; }
.hero2-kv .kv span { color: #8a94a8; }
.hero2-kv .kv b { color: #3b4557; font-weight: 600; max-width: 62%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hero2-note { font-size: 11.5px; color: #b45309; background: rgb(254, 246, 233); border-radius: 9px; padding: 6px 10px; margin-top: 10px; }
.dash-quick { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 12px; }
.dash-qbtn { font-size: 12.5px; }

/* ---------- 设置页补充 ---------- */
/* 容器管理 v2.4(Portainer/Dockge 式) */
.dk-stats { display: flex; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
.dk-stat { background: #f1f4f9; border-radius: 10px; padding: 7px 14px; display: flex; gap: 8px; align-items: baseline; }
.dk-stat span { font-size: 12px; color: #64748b; }
.dk-stat b { font-size: 14px; color: #1e2634; }
.dk-stat.hot { background: #e3f6ec; }
.dk-stat.hot b { color: #15803d; }
.dk-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
.dk-tabs { display: flex; gap: 6px; }
.dk-tab { border: 0; border-radius: 9px; background: #eef1f6; color: #4b5563; font-size: 13px; padding: 6px 16px; cursor: pointer; }
.dk-tab.on { background: #2563eb; color: #fff; font-weight: 600; }
.dk-tools { display: flex; gap: 8px; align-items: center; }
.dk-search { width: 200px; padding: 6px 12px; border-radius: 9px; border: 0; background: #eef1f6; font-size: 13px; outline: none; }
.dk-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
.dk-card { background: #f6f8fb; border-radius: 14px; padding: 12px 14px; display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.dk-card.off { background: #f1f2f4; }
.dk-card-top { display: flex; align-items: center; gap: 8px; position: relative; padding-right: 58px; }
.dk-dot { width: 9px; height: 9px; border-radius: 50%; flex: none; background: #94a3b8; }
.dk-dot.running { background: #16a34a; }
.dk-dot.paused { background: #d97706; }
.dk-name { font-size: 14px; color: #1e2634; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dk-statebadge { position: absolute; right: 0; top: 50%; transform: translateY(-50%); }
.dk-img { font-size: 11.5px; color: #8a94a8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dk-met { display: flex; gap: 6px; flex-wrap: wrap; }
.dk-pill { background: #fff; border-radius: 7px; padding: 3px 9px; font-size: 11.5px; color: #3b4557; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dk-acts { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 2px; }
.dk-subbar { display: flex; align-items: center; justify-content: space-between; margin: 12px 0 6px; }
.dk-subtitle { font-size: 12.5px; color: #64748b; }
.dk-cat { border: 0; border-radius: 999px; background: #eef1f6; color: #4b5563; font-size: 12px; padding: 4px 13px; cursor: pointer; }
.dk-cat.on { background: #2563eb; color: #fff; }
.mkt-card { text-align: left; border: 0; border-radius: 12px; background: #f6f8fb; padding: 11px 13px; cursor: pointer; display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.mkt-card:hover { background: #e9effb; }
.mkt-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.mkt-head b { font-size: 13px; color: #1e2634; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mkt-port { flex: none; font-size: 11px; color: #2563eb; background: #e3ecfd; border-radius: 6px; padding: 1px 7px; }
.mkt-name { font-size: 11px; color: #8a94a8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 设置中心标签导航(v2.3 fnOS 式) */
.set-tabs { display: flex; gap: 6px; margin-bottom: 14px; flex-wrap: wrap; }
.set-tab { border: 0; border-radius: 9px; background: #eef1f6; color: #4b5563; font-size: 13px; padding: 7px 16px; cursor: pointer; }
.set-tab:hover { background: #e3ecfd; }
.set-tab.on { background: #2563eb; color: #fff; font-weight: 600; }
.um-form { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.mono { font-family: ui-monospace, Consolas, monospace; font-size: 11.5px; color: #64748b; }

/* 壁纸选择 v2.2:缩略图网格(3 列宽松版) */
.wp-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.wp-tile { border: 0; background: none; padding: 0; cursor: pointer; text-align: center; }
.wp-tile .wp-thumb { display: block; width: 100%; aspect-ratio: 3 / 2; border-radius: 10px; background-size: cover; background-position: center; }
.wp-tile.on .wp-thumb { outline: 3px solid #2563eb; outline-offset: 2px; }
.wp-tname { display: block; font-size: 12.5px; color: #4b5563; margin-top: 6px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wp-tile.on .wp-tname { color: #1d4ed8; font-weight: 600; }
/* 桌面图标管理 v2.2:对齐网格 + 勾选状态 */
.im-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.im-tile { border: 0; border-radius: 10px; background: #eef1f6; color: #2b3547; cursor: pointer; padding: 8px 6px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 3px; }
.im-tile:hover { background: #e3ecfd; }
.im-tile .im-state { font-size: 11px; color: #1d4ed8; font-weight: 700; min-height: 14px; }
.im-tile .im-name { font-size: 12px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.im-tile.off { background: #f4f6f9; color: #94a3b8; }
.im-tile.off .im-state { color: #94a3b8; font-weight: 400; }
@media (max-width: 560px) { .wp-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; } .im-grid { grid-template-columns: repeat(3, 1fr); } }
.wp-custom-thumb { background-color: #eef1f6; display: flex; align-items: center; justify-content: center; font-size: 20px; color: #94a3b8; }
.wp-thumb.wp-aurora { background-image: linear-gradient(135deg, #eef4ff, #cfe0fb); }
.wp-thumb.wp-sunset { background-image: linear-gradient(135deg, #fff4ea, #fbd5e8); }
.wp-thumb.wp-forest { background-image: linear-gradient(135deg, #effcf3, #bdeedd); }
.wp-thumb.wp-mono { background-image: linear-gradient(135deg, #f4f6f9, #cfd6e0); }
.wp-thumb.wp-night { background-image: linear-gradient(135deg, #0f172a, #312e81); }
.wp-thumb.wp-sakura { background-image: linear-gradient(135deg, #fff5f7, #fbcfe8); }
.wp-thumb.wp-ocean { background-image: linear-gradient(135deg, #eef8ff, #7dd3fc); }
.wp-thumb.wp-peach { background-image: linear-gradient(135deg, #fff7ed, #fecaca); }
.wp-picker { display: flex; flex-wrap: wrap; gap: 8px; }
.wp-chip { padding: 7px 14px; border-radius: 10px; border: 0; background: #fff; font-size: 12.5px; cursor: pointer; color: #3b4557; }
.wp-chip.on { border-color: #2563eb; color: #1d4ed8; font-weight: 700; }
.setting-row { margin-bottom: 14px; }
.setting-row > h4 { font-size: 13px; color: #1e2634; margin-bottom: 7px; }

/* ---------- 米家迁移补充 ---------- */
.mj7-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px; margin-bottom: 14px; }
.mj7-card { display: flex; gap: 10px; align-items: center; background: rgb(255, 255, 255); border: 0; border-radius: 14px; padding: 12px; }
.mj7-ico { font-size: 26px; flex: none; }
.mj7-name { font-weight: 700; font-size: 13.5px; }
.mj7-act { margin-left: auto; }
.mj7-act .btn { font-size: 11.5px; padding: 4px 9px; }
.mj7-kv { display: flex; justify-content: space-between; gap: 10px; font-size: 12.5px; padding: 5px 0; border-bottom: 1px dashed rgb(238, 239, 240); }
.mj7-kv span { color: #8a94a8; }
.mj7-kv b { color: #3b4557; font-weight: 600; word-break: break-all; text-align: right; }
.mj7-tabs { display: flex; gap: 4px; align-items: center; margin-bottom: 4px; }
.mj7-tab { border: 0; background: transparent; padding: 8px 13px; font-size: 13px; color: #64748b; cursor: pointer; border-radius: 10px; }
.mj7-tab:hover { background: rgb(240, 244, 254); }
.mj7-tab.on { background: rgb(227, 235, 252); color: #1d4ed8; font-weight: 700; }
.mj7-spring { flex: 1; }
.mj7-login-tip { background: rgb(255, 255, 255); border: 0; border-radius: 16px; padding: 22px; }
.mj7-login-tip h4 { margin-bottom: 8px; font-size: 15px; }
.mj7-tip-sub { font-size: 12px; color: #8a94a8; margin: 8px 0 12px; }
.mj7-gologin { background: #2563eb; color: #fff; }

/* ---------- v2.1 纯色结构层(描边/阴影/羽化移除后用底色区分层次) ---------- */
.window { background: #fff; }
.win-title { background: #f4f6f9; }
.stat-card, .dash-card, .mj7-card, .st2-card, .svc-row, .app-card { background: #f8fafc; }
.hw-note { background: #f4f6f9; border-radius: 10px; padding: 8px 12px; }
.mj7-kv { border-bottom: 0; background: #f4f6f9; border-radius: 8px; padding: 6px 10px; margin-bottom: 4px; }
.hero2-kv .kv { border-bottom: 0; }
.fm2-side { background: #f6f8fb; }
.fm2-side-item.on { background: #e3ecfd; }
.fm2-crumbbar { background: #f6f8fb; }
.fm2-hintbar { background: #eaf1fe; }
table.list th { background: #f4f6f9; }
table.list tbody tr:hover { background: #f4f6f9; }
.fm2-selrow, .fm2-selrow td { background: #e3ecfd !important; }
input, select, textarea { background: #eef1f6; }
input:focus, select:focus, textarea:focus { background: #e3ecfd; outline: none; }
.modal-input, .fm-filter, .sel, .fm2-editor, #cmdk-in { border: 0; }
.btn { background: #eef1f6; }
.btn:hover { background: #e3ecfd; }
.tab.on { background: #e3ecfd; }
.mk-chip { background: #f8fafc; }
.mk-chip:hover { background: #e3ecfd; }
.wp-chip.on { box-shadow: none; background: #e3ecfd; }
#start-menu, #notify-panel, .ctx-menu { background: #fff; }
.badge { background: #e2e8f0; color: #475569; }
.badge.running { background: #dcfce9; color: #15803d; }
.badge.exited { background: #fdeaea; color: #b91c1c; }
.badge.paused, .badge.created { background: #fdf3d7; color: #b45309; }
.st2-ico { background: #fff; }

/* 应用中心卡片 v2.1:徽章右上角 + 对齐结构 */
.st2-card { position: relative; display: flex; align-items: center; gap: 14px; min-height: 84px; padding: 16px 18px; border-radius: 14px; }
.st2-badge { position: absolute; top: 12px; right: 14px; }
.st2-ico { width: 50px; height: 50px; flex: none; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 26px; }
.st2-main { flex: 1; min-width: 0; padding-right: 64px; }
.st2-name { font-weight: 700; font-size: 14px; color: #1e2634; }
.st2-desc { font-size: 12px; color: #7c8aa0; margin-top: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.st2-meta { font-size: 12px; color: #2563eb; margin-top: 4px; }
.st2-meta a { color: #2563eb; }
.st2-acts { display: flex; flex-direction: column; gap: 6px; flex: none; }
.st2-acts .btn { min-width: 84px; }

/* ---------- 移动端(≤820px) ---------- */
@media (max-width: 820px) {
  #topbar { gap: 8px; padding: 0 10px; }
  .tb-item { display: none !important; }
  #top-host, #top-clock { display: block !important; }
  #icons { grid-template-columns: repeat(auto-fill, minmax(72px, 1fr)) !important; }
  .window { border-radius: 0 !important; }
  .win-title { padding: 8px 12px; }
  .win-body { padding: 10px !important; }
  #dock { bottom: 6px; padding: 6px 8px; gap: 5px; border-radius: 16px; }
  #dock-items { overflow-x: auto; scrollbar-width: none; }
  #dock-items::-webkit-scrollbar { display: none; }
  .dock-item, #start-btn { width: 38px; height: 38px; border-radius: 11px; }
  #dock-tip { display: none !important; }
  .dock-sep { height: 30px; }
  .fm2 { flex-direction: column; }
  .fm2-side { width: 100%; display: flex; gap: 6px; overflow-x: auto; border-right: 0; border-bottom: 1px solid rgb(238, 239, 240); padding: 6px; }
  .fm2-side-title { display: none; }
  .fm2-side-item { flex: none; margin: 0; }
  .fm2-main { padding: 8px 4px 0; }
  .fm-filter { width: 100%; }
  .dash-hero2 { grid-column: span 1; }
  .dash-grid2 { grid-template-columns: 1fr 1fr; }
  .dash-big { font-size: 22px; }
  .hero2-kv { grid-template-columns: 1fr; }
  .mk-grid { grid-template-columns: 1fr 1fr !important; }
  .st2-card { flex-direction: column; align-items: flex-start; }
  .st2-acts { width: 100%; }
  .mj7-grid { grid-template-columns: 1fr; }
  .modal-panel { width: 94vw; }
}

/* ===== v2.6 视觉升级层(Kimi K3 设计,fnOS + iOS 融合;追加覆盖,保留历史层) ===== */

.di,.desk-icon{width:104px;padding:12px 4px 9px;border-radius:16px;text-align:center;cursor:pointer;transition:background .15s}
.di:hover,.desk-icon:hover{background:rgba(255,255,255,.55)}

#dock{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);display:flex;align-items:flex-end;gap:14px;padding:10px 16px;background:#f7f8fa;border:1px solid rgba(15,23,42,.06);border-radius:22px;box-shadow:var(--sh);z-index:500;max-width:calc(96vw - 16px)}
#dock-items{display:flex;align-items:flex-end;gap:14px;overflow:visible}
.dock-item{width:46px;height:46px;flex:none;border:0;border-radius:14px;background:#eceff3;color:#3b4557;cursor:pointer;display:flex;align-items:center;justify-content:center;position:relative;transform-origin:bottom center;transition:background .15s}
.dock-item:hover{background:#e2e7ee}
.dock-item.focused{background:var(--blue-soft);color:var(--blue)}

.window{border-radius:var(--r-win);border:1px solid rgba(15,23,42,.07);box-shadow:0 1px 2px rgba(16,24,40,.05),0 10px 30px rgba(16,24,40,.08);background:#fff}

.win-x:hover,.wb:hover{background:var(--f3)}
.wb.close:hover,.win-x.close:hover,.win-x:last-child:hover{background:#e93a4b;color:#fff}

.btn{height:32px;padding:0 14px;border-radius:10px;background:var(--f2);color:var(--t1);font-size:12.5px;font-weight:500;transition:background .15s,transform .12s}
.btn:hover{background:var(--f3)}
.btn:active{transform:scale(.96)}
.btn.mini{height:26px;padding:0 10px;font-size:11.5px;border-radius:8px}
.btn.red{background:var(--red-bg);color:var(--red)}
.btn.red:hover{background:rgba(220,38,38,.16)}

table.list{font-size:13px}
table.list th{padding:10px 12px;font-weight:500;font-size:12px;color:var(--t3);border-bottom:1px solid var(--line)}
table.list td{padding:11px 12px;border-bottom:1px solid rgba(15,23,42,.045)}
table.list tr:hover td{background:#f6f9ff}
table.list tr:last-child td{border-bottom:0}

.badge{padding:3px 10px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.2px}
.badge.running{background:rgba(22,163,74,.12);color:#15803d}
.badge.exited{background:rgba(100,116,139,.12);color:#64748b}
.badge.created,.badge.paused{background:rgba(217,119,6,.14);color:#b45309}

input,select{border:1px solid rgba(15,23,42,.08);background:#fff;border-radius:10px;height:36px;padding:0 12px;font-size:13px;color:var(--t1);outline:none;transition:border-color .15s,box-shadow .15s,background .15s;font-family:inherit}
input:focus,select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(37,99,235,.14)}

.tabs{gap:4px;border-bottom:0;background:var(--f2);padding:4px;border-radius:12px;display:inline-flex}

.tabs,.set-tabs{display:inline-flex;flex-wrap:wrap;gap:2px;padding:3px;background:var(--f2);border:0;border-radius:12px}
.tab,.set-tab,.dk-tab{height:30px;padding:0 15px;border:0;border-radius:9px;background:transparent;color:var(--t2);font-size:12.5px;font-weight:500;cursor:pointer}
.tab:hover,.set-tab:hover,.dk-tab:hover{color:var(--t1);background:rgba(255,255,255,.6)}
.tab.on,.set-tab.on,.dk-tab.on{background:#fff;color:var(--t1);font-weight:600;box-shadow:0 1px 2px rgba(16,24,40,.08),0 0 0 1px rgba(15,23,42,.04)}

.dk-card,.dk-stat,.stat-card,.mkt-card,.app-card{background:#fff;border:1px solid rgba(15,23,42,.05);border-radius:16px;box-shadow:0 1px 2px rgba(16,24,40,.04)}

.um-form{display:flex;flex-direction:column;gap:12px;max-width:420px}
.um-form label{font-size:12.5px;color:var(--t2);font-weight:500}

.setting-row{background:#fff;border:1px solid rgba(15,23,42,.05);border-radius:16px;padding:16px 18px;margin-bottom:14px}
.setting-row h4{font-size:13px;font-weight:600;color:var(--t1);margin-bottom:12px}

::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:rgba(15,23,42,.18);border-radius:99px;border:2px solid transparent;background-clip:content-box}
::-webkit-scrollbar-thumb:hover{background:rgba(15,23,42,.3);background-clip:content-box;border:2px solid transparent}
::-webkit-scrollbar-track{background:transparent}

#login-card,.login-card{width:360px;padding:48px 40px 30px;border-radius:24px;background:#fff;border:1px solid rgba(15,23,42,.06);box-shadow:0 1px 2px rgba(16,24,40,.05),0 16px 48px rgba(16,24,40,.10)}

#login-btn{height:46px;border-radius:14px;font-weight:600;letter-spacing:6px}
.login-avatar{border-radius:24px}

input:not([type=checkbox]):not([type=radio]):not([type=range]),select{height:36px;padding:0 12px;border:1px solid transparent;border-radius:10px;background:var(--f2);color:var(--t1);font-size:13px;font-family:inherit;outline:none;transition:background .15s,border-color .15s,box-shadow .15s}

input:not([type=checkbox]):not([type=radio]):not([type=range]),select{border:1px solid transparent;border-radius:10px;background:var(--f2);color:var(--t1);font-family:inherit;outline:none;transition:background .15s,border-color .15s,box-shadow .15s}

.mj-actions input:not([type=checkbox]):not([type=radio]):not([type=range]){height:28px}

:root{
  --blue:#2563eb;--blue-d:#1d4ed8;--blue-soft:rgba(37,99,235,.1);--blue-soft2:rgba(37,99,235,.16);--ring:0 0 0 3px rgba(37,99,235,.13);
  --t1:#1c2433;--t2:#4d5a72;--t3:#8b96ab;
  --f1:#f3f5f8;--f2:#edf0f4;--f3:#e2e7ee;--line:rgba(15,23,42,.07);
  --green:#16a34a;--green-bg:rgba(22,163,74,.12);--red:#dc2626;--red-bg:rgba(220,38,38,.1);--amber:#b45309;--amber-bg:rgba(217,119,6,.13);
  --r-s:9px;--r-c:10px;--r-card:16px;--r-win:18px;
  --sh:0 1px 2px rgba(16,24,40,.06);--sh-pop:0 1px 2px rgba(16,24,40,.05),0 10px 28px rgba(16,24,40,.09);
}

.di,.desk-icon{border-radius:16px;transition:background .15s}
.di:hover,.desk-icon:hover{background:rgba(255,255,255,.5)}
.di:active,.desk-icon:active{background:rgba(255,255,255,.65)}
.desk-icon .di-emoji,.di .di-emoji{border-radius:20px}
.desk-icon:hover .di-emoji{transform:scale(1.05)}
.di-name,.desk-icon .di-name{display:inline-block;margin-top:8px;padding:2px 9px;border-radius:8px;font-size:12px;color:#2b3547;background:rgba(255,255,255,.55)}
body.wp-night .di-name{background:rgba(15,23,42,.35);color:#e6ecf5}

#dock{bottom:14px;gap:12px;padding:9px 14px;background:#f8f9fb;border:1px solid rgba(15,23,42,.06);border-radius:22px;box-shadow:var(--sh-pop)}
#dock-items{gap:12px}
.dock-item{width:46px;height:46px;border-radius:14px;background:#e9edf2;color:#3d4a5f}
.dock-item:hover{background:#dfe5ec}
.dock-item.focused{background:var(--blue-soft);color:var(--blue)}
.dock-start{background:var(--blue);color:#fff}
.dock-start:hover{background:var(--blue-d)}
.dock-item .dock-dot{bottom:-5px;width:4px;height:4px;background:#7d8aa0}
.dock-sep{height:34px;background:var(--line)}
#dock-tip{background:#1c2433;border-radius:10px;padding:6px 12px;font-weight:500}

.window{border-radius:var(--r-win);border:1px solid rgba(15,23,42,.08);box-shadow:var(--sh-pop)}
.win-head,.win-title{height:46px;background:#fbfbfc;border-bottom:1px solid rgba(15,23,42,.05)}
.window.focused .win-title{background:#fbfbfc}
.win-btns{height:46px}
.win-x,.wb{width:46px;height:46px;color:#5b6a82}
.win-x:hover,.wb:hover{background:var(--f2)}
.wb.close:hover,.win-x:last-child:hover{background:#e23c31;color:#fff}
.win-title .win-name,.win-head .win-title{font-size:13px;font-weight:600;color:#33405a}
.window:not(.focused) .win-name{color:var(--t3)}
.win-body{padding:18px 20px;font-size:13px;color:var(--t2)}

.btn{height:32px;padding:0 14px;border-radius:var(--r-c);background:var(--f2);color:#33405a;font-size:12.5px;font-weight:500}
.btn:hover{background:var(--f3)}
.btn.mini{height:26px;padding:0 10px;font-size:12px;border-radius:8px}
.btn.red{background:var(--red-bg);color:var(--red)}
.btn.red:hover{background:rgba(220,38,38,.16)}
.btn.blue,.btn.primary{background:var(--blue);color:#fff}
.btn.blue:hover,.btn.primary:hover{background:var(--blue-d)}

table.list{font-size:13px}
table.list th{padding:10px 12px;font-size:12px;font-weight:500;color:var(--t3);border-bottom:1px solid var(--line)}
table.list td{padding:11px 12px;border-bottom:1px solid rgba(15,23,42,.045);color:#33405a}
table.list tr:last-child td{border-bottom:0}
table.list tr:hover td{background:#f5f8fe}

.badge{padding:3px 10px;border-radius:999px;font-weight:600;font-size:11px}
.badge.running{background:var(--green-bg);color:#15803d}
.badge.exited{background:rgba(100,116,139,.13);color:#64748b}
.badge.created,.badge.paused{background:var(--amber-bg);color:var(--amber)}

input:not([type=checkbox]):not([type=radio]):not([type=range]),select{min-height:32px;padding:0 12px;border:1px solid transparent;border-radius:var(--r-c);background:var(--f2);color:var(--t1);font-size:13px;font-family:inherit;outline:none;transition:background .15s,border-color .15s,box-shadow .15s}
input:not([type=checkbox]):not([type=radio]):not([type=range]):focus,select:focus{background:#fff;border-color:var(--blue);box-shadow:var(--ring)}
input::placeholder{color:var(--t3)}

.tabs,.set-tabs{display:inline-flex;gap:2px;padding:3px;background:var(--f2);border:0;border-radius:12px}
.tab,.set-tab,.dk-tab{height:30px;padding:0 15px;border:0;border-radius:9px;background:transparent;color:var(--t2);font-size:12.5px;font-weight:500}
.tab:hover,.set-tab:hover,.dk-tab:hover{background:rgba(255,255,255,.55);color:var(--t1)}
.tab.on,.set-tab.on,.dk-tab.on{background:#fff;color:var(--t1);font-weight:600;box-shadow:var(--sh)}

.dk-card{background:#f7f8fa;border:1px solid rgba(15,23,42,.04);border-radius:14px;padding:14px 16px}
.dk-stat{display:inline-flex;align-items:center;gap:6px;background:var(--f2);border-radius:10px;padding:6px 12px;font-size:12px;font-weight:500;color:var(--t2)}
.stat-card,.mkt-card,.app-card,.mj-card,.dash-card{background:#fff;border:1px solid rgba(15,23,42,.05);border-radius:var(--r-card);box-shadow:var(--sh)}
.app-card:hover,.mkt-card:hover{transform:translateY(-2px)}
.stat-big{font-weight:700}

.setting-row{background:#f7f8fa;border:1px solid rgba(15,23,42,.04);border-radius:var(--r-card);padding:16px 18px;margin-bottom:14px}
.setting-row h4{font-size:13px;font-weight:600;color:var(--t1)}
.wp-item{border-radius:12px;transition:transform .15s,box-shadow .15s,border-color .15s}
.wp-item:hover{transform:translateY(-2px)}
.wp-item.sel{border-color:var(--blue);box-shadow:var(--ring)}
.um-form{display:flex;flex-direction:column;gap:10px;max-width:460px}
.um-form label{font-size:12.5px;font-weight:500;color:var(--t2)}
.um-form .btn{align-self:flex-start}

::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:rgba(15,23,42,.16);border:2px solid transparent;border-radius:99px;background-clip:content-box}
::-webkit-scrollbar-thumb:hover{background:rgba(15,23,42,.28);border:2px solid transparent;background-clip:content-box}
::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background:transparent}

#login-card,.login-card{width:356px;padding:46px 38px 28px;border-radius:26px;border:1px solid rgba(15,23,42,.06);box-shadow:var(--sh-pop)}
.login-avatar{border-radius:24px}
.login-card input,.login-card input{height:46px;border-radius:12px}  /* old has 44; minor */
#login-btn{border-radius:14px;letter-spacing:6px}

#topbar{background:#fbfbfc;border-bottom:1px solid rgba(15,23,42,.05)}
#toast,#notify-panel,#ctx-menu{border:1px solid rgba(15,23,42,.06);box-shadow:var(--sh-pop)}
.ntf-item{background:#f4f6f8}
::selection{background:rgba(37,99,235,.18)}
button:focus-visible{outline:none;box-shadow:var(--ring)}
.hw-sec>h3::before{background:var(--blue)}
.mj-emoji{background:var(--blue-soft)}
.bar>i{border-radius:99px}
.bar{border-radius:99px;background:var(--f2)}

/* v2.6.1 收尾修正:统一 iOS 白卡 + tab 容器胶囊 */
.setting-row{background:#fff;border:1px solid rgba(15,23,42,.05);border-radius:16px;padding:16px 18px;margin-bottom:14px}
.setting-row h4{font-size:13px;font-weight:600;color:var(--t1);margin-bottom:12px}
.tabs,.set-tabs,.dk-tabs{display:inline-flex;flex-wrap:wrap;gap:2px;padding:3px;background:var(--f2);border:0;border-radius:12px}
.dk-tools .dk-search{background:#fff}

/* ===== v2.7 修复层(DS 起草 → MiniMax-M3 审查修正 → 定稿)===== */
:root{--t3:#6d7a90}
.login-foot,.ntf-time,.svc-note{color:#5f6b80}
.win-title{position:relative;display:flex;align-items:center}
.win-title .win-name{position:absolute;left:50%;top:0;height:46px;display:flex;align-items:center;transform:translateX(-50%);max-width:calc(100% - 200px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.win-icon{flex:0 0 auto;position:relative;z-index:1}
.win-btns{position:absolute;right:0;top:0;height:46px;margin:0;z-index:1}
#login-btn{text-indent:6px}
.di-name,.desk-icon .di-name{background:rgba(255,255,255,.85);color:#1c2433}
body.wp-night .di-name,body.wp-night .desk-icon .di-name{background:rgba(15,23,42,.35);color:#e6ecf5}
.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:48px 20px}
.empty-state>.es-icon,.empty-state>.empty-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin-bottom:14px;border-radius:18px;background:var(--f2);font-size:28px}
.empty-state>h3,.empty-state>.es-title{font-size:15px;font-weight:600;color:var(--t1);margin:0 0 6px}
.empty-state>p,.empty-state>.es-desc{font-size:13px;color:var(--t3);margin:0;max-width:300px;line-height:1.6}
.empty-state>.btn,.empty-state>button{margin-top:14px}
.btn.primary,.btn.blue{background:var(--blue);color:#fff;font-weight:500}
.btn.primary:hover,.btn.blue:hover{background:var(--blue-d)}
.btn.primary:active,.btn.blue:active{background:#1e40af}
.dock-item{transition:transform .08s linear,background .08s linear,color .08s linear}
.dock-item:active{transform:scale(.92)}
.wp-item{border:2px solid transparent;box-sizing:border-box;border-radius:12px}
.wp-item.sel{border:2px solid var(--blue);box-shadow:none}
.wp-item.wp-custom{border:2px dashed rgba(15,23,42,.2)}
.wp-item.wp-custom.sel{border-style:solid;border-color:var(--blue)}
#notify-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:36px 16px}
#notify-empty::before{content:"🔔";font-size:30px;margin-bottom:8px}
#login-user,#login-pass{height:36px;padding:0 12px;border:1px solid rgba(15,23,42,.1);border-radius:10px;background:#fff;color:var(--t1);font-size:13px}
#login-user:focus,#login-pass:focus{border-color:var(--blue);box-shadow:var(--ring)}
.dk-stat b,.dk-stat strong{font-weight:600;color:var(--t1);font-variant-numeric:tabular-nums}
.dk-stat.hot b,.dk-stat.hot strong{color:var(--green)}
.dk-search,#app-search{font-size:13px}
.win-title .win-name,.tab,.set-tab,.dk-tab{font-weight:600}
.setting-row h4,.empty-state>h3,.stat-big{font-size:15px}
/* v2.7.1 focus ring 补遗 */
input:not([type=checkbox]):not([type=radio]):not([type=range]):focus,select:focus,textarea:focus{border-color:var(--blue);box-shadow:var(--ring);outline:none}

/* ===== v2.8 层:自适应容器行卡(Portainer 式) + 统一点击动画 + 排版整理 ===== */
/* Docker:Portainer 式单列行卡(任意数量都满宽,无右侧空旷) */
.dk-grid{grid-template-columns:1fr;gap:10px}
.dk-card{flex-direction:row;flex-wrap:wrap;align-items:center;gap:8px 14px;min-height:0}
.dk-card .dk-card-top{flex:1 1 200px;min-width:180px;padding-right:58px}
.dk-card .dk-img{flex:1 1 240px;min-width:200px}
.dk-card .dk-met{flex:2 1 320px;align-items:center}
.dk-card .dk-acts{margin:0;flex:0 0 auto;margin-left:auto}
.dk-card .dk-met{flex:1;align-items:center}
.dk-acts{margin-top:auto;justify-content:flex-end}
.dk-card{min-height:132px}
.dk-stat{background:var(--f2);border-radius:999px;padding:5px 13px;font-size:12px}
.dk-stat b{font-weight:600;color:var(--t1)}
.dk-stat.hot b{color:var(--green)}
.dk-tools{gap:8px;flex-wrap:wrap}
.dk-quickrow{display:flex;gap:8px;flex-wrap:wrap}
.dk-quickrow .mk-chip{background:var(--f2);border-radius:999px;padding:5px 13px;font-size:12px;color:var(--t2)}
.dk-quickrow .mk-chip:hover{background:var(--blue-soft);color:var(--blue)}

/* 统一点击动画:所有可交互元素(同曲线同时长,按下一致反馈) */
.btn,.btn.mini,.dk-tab,.tab,.set-tab,.dk-cat,.mk-chip,.ctx-item,.dock-item,.wb,.win-x,.mkt-card,.app-card,.wp-item,.ntf-item,.dm-item,.modal-btn,.sel,
.list tbody tr,.svc-row,.di,.desk-icon,.mk-chip,.set-tab,.dock-start,.um-form .btn{
  transition:transform .14s cubic-bezier(.2,.8,.3,1),background .14s cubic-bezier(.2,.8,.3,1),color .14s,box-shadow .14s,border-color .14s;
  -webkit-tap-highlight-color:transparent
}
.btn:active,.btn.mini:active,.dk-tab:active,.tab:active,.set-tab:active,.dk-cat:active,.mk-chip:active,.ctx-item:active,.modal-btn:active,.sel:active{transform:scale(.955)}
.dock-item:active,.dock-start:active{transform:scale(.9)}
.wb:active,.win-x:active{transform:scale(.88)}
.mkt-card:active,.app-card:active,.wp-item:active{transform:scale(.975)}
.list tbody tr:active td,.svc-row:active{background:rgba(37,99,235,.07)}
.di:active,.desk-icon:active{transform:scale(.93)}
.btn:disabled{opacity:.55;pointer-events:none}

/* 排版整理:内容区统一左对齐(仅空态/登录/Dock 保留居中),标题层级更清晰 */
.win-body{text-align:left}
.hw-sec,.mj7-sec,.set-pane,.cs-pane,.fm2-pane{text-align:left}
.hw-sec h3,.mj7-sec h3,.dash-sec h3{font-size:13px;font-weight:600;color:var(--t1);margin:14px 0 8px}
.hw-note,.stat-sub,.sys-line{text-align:left}
.dk-subbar{text-align:left}

/* 空白填充:窗口内容区允许伸展,分区底部不留大空白 */
.win-body{display:flex;flex-direction:column}
.win-body>*{flex:0 0 auto}
.win-body>#dk-body{flex:1 1 auto;min-height:0}
#dk-body{display:flex;flex-direction:column}
#dk-body .dk-grid{flex:0 0 auto}
#dk-imgsum{margin-top:10px;flex:1 1 auto;display:flex;flex-direction:column;justify-content:flex-end}
.empty-state{margin:auto}
/* ===== v2.9 米家生态:云相册网格 ===== */
.mj-album-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px 0}
.mj-album-cell{margin:0;background:#fff;border:1px solid rgba(15,23,42,.05);border-radius:10px;overflow:hidden}
.mj-album-cell img{width:100%;height:96px;object-fit:cover;display:block}
.mj-album-ph{height:96px;display:flex;align-items:center;justify-content:center;background:var(--f2);font-size:24px}
.mj-album-cell figcaption{padding:6px 8px;font-size:11px;color:var(--t2);display:flex;justify-content:space-between;gap:4px}
.mj-album-cell figcaption span{color:#8b96ab}

/* v2.9 米家卡片全属性 */
.mj7-card{grid-column:span 1}
.mj7-kvs{display:grid;grid-template-columns:1fr 1fr;gap:4px 10px;margin:6px 0}
.mj7-kvs:empty{display:none}
.mj7-kv{display:flex;justify-content:space-between;font-size:11px;color:var(--t2)}
.mj7-kv b{color:var(--t1);font-weight:600}

/* v2.9.1 米家账号芯片+详情控件 */
.mj-acct-chip{display:inline-flex;align-items:center;gap:6px;background:#fff;border:1px solid rgba(15,23,42,.07);border-radius:999px;padding:3px 12px 3px 4px;font-size:12px;color:var(--t1);cursor:pointer;transition:transform .14s cubic-bezier(.2,.8,.3,1),background .14s}
.mj-acct-chip:active{transform:scale(.95)}
.mj-acct-chip img,.mj-acct-chip i{width:22px;height:22px;border-radius:50%;object-fit:cover;display:inline-flex;align-items:center;justify-content:center;background:var(--f2);font-size:12px;font-style:normal}
.mj-wrows{display:flex;flex-direction:column;gap:6px}
.mj-wrow{display:flex;align-items:center;gap:8px}
.mj-wrow .stat-sub{flex:1;font-size:12px}
.mj-wrow .modal-input{height:30px;font-size:12px;width:auto;min-width:120px}
.mj7-card{border:1px solid rgba(15,23,42,.05);border-radius:12px;transition:transform .14s cubic-bezier(.2,.8,.3,1),box-shadow .14s}
.mj7-card:active{transform:scale(.975);box-shadow:var(--sh-pop)}


/* ===== v2.10 层:自定义壁纸多图管理(上传/切换/删除) ===== */
.wp-cust-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:12px;margin-top:4px}
.wp-cust-cell{position:relative;border-radius:10px;cursor:pointer;transition:transform .14s cubic-bezier(.2,.8,.3,1)}
.wp-cust-cell:active{transform:scale(.96)}
.wp-cust-cell .wp-cust-img{display:block;width:100%;aspect-ratio:3/2;border-radius:10px;background-size:cover;background-position:center;background-color:var(--f2);border:1px solid rgba(15,23,42,.06)}
.wp-cust-cell.on .wp-cust-img{outline:3px solid #2563eb;outline-offset:2px}
.wp-cust-cell .wp-cust-name{display:block;font-size:12px;color:#4b5563;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}
.wp-cust-cell.on .wp-cust-name{color:#1d4ed8;font-weight:600}
.wp-cust-cell .wp-del{position:absolute;top:6px;right:6px;width:24px;height:24px;border:0;border-radius:50%;background:rgba(15,23,42,.62);color:#fff;font-size:12px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .14s,transform .14s,background .14s}
.wp-cust-cell:hover .wp-del{opacity:1}
.wp-cust-cell .wp-del:hover{background:#dc2626}
.wp-cust-cell .wp-del:active{transform:scale(.86)}
@media (max-width:560px){.wp-cust-grid{grid-template-columns:repeat(2,1fr)}}

/* ===== v2.11 层:米家同款设备面板(状态芯片 / 大开关 / 分段 / 滑条 / 步进) ===== */
.mj-chip{display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:8px;font-size:11.5px;font-weight:600;background:var(--f2);color:var(--t2);white-space:nowrap}
.mj-chip.on{background:var(--green-bg);color:var(--green)}
.mj-chip.off{background:rgba(15,23,42,.06);color:var(--t3)}
.mj-chip.bad{background:var(--red-bg);color:var(--red)}
.mj-chip.dim{background:transparent;border:1px solid var(--line);color:var(--t3);font-weight:500}
.mj-panel{display:block}
.mj-phead{display:flex;align-items:center;gap:12px;padding:2px 0 10px}
.mj-phead .mj-pico{width:46px;height:46px;border-radius:14px;background:var(--f2);display:flex;align-items:center;justify-content:center;font-size:24px;flex:0 0 auto}
.mj-pname{font-size:15.5px;font-weight:700;color:var(--t1);line-height:1.3}
.mj-pinfo{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:3px;font-size:11.5px;color:var(--t3)}
.mj-pinfo b{color:var(--t2);font-weight:600}
.mj-strip{display:flex;flex-wrap:wrap;gap:6px;padding:9px 10px;background:var(--f1);border-radius:12px;margin-bottom:12px}
.mj-sect{font-size:12px;font-weight:700;color:var(--t3);letter-spacing:.4px;margin:12px 0 7px}
.mj-maincard{padding:12px;border:1px solid var(--line);border-radius:14px;background:#fff;margin-bottom:8px}
.mj-bigtgl{display:flex;align-items:center;gap:10px;width:100%;height:52px;padding:0 16px;border:1px solid var(--line);border-radius:14px;background:var(--f1);cursor:pointer;text-align:left;transition:background .16s,border-color .16s,transform .12s}
.mj-bigtgl:active{transform:scale(.985)}
.mj-bigtgl .mj-bt-ico{font-size:19px;color:var(--t3)}
.mj-bigtgl .mj-bt-txt{font-size:14.5px;font-weight:700;color:var(--t1)}
.mj-bigtgl .mj-bt-sub{margin-left:auto;font-size:11.5px;color:var(--t3)}
.mj-bigtgl.on{background:var(--green-bg);border-color:rgba(22,163,74,.28)}
.mj-bigtgl.on .mj-bt-ico,.mj-bigtgl.on .mj-bt-txt{color:var(--green)}
.mj-actbar{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px}
.mj-ctrl{display:flex;align-items:center;gap:12px;padding:9px 12px;border:1px solid var(--line);border-radius:12px;background:#fff;margin-bottom:7px;flex-wrap:wrap}
.mj-ctrl .mj-clabel{display:flex;flex-direction:column;min-width:96px;font-size:13px;font-weight:600;color:var(--t1)}
.mj-ctrl .mj-clabel .stat-sub{font-size:10.5px;font-weight:400}
.mj-seg{display:inline-flex;gap:2px;padding:3px;background:var(--f2);border-radius:10px;margin-left:auto;flex-wrap:wrap}
.mj-seg button{height:28px;padding:0 12px;border:0;border-radius:8px;background:transparent;color:var(--t2);font-size:12px;font-weight:500;cursor:pointer;transition:background .14s,color .14s}
.mj-seg button.on{background:#fff;color:var(--blue-d);font-weight:700;box-shadow:0 1px 2px rgba(15,23,42,.08)}
.mj-seg button:active{transform:scale(.96)}
.mj-rngwrap{display:flex;align-items:center;gap:9px;margin-left:auto}
.mj-rng{width:190px;height:26px;accent-color:var(--blue);background:transparent;border:0;padding:0}
.mj-step{width:30px;height:30px;border:1px solid var(--line);border-radius:9px;background:var(--f2);color:var(--t1);font-size:15px;line-height:1;cursor:pointer;transition:background .14s,transform .12s}
.mj-step:hover{background:var(--f3)}
.mj-step:active{transform:scale(.9)}
.mj-rngv,.mj-numv{min-width:54px;text-align:center;font-size:13.5px;font-weight:700;color:var(--t1)}
.mj-tgl{height:30px;min-width:86px;padding:0 14px;border:1px solid var(--line);border-radius:9px;background:var(--f2);color:var(--t2);font-size:12.5px;font-weight:600;cursor:pointer;margin-left:auto;transition:background .14s,color .14s,transform .12s}
.mj-tgl:active{transform:scale(.95)}
.mj-tgl.on{background:var(--green-bg);color:var(--green);border-color:rgba(22,163,74,.26)}
.mj-statgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:7px}
.mj-stat{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border:1px solid var(--line);border-radius:11px;background:#fff}
.mj-stat span{font-size:11px;color:var(--t3)}
.mj-stat b{font-size:15px;font-weight:700;color:var(--t1)}
.mj-stat.ok b{color:var(--green)}
.mj-stat.bad b{color:var(--red)}
.mj-note{padding:11px 12px;border:1px dashed var(--line);border-radius:12px;font-size:12.5px;color:var(--t2);background:var(--f1)}
.mj-raw{margin-top:12px}
.mj-raw summary{cursor:pointer;font-size:12px;color:var(--t3);padding:6px 0}
.mj-raw summary:hover{color:var(--blue-d)}

/* ===== v2.12 层:「添加用户」表单对齐修复(采纳 Kimi K3 评审:根因是 align-items:center 未覆盖 + 内联宽度) ===== */
.um-form{display:flex;flex-direction:column;gap:12px;max-width:100%;align-items:stretch}
.um-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.um-field{display:flex;flex-direction:column;gap:5px;min-width:0}
.um-field label{font-size:12.5px;font-weight:600;color:var(--t2);line-height:1.4}
.um-field .modal-input{width:100%;height:36px;font-size:13px;margin-right:0}   /* 覆盖 .setting-row input 的 250px 固定宽 + 8px 右边距 */
.um-hint{font-size:11.5px;color:var(--t3);line-height:1.4}
.um-actions{display:flex;justify-content:flex-end;align-items:center;gap:10px}
.um-form .um-actions .btn{align-self:auto;height:34px;padding:0 18px;font-size:13px}
@media (max-width:640px){.um-grid{grid-template-columns:1fr}}

/* ===== v2.13 层:标题栏小图标(Kimi K3 交付)===== */
/* 追加层：清除第1层遗留相对偏移，重置圆角，与标题栏纯白扁平风格统一 */
.win-icon {
  left: auto !important;
  top: auto !important;
  margin-top: 0 !important;
}
.win-icon svg {
  width: 16px;
  height: 16px;
  border-radius: 0;
  display: block;
}

/* ===== v2.14 层:Docker 市场重排(Kimi K3 交付)===== */
/* ================= 市场页 v2 修复层(追加到 app.css 末尾) ================= */
/* 搜索栏:sticky 常驻滚动区顶部,纯色底盖住下方滚动内容 */
#dk-body .mk-bar{position:sticky;top:0;z-index:30;gap:8px;padding:10px 0;background:var(--f1,#f3f5f8);border-bottom:1px solid var(--line,rgba(15,23,42,.07));margin-bottom:2px}
#dk-body .mk-bar input{height:36px;border:1px solid var(--line,rgba(15,23,42,.07));border-radius:10px;background:#fff;color:var(--t1,#1c2433)}
#dk-body .mk-bar input:focus{border-color:var(--blue,#2563eb)}

/* 分类胶囊:自动换行、整齐等距、选中态清晰 */
#dk-body .dk-cats{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 2px}
#dk-body .dk-cat{border:1px solid var(--line,rgba(15,23,42,.07));background:#fff;color:var(--t2,#4d5a72);font-size:12px;padding:4px 13px;border-radius:999px;cursor:pointer;line-height:1.5}
#dk-body .dk-cat:hover{color:var(--blue,#2563eb);border-color:var(--blue,#2563eb)}
#dk-body .dk-cat.on{background:var(--blue,#2563eb);border-color:var(--blue,#2563eb);color:#fff}

#dk-body .dk-subtitle{display:flex;align-items:baseline;gap:6px;margin:12px 0 6px;color:var(--t3,#8b96ab)}
#dk-mcount{color:var(--t3,#8b96ab)}

/* 核心修复:精选目录 + 在线结果共用自适应等宽网格(830px → 4 列) */
#dk-mgrid,.mgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(186px,1fr));gap:10px}
#dk-mresult:empty{display:none}

/* 卡片:去掉 230px min-width 与旧底色,固定底部动作条 */
.mkt-card{min-width:0;display:flex;flex-direction:column;gap:5px;padding:11px 13px 10px;background:#fff;border:1px solid var(--line,rgba(15,23,42,.07));border-radius:12px;box-shadow:none;text-align:left;cursor:pointer;font-family:inherit}
.mkt-card:hover{background:#fff;border-color:var(--blue,#2563eb)}
.mkt-head b{color:var(--t1,#1c2433);font-size:13px}
.mkt-port{background:var(--f2,#edf0f4);color:var(--t2,#4d5a72)}
.mkt-name{color:var(--t3,#8b96ab);font-size:11px}
.mkt-foot{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:8px;padding-top:8px;border-top:1px solid var(--line,rgba(15,23,42,.07))}
.mkt-cat{flex:none;font-size:11px;color:var(--t2,#4d5a72);background:var(--f2,#edf0f4);border-radius:6px;padding:1px 7px}
.mkt-act{flex:none;font-size:11.5px;font-weight:600;color:var(--blue,#2563eb);white-space:nowrap}
.mkt-card:hover .mkt-act{text-decoration:underline}

/* 在线结果卡片细节:镜像名等宽、官方徽章蓝、星标灰 */
.mkt-card.m-on .mkt-head b{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px}
.mkt-badges{display:flex;flex:none;gap:6px}
.mkt-official{flex:none;font-size:11px;color:var(--blue,#2563eb);background:rgba(37,99,235,.1);border-radius:6px;padding:1px 7px}
.mkt-desc{font-size:11px;color:var(--t3,#8b96ab);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-height:15px}
.mkt-stars{font-size:11px;color:var(--t3,#8b96ab)}

/* 在线结果区头部与三态提示 */
.mk-res-head{display:flex;align-items:center;justify-content:space-between;margin:12px 0 8px;padding-top:10px;border-top:1px solid var(--line,rgba(15,23,42,.07))}
.mk-res-title{font-size:12.5px;font-weight:600;color:var(--t2,#4d5a72)}
.mk-res-clear{border:0;background:transparent;color:var(--t3,#8b96ab);font-size:12px;cursor:pointer;padding:2px 6px}
.mk-res-clear:hover{color:var(--blue,#2563eb)}
.mk-state{padding:16px;margin:10px 0;text-align:center;font-size:12.5px;color:var(--t3,#8b96ab);background:var(--f1,#f3f5f8);border:1px dashed var(--line,rgba(15,23,42,.07));border-radius:12px}
.mk-state.mkt-empty{grid-column:1/-1}

/* 展开 / 收起 */
#dk-mmore{display:flex;justify-content:center;margin:12px 0 4px}
#dk-mmore:empty{display:none}
.dk-morebtn{border:1px solid var(--line,rgba(15,23,42,.07));background:#fff;color:var(--t2,#4d5a72);font-size:12.5px;border-radius:999px;padding:6px 20px;cursor:pointer}
.dk-morebtn:hover{border-color:var(--blue,#2563eb);color:var(--blue,#2563eb)}

/* ===== v2.14 层:用户弹窗 + 权限设置(Kimi K3 交付)===== */
/* ===== 用户管理(弹窗 + 权限) ===== */
.um-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:4px 0 12px}
.um-bar .stat-sub{margin:0}
.um-bar .btn{flex:none}
#um-count{color:var(--t1)}

/* 列表 */
.um-table{width:100%}
.um-table td{vertical-align:middle}
.um-table .um-op-col{width:1%;text-align:right}
.um-uname{font-weight:600;color:var(--t1)}
.um-badge-admin{display:inline-block;margin-left:6px;padding:0 7px;border-radius:6px;background:var(--blue);color:#fff;font-size:11px;font-weight:500;line-height:18px;vertical-align:1px}
.um-badge-on{display:inline-block;padding:0 7px;border-radius:6px;background:var(--f2);color:var(--t2);font-size:11px;line-height:18px}
.um-sum{font-size:12px;color:var(--t2)}
.um-dim{font-size:12px;color:var(--t3)}
.um-ops{white-space:nowrap;text-align:right}
.um-op{display:inline-block;height:28px;padding:0 10px;margin-left:6px;border:1px solid var(--line);background:#fff;border-radius:8px;font-size:12px;color:var(--t2);cursor:pointer;transition:color .15s,border-color .15s}
.um-op:hover{color:var(--blue);border-color:rgba(37,99,235,.4)}
.um-op.danger{color:#dc2626}
.um-op.danger:hover{color:#dc2626;border-color:rgba(220,38,38,.45)}
.um-op:disabled{opacity:.5;cursor:not-allowed}

/* 弹窗骨架 */
.um-modal{display:block;max-height:62vh;overflow-y:auto;padding:2px 2px 0}
.um-grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
.um-field label{display:block;margin:0 0 6px;font-size:13px;color:var(--t2)}
.um-field .modal-input{width:100%;box-sizing:border-box}
.um-hint{display:block;margin-top:5px;font-size:11px;line-height:1.5;color:var(--t3)}
.um-edit-who{margin-bottom:4px;padding:10px 12px;border-radius:10px;background:var(--f1);font-size:13px;color:var(--t2)}
.um-edit-who b{color:var(--t1)}
.um-block{margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}
.um-block-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.um-block-t{font-size:13px;font-weight:600;color:var(--t1)}
.um-block-ops{display:flex;align-items:center}
.um-block-ops a{font-size:12px;color:var(--blue);text-decoration:none}
.um-block-ops a:hover{text-decoration:underline}
.um-sep{display:inline-block;width:1px;height:10px;margin:0 8px;background:var(--line)}

/* 分段选择 */
.um-seg{display:inline-flex;gap:2px;padding:3px;border-radius:10px;background:var(--f2)}
.um-seg-i{height:30px;padding:0 16px;border:0;border-radius:8px;background:transparent;font-size:13px;color:var(--t2);cursor:pointer;transition:background .15s,color .15s}
.um-seg-i:hover{color:var(--t1)}
.um-seg-i.on{background:#fff;color:var(--blue);font-weight:600;box-shadow:0 1px 2px rgba(15,23,42,.08)}
.um-seg-i:disabled{color:var(--t3);cursor:not-allowed}
.um-seg-i:disabled:hover{color:var(--t3)}

/* 应用权限网格 */
.um-apps{display:flex;flex-direction:column;gap:12px}
.um-cat-t{margin-bottom:6px;font-size:12px;color:var(--t3)}
.um-cat-g{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.um-app{display:flex;align-items:center;gap:7px;height:36px;padding:0 10px;border:1px solid var(--line);border-radius:10px;background:#fff;font-size:13px;color:var(--t2);cursor:pointer;user-select:none;box-sizing:border-box;transition:border-color .15s,color .15s,background .15s}
.um-app:hover{border-color:rgba(37,99,235,.35)}
.um-app.ck{border-color:rgba(37,99,235,.55);background:rgba(37,99,235,.04);color:var(--t1)}
.um-app input{width:14px;height:14px;margin:0;accent-color:var(--blue);cursor:pointer}
.um-app-n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 置灰与提示 */
.um-perm-dim{transition:opacity .15s}
.um-perm-dim.off{opacity:.45;pointer-events:none}
.um-admin-tip{margin-top:14px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--f1);font-size:12px;color:var(--t2);text-align:center}
.um-files-desc{min-height:17px}
.um-del-tip{font-size:13px;line-height:1.8;color:var(--t2)}
.um-del-tip b{color:var(--t1)}
.modal-primary:disabled,.modal-danger:disabled{opacity:.6;cursor:not-allowed}

@media (max-width:640px){
  .um-grid3{grid-template-columns:1fr}
  .um-cat-g{grid-template-columns:repeat(2,1fr)}
  .um-bar{flex-direction:column;align-items:flex-start}
}

/* ===== v2.15 层:Docker 市场接入真实目录(Kimi K3 交付)===== */
/* ===== 市场页 v3(只作用于 #dk-body 与 .mk2- 前缀) ===== */
#dk-body .mk2-bar{display:flex;align-items:center;gap:8px}
#dk-body .mk2-q{flex:1;min-width:0;height:32px;box-sizing:border-box;padding:0 12px;border:1px solid #dde1e6;border-radius:8px;background:#fff;color:#333;font:inherit;font-size:13px;outline:none}
#dk-body .mk2-q:focus{border-color:#2f6fed}
#dk-body .mk2-sort{height:32px;padding:0 6px;border:1px solid #dde1e6;border-radius:8px;background:#fff;color:#444;font:inherit;font-size:12px;cursor:pointer}

#dk-body .mk2-meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0 8px;font-size:11px;color:#9aa1ab;line-height:1.5}
#dk-body .mk2-meta .mk2-dot{color:#cdd2d9}
#dk-body .mk2-meta .mk2-src.dead{color:#c2c8cf}
#dk-body .mk2-meta .mk2-upd{color:#8a919b}
#dk-body .mk2-meta .mk2-off{color:#b07917}

#dk-body .mk2-cats{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
#dk-body .mk2-cat{border:1px solid #e0e3e8;background:#fff;border-radius:999px;padding:3px 11px;font-size:12px;color:#555;cursor:pointer;font-family:inherit;line-height:1.6}
#dk-body .mk2-cat i{font-style:normal;color:#9aa1ab;font-size:11px}
#dk-body .mk2-cat:hover{border-color:#2f6fed;color:#2f6fed}
#dk-body .mk2-cat.on{background:#2f6fed;border-color:#2f6fed;color:#fff}
#dk-body .mk2-cat.on i{color:rgba(255,255,255,.85)}

#dk-body .mk2-grid{display:flex;flex-wrap:wrap;gap:10px}
#dk-body .mk2-card{flex:0 0 calc(25% - 7.5px);max-width:calc(25% - 7.5px);box-sizing:border-box;height:132px;padding:10px 12px;border:1px solid #e4e7ec;border-radius:12px;background:#fff;display:flex;flex-direction:column;cursor:pointer;overflow:hidden;transition:border-color .15s}
#dk-body .mk2-card:hover{border-color:#2f6fed}
#dk-body .mk2-row1{display:flex;align-items:center;justify-content:space-between;gap:6px}
#dk-body .mk2-row1 b{font-size:13px;color:#222;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#dk-body .mk2-heat{flex:none;font-size:10px;color:#b07917;background:#fdf6e7;border:1px solid #f3e3b8;border-radius:6px;padding:1px 6px}
#dk-body .mk2-img{margin-top:3px;font-size:11px;color:#8a919b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#dk-body .mk2-desc{margin-top:5px;font-size:12px;color:#6a717a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#dk-body .mk2-act{margin-top:auto;display:flex;align-items:center;gap:5px;padding-top:8px}
#dk-body .mk2-pull{margin-left:auto;font-size:11px;color:#2f6fed;background:#fff;border:1px solid #c9dbff;border-radius:6px;padding:2px 8px;cursor:pointer;font-family:inherit}
#dk-body .mk2-pull:hover{background:#2f6fed;color:#fff}

/* 徽章:卡片与弹窗共用,不挂在 #dk-body 下 */
.mk2-catb{font-size:10px;color:#5a626d;background:#f2f4f7;border:1px solid #e6e9ee;border-radius:6px;padding:1px 6px;white-space:nowrap}
.mk2-srcb{font-size:10px;color:#5a626d;background:#f2f4f7;border:1px solid #e6e9ee;border-radius:6px;padding:1px 6px;white-space:nowrap}
.mk2-srcb.off{color:#1d5fd6;background:#eef4ff;border-color:#d6e4ff}
.mk2-srcb.ls{color:#18794e;background:#ecfbf2;border-color:#cdeedd}
.mk2-srcb.aw{color:#7a4dbb;background:#f6f0fd;border-color:#e5d8f8}

#dk-body .mk2-state{width:100%;text-align:center;color:#9aa1ab;font-size:12px;padding:36px 0;box-sizing:border-box}
#dk-body .mk2-errbox{width:100%;box-sizing:border-box;border:1px solid #f0d3d0;background:#fdf3f2;color:#b3462f;border-radius:10px;padding:10px 12px;font-size:12px;margin-bottom:2px}
#dk-body .mk2-retry{margin-left:8px;font-size:11px;padding:2px 10px}

#dk-body .mk2-foot{margin:14px 0 4px;text-align:center}
#dk-body .mk2-more{border:1px solid #dde1e6;background:#fff;border-radius:8px;padding:6px 18px;font-size:12px;color:#4a545f;cursor:pointer;font-family:inherit}
#dk-body .mk2-more:hover{border-color:#2f6fed;color:#2f6fed}
#dk-body .mk2-alldone{font-size:11px;color:#b3b9c0;padding:4px 0}

/* 详情弹窗 */
.mk2-d-img{font-size:13px;color:#444;background:#f6f7f9;border:1px solid #e7eaee;border-radius:8px;padding:6px 10px;word-break:break-all}
.mk2-d-meta{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:10px 0}
.mk2-dm{font-size:11px;color:#8a919b}
.mk2-d-desc{font-size:12px;color:#4a525c;line-height:1.6;margin-bottom:2px}
.mk2-d-sec{font-size:11px;color:#9aa1ab;margin:12px 0 6px}
.mk2-d-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:24px}
.mk2-tag{font-size:11px;border:1px solid #dde1e6;background:#fff;border-radius:6px;padding:2px 8px;cursor:pointer;color:#4a545f;font-family:inherit}
.mk2-tag:hover{border-color:#2f6fed;color:#2f6fed}
.mk2-tag.on{background:#2f6fed;border-color:#2f6fed;color:#fff}
.mk2-d-loading{font-size:11px;color:#9aa1ab}
.mk2-d-err{font-size:11px;color:#b3462f}
.mk2-d-more{font-size:11px;color:#b3b9c0}
.mk2-d-cmdrow{display:flex;gap:8px;align-items:center}
.mk2-d-cmdrow code{flex:1;min-width:0;font-size:12px;background:#f6f7f9;border:1px solid #e7eaee;border-radius:8px;padding:6px 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mk2-d-link{margin-top:12px;font-size:12px}
.mk2-d-link a{color:#2f6fed;text-decoration:none}
.mk2-d-link a:hover{text-decoration:underline}

/* ===== v2.15 层:市场搜索补充提示(Kimi K3 交付)===== */
.mk2-hints { margin:14px 0 0; background:#f8f9fb; border:1px solid #e5e8ee; border-radius:12px; padding:12px 14px; }
.mk2-hints-t { font-size:12px; color:#8a93a3; margin-bottom:6px; }
.mk2-hint { display:flex; align-items:center; min-width:0; padding:5px 0; font-size:12px; }
.mk2-hint + .mk2-hint { border-top:1px dashed #eceff3; }
.mk2-hint > * + * { margin-left:8px; }
.mk2-hint-name { font-weight:600; color:#2b3442; flex:none; }
.mk2-hint-stars { color:#e8a33d; font-size:11px; flex:none; }
.mk2-hint-desc { color:#8a93a3; flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.mk2-hint-link { flex:none; color:#4a7dff; text-decoration:none; font-size:12px; }
.mk2-hint-link:hover { text-decoration:underline; }

/* ===== v2.16 层:弹窗改悬浮子窗 + 右键菜单(Kimi K3 交付)===== */
/* v2.16 层:弹窗改悬浮子窗 + 右键菜单样式 */

/* ===== A. 悬浮子窗弹窗 ===== */

/* 弹窗背景盖层 — 完全透明，仅保留点击穿透关闭能力 */
.modal-overlay {
  background: transparent !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* 弹窗面板 — 悬浮小窗风格 */
.modal-panel {
  width: min(430px, 92vw) !important;
  max-height: 78vh !important;
  border-radius: 12px !important;
  border: 1px solid rgba(15, 23, 42, 0.08) !important;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16) !important;
  animation: modalIn .16s cubic-bezier(.2,.9,.3,1.2) !important;
  overflow: hidden !important;
}

/* 宽版弹窗 */
.modal-panel.modal-wide {
  width: min(720px, 94vw) !important;
}

/* 弹窗位置 — 略偏上，像从顶栏浮出 */
.modal-overlay {
  align-items: flex-start !important;
  padding-top: 12vh !important;
}

/* 窄屏适配 */
@media (max-width: 720px) {
  .modal-panel {
    width: 94vw !important;
  }
}

/* 面板出现动效 */
@keyframes modalIn {
  from {
    opacity: 0;
    transform: translateY(6px) scale(.985);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

/* 面板淡出关闭 */
.modal-panel.closing {
  animation: modalOut .14s ease forwards !important;
}

@keyframes modalOut {
  from {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
  to {
    opacity: 0;
    transform: translateY(6px) scale(.985);
  }
}

/* 弹窗标题栏 — 字号收紧 */
.modal-title {
  font-size: 14px !important;
  font-weight: 600 !important;
  padding: 12px 16px 8px !important;
  margin-bottom: 0 !important;
}

/* 关闭按钮 — 小圆角方形 */
.modal-x {
  width: 26px !important;
  height: 26px !important;
  border-radius: 6px !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  font-size: 14px !important;
  color: #8b96ab !important;
  transition: background .12s, color .12s !important;
  cursor: pointer !important;
}

.modal-x:hover {
  background: #f1f5fb !important;
  color: #33405a !important;
}

/* 弹窗底部按钮区 — 右对齐，间距紧凑 */
.modal-foot {
  display: flex !important;
  justify-content: flex-end !important;
  gap: 8px !important;
  padding: 12px 16px 16px !important;
  border-top: 1px solid rgba(15, 23, 42, 0.06) !important;
}

/* 通用按钮 — 紧凑样式 */
.modal-btn {
  height: 30px !important;
  padding: 0 14px !important;
  border-radius: 8px !important;
  font-size: 12.5px !important;
  font-weight: 500 !important;
  cursor: pointer !important;
  transition: all .12s !important;
  border: none !important;
  outline: none !important;
}

/* 主操作按钮 — 蓝底白字 */
.modal-primary {
  background: #2563eb !important;
  color: #fff !important;
}

.modal-primary:hover {
  background: #1d4ed8 !important;
}

/* 危险操作按钮 — 红底白字 */
.modal-danger {
  background: #dc2626 !important;
  color: #fff !important;
}

.modal-danger:hover {
  background: #b91c1c !important;
}

/* 次要按钮 — 浅灰底 */
.modal-btn:not(.modal-primary):not(.modal-danger) {
  background: #f1f5fb !important;
  color: #33405a !important;
}

.modal-btn:not(.modal-primary):not(.modal-danger):hover {
  background: #e2e8f0 !important;
}

/* 弹窗内容区 — 可滚动 */
.modal-body {
  padding: 12px 16px !important;
  overflow-y: auto !important;
  flex: 1 !important;
}


/* ===== B. 右键菜单样式 ===== */

/* 菜单容器 — 平面白底小窗 */
#ctx-menu {
  background: #fff !important;
  border: 1px solid rgba(15, 23, 42, 0.08) !important;
  border-radius: 10px !important;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16) !important;
  padding: 5px !important;
  min-width: 168px !important;
  font-size: 12.5px !important;
  color: #33405a !important;
  z-index: 2000 !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* 菜单项 — 高度紧凑，圆角悬停 */
.ctx-item {
  height: 28px !important;
  padding: 0 9px !important;
  border-radius: 6px !important;
  display: flex !important;
  align-items: center !important;
  gap: 8px !important;
  cursor: default !important;
  transition: background .1s, color .1s !important;
  white-space: nowrap !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
}

.ctx-item:hover {
  background: #f1f5fb !important;
  color: #33405a !important;
}

/* 危险项 — 悬停浅红底 */
.ctx-item.danger:hover {
  background: #fef2f2 !important;
  color: #dc2626 !important;
}

/* 禁用项 — 半透明，无悬停 */
.ctx-item.disabled {
  opacity: 0.4 !important;
  pointer-events: none !important;
}

/* 已选中项 — 左侧蓝点指示 */
.ctx-item.on {
  position: relative !important;
  padding-left: 24px !important;
}

.ctx-item.on::before {
  content: '' !important;
  position: absolute !important;
  left: 8px !important;
  top: 50% !important;
  transform: translateY(-50%) !important;
  width: 6px !important;
  height: 6px !important;
  border-radius: 50% !important;
  background: #2563eb !important;
}

/* 菜单顶部标题行 */
.ctx-head {
  font-size: 11px !important;
  color: #8b96ab !important;
  padding: 4px 9px 2px !important;
  margin-bottom: 2px !important;
  border-bottom: 1px solid rgba(15, 23, 42, 0.07) !important;
  font-weight: 500 !important;
  letter-spacing: 0.02em !important;
}

/* 快捷键/说明小字 — 右侧对齐 */
.ctx-item .ctx-k {
  margin-left: auto !important;
  font-size: 11px !important;
  color: #9aa4b5 !important;
  padding-left: 12px !important;
  font-weight: 400 !important;
}

/* 分隔线 — 细线，左右缩进 */
.ctx-sep {
  height: 1px !important;
  background: rgba(15, 23, 42, 0.07) !important;
  margin: 4px 6px !important;
}

/* 菜单项文字前缀 emoji 保留 */
.ctx-item::before {
  font-size: 13px !important;
  line-height: 1 !important;
}

/* ===== v2.17 层:通知面板默认态 + 窄屏窗口收边 + 截断可读性 =====
   (Kimi K3 设计,主代理按真实 DOM 类名校准:项目里已有 #top-status 与 .di-emoji 的窄屏规则,
    真正缺的是窗口 max-width 收边;#dock-items 不能改成 overflow-x:auto,见上方 :134 注释) */

/* A. 通知中心面板默认隐藏
   此前 #notify-panel 没有默认 display:none,而 desktop.js 用 style.display === 'block' 判断开关
   (初始是空字符串) —— 登录页右上角就压着一个面板、登录后自动展开、第一次点铃铛要点两次才关。
   v2.17 起 JS 改为 panel.classList.toggle('open'),所以这里必须用 .open。 */
#notify-panel { display: none; }
#notify-panel.open {
  display: block; position: fixed; top: 44px; right: 12px;
  width: min(340px, calc(100vw - 24px)); max-height: 60vh; overflow: auto;
  box-sizing: border-box; z-index: 2500;
  background: rgb(255, 255, 255); border-radius: 18px;
  border: 1px solid rgba(15, 23, 42, 0.08); padding: 14px 16px;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16);
  animation: ntfViewIn 0.15s ease both;
}
@keyframes ntfViewIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }

/* B. 长文本:允许两行 + 紧凑行高(完整内容鼠标悬停可见,见 core.js 的 NS.setTextT) */
.hero2-kv .kv b {
  white-space: normal; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
  overflow: hidden; line-height: 1.35; font-size: 11.5px;
}
.st2-desc {
  overflow-wrap: anywhere;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
  overflow: hidden; line-height: 1.4;
}

/* C. 窄屏:窗口不许溢出视口(拖拽/缩放依赖内联 left/top/width,这里只加 max-*,不碰定位) */
@media (max-width: 720px) {
  /* .window 基础规则带 min-width:380px / min-height:260px,390px 屏幕上窗口必然顶出屏幕右侧 → 窄屏解除 */
  body .window { min-width: 0; min-height: 0; max-width: calc(100vw - 12px); max-height: calc(100vh - 78px); }
  #notify-panel.open { left: 8px; right: 8px; width: auto; }
  #icons { left: 8px; right: 8px; }
  #dock { gap: 8px; padding: 8px 12px; bottom: 8px; max-width: calc(100vw - 12px); }
  #dock-items { gap: 10px; }
  .dock-item { width: 40px; height: 40px; }
  .dock-item svg { width: 20px; height: 20px; }
}
@media (max-width: 420px) {
  body .window { max-width: calc(100vw - 8px); max-height: calc(100vh - 70px); }
  #start-menu { width: calc(100vw - 12px); }
  #dock-items { gap: 7px; }
  .dock-item { width: 36px; height: 36px; }
  .dock-item svg { width: 18px; height: 18px; }
}

/* ===== v2.19 层:虚拟机(Kimi K3 设计,选择器已全部收敛到 #vm-app 作用域,不污染门户其他页面) ===== */
#vm-app * {box-sizing:border-box}
#vm-app {max-width:1140px;margin:0 auto;padding:18px}
#vm-app.app {background:#fff;border:1px solid var(--line);border-radius:16px;padding:16px 18px}
#vm-app .btn {
    display:inline-flex;align-items:center;justify-content:center;gap:6px;
    height:30px;padding:0 12px;border:1px solid var(--line);background:#fff;color:var(--t2);
    border-radius:9px;font:inherit;font-size:12.5px;cursor:pointer;white-space:nowrap;
    transition:color .15s,border-color .15s,background .15s;
  }
#vm-app .btn:hover {color:var(--blue);border-color:var(--blue);background:#f5f8ff}
#vm-app .btn.primary {background:var(--blue);border-color:var(--blue);color:#fff}
#vm-app .btn.primary:hover {background:var(--blue-d);border-color:var(--blue-d);color:#fff}
#vm-app .btn.danger {color:var(--red);border-color:rgba(220,38,38,.38)}
#vm-app .btn.danger:hover {background:var(--red);border-color:var(--red);color:#fff}
#vm-app .btn.sm {height:26px;padding:0 10px;font-size:12px}
#vm-app .btn svg {flex:none}
#vm-app .pill {
    display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 9px;border-radius:999px;
    font-size:11.5px;line-height:1;border:1px solid transparent;white-space:nowrap;
  }
#vm-app .pill::before {content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
#vm-app .pill.run {color:var(--green);background:rgba(22,163,74,.09);border-color:rgba(22,163,74,.22)}
#vm-app .pill.stop {color:var(--gray);background:rgba(148,163,184,.14);border-color:rgba(148,163,184,.32)}
#vm-app .pill.warn {color:var(--orange);background:rgba(217,119,6,.1);border-color:rgba(217,119,6,.24)}
#vm-app .pill.err {color:var(--red);background:rgba(220,38,38,.08);border-color:rgba(220,38,38,.22)}
#vm-app .ico {
    width:40px;height:40px;flex:none;border-radius:11px;border:1px solid var(--line);
    background:var(--bg2);display:grid;place-items:center;font-size:18px;color:var(--blue);
  }
#vm-app .spacer {flex:1}
#vm-app .toolbar {display:flex;align-items:center;gap:10px}
#vm-app .toolbar h1 {margin:0;font-size:16px;font-weight:600;letter-spacing:.2px}
#vm-app .toolbar h1 .num {color:var(--t3);font-weight:500}
#vm-app .substat {margin-top:6px;font-size:12px;color:var(--t3)}
#vm-app .substat b {color:var(--t2);font-weight:500}
#vm-app .vm-row {
    display:grid;grid-template-columns:40px minmax(0,1fr) 128px auto;gap:14px;align-items:center;
    padding:12px 14px;background:#fff;border:1px solid var(--line);border-radius:14px;margin-top:10px;
    transition:border-color .15s;
  }
#vm-app .vm-row:hover {border-color:rgba(37,99,235,.35)}
#vm-app .vm-title {display:flex;align-items:center;gap:8px}
#vm-app .vm-name {font-size:13.5px;font-weight:600;color:var(--t1)}
#vm-app .vm-sub {font-size:11.5px;color:var(--t3);margin-top:3px}
#vm-app .bars {margin-top:8px;display:grid;gap:5px}
#vm-app .bar-line {display:flex;align-items:center;gap:8px;font-size:11px;color:var(--t3)}
#vm-app .bar-line .k {width:26px;flex:none;letter-spacing:.4px}
#vm-app .bar-line .v {width:64px;flex:none;text-align:right;color:var(--t2);font-variant-numeric:tabular-nums}
#vm-app .bar {height:4px;border-radius:999px;background:#eef2f9;overflow:hidden;flex:1;min-width:40px}
#vm-app .bar > i {display:block;height:100%;border-radius:999px;background:var(--blue)}
#vm-app .bar.mem > i {background:#60a5fa}
#vm-app .bar.off > i {background:var(--gray)}
#vm-app .vm-meta {text-align:right}
#vm-app .vm-meta .k {font-size:11px;color:var(--t3)}
#vm-app .vm-meta .v {font-size:12.5px;color:var(--t2);margin-top:3px}
#vm-app .vm-actions {display:flex;align-items:center;gap:8px}
#vm-app .empty {
    border:1px dashed rgba(15,23,42,.16);border-radius:16px;background:#fff;
    padding:52px 24px;text-align:center;margin-top:12px;
  }
#vm-app .empty .big {
    width:58px;height:58px;margin:0 auto 16px;border-radius:16px;border:1px solid var(--line);
    background:var(--bg2);display:grid;place-items:center;color:var(--blue);
  }
#vm-app .empty h2 {margin:0 0 8px;font-size:15px;font-weight:600}
#vm-app .empty p {margin:0 0 18px;font-size:12.5px;color:var(--t3)}
#vm-app .empty .note {margin:14px 0 0;font-size:12px;color:var(--t3)}
#vm-app .empty .note b {color:var(--green);font-weight:500}
#vm-app .wiz-head {display:flex;align-items:center;gap:10px}
#vm-app .wiz-head h1 {margin:0;font-size:16px;font-weight:600}
#vm-app .steps {display:flex;align-items:center;gap:8px;margin:16px 0 18px;flex-wrap:wrap}
#vm-app .step {display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--t3)}
#vm-app .step .num {
    width:22px;height:22px;border-radius:50%;border:1px solid var(--line);background:#fff;
    display:grid;place-items:center;font-size:11.5px;color:var(--t3);
  }
#vm-app .step.on {color:var(--t1)}
#vm-app .step.on .num {background:var(--blue);border-color:var(--blue);color:#fff}
#vm-app .step.done .num {border-color:var(--blue);color:var(--blue)}
#vm-app .step-line {width:40px;height:1px;background:rgba(15,23,42,.12)}
#vm-app .wiz-body {display:grid;grid-template-columns:minmax(0,1fr) 258px;gap:18px;align-items:start}
#vm-app .field {margin-bottom:16px}
#vm-app .lab {display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:12.5px;color:var(--t2);margin-bottom:7px}
#vm-app .lab .tip {font-size:11.5px;color:var(--t3)}
#vm-app .hint {font-size:11.5px;color:var(--t3);margin-top:7px;line-height:1.6}
#vm-app .input {
    width:100%;height:32px;border:1px solid var(--line);border-radius:9px;background:#fff;
    padding:0 10px;font:inherit;font-size:12.5px;color:var(--t1);
  }
#vm-app .input:focus {outline:none;border-color:var(--blue)}
#vm-app .input-row {display:flex;gap:8px}
#vm-app .input-suffix {position:relative}
#vm-app .input-suffix .input {padding-right:42px}
#vm-app .input-suffix .sfx {
    position:absolute;right:10px;top:0;height:32px;display:flex;align-items:center;
    font-size:12px;color:var(--t3);pointer-events:none;
  }
#vm-app .pick {display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
#vm-app .pick .card {
    border:1px solid var(--line);border-radius:12px;background:#fff;padding:12px;cursor:pointer;
    transition:border-color .15s,background .15s;
  }
#vm-app .pick .card:hover {border-color:rgba(37,99,235,.4)}
#vm-app .pick .card.on {border-color:var(--blue);background:#f5f8ff}
#vm-app .pick .card .t {font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px}
#vm-app .pick .card .d {font-size:11.5px;color:var(--t3);margin-top:6px;line-height:1.55}
#vm-app .seg {display:inline-flex;border:1px solid var(--line);border-radius:10px;background:#fff;padding:2px;gap:2px}
#vm-app .seg button {
    border:0;background:transparent;font:inherit;font-size:12.5px;color:var(--t2);
    padding:5px 13px;border-radius:8px;cursor:pointer;transition:background .15s,color .15s;
  }
#vm-app .seg button:hover {color:var(--blue)}
#vm-app .seg button.on {background:var(--bg1);color:var(--blue)}
#vm-app input[type=range] {width:100%;accent-color:var(--blue);height:20px;cursor:pointer}
#vm-app .range-row {display:flex;align-items:center;gap:12px}
#vm-app .range-val {
    min-width:74px;text-align:center;font-size:12.5px;color:var(--t1);
    border:1px solid var(--line);border-radius:9px;height:30px;display:flex;align-items:center;justify-content:center;
    font-variant-numeric:tabular-nums;
  }
#vm-app .summary {border:1px solid var(--line);border-radius:14px;background:var(--bg2);padding:14px}
#vm-app .summary .st {font-size:11.5px;color:var(--t3);margin-bottom:8px}
#vm-app .summary .headline {font-size:13.5px;font-weight:600;color:var(--t1);line-height:1.5}
#vm-app .summary .div {height:1px;background:var(--line);margin:12px 0}
#vm-app .summary .row {display:flex;justify-content:space-between;gap:10px;font-size:12px;padding:4px 0}
#vm-app .summary .row .k {color:var(--t3)}
#vm-app .summary .row .v {color:var(--t2);text-align:right}
#vm-app .kv-list {border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#fff}
#vm-app .kv-list .r {display:grid;grid-template-columns:132px minmax(0,1fr);gap:12px;padding:10px 14px;border-top:1px solid var(--line);font-size:12.5px}
#vm-app .kv-list .r:first-child {border-top:0}
#vm-app .kv-list .r .k {color:var(--t3)}
#vm-app .kv-list .r .v {color:var(--t1)}
#vm-app .switch-row {display:flex;align-items:center;gap:10px;margin-top:14px}
#vm-app .switch-row .txt {font-size:12.5px;color:var(--t2)}
#vm-app .switch-row .txt small {display:block;font-size:11.5px;color:var(--t3);margin-top:3px}
#vm-app .sw {
    width:38px;height:22px;border-radius:999px;background:#e2e8f4;border:1px solid var(--line);
    position:relative;cursor:pointer;flex:none;transition:background .15s,border-color .15s;
  }
#vm-app .sw::after {
    content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;
    background:#fff;border:1px solid var(--line);transition:left .15s,background .15s;
  }
#vm-app .sw.on {background:var(--blue);border-color:var(--blue)}
#vm-app .sw.on::after {left:18px;border-color:transparent}
#vm-app .wiz-foot {display:flex;align-items:center;gap:10px;margin-top:18px;padding-top:14px;border-top:1px solid var(--line)}
#vm-app .detail-head {display:flex;align-items:center;gap:10px;flex-wrap:wrap}
#vm-app .detail-head h1 {margin:0;font-size:16px;font-weight:600}
#vm-app .detail-head .meta {font-size:12px;color:var(--t3)}
#vm-app .stats {display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:14px}
#vm-app .stat {border:1px solid var(--line);border-radius:12px;background:#fff;padding:10px 12px}
#vm-app .stat .k {font-size:11.5px;color:var(--t3)}
#vm-app .stat .v {font-size:15px;font-weight:600;margin-top:4px;font-variant-numeric:tabular-nums}
#vm-app .stat .v small {font-size:11.5px;font-weight:400;color:var(--t3);margin-left:3px}
#vm-app .ops {display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:14px}
#vm-app .ops .sep {width:1px;height:20px;background:var(--line);margin:0 2px}
#vm-app .section-title {font-size:12.5px;color:var(--t2);font-weight:600;margin:20px 0 10px}
#vm-app .console {border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#fff}
#vm-app .con-head {display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--line);background:var(--bg2)}
#vm-app .term {
    background:#0f1424;color:#c7d2e8;padding:14px 16px;margin:0;
    font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
    font-size:12px;line-height:1.8;white-space:pre-wrap;word-break:break-word;
  }
#vm-app .term .g {color:#7f9aa8}
#vm-app .term .b {color:#8ab4f8}
#vm-app .term .y {color:#e0c07a}
#vm-app .vnc-panel {padding:16px;background:#fff}
#vm-app .vnc-box {display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:11px;padding:10px 12px;background:var(--bg2)}
#vm-app .vnc-box .addr {font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;color:var(--t1)}
#vm-app .vnc-box .k {font-size:11.5px;color:var(--t3);margin-right:2px}
#vm-app .snap {
    display:grid;grid-template-columns:minmax(0,1fr) 160px auto;gap:12px;align-items:center;
    padding:11px 14px;border:1px solid var(--line);border-radius:12px;background:#fff;margin-top:8px;
  }
#vm-app .snap .n {font-size:12.5px;font-weight:600}
#vm-app .snap .t {font-size:11.5px;color:var(--t3);margin-top:3px}
#vm-app .snap .acts {display:flex;gap:8px}

