exafunction--windsurf-demo
94 行
3.0 KiB
JavaScript
94 行
3.0 KiB
JavaScript
// UI Controls
|
|
|
|
function loadDarkMode() {
|
|
const isDarkMode = localStorage.getItem('darkMode') === 'true';
|
|
document.documentElement.setAttribute('data-theme', isDarkMode ? 'dark' : '');
|
|
document.getElementById('dark-mode-toggle').checked = isDarkMode;
|
|
}
|
|
|
|
function saveDarkMode(isDarkMode) {
|
|
localStorage.setItem('darkMode', isDarkMode);
|
|
}
|
|
|
|
function initMinimapDrag() {
|
|
const minimap = document.getElementById('minimap');
|
|
let isDragging = false;
|
|
let currentX;
|
|
let currentY;
|
|
let initialX;
|
|
let initialY;
|
|
|
|
minimap.addEventListener('mousedown', (e) => {
|
|
isDragging = true;
|
|
initialX = e.clientX - currentX;
|
|
initialY = e.clientY - currentY;
|
|
minimap.style.cursor = 'grabbing';
|
|
});
|
|
|
|
document.addEventListener('mousemove', (e) => {
|
|
if (!isDragging) return;
|
|
|
|
e.preventDefault();
|
|
currentX = e.clientX - initialX;
|
|
currentY = e.clientY - initialY;
|
|
|
|
// Keep minimap within viewport bounds
|
|
const minimapRect = minimap.getBoundingClientRect();
|
|
const viewportWidth = window.innerWidth;
|
|
const viewportHeight = window.innerHeight;
|
|
|
|
currentX = Math.max(0, Math.min(currentX, viewportWidth - minimapRect.width));
|
|
currentY = Math.max(0, Math.min(currentY, viewportHeight - minimapRect.height));
|
|
|
|
minimap.style.left = `${currentX}px`;
|
|
minimap.style.bottom = `${viewportHeight - currentY - minimapRect.height}px`;
|
|
});
|
|
|
|
document.addEventListener('mouseup', () => {
|
|
isDragging = false;
|
|
minimap.style.cursor = 'grab';
|
|
});
|
|
|
|
// Initialize position and cursor
|
|
const minimapRect = minimap.getBoundingClientRect();
|
|
currentX = minimapRect.left;
|
|
currentY = minimapRect.top;
|
|
minimap.style.cursor = 'grab';
|
|
}
|
|
|
|
export function initUI() {
|
|
const settingsIcon = document.getElementById('settings-icon');
|
|
const settingsPanel = document.getElementById('settings-panel');
|
|
const darkModeToggle = document.getElementById('dark-mode-toggle');
|
|
|
|
// Load dark mode preference
|
|
loadDarkMode();
|
|
|
|
// Initialize minimap dragging
|
|
initMinimapDrag();
|
|
|
|
// Toggle settings panel
|
|
settingsIcon.addEventListener('click', (e) => {
|
|
e.stopPropagation(); // Prevent click from propagating to document
|
|
settingsPanel.classList.toggle('visible');
|
|
});
|
|
|
|
// Close settings when clicking outside
|
|
document.addEventListener('click', (e) => {
|
|
if (!settingsPanel.contains(e.target) && settingsPanel.classList.contains('visible')) {
|
|
settingsPanel.classList.remove('visible');
|
|
}
|
|
});
|
|
|
|
// Prevent game controls when interacting with settings
|
|
settingsPanel.addEventListener('click', (e) => {
|
|
e.stopPropagation();
|
|
});
|
|
|
|
// Handle dark mode toggle
|
|
darkModeToggle.addEventListener('change', (e) => {
|
|
const isDarkMode = e.target.checked;
|
|
document.documentElement.setAttribute('data-theme', isDarkMode ? 'dark' : '');
|
|
saveDarkMode(isDarkMode);
|
|
});
|
|
} |