/* ============================================================================
 * uw-tech-fleet.css
 * 《放置：宇宙大战》卡通风格双主题 —— 科技分类/研究卡 + 舰长经验条 + 星域徽章
 *
 * 本文件从 uw-theme.css 拆分而来（2026-11-03），原始单文件 5204 行。
 * 拆分后由 index.html 逐个 <link> 引入，加载顺序必须保持变量文件在最前。
 * 所有规则只引用 uw-variables.css 里定义的 CSS 变量，不硬编码颜色。
 * ==========================================================================*/

/* ============================================================================
 * 科技分类：从「卡片」退回「托盘」层级
 * ----------------------------------------------------------------------------
 * 原来的毛病有两层：
 *   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; }
}
