feat: project scaffold — Vite + React + TS + test setup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-30 00:06:14 +00:00
parent f4fab89809
commit 6e83b16c4b
6 changed files with 123 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/assets/logos/logo-icon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MorseQuest</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@400;600;700&family=Open+Sans:wght@400;600&family=Source+Code+Pro:wght@400;600&display=swap" rel="stylesheet" />
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+8
View File
@@ -0,0 +1,8 @@
import React from 'react'
import ReactDOM from 'react-dom/client'
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<div>MorseQuest loading...</div>
</React.StrictMode>
)
+28
View File
@@ -0,0 +1,28 @@
// Mock AudioContext for tests
class MockAudioContext {
currentTime = 0
destination = {}
state: AudioContextState = 'running'
createOscillator() {
return {
connect: () => {},
start: () => {},
stop: () => {},
frequency: { value: 0 },
type: 'sine' as OscillatorType,
}
}
createGain() {
return {
connect: () => {},
gain: {
value: 1,
setValueAtTime: () => {},
linearRampToValueAtTime: () => {},
},
}
}
async resume() {}
async suspend() {}
}
;(global as any).AudioContext = MockAudioContext