polished numpad mode

This commit is contained in:
2026-07-16 23:22:38 +03:00
parent 7ccc91ad01
commit 453be1178f
3 changed files with 40 additions and 34 deletions
+28 -30
View File
@@ -14,7 +14,7 @@ const STRINGS = {
difficulty: 'Difficulty level', difficulty: 'Difficulty level',
answerMode: 'Answer Mode', answerMode: 'Answer Mode',
timeLimit: 'Time Limit', timeLimit: 'Time Limit',
numberOfRounds: 'Number of Rounds', numberOfRounds: 'Number of Questions',
play: 'Go!', play: 'Go!',
timeLeft: 'Time left', timeLeft: 'Time left',
submit: 'Submit', submit: 'Submit',
@@ -53,8 +53,8 @@ const STRINGS = {
numberRange: '\u0414\u0438\u0430\u043F\u0430\u0437\u043E\u043D \u0447\u0438\u0441\u0435\u043B', numberRange: '\u0414\u0438\u0430\u043F\u0430\u0437\u043E\u043D \u0447\u0438\u0441\u0435\u043B',
difficulty: '\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u0438', difficulty: '\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u0438',
answerMode: '\u0420\u0435\u0436\u0438\u043C \u043E\u0442\u0432\u0435\u0442\u0430', answerMode: '\u0420\u0435\u0436\u0438\u043C \u043E\u0442\u0432\u0435\u0442\u0430',
timeLimit: '\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0435 \u043F\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438', timeLimit: '\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u043E\u0442\u0432\u0435\u0442',
numberOfRounds: '\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0443\u043D\u0434\u043E\u0432', numberOfRounds: '\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u0432',
play: '\u0412\u043F\u0435\u0440\u0451\u0434!', play: '\u0412\u043F\u0435\u0440\u0451\u0434!',
timeLeft: '\u041E\u0441\u0442\u0430\u043B\u043E\u0441\u044C', timeLeft: '\u041E\u0441\u0442\u0430\u043B\u043E\u0441\u044C',
submit: '\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C', submit: '\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C',
@@ -193,11 +193,14 @@ const MODES = [
const TIMINGS = [ const TIMINGS = [
{ value: 0 }, { value: 0 },
{ value: 30 }, { value: 30 },
{ value: 15 }, { value: 10 },
{ value: 5 }, { value: 5 },
{ value: 3 },
{ value: 2 },
{ value: 1 },
]; ];
const ROUNDS = [10, 25, 50, 100]; const ROUNDS = [5, 10, 25, 50, 100];
let game = { let game = {
system: null, system: null,
@@ -291,7 +294,7 @@ function renderSetupRange() {
function renderSetupOptions() { function renderSetupOptions() {
const defaultMode = 0; const defaultMode = 0;
const defaultTiming = 0; const defaultTiming = 0;
const defaultRounds = 0; const defaultRounds = 1;
setupState.mode = defaultMode; setupState.mode = defaultMode;
setupState.timing = defaultTiming; setupState.timing = defaultTiming;
@@ -311,32 +314,23 @@ function renderSetupOptions() {
modesDiv.appendChild(btn); modesDiv.appendChild(btn);
}); });
const timingDiv = document.getElementById('setup-timing'); const timingSelect = document.getElementById('setup-timing');
timingDiv.innerHTML = ''; timingSelect.innerHTML = '';
TIMINGS.forEach((tm, i) => { TIMINGS.forEach((tm, i) => {
const btn = document.createElement('button'); const opt = document.createElement('option');
btn.className = 'option-btn' + (i === defaultTiming ? ' selected' : ''); opt.value = i;
btn.textContent = tm.value === 0 ? t('noLimit') : tm.value + ' ' + t('sec'); opt.textContent = tm.value === 0 ? t('noLimit') : tm.value + ' ' + t('sec');
btn.addEventListener('click', () => { timingSelect.appendChild(opt);
timingDiv.querySelectorAll('.option-btn').forEach(b => b.classList.remove('selected'));
btn.classList.add('selected');
setupState.timing = i;
}); });
timingDiv.appendChild(btn); timingSelect.value = defaultTiming;
timingSelect.addEventListener('change', () => {
setupState.timing = parseInt(timingSelect.value, 10);
}); });
const roundsDiv = document.getElementById('setup-rounds'); const roundsSelect = document.getElementById('setup-rounds');
roundsDiv.innerHTML = ''; roundsSelect.value = defaultRounds;
ROUNDS.forEach((r, i) => { roundsSelect.addEventListener('change', () => {
const btn = document.createElement('button'); setupState.rounds = parseInt(roundsSelect.value, 10);
btn.className = 'option-btn' + (i === defaultRounds ? ' selected' : '');
btn.textContent = String(r);
btn.addEventListener('click', () => {
roundsDiv.querySelectorAll('.option-btn').forEach(b => b.classList.remove('selected'));
btn.classList.add('selected');
setupState.rounds = i;
});
roundsDiv.appendChild(btn);
}); });
showScreen('setup-options'); showScreen('setup-options');
@@ -478,7 +472,8 @@ function renderNumpad() {
clearBtn.dataset.key = 'clear'; clearBtn.dataset.key = 'clear';
} }
document.getElementById('btn-submit-answer').classList.remove('hidden'); const submitBtn = document.getElementById('btn-submit-answer');
submitBtn.classList.add('hidden');
numpadArea.querySelectorAll('.numpad-key').forEach(key => { numpadArea.querySelectorAll('.numpad-key').forEach(key => {
key.onclick = () => handleNumpadKey(key.dataset.key); key.onclick = () => handleNumpadKey(key.dataset.key);
@@ -535,6 +530,9 @@ function handleNumpadKey(key) {
inputEl.textContent += key; inputEl.textContent += key;
} }
} }
const submitBtn = document.getElementById('btn-submit-answer');
submitBtn.classList.toggle('hidden', isNaN(parseInt(inputEl.textContent, 10)));
} }
function startTimer() { function startTimer() {
@@ -625,7 +623,7 @@ function endGame() {
const sysClass = m.key === 'slavonic' ? ' slavonic-font' : ''; const sysClass = m.key === 'slavonic' ? ' slavonic-font' : '';
item.innerHTML = ` item.innerHTML = `
<div class="result-system${sysClass}">${m.system}</div> <div class="result-system${sysClass}">${m.system}</div>
<div class="result-arrow">\u2192</div> <div class="result-arrow">\u2B95</div>
<div class="result-decimal">${m.decimal}</div> <div class="result-decimal">${m.decimal}</div>
`; `;
listEl.appendChild(item); listEl.appendChild(item);
+8 -2
View File
@@ -76,12 +76,18 @@
<div class="setup-section"> <div class="setup-section">
<h3 data-i18n="timeLimit">Time Limit</h3> <h3 data-i18n="timeLimit">Time Limit</h3>
<div id="setup-timing" class="option-grid"></div> <select id="setup-timing" class="lang-select"></select>
</div> </div>
<div class="setup-section"> <div class="setup-section">
<h3 data-i18n="numberOfRounds">Number of Rounds</h3> <h3 data-i18n="numberOfRounds">Number of Rounds</h3>
<div id="setup-rounds" class="option-grid"></div> <select id="setup-rounds" class="lang-select">
<option value="0">5</option>
<option value="1">10</option>
<option value="2">25</option>
<option value="3">50</option>
<option value="4">100</option>
</select>
</div> </div>
<button class="btn btn-primary btn-large" id="btn-play" data-i18n="play">Play!</button> <button class="btn btn-primary btn-large" id="btn-play" data-i18n="play">Play!</button>
+3 -1
View File
@@ -123,6 +123,8 @@ body {
cursor: pointer; cursor: pointer;
width: 100%; width: 100%;
max-width: 320px; max-width: 320px;
margin: 0 auto;
display: block;
} }
.ticker { .ticker {
@@ -479,7 +481,7 @@ body {
padding: 16px; padding: 16px;
background: var(--bg-card); background: var(--bg-card);
border-radius: 8px; border-radius: 8px;
min-height: 60px; height: 60px;
margin-bottom: 16px; margin-bottom: 16px;
display: flex; display: flex;
align-items: center; align-items: center;