Merge pull request 'fix: clamp negative resources + add tutorial focus trap' (#220) from sprint/issue-resource-clamp-focus-trap into main
Some checks failed
Smoke Test / smoke (push) Has been cancelled

This commit was merged in pull request #220.
This commit is contained in:
2026-04-21 15:24:34 +00:00
2 changed files with 25 additions and 0 deletions

View File

@@ -142,6 +142,11 @@ function tick() {
G.harmony += G.harmonyRate * dt; G.harmony += G.harmonyRate * dt;
G.harmony = Math.max(0, Math.min(100, G.harmony)); G.harmony = Math.max(0, Math.min(100, G.harmony));
// Clamp resources to prevent negative values from debuffs/Fenrir drain
G.ops = Math.max(0, G.ops);
G.trust = Math.max(0, G.trust);
G.compute = Math.max(0, G.compute);
// Track totals // Track totals
G.totalCode += G.codeRate * dt; G.totalCode += G.codeRate * dt;
G.totalCompute += G.computeRate * dt; G.totalCompute += G.computeRate * dt;

View File

@@ -208,6 +208,23 @@ function renderTutorialStep(index) {
// Focus the next button so Enter works // Focus the next button so Enter works
const nextBtn = document.getElementById('tutorial-next-btn'); const nextBtn = document.getElementById('tutorial-next-btn');
if (nextBtn) nextBtn.focus(); if (nextBtn) nextBtn.focus();
// Focus trap: prevent tabbing outside the tutorial overlay
overlay._focusTrapHandler = function(e) {
if (e.key !== 'Tab') return;
const focusable = overlay.querySelectorAll('button, [href], [tabindex]:not([tabindex="-1"])');
if (focusable.length === 0) return;
const first = focusable[0];
const last = focusable[focusable.length - 1];
if (e.shiftKey && document.activeElement === first) {
e.preventDefault();
last.focus();
} else if (!e.shiftKey && document.activeElement === last) {
e.preventDefault();
first.focus();
}
};
overlay.addEventListener('keydown', overlay._focusTrapHandler);
} }
let _tutorialStep = 0; let _tutorialStep = 0;
@@ -236,6 +253,9 @@ document.addEventListener('keydown', function tutorialKeyHandler(e) {
function closeTutorial() { function closeTutorial() {
const overlay = document.getElementById('tutorial-overlay'); const overlay = document.getElementById('tutorial-overlay');
if (overlay) { if (overlay) {
if (overlay._focusTrapHandler) {
overlay.removeEventListener('keydown', overlay._focusTrapHandler);
}
overlay.style.animation = 'tutorial-fade-in 0.3s ease-in reverse'; overlay.style.animation = 'tutorial-fade-in 0.3s ease-in reverse';
setTimeout(() => overlay.remove(), 280); setTimeout(() => overlay.remove(), 280);
} }