TH1/Tools/Dashboard/index.html

1320 lines
71 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TH1 Dashboard</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<!-- Header -->
<div class="header">
<div class="header-left">
<img src="assets/logo/logo.png" alt="TOHOTOPIA" class="header-logo">
<div class="header-title">DASHBOARD</div>
<div class="header-sub">项目控制中心</div>
</div>
<div class="header-right">
<span class="header-info" id="export-time">数据: --</span>
<button class="btn-refresh" id="btn-refresh" title="更新数据">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M23 4v6h-6M1 20v-6h6"/>
<path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/>
</svg>
<span>更新数据</span>
</button>
</div>
</div>
<!-- Layout: Sidebar + Main -->
<div class="layout">
<!-- Sidebar Navigation -->
<nav class="sidebar">
<div class="nav-section-label">总览</div>
<button class="sidebar-tab active" data-tab="home">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
首页
</button>
<button class="sidebar-tab" data-tab="devplan">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg>
开发进度
</button>
<button class="sidebar-tab" data-tab="version">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 8v4l3 3"/><circle cx="12" cy="12" r="10"/></svg>
版本信息
</button>
<button class="sidebar-tab" data-tab="bugs">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M8 2l1.88 1.88M14.12 3.88L16 2M9 7.13v-1a3.003 3.003 0 116 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 014-4h4a4 4 0 014 4v3c0 3.3-2.7 6-6 6z"/><path d="M12 20v-9M6.53 9C4.6 8.8 3 7.1 3 5M6 13H2M6 17H3M17.47 9c1.93-.2 3.53-1.9 3.53-4M18 13h4M18 17h3"/></svg>
BUG跟踪
</button>
<button class="sidebar-tab" data-tab="todos">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"/></svg>
待办
</button>
<button class="sidebar-tab" data-tab="suggestions">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a4 4 0 01-4 4H8l-5 3V7a4 4 0 014-4h10a4 4 0 014 4z"/><path d="M8 8h8M8 12h5"/></svg>
建议跟踪
</button>
<div class="nav-section-label">分析模块</div>
<button class="sidebar-tab" data-tab="codex">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 8h10M7 12h7M5 20l-3 2V5a3 3 0 013-3h14a3 3 0 013 3v10a3 3 0 01-3 3H8z"/></svg>
Codex 对话
</button>
<button class="sidebar-tab" data-tab="gamebalance">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v18M3 12h18M5.63 5.63l12.74 12.74M18.37 5.63L5.63 18.37"/></svg>
平衡性分析
</button>
<button class="sidebar-tab" data-tab="project">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
工程拆解
</button>
<button class="sidebar-tab" data-tab="balance">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="20" x2="12" y2="10"/><line x1="18" y1="20" x2="18" y2="4"/><line x1="6" y1="20" x2="6" y2="16"/></svg>
数值设计
</button>
<button class="sidebar-tab" data-tab="mechanics">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16v16H4z"/><path d="M9 4v16M4 9h16"/><path d="M14 14h3v3h-3z"/></svg>
游戏机制
</button>
<button class="sidebar-tab" data-tab="ai-logic">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a7 7 0 00-7 7v4a4 4 0 004 4h1v3h4v-3h1a4 4 0 004-4V9a7 7 0 00-7-7z"/><path d="M9 9h.01M15 9h.01M9 13h6"/></svg>
AI逻辑
</button>
<button class="sidebar-tab" data-tab="story">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg>
文案剧情
</button>
<button class="sidebar-tab" data-tab="art">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="13.5" cy="6.5" r="2.5"/><path d="M17 3a2.83 2.83 0 114 4L7.5 20.5 2 22l1.5-5.5z"/></svg>
美术资产
</button>
<button class="sidebar-tab" data-tab="art-dev">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4Z"/><path d="M15 5l4 4"/></svg>
美术开发
</button>
<button class="sidebar-tab" data-tab="sentiment">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 11.5a8.38 8.38 0 01-.9 3.8 8.5 8.5 0 01-7.6 4.7 8.38 8.38 0 01-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 01-.9-3.8 8.5 8.5 0 014.7-7.6 8.38 8.38 0 013.8-.9h.5a8.48 8.48 0 018 8v.5z"/></svg>
舆情分析
</button>
<button class="sidebar-tab" data-tab="marketing">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
宣发市场
</button>
<button class="sidebar-tab" data-tab="sns">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75"/></svg>
SNS助手
</button>
<button class="sidebar-tab" data-tab="form-helper">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 3H5a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-4"/><path d="M17 3l4 4L10 18H6v-4L17 3z"/></svg>
填表助手
</button>
</nav>
<!-- Main Content -->
<div class="main">
<!-- Loading Overlay -->
<div id="loading-overlay" class="loading-overlay" style="display:none;">
<div class="loading-card">
<div class="loading-spinner"></div>
<div class="loading-text" id="loading-text">正在更新数据...</div>
<div class="loading-progress">
<div class="loading-progress-bar" id="loading-bar"></div>
</div>
<div class="loading-detail" id="loading-detail"></div>
</div>
</div>
<!-- Toast -->
<div id="toast" class="toast" style="display:none;"></div>
<!-- ===== Home Panel ===== -->
<div id="panel-home" class="tab-panel active">
<!-- Timeline Module -->
<div class="module-card">
<div class="module-header">
<span class="module-title">项目进度</span>
<span class="module-badge">里程碑</span>
</div>
<div class="module-body">
<div id="timeline-container" class="timeline-container">
<div class="loading-inline">正在加载计划数据...</div>
</div>
</div>
</div>
<!-- Home Summary Modules (2-column grid) -->
<div id="home-summaries" class="home-summaries-grid"></div>
<!-- Architecture Graph Module -->
<div class="module-card">
<div class="module-header">
<span class="module-title">数据架构</span>
<span class="module-badge">系统拓扑</span>
</div>
<div class="module-body" style="padding:0;">
<canvas id="arch-canvas" width="1100" height="620"></canvas>
</div>
</div>
<!-- Summary Cards -->
<div id="summary-cards" class="summary-grid"></div>
</div>
<!-- ===== Placeholder Panels ===== -->
<div id="panel-project" class="tab-panel">
<!-- Content populated by js/project.js on first activation -->
<div class="loading-inline">正在加载工程数据...</div>
</div>
<div id="panel-balance" class="tab-panel">
<!-- Sub-tabs -->
<div class="sub-tabs" id="balance-sub-tabs">
<button class="sub-tab active" data-sub="factions">阵营</button>
<button class="sub-tab" data-sub="heroes">英雄</button>
<button class="sub-tab" data-sub="units">单位</button>
<button class="sub-tab" data-sub="actions">行动</button>
<button class="sub-tab" data-sub="skills">能力</button>
<button class="sub-tab" data-sub="grids">地块</button>
<button class="sub-tab" data-sub="techs">科技</button>
<button class="sub-tab" data-sub="cards">市政卡</button>
</div>
<!-- Sub-panel: Factions -->
<div id="sub-factions" class="sub-panel active">
<div class="toolbar">
<select id="faction-force-filter" class="filter-select"><option value="">全部势力</option></select>
<select id="faction-civ-filter" class="filter-select"><option value="">全部文明</option></select>
</div>
<div id="factions-content" class="card-grid"></div>
</div>
<!-- Sub-panel: Heroes -->
<div id="sub-heroes" class="sub-panel">
<div class="toolbar">
<input type="text" id="hero-search" class="search-input" placeholder="搜索英雄名称...">
<select id="hero-force-filter" class="filter-select"><option value="">全部势力</option></select>
</div>
<div id="heroes-content"></div>
</div>
<!-- Sub-panel: Units -->
<div id="sub-units" class="sub-panel">
<div class="toolbar">
<input type="text" id="bunit-search" class="search-input" placeholder="搜索单位...">
<select id="bunit-type-filter" class="filter-select"><option value="">全部类型</option></select>
<select id="bunit-force-filter" class="filter-select"><option value="">全部势力</option></select>
</div>
<div id="units-content"></div>
</div>
<!-- Sub-panel: Actions -->
<div id="sub-actions" class="sub-panel">
<div class="toolbar">
<input type="text" id="action-search" class="search-input" placeholder="搜索行动...">
<select id="action-type-filter" class="filter-select"><option value="">全部类型</option></select>
</div>
<div id="actions-content"></div>
</div>
<!-- Sub-panel: Skills -->
<div id="sub-skills" class="sub-panel">
<div class="toolbar">
<input type="text" id="bskill-search" class="search-input" placeholder="搜索能力...">
<select id="bskill-view-filter" class="filter-select">
<option value="">全部类型</option>
<option value="Normal">Normal</option>
<option value="Special">Special</option>
<option value="Unique">Unique</option>
<option value="Negative">Negative</option>
<option value="Positive">Positive</option>
</select>
</div>
<div id="skills-content"></div>
</div>
<!-- Sub-panel: Grids -->
<div id="sub-grids" class="sub-panel">
<div id="grids-content"></div>
</div>
<!-- Sub-panel: Techs -->
<div id="sub-techs" class="sub-panel">
<div class="toolbar">
<input type="text" id="btech-search" class="search-input" placeholder="搜索科技...">
<select id="btech-cost-filter" class="filter-select">
<option value="">全部消耗</option>
<option value="1">Lv1</option>
<option value="2">Lv2</option>
<option value="3">Lv3</option>
</select>
</div>
<div id="techs-content"></div>
</div>
<!-- Sub-panel: Culture Cards -->
<div id="sub-cards" class="sub-panel">
<div class="toolbar">
<select id="card-culture-filter" class="filter-select">
<option value="">全部类型</option>
<option value="1">政治</option>
<option value="2">宗教</option>
<option value="3">军事</option>
<option value="4">经济</option>
</select>
</div>
<div id="cards-content"></div>
</div>
</div>
<!-- ===== Form Helper Panel ===== -->
<div id="panel-form-helper" class="tab-panel">
<div class="sub-tabs" id="form-helper-sub-tabs">
<button class="sub-tab active" data-sub="fh-skills">Skill表</button>
<button class="sub-tab" data-sub="fh-techs">TechList</button>
<button class="sub-tab" data-sub="fh-tech-atoms">TechAtomList</button>
<button class="sub-tab" data-sub="fh-units">UnitTypeList</button>
<button class="sub-tab" data-sub="fh-resources">ResourceInfoList</button>
<button class="sub-tab" data-sub="fh-actions">ActionList</button>
<button class="sub-tab" data-sub="fh-texts">TextDataAssets</button>
<button class="sub-tab" data-sub="fh-wiki-list">WikiList</button>
</div>
<div id="sub-fh-skills" class="sub-panel active">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">SkillDataAssets</span>
<span class="module-badge" id="fh-skill-badge">未加载</span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-skill-search" class="search-input" placeholder="搜索 SkillType / 名称 / 描述...">
<button class="gb-btn-sm" id="fh-skill-sort" type="button">ID 倒序</button>
<button class="gb-btn-sm" id="fh-skill-refresh">刷新</button>
</div>
<div id="fh-skill-source" class="fh-source"></div>
<div id="fh-skill-content" class="fh-skill-content">
<div class="loading-inline">点击填表助手后加载 SkillDataAssets...</div>
</div>
</div>
</div>
</div>
<div id="sub-fh-techs" class="sub-panel">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">TechDataAssets / TechList</span>
<span class="module-badge" id="fh-techs-badge">未加载</span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-techs-search" class="search-input" placeholder="搜索 TechType / 名称 / 描述...">
<button class="gb-btn-sm" id="fh-techs-sort" type="button">ID 倒序</button>
<button class="gb-btn-sm" id="fh-techs-refresh">刷新</button>
</div>
<div id="fh-techs-source" class="fh-source"></div>
<div id="fh-techs-content" class="fh-collection-content">
<div class="loading-inline">点击 TechList 后加载 TechDataAssets...</div>
</div>
</div>
</div>
</div>
<div id="sub-fh-tech-atoms" class="sub-panel">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">TechDataAssets / TechAtomList</span>
<span class="module-badge" id="fh-tech-atoms-badge">未加载</span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-tech-atoms-search" class="search-input" placeholder="搜索 TechAtom / 名称 / 描述...">
<button class="gb-btn-sm" id="fh-tech-atoms-sort" type="button">ID 倒序</button>
<button class="gb-btn-sm" id="fh-tech-atoms-refresh">刷新</button>
</div>
<div id="fh-tech-atoms-source" class="fh-source"></div>
<div id="fh-tech-atoms-content" class="fh-collection-content">
<div class="loading-inline">点击 TechAtomList 后加载 TechDataAssets...</div>
</div>
</div>
</div>
</div>
<div id="sub-fh-units" class="sub-panel">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">UnitTypeDataAssets / UnitTypeList</span>
<span class="module-badge" id="fh-units-badge">未加载</span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-units-search" class="search-input" placeholder="搜索 UnitType / GiantType / 名称 / 描述...">
<button class="gb-btn-sm" id="fh-units-sort" type="button">ID 倒序</button>
<button class="gb-btn-sm" id="fh-units-refresh">刷新</button>
</div>
<div id="fh-units-source" class="fh-source"></div>
<div id="fh-units-content" class="fh-collection-content">
<div class="loading-inline">点击 UnitTypeList 后加载 UnitTypeDataAssets...</div>
</div>
</div>
</div>
</div>
<div id="sub-fh-resources" class="sub-panel">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">GridAndResourceDataAssets / ResourceInfoList</span>
<span class="module-badge" id="fh-resources-badge">未加载</span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-resources-search" class="search-input" placeholder="搜索 Resource / 名称 / 描述...">
<button class="gb-btn-sm" id="fh-resources-sort" type="button">ID 倒序</button>
<button class="gb-btn-sm" id="fh-resources-refresh">刷新</button>
</div>
<div id="fh-resources-source" class="fh-source"></div>
<div id="fh-resources-content" class="fh-collection-content">
<div class="loading-inline">点击 ResourceInfoList 后加载 GridAndResourceDataAssets...</div>
</div>
</div>
</div>
</div>
<div id="sub-fh-actions" class="sub-panel">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">ActionDataAssets / ActionList</span>
<span class="module-badge" id="fh-actions-badge">未加载</span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-actions-search" class="search-input" placeholder="搜索 ActionId / 名称 / 描述...">
<button class="gb-btn-sm" id="fh-actions-sort" type="button">ID 倒序</button>
<button class="gb-btn-sm" id="fh-actions-refresh">刷新</button>
</div>
<div id="fh-actions-source" class="fh-source"></div>
<div id="fh-actions-content" class="fh-collection-content">
<div class="loading-inline">点击 ActionList 后加载 ActionDataAssets...</div>
</div>
</div>
</div>
</div>
<div id="sub-fh-texts" class="sub-panel">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">TextDataAssets / Text Fields</span>
<span class="module-badge" id="fh-texts-badge">鏈姞杞?/span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-texts-search" class="search-input" placeholder="鎼滅储 FieldName / Text...">
<button class="gb-btn-sm" id="fh-texts-sort" type="button">ID 鍊掑簭</button>
<button class="gb-btn-sm" id="fh-texts-refresh">鍒锋柊</button>
</div>
<div id="fh-texts-source" class="fh-source"></div>
<div id="fh-texts-content" class="fh-collection-content">
<div class="loading-inline">鐐瑰嚮 TextDataAssets 鍚庡姞杞?TextDataAssets...</div>
</div>
</div>
</div>
</div>
<div id="sub-fh-wiki-list" class="sub-panel">
<div class="module-card fh-module">
<div class="module-header">
<span class="module-title">WikiDataAssets / Items</span>
<span class="module-badge" id="fh-wiki-list-badge">未加载</span>
</div>
<div class="module-body">
<div class="fh-toolbar">
<input type="text" id="fh-wiki-list-search" class="search-input" placeholder="搜索 Wiki Id / 名称 / 类型 / 描述...">
<button class="gb-btn-sm" id="fh-wiki-list-sort" type="button">ID 倒序</button>
<button class="gb-btn-sm gb-btn-primary" id="fh-wiki-list-add" type="button">新增 WikiItem</button>
<button class="gb-btn-sm" id="fh-wiki-list-refresh">刷新</button>
</div>
<div id="fh-wiki-list-source" class="fh-source"></div>
<div id="fh-wiki-list-content" class="fh-collection-content">
<div class="loading-inline">点击 WikiList 后加载 WikiDataAssets...</div>
</div>
</div>
</div>
</div>
</div>
<div id="panel-mechanics" class="tab-panel">
<div class="mechanics-layout">
<aside class="mechanics-sidebar">
<div class="mechanics-sidebar-head">
<div class="mechanics-title">游戏机制文档</div>
<div class="mechanics-subtitle">Design/final/mechanics</div>
</div>
<div id="mechanics-doc-list" class="mechanics-doc-list">
<div class="loading-inline">正在加载机制文档...</div>
</div>
</aside>
<section class="mechanics-reader">
<iframe id="mechanics-frame" class="mechanics-frame" title="游戏机制文档"></iframe>
</section>
</div>
</div>
<div id="panel-ai-logic" class="tab-panel">
<div id="ai-logic-content" class="ai-page">
<div class="loading-inline">正在加载 AI 逻辑索引...</div>
</div>
</div>
<div id="panel-story" class="tab-panel">
<!-- Sub-tabs -->
<div class="sub-tabs" id="story-sub-tabs">
<button class="sub-tab active" data-sub="lib-heroes">图鉴英雄</button>
<button class="sub-tab" data-sub="lib-wonders">图鉴奇观</button>
<button class="sub-tab" data-sub="comic">漫画剧情</button>
<button class="sub-tab" data-sub="moments">历史时刻</button>
<button class="sub-tab" data-sub="chat">游戏台词</button>
</div>
<!-- Sub-panel: Library Heroes -->
<div id="sub-lib-heroes" class="sub-panel active">
<div class="toolbar">
<input type="text" id="lib-hero-search" class="search-input" placeholder="搜索英雄名称...">
</div>
<div id="lib-heroes-content" class="card-grid"></div>
</div>
<!-- Sub-panel: Library Wonders -->
<div id="sub-lib-wonders" class="sub-panel">
<div class="toolbar">
<input type="text" id="lib-wonder-search" class="search-input" placeholder="搜索奇观名称...">
</div>
<div id="lib-wonders-content"></div>
</div>
<!-- Sub-panel: Comic / Story Sheets -->
<div id="sub-comic" class="sub-panel">
<div class="toolbar">
<select id="comic-sheet-filter" class="filter-select"><option value="">全部章节</option></select>
</div>
<div id="comic-content"></div>
</div>
<!-- Sub-panel: Moments -->
<div id="sub-moments" class="sub-panel">
<div id="moments-content"></div>
</div>
<!-- Sub-panel: Chat Bubbles -->
<div id="sub-chat" class="sub-panel">
<div class="toolbar">
<input type="text" id="chat-search" class="search-input" placeholder="搜索角色或台词...">
</div>
<div id="chat-content"></div>
</div>
</div>
<div id="panel-art" class="tab-panel">
<!-- Outsource Summary Dashboard (rendered by art.js) -->
<div id="art-outsource-dashboard"></div>
<!-- Sub-tabs -->
<div class="sub-tabs" id="art-sub-tabs">
<button class="sub-tab" data-sub="art-outsource">外包进度</button>
<button class="sub-tab active" data-sub="art-illustrations">角色立绘</button>
<button class="sub-tab" data-sub="art-heroes">英雄立绘</button>
<button class="sub-tab" data-sub="art-units">兵种精灵</button>
<button class="sub-tab" data-sub="art-buildings">建筑</button>
<button class="sub-tab" data-sub="art-comic">游戏插图</button>
<button class="sub-tab" data-sub="art-forces">阵营图标</button>
<button class="sub-tab" data-sub="art-ui">UI素材</button>
</div>
<!-- Summary -->
<div id="art-summary" class="summary-grid" style="margin-bottom:16px"></div>
<!-- Sub-panel: Outsource -->
<div id="sub-art-outsource" class="sub-panel">
<div id="art-outsource-content"></div>
</div>
<!-- Sub-panels -->
<div id="sub-art-illustrations" class="sub-panel active">
<div class="toolbar">
<select id="art-illust-group" class="filter-select"><option value="">全部势力</option></select>
</div>
<div id="art-illustrations-content" class="art-gallery"></div>
</div>
<div id="sub-art-heroes" class="sub-panel">
<div id="art-heroes-content" class="art-gallery"></div>
</div>
<div id="sub-art-units" class="sub-panel">
<div class="toolbar">
<select id="art-units-group" class="filter-select"><option value="">全部势力</option></select>
</div>
<div id="art-units-content" class="art-gallery"></div>
</div>
<div id="sub-art-buildings" class="sub-panel">
<div class="toolbar">
<select id="art-buildings-group" class="filter-select"><option value="">全部分类</option></select>
</div>
<div id="art-buildings-content" class="art-gallery"></div>
</div>
<div id="sub-art-comic" class="sub-panel">
<div class="toolbar">
<select id="art-comic-group" class="filter-select"><option value="">全部分类</option></select>
</div>
<div id="art-comic-content" class="art-gallery"></div>
</div>
<div id="sub-art-forces" class="sub-panel">
<div id="art-forces-content" class="art-gallery"></div>
</div>
<div id="sub-art-ui" class="sub-panel">
<div class="toolbar">
<select id="art-ui-group" class="filter-select"><option value="">全部分类</option></select>
</div>
<div id="art-ui-content" class="art-gallery"></div>
</div>
</div>
<div id="panel-art-dev" class="tab-panel">
<div class="sub-tabs" id="art-dev-sub-tabs">
<button class="sub-tab active" data-sub="art-dev-skill-action-icons">skill/action图标</button>
</div>
<div id="sub-art-dev-skill-action-icons" class="sub-panel active">
<div class="module-card artdev-module">
<div class="module-header">
<span class="module-title">skill/action图标需求</span>
<span class="module-badge" id="artdev-icon-badge">未加载</span>
</div>
<div class="module-body">
<div id="artdev-icon-list" class="artdev-icon-list">
<div class="loading-inline">正在加载图标需求...</div>
</div>
</div>
</div>
</div>
</div>
<div id="panel-sentiment" class="tab-panel">
<div class="sub-tabs" id="sentiment-sub-tabs">
<button class="sub-tab active" data-sent-view="records">舆情记录</button>
<button class="sub-tab" data-sent-view="core-feedback">查看反馈集合</button>
<button class="sub-tab" data-sent-view="official-replies">官方回复集合</button>
<button class="sub-tab" data-sent-view="raw-feedback">原始反馈集</button>
</div>
<div id="sentiment-records-view">
<!-- Header bar -->
<div class="sent-header-bar">
<div class="sent-header-left">
<span class="sent-header-title">舆情记录</span>
<span class="sent-header-count" id="sentiment-count">加载中...</span>
</div>
<button class="sent-btn sent-btn-primary" onclick="sentShowAddModal()">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
添加舆情
</button>
</div>
<!-- Toolbar -->
<div class="toolbar">
<input type="text" id="sentiment-search" class="search-input" placeholder="搜索标题、来源或摘要...">
<select id="sentiment-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="analyzed">已分析</option>
<option value="pending">待分析</option>
</select>
</div>
<!-- List -->
<div id="sentiment-list"></div>
</div>
<div id="sentiment-core-feedback-view" style="display:none;">
<div class="corefb-header-bar">
<div class="corefb-header-left">
<span class="corefb-header-title">核心玩家反馈</span>
<span class="corefb-header-count" id="corefb-count">加载中...</span>
</div>
<div class="corefb-header-actions">
<button class="sent-btn sent-btn-primary" id="corefb-export-btn" style="display:none;" onclick="corefbExportCurrentCollection()">导出</button>
<button class="sent-btn" id="corefb-back-btn" style="display:none;" onclick="corefbBackToCollections()">返回集合</button>
</div>
</div>
<div id="corefb-content" class="corefb-content"></div>
</div>
<div id="sentiment-official-replies-view" style="display:none;">
<div class="corefb-header-bar">
<div class="corefb-header-left">
<span class="corefb-header-title">官方回复集合</span>
<span class="corefb-header-count" id="offrep-count">加载中...</span>
</div>
<div class="corefb-header-actions">
<button class="sent-btn sent-btn-primary" id="offrep-export-btn" style="display:none;" onclick="offrepExportCurrentCollection()">导出</button>
<button class="sent-btn" id="offrep-back-btn" style="display:none;" onclick="offrepBackToCollections()">返回集合</button>
</div>
</div>
<div id="offrep-content" class="corefb-content"></div>
</div>
<div id="sentiment-raw-feedback-view" style="display:none;">
<div class="rawfb-header-bar">
<div class="rawfb-header-left">
<span class="rawfb-header-title">原始反馈集</span>
<span class="rawfb-header-count" id="rawfb-count">加载中...</span>
</div>
<div class="rawfb-header-actions">
<button class="sent-btn sent-btn-primary" id="rawfb-add-set-btn" onclick="rawfbShowAddSetModal()">新增反馈集</button>
<button class="sent-btn sent-btn-primary" id="rawfb-add-item-btn" style="display:none;" onclick="rawfbShowAddItemModal()">新增原始反馈</button>
<button class="sent-btn" id="rawfb-back-btn" style="display:none;" onclick="rawfbBackToSets()">返回反馈集</button>
</div>
</div>
<div id="rawfb-content" class="rawfb-content"></div>
</div>
</div>
<div id="panel-marketing" class="tab-panel">
<!-- Content populated by js/marketing.js on first activation -->
<div class="loading-inline">正在加载宣发数据...</div>
</div>
<div id="panel-devplan" class="tab-panel">
<!-- Content populated by js/devplan.js on first activation -->
<div class="loading-inline">正在加载开发计划...</div>
</div>
<div id="panel-version" class="tab-panel">
<!-- Content populated by js/version.js on first activation -->
<div class="loading-inline">正在加载版本信息...</div>
</div>
<!-- ===== Bug Tracker Panel ===== -->
<div id="panel-bugs" class="tab-panel">
<!-- Header bar -->
<div class="bug-header-bar">
<div class="bug-header-left">
<span class="bug-header-title">BUG 跟踪</span>
<span class="bug-header-count" id="bugs-count">加载中...</span>
</div>
<button class="bug-btn bug-btn-primary" onclick="bugsShowAddModal()">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
添加 BUG
</button>
</div>
<!-- Toolbar -->
<div class="toolbar">
<button class="bug-btn" id="bugs-longterm-toggle" type="button">查看长期 BUG</button>
<input type="text" id="bugs-search" class="search-input" placeholder="搜索编号、标题或描述...">
<select id="bugs-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="open">待修复</option>
<option value="fixing">修复中</option>
<option value="fixed">已修复</option>
<option value="verified">已验证</option>
<option value="wontfix">不修复</option>
</select>
<select id="bugs-priority-filter" class="filter-select">
<option value="">全部优先级</option>
<option value="critical">P0 致命</option>
<option value="high">P1 严重</option>
<option value="medium">P2 一般</option>
<option value="low">P3 轻微</option>
</select>
<select id="bugs-module-filter" class="filter-select">
<option value="">全部模块</option>
</select>
</div>
<!-- Bug List -->
<div id="bugs-list"></div>
</div>
<!-- ===== Todo Tracker Panel ===== -->
<div id="panel-todos" class="tab-panel">
<!-- Header bar -->
<div class="bug-header-bar">
<div class="bug-header-left">
<span class="bug-header-title">待办</span>
<span class="bug-header-count" id="todos-count">加载中...</span>
</div>
<button class="bug-btn bug-btn-primary" onclick="todosShowAddModal()">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
添加待办
</button>
</div>
<!-- Toolbar -->
<div class="toolbar">
<button class="bug-btn" id="todos-longterm-toggle" type="button">查看长期待办</button>
<input type="text" id="todos-search" class="search-input" placeholder="搜索编号、标题或描述...">
<select id="todos-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="open">待处理</option>
<option value="fixing">进行中</option>
<option value="fixed">已完成</option>
<option value="verified">已确认</option>
<option value="wontfix">暂不做</option>
</select>
<select id="todos-priority-filter" class="filter-select">
<option value="">全部优先级</option>
<option value="critical">P0 紧急</option>
<option value="high">P1 重要</option>
<option value="medium">P2 普通</option>
<option value="low">P3 低优先级</option>
</select>
<select id="todos-module-filter" class="filter-select">
<option value="">全部模块</option>
</select>
</div>
<!-- Todo List -->
<div id="todos-list"></div>
</div>
<!-- ===== Suggestion Tracker Panel ===== -->
<div id="panel-suggestions" class="tab-panel">
<!-- Header bar -->
<div class="bug-header-bar">
<div class="bug-header-left">
<span class="bug-header-title">建议跟踪</span>
<span class="bug-header-count" id="suggestions-count">加载中...</span>
</div>
<button class="bug-btn bug-btn-primary" onclick="suggestionsShowAddModal()">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
新增建议
</button>
</div>
<!-- Toolbar -->
<div class="toolbar">
<input type="text" id="suggestions-search" class="search-input" placeholder="搜索编号、标题或描述...">
<select id="suggestions-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="open">未处理</option>
<option value="processed">已处理</option>
</select>
<select id="suggestions-module-filter" class="filter-select">
<option value="">全部模块</option>
</select>
</div>
<!-- Suggestion List -->
<div id="suggestions-list"></div>
</div>
<!-- ===== Local Codex Sessions Panel ===== -->
<div id="panel-codex" class="tab-panel">
<div class="codex-shell">
<section class="codex-left">
<div class="codex-header">
<div>
<div class="codex-title">Codex 对话</div>
<div class="codex-subtitle" id="codex-count">加载中...</div>
</div>
<button class="bug-btn bug-btn-primary" id="codex-refresh" type="button">刷新</button>
</div>
<div class="codex-toolbar">
<input type="text" id="codex-search" class="search-input" placeholder="搜索标题、摘要或会话 ID...">
<label class="codex-check">
<input type="checkbox" id="codex-include-archived" checked>
<span>含归档</span>
</label>
</div>
<div id="codex-session-list" class="codex-session-list"></div>
</section>
<section class="codex-right">
<div class="codex-detail-head">
<div>
<div class="codex-detail-title" id="codex-detail-title">选择一个 TH1 会话</div>
<div class="codex-detail-meta" id="codex-detail-meta">本面板只显示工作目录为 C:\TH1\TH1 的本机 Codex 会话。</div>
</div>
</div>
<div class="codex-runner">
<textarea id="codex-prompt" class="codex-prompt" rows="5" placeholder="输入要交给本机 Codex 执行的任务..."></textarea>
<div class="codex-runner-actions">
<button class="bug-btn" id="codex-run-new" type="button">新会话执行</button>
<button class="bug-btn bug-btn-primary" id="codex-run-resume" type="button" disabled>续接所选会话执行</button>
<span id="codex-job-status" class="codex-job-status"></span>
</div>
<pre id="codex-job-output" class="codex-job-output"></pre>
</div>
<div id="codex-messages" class="codex-messages">
<div class="loading-inline">选择左侧会话后查看摘要和最近消息。</div>
</div>
</section>
</div>
</div>
<!-- ===== SNS Assistant Panel ===== -->
<div id="panel-sns" class="tab-panel">
<!-- Sub-tabs -->
<div class="sub-tabs" id="sns-sub-tabs">
<button class="sub-tab" data-sub="tools">常用工具</button>
<button class="sub-tab" data-sub="xiaoheihe">小黑盒</button>
<button class="sub-tab active" data-sub="steam">Steam商店</button>
<button class="sub-tab" data-sub="bilibili">Bilibili</button>
<button class="sub-tab" data-sub="twitter">Twitter</button>
<button class="sub-tab" data-sub="qq">Q群</button>
<button class="sub-tab" data-sub="discord">Discord</button>
</div>
<!-- Sub-panel: 常用工具 -->
<div id="sub-sns-tools" class="sub-panel">
<div class="sns-header-bar">
<div class="sns-header-left">
<span class="sns-header-title">常用回复</span>
<span class="sns-header-count" id="qr-count">加载中...</span>
</div>
<button class="sns-btn sns-btn-primary" onclick="qrShowCreateDialog()">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
新增一句
</button>
</div>
<div class="toolbar">
<input type="text" id="qr-search" class="search-input" placeholder="搜索标题或内容...">
</div>
<div id="qr-list"></div>
</div>
<!-- Sub-panel: 小黑盒 -->
<div id="sub-sns-xiaoheihe" class="sub-panel">
<div class="sns-header-bar">
<div class="sns-header-left">
<span class="sns-header-title">小黑盒评论</span>
<span class="sns-header-count" id="sns-xiaoheihe-count">加载中...</span>
</div>
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('xiaoheihe')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
</div>
<div class="toolbar">
<input type="text" id="sns-xiaoheihe-search" class="search-input" placeholder="搜索标题...">
<select id="sns-xiaoheihe-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="processed">已处理</option>
</select>
</div>
<div id="sns-xiaoheihe-list"></div>
</div>
<!-- Sub-panel: Steam商店 -->
<div id="sub-sns-steam" class="sub-panel active">
<div class="sns-header-bar">
<div class="sns-header-left">
<span class="sns-header-title">Steam商店评论</span>
<span class="sns-header-count" id="sns-steam-count">加载中...</span>
</div>
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('steam')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
</div>
<div class="toolbar">
<input type="text" id="sns-steam-search" class="search-input" placeholder="搜索标题...">
<select id="sns-steam-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="processed">已处理</option>
</select>
</div>
<div id="sns-steam-list"></div>
</div>
<!-- Sub-panel: Bilibili -->
<div id="sub-sns-bilibili" class="sub-panel">
<div class="sns-header-bar">
<div class="sns-header-left">
<span class="sns-header-title">Bilibili评论</span>
<span class="sns-header-count" id="sns-bilibili-count">加载中...</span>
</div>
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('bilibili')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
</div>
<div class="toolbar">
<input type="text" id="sns-bilibili-search" class="search-input" placeholder="搜索标题...">
<select id="sns-bilibili-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="processed">已处理</option>
</select>
</div>
<div id="sns-bilibili-list"></div>
</div>
<!-- Sub-panel: Twitter -->
<div id="sub-sns-twitter" class="sub-panel">
<div class="sns-header-bar">
<div class="sns-header-left">
<span class="sns-header-title">Twitter评论</span>
<span class="sns-header-count" id="sns-twitter-count">加载中...</span>
</div>
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('twitter')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
</div>
<div class="toolbar">
<input type="text" id="sns-twitter-search" class="search-input" placeholder="搜索标题...">
<select id="sns-twitter-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="processed">已处理</option>
</select>
</div>
<div id="sns-twitter-list"></div>
</div>
<!-- Sub-panel: Q群 -->
<div id="sub-sns-qq" class="sub-panel">
<div class="sns-header-bar">
<div class="sns-header-left">
<span class="sns-header-title">Q群评论</span>
<span class="sns-header-count" id="sns-qq-count">加载中...</span>
</div>
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('qq')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
</div>
<div class="toolbar">
<input type="text" id="sns-qq-search" class="search-input" placeholder="搜索标题...">
<select id="sns-qq-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="processed">已处理</option>
</select>
</div>
<div id="sns-qq-list"></div>
</div>
<!-- Sub-panel: Discord -->
<div id="sub-sns-discord" class="sub-panel">
<div class="sns-header-bar">
<div class="sns-header-left">
<span class="sns-header-title">Discord评论</span>
<span class="sns-header-count" id="sns-discord-count">加载中...</span>
</div>
<div class="sns-header-actions">
<button class="sns-btn sns-btn-primary sns-btn-large" onclick="snsShowDiscordPasteDialog()">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
添加 Discord 信息
</button>
<button class="sns-btn" onclick="snsAutoUpdate('discord')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
</div>
</div>
<div class="toolbar">
<input type="text" id="sns-discord-search" class="search-input" placeholder="搜索标题...">
<select id="sns-discord-status-filter" class="filter-select">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="processed">已处理</option>
</select>
</div>
<div id="sns-discord-list"></div>
</div>
</div>
<!-- ===== Game Balance Analysis Panel ===== -->
<div id="panel-gamebalance" class="tab-panel">
<!-- Sub-nav -->
<div class="sub-tabs" id="gb-sub-tabs">
<button class="sub-tab active" data-sub="gb-query">通用查询</button>
<button class="sub-tab" data-sub="gb-hero-data">英雄数据</button>
<button class="sub-tab" data-sub="gb-hero-upgrade">英雄升级</button>
<button class="sub-tab" data-sub="gb-hero">英雄平衡</button>
<button class="sub-tab" data-sub="gb-faction">阵营平衡</button>
</div>
<!-- Sub: 通用查询 -->
<div id="sub-gb-query" class="sub-panel active">
<!-- Module 1: 版本筛选 -->
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">版本筛选</span>
<span class="module-badge" id="gb-version-badge">未加载</span>
</div>
<div class="module-body">
<div class="gb-version-bar">
<button class="gb-btn-sm" onclick="gbSelectAllVersions(true)">全选</button>
<button class="gb-btn-sm" onclick="gbSelectAllVersions(false)">全不选</button>
</div>
<div id="gb-version-list" class="gb-version-list">
<span class="text-muted">加载中...</span>
</div>
</div>
</div>
<!-- Module 2: 筛选条件 -->
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">筛选条件</span>
<span class="module-badge">单位过滤</span>
</div>
<div class="module-body">
<div class="gb-filter-grid">
<div class="gb-filter-row">
<label class="gb-filter-check">
<input type="checkbox" id="gb-filter-unittype-on">
<span>UnitType</span>
</label>
<select id="gb-filter-unittype" class="gb-filter-select" disabled>
<option value="">--</option>
</select>
</div>
<div class="gb-filter-row">
<label class="gb-filter-check">
<input type="checkbox" id="gb-filter-gianttype-on">
<span>GiantType</span>
</label>
<select id="gb-filter-gianttype" class="gb-filter-select" disabled>
<option value="">--</option>
</select>
</div>
<div class="gb-filter-row">
<label class="gb-filter-check">
<input type="checkbox" id="gb-filter-level-on">
<span>Level</span>
</label>
<select id="gb-filter-level" class="gb-filter-select" disabled>
<option value="">--</option>
</select>
</div>
</div>
<div class="gb-filter-actions">
<button class="gb-btn gb-btn-primary" onclick="gbSearch()">查询</button>
<button class="gb-btn" onclick="gbResetFilters()">重置</button>
</div>
</div>
</div>
<!-- Module 3: 统计结果 -->
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">统计结果</span>
<span class="module-badge" id="gb-stats-badge">--</span>
</div>
<div class="module-body" id="gb-stats-content">
<div class="gb-stats-empty">选择版本和筛选条件后点击查询</div>
</div>
</div>
<!-- Module 4: 数据列表 -->
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">对局数据</span>
<span class="module-badge" id="gb-data-badge">--</span>
</div>
<div class="module-body" style="padding:0;">
<div id="gb-data-table-wrap">
<table class="gb-table" id="gb-data-table">
<thead>
<tr>
<th>#</th>
<th>版本</th>
<th>玩家</th>
<th>总回合</th>
<th>伤害事件</th>
<th>造兵数</th>
<th>玩家数</th>
<th>时间戳</th>
</tr>
</thead>
<tbody id="gb-data-tbody"></tbody>
</table>
</div>
<div class="gb-pagination" id="gb-pagination"></div>
</div>
</div>
</div>
<!-- Sub: 英雄数据 -->
<div id="sub-gb-hero-data" class="sub-panel">
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">英雄数据</span>
<span class="module-badge" id="gbhd-total-badge">未加载</span>
</div>
<div class="module-body">
<div class="gbhd-toolbar">
<div class="gbhp-model-meta">
<span>按职阶横向排列 5 个当前帝国,基础属性拆成独立行便于横向比对</span>
</div>
<div class="gbhp-controls">
<input type="text" id="gbhd-search" class="search-input" placeholder="搜索英雄 / 帝国 / 技能">
<select id="gbhd-class-filter" class="gb-filter-select">
<option value="">全部职阶</option>
</select>
<select id="gbhd-force-filter" class="gb-filter-select">
<option value="">全部5帝国</option>
</select>
</div>
</div>
<div id="gbhd-hero-table" class="gbhd-table-shell">
<div class="gb-stats-empty">正在加载英雄数据...</div>
</div>
</div>
</div>
</div>
<!-- Sub: 英雄升级 -->
<div id="sub-gb-hero-upgrade" class="sub-panel">
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">英雄升级</span>
<span class="module-badge" id="gbhu-total-badge">未加载</span>
</div>
<div class="module-body">
<div class="gbhu-toolbar">
<div class="gbhp-model-meta">
<span>按当前 HeroDataAssets 任务配置估算每段升级大概需要的回合数,三段任务均按升级后从 0 重新累计处理。</span>
</div>
<div class="gbhp-controls">
<input type="text" id="gbhu-search" class="search-input" placeholder="搜索英雄 / 帝国 / 任务 / 估算逻辑">
<select id="gbhu-force-filter" class="gb-filter-select">
<option value="">全部5帝国</option>
</select>
<select id="gbhu-speed-filter" class="gb-filter-select">
<option value="">全部速度</option>
<option value="fast">偏快</option>
<option value="normal">常规</option>
<option value="slow">偏慢</option>
<option value="gated">门槛/依赖</option>
</select>
</div>
</div>
<div class="gbhu-model-note">
基础口径:金币 6/回合、探索 8格/回合、伤害 12点/回合、击杀 1.2个/回合、开遗迹约每2回合1处、主动/特殊技能约每回合1次特殊任务按技能机制覆盖。
</div>
<div id="gbhu-upgrade-table" class="gbhu-table-shell">
<div class="gb-stats-empty">正在加载英雄升级估算...</div>
</div>
</div>
</div>
</div>
<!-- Sub: 英雄平衡 -->
<div id="sub-gb-hero" class="sub-panel">
<!-- Row 1: 版本筛选 + 计算 -->
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">版本筛选</span>
<span class="module-badge" id="gbh-version-badge">未加载</span>
</div>
<div class="module-body">
<div class="gb-version-bar">
<button class="gb-btn-sm" onclick="gbhSelectAllVersions(true)">全选</button>
<button class="gb-btn-sm" onclick="gbhSelectAllVersions(false)">全不选</button>
</div>
<div id="gbh-version-list" class="gb-version-list">
<span class="text-muted">加载中...</span>
</div>
<div style="margin-top:12px;">
<button class="gb-btn gb-btn-primary" onclick="gbhCalculate()">计算</button>
</div>
</div>
</div>
<!-- Row 2: 显示维度 + 英雄网格 -->
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">英雄平衡</span>
<span class="module-badge" id="gbh-total-badge">--</span>
</div>
<div class="module-body">
<div class="gbh-metric-bar" id="gbh-metric-bar">
<label class="gbh-metric-radio">
<input type="radio" name="gbh-metric" value="appearRate" checked> 出场率
</label>
<label class="gbh-metric-radio">
<input type="radio" name="gbh-metric" value="avgDamage"> 平均伤害
</label>
<label class="gbh-metric-radio">
<input type="radio" name="gbh-metric" value="avgDeaths"> 平均死亡
</label>
</div>
<div id="gbh-tier-grid" class="gbh-tier-grid">
<div class="gb-stats-empty">选择版本后点击「计算」</div>
</div>
</div>
</div>
<!-- Row 3: 英雄定价评估 -->
<div class="module-card gb-module">
<div class="module-header">
<span class="module-title">英雄定价评估</span>
<span class="module-badge" id="gbhp-pricing-badge">未加载</span>
</div>
<div class="module-body">
<div class="gbhp-toolbar">
<div class="gbhp-model-meta">
<span id="gbhp-version-info">读取平衡建模最新产出...</span>
<span id="gbhp-source-info" class="gbhp-source-info"></span>
</div>
<div class="gbhp-controls">
<select id="gbhp-sort" class="gb-filter-select">
<option value="finalDesc">最终等级高到低</option>
<option value="finalAsc">最终等级低到高</option>
<option value="maxDesc">最高价高到低</option>
<option value="className">职阶 / 英雄名</option>
<option value="heroName">英雄名</option>
</select>
<button class="gb-btn-sm" onclick="gbhpLoadPricing(true)">刷新</button>
</div>
</div>
<div id="gbhp-pricing-table" class="gbhp-pricing-table">
<div class="gb-stats-empty">正在加载定价模型...</div>
</div>
</div>
</div>
</div>
<!-- Sub: 阵营平衡 -->
<div id="sub-gb-faction" class="sub-panel">
<div class="gb-placeholder">阵营平衡模块开发中...</div>
</div>
</div>
</div>
</div>
<script src="js/app.js"></script>
<script src="js/balance.js"></script>
<script src="js/mechanics.js?v=20260526-1"></script>
<script src="js/ai_logic.js"></script>
<script src="js/story.js"></script>
<script src="js/art.js"></script>
<script src="js/sentiment.js"></script>
<script src="js/core_feedback.js"></script>
<script src="js/official_replies.js"></script>
<script src="js/raw_feedback.js"></script>
<script src="js/project.js"></script>
<script src="js/marketing.js"></script>
<script src="js/devplan.js"></script>
<script src="js/version.js"></script>
<script src="js/bugs.js"></script>
<script src="js/todos.js"></script>
<script src="js/suggestions.js"></script>
<script src="js/codex_threads.js"></script>
<script src="js/gamebalance.js"></script>
<script src="js/sns.js"></script>
<script src="js/quick_replies.js"></script>
<script src="js/form_helper.js"></script>
<script src="js/art_dev.js"></script>
</body>
</html>