v2.4.4: Rename Profiles to Configurations, add Identity Switcher

- Rename "Profiles" to "Configurations" in all UI text and 11 locale files
- Add identity switcher dropdown in header (green accent, fa-id-badge icon)
- Quick-switch player identity without opening Settings
- "Manage" action opens UUID Management modal
- Header tooltips explaining what each dropdown does
- Config dropdown icon changed from fa-user-circle to fa-sliders-h
- Global Escape key handler for closing modals and dropdowns
- Fix identity selector not clickable (missing -webkit-app-region: no-drag)
- Sync header identity name after all identity-changing operations
- XSS protection in identity list rendering

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
sanasol
2026-02-26 20:01:40 +01:00
parent 66493d35ca
commit b83b728d21
17 changed files with 842 additions and 181 deletions

View File

@@ -73,22 +73,40 @@
<span id="onlineCount" class="counter-value">0</span>
</div>
<div class="identity-selector" id="identitySelector">
<button class="identity-btn" onclick="toggleIdentityDropdown()">
<i class="fas fa-id-badge"></i>
<span id="currentIdentityName">Player</span>
<i class="fas fa-chevron-down"></i>
</button>
<div class="identity-dropdown" id="identityDropdown">
<div class="identity-list" id="identityList"></div>
<div class="identity-divider"></div>
<div class="identity-action" onclick="openIdentityManager()">
<i class="fas fa-fingerprint"></i>
<span data-i18n="header.manageIdentities">Manage</span>
</div>
</div>
<span class="header-tooltip" data-i18n="header.identityTooltip">Your player name &amp; UUID used in-game</span>
</div>
<div class="profile-selector" id="profileSelector">
<button class="profile-btn" onclick="toggleProfileDropdown()">
<i class="fas fa-user-circle"></i>
<i class="fas fa-sliders-h"></i>
<span id="currentProfileName">Default</span>
<i class="fas fa-chevron-down"></i>
</button>
<div class="profile-dropdown" id="profileDropdown">
<div class="profile-list" id="profileList">
<!-- Profiles populated by JS -->
<!-- Configurations populated by JS -->
</div>
<div class="profile-divider"></div>
<div class="profile-action" onclick="openProfileManager()">
<i class="fas fa-cog"></i>
<span data-i18n="header.manageProfiles">Manage Profiles</span>
<span data-i18n="header.manageProfiles">Manage</span>
</div>
</div>
<span class="header-tooltip" data-i18n="header.configTooltip">Game config: mods, Java &amp; memory settings</span>
</div>
<div class="window-controls">
@@ -736,28 +754,40 @@
</div>
<div class="uuid-modal-body">
<div class="uuid-current-section">
<h3 class="uuid-section-title" data-i18n="uuid.currentUserUUID">Current User UUID</h3>
<div class="uuid-current-display">
<input type="text" id="modalCurrentUuid" class="uuid-display-input" readonly />
<button id="modalCopyUuidBtn" class="uuid-action-btn copy-btn" title="Copy UUID">
<i class="fas fa-copy"></i>
</button>
<button id="modalRegenerateUuidBtn" class="uuid-action-btn regenerate-btn"
title="Generate New UUID">
<i class="fas fa-sync-alt"></i>
</button>
</div>
</div>
<div class="uuid-list-section">
<div class="uuid-list-header">
<h3 class="uuid-section-title" data-i18n="uuid.allPlayerUUIDs">All Player UUIDs</h3>
<button id="generateNewUuidBtn" class="uuid-generate-btn">
<button id="addIdentityBtn" class="uuid-generate-btn">
<i class="fas fa-plus"></i>
<span data-i18n="uuid.generateNew">Generate New UUID</span>
<span data-i18n="uuid.addIdentity">Add Identity</span>
</button>
</div>
<div id="uuidAddForm" class="uuid-add-form" style="display: none;">
<div class="uuid-add-form-row">
<input type="text" id="addIdentityUsername" class="uuid-input"
data-i18n-placeholder="uuid.usernamePlaceholder"
placeholder="Username" maxlength="16" />
</div>
<div class="uuid-add-form-row">
<input type="text" id="addIdentityUuid" class="uuid-input"
data-i18n-placeholder="uuid.customPlaceholder"
placeholder="UUID (auto-generated)" maxlength="36" />
<button id="addIdentityRegenerateBtn" class="uuid-action-btn regenerate-btn"
title="Generate new UUID">
<i class="fas fa-sync-alt"></i>
</button>
</div>
<div class="uuid-add-form-actions">
<button id="addIdentityConfirmBtn" class="uuid-set-btn">
<i class="fas fa-check"></i>
<span data-i18n="uuid.add">Add</span>
</button>
<button id="addIdentityCancelBtn" class="uuid-cancel-btn">
<i class="fas fa-times"></i>
<span data-i18n="uuid.cancel">Cancel</span>
</button>
</div>
</div>
<div id="uuidList" class="uuid-list">
<div class="uuid-loading">
<i class="fas fa-spinner fa-spin"></i>
@@ -766,21 +796,27 @@
</div>
</div>
<div class="uuid-custom-section">
<h3 class="uuid-section-title" data-i18n="uuid.setCustomUUID">Set Custom UUID</h3>
<div class="uuid-custom-form">
<input type="text" id="customUuidInput" class="uuid-input"
data-i18n-placeholder="uuid.customPlaceholder" maxlength="36" />
<button id="setCustomUuidBtn" class="uuid-set-btn">
<i class="fas fa-check"></i>
<span data-i18n="uuid.setUUID">Set UUID</span>
</button>
<div class="uuid-advanced-section">
<button id="uuidAdvancedToggle" class="uuid-advanced-toggle">
<i class="fas fa-chevron-right uuid-advanced-chevron"></i>
<span data-i18n="uuid.advanced">Advanced</span>
</button>
<div id="uuidAdvancedContent" class="uuid-advanced-content" style="display: none;">
<h3 class="uuid-section-title" data-i18n="uuid.setCustomUUID">Set Custom UUID</h3>
<div class="uuid-custom-form">
<input type="text" id="customUuidInput" class="uuid-input"
data-i18n-placeholder="uuid.customPlaceholder" maxlength="36" />
<button id="setCustomUuidBtn" class="uuid-set-btn">
<i class="fas fa-check"></i>
<span data-i18n="uuid.setUUID">Set UUID</span>
</button>
</div>
<p class="uuid-custom-hint">
<i class="fas fa-exclamation-triangle"></i>
<span data-i18n="uuid.warning">Warning: Setting a custom UUID will change your current player
identity</span>
</p>
</div>
<p class="uuid-custom-hint">
<i class="fas fa-exclamation-triangle"></i>
<span data-i18n="uuid.warning">Warning: Setting a custom UUID will change your current player
identity</span>
</p>
</div>
</div>
</div>
@@ -791,8 +827,8 @@
<div class="profile-modal-content">
<div class="profile-modal-header">
<h2 class="profile-modal-title">
<i class="fas fa-users-cog mr-2"></i>
<span data-i18n="profiles.modalTitle">Manage Profiles</span>
<i class="fas fa-sliders-h mr-2"></i>
<span data-i18n="configurations.modalTitle">Manage Configurations</span>
</h2>
<button class="modal-close-btn" onclick="closeProfileManager()">
<i class="fas fa-times"></i>
@@ -803,10 +839,10 @@
<!-- Populated by JS -->
</div>
<div class="profile-create-section">
<input type="text" id="newProfileName" data-i18n-placeholder="profiles.newProfilePlaceholder"
<input type="text" id="newProfileName" data-i18n-placeholder="configurations.newProfilePlaceholder"
class="profile-input" maxlength="20">
<button class="profile-create-btn" onclick="createNewProfile()">
<i class="fas fa-plus"></i> <span data-i18n="profiles.createProfile">Create Profile</span>
<i class="fas fa-plus"></i> <span data-i18n="configurations.createProfile">Create Configuration</span>
</button>
</div>
</div>