diff --git a/assets/js/main.js b/assets/js/main.js index fefb5e1..ff89bff 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -172,6 +172,9 @@ document.addEventListener('DOMContentLoaded', () => { const applyPresetState = (preset) => { if (!preset) return; if (controls.angle && preset.angle_deg !== undefined) controls.angle.value = preset.angle_deg; + if (controls.backAngle && preset.back_angle !== undefined) controls.backAngle.value = preset.back_angle; + if (controls.legAngle && preset.leg_angle !== undefined) controls.legAngle.value = preset.leg_angle; + if (controls.headAngle && preset.head_angle !== undefined) controls.headAngle.value = preset.head_angle; if (controls.intensity && preset.intensity_pct !== undefined) controls.intensity.value = preset.intensity_pct; if (controls.pattern && preset.pattern_mode) controls.pattern.value = preset.pattern_mode; if (controls.name && preset.name !== undefined) controls.name.value = preset.name; @@ -397,6 +400,9 @@ document.addEventListener('DOMContentLoaded', () => { applyPresetState({ name: button.dataset.name || '', angle_deg: button.dataset.angle || 0, + back_angle: button.dataset.back || 0, + leg_angle: button.dataset.leg || 0, + head_angle: button.dataset.head || 0, intensity_pct: button.dataset.intensity || 0, pattern_mode: button.dataset.pattern || 'continuous', notes: button.dataset.notes || '' @@ -452,6 +458,46 @@ document.addEventListener('DOMContentLoaded', () => { notify(`Disconnected: ${event.gamepad.id}`); }); + // Keyboard Shortcuts + document.addEventListener('keydown', (e) => { + if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.tagName === 'SELECT') return; + + const step = e.shiftKey ? 10 : 5; + + switch (e.key.toLowerCase()) { + case 'v': + runVibration().catch(console.error); + break; + case 'r': + if (ui.resetButton) ui.resetButton.click(); + break; + case 'arrowup': + if (controls.angle) { + controls.angle.value = Math.min(180, Number(controls.angle.value) + step); + updateVisualization(); + } + break; + case 'arrowdown': + if (controls.angle) { + controls.angle.value = Math.max(0, Number(controls.angle.value) - step); + updateVisualization(); + } + break; + case 'arrowright': + if (controls.intensity) { + controls.intensity.value = Math.min(100, Number(controls.intensity.value) + step); + updateVisualization(); + } + break; + case 'arrowleft': + if (controls.intensity) { + controls.intensity.value = Math.max(0, Number(controls.intensity.value) - step); + updateVisualization(); + } + break; + } + }); + applyPresetState(appConfig.initialPreset || {}); wirePresetButtons(); refreshGamepads();