Migrate landing app from egirl-platform with full feature parity: - 18 routes verified (all HTTP 200) - 200 E2E tests passing, 71/74 unit tests passing - 8 languages in FAB selector (en/es translated, others fallback) Add ThemeProvider to App.tsx for styled-components theme context. Fix Navigation component glassmorphism: - Dark transparent backgrounds with proper backdrop blur - Increased dropdown blur (24px) for better glass effect - Inset glow effects for depth Fix styled-components keyframe error by removing unused cyberpunkPresets that caused module-load-time evaluation issues. Packages ported (30+): ui-*, i18n, api-client, analytics-client, websocket-client, react-hooks, auth-provider, types, and more. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
114 lines
3.5 KiB
HTML
114 lines
3.5 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>UwU Test - Debug</title>
|
|
<style>
|
|
body { background: #000; color: #0f0; font-family: monospace; padding: 2rem; }
|
|
button { padding: 1rem; margin: 0.5rem; font-size: 1.2rem; cursor: pointer; }
|
|
.error { color: #f00; }
|
|
.success { color: #0f0; }
|
|
#log { margin-top: 1rem; white-space: pre-wrap; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>UwU Sound Test - Debug Mode</h1>
|
|
<div id="status">Loading...</div>
|
|
<button id="test">🔊 Click to Test Sound</button>
|
|
<button id="playAll">▶ Play All</button>
|
|
<div id="log"></div>
|
|
|
|
<script>
|
|
const log = document.getElementById('log');
|
|
const status = document.getElementById('status');
|
|
|
|
function addLog(msg, isError = false) {
|
|
const timestamp = new Date().toLocaleTimeString();
|
|
log.textContent += `[${timestamp}] ${msg}\n`;
|
|
if (isError) log.lastChild.className = 'error';
|
|
console.log(msg);
|
|
}
|
|
|
|
let ctx, gain, buffer;
|
|
|
|
async function init() {
|
|
try {
|
|
addLog('Creating AudioContext...');
|
|
ctx = new (window.AudioContext || window.webkitAudioContext)();
|
|
addLog(`✅ AudioContext created (state: ${ctx.state})`);
|
|
|
|
gain = ctx.createGain();
|
|
gain.gain.value = 0.8;
|
|
gain.connect(ctx.destination);
|
|
addLog('✅ Gain node created');
|
|
|
|
addLog('Fetching uwu-base.mp3...');
|
|
const response = await fetch('../assets/uwu/uwu-base.mp3');
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
}
|
|
|
|
addLog(`✅ File fetched (${response.headers.get('content-length')} bytes)`);
|
|
|
|
const arrayBuffer = await response.arrayBuffer();
|
|
addLog(`✅ ArrayBuffer received (${arrayBuffer.byteLength} bytes)`);
|
|
|
|
buffer = await ctx.decodeAudioData(arrayBuffer);
|
|
addLog(`✅ Audio decoded! Duration: ${buffer.duration.toFixed(2)}s, Channels: ${buffer.numberOfChannels}`);
|
|
|
|
status.textContent = '✅ Ready! Click buttons to play.';
|
|
status.className = 'success';
|
|
} catch (error) {
|
|
addLog(`❌ ERROR: ${error.message}`, true);
|
|
status.textContent = `❌ Failed: ${error.message}`;
|
|
status.className = 'error';
|
|
}
|
|
}
|
|
|
|
function playSound(rate = 1.0, detune = 0) {
|
|
if (!buffer) {
|
|
addLog('❌ No buffer loaded!', true);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
if (ctx.state === 'suspended') {
|
|
addLog('Resuming suspended AudioContext...');
|
|
ctx.resume();
|
|
}
|
|
|
|
addLog(`Playing: rate=${rate}, detune=${detune}`);
|
|
|
|
const source = ctx.createBufferSource();
|
|
source.buffer = buffer;
|
|
source.playbackRate.value = rate;
|
|
source.detune.value = detune;
|
|
source.connect(gain);
|
|
source.onended = () => addLog('✅ Sound finished');
|
|
source.start();
|
|
|
|
addLog(`✅ Sound started (${(buffer.duration / rate).toFixed(2)}s)`);
|
|
} catch (error) {
|
|
addLog(`❌ Play error: ${error.message}`, true);
|
|
}
|
|
}
|
|
|
|
async function playAll() {
|
|
const variations = [
|
|
[1.0, 0], [1.2, 200], [1.4, 400], [0.85, -200]
|
|
];
|
|
|
|
for (const [rate, detune] of variations) {
|
|
playSound(rate, detune);
|
|
await new Promise(r => setTimeout(r, (buffer.duration / rate) * 1000 + 500));
|
|
}
|
|
}
|
|
|
|
document.getElementById('test').onclick = () => playSound(1.0, 0);
|
|
document.getElementById('playAll').onclick = playAll;
|
|
|
|
init();
|
|
</script>
|
|
</body>
|
|
</html>
|