/* ============================================================================
 * uw-theme.css —— 《放置：宇宙大战》卡通风格双主题
 * ----------------------------------------------------------------------------
 * 说明：
 *  1) 本文件必须在 universe-war.css 之后引入，通过同名 CSS 变量覆盖实现换肤；
 *  2) :root                    = 方向 A「奶油糖果白天」（默认）
 *  3) html[data-theme="night"] = 方向 B「深空糖果夜」（由玩家切换）
 *  4) 下方"组件补丁"区域同时适配两套主题（全部走变量，不自带死色）；
 *  5) 仅改视觉层，不触碰玩法与结构。
 * ==========================================================================*/

/* ============================================================================
 * 方向 A · 奶油糖果白天（默认）
 * ==========================================================================*/
:root {
    /* --- 底色：奶油系 --- */
    --uw-color-bg-primary: #FFF7E6;      /* 主背景（奶油） */
    --uw-color-bg-secondary: #FFEFC9;    /* 顶栏/侧栏（蜜糖） */
    --uw-color-bg-tertiary: #FFFFFF;     /* 面板/卡片（白） */
    --uw-color-bg-hover: #FFF1D6;        /* 悬停 */
    --uw-color-bg-input: #FFFDF5;        /* 输入框底（新增） */

    /* --- 主交互：天空蓝（去掉电光青科技感） ---
       注意：--uw-color-accent 既作前景文字也作按钮背景，取值需满足
       (a) 在 #FFFFFF / #FFF7E6 上作文字 ≥ 4.5:1；
       (b) 作按钮背景配白字 ≥ 4.5:1（大字号 ≥ 3:1）。
       因此使用比原 #3D9BFF 更深的蓝阶，保留糖果蓝识别度。 */
    --uw-color-accent: #1B5FB0;           /* 白底 6.18:1；奶油底 5.92:1；按钮白字 5.38:1（从 #2373D6 4.98 加深到稳过 AA） */
    --uw-color-accent-hover: #2A6FC0;     /* 按钮白字 5.03:1 */
    --uw-color-accent-dim: #FFB84D;       /* 强调描边/次级主色（橙金；仅作装饰/徽章背景，不作文字） */
    --uw-color-glow: rgba(61, 155, 255, 0.18);

    /* --- 边框与文字：暖棕系 ---
       文字色统一提到 WCAG AA 4.5:1 以上；边框/分隔线保留浅咖保持"奶油"质感。 */
    --uw-color-border-dim: #F0D9AE;       /* 浅咖分隔（仅边框/滚动条，不作文字） */
    --uw-color-text-primary: #3D2E1E;     /* 深可可主文字（白底 13.5:1） */
    --uw-color-text-secondary: #6E563A;   /* 次级（奶油底 6.0:1；实测 #76593D 在奶油底仅 4.03:1 卡 AA 边缘，必须加深） */
    --uw-color-text-muted: #82684A;       /* 弱化（奶油底 5.06:1；从 #8B7150 4.59:1 加深到稳过 AA，覆盖 12-13px 小字） */

    /* --- 状态色：糖果色调的深阶版，保留识别度同时把文字对比度提到 AA --- */
    --uw-color-success: #1A6B3F;          /* 薄荷深阶（奶油底 5.14:1；按钮白字 5.42:1；原 #1F7A4A 奶油底仅 4.28:1 卡 AA 边缘） */
    --uw-color-warning: #B26B0D;          /* 芒果深阶（白底 6.16:1；原 #FFB84D 作文字仅 1.4:1，几乎不可读） */
    --uw-color-danger:  #C83A3A;          /* 草莓深阶（白底 5.47:1；按钮白字 4.71:1） */
    --uw-color-info:    #2F58B0;          /* 湖蓝深阶（白底 5.56:1；奶油底 5.45:1，稳过 AA） */

    /* --- 稀有/点缀（仅作装饰/徽章背景，不作文字） --- */
    --uw-rarity-legend: #FFC857;          /* 传说金 */
    --uw-rarity-rare: #7CB8FF;            /* 稀有蓝 */
    --uw-extra-pink: #FF8FA3;             /* 蜜桃 */
    --uw-extra-purple: #C7A8FF;           /* 香芋（仅装饰条/徽章/辉光；太浅不适合按钮背景） */
    --uw-extra-mint: #7FDBCA;             /* 薄荷蓝绿 */

    /* --- 卡通造型令牌（新增） --- */
    --uw-ink: #4A3421;                    /* 暖棕外描边 */
    --uw-ink-soft: #C9A87C;               /* 浅描边/分隔 */
    --uw-shade: rgba(122, 92, 64, 0.18);  /* 实体投影色 */
    --uw-btn-text: #FFFFFF;               /* 彩色按钮文字 */
    --uw-btn-diamond-bg: #7A4FC4;         /* 钻石按钮背景（深紫，白字 6.4:1；浅香芋紫 #C7A8FF 仅作徽章/辉光，不适合按钮底） */
    --uw-num-strong: #241507;             /* 数字/数值强对比（白天用近黑暖棕） */
    --uw-resource-pill-bg: #FFF1D6;       /* 白天资源胶囊：暖蜜糖色，与奶油顶栏区分 */
    --uw-resource-pill-stroke: rgba(74, 52, 33, 0.12);
    --uw-r-lg: 18px;
    --uw-r-md: 12px;
    --uw-r-pill: 999px;

    /* 登录页渐变（A 白天：奶油→暖白） */
    --uw-login-glow1: rgba(61, 155, 255, 0.14);
    --uw-login-glow2: rgba(255, 200, 87, 0.20);
    --uw-login-bg-top: #FFF1DC;

    /* --- 字体 --- */
    --uw-font-tech: "Quicksand", "Baloo 2", "Comic Sans MS", "Microsoft YaHei", sans-serif;

    /* --- 星图 SVG 用色（Galaxy.razor 通过 style 变量引用） --- */
    --uw-galaxy-m874: #7FDBCA;            /* 新手星系 */
    --uw-galaxy-smart: #5B8DEF;           /* 智能文明 */
    --uw-galaxy-rebel: #FF6B6B;           /* 叛乱星系 */
    --uw-galaxy-faction: #FFB84D;         /* 势力领地 */
    --uw-galaxy-other: #C9B8A3;
    --uw-galaxy-out: #E5D5BC;             /* 超出燃料范围 */
    --uw-svg-glow-a: rgba(255, 200, 87, 0.50);   /* 星图辉光内 */
    --uw-svg-glow-b: rgba(255, 200, 87, 0.00);   /* 星图辉光外 */
    --uw-colony-ring: #FF9F43;            /* 殖民地光环 */
    --uw-fleet-ring: #3D9BFF;             /* 我方舰队光环 */
}

/* ============================================================================
 * 方向 B · 深空糖果夜（html[data-theme="night"]）
 * ==========================================================================*/
html[data-theme="night"] {
    --uw-color-bg-primary: #221C4E;       /* 靛夜主背景 */
    --uw-color-bg-secondary: #2B2463;     /* 顶栏/侧栏 */
    --uw-color-bg-tertiary: #372E7C;      /* 面板/卡片 */
    --uw-color-bg-hover: #453A95;         /* 悬停 */
    --uw-color-bg-input: #1D1842;         /* 输入框底 */

    --uw-color-accent: #7DD3FC;           /* 亮蓝 */
    --uw-color-accent-hover: #A9E3FF;
    --uw-color-accent-dim: #FFB84D;       /* 橙金强调 */
    --uw-color-glow: rgba(125, 211, 252, 0.22);

    --uw-color-border-dim: #4A3E93;       /* 紫蓝分隔 */
    --uw-color-text-primary: #F3EEFF;
    --uw-color-text-secondary: #C6BCEB;
    --uw-color-text-muted: #8F84C4;

    --uw-color-success: #58C98B;
    --uw-color-warning: #FFB84D;
    --uw-color-danger: #FF6B6B;
    --uw-color-info: #6FA8FF;

    --uw-rarity-legend: #FFD166;
    --uw-rarity-rare: #8FC3FF;
    --uw-extra-pink: #FF8FA3;
    --uw-extra-purple: #C7A8FF;
    --uw-extra-mint: #7FDBCA;

    --uw-ink: #E6DAFF;                    /* 夜主题用淡紫描边，像夜光贴纸 */
    --uw-ink-soft: #6E62B8;
    --uw-shade: rgba(0, 0, 0, 0.35);
    --uw-btn-text: #FFFFFF;
    --uw-btn-diamond-bg: #9575E0;         /* 夜主题钻石按钮背景（亮紫，白字 4.6:1；保持紫色识别度） */
    --uw-num-strong: #FFFFFF;             /* 数字/数值强对比（夜用纯白） */
    --uw-resource-pill-bg: #322A66;       /* 夜间资源胶囊：与靛夜顶栏区分 */
    --uw-resource-pill-stroke: rgba(0, 0, 0, 0.30);

    /* 登录页渐变（B 夜：靛紫夜空） */
    --uw-login-glow1: rgba(125, 211, 252, 0.18);
    --uw-login-glow2: rgba(255, 200, 87, 0.12);
    --uw-login-bg-top: #2A2260;

    --uw-font-tech: "Quicksand", "Baloo 2", "Microsoft YaHei", sans-serif;

    --uw-galaxy-m874: #7FDBCA;
    --uw-galaxy-smart: #6FA8FF;
    --uw-galaxy-rebel: #FF7E86;
    --uw-galaxy-faction: #FFC857;
    --uw-galaxy-other: #9A8FC8;
    --uw-galaxy-out: #1D1842;
    --uw-svg-glow-a: rgba(125, 211, 252, 0.45);
    --uw-svg-glow-b: rgba(125, 211, 252, 0.00);
    --uw-colony-ring: #FFD166;
    --uw-fleet-ring: #7DD3FC;
}

/* ============================================================================
 * 组件补丁（两主题通用；只引用变量）
 * ==========================================================================*/

/* --- 全局背景 / 选中 / 滚动条 --- */
html, body {
    background-color: var(--uw-color-bg-primary);
    color: var(--uw-color-text-primary);
    font-family: "Baloo 2", "Quicksand", "Microsoft YaHei UI", "Microsoft YaHei", sans-serif;
    background-image:
        radial-gradient(ellipse 1100px 700px at 80% -10%, var(--uw-color-glow), transparent 60%),
        radial-gradient(ellipse 900px 600px at 5% 110%, rgba(255, 184, 77, 0.10), transparent 60%);
    background-size: auto, auto;
}
::selection {
    background: rgba(255, 200, 87, 0.35);
    color: var(--uw-color-text-primary);
}
::-webkit-scrollbar-track { background-color: var(--uw-color-bg-secondary); }
::-webkit-scrollbar-thumb { background-color: var(--uw-ink-soft); border-radius: 6px; }
::-webkit-scrollbar-thumb:hover { background-color: var(--uw-color-accent); }

/* --- 顶栏 --- */
.uw-topbar {
    background-color: var(--uw-color-bg-secondary);
    border-bottom: 2px solid var(--uw-ink);
}
.uw-topbar-title {
    color: var(--uw-color-accent);
    letter-spacing: 2px;
}
.uw-topbar-brand { display: flex; align-items: center; gap: 6px; }
.uw-topbar-logo { font-size: 26px; display: inline-block; animation: uw-float 3s ease-in-out infinite; }

/* 资源胶囊：白天用浅蜜糖色背景与奶油顶栏区分，夜间用深紫蓝 */
.uw-resource-item {
    background: var(--uw-resource-pill-bg, var(--uw-color-bg-tertiary));
    border: 2px solid var(--uw-ink-soft);
    border-left-width: 4px;
    border-radius: var(--uw-r-pill);
    box-shadow: 0 2px 0 var(--uw-shade);
    padding: 3px 14px;
    transition: transform .15s ease, box-shadow .15s ease;
}
.uw-resource-item:hover { transform: translateY(-1px); }
.uw-resource-emoji {
    font-size: 18px;
    width: 20px;
}
/* 资源数值加大加粗 + 强对比色，确保奶油白底/深紫底都清晰 */
.uw-resource-value {
    color: var(--uw-num-strong);
    font-size: 15px;
    font-weight: 900;
    font-variant-numeric: tabular-nums;
    text-shadow: 0 1px 0 var(--uw-resource-pill-stroke, transparent);
    letter-spacing: 0.3px;
}
.uw-resource-label {
    color: var(--uw-color-text-secondary);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.3px;
}
/* 氦³ 上标数字：同 label 字号、略偏上，避免 unicode ³ 太小看不清 */
.uw-sup {
    font-size: 0.92em;
    vertical-align: super;
    line-height: 1;
    font-weight: 800;
}
.uw-topbar-mail-badge .uw-resource-emoji,
.uw-topbar-help .uw-resource-emoji { font-size: 18px; }
.uw-topbar-mail-badge, .uw-topbar-help {
    background: var(--uw-color-bg-tertiary);
    border-radius: var(--uw-r-pill);
    border: 1.5px solid var(--uw-ink-soft);
    padding: 3px 10px;
}
.uw-topbar-mail-badge i, .uw-topbar-help i { color: var(--uw-color-text-secondary); }
.uw-topbar-mail-badge:hover i, .uw-topbar-help:hover i { color: var(--uw-color-accent); }
.uw-topbar-time {
    color: var(--uw-color-text-muted);
    font-family: var(--uw-font-tech);
}
.uw-badge {
    background-color: var(--uw-color-danger);
    border-radius: var(--uw-r-pill);
    border: 1px solid var(--uw-color-bg-tertiary);
}

/* --- 侧栏导航 --- */
.uw-layout-sidebar {
    background-color: var(--uw-color-bg-secondary);
    border-right: 2px solid var(--uw-ink);
}
.uw-nav-group { border-bottom: 1px solid var(--uw-color-border-dim); }
.uw-nav-group-header {
    color: var(--uw-color-text-secondary);
    border-left: 3px solid transparent;
    border-radius: 10px 0 0 10px;
    margin: 2px 4px;
    width: auto;
}
.uw-nav-group-header i { font-size: 15px; }
.uw-nav-emoji { font-size: 18px; transition: transform .15s ease; }
.uw-nav-group-header:hover { color: var(--uw-color-accent); }
.uw-nav-group.expanded > .uw-nav-group-header {
    color: var(--uw-color-accent);
    border-left-color: var(--uw-color-accent);
    background: var(--uw-color-bg-hover);
}
.uw-nav-item {
    color: var(--uw-color-text-secondary);
    border-left: 3px solid transparent;
    border-radius: 10px 0 0 10px;
    margin: 1px 4px;
}
.uw-nav-item:hover { color: var(--uw-color-accent); }
.uw-nav-item:hover .uw-nav-emoji { transform: scale(1.2); }
.uw-nav-item.active {
    color: var(--uw-btn-text);
    background: var(--uw-color-accent);
    border-left-color: var(--uw-color-accent-hover);
    box-shadow: 0 2px 0 var(--uw-shade);
}
.uw-nav-item.active .uw-nav-emoji { color: #FFF; }

/* --- 底部栏 --- */
.uw-layout-footer {
    background-color: var(--uw-color-bg-secondary);
    border-top: 2px solid var(--uw-ink);
}
.uw-footer-status { color: var(--uw-color-text-muted); }
.uw-chat-input {
    background-color: var(--uw-color-bg-input);
    border: 1.5px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
    color: var(--uw-color-text-primary);
    padding: 4px 12px;
}
.uw-chat-send {
    background-color: var(--uw-color-accent);
    color: var(--uw-btn-text);
    border-radius: var(--uw-r-pill);
    padding: 4px 14px;
}
.uw-chat-send:hover { background-color: var(--uw-color-accent-hover); }

/* --- 页面标题 --- */
.uw-page-title {
    color: var(--uw-color-accent);
    letter-spacing: 1px;
    text-shadow: none;
    border-bottom: 2px solid var(--uw-ink-soft);
    padding-bottom: 8px;
}
.uw-page-title .uw-nav-emoji { font-size: 20px; }

/* --- 通用按钮：机甲斜切甲板（替代糖果药丸，游戏感更强） ---
   clip-path 斜切双角 + 双伪元素（外描边层/渐变填充层），全部走主题变量：
   白天=暖棕描边 + 亮色甲板贴纸；夜晚=淡紫外框 + 靛蓝甲板 */
.uw-btn-primary,
.uw-btn-secondary,
.uw-btn-default,
.uw-btn-danger,
.uw-btn-diamond {
    position: relative;
    border: none;
    border-radius: 0;
    padding: 5px 14px;
    box-shadow: none;
    background: transparent;
    /* 左上/右下斜切的机甲甲板轮廓 */
    clip-path: polygon(7px 0, 100% 0, 100% calc(100% - 7px), calc(100% - 7px) 100%, 0 100%, 0 7px);
    transition: filter .15s ease;
}

/* 描边层：clip-path 裁掉真实 border，用底层伪元素模拟 */
.uw-btn-primary::before,
.uw-btn-secondary::before,
.uw-btn-default::before,
.uw-btn-danger::before,
.uw-btn-diamond::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -2;
    background: var(--uw-btn-edge, var(--uw-ink-soft));
}

/* 填充层：渐变甲板 + 悬停扫光掠过 */
.uw-btn-primary::after,
.uw-btn-secondary::after,
.uw-btn-default::after,
.uw-btn-danger::after,
.uw-btn-diamond::after {
    content: '';
    position: absolute;
    inset: 1.5px;
    z-index: -1;
    background-image:
        linear-gradient(105deg, transparent 42%, rgba(255, 255, 255, 0.15) 50%, transparent 58%),
        linear-gradient(180deg, var(--uw-btn-fill-top, var(--uw-color-bg-tertiary)) 0%, var(--uw-btn-fill-bottom, var(--uw-color-bg-hover)) 100%);
    background-size: 250% 100%, 100% 100%;
    background-position: 170% 0, 0 0;
    background-repeat: no-repeat;
    clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px);
    transition: background-position .45s ease;
}

.uw-btn-primary:hover:not(:disabled),
.uw-btn-secondary:hover:not(:disabled),
.uw-btn-default:hover:not(:disabled),
.uw-btn-danger:hover:not(:disabled),
.uw-btn-diamond:hover:not(:disabled) {
    filter: drop-shadow(0 0 4px var(--uw-color-glow)) brightness(1.06);
}

.uw-btn-primary:hover:not(:disabled)::after,
.uw-btn-secondary:hover:not(:disabled)::after,
.uw-btn-default:hover:not(:disabled)::after,
.uw-btn-danger:hover:not(:disabled)::after,
.uw-btn-diamond:hover:not(:disabled)::after {
    background-position: -70% 0, 0 0;
}

.uw-btn-primary:not(:disabled):active,
.uw-btn-secondary:not(:disabled):active,
.uw-btn-default:not(:disabled):active,
.uw-btn-danger:not(:disabled):active,
.uw-btn-diamond:not(:disabled):active {
    filter: brightness(.88);
}

.uw-btn-primary:disabled,
.uw-btn-secondary:disabled,
.uw-btn-default:disabled,
.uw-btn-danger:disabled,
.uw-btn-diamond:disabled {
    opacity: .5;
}

/* 主按钮：主题强调色甲板 + 深描边 */
.uw-btn-primary {
    --uw-btn-fill-top: var(--uw-color-accent-hover);
    --uw-btn-fill-bottom: var(--uw-color-accent);
    --uw-btn-edge: var(--uw-ink);
    color: var(--uw-btn-text);
}

/* 夜主题主按钮：夜accent太浅（白字对比不足），改用深蓝甲板保证白字可读 */
html[data-theme="night"] .uw-btn-primary {
    --uw-btn-fill-top: #25639E;
    --uw-btn-fill-bottom: #174A7C;
}

/* 次级/默认按钮：面板色甲板 + 浅描边（凹感的退后一步） */
.uw-btn-secondary,
.uw-btn-default {
    --uw-btn-fill-top: var(--uw-color-bg-tertiary);
    --uw-btn-fill-bottom: var(--uw-color-bg-hover);
    --uw-btn-edge: var(--uw-ink-soft);
    color: var(--uw-color-text-primary);
}

/* 危险按钮：草莓红甲板，警示但不刺眼 */
.uw-btn-danger {
    --uw-btn-fill-top: var(--uw-color-danger);
    --uw-btn-fill-bottom: var(--uw-color-danger);
    --uw-btn-edge: var(--uw-ink);
    color: var(--uw-btn-text);
}

/* 钻石按钮：香芋紫甲板（商城/付费入口） */
.uw-btn-diamond {
    --uw-btn-fill-top: var(--uw-btn-diamond-bg);
    --uw-btn-fill-bottom: var(--uw-btn-diamond-bg);
    --uw-btn-edge: var(--uw-ink);
    color: var(--uw-btn-text);
}
.uw-topbar-logout {
    color: var(--uw-color-accent);
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
    padding: 4px 14px;
    background: var(--uw-color-bg-tertiary);
}
.uw-topbar-logout:hover { border-color: var(--uw-color-danger); color: var(--uw-color-danger); background: rgba(255, 107, 107, 0.12); }

/* --- 通用输入 --- */
.uw-chat-input, input, select, textarea {
    font-family: var(--uw-font-tech);
}
input[type="text"], input[type="password"], input[type="number"], select {
    background-color: var(--uw-color-bg-input);
    border: 1.5px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md);
    color: var(--uw-color-text-primary);
    padding: 4px 10px;
}

/* --- 徽章 / 标签 --- */
.uw-tag, .uw-tag-mother, .uw-galaxy-type-badge,
.uw-tag-owned, .uw-commander-rarity, .uw-faction-rank-badge,
.uw-legion-member-rank, .uw-battle-type-badge, .uw-trade-status, .uw-fleet-state {
    border-radius: var(--uw-r-pill);
    border: 1px solid var(--uw-ink-soft);
    padding: 2px 10px;
    background-color: var(--uw-color-bg-tertiary);
}

/* --- 空态 / 加载 --- */
.uw-empty { color: var(--uw-color-text-muted); }
.uw-empty i { font-size: 34px; display: block; }
.uw-loading { color: var(--uw-color-text-muted); }
.uw-loading-bar { border-radius: var(--uw-r-pill); }
.uw-loading-text { color: var(--uw-color-text-secondary); }

/* --- 进度条：糖果罐 --- */
.uw-progress-bar {
    height: 10px;
    background: var(--uw-color-bg-hover);
    border: 1.5px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
}
.uw-progress-bar-fill,
.uw-achievement-progress-bar > div,
.uw-loading-bar .progress-bar {
    background-image: linear-gradient(90deg, var(--uw-extra-mint), var(--uw-color-accent), var(--uw-rarity-legend));
    border-radius: var(--uw-r-pill);
}

/* --- 弹窗 --- */
.uw-modal-mask,
.uw-modal-overlay { background-color: rgba(20, 14, 6, 0.45); }
.uw-modal {
    background-color: var(--uw-color-bg-tertiary);
    border: 2.5px solid var(--uw-ink);
    border-radius: var(--uw-r-lg);
    box-shadow: 0 8px 30px var(--uw-shade);
    color: var(--uw-color-text-primary);
}
.uw-modal h4, .uw-modal h5, .uw-modal-head h4, .uw-modal-head h5 { color: var(--uw-color-accent); }
.uw-modal-actions button { margin-top: 6px; }

/* --- 页签 --- */
.uw-tab {
    background: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink-soft);
    color: var(--uw-color-text-secondary);
    border-radius: var(--uw-r-pill);
    letter-spacing: 4px;
    padding: 6px 0;
}
.uw-tab.active {
    background: var(--uw-color-accent);
    border-color: var(--uw-ink);
    color: var(--uw-btn-text);
}

/* ============================================================================
 * 页面卡片族（把各类业务卡统一成"圆角奶油卡 + 暖棕描边 + 贴纸投影"）
 * ==========================================================================*/
.uw-planet-card,
.uw-building-card,
.uw-tech-card,
/* .uw-tech-category 曾在这份名单里，但它是「分组容器」而不是「卡片」。
   放进本组会让分组框和它内部的研究项目卡变成同一层级的实体卡片 = 框套框；
   它的托盘规则见文件末尾。注意别再把分组容器往这组里加了。 */
.uw-ship-card,
.uw-template-card,
.uw-commander-card,
.uw-recruit-card,
.uw-shop-card,
.uw-report-item,
.uw-battle-result,
.uw-mail-item,
.uw-event-card,
.uw-quest-item,
.uw-achievement-card,
.uw-leaderboard-podium-item,
.uw-leaderboard-row,
.uw-trade-row,
.uw-fleet-row,
.uw-profile-stat-card,
.uw-signin-day,
.uw-formation-section {
    background-color: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md);
    box-shadow: 0 3px 0 var(--uw-shade);
    color: var(--uw-color-text-primary);
    transition: transform .12s ease, box-shadow .12s ease;
}
.uw-planet-card:hover,
.uw-building-card:hover,
.uw-tech-card:hover,
.uw-ship-card:hover,
.uw-commander-card:hover,
.uw-shop-card:hover,
.uw-mail-item:hover,
.uw-event-card:hover,
.uw-quest-item:hover {
    transform: translateY(-1px);
    box-shadow: 0 4px 0 var(--uw-shade);
}
.uw-planet-name, .uw-commander-name, .uw-mail-subject { font-weight: 700; }
.uw-stat-row { color: var(--uw-color-text-secondary); }
.uw-stat-row span:last-child { color: var(--uw-color-text-primary); font-weight: 600; }
.uw-stat-row.uw-stat-danger span:last-child {
    color: var(--uw-color-danger);
    font-weight: 800;
}
/* 星球等级徽章：橙金底压深棕字（两主题 accent-dim 都是 #FFB84D，深棕字对比 9:1；原 accent 蓝字压金黄仅 1.79:1） */
.uw-tag-level {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    background: var(--uw-color-accent-dim);
    color: #241507;
    font-size: 11px;
    font-weight: 700;
    border-radius: var(--uw-r-pill);
    padding: 1px 8px;
    white-space: nowrap;
}
.uw-tag-level b { font-weight: 900; }
.uw-meta-danger { color: var(--uw-color-danger); font-weight: 700; }
.uw-rate { color: var(--uw-color-success); }

/* --- 表格 --- */
.uw-table, table {
    background: var(--uw-color-bg-tertiary);
    color: var(--uw-color-text-primary);
    border-radius: var(--uw-r-md);
}
.uw-table th, table th {
    background: var(--uw-color-bg-hover);
    color: var(--uw-color-accent);
    border-bottom: 2px solid var(--uw-ink-soft);
    padding: 6px 8px;
}
.uw-table td, table td { border-bottom: 1px solid var(--uw-color-border-dim); padding: 5px 8px; }

/* ============================================================================
 * 登录页
 * ==========================================================================*/
/* 登录页整屏背景跟随主题（覆盖基础文件里的深空渐变） */
.uw-login {
    background:
        radial-gradient(ellipse 900px 520px at 72% -15%, var(--uw-login-glow1), transparent 65%),
        radial-gradient(ellipse 760px 460px at 8% 112%, var(--uw-login-glow2), transparent 65%),
        linear-gradient(180deg, var(--uw-login-bg-top) 0%, var(--uw-color-bg-primary) 100%);
}

/* 宽屏双栏：左侧品牌/宣传 + 右侧登录卡 */
.uw-login-layout {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: clamp(40px, 8vw, 140px);
    width: 100%;
    max-width: 1240px;
    margin: 0 auto;
    min-height: 100vh;
    padding: 24px clamp(20px, 5vw, 64px);
}
/* 布局层柔和渐变：让登录区与周围颜色"溶"过去，避免一块硬白 */
.uw-login-layout::before {
    content: "";
    position: absolute;
    inset: -8% -6%;
    z-index: -1;
    pointer-events: none;
    background:
        radial-gradient(ellipse 720px 480px at 50% 50%, rgba(61, 155, 255, 0.12), transparent 70%),
        radial-gradient(ellipse 520px 360px at 82% 28%, rgba(255, 200, 87, 0.18), transparent 70%),
        radial-gradient(ellipse 460px 340px at 16% 78%, rgba(199, 168, 255, 0.16), transparent 70%);
    filter: blur(2px);
}
html[data-theme="night"] .uw-login-layout::before {
    background:
        radial-gradient(ellipse 720px 480px at 50% 50%, rgba(125, 211, 252, 0.20), transparent 70%),
        radial-gradient(ellipse 520px 360px at 82% 28%, rgba(255, 209, 102, 0.14), transparent 70%),
        radial-gradient(ellipse 460px 340px at 16% 78%, rgba(199, 168, 255, 0.18), transparent 70%);
}
.uw-login-hero {
    flex: 1 1 440px;
    max-width: 480px;
    text-align: left;
}
.uw-hero-title {
    margin: 0;
    font-size: clamp(30px, 4.2vw, 46px);
    font-weight: 800;
    letter-spacing: 2px;
    color: var(--uw-color-accent);
}
.uw-hero-en {
    font-family: var(--uw-font-tech);
    letter-spacing: 6px;
    font-size: 14px;
    color: var(--uw-color-text-muted);
    margin: 6px 0 14px;
}
.uw-hero-desc {
    margin: 0 0 20px;
    font-size: 16px;
    line-height: 1.8;
    color: var(--uw-color-text-secondary);
}
/* 朴素圆点列表：去掉 AI 味的胶囊卡片排比 */
.uw-hero-feats {
    list-style: none;
    margin: 0 0 24px;
    padding: 0;
    display: grid;
    gap: 9px;
    font-size: 14px;
    color: var(--uw-color-text-secondary);
}
.uw-hero-feats li {
    display: flex;
    align-items: baseline;
    gap: 10px;
}
.uw-hero-feats li::before {
    content: "";
    flex-shrink: 0;
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--uw-color-accent);
    transform: translateY(-2px);
}
/* 玩家交流群：低调边框块 + 一键复制 */
.uw-hero-qq {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    border: 1.5px solid var(--uw-ink-soft);
    background: var(--uw-color-bg-tertiary);
    border-radius: var(--uw-r-pill);
    padding: 8px 10px 8px 18px;
    font-size: 14px;
}
.uw-hero-qq-label { color: var(--uw-color-text-muted); }
.uw-hero-qq-num {
    font-family: var(--uw-font-tech);
    font-weight: 700;
    letter-spacing: 1px;
    color: var(--uw-color-accent);
}
.uw-hero-qq-copy {
    border: 1.5px solid var(--uw-ink-soft);
    background: var(--uw-color-bg-secondary);
    border-radius: var(--uw-r-pill);
    padding: 3px 12px;
    font-size: 12px;
    font-weight: 600;
    color: var(--uw-color-text-primary);
    cursor: pointer;
    transition: border-color .15s ease, color .15s ease;
}
.uw-hero-qq-copy:hover {
    border-color: var(--uw-color-accent);
    color: var(--uw-color-accent);
}
/* 登录卡对齐双栏 */
.uw-login-layout .uw-login-card {
    width: 460px;
    max-width: 92vw;
    flex: 0 0 auto;
    margin: 0;
    padding: 40px 40px 28px;
}
/* 宽屏：卡片内的小品牌区由左侧 hero 替代，隐藏避免重复 */
.uw-login-layout .uw-login-brand { display: none; }
/* 窄屏：只保留居中的登录卡，hero 隐藏，恢复小品牌区 */
@media (max-width: 900px) {
    .uw-login-layout {
        flex-direction: column;
        justify-content: center;
        gap: 0;
    }
    .uw-login-hero { display: none; }
    .uw-login-layout .uw-login-brand { display: block; }
}

.uw-login-bg {
    background-image:
        radial-gradient(2px 2px at 12% 18%, var(--uw-extra-pink), transparent 60%),
        radial-gradient(2px 2px at 28% 62%, var(--uw-rarity-legend), transparent 60%),
        radial-gradient(3px 3px at 43% 28%, var(--uw-color-accent), transparent 60%),
        radial-gradient(2px 2px at 57% 74%, var(--uw-extra-mint), transparent 60%),
        radial-gradient(2px 2px at 68% 38%, var(--uw-rarity-rare), transparent 60%),
        radial-gradient(3px 3px at 76% 82%, var(--uw-extra-purple), transparent 60%),
        radial-gradient(2px 2px at 86% 15%, var(--uw-rarity-legend), transparent 60%);
    opacity: 1;
}
.uw-login-card {
    background: linear-gradient(105deg, #FFFFFF 0%, #FFFFFF 30%, #FFF7E6 72%, #FFEFC9 100%);
    border: none;
    border-radius: 22px;
    box-shadow:
        0 4px 0 var(--uw-shade),
        30px 0 80px -20px rgba(255, 200, 87, 0.45),
        -30px 0 80px -20px rgba(61, 155, 255, 0.40);
    backdrop-filter: none;
    color: var(--uw-color-text-primary);
    overflow: visible;
    position: relative;
}
/* 卡片右侧色溢出：让卡片颜色"流"到背景（独立光晕，不影响卡片本体不透明度） */
.uw-login-card::after {
    content: "";
    position: absolute;
    right: -120px;
    top: 30%;
    width: 280px;
    height: 280px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 200, 87, 0.45) 0%, rgba(255, 200, 87, 0) 70%);
    pointer-events: none;
    z-index: -1;
}
html[data-theme="night"] .uw-login-card {
    background: linear-gradient(105deg, #372E7C 0%, #372E7C 30%, #3A2F86 70%, #453A95 100%);
    border: none;
    box-shadow:
        0 4px 0 var(--uw-shade),
        30px 0 80px -20px rgba(255, 200, 87, 0.40),
        -30px 0 80px -20px rgba(125, 211, 252, 0.38);
}
html[data-theme="night"] .uw-login-card::after {
    background: radial-gradient(circle, rgba(255, 200, 87, 0.35) 0%, rgba(255, 200, 87, 0) 70%);
}
.uw-login-logo { font-size: 52px; color: var(--uw-color-accent); animation: uw-float 3s ease-in-out infinite; }
.uw-login-title { color: var(--uw-color-accent); letter-spacing: 2px; }
.uw-login-subtitle { color: var(--uw-color-text-muted); letter-spacing: 3px; font-family: var(--uw-font-tech); }
.uw-login-field {
    position: relative;
    display: flex;
    align-items: center;
    background: transparent;         /* 不填背景色，避免半透明块突兀 */
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
    height: 46px;
    padding: 0 18px 0 6px;
    transition: border-color .15s ease, box-shadow .15s ease;
    box-sizing: border-box;
    gap: 10px;
}
.uw-login-field:focus-within {
    border-color: var(--uw-color-accent);
    box-shadow: 0 0 0 3px rgba(61, 155, 255, 0.18);
}
.uw-login-field i {
    position: static;               /* 覆盖基础样式里的 absolute，避免图标压住输入框 */
    flex-shrink: 0;
    width: 32px;
    height: 32px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--uw-color-accent);
    background: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink-soft);
    border-radius: 50%;
    font-size: 13px;
    line-height: 1;
}
.uw-login-field input {
    flex: 1;
    background: transparent;
    border: none !important;
    color: var(--uw-color-text-primary);
    padding: 0;
    margin: 0;
    font-size: 14px;
    font-weight: 600;
    height: 100%;
    line-height: 1;
    box-shadow: none !important;
    outline: none;
}
.uw-login-field input::placeholder { color: var(--uw-color-text-muted); font-weight: 500; }
.uw-login-submit {
    background-color: var(--uw-color-accent);
    border: 2.5px solid var(--uw-ink);
    border-radius: var(--uw-r-pill);
    color: var(--uw-btn-text);
    box-shadow: 0 4px 0 var(--uw-shade);
}
.uw-login-submit:active { transform: translateY(2px); box-shadow: 0 1px 0 var(--uw-shade); }
.uw-login-error {
    background: rgba(255, 107, 107, 0.15);
    border: 1.5px solid var(--uw-color-danger);
    color: var(--uw-color-danger);
    border-radius: var(--uw-r-md);
    padding: 6px 10px;
    /* 异常堆栈等超长文本：限制宽高并允许滚动（与 universe-war.css 基础层一致） */
    max-width: 100%;
    max-height: 160px;
    overflow-y: auto;
    word-break: break-all;
}
.uw-login-foot { color: var(--uw-color-text-muted); }
.uw-login-foot-dot { background-color: var(--uw-color-success); }

/* ============================================================================
 * 星球切换器（PlanetSwitcher 共享组件）：自定义下拉 + 记忆上次星球
 * ==========================================================================*/
.uw-planet-switcher {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    background: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md);
    box-shadow: 0 3px 0 var(--uw-shade);
    padding: 8px 14px;
}
/* PlanetSwitcher 组件根容器：按钮 + 详情条同行排列，必要时换行 */
.uw-planet-switcher-bar {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    margin-bottom: 10px;
}
.uw-planet-switcher-bar .uw-planet-switcher-info {
    margin-left: auto;
}
.uw-planet-switcher-label {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--uw-color-text-secondary);
    font-size: 13px;
    font-weight: 700;
    white-space: nowrap;
}
.uw-planet-switcher-label i { color: var(--uw-color-accent); }

.uw-planet-select-wrap { position: relative; display: inline-block; min-width: 200px; }
.uw-planet-trigger {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    cursor: pointer;
    background: var(--uw-color-bg-input, var(--uw-color-bg-hover));
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
    color: var(--uw-color-text-primary);
    padding: 5px 14px 5px 10px;
    font-size: 14px;
    font-weight: 700;
    box-shadow: 0 2px 0 var(--uw-shade);
    transition: transform .12s ease, box-shadow .12s ease, border-color .15s ease;
}
.uw-planet-trigger:hover { border-color: var(--uw-color-accent); transform: translateY(-1px); }
.uw-planet-trigger:active { transform: translateY(1px); box-shadow: none; }
.uw-planet-trigger-icon { font-size: 17px; }
.uw-planet-trigger-name { max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.uw-planet-caret { margin-left: auto; color: var(--uw-color-text-muted); font-size: 12px; }
.uw-tag-mini { font-size: 10px; padding: 0 6px; border-radius: var(--uw-r-pill); }

.uw-planet-backdrop {
    position: fixed;
    inset: 0;
    z-index: 950;
    background: transparent;
}
.uw-planet-menu {
    position: absolute;
    left: 0;
    top: calc(100% + 8px);
    z-index: 960;
    min-width: 280px;
    max-height: 320px;
    overflow-y: auto;
    background: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink);
    border-radius: var(--uw-r-md);
    box-shadow: 0 10px 30px var(--uw-shade);
    padding: 6px;
}
.uw-planet-menu-title {
    color: var(--uw-color-text-muted);
    font-size: 12px;
    font-weight: 700;
    padding: 4px 8px 6px;
    border-bottom: 1px dashed var(--uw-color-border-dim);
    margin-bottom: 4px;
}
.uw-planet-menu-empty { padding: 14px; text-align: center; color: var(--uw-color-text-muted); font-size: 13px; }
.uw-planet-opt {
    display: flex;
    align-items: center;
    gap: 10px;
    width: 100%;
    text-align: left;
    background: transparent;
    border: none;
    border-radius: 10px;
    color: var(--uw-color-text-primary);
    padding: 7px 8px;
    cursor: pointer;
}
.uw-planet-opt:hover { background: var(--uw-color-bg-hover); }
.uw-planet-opt.active { background: var(--uw-color-bg-hover); box-shadow: inset 3px 0 0 var(--uw-color-accent); }
.uw-planet-opt-icon { font-size: 20px; flex-shrink: 0; }
.uw-planet-opt-body { flex: 1; display: flex; flex-direction: column; min-width: 0; }
.uw-planet-opt-name { font-size: 14px; font-weight: 700; display: flex; align-items: center; gap: 6px; }
.uw-planet-opt-type { font-size: 10px; color: var(--uw-color-accent); background: var(--uw-color-glow); border-radius: var(--uw-r-pill); padding: 0 6px; font-weight: 600; }
.uw-planet-opt-meta { font-size: 11px; color: var(--uw-color-text-muted); margin-top: 1px; }
.uw-planet-opt-check { color: var(--uw-color-accent); flex-shrink: 0; }
.uw-planet-switcher-info {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    color: var(--uw-color-text-secondary);
    font-size: 12px;
    flex-wrap: wrap;
}
.uw-planet-switcher-info i { color: var(--uw-color-accent); width: 14px; text-align: center; }

/* ============================================================================
 * 星图（SVG 相关色均走变量；辉光 stop 用 CSS 覆盖，节点 fill 由 Razor 注入 style）
 * ==========================================================================*/
.uw-galaxy-svg { background-color: transparent; }
.uw-galaxy-node circle[fill^="var"] { stroke-width: 2.5; }
.uw-galaxy-node circle.r-glow { }
#uwGalaxyGlow stop:first-child { stop-color: var(--uw-svg-glow-a); }
#uwGalaxyGlow stop:last-child { stop-color: var(--uw-svg-glow-b); }
.uw-colony-ring { stroke: var(--uw-colony-ring) !important; stroke-dasharray: 4 3; }
.uw-fleet-ring { stroke: var(--uw-fleet-ring) !important; }
.uw-galaxy-link { stroke: var(--uw-ink-soft); }
.uw-galaxy-link.jumpable { stroke: var(--uw-color-accent); opacity: .95; }
.uw-galaxy-zoom-btn {
    background: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
    color: var(--uw-color-accent);
    box-shadow: 0 2px 0 var(--uw-shade);
}
.uw-galaxy-detail {
    background-color: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md);
    box-shadow: 0 3px 0 var(--uw-shade);
}
.uw-jump-card {
    background-color: var(--uw-color-bg-tertiary);
    border: 3px solid var(--uw-ink);
    border-radius: var(--uw-r-lg);
    box-shadow: 0 8px 30px var(--uw-shade);
}
.uw-jump-card .uw-jump-title { color: var(--uw-color-accent); }

/* ============================================================================
 * WinBox 桌面式弹窗（BootstrapBlazor.WinBox）：统一成与 A/B 主题一致的糖果窗口
 * ==========================================================================*/
.winbox,
.bb-win-box,
.wb-winbox {
    font-family: "Baloo 2", "Quicksand", "Microsoft YaHei UI", "Microsoft YaHei", sans-serif;
    border-radius: 14px;
    overflow: hidden;
    box-shadow: 0 18px 40px -12px var(--uw-shade), 0 6px 16px rgba(0, 0, 0, 0.25);
}
.winbox {
    --bb-winbox-bg: var(--uw-color-bg-secondary);
}
/* 标题栏：双主题渐变——白天蜜糖浅金 + 深可可字；夜晚深靛蓝渐变 + 白字。
   WinBox 的 css 是弹窗打开时才注入 <head>，晚于本主题 css，
   因此这里用 !important 保证主题在任意加载顺序下都生效。
   （渐变端点色 --uw-winbox-title-a/b 与字色 --uw-winbox-title-color 在文件末尾按主题定义） */
.wb-header,
.winbox .wb-header {
    background: linear-gradient(135deg, var(--uw-winbox-title-a, #4a5fd0), var(--uw-winbox-title-b, #333b8f)) !important;
    color: var(--uw-winbox-title-color, #fff) !important;
}
.wb-title,
.winbox .wb-title {
    color: var(--uw-winbox-title-color, #fff) !important;
    font-size: 14px;
    font-weight: 700;
    letter-spacing: 0.5px;
    text-shadow: none;
}
/* 标题控制按钮（最小化/最大化/关闭）：保留 WinBox 自带白色图标，仅给深色标题栏下微调亮度 */
.wb-control,
.winbox .wb-control {
    opacity: 0.92;
    transition: opacity .15s ease;
}
.wb-control:hover,
.winbox .wb-control:hover {
    opacity: 1;
}
/* 内容区：必须跟随主题背景色，防止默认黑色/深色穿帮 */
.wb-body,
.winbox .wb-body {
    background: var(--uw-color-bg-tertiary) !important;
    color: var(--uw-color-text-primary) !important;
    /* 原 4px：弹窗内容四周过窄，底边尤其贴死 —— 加大到与 .uw-page 视觉节奏一致的呼吸感 */
    padding: 10px 12px 14px;
}
html[data-theme="night"] .wb-body,
html[data-theme="night"] .winbox .wb-body {
    background: var(--uw-color-bg-tertiary) !important;
}
.winbox {
    background: var(--uw-color-bg-tertiary) !important;
}
html[data-theme="night"] .winbox {
    background: var(--uw-color-bg-tertiary) !important;
}
/* 弹窗内滚动条跟随主题 */
.wb-body::-webkit-scrollbar,
.wb-body::-webkit-scrollbar-thumb {
    background: transparent;
}
.wb-body {
    scrollbar-width: thin;
    scrollbar-color: var(--uw-ink-soft) transparent;
}
.winbox .uw-formation-layout,
.wb-body .uw-formation-layout {
    height: 100%;
}
.winbox .uw-operation-message {
    margin: 4px 8px;
}
.winbox .uw-formation-section,
.wb-body .uw-formation-section {
    margin-bottom: 6px;
}
/* 阵型网格槽位 / 仓库战舰列表 / 选择器 / 信息条（WinBox 内随主题显示） */
.winbox .uw-formation-slot,
.wb-body .uw-formation-slot {
    background: var(--uw-color-bg-hover);
    border: 2px dashed var(--uw-ink-soft);
    border-radius: 10px;
    color: var(--uw-color-text-primary);
    padding: 6px 4px;
    cursor: pointer;
    min-height: 52px;
}
.winbox .uw-formation-slot.selected,
.wb-body .uw-formation-slot.selected {
    border: 2px solid var(--uw-color-accent);
    background: var(--uw-color-accent-glow, var(--uw-color-glow));
}
.winbox .uw-formation-slot .uw-slot-name,
.wb-body .uw-formation-slot .uw-slot-name {
    color: var(--uw-color-text-muted);
    font-size: 10px;
}
.winbox .uw-formation-fleet-info h4,
.wb-body .uw-formation-fleet-info h4 {
    color: var(--uw-color-accent);
}
.winbox .uw-formation-stats,
.wb-body .uw-formation-stats {
    color: var(--uw-color-text-secondary);
}
.winbox .uw-warehouse-ship,
.wb-body .uw-warehouse-ship,
.winbox .uw-current-commander,
.wb-body .uw-current-commander {
    background: var(--uw-color-bg-tertiary);
    border: 1.5px solid var(--uw-ink-soft);
    border-radius: 10px;
    color: var(--uw-color-text-primary);
    padding: 6px 8px;
    margin-bottom: 6px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}
.winbox .uw-slot-ship,
.wb-body .uw-slot-ship {
    background: var(--uw-color-bg-tertiary);
    border: 1px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
    color: var(--uw-color-text-primary);
    font-size: 11px;
}
.winbox .uw-commander-select,
.winbox .uw-strategy-select,
.wb-body select {
    background: var(--uw-color-bg-input, var(--uw-color-bg-tertiary));
    color: var(--uw-color-text-primary);
    border: 1.5px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md);
    padding: 5px 10px;
}
.winbox .uw-ship-info small,
.wb-body .uw-ship-info small {
    color: var(--uw-color-text-muted);
}
.winbox .uw-info-small,
.wb-body .uw-info-small {
    color: var(--uw-color-text-secondary);
}
.winbox .uw-operation-message,
.wb-body .uw-operation-message {
    background: var(--uw-color-bg-hover);
    border: 1px solid var(--uw-color-accent-dim);
    border-radius: var(--uw-r-md);
    color: var(--uw-color-accent);
    padding: 6px 10px;
}
.winbox .uw-btn-sm {
    padding: 4px 10px;
}

/* ============================================================================
 * 名称旁的小编辑按钮（星球/星系改名入口）
 * ==========================================================================*/
.uw-icon-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    padding: 0;
    margin-left: 5px;
    border: none;
    border-radius: 50%;
    background: transparent;
    color: var(--uw-color-text-muted);
    font-size: 12px;
    cursor: pointer;
    line-height: 1;
    transition: background .15s ease, color .15s ease, transform .12s ease;
    vertical-align: middle;
}
.uw-icon-btn:hover {
    background: var(--uw-color-accent-dim);
    color: var(--uw-color-accent);
    transform: scale(1.1);
}
.uw-icon-btn:active {
    transform: scale(0.95);
}
/* 星球卡头部：名字旁小按钮与母星徽章依次排列 */
.uw-planet-header {
    flex-wrap: wrap;
}
.uw-planet-header .uw-planet-name {
    flex: 1 1 auto;
}
.uw-planet-header .uw-icon-btn {
    order: 2;
}
.uw-planet-header .uw-tag-mother {
    order: 3;
}
.uw-galaxy-detail-header h4 .uw-icon-btn {
    margin-left: 4px;
}
/* 我方领地的殖民管理快捷入口 */
.uw-galaxy-owner-actions {
    display: inline-flex;
    gap: 4px;
    margin-left: 6px;
    vertical-align: middle;
}
.uw-link-quick {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: var(--uw-color-accent);
    font-size: 11px;
    font-weight: 700;
    padding: 2px 8px;
    border: 1px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-pill);
    background: var(--uw-color-bg-tertiary);
    text-decoration: none;
    transition: background .15s ease, transform .12s ease;
}
.uw-link-quick:hover {
    background: var(--uw-color-bg-hover);
    transform: translateY(-1px);
    color: var(--uw-color-accent);
}
/* 星图/弹窗内：小型图标操作按钮（编组/进攻/采集/加注/撤退/重选目标/退出等） */
.uw-jump-fleet-row {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 8px;
}
.uw-jump-fleet-row .uw-jump-fleet-select {
    flex: 1 1 auto;
    min-width: 0;
}
.uw-act-btn {
    flex-shrink: 0;
    border-radius: 8px !important;
    width: 24px;
    height: 24px;
    font-size: 13px;
}
.uw-act-btn:hover {
    transform: translateY(-1px);
}
.uw-act-danger {
    color: var(--uw-color-danger) !important;
}
.uw-act-danger:hover {
    background: var(--uw-color-danger-dim, rgba(231, 76, 60, 0.15)) !important;
    color: var(--uw-color-danger) !important;
}
.uw-jump-target-selected {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
}

/* ============================================================================
 * 全局错误弹窗（GlobalErrorDialog）
 * ==========================================================================*/
.uw-global-error-overlay {
    z-index: 2000;
    background: rgba(0, 0, 0, 0.45);
    /* 小屏时弹窗不贴边 */
    padding: 24px;
}
.uw-global-error-card {
    max-width: 460px;
    /* 双保险：卡片整体也限高，内部滚动 */
    max-height: 80vh;
    overflow-y: auto;
}
.uw-global-error-header {
    display: flex;
    align-items: center;
    gap: 8px;
}
.uw-global-error-icon { font-size: 20px; }
.uw-global-error-card h4 {
    margin: 0;
    color: var(--uw-color-danger);
    font-weight: 800;
}
.uw-global-error-preview {
    margin-top: 10px;
    padding: 8px 10px;
    border: 1px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md);
    background: var(--uw-color-bg-hover);
    color: var(--uw-color-text-secondary);
    font-size: 12px;
    font-family: Consolas, "Courier New", monospace;
    word-break: break-all;
    max-height: 120px;
    overflow-y: auto;
    white-space: pre-wrap;
}

/* ============================================================================
 * 舰队被守卫围困提示
 * ==========================================================================*/
.uw-fleet-stranded {
    display: flex;
    align-items: center;
    gap: 6px;
    background: var(--uw-color-danger-dim, rgba(231, 76, 60, 0.14));
    border: 1.5px solid var(--uw-color-danger);
    border-radius: var(--uw-r-md);
    color: var(--uw-color-danger);
    font-weight: 700;
    font-size: 12px;
    padding: 5px 9px;
    margin-bottom: 6px;
}
.uw-galaxy-fleet-item.stranded {
    border-color: var(--uw-color-danger) !important;
    box-shadow: 0 0 0 1px var(--uw-color-danger);
}

/* ============================================================================
 * 改名输入（星球/星系）
 * ==========================================================================*/
.uw-rename-input {
    width: 100%;
    box-sizing: border-box;
    background: var(--uw-color-bg-input, var(--uw-color-bg-tertiary));
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md);
    color: var(--uw-color-text-primary);
    padding: 8px 12px;
    font-size: 14px;
    font-weight: 600;
}
.uw-rename-input:focus {
    outline: none;
    border-color: var(--uw-color-accent);
    box-shadow: 0 0 0 3px rgba(61, 155, 255, 0.18);
}
.uw-galaxy-rename-btn { margin-left: auto; }

/* ============================================================================
 * 小动画
 * ==========================================================================*/
@keyframes uw-float {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-4px); }
}
@keyframes uw-pop {
    0% { transform: scale(.92); }
    55% { transform: scale(1.05); }
    100% { transform: scale(1); }
}
.uw-status-dot { box-shadow: 0 0 0 0 rgba(88, 201, 139, .5); animation: uw-pulse 2s infinite; }
@keyframes uw-pulse {
    0% { box-shadow: 0 0 0 0 rgba(88, 201, 139, .45); }
    70% { box-shadow: 0 0 0 6px rgba(88, 201, 139, 0); }
    100% { box-shadow: 0 0 0 0 rgba(88, 201, 139, 0); }
}

/* 主题切换按钮（顶栏） */
.uw-theme-switch {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    cursor: pointer;
    border: 2px solid var(--uw-ink-soft);
    background: var(--uw-color-bg-tertiary);
    border-radius: var(--uw-r-pill);
    color: var(--uw-color-text-primary);
    font-size: 15px;
    line-height: 1;
    padding: 4px 10px;
    box-shadow: 0 2px 0 var(--uw-shade);
    transition: transform .12s ease;
}
.uw-theme-switch:hover { transform: translateY(-1px); color: var(--uw-color-accent); }
.uw-theme-switch:active { transform: translateY(1px); box-shadow: none; }

/* ============================================================================
 * 下拉主题选择浮层
 * ==========================================================================*/
.uw-theme-pop {
    position: absolute;
    right: 0;
    top: calc(100% + 6px);
    background: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink);
    border-radius: 14px;
    box-shadow: 0 6px 20px var(--uw-shade);
    padding: 6px;
    z-index: 99;
    min-width: 170px;
}
.uw-theme-opt {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    text-align: left;
    border: none;
    background: transparent;
    color: var(--uw-color-text-primary);
    border-radius: 10px;
    padding: 7px 10px;
    font-size: 13px;
    cursor: pointer;
}
.uw-theme-opt:hover { background: var(--uw-color-bg-hover); }
.uw-theme-opt.active { background: var(--uw-color-bg-hover); color: var(--uw-color-accent); font-weight: 600; }
.uw-theme-opt .opt-swatch {
    display: inline-block;
    width: 14px; height: 14px;
    border-radius: 50%;
    border: 1px solid var(--uw-ink-soft);
    flex-shrink: 0;
}
.uw-theme-switch-wrap { position: relative; display: inline-flex; }

/* ============================================================================
 * 上缴升级面板（势力/军团资源消耗出口）
 * ==========================================================================*/
.uw-donate-panel {
    background: var(--uw-color-bg-secondary);
    border: 1px solid var(--uw-color-border-dim);
    border-radius: var(--uw-r-lg);
    padding: 12px 14px;
    margin-bottom: 14px;
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.uw-donate-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
    font-weight: 600;
    color: var(--uw-color-text-primary);
}
.uw-donate-head .fa-upload { color: var(--uw-color-accent); }
.uw-donate-hint {
    font-weight: 400;
    font-size: 12px;
    color: var(--uw-color-text-muted);
}
.uw-donate-form {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    align-items: center;
}
.uw-donate-form .uw-input { width: 180px; }
.uw-donate-result {
    font-size: 13px;
    border-radius: var(--uw-r-md);
    padding: 6px 10px;
}
.uw-donate-result.ok { color: var(--uw-color-text-primary); background: color-mix(in srgb, var(--uw-color-success) 14%, transparent); }
.uw-donate-result.err { color: var(--uw-color-danger); background: color-mix(in srgb, var(--uw-color-danger) 14%, transparent); }

/* ============================================================================
 * 组织商店 + 图纸申领决议（势力/军团贡献点兑换、军团长投票治理）
 * ==========================================================================*/
.uw-org-shop-panel {
    background: var(--uw-color-bg-secondary);
    border: 1px solid var(--uw-color-border-dim);
    border-radius: var(--uw-r-lg);
    padding: 12px 14px;
    margin-bottom: 14px;
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.uw-org-shop-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
    font-weight: 600;
    color: var(--uw-color-text-primary);
}
.uw-org-shop-head .fa-shopping-cart, .uw-org-shop-head .fa-gavel { color: var(--uw-color-accent); }
.uw-org-shop-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}
.uw-shop-card {
    background: var(--uw-color-bg-tertiary);
    border: 1px solid var(--uw-color-border-dim);
    border-radius: var(--uw-r-md);
    padding: 10px 12px;
    min-width: 150px;
    max-width: 210px;
    flex: 1 1 150px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.uw-shop-card.vote { border-color: color-mix(in srgb, var(--uw-color-accent) 45%, transparent); }
.uw-shop-name { font-weight: 600; font-size: 14px; color: var(--uw-color-text-primary); }
.uw-shop-desc { font-size: 12px; color: var(--uw-color-text-muted); min-height: 30px; }
.uw-shop-foot { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-top: auto; }
.uw-shop-cost { font-weight: 600; color: var(--uw-color-warning); font-size: 13px; }
.uw-shop-cost-old { font-size: 11px; color: var(--uw-color-text-muted); margin-right: 4px; }
.uw-shop-discount-tag { font-size: 10px; color: #fff; background: var(--uw-color-danger); border-radius: 3px; padding: 1px 4px; margin-right: 4px; vertical-align: middle; }
.uw-shop-lock { font-size: 12px; color: var(--uw-color-text-muted); }
.uw-shop-vote-hint { font-size: 11px; color: var(--uw-color-accent); }
.uw-reso-panel { gap: 8px; }
.uw-reso-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
    background: var(--uw-color-bg-tertiary);
    border: 1px solid var(--uw-color-border-dim);
    border-radius: var(--uw-r-md);
    padding: 8px 12px;
}
.uw-reso-info { display: flex; flex-direction: column; gap: 2px; min-width: 180px; }
.uw-reso-item { font-weight: 600; font-size: 13px; }
.uw-reso-meta { font-size: 12px; color: var(--uw-color-text-muted); }
.uw-reso-votes { font-size: 13px; color: var(--uw-color-text-secondary); }
.uw-reso-votes .agree { color: var(--uw-color-success); }
.uw-reso-votes .disagree { color: var(--uw-color-danger); }
.uw-reso-actions { display: flex; gap: 6px; }
.uw-btn-vote-yes, .uw-btn-vote-no {
    border: none;
    border-radius: var(--uw-r-pill);
    padding: 4px 12px;
    font-size: 12px;
    font-weight: 700;
    cursor: pointer;
    color: var(--uw-btn-text);
    /* 白字压在糖果色上：绿 #2E8F5C 仅 4.49:1 卡 AA 边缘，加粗保证可读；如需再深可换 #1F7A4A */
}
.uw-btn-vote-yes { background: var(--uw-color-success); }
.uw-btn-vote-no { background: var(--uw-color-danger); }
.uw-btn-vote-yes:disabled, .uw-btn-vote-no:disabled { opacity: 0.5; cursor: not-allowed; }
.uw-shop-card .uw-btn-primary:disabled, .uw-shop-card .uw-btn-secondary:disabled { opacity: 0.5; cursor: not-allowed; }
.uw-shop-actions { display: flex; gap: 6px; }
.uw-reso-tag {
    font-size: 11px;
    font-weight: 400;
    color: var(--uw-color-accent);
    border: 1px solid var(--uw-color-accent);
    border-radius: var(--uw-r-pill);
    padding: 0 6px;
    vertical-align: 1px;
}
.uw-reso-tag.auction { color: var(--uw-color-warning); border-color: var(--uw-color-warning); }
.uw-bid-input { width: 130px; }
.uw-warehouse-items { border-top: 1px dashed var(--uw-color-border-dim); padding-top: 10px; margin-top: 4px; }
.uw-warehouse-items h5 { margin: 0 0 8px; font-size: 13px; color: var(--uw-color-text-secondary); }
.uw-warehouse-item-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px 10px;
    background: var(--uw-color-bg-tertiary);
    border-radius: var(--uw-r-md);
    margin-bottom: 6px;
}
.uw-warehouse-item-name { font-weight: 600; font-size: 13px; flex: 1; }
.uw-warehouse-item-count { color: var(--uw-color-warning); font-weight: 600; }

/* ============================================================================
 * 覆盖 universe-war.css 中的硬编码低对比度组件
 * （uw-theme.css 在 universe-war.css 之后加载，此处同选择器新规则胜出；两主题均适配）
 * ==========================================================================*/

/* Tag 系列：universe-war.css 用"淡色底 + 亮色字"，浅底亮字对比度 1.8-2.4:1 */
.uw-tag-success { color: var(--uw-color-success); border-color: var(--uw-color-success); }
.uw-tag-danger   { color: var(--uw-color-danger);  border-color: var(--uw-color-danger); }
.uw-tag-warning  { color: var(--uw-color-warning); border-color: var(--uw-color-warning); }
.uw-tag-muted    { color: var(--uw-color-text-muted); border-color: var(--uw-color-text-muted); }

/* Error 提示：淡红底 + #f44336 亮红字 3.53:1 → 用深红变量 4.71:1 */
.uw-error {
    color: var(--uw-color-danger);
    border-left-color: var(--uw-color-danger);
}

/* 交易行标签：硬编码亮色边框/文字，全部改走变量 */
.uw-trade-tag.type-resource  { border-color: var(--uw-color-success); color: var(--uw-color-success); }
.uw-trade-tag.type-ship      { border-color: var(--uw-color-accent);  color: var(--uw-color-accent); }
.uw-trade-tag.type-blueprint { border-color: var(--uw-color-accent-dim); color: var(--uw-color-warning); }
.uw-trade-tag.type-part      { border-color: var(--uw-color-info);    color: var(--uw-color-info); }
.uw-trade-tag.type-debris    { border-color: var(--uw-color-text-secondary); color: var(--uw-color-text-secondary); }

/* 势力徽章 rank-1/2/3：硬编码 #6a9c79/#4d8ac9/#26a6cf，全部改走变量 */
.uw-faction-rank-badge.rank-1 { color: var(--uw-color-success); border-color: var(--uw-color-success); }
.uw-faction-rank-badge.rank-2 { color: var(--uw-color-info);    border-color: var(--uw-color-info); }
.uw-faction-rank-badge.rank-3 { color: var(--uw-color-warning); border-color: var(--uw-color-warning); }

/* 排行榜领奖台：原先这里靠给 rank 大字改色来保证对比度（24px accent 蓝压浅蓝底只有 1.75:1），
   现在名次换成了 UwRankBadge，那三条规则的目标元素已不存在，故删掉。
   改为把卡片描边对齐徽章本身的金属色 —— 之前 .gold 用的是青蓝 #35d6ff，
   配红金徽章明显串味。渐变只改色相，方向与透明度沿用原设计。 */
.uw-leaderboard-podium-item.gold {
    border-color: #E8A33D;
    background: linear-gradient(180deg, rgba(232, 163, 61, 0.16), transparent);
}
.uw-leaderboard-podium-item.silver {
    border-color: #85B7EB;
    background: linear-gradient(180deg, rgba(133, 183, 235, 0.14), transparent);
}
.uw-leaderboard-podium-item.bronze {
    border-color: #BA7517;
    background: linear-gradient(180deg, rgba(186, 117, 23, 0.14), transparent);
}

/* 存在状态选项：淡蓝底 + accent 蓝字 1.79:1，改用深棕字（两主题对比度 ≥ 5:1） */
.uw-presence-option.active { color: var(--uw-color-text-primary); }

/* 推荐徽章：白渐变底 + #060b16 硬编码字 1.66:1（在白天蓝渐变按钮上几乎不可读） */
.uw-badge-recommend { color: var(--uw-btn-text); }

/* 交易行筛选按钮激活态：accent-dim 橙金底 + 深棕字（两主题都 8+:1） */
.uw-trade-filter-btn.active { color: var(--uw-color-text-primary); }

/* 商店卡片功能型：#4fd8f5 淡青条 border-top 在奶油底上几乎不可见，改用主蓝 */
.uw-shop-card.type-functional { border-top-color: var(--uw-color-accent); }

/* 星系概览/会员徽章/舰队数：硬编码 #d4af37 金色字在白底 1.44:1，改用 warning 深金 */
.uw-galaxy-fleet-overview-title,
.uw-fleet-galaxy-count,
.uw-membership-badge { color: var(--uw-color-warning); }

/* 采集场升级中边框：#f5a623 亮橙边框，改用 warning 变量 */
.uw-galaxy-collector-card.collector-upgrading { border-left-color: var(--uw-color-warning); }

/* 舰队穿梭中：accent 蓝字压白底 2.4:1，改用深棕字保证可读 */
.uw-fleet-state.state-jumping { color: var(--uw-color-text-primary); }

/* 表头文字 3.78:1 → 加深到 primary 6.21:1 */
.uw-table th { color: var(--uw-color-text-primary); font-weight: 700; }

/* 导航组头展开态 3.78:1 → primary 6.21:1 */
.uw-nav-group.expanded > .uw-nav-group-header { color: var(--uw-color-text-primary); }

/* 顶栏主标题：accent 蓝 4.10:1 卡 AA 边缘 → primary 6.21:1 保证可读 */
.uw-topbar-title { color: var(--uw-color-text-primary); }

/* 顶栏副标题（10px 小字）3.55:1 → primary 6.21:1 */
.uw-topbar-sub { color: var(--uw-color-text-primary); }

/* 主题切换器选项激活态 3.78:1 → primary 6.21:1 */
.uw-theme-opt.active { color: var(--uw-color-text-primary); }

/* 页面标题：accent 蓝 18px 4.33:1 卡 AA 边缘 → 深棕 6.55:1 更稳（保留下边框作为品牌色点缀） */
.uw-page-title { color: var(--uw-color-text-primary); font-weight: 700; }

/* 我方领地标签：uw-theme 把它改浅底后，universe-war 里硬编码的浅色字（bg-primary）压浅底 1.07:1 几乎不可见 */
.uw-tag-owned { color: var(--uw-color-success); border-color: var(--uw-color-success); }

/* 我的母星标签：accent-dim 橙金底 + 浅色字（bg-primary）压橙金 1.07:1，改用深棕字 9.6:1 */
.uw-tag-mother { color: var(--uw-color-text-primary); border-color: var(--uw-color-accent-dim); }

/* 星球岩石标签：原 3.94:1 未达 AA，改用深棕主字 */
.uw-tag-rocky { color: var(--uw-color-text-primary); }

/* 社交页标签激活态：accent 蓝字 4.38:1 卡 AA 边缘，改主字深棕 */
.uw-social-tab.active { color: var(--uw-color-text-primary); }

/* 签到统计值：accent-dim 橙金 4.10:1 卡 AA，改深棕主字 */
.uw-signin-stat-value { color: var(--uw-color-text-primary); }
.uw-signin-stat-value.pending { color: var(--uw-color-text-secondary); }

/* 顶部签到入口：复用邮件图标样式，红点提示今日未签 */
.uw-topbar-signin { position: relative; }

/* 顶部签到弹窗：容纳 30 天奖励网格 */
.uw-modal-signin { width: 720px; }
.uw-modal-signin h4 { margin: 0 0 12px; color: var(--uw-color-accent); }
.uw-modal-signin .uw-signin-panel { max-height: 70vh; overflow-y: auto; }

/* 星系缩放按钮：accent-dim 橙金字压浅底 1.72:1，改用深棕主字保证可读 */
.uw-galaxy-zoom-controls .uw-galaxy-zoom-btn {
    color: var(--uw-color-text-primary);
    background-color: var(--uw-color-bg-primary);
    border-color: var(--uw-color-border-dim);
}
.uw-galaxy-zoom-controls .uw-galaxy-zoom-btn:hover {
    background-color: var(--uw-color-accent);
    color: var(--uw-color-bg-primary);
    border-color: var(--uw-color-accent);
}

/* 教程提示 pill：硬编码 rgba(6,11,22,.94) 深黑底在白天主题下与深棕字仅 1.51:1，几乎不可见 */
.uw-tutorial-pill {
    background-color: var(--uw-color-bg-primary);
    border-color: var(--uw-color-accent);
    color: var(--uw-color-text-primary);
    box-shadow: 0 4px 14px var(--uw-shade), 0 0 14px rgba(53, 214, 255, 0.15);
}
.uw-tutorial-pill:hover { border-color: var(--uw-color-accent-hover); }
.uw-tutorial-pill-title { color: var(--uw-color-accent); }
.uw-tutorial-pill-progress { color: var(--uw-color-text-secondary); }

/* 新手引导展开卡片：硬编码 rgba(6,11,22,.95) 深黑底在白天主题下与深棕字对比度不足 */
.uw-tutorial-card {
    background-color: var(--uw-color-bg-primary);
    border-color: var(--uw-color-accent);
    color: var(--uw-color-text-primary);
    box-shadow: 0 4px 20px var(--uw-shade), 0 0 12px var(--uw-color-glow);
    backdrop-filter: blur(6px);
}
/* 徽章：白天用奶油底 + 深棕字；夜间用同色系深底 + 亮字，保证 6:1+ 对比度 */
html:not([data-theme="night"]) .uw-tutorial-badge {
    background-color: var(--uw-color-bg-secondary);
    color: var(--uw-color-text-primary);
    border: 1px solid var(--uw-color-accent-dim);
}
html[data-theme="night"] .uw-tutorial-badge {
    background-color: var(--uw-color-bg-tertiary);
    color: var(--uw-color-text-primary);
    border: 1px solid var(--uw-color-accent);
}
/* hint 提示条：走当前主题次级面板底色 */
.uw-tutorial-hint {
    background-color: var(--uw-color-bg-secondary);
    border-left-color: var(--uw-color-accent-dim);
    color: var(--uw-color-text-secondary);
}

/* ============================================================================
 * 覆盖 Swal / Bootstrap Modal 弹窗样式（universe-war.css 硬编码深空蓝底 + #545454 灰字）
 * 问题：白天主题下弹窗仍深底 + 文字用 Bootstrap 默认 #545454 灰，实测 2.9:1 未达 AA；
 *      夜间主题下 #d9eaf5 亮蓝字压深底也 OK，但按钮/图标色硬编码导致视觉不统一。
 * 修复：白天主题切换到奶油底 + 深棕字；夜间保留深底但用主题变量统一；文字全部走 text-primary。
 * ==========================================================================*/

/* 通用：正文/标题/内容色 —— 全部走主字色，稳过 AA 4.5:1 */
.swal2-title,
.swal2-html-container,
.swal2-content,
.swal2-actions .btn { color: var(--uw-color-text-primary); }

/* Swal 图标（圆圈内数字/问号）：用主字色，与背景对比度稳定 */
.swal2-icon-content { color: var(--uw-color-text-primary) !important; }
.swal2-icon { border-color: var(--uw-color-accent) !important; }

/* 白天主题（奶油）：弹窗整体换成奶油底风格 */
html:not([data-theme="night"]) .modal-content {
    background: linear-gradient(180deg, #FFFFFF 0%, #FFF7E6 100%);
    border-color: var(--uw-color-accent);
    box-shadow: 0 0 24px var(--uw-shade), 0 0 4px var(--uw-color-glow);
}
html:not([data-theme="night"]) .swal2-popup {
    background: linear-gradient(180deg, #FFFFFF 0%, #FFF7E6 100%) !important;
    border-color: var(--uw-color-accent);
}
html:not([data-theme="night"]) .modal-backdrop { background-color: #2a1e0e; opacity: .42 !important; }

/* 白天主题按钮：确认钮用主色蓝底白字（按钮白字 5.38:1）；取消钮浅咖底主字 */
html:not([data-theme="night"]) .swal2-confirm,
html:not([data-theme="night"]) .swal2-actions .btn-primary {
    background: linear-gradient(180deg, var(--uw-color-accent-hover) 0%, var(--uw-color-accent) 100%) !important;
    border-color: var(--uw-color-accent);
    color: var(--uw-btn-text) !important;
}
html:not([data-theme="night"]) .swal2-cancel,
html:not([data-theme="night"]) .swal2-actions .btn-secondary {
    background: linear-gradient(180deg, #FFFFFF 0%, #FFF1D6 100%) !important;
    border-color: var(--uw-color-border-dim);
    color: var(--uw-color-text-primary) !important;
}

/* 夜间主题按钮：使用亮色 accent 底 + 深色字（避免亮底亮字） */
html[data-theme="night"] .swal2-confirm,
html[data-theme="night"] .swal2-actions .btn-primary {
    background: linear-gradient(180deg, var(--uw-color-accent-hover) 0%, var(--uw-color-accent) 100%) !important;
    border-color: var(--uw-color-accent-hover);
    color: #1a1440 !important;
}
html[data-theme="night"] .swal2-cancel,
html[data-theme="night"] .swal2-actions .btn-secondary {
    background: linear-gradient(180deg, var(--uw-color-bg-secondary) 0%, var(--uw-color-bg-tertiary) 100%) !important;
    border-color: var(--uw-color-border-dim);
    color: var(--uw-color-text-primary) !important;
}

/* 弹窗关闭按钮（右上 X） */
.swal2-close {
    color: var(--uw-color-text-secondary) !important;
    opacity: 1;
}
.swal2-close:hover { color: var(--uw-color-text-primary) !important; }

/* ==========================================================
   弹窗（BootstrapBlazor Dialog）配色跟随 uw 双主题
   修复：index.html 固定 data-bs-theme="dark"，Bootstrap 弹窗的
   标题栏/底栏/内容底始终走夜间配色，与奶油白天主题脱节。
   用 uw 双主题变量覆盖各区域（两套主题共用变量名，自动适配）。
   ========================================================== */
.modal .modal-content {
    background: var(--uw-color-bg-tertiary, #FFFFFF);
    color: var(--uw-color-text-primary, #3D2E1E);
    border: 1px solid var(--uw-color-border-dim, #F0D9AE);
}
.modal .modal-header {
    background: var(--uw-color-bg-secondary, #FFEFC9);
    color: var(--uw-color-text-primary, #3D2E1E);
    border-bottom: 1px solid var(--uw-color-border-dim, #F0D9AE);
}
.modal .modal-title {
    color: var(--uw-color-text-primary, #3D2E1E);
}
.modal .modal-footer {
    background: var(--uw-color-bg-secondary, #FFEFC9);
    border-top: 1px solid var(--uw-color-border-dim, #F0D9AE);
}
/* 深色 bs 主题给关闭按钮加了反色滤镜，奶油弹窗上需还原成深色 X */
.modal .btn-close {
    filter: none;
    opacity: .75;
}
.modal .btn-close:hover { opacity: 1; }

/* ==========================================================
   WinBox 浮动窗口（Client 2.0 P2：Dock 页面窗口）主题端点色
   - 白天：蜜糖浅金渐变标题栏 + 深可可文字（配奶油内容区）
   - 夜晚：深靛蓝渐变标题栏 + 白色文字（配深空内容区）
   - 控制图标为白色精灵图：白天在浅金标题栏上压暗保证对比度
   ========================================================== */
:root {
    --uw-winbox-title-a: #FFE2A4;
    --uw-winbox-title-b: #FFC86B;
    --uw-winbox-title-color: #4A3421;
    --uw-winbox-icon-filter: brightness(0.45);
}
html[data-theme="night"] {
    --uw-winbox-title-a: #4A5FD0;
    --uw-winbox-title-b: #333B8F;
    --uw-winbox-title-color: #FFFFFF;
    --uw-winbox-icon-filter: none;
}
.winbox.uw-winbox .wb-control button,
.winbox.uw-winbox .wb-control span {
    filter: var(--uw-winbox-icon-filter);
}

/* ============================================================================
 * 名次徽章（UwRankBadge 组件）—— 底版位图 + 游戏字体叠数字
 * ----------------------------------------------------------------------------
 * 底版来自 wwwroot/img/badges（SenseNova 出图后按连通域切分的 12 档造型）。
 * 数字不烧进图里，交给 --uw-font-tech（Baloo 2 / Quicksand）渲染：
 * 名次是任意整数，只有这样 13 名开外也才用得上、放大也才不糊。
 * 超出 12 档的名次由 --plain 变体回落成纯数字胶囊。
 * ==========================================================================*/
:root {
    /* 数字描边色：刻意不拆双主题 —— 数字压在徽章自己的色面上，
       而徽章位图两套主题共用同一份，描边跟着页面主题变反而会和徽章脱节 */
    --uw-badge-ink: #221A33;

    /* 徽章数字字体：优先 Baloo 2 —— 它是这套字体里笔画最粗、字面最饱满的一款，
       和徽章位图上的卡通描边最搭；Quicksand 偏几何、笔画细，
       缩到榜单行的 30px 会发虚（实测同字号下 Baloo 2 字宽 210.9 / Quicksand 219.6）。
       徽章内数字与超档位胶囊必须共用这一款，否则同一列里第 12 名（徽章）
       和第 13 名（胶囊）的数字字形会明显不一样。 */
    --uw-font-num: "Baloo 2", "Quicksand", "Comic Sans MS", "Microsoft YaHei", sans-serif;
}

/* ============================================================================
 * 新手引导聚光高亮（uw-guide.js）—— 2026-09-22 玩家反馈"引导全是文字"
 * ----------------------------------------------------------------------------
 * 引导卡片新增「前往」按钮打开目标页，本层把要操作的位置框出来：
 * 全屏压暗遮罩 + 目标处挖洞（一个带 9999px 大阴影的空框），洞口呼吸描边。
 * - 只改视觉不拦交互：pointer-events:none，WinBox 拖拽 / 弹窗 / 点击全部照常。
 * - 层级 1060：盖过 WinBox 窗口（z 100 档）与 Dock(900)；引导卡片/胶囊
 *   在下方覆盖为 1080，保证说明文字不被遮罩压暗。
 * - 遮罩色用写死的深色（两套主题下"压暗"语义一致），洞口描边跟主题 token。
 * ==========================================================================*/
.uw-guide-spotlight,
.uw-guide-spot-box {
    position: fixed;
    pointer-events: none;
}

.uw-guide-spotlight {
    inset: 0;
    z-index: 1060;
    display: none;
}

.uw-guide-spot-box {
    z-index: 1;
    border-radius: 10px;
    transition: left .25s ease, top .25s ease, width .25s ease, height .25s ease;
    animation: uw-guide-breathe 1.6s ease-in-out infinite;
}

@keyframes uw-guide-breathe {
    0%, 100% {
        box-shadow:
            0 0 0 3px var(--uw-color-accent, #F59E0B),
            0 0 18px 2px rgba(245, 158, 11, .55),
            0 0 0 9999px rgba(15, 18, 26, .58);
    }
    50% {
        box-shadow:
            0 0 0 6px var(--uw-color-accent, #F59E0B),
            0 0 30px 6px rgba(245, 158, 11, .8),
            0 0 0 9999px rgba(15, 18, 26, .58);
    }
}

/* 引导卡片/胶囊压过高亮遮罩（原 1050 见 universe-war.css，此处同文件后加载胜出） */
.uw-tutorial-overlay,
.uw-tutorial-pill {
    z-index: 1080;
}

/* 「前往」按钮下方的说明小字（universe-war.css 的 .uw-tutorial-actions 为右对齐） */
.uw-tutorial-goto-tip {
    margin-top: 6px;
    font-size: 11px;
    line-height: 1.5;
    color: var(--uw-color-text-muted, #8A93A3);
}

/* 邮件详情「充值到账邮件不可删」提示（Mail.razor 详情操作区，跟随删除按钮排版） */
.uw-mail-keep-note {
    font-size: 11px;
    line-height: 1.5;
    color: var(--uw-color-text-muted, #8A93A3);
    margin-right: 10px;
}

.uw-rank-badge {
    /* 唯一尺寸入口：改这一个值，徽章 / 数字 / 描边 / 胶囊全部等比跟随 */
    --uw-badge-size: 32px;
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: var(--uw-badge-size);
    height: var(--uw-badge-size);
    vertical-align: middle;
}

.uw-rank-badge-img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    pointer-events: none;
    user-select: none;
    -webkit-user-drag: none;
}

.uw-rank-badge-num {
    position: relative;
    font-family: var(--uw-font-num);
    font-weight: 700;
    /* 字号比例不是拍脑袋来的：12 张底版的中心色板实测占边长
       宽 32%~41% / 高 35%~43%（梯度法测边界）。这里取「按最小的一块都塞得下」的
       单一口径 —— 名次之间数字大小必须一致，逐枚调比例会让整张榜单忽大忽小。
       0.44 × 字体 0.72 字高 ≈ 0.317，对应最小色板（35%）还剩约 10% 余量 */
    font-size: calc(var(--uw-badge-size) * 0.44);
    line-height: 1;
    letter-spacing: -0.02em;
    color: #FFFFFF;
    /* 描边宽度用 em 而不是再乘一次尺寸变量 —— 它天生就该跟着 font-size 走。
       注意 -webkit-text-stroke 是居中描边，所以这里给的值有一半会被下面的
       文字阴影与 paint-order 抵消，实际视觉描边约 0.11em */
    -webkit-text-stroke: 0.10em var(--uw-badge-ink);
    /* 先描边后填字，否则描边会从字芯里吃掉半个字形（窄笔画如 1 会明显变瘦）。
       万一某个浏览器不认 paint-order，下面的四向阴影会补回描边宽度，仍可读 */
    paint-order: stroke fill;
    text-shadow:
        -0.06em 0 0 var(--uw-badge-ink),
        0.06em 0 0 var(--uw-badge-ink),
        0 -0.06em 0 var(--uw-badge-ink),
        0 0.06em 0 var(--uw-badge-ink);
}

/* 10/11/12 两位数：瓶颈从高度换成宽度（两个字形并排），收到按最窄的一块
   （色板宽 32%）仍有余量。高度上会偏松，这是六边形色板塞两位数的固有代价 */
.uw-rank-badge--wide .uw-rank-badge-num {
    font-size: calc(var(--uw-badge-size) * 0.32);
}

/* 超出底版档数的名次：回归纯数字胶囊（走页面主题变量，与榜单行底色一致） */
.uw-rank-badge--plain {
    background-color: var(--uw-color-bg-tertiary);
    border: 1px solid var(--uw-color-border-dim);
    border-radius: 50%;
    color: var(--uw-color-text-secondary);
    font-family: var(--uw-font-num);
    font-size: calc(var(--uw-badge-size) * 0.40);
    font-weight: 600;
    line-height: 1;
}

/* 领奖台前三名：徽章本身已经区分了金/银/铜，这里只补一圈同色辉光把它从卡片底上托起来 */
.uw-leaderboard-podium-item .uw-rank-badge {
    margin: 2px 0;
}

/* ============================================================================
 * 【全站游戏化】Client 全局视觉层
 * ----------------------------------------------------------------------------
 * 依据 .workbuddy/tmp/css-audit/audit_css.py 的审计：两套样式表 333 条带圆角的规则里，
 * 144 条（43%）仍是「圆角<=4px 且 描边<=1px」的 Web 表单配方。按钮一族
 * （本文件上方 .uw-btn-* / uw-theme 里那组 border-radius: var(--uw-r-pill)）早前
 * 已经游戏化过，所以这一层的任务是把剩下的容器 / 输入 / 弹层 / 标签 / 列表补齐，
 * 让 26 个页面一次性换掉「后台管理面板」的观感。
 *
 * 分工原则（游戏 UI 的通用做法，三者共用同一套 token）：
 *   凸  按钮 / 卡片 / 弹层  → 大圆角 + 深描边 + 顶部内高光 + 底部实心厚度
 *   凹  输入框 / 道具槽     → 大圆角 + 深描边 + 顶部内阴影（像刻进去）
 *   平  列表行             → 中圆角 + 极淡顶部高光（不做厚度，长列表才不吵）
 *
 * 只改几何（圆角 / 描边宽 / 投影 / 内边距），**不动任何 color 与 background-color**
 * —— 全站配色是逐条算过对比度的，这里一律不碰；状态色描边（tag-success 之类）
 * 也只改宽度不改颜色，语义得以保留。
 * 明确不动：进度条 / 分割饰条 / 滚动条 / 代码块（这些本来就该是细的）。
 * ==========================================================================*/
:root {
    --uw-r-xl: 20px;                      /* 大面板 / 弹窗 */
    --uw-r-card: 16px;                    /* 卡片 / 区块 */
    --uw-r-ctl: 12px;                     /* 按钮 / 输入 / 选项 */
    --uw-r-row: 10px;                     /* 列表行 */
    --uw-lift: 3px;                       /* 凸起的底部实心厚度 */
    --uw-lift-sm: 2px;
    --uw-drop: rgba(122, 92, 64, 0.30);   /* 厚度色（白天：暖棕影）*/
    --uw-hi: rgba(255, 255, 255, 0.55);   /* 顶部内高光 */
    --uw-lo: rgba(122, 92, 64, 0.16);     /* 内阴影（凹槽）*/
    --uw-edge: 2px;                       /* 描边宽度 */
    --uw-edge-color: #4A3421;             /* 描边色：与徽章位图的深色外描边同调 */
}
html[data-theme="night"] {
    --uw-drop: rgba(0, 0, 0, 0.45);
    --uw-hi: rgba(255, 255, 255, 0.16);
    --uw-lo: rgba(0, 0, 0, 0.28);
    --uw-edge-color: #14103A;
}

/* ── 凹：输入控件 ─────────────────────────────────────────────────────────
   原来是「1px 描边 + 2px 圆角」的网页表单。游戏里输入框应该是刻进面板的凹槽，
   所以用内阴影而不是底部厚度，和按钮的凸起形成对比。 */
.uw-input,
.uw-field input,
.uw-field select,
.uw-field textarea,
.uw-chat-input,
.uw-exchange-input,
.uw-commander-select,
.uw-strategy-select,
.uw-galaxy-select,
.uw-planet-select,
.uw-inherit-code-input,
.uw-build-count input,
.uw-login-field input,
.uw-profile-password-row input,
.uw-trade-list-form .uw-field input,
.uw-trade-list-form .uw-field select,
.uw-faction-create-form .uw-field input,
.uw-fleet-create-form input,
.uw-friends-add .uw-chat-input,
.uw-modal .uw-field input {
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-ctl);
    box-shadow: inset 0 3px 5px var(--uw-lo);
    padding: 7px 12px;
}

/* ── 凸：卡片 / 区块（确定是「容器」的那批，给完整立体处理）──────────── */
.uw-faction-card,
.uw-faction-create-card,
.uw-friend-card,
.uw-legion-card,
.uw-legion-create,
.uw-inherit-card,
.uw-inherit-result,
.uw-placeholder-card,
.uw-presence-card,
.uw-tutorial-card,
.uw-season-inherit-box,
.uw-season-info-item,
.uw-season-claim-result,
.uw-battle-detail-modal,
.uw-battle-section,
.uw-battle-loot-info,
.uw-defense-slot,
.uw-defense-ship-item,
.uw-slot-ship,
.uw-warehouse-ship,
.uw-construct-item,
.uw-readonly-hull,
.uw-blueprint-preview,
.uw-offline-reward-item,
.uw-offline-reward-duration,
.uw-signin-stat {
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-card);
    box-shadow: inset 0 2px 0 var(--uw-hi), 0 var(--uw-lift) 0 var(--uw-drop);
}

/* ── 这些名字像标题/摘要，可能只是文本块而不是卡片。
      所以只给圆角与更粗的描边，**不加底部厚度**——万一它就是个段落，
      也不会凭空多出一个框；等实际页面看过后再决定要不要升到上一档。 */
.uw-faction-header,
.uw-faction-hegemony-cond,
.uw-faction-hegemony-result,
.uw-profile-header,
.uw-battle-summary,
.uw-battle-victory,
.uw-battle-fleet,
.uw-operation-message {
    border-width: var(--uw-edge);
    border-radius: var(--uw-r-card);
}

/* ── 凸：列表容器（圆角更大，因为它包着一堆行）──────────────────────────
   .uw-formation-left / .uw-mail-body / .uw-galaxy-* 刻意排除：
   前者是纯布局列，后两者是正文与整幅星图，凭空加框反而突兀。 */
.uw-commander-list,
.uw-commander-recruit,
.uw-building-list,
.uw-building-construct,
.uw-fleet-list,
.uw-fleet-create,
.uw-mail-list,
.uw-mail-detail,
.uw-legion-member-list,
.uw-trade-list,
.uw-trade-list-form,
.uw-leaderboard-table,
.uw-chat-messages,
.uw-manage-section,
.uw-shipyard-section {
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-card);
    box-shadow: 0 var(--uw-lift) 0 var(--uw-drop);
}

/* ── 平：列表行 / 条目（不做厚度，否则长列表全是横向条纹）────────────── */
.uw-faction-member-row,
.uw-faction-diplo-row,
.uw-faction-app-row,
.uw-galaxy-planet-item,
.uw-cloud-planet-item,
.uw-fleet-galaxy-chip,
.uw-formation-cell,
.uw-formation-slot,
.uw-planet-action,
.uw-planet-action-defense,
.uw-planet-event,
.uw-warehouse-action,
.uw-context-item,
.uw-part-option,
.uw-presence-option,
.uw-event-option,
.uw-event-btn-close,
.uw-event-error,
.uw-trade-filter,
.uw-trade-filter-btn,
.uw-trade-empty-opts,
.uw-trade-warning,
.uw-trade-bid-info,
.uw-chat-channel-btn,
.uw-chat-input-bar .uw-chat-send,
.uw-social-tab-badge,
.uw-achievement-card,
.uw-ai-research-bar {
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-row);
    box-shadow: inset 0 1px 0 var(--uw-hi);
}

/* ── 凸：浮层（菜单 / 下拉 / Toast）—— 要「浮」起来，所以额外加扩散影 ── */
.uw-context-menu,
.dropdown-menu,
.toast {
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-card);
    box-shadow: 0 var(--uw-lift) 0 var(--uw-drop), 0 12px 26px rgba(0, 0, 0, 0.26);
}

/* ── 胶囊：标签 / 徽记 ────────────────────────────────────────────────
   只改几何与字重，**不动 border-color** —— 这些标签的描边色承载状态语义
   （成功/危险/势力色），改了会把语义抹平。 */
.uw-chip,
.uw-tag,
.uw-tag-enemy,
.uw-tag-free,
.uw-tag-gas,
.uw-tag-rocky,
.uw-tag-state,
.uw-trade-tag,
.uw-faction-tag,
.uw-sub-tab,
.uw-tutorial-badge,
.uw-sach-cat,
.uw-tutorial-min,
.uw-tutorial-pill,
.uw-social-tab-badge {
    border-width: 2px;
    border-radius: var(--uw-r-pill);
    font-weight: 700;
}

/* ── 表格（BootstrapBlazor，所有列表页都在用）────────────────────────────
   只加圆角与加粗的表头分隔线，**不加 overflow: hidden** —— 表格里常有
   操作菜单 / 悬浮提示，裁切会把它们切掉；而且粘性表头也依赖父级不裁切。 */
.table {
    border-radius: var(--uw-r-card);
}
.table > thead > tr > th {
    border-bottom-width: var(--uw-edge);
    border-bottom-color: var(--uw-edge-color);
    font-weight: 700;
}

/* ── 页面标题：去掉霓虹辉光（那是科幻，不是卡通），换成一根圆头色条 ──
   .uw-page-title 被 25 个页面用到，是全站最显眼的一处。 */
.uw-page-title {
    text-shadow: none;
    border-bottom: none;
    padding-bottom: 10px;
    position: relative;
}
.uw-page-title::after {
    content: "";
    position: absolute;
    left: 0;
    bottom: 0;
    width: 56px;
    height: 4px;
    border-radius: var(--uw-r-pill);
    background: var(--uw-color-accent);
}

/* ── 标签页：从「下划线指示」改成「凸起的胶囊」──────────────────────── */
.uw-social-tabs {
    border-bottom: none;
    gap: 8px;
    flex-wrap: wrap;
}
.uw-social-tab {
    border: var(--uw-edge) solid var(--uw-edge-color);
    border-bottom-width: var(--uw-edge);
    border-radius: var(--uw-r-pill);
    background-color: var(--uw-color-bg-tertiary);
    padding: 6px 16px;
    box-shadow: 0 var(--uw-lift-sm) 0 var(--uw-drop);
}
.uw-social-tab.active {
    background-color: var(--uw-color-bg-hover);
    box-shadow: inset 0 2px 0 var(--uw-hi);
}

/* ── 弹窗：原 20px 内边距 + 2px 圆角，四周补上厚度让它像一块实体牌 ── */
.uw-modal {
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-xl);
    box-shadow: 0 var(--uw-lift) 0 var(--uw-drop), 0 18px 40px rgba(0, 0, 0, 0.35);
}

/* ── 空态 / 加载态：34 与 27 个文件在用，最容易被忽略但出现频率最高 ── */
.uw-empty {
    border-radius: var(--uw-r-card);
    border: var(--uw-edge) dashed var(--uw-edge-color);
    background-color: var(--uw-color-bg-secondary);
}

/* ── BootstrapBlazor 的 Dialog（.modal 系列）─────────────────────────────
   审计 v2 列出 59 条「面板化但完全没有圆角声明」的规则，其中 .modal 是唯一
   成规模的大面积漏网 —— 舰队编队、建筑详情等弹窗都走它，而 WinBox 那边
   （本文件 939 行）早就有 14px 圆角了，两边观感一直不一致。
   overflow: hidden 是让 header/footer 跟着外层圆角一起裁切。 */
.modal .modal-content {
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-xl);
    overflow: hidden;
    box-shadow: 0 var(--uw-lift) 0 var(--uw-drop), 0 18px 40px rgba(0, 0, 0, 0.3);
}
.modal .modal-header {
    border-bottom-width: var(--uw-edge);
    border-bottom-color: var(--uw-edge-color);
}
.modal .modal-footer {
    border-top-width: var(--uw-edge);
    border-top-color: var(--uw-edge-color);
}

/* ── 审计里其余几处小漏网：只补圆角，不加厚度（都不是独立卡片）── */
.uw-faction-sub-content,
.uw-season-gate,
.uw-blueprint-designer,
.uw-tutorial-hint,
.uw-sach-card,
.uw-battle-result {
    border-radius: var(--uw-r-card);
}

/* ── HUD 角标：保留概念，换一套画法 ────────────────────────────────────
   universe-war.css:7875-7915 给六个主容器卡片配了一对 14×14 的青色 L 形角标，
   是原始「暗黑科幻」语言留下来的，还用 border-radius: 2px !important 把卡片
   锁成直角好让角标对齐 —— 这就是「卡片是直的、按钮是圆的」两套语言打架的源头。
   （该 !important 已在上游摘除，半径改由 --uw-r-card 控制。）

   角标这个想法本身不坏：它把面板「框」住了，是有信息量的装饰。
   卡通化的正确做法不是删掉它，而是换执行：
     青色霓虹 → 与徽章同源的暖棕深描边（--uw-edge-color）
     1~2px 细线 → 3px 粗线
     直角收尾 → 跟着卡片圆角走，与卡片边缘咬合
     14px → 18px（粗线要更长的臂才不显局促） */
.uw-modal::before,
.uw-manage-section::before,
.uw-shop-card::before,
.uw-commander-card::before {
    width: 18px;
    height: 18px;
    top: calc(var(--uw-edge) * -1);
    left: calc(var(--uw-edge) * -1);
    border-top: 3px solid var(--uw-edge-color);
    border-left: 3px solid var(--uw-edge-color);
    border-top-left-radius: var(--uw-r-card);
    opacity: 1;
}

.uw-modal::after,
.uw-manage-section::after,
.uw-shop-card::after,
.uw-commander-card::after {
    width: 18px;
    height: 18px;
    bottom: calc(var(--uw-edge) * -1);
    right: calc(var(--uw-edge) * -1);
    border-bottom: 3px solid var(--uw-edge-color);
    border-right: 3px solid var(--uw-edge-color);
    border-bottom-right-radius: var(--uw-r-card);
    opacity: 1;
}

/* ── 输入框聚焦：去掉科幻霓虹辉光 ────────────────────────────────────────
   universe-war.css:7917-7925 聚焦时打一圈青色 glow，还带 !important，
   会盖掉上面「刻进面板」的内阴影。卡通语言里聚焦该是「描边变色」而不是发光，
   所以保留主色描边，把辉光换成凹槽内阴影。同权重 !important + 本文件后加载 = 胜出。 */
.uw-page input[type="text"]:focus,
.uw-page input[type="number"]:focus,
.uw-page input[type="password"]:focus,
.uw-page textarea:focus {
    border-color: var(--uw-color-accent) !important;
    box-shadow: inset 0 3px 5px var(--uw-lo) !important;
}

/* ============================================================================
 * 科技分类：从「卡片」退回「托盘」层级
 * ----------------------------------------------------------------------------
 * 原来的毛病有两层：
 *   1) .uw-tech-category 被算进了上面的「页面卡片族」，于是分组框和它内部的研究
 *      项目卡成了同一层级的实体卡片 —— 框套框；
 *   2) 它自己只有 margin-bottom、没有 padding（universe-war.css:1122），
 *      内层卡片直接贴住外层描边，视觉上就「连」在一起了。
 *   建筑页的分层是对的：.uw-building-list 是蜜糖托盘、里面装白色行卡，
 *   而托盘与行卡之间靠**底色差**区分，不是靠多套一层描边。
 *
 * 修法：分组容器退回「托盘」——底色换成 bg-secondary、补上内边距，
 * 让卡片浮在托盘上而不是和托盘平级。
 * 描边与厚度对齐建筑页的托盘（.uw-building-list / .uw-building-construct，
 * 见上面「列表容器」那组），这样两个页面读起来是同一套结构：
 *   蜜糖托盘（容器，装东西）  >  白卡（内容，可点）
 * 白天 bg-secondary 是蜜糖（卡片是白）、夜间是深靛（卡片更亮），
 * 两个主题下托盘都比卡片「退后一层」。 */
.uw-tech-category {
    background-color: var(--uw-color-bg-secondary);
    /* border-style 必须显式写：universe-war.css 那边只给了 margin，
       原本的 solid 是随 border 简写一起来的，拆开写就会退化成 none（宽度归零） */
    border-style: solid;
    border-width: var(--uw-edge);
    border-color: var(--uw-edge-color);
    border-radius: var(--uw-r-card);
    box-shadow: 0 var(--uw-lift) 0 var(--uw-drop);
    padding: 12px 14px 14px;
    margin-bottom: 18px;
}

/* 分类标题：去掉贯穿整行的 1px 下划线（那是表格表头的做法），
   改成与页面标题同源的「圆头色条 + 主字色」，一眼能看出这是分节。 */
.uw-tech-category h4 {
    color: var(--uw-color-text-primary);
    border-bottom: none;
    font-size: 14px;
    font-weight: 700;
    margin: 0 0 12px;
    padding: 0 0 0 13px;
    position: relative;
}
.uw-tech-category h4::before {
    content: "";
    position: absolute;
    left: 0;
    top: 2px;
    width: 5px;
    height: 14px;
    border-radius: var(--uw-r-pill);
    background: var(--uw-color-accent);
}

/* 卡片在托盘上再松一点，原来的 8px 在加了内边距后仍偏挤 */
.uw-tech-category .uw-tech-grid {
    gap: 10px;
}

/* ── 赛季成就的两个入口由 <a> 改成 <button> ──────────────────────────────
   它们原来是整页链接（.uw-sach-entry 跳 /season-achievements、.uw-sach-backlink 跳
   /season），现在都改成打开 WinBox 浮动窗口 —— 在弹窗里整页跳转会连宿主页面一起换掉。
   两者要补的东西**不一样**，因为原有规则覆盖的属性不同：
     .uw-sach-entry    已设 background / border / padding → 只补字体、字色、对齐
     .uw-sach-backlink 只设了 font-size / color / text-decoration
                       → button 自带的底、框、内边距必须清掉，否则多出一个灰底小按钮
   两者共同要补的是 font-family：button 不继承字体，不补的话中文会掉回系统 UI 字体。 */
button.uw-sach-entry {
    font-family: inherit;
    /* 容器本身没写 color，button 默认色是 ButtonText（黑）；
       补成 inherit 才与原来 <a> 的表现一致（子元素各自有配色，不受影响） */
    color: inherit;
    text-align: left;
    width: 100%;
    cursor: pointer;
}

button.uw-sach-backlink {
    font-family: inherit;
    background: none;
    border: 0;
    padding: 0;
    cursor: pointer;
}

/* ============================================================================
 * 科技研究卡：立绘 + 品质边框（2026-09-17）
 * ----------------------------------------------------------------------------
 * 每张研究卡上方开一块 1:1 立绘窗，卡片边框换成 4 档品质色（绿 / 蓝 / 金 / 紫）。
 * 档位口径：
 *   常规科技 —— 按「研究所等级要求」，越难越靠后（Tech.razor.cs 的 TechTier）
 *   失传科技 —— 按研究点，越贵越靠后（AiTechTier）—— 见 Tech.razor
 * 边框用 CSS 而不是位图：双主题自适应、缩放不糊，档位色只是一个 CSS 变量。
 * 立绘图由 tools/sensenova-image/batch_techs.py 出图并按 256px 导出到 wwwroot/img/techs/。
 * ==========================================================================*/
.uw-tech-card {
    --uw-tech-tier: #5FA524;
    --uw-tech-tier-deep: #2F5A0F;
    /* 三件事都要覆盖卡片族的默认值：描边换档位色、圆角更大、底部厚度跟着档位色 */
    border: 3px solid var(--uw-tech-tier);
    border-radius: var(--uw-r-lg, 18px);
    box-shadow: 0 4px 0 var(--uw-tech-tier-deep), inset 0 3px 0 var(--uw-hi);
    padding: 9px;
    gap: 7px;
}

/* 卡片族的 :hover 是 (0,2,0)，会盖掉上面的档位色厚度 —— 必须同权重补一条 */
.uw-tech-card:hover {
    box-shadow: 0 5px 0 var(--uw-tech-tier-deep), inset 0 3px 0 var(--uw-hi);
}

.uw-tech-card.tier-1 { --uw-tech-tier: #5FA524; --uw-tech-tier-deep: #2F5A0F; }
.uw-tech-card.tier-2 { --uw-tech-tier: #3A86D9; --uw-tech-tier-deep: #1A4C85; }
.uw-tech-card.tier-3 { --uw-tech-tier: #D9A22B; --uw-tech-tier-deep: #7A560F; }
.uw-tech-card.tier-4 { --uw-tech-tier: #9A6BE0; --uw-tech-tier-deep: #573082; }

/* 立绘窗：1:1 铺满卡宽，再套一圈同档位色的内框 */
.uw-tech-art {
    position: relative;
    border: 2px solid var(--uw-tech-tier);
    border-radius: var(--uw-r-md, 12px);
    overflow: hidden;
    line-height: 0;
}

.uw-tech-art img {
    display: block;
    width: 100%;
    aspect-ratio: 1 / 1;
    object-fit: cover;
}

/* 左上角档位数字徽章 */
.uw-tech-tier {
    position: absolute;
    left: 7px;
    top: 7px;
    width: 22px;
    height: 22px;
    border-radius: 6px;
    background: var(--uw-tech-tier);
    color: #fff;
    font-size: 13px;
    font-weight: 700;
    line-height: 22px;
    text-align: center;
    box-shadow: 0 2px 0 var(--uw-tech-tier-deep);
}

/* 已掌握的失传科技：立绘去饱和，一眼分得出（原来那条 border-left-color 已被档位边框取代） */
.uw-tech-card.researched .uw-tech-art img {
    filter: saturate(0.5) brightness(0.9);
}

/* ============================================================================
 * 舰长经验条（2026-09-17）
 * ----------------------------------------------------------------------------
 * 口径：升级所需经验 = 等级 × 100，且升级时 Exp -= needExp
 * —— `CommanderDto.Exp` 存的是**本级已攒**，不是累计值（见 CommanderService.LevelUp）。
 * 数值刻意**不压在进度条上**：白天主题的条底（--uw-color-bg-input）接近纯白，
 * 白字压上去读不了；改成挪到条的右侧用主题文字色，两套主题都稳。
 * 首次落地在舰长详情窗（CommanderCardDialog.razor）。
 * ==========================================================================*/
.uw-exp-bar {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 2px 0 4px;
}

/* 左侧等级徽章 */
.uw-exp-level {
    flex: none;
    min-width: 32px;
    height: 28px;
    padding: 0 7px;
    border-radius: 9px;
    background: var(--uw-color-accent);
    border: 2px solid var(--uw-ink);
    box-shadow: 0 3px 0 var(--uw-shade);
    color: var(--uw-btn-text);
    font-size: 15px;
    font-weight: 700;
    line-height: 24px;
    text-align: center;
}

.uw-exp-track {
    position: relative;
    flex: 1;
    height: 22px;
    border-radius: var(--uw-r-pill);
    background: var(--uw-color-bg-input);
    border: 2px solid var(--uw-ink-soft);
    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.18);
    overflow: hidden;
}

.uw-exp-fill {
    height: 100%;
    border-radius: var(--uw-r-pill);
    background: linear-gradient(180deg, #63B8F5, var(--uw-color-accent));
    box-shadow: inset 0 2px 0 rgba(255, 255, 255, 0.45);
    transition: width 0.25s ease;
}

.uw-exp-num {
    flex: none;
    font-size: 12px;
    font-variant-numeric: tabular-nums;
    color: var(--uw-color-text-secondary);
    white-space: nowrap;
}

/* 满级：徽章与进度槽走金色，文案换成「已满级」 */
.uw-exp-bar.maxed .uw-exp-level {
    background: #D9A22B;
    border-color: #7A560F;
    box-shadow: 0 3px 0 #7A560F;
}

.uw-exp-bar.maxed .uw-exp-fill {
    background: linear-gradient(180deg, #F0C55A, #D9A22B);
}

/* 舰长详情窗是**固定暗金 HUD**（.uw-cmddlg 自带深色渐变，不跟随双主题），
   所以条内配色要按深色面板给，不能直接用主题 token ——
   白天主题的 --uw-color-bg-input 近纯白（落在深面板上刺眼）、
   --uw-color-text-secondary 是深棕（落在深面板上几乎读不出来）。实测踩到过。 */
.uw-cmddlg .uw-exp-track {
    background: rgba(255, 255, 255, 0.08);
    border-color: rgba(212, 175, 55, 0.38);
    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.5);
}

.uw-cmddlg .uw-exp-num {
    color: #ece5cf;
}

/* 等级徽章同理：--uw-color-accent 夜间是浅蓝，配白字只有 ~2.8:1。
   固定成深一档的蓝，白字稳过 AA；满级金底改配深墨字（金底上白字只有 ~2.2:1）。 */
.uw-cmddlg .uw-exp-level {
    background: linear-gradient(180deg, #3D82CC, #235B9C);
    border-color: #123A6B;
    box-shadow: 0 3px 0 #123A6B;
}

.uw-cmddlg .uw-exp-bar.maxed .uw-exp-level {
    background: linear-gradient(180deg, #F0C55A, #D9A22B);
    border-color: #7A560F;
    box-shadow: 0 3px 0 #7A560F;
    color: #3A2606;
}

/* ============================================================================
 * 商城商品卡：立绘窗（2026-09-18）
 * ----------------------------------------------------------------------------
 * 立绘 key 来自 shop_items.art_key（后台可配，见 SocialService 种子 + SqlSugarDbContext 的回填）。
 * 为空时 ShopPanel 不渲染这一块 —— 卡片退回原来的纯文字样式，新增商品没配图也不会裂图。
 * 图由 tools/sensenova-image/batch_shop.py 出图并按 256px 导出到 wwwroot/img/shop/。
 * ==========================================================================*/
.uw-shop-art {
    border-radius: var(--uw-r-md, 12px);
    overflow: hidden;
    line-height: 0;
}

.uw-shop-art img {
    display: block;
    width: 100%;
    aspect-ratio: 1 / 1;
    object-fit: cover;
}

/* ============================================================================
 * 星域装饰徽章 / 发光头部：白天主题修复（2026-09-18）
 * ----------------------------------------------------------------------------
 * universe-war.css 里 .uw-smsp-halo-badge-* 的文字（银 #E4E8F2 / 金 #FFD98A /
 * 赛季 #E8C896）与 .uw-smsp-head--halo-* 的浅色描边都是按暗底调的硬编码色，
 * 白天奶油白底上对比度不足 1.5:1，「会员星域 · xx」几乎看不见。
 * 修法：白天（html:not([data-theme="night"])）换深色系文字与描边；
 * 夜间主题不加覆盖，保留原浅色。判断口径同「固定风格容器」条目 ——
 * 容器（.uw-smsp）走主题 token 会翻色，里面就不能再压死一套暗底配色。
 * ==========================================================================*/
html:not([data-theme="night"]) .uw-smsp-halo-badge--silver {
    background: rgba(122, 132, 158, 0.14);
    color: #4A5568;                    /* 深板岩灰，浅银底上 6.2:1 */
    border-color: rgba(90, 100, 130, 0.45);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--gold {
    background: rgba(255, 200, 87, 0.32);
    color: #8A5B00;                    /* 深金棕，奶油底上 4.9:1 */
    border-color: rgba(176, 120, 20, 0.55);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--season {
    background: rgba(176, 141, 87, 0.22);
    color: #6E5220;                    /* 深古铜，浅棕底上 5.8:1 */
    border-color: rgba(150, 115, 50, 0.55);
}
/* 发光头部的外框与辉光同步加深，否则白天白底上金/银描边也会隐形 */
html:not([data-theme="night"]) .uw-smsp-head--halo-silver {
    border-color: rgba(122, 132, 158, 0.55);
    box-shadow: 0 0 10px rgba(122, 132, 158, 0.22), inset 0 0 14px rgba(122, 132, 158, 0.10);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-gold {
    border-color: rgba(176, 120, 20, 0.55);
    box-shadow: 0 0 14px rgba(255, 190, 60, 0.30), inset 0 0 16px rgba(255, 190, 60, 0.16);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-season {
    border-color: rgba(150, 115, 50, 0.55);
    box-shadow: 0 0 12px rgba(176, 141, 87, 0.30), inset 0 0 14px rgba(176, 141, 87, 0.15);
}
/* 商城皮肤（4~8 档）白天主题：同样把浅色文字/描边换成深色系（与上面银/金/赛季同口径）。
   每档取各自主色的深色变体，保证奶油白底 ≥4.5:1。 */
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop4 {
    background: rgba(46, 160, 92, 0.14); color: #1E6B3F; border-color: rgba(26, 107, 63, 0.5);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop5 {
    background: rgba(40, 120, 200, 0.14); color: #1B4F8A; border-color: rgba(27, 79, 138, 0.5);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop6 {
    background: rgba(214, 69, 120, 0.14); color: #8A2148; border-color: rgba(138, 33, 72, 0.5);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop7 {
    background: rgba(128, 80, 214, 0.14); color: #4F2E8A; border-color: rgba(79, 46, 138, 0.5);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop8 {
    background: rgba(214, 122, 26, 0.16); color: #7A4407; border-color: rgba(122, 68, 7, 0.55);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop9 {
    background: rgba(120, 130, 150, 0.14); color: #4A5262; border-color: rgba(74, 82, 98, 0.5);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop10 {
    background: rgba(128, 168, 24, 0.14); color: #4A6308; border-color: rgba(74, 99, 8, 0.5);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop11 {
    background: rgba(24, 158, 142, 0.14); color: #0A5A50; border-color: rgba(10, 90, 80, 0.5);
}
html:not([data-theme="night"]) .uw-smsp-halo-badge--shop12 {
    background: rgba(196, 142, 26, 0.16); color: #7A5407; border-color: rgba(122, 84, 7, 0.55);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop4 {
    border-color: rgba(26, 107, 63, 0.5); box-shadow: 0 0 10px rgba(46, 160, 92, 0.25), inset 0 0 14px rgba(46, 160, 92, 0.12);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop5 {
    border-color: rgba(27, 79, 138, 0.5); box-shadow: 0 0 10px rgba(40, 120, 200, 0.25), inset 0 0 14px rgba(40, 120, 200, 0.12);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop6 {
    border-color: rgba(138, 33, 72, 0.5); box-shadow: 0 0 10px rgba(214, 69, 120, 0.25), inset 0 0 14px rgba(214, 69, 120, 0.12);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop7 {
    border-color: rgba(79, 46, 138, 0.5); box-shadow: 0 0 10px rgba(128, 80, 214, 0.25), inset 0 0 14px rgba(128, 80, 214, 0.12);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop8 {
    border-color: rgba(122, 68, 7, 0.55); box-shadow: 0 0 12px rgba(214, 122, 26, 0.3), inset 0 0 14px rgba(214, 122, 26, 0.14);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop9 {
    border-color: rgba(74, 82, 98, 0.5); box-shadow: 0 0 10px rgba(120, 130, 150, 0.25), inset 0 0 14px rgba(120, 130, 150, 0.12);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop10 {
    border-color: rgba(74, 99, 8, 0.5); box-shadow: 0 0 10px rgba(128, 168, 24, 0.25), inset 0 0 14px rgba(128, 168, 24, 0.12);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop11 {
    border-color: rgba(10, 90, 80, 0.5); box-shadow: 0 0 10px rgba(24, 158, 142, 0.25), inset 0 0 14px rgba(24, 158, 142, 0.12);
}
html:not([data-theme="night"]) .uw-smsp-head--halo-shop12 {
    border-color: rgba(122, 84, 7, 0.55); box-shadow: 0 0 12px rgba(196, 142, 26, 0.3), inset 0 0 14px rgba(196, 142, 26, 0.14);
}

/* ===== 【底栏循环公告】（2026-09-18）替代原「聊天请前往聊天页」静态提示 =====
   底栏高度固定（--uw-footer-height），文本超长省略号截断，完整内容进 title 悬浮。 */
.uw-footer-ann {
    flex: 1;
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;                        /* flex 子项允许收缩，省略号才能生效 */
    color: var(--uw-color-text-muted);
    font-size: 12px;
    cursor: default;
}
.uw-footer-ann i {
    flex-shrink: 0;
    color: var(--uw-color-accent);
}
.uw-footer-ann-text {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    color: var(--uw-color-text-secondary);
    animation: uw-ann-fade-in 0.5s ease;
}
@keyframes uw-ann-fade-in {
    from { opacity: 0; transform: translateY(4px); }
    to   { opacity: 1; transform: none; }
}

/* ============================================================================
 * 造船厂：舰体立绘 + 仓库战舰按蓝图合并（2026-09-20）
 * ----------------------------------------------------------------------------
 * 立绘来源见 Shared/Constants/ShipArtCatalog：
 *   常规舰体（101-105）→ 复用**研究页那型战舰的立绘**（img/techs/），不重复出图；
 *   空白模板专属舰体 111-115 与后勤舰 116/117 → img/ships/（batch_ships.py 出图）。
 * 缩略图统一 56px 方图（生产队列用 .sm 的 40px），描边走卡片族的浅描边色，两套主题都稳。
 * 仓库合并行是"托盘"不是卡片：同蓝图多艘只占一行，数量用橙金胶囊提到最显眼处。
 * ==========================================================================*/
.uw-ship-art {
    flex: 0 0 auto;
    width: 56px;
    height: 56px;
    border-radius: var(--uw-r-md, 12px);
    border: 2px solid var(--uw-ink-soft);
    object-fit: cover;
    background-color: var(--uw-color-bg-secondary);
}

.uw-ship-art.sm {
    width: 40px;
    height: 40px;
}

/* 立绘 + 压在右下角的库存徽章（蓝图卡用；仓库行用行内的 .uw-stock-count） */
.uw-ship-art-wrap {
    position: relative;
    flex: 0 0 auto;
    line-height: 0;
}

.uw-ship-art-count {
    position: absolute;
    right: 3px;
    bottom: 3px;
    background: var(--uw-color-accent-dim);
    color: #241507;                        /* 橙金底压深墨字，口径同 .uw-tag-level */
    font-size: 11px;
    font-weight: 800;
    line-height: 16px;
    border-radius: var(--uw-r-pill);
    padding: 0 6px;
    box-shadow: 0 1px 3px rgba(36, 21, 7, 0.45);
}

/* 蓝图卡改成「左立绘 + 右信息」两栏（universe-war.css 里是单列，加图后必须换行向） */
.uw-blueprint-card {
    flex-direction: row;
    align-items: flex-start;
    gap: 10px;
}

.uw-blueprint-body {
    display: flex;
    flex-direction: column;
    gap: 6px;
    flex: 1 1 auto;
    /* 允许收缩，长蓝图名才会走省略号而不是把网格撑破 */
    min-width: 0;
}

/* 加了立绘后横向空间被吃掉 66px，网格最小列宽与按钮换行一起放宽，避免生产按钮竖排 */
.uw-blueprint-list {
    grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
}

.uw-blueprint-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* 属性行里塞了一枚「仓库 ×N」胶囊，纵向居中对齐文字 */
.uw-blueprint-stats {
    align-items: center;
}

.uw-blueprint-tools {
    display: flex;
    align-items: center;
    gap: 6px;
    flex: 0 0 auto;
}

.uw-blueprint-actions {
    flex-wrap: wrap;
}

/* 空白模板卡的立绘塞在「信息 + 按钮」之间，信息列要吃掉剩余宽度 */
.uw-template-card .uw-template-info {
    flex: 1 1 auto;
}

/* --- 仓库合并行 --- */
.uw-stock-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px 10px;
    background-color: var(--uw-color-bg-tertiary);
    border: 2px solid var(--uw-ink-soft);
    border-radius: var(--uw-r-md, 12px);
    box-shadow: 0 3px 0 var(--uw-shade);
    color: var(--uw-color-text-primary);
}

/* 只要组里有待修复的舰，整行描边转危险色，扫一眼就知道哪几组要处理 */
.uw-stock-row.damaged {
    border-color: var(--uw-color-danger);
}

.uw-stock-main {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1 1 auto;
    min-width: 0;
}

.uw-stock-head {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
}

.uw-stock-stats {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    font-size: 11px;
}

/* 库存数量：这一行的主角信息，用橙金底压深墨字（口径同 .uw-tag-level，两主题对比度都够） */
.uw-stock-count {
    display: inline-flex;
    align-items: center;
    background: var(--uw-color-accent-dim);
    color: #241507;
    font-size: 11px;
    font-weight: 800;
    border-radius: var(--uw-r-pill);
    padding: 1px 9px;
    white-space: nowrap;
}

.uw-stock-actions {
    display: flex;
    gap: 6px;
    flex: 0 0 auto;
}

/* 展开的单舰明细：缩进 + 左侧竖线，表明它从属于上面那行（不重复占用卡片厚度） */
.uw-stock-detail {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: 2px 0 6px 18px;
    padding-left: 10px;
    border-left: 3px solid var(--uw-ink-soft);
}

/* ==================================================================
   【编组编辑器】统计行的 ？ 规则说明气泡（2026-09-20）
   纯 CSS 悬停气泡：hover / 键盘 focus / 触屏点按（tabindex=0）三种唤起。
   全部走主题 token，白天/夜间自动跟随。
   ================================================================== */
.uw-stat-help {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    margin-left: -4px;
    border-radius: 50%;
    border: 1.5px solid var(--uw-edge-color);
    background: var(--uw-color-bg-secondary);
    color: var(--uw-color-text-secondary);
    font-size: 11px;
    font-weight: 800;
    line-height: 1;
    cursor: help;
    user-select: none;
}

.uw-stat-help:hover,
.uw-stat-help:focus-visible {
    color: var(--uw-color-text-primary);
    border-color: var(--uw-color-text-secondary);
}

.uw-stat-help-bubble {
    position: absolute;
    top: calc(100% + 8px);
    left: 50%;
    transform: translateX(-50%) translateY(-4px);
    width: 300px;
    padding: 10px 12px;
    border-radius: var(--uw-r-md, 12px);
    border: 2px solid var(--uw-edge-color);
    background: var(--uw-color-bg-tertiary);
    color: var(--uw-color-text-primary);
    font-size: 12px;
    font-weight: 400;
    line-height: 1.6;
    text-align: left;
    white-space: normal;
    box-shadow: 0 3px 0 var(--uw-shade);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;
    z-index: 60;
}

/* 小箭头：与气泡同底同描边，用旋转方块实现 */
.uw-stat-help-bubble::before {
    content: "";
    position: absolute;
    top: -7px;
    left: calc(50% - 6px);
    width: 10px;
    height: 10px;
    transform: rotate(45deg);
    background: var(--uw-color-bg-tertiary);
    border-left: 2px solid var(--uw-edge-color);
    border-top: 2px solid var(--uw-edge-color);
}

.uw-stat-help:hover .uw-stat-help-bubble,
.uw-stat-help:focus-visible .uw-stat-help-bubble {
    opacity: 1;
    visibility: visible;
    transform: translateX(-50%) translateY(0);
}

.uw-stat-help-bubble b {
    display: block;
    margin: 6px 0 2px;
    color: var(--uw-color-text-primary);
    font-weight: 500;
}

.uw-stat-help-bubble b:first-child {
    margin-top: 0;
}

/* ==================================================================
   【顶部资源栏】钛矿/氦3 悬停提示：每秒产量 + 仓库当前/上限（2026-09-20）
   数据来自 GET api/resource 的 Rate/Cap 字段（服务端已算好，本地模拟不覆盖）。
   视觉与编组 ？ 气泡同一套语言：2px 描边 + 底部厚度 + 旋转方块箭头，全主题 token。
   ================================================================== */
.uw-resource-item.uw-res-has-tip {
    position: relative;
    cursor: default;
}

.uw-res-tip {
    position: absolute;
    top: calc(100% + 8px);
    left: 50%;
    transform: translateX(-50%) translateY(-4px);
    padding: 9px 12px;
    border: 2px solid var(--uw-edge-color);
    border-radius: var(--uw-r-md, 12px);
    background: var(--uw-color-bg-tertiary);
    color: var(--uw-color-text-primary);
    font-size: 12px;
    font-weight: 400;
    line-height: 1.7;
    text-align: left;
    white-space: nowrap;
    box-shadow: 0 3px 0 var(--uw-shade);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;
    z-index: 90;
}

/* 多行说明型悬浮卡（人口等长文案）：限定宽度并允许换行 */
.uw-res-tip.uw-res-tip--wrap {
    white-space: normal;
    width: 300px;
    line-height: 1.7;
}

.uw-res-tip::before {
    content: "";
    position: absolute;
    top: -7px;
    left: calc(50% - 6px);
    width: 10px;
    height: 10px;
    transform: rotate(45deg);
    background: var(--uw-color-bg-tertiary);
    border-left: 2px solid var(--uw-edge-color);
    border-top: 2px solid var(--uw-edge-color);
}

.uw-resource-item.uw-res-has-tip:hover .uw-res-tip {
    opacity: 1;
    visibility: visible;
    transform: translateX(-50%) translateY(0);
}

.uw-res-tip b {
    display: block;
    margin-bottom: 2px;
    font-weight: 500;
    color: var(--uw-color-text-primary);
}

.uw-res-tip .uw-res-tip-rate {
    color: var(--uw-color-accent);
}

/* 顶栏建立独立层叠上下文并压过星图（星图容器 z-index 3 且 DOM 靠后），
   否则资源悬停气泡（.uw-res-tip）会被星图画布盖住。低于弹窗（950+/1050+）与全屏遮罩（2000）。 */
.uw-topbar {
    position: relative;
    z-index: 500;
}

/* ==================================================================
   移动端响应式适配（data-device="mobile" 由 index.html 设备检测脚本设置）
   桌面端 data-device="desktop" 或无属性时完全不匹配，零影响。
   断点：手机 <768px 全精简；平板 768-1023px 适度精简。
   ================================================================== */

/* ---- 顶栏：精简，腾出空间给资源数值 ---- */
html[data-device="mobile"] .uw-topbar {
    height: 44px;
    padding: 0 4px;
    gap: 8px;
}

/* 左侧品牌：只留 logo 图标，固定不压缩 */
html[data-device="mobile"] .uw-topbar-brand {
    min-width: auto;
    flex-shrink: 0;
}

html[data-device="mobile"] .uw-topbar-title {
    display: none;
}

/* 资源项：隐藏标签文字，只留图标 + 数值 */
html[data-device="mobile"] .uw-resource-label {
    display: none;
}

/* 资源项间距收紧；资源项本身禁止被 flex 压缩（随滚动容器整体滑动） */
html[data-device="mobile"] .uw-topbar-resources {
    gap: 4px;
    flex-shrink: 0;
}

html[data-device="mobile"] .uw-resource-item {
    gap: 2px;
    flex-shrink: 0;
    padding: 4px 8px;
}

/* 滚动容器：资源 + 右侧功能按钮放进同一个横向滚动区，左侧 logo 固定在外。
   内容不超宽时 margin-left:auto 把操作区推到最右；超宽时自动归零、整体可滚 */
html[data-device="mobile"] .uw-topbar-scroll {
    flex: 1 1 auto;
    min-width: 0;
    gap: 12px;
    overflow-x: auto;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
    padding-right: 4px;
}

html[data-device="mobile"] .uw-topbar-scroll::-webkit-scrollbar {
    display: none;
}

html[data-device="mobile"] .uw-topbar-resources,
html[data-device="mobile"] .uw-topbar-actions {
    overflow: visible;
}

/* 右侧操作区：不压缩；功能较少时靠右对齐，超宽时并入滚动 */
html[data-device="mobile"] .uw-topbar-actions {
    flex-shrink: 0;
    margin-left: auto;
    gap: 8px;
}

/* 操作按钮移动端触控目标加大（44px 栏高内做到 ≥36px 命中区），给资源区让的宽度由滚动补回 */
html[data-device="mobile"] .uw-topbar-mail-badge,
html[data-device="mobile"] .uw-topbar-help,
html[data-device="mobile"] .uw-theme-switch {
    padding: 8px 9px;
    min-width: 40px;
    min-height: 36px;
    justify-content: center;
    align-items: center;
    box-sizing: border-box;
}

html[data-device="mobile"] .uw-topbar-logout {
    padding: 8px 10px;
    min-height: 36px;
    box-sizing: border-box;
}

/* 资源悬停提示在触屏无 hover，直接隐藏避免挡住 */
html[data-device="mobile"] .uw-res-tip {
    display: none !important;
}

/* 操作区：隐藏时间显示和登出文字（登出留图标） */
html[data-device="mobile"] .uw-topbar-time {
    display: none;
}

html[data-device="mobile"] .uw-topbar-logout span {
    display: none;
}

/* 手机进一步精简：资源数值字号缩小（横向滚动规则已在上方主块统一处理） */
@media (max-width: 480px) {
    html[data-device="mobile"] .uw-resource-value {
        font-size: 13px;
    }
}

/* ---- Dock 导航：改底部水平 Tab Bar ---- */
html[data-device="mobile"] .uw-dock {
    left: 0;
    right: 0;
    bottom: 0;
    gap: 0;
    justify-content: space-around;
    padding-bottom: env(safe-area-inset-bottom, 0px);
    background: var(--uw-color-bg-secondary);
    border-top: 1px solid var(--uw-color-border-dim);
    z-index: 950;
}

/* Dock 按钮等宽分布，隐藏文字标签 */
html[data-device="mobile"] .uw-dock-item {
    flex: 1 1 0;
}

html[data-device="mobile"] .uw-dock-btn {
    width: 100%;
    height: 50px;
    border: none;
    border-radius: 0;
    box-shadow: none;
    background: transparent;
}

html[data-device="mobile"] .uw-dock-btn:hover,
html[data-device="mobile"] .uw-dock-btn.open {
    transform: none;
    box-shadow: none;
    background: var(--uw-color-bg-hover);
}

html[data-device="mobile"] .uw-dock-btn-label {
    display: none;
}

html[data-device="mobile"] .uw-dock-btn-icon {
    font-size: 22px;
}

/* flyout 从底部上滑而非左下角上弹 */
html[data-device="mobile"] .uw-dock-flyout {
    left: 50%;
    bottom: calc(100% + 1px);
    transform: translateX(-50%);
    transform-origin: bottom center;
    min-width: 160px;
}

/* 【修复】遮罩层级必须在 Dock 容器内部保持最低（item z2 > mask z1）：
   曾经误设 z-index:940 —— 遮罩是 .uw-dock(z950) 的子元素，对外压主内容由容器决定，
   内部 940 反而盖住了 z2 的 flyout 菜单，导致移动端点菜单项 = 点到遮罩 = 直接关菜单。 */

/* ---- 底栏：隐藏滚动公告，只留连接状态 ---- */
html[data-device="mobile"] .uw-layout-footer {
    height: 28px;
    font-size: 11px;
}

/* ---- 主区：底部留出 Dock Tab Bar 高度 ---- */
html[data-device="mobile"] .uw-layout-main {
    padding-bottom: 50px;
}

/* ---- 建筑页：双栏 grid 改单栏 ---- */
html[data-device="mobile"] .uw-building-layout {
    grid-template-columns: 1fr;
}

/* 大图卡模式改回紧凑列表 */
html[data-device="mobile"] .uw-building-cards.is-grid {
    display: flex;
    flex-direction: column;
}

html[data-device="mobile"] .uw-building-cards.is-grid .uw-building-card {
    flex-direction: row;
    align-items: center;
    gap: 10px;
}

html[data-device="mobile"] .uw-building-cards.is-grid .uw-building-art {
    width: 48px;
    height: 48px;
}

html[data-device="mobile"] .uw-building-cards.is-grid .uw-building-info {
    flex-direction: row;
    align-items: center;
    gap: 8px;
}

/* ---- 蓝图列表 grid 改单栏 ---- */
html[data-device="mobile"] .uw-blueprint-list {
    grid-template-columns: 1fr;
}

/* 蓝图设计弹窗自适应 */
html[data-device="mobile"] .uw-blueprint-modal {
    width: 100% !important;
    max-width: 100% !important;
    max-height: 90vh !important;
}

/* ---- 蓝图列表网格列宽适配窄屏 ---- */
html[data-device="mobile"] .uw-template-list {
    grid-template-columns: 1fr;
}

/* ---- 通用：页面内边距收紧 ---- */
html[data-device="mobile"] .uw-page {
    gap: 8px;
}

html[data-device="mobile"] .uw-page-title {
    font-size: 16px;
    letter-spacing: 1px;
}

/* ---- 星图页面：双栏(1fr 320px) 改单栏 ---- */
html[data-device="mobile"] .uw-galaxy-layout {
    grid-template-columns: 1fr;
}

/* ---- 星系详情面板：移动端改底部抽屉 ----
   右侧 320px 面板在手机上≈满屏、把星图挤没；改为 fixed 底部抽屉（Dock Tab Bar 之上），
   未选中星系时滑出屏幕（星图全屏可操作），选中后滑入；头部「收起」按钮点击即收回 */
html[data-device="mobile"] .uw-galaxy-detail {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 50px;                 /* 移动端 Dock Tab Bar 高度之上 */
    top: auto;
    width: 100%;
    max-height: 68vh;
    z-index: 940;                 /* 低于 Dock(z950)，底栏始终可点 */
    border-radius: 12px 12px 0 0;
    border-bottom: none;
    box-shadow: 0 -6px 24px rgba(0, 0, 0, 0.35);
    transform: translateY(calc(100% + 160px)); /* 默认收起：彻底滑出屏幕（100% 自身高 + 160px 余量，避免底部残留） */
    transition: transform 0.25s ease;
}

html[data-device="mobile"] .uw-galaxy-detail.open {
    transform: translateY(0);
}

html[data-device="mobile"] .uw-galaxy-detail-collapse {
    display: inline-flex;
}

/* ---- 3D 星图系统面板（StarMapSystemPanel）：移动端同样改底部抽屉 ---- */
html[data-device="mobile"] .uw-smsp {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 50px;
    top: auto;
    width: 100%;
    max-height: 68vh;
    z-index: 940;
    border-radius: 16px 16px 0 0;
    border-bottom: none;
    box-shadow: 0 -6px 24px rgba(0, 0, 0, 0.35);
}

html[data-device="mobile"] .uw-smsp-close {
    display: inline-flex;
}

/* ---- 阵型编辑：双栏(1fr 280px) 改单栏 ---- */
html[data-device="mobile"] .uw-formation-layout {
    grid-template-columns: 1fr;
}

/* ---- 战斗双方舰队：双栏(1fr 1fr) 改单栏（上下排列） ---- */
html[data-device="mobile"] .uw-battle-fleets {
    grid-template-columns: 1fr;
}

/* ---- 交易行：6 列改 2 列（商品名跨行，价格/数量紧凑排列） ---- */
html[data-device="mobile"] .uw-trade-row {
    grid-template-columns: 1fr 1fr;
    gap: 4px;
}

/* ---- 排行榜行：4 列(60px 2fr 1fr 1fr) 改 2 列 ---- */
html[data-device="mobile"] .uw-leaderboard-row {
    grid-template-columns: 40px 1fr;
    gap: 4px;
}

/* ---- 排行榜领奖台：3 列保持（仅 3 个卡，窄屏可接受） ---- */

/* ---- 军团成员行：4 列固定宽度改 flex-wrap ---- */
html[data-device="mobile"] .uw-legion-member-row {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    align-items: center;
}

/* ---- 造船厂蓝图设计弹窗：内部部件选择区适配 ---- */
html[data-device="mobile"] .uw-part-options {
    flex-direction: column;
}

/* ---- 指挥官招募卡：双栏(80px 1fr) 保持（图标+信息紧凑，窄屏可用） ---- */

/* ---- 科技页 auto-fill minmax(340px)：手机自动 1 列，无需额外覆盖 ---- */

/* ---- 登录页：已有 @media(max-width:900px) 适配，补充安全区内边距 ---- */
html[data-device="mobile"] .uw-login-layout {
    padding-top: env(safe-area-inset-top, 0px);
}

/* ---- 邮件：横向(列表+内容)改纵向(上下排列) ---- */
html[data-device="mobile"] .uw-mail-layout {
    flex-direction: column;
    height: auto;
}

/* ---- 3D 星图操作提示：移动端没有滚轮/WASD，换触屏文案（StarMap.razor 双 span） ---- */
html[data-device="mobile"] .uw-starmap3d-hint .uw-starmap3d-hint-desktop { display: none; }
html[data-device="mobile"] .uw-starmap3d-hint .uw-starmap3d-hint-mobile { display: inline; }

/* ---- 聊天频道页签：5 个按钮超宽会挤成两行竖排字 → 改横向滚动，字永远一行 ---- */
html[data-device="mobile"] .uw-chat-channels {
    flex-wrap: nowrap;
    overflow-x: auto;
    scrollbar-width: none;
}

html[data-device="mobile"] .uw-chat-channels::-webkit-scrollbar {
    display: none;
}

html[data-device="mobile"] .uw-chat-channel-btn {
    flex-shrink: 0;
    white-space: nowrap;
    padding: 8px 14px;
}

/* ---- 赛季结算记录表：4 列 grid 在窄屏挤压截断 → 继承内容/状态各自独占一行 ---- */
html[data-device="mobile"] .uw-season-table .uw-leaderboard-row {
    grid-template-columns: 44px 1fr;
    row-gap: 2px;
}

html[data-device="mobile"] .uw-season-table .uw-lb-col-faction,
html[data-device="mobile"] .uw-season-table .uw-lb-col-score {
    grid-column: 1 / -1;
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
}

/* ---- 装饰面板整页路由（/cosmetics）：移动端显示页头（桌面 WinBox 弹窗隐藏） ---- */
html[data-device="mobile"] .uw-cosmetics-page-title {
    display: block;
}
