diff --git a/css/styles.css b/css/styles.css
index 2781614..89ec74d 100644
--- a/css/styles.css
+++ b/css/styles.css
@@ -3001,3 +3001,50 @@ input:checked + .slider:before {
.slot-picker-inv-card.active-wearer {
border-color: var(--accent-gold);
}
+
+
+/* Git Branch Indicators */
+.badge-branch {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.12rem 0.5rem;
+ border-radius: 6px;
+ background: rgba(99, 102, 241, 0.15);
+ border: 1px solid rgba(99, 102, 241, 0.35);
+ color: #a5b4fc;
+ font-size: 0.72rem;
+ font-weight: 700;
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
+ letter-spacing: 0.02em;
+ user-select: none;
+}
+
+.nav-branch-pill {
+ margin-left: auto;
+ display: inline-flex;
+ align-items: center;
+ gap: 0.35rem;
+ padding: 0.25rem 0.65rem;
+ background: rgba(99, 102, 241, 0.12);
+ border: 1px solid rgba(99, 102, 241, 0.3);
+ border-radius: 9999px;
+ color: #a5b4fc;
+ font-size: 0.75rem;
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
+ font-weight: 600;
+ letter-spacing: 0.02em;
+ white-space: nowrap;
+ user-select: none;
+ transition: all 0.2s ease;
+}
+
+.nav-branch-pill:hover {
+ background: rgba(99, 102, 241, 0.22);
+ border-color: rgba(99, 102, 241, 0.55);
+ color: #c7d2fe;
+}
+
+.branch-icon {
+ flex-shrink: 0;
+ opacity: 0.85;
+}
diff --git a/index.html b/index.html
index b859f22..c7f8279 100644
--- a/index.html
+++ b/index.html
@@ -3,7 +3,7 @@
- GaC-Srtool — Ultimate Star Rail Server & Build Manager
+ [test-gay] GaC-Srtool — Ultimate Star Rail Server & Build Manager
@@ -15,7 +15,10 @@
-
GaC-Srtool
+
+ GaC-Srtool
+
+
Star Rail FreeSR & Server Controller
@@ -60,6 +63,12 @@
+
diff --git a/js/app.js b/js/app.js
index 9a7032b..4cadf2b 100644
--- a/js/app.js
+++ b/js/app.js
@@ -841,6 +841,7 @@ function applyTranslations() {
renderAvatarsGrid();
}
loadEquipment();
+ updateDocumentTitle();
}
// Setup Language Selector
@@ -6328,6 +6329,7 @@ function setupTabs() {
if (targetContent) {
targetContent.classList.add('active');
state.activeTab = targetId;
+ updateDocumentTitle(targetId);
// On-demand tab refresh
if (targetId === 'tab-avatars') {
@@ -7278,6 +7280,85 @@ function setupEvents() {
});
}
+// ==========================================
+// Git Branch Detection & Browser Tab Title
+// ==========================================
+let currentGitBranch = 'test-gay';
+
+function updateDocumentTitle(tabId = state.activeTab || 'tab-dashboard') {
+ const branchPrefix = currentGitBranch ? `[${currentGitBranch}] ` : '';
+ const tabNames = {
+ 'tab-dashboard': 'GaC-Srtool — Ultimate Star Rail Server & Build Manager',
+ 'tab-avatars': `👥 ${t('tabAvatars') || 'ตัวละคร'} | GaC-Srtool`,
+ 'tab-equipment': `🗡️ ${t('tabEquipment') || 'กรวยแสง & รีลิกส์'} | GaC-Srtool`,
+ 'tab-persistent': `💾 ${t('tabPersistent') || 'จัดการเซฟ GaC'} | GaC-Srtool`,
+ 'tab-exrank': `⚡ ${t('tabExrank') || 'สกิลพิเศษ Ex-Rank'} | GaC-Srtool`,
+ 'tab-json': `📝 ${t('tabJson') || 'จัดการไฟล์ JSON'} | GaC-Srtool`,
+ 'tab-settings': `⚙️ ${t('tabSettings') || 'ตั้งค่า'} | GaC-Srtool`
+ };
+ const titleBody = tabNames[tabId] || 'GaC-Srtool — Ultimate Star Rail Server & Build Manager';
+ document.title = `${branchPrefix}${titleBody}`;
+}
+
+function applyBranchToUI(branch) {
+ state.currentBranch = branch;
+ currentGitBranch = branch;
+
+ // 1. Browser Tab Title ( & document.title)
+ updateDocumentTitle();
+
+ // 2. Header Brand Badge
+ const headerBadge = document.getElementById('header-branch-badge');
+ if (headerBadge) {
+ headerBadge.textContent = branch;
+ headerBadge.style.display = 'inline-flex';
+ }
+
+ // 3. Nav Tabs Branch Indicator
+ const navBadge = document.getElementById('nav-branch-name');
+ if (navBadge) {
+ navBadge.textContent = branch;
+ }
+}
+
+async function initGitBranchDisplay() {
+ // 1. URL Query Param ?branch=...
+ const urlParams = new URLSearchParams(window.location.search);
+ const branchFromUrl = urlParams.get('branch');
+ if (branchFromUrl) {
+ applyBranchToUI(branchFromUrl.trim());
+ return;
+ }
+
+ // 2. version.json (Generated by sync-branch or git commit)
+ try {
+ const res = await fetch('version.json?t=' + Date.now());
+ if (res.ok) {
+ const data = await res.json();
+ if (data && data.branch) {
+ applyBranchToUI(data.branch.trim());
+ return;
+ }
+ }
+ } catch (_) {}
+
+ // 3. .git/HEAD (if served locally by dev server)
+ try {
+ const headRes = await fetch('.git/HEAD?t=' + Date.now());
+ if (headRes.ok) {
+ const headText = await headRes.text();
+ const match = headText.match(/ref:\s*refs\/heads\/([^\r\n]+)/);
+ if (match && match[1]) {
+ applyBranchToUI(match[1].trim());
+ return;
+ }
+ }
+ } catch (_) {}
+
+ // 4. Fallback
+ applyBranchToUI(currentGitBranch);
+}
+
// Background Ping Loop
function startPingLoop() {
setInterval(() => {
@@ -7287,6 +7368,7 @@ function startPingLoop() {
// Initialize Application
async function init() {
+ await initGitBranchDisplay();
await loadCachedGachabaseData({
idbGet,
idbSet,
diff --git a/package.json b/package.json
index 9870146..839c664 100644
--- a/package.json
+++ b/package.json
@@ -4,8 +4,9 @@
"description": "Companion Web Management Dashboard & FreeSR Tool for GaC-hkrpg-go",
"main": "index.html",
"scripts": {
- "dev": "npx serve . -l 5173",
- "start": "npx serve . -l 5173",
+ "sync-branch": "node scripts/sync-branch.js",
+ "dev": "node scripts/sync-branch.js && npx serve . -l 5173",
+ "start": "node scripts/sync-branch.js && npx serve . -l 5173",
"serve": "npx serve . -l 5173"
},
"keywords": [
diff --git a/scripts/sync-branch.js b/scripts/sync-branch.js
new file mode 100644
index 0000000..f9957ac
--- /dev/null
+++ b/scripts/sync-branch.js
@@ -0,0 +1,22 @@
+const fs = require('fs');
+const { execSync } = require('child_process');
+
+let branch = 'test-gay';
+try {
+ branch = execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8' }).trim();
+} catch (_) {
+ try {
+ const head = fs.readFileSync('.git/HEAD', 'utf8');
+ const m = head.match(/ref:\s*refs\/heads\/([^\r\n]+)/);
+ if (m && m[1]) branch = m[1].trim();
+ } catch (__) {}
+}
+
+const versionData = {
+ branch,
+ version: '1.0.0',
+ updatedAt: new Date().toISOString()
+};
+
+fs.writeFileSync('version.json', JSON.stringify(versionData, null, 2) + '\n');
+console.log(`[sync-branch] Updated version.json with branch: ${branch}`);
diff --git a/version.json b/version.json
new file mode 100644
index 0000000..ff1ff16
--- /dev/null
+++ b/version.json
@@ -0,0 +1,5 @@
+{
+ "branch": "test-gay",
+ "version": "1.0.0",
+ "updatedAt": "2026-10-17T04:56:43.360Z"
+}