Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
GitHub Actions
commited on
Commit
·
7b0064a
1
Parent(s):
b8ff2a8
Sync from GitHub repo
Browse files- templates/arena.html +137 -59
templates/arena.html
CHANGED
|
@@ -28,6 +28,10 @@
|
|
| 28 |
<button type="submit" class="mobile-synth-btn">Synthesize</button>
|
| 29 |
</form>
|
| 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
<div class="loading-container" style="display: none;">
|
| 32 |
<div class="loader-wrapper">
|
| 33 |
<div class="loader-animation">
|
|
@@ -73,7 +77,7 @@
|
|
| 73 |
</div>
|
| 74 |
|
| 75 |
<div class="keyboard-hint">
|
| 76 |
-
Press <kbd>Space</kbd> to play/pause audio, <kbd>A</kbd> or <kbd>B</kbd> to vote after listening
|
| 77 |
</div>
|
| 78 |
</div>
|
| 79 |
|
|
@@ -115,11 +119,11 @@
|
|
| 115 |
<!-- Script lines will be added here -->
|
| 116 |
</div>
|
| 117 |
|
| 118 |
-
<button type="button" class="add-line-btn">+ Add Line</button>
|
| 119 |
-
|
| 120 |
<div class="keyboard-hint podcast-keyboard-hint">
|
| 121 |
-
Press <kbd>Ctrl</kbd>+<kbd>Enter</kbd> or <kbd>Alt</kbd>+<kbd>Enter</kbd> to add a new line
|
| 122 |
</div>
|
|
|
|
|
|
|
| 123 |
</div>
|
| 124 |
|
| 125 |
<div class="podcast-loading-container" style="display: none;">
|
|
@@ -167,7 +171,7 @@
|
|
| 167 |
</div>
|
| 168 |
|
| 169 |
<div class="keyboard-hint">
|
| 170 |
-
Press <kbd>Space</kbd> to play/pause audio, <kbd>A</kbd> or <kbd>B</kbd> to vote after listening
|
| 171 |
</div>
|
| 172 |
|
| 173 |
<div class="podcast-vote-results vote-results" style="display: none;">
|
|
@@ -1345,39 +1349,46 @@
|
|
| 1345 |
const ttsTab = document.getElementById('tts-tab');
|
| 1346 |
if (!ttsTab.classList.contains('active')) return;
|
| 1347 |
|
| 1348 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1349 |
if (document.activeElement === textInput) {
|
| 1350 |
-
|
| 1351 |
-
|
| 1352 |
-
|
| 1353 |
-
|
| 1354 |
-
if (bothSamplesPlayed && !voteButtons[0].disabled) {
|
| 1355 |
-
handleVote('a');
|
| 1356 |
-
} else if (playersContainer.style.display !== 'none' && !bothSamplesPlayed) {
|
| 1357 |
-
showListenToastMessage();
|
| 1358 |
-
}
|
| 1359 |
-
} else if (e.key.toLowerCase() === 'b') {
|
| 1360 |
-
if (bothSamplesPlayed && !voteButtons[1].disabled) {
|
| 1361 |
-
handleVote('b');
|
| 1362 |
-
} else if (playersContainer.style.display !== 'none' && !bothSamplesPlayed) {
|
| 1363 |
-
showListenToastMessage();
|
| 1364 |
-
}
|
| 1365 |
-
} else if (e.key.toLowerCase() === 'n') {
|
| 1366 |
-
if (nextRoundContainer.style.display === 'block') {
|
| 1367 |
-
if (!e.ctrlKey && !e.metaKey) {
|
| 1368 |
-
e.preventDefault();
|
| 1369 |
-
}
|
| 1370 |
-
resetToInitialState();
|
| 1371 |
}
|
| 1372 |
-
|
| 1373 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1374 |
if (!e.ctrlKey && !e.metaKey) {
|
| 1375 |
e.preventDefault();
|
| 1376 |
handleRandom();
|
| 1377 |
}
|
| 1378 |
-
} else if (e.key === '
|
| 1379 |
-
|
| 1380 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1381 |
e.preventDefault();
|
| 1382 |
// If A is playing, toggle A, else if B is playing, toggle B, else play A
|
| 1383 |
if (wavePlayers.a.isPlaying) {
|
|
@@ -1385,10 +1396,35 @@
|
|
| 1385 |
} else if (wavePlayers.b.isPlaying) {
|
| 1386 |
wavePlayers.b.togglePlayPause();
|
| 1387 |
} else {
|
| 1388 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1389 |
}
|
| 1390 |
}
|
| 1391 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1392 |
});
|
| 1393 |
|
| 1394 |
// Add event listener for random button
|
|
@@ -1875,34 +1911,51 @@
|
|
| 1875 |
const podcastTab = document.getElementById('conversational-tab');
|
| 1876 |
if (!podcastTab.classList.contains('active')) return;
|
| 1877 |
|
| 1878 |
-
//
|
| 1879 |
-
|
| 1880 |
-
|
| 1881 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1882 |
}
|
| 1883 |
-
|
| 1884 |
-
if
|
| 1885 |
-
|
| 1886 |
-
|
| 1887 |
-
|
| 1888 |
-
|
| 1889 |
-
|
| 1890 |
-
|
| 1891 |
-
|
| 1892 |
-
|
| 1893 |
-
|
| 1894 |
-
|
| 1895 |
}
|
| 1896 |
-
} else if (e.key
|
| 1897 |
-
|
| 1898 |
-
|
| 1899 |
-
|
| 1900 |
-
|
| 1901 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1902 |
}
|
| 1903 |
-
}
|
| 1904 |
-
|
| 1905 |
-
|
|
|
|
|
|
|
| 1906 |
e.preventDefault();
|
| 1907 |
// If A is playing, toggle A, else if B is playing, toggle B, else play A
|
| 1908 |
if (podcastWavePlayers.a && podcastWavePlayers.a.isPlaying) {
|
|
@@ -1910,10 +1963,35 @@
|
|
| 1910 |
} else if (podcastWavePlayers.b && podcastWavePlayers.b.isPlaying) {
|
| 1911 |
podcastWavePlayers.b.togglePlayPause();
|
| 1912 |
} else if (podcastWavePlayers.a) {
|
| 1913 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1914 |
}
|
| 1915 |
}
|
| 1916 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1917 |
});
|
| 1918 |
|
| 1919 |
// Event listeners
|
|
|
|
| 28 |
<button type="submit" class="mobile-synth-btn">Synthesize</button>
|
| 29 |
</form>
|
| 30 |
|
| 31 |
+
<div class="keyboard-hint">
|
| 32 |
+
Press <kbd>R</kbd> for random text, <kbd>Enter</kbd> to synthesize, <kbd>N</kbd> for random + synthesize
|
| 33 |
+
</div>
|
| 34 |
+
|
| 35 |
<div class="loading-container" style="display: none;">
|
| 36 |
<div class="loader-wrapper">
|
| 37 |
<div class="loader-animation">
|
|
|
|
| 77 |
</div>
|
| 78 |
|
| 79 |
<div class="keyboard-hint">
|
| 80 |
+
Press <kbd>Space</kbd> to play/pause audio, <kbd>A</kbd> or <kbd>B</kbd> to vote after listening
|
| 81 |
</div>
|
| 82 |
</div>
|
| 83 |
|
|
|
|
| 119 |
<!-- Script lines will be added here -->
|
| 120 |
</div>
|
| 121 |
|
|
|
|
|
|
|
| 122 |
<div class="keyboard-hint podcast-keyboard-hint">
|
| 123 |
+
Press <kbd>Ctrl</kbd>+<kbd>Enter</kbd> or <kbd>Alt</kbd>+<kbd>Enter</kbd> to add a new line, <kbd>R</kbd> for random script, <kbd>Enter</kbd> to generate, <kbd>N</kbd> for random + generate
|
| 124 |
</div>
|
| 125 |
+
|
| 126 |
+
<button type="button" class="add-line-btn">+ Add Line</button>
|
| 127 |
</div>
|
| 128 |
|
| 129 |
<div class="podcast-loading-container" style="display: none;">
|
|
|
|
| 171 |
</div>
|
| 172 |
|
| 173 |
<div class="keyboard-hint">
|
| 174 |
+
Press <kbd>Space</kbd> to play/pause audio, <kbd>A</kbd> or <kbd>B</kbd> to vote after listening
|
| 175 |
</div>
|
| 176 |
|
| 177 |
<div class="podcast-vote-results vote-results" style="display: none;">
|
|
|
|
| 1349 |
const ttsTab = document.getElementById('tts-tab');
|
| 1350 |
if (!ttsTab.classList.contains('active')) return;
|
| 1351 |
|
| 1352 |
+
// --- Shortcut logic based on current state ---
|
| 1353 |
+
const isInputVisible = playersContainer.style.display === 'none' && loadingContainer.style.display === 'none';
|
| 1354 |
+
const isPlaybackVisible = playersContainer.style.display !== 'none';
|
| 1355 |
+
const isNextRoundVisible = nextRoundContainer.style.display === 'block';
|
| 1356 |
+
|
| 1357 |
+
// Ignore shortcuts if text input is focused
|
| 1358 |
if (document.activeElement === textInput) {
|
| 1359 |
+
// Allow Enter key if focused on text input and input is visible
|
| 1360 |
+
if (e.key === 'Enter' && isInputVisible) {
|
| 1361 |
+
e.preventDefault();
|
| 1362 |
+
handleSynthesize();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1363 |
}
|
| 1364 |
+
return; // Don't process other shortcuts when input is focused
|
| 1365 |
+
}
|
| 1366 |
+
|
| 1367 |
+
// Global shortcuts (when not focused on input)
|
| 1368 |
+
if (e.key.toLowerCase() === 'r' && isInputVisible) {
|
| 1369 |
+
// Only trigger random if not trying to reload (Ctrl+R or Cmd+R)
|
| 1370 |
if (!e.ctrlKey && !e.metaKey) {
|
| 1371 |
e.preventDefault();
|
| 1372 |
handleRandom();
|
| 1373 |
}
|
| 1374 |
+
} else if (e.key === 'Enter' && isInputVisible) {
|
| 1375 |
+
e.preventDefault();
|
| 1376 |
+
handleSynthesize();
|
| 1377 |
+
} else if (e.key.toLowerCase() === 'n' && isInputVisible) {
|
| 1378 |
+
// 'N' for New Random Round (only when input is visible)
|
| 1379 |
+
if (!e.ctrlKey && !e.metaKey) {
|
| 1380 |
+
e.preventDefault();
|
| 1381 |
+
handleRandom(); // Get random text
|
| 1382 |
+
// Add a slight delay to ensure text input is populated before synthesizing
|
| 1383 |
+
setTimeout(() => {
|
| 1384 |
+
handleSynthesize(); // Synthesize the random text
|
| 1385 |
+
}, 50);
|
| 1386 |
+
}
|
| 1387 |
+
}
|
| 1388 |
+
|
| 1389 |
+
// Playback/Voting shortcuts (only when players are visible)
|
| 1390 |
+
else if (isPlaybackVisible) {
|
| 1391 |
+
if (e.key === ' ') { // Space to play/pause
|
| 1392 |
e.preventDefault();
|
| 1393 |
// If A is playing, toggle A, else if B is playing, toggle B, else play A
|
| 1394 |
if (wavePlayers.a.isPlaying) {
|
|
|
|
| 1396 |
} else if (wavePlayers.b.isPlaying) {
|
| 1397 |
wavePlayers.b.togglePlayPause();
|
| 1398 |
} else {
|
| 1399 |
+
// If neither is playing, prefer playing A if it hasn't finished, else B
|
| 1400 |
+
if (wavePlayers.a.wavesurfer.getCurrentTime() < wavePlayers.a.wavesurfer.getDuration()) {
|
| 1401 |
+
wavePlayers.a.play();
|
| 1402 |
+
} else {
|
| 1403 |
+
wavePlayers.b.play();
|
| 1404 |
+
}
|
| 1405 |
+
}
|
| 1406 |
+
} else if (e.key.toLowerCase() === 'a') { // Vote A
|
| 1407 |
+
if (bothSamplesPlayed && !voteButtons[0].disabled) {
|
| 1408 |
+
handleVote('a');
|
| 1409 |
+
} else if (!bothSamplesPlayed) {
|
| 1410 |
+
showListenToastMessage();
|
| 1411 |
+
}
|
| 1412 |
+
} else if (e.key.toLowerCase() === 'b') { // Vote B
|
| 1413 |
+
if (bothSamplesPlayed && !voteButtons[1].disabled) {
|
| 1414 |
+
handleVote('b');
|
| 1415 |
+
} else if (!bothSamplesPlayed) {
|
| 1416 |
+
showListenToastMessage();
|
| 1417 |
}
|
| 1418 |
}
|
| 1419 |
}
|
| 1420 |
+
|
| 1421 |
+
// Next Round shortcut (only when next round button is visible)
|
| 1422 |
+
else if (isNextRoundVisible && e.key.toLowerCase() === 'n') {
|
| 1423 |
+
if (!e.ctrlKey && !e.metaKey) {
|
| 1424 |
+
e.preventDefault();
|
| 1425 |
+
}
|
| 1426 |
+
resetToInitialState();
|
| 1427 |
+
}
|
| 1428 |
});
|
| 1429 |
|
| 1430 |
// Add event listener for random button
|
|
|
|
| 1911 |
const podcastTab = document.getElementById('conversational-tab');
|
| 1912 |
if (!podcastTab.classList.contains('active')) return;
|
| 1913 |
|
| 1914 |
+
// --- Shortcut logic based on current state ---
|
| 1915 |
+
const isScriptEditorVisible = podcastPlayerContainer.style.display === 'none' && podcastLoadingContainer.style.display === 'none';
|
| 1916 |
+
const isPodcastPlaybackVisible = podcastPlayerContainer.style.display !== 'none';
|
| 1917 |
+
const isPodcastNextRoundVisible = podcastNextRoundContainer.style.display === 'block';
|
| 1918 |
+
|
| 1919 |
+
// Only process if specific input fields are not focused
|
| 1920 |
+
const activeElementTag = document.activeElement.tagName;
|
| 1921 |
+
const isInputFocused = activeElementTag === 'INPUT' || activeElementTag === 'TEXTAREA';
|
| 1922 |
+
|
| 1923 |
+
// Handle adding new line shortcut separately if input is focused
|
| 1924 |
+
if (isInputFocused && e.key === 'Enter' && (e.altKey || e.ctrlKey)) {
|
| 1925 |
+
// Already handled by input's keydown listener, prevent double action
|
| 1926 |
+
return;
|
| 1927 |
}
|
| 1928 |
+
|
| 1929 |
+
// Ignore other shortcuts if any input/textarea is focused
|
| 1930 |
+
if (isInputFocused) {
|
| 1931 |
+
return;
|
| 1932 |
+
}
|
| 1933 |
+
|
| 1934 |
+
// Global shortcuts (when not focused on input)
|
| 1935 |
+
if (e.key.toLowerCase() === 'r' && isScriptEditorVisible) {
|
| 1936 |
+
// Only trigger random if not trying to reload (Ctrl+R or Cmd+R)
|
| 1937 |
+
if (!e.ctrlKey && !e.metaKey) {
|
| 1938 |
+
e.preventDefault();
|
| 1939 |
+
loadRandomScript();
|
| 1940 |
}
|
| 1941 |
+
} else if (e.key === 'Enter' && isScriptEditorVisible) {
|
| 1942 |
+
e.preventDefault();
|
| 1943 |
+
generatePodcast();
|
| 1944 |
+
} else if (e.key.toLowerCase() === 'n' && isScriptEditorVisible) {
|
| 1945 |
+
// 'N' for New Random Podcast (only when script editor is visible)
|
| 1946 |
+
if (!e.ctrlKey && !e.metaKey) {
|
| 1947 |
+
e.preventDefault();
|
| 1948 |
+
loadRandomScript(); // Get random script
|
| 1949 |
+
// Add a slight delay before generating
|
| 1950 |
+
setTimeout(() => {
|
| 1951 |
+
generatePodcast(); // Generate the random script
|
| 1952 |
+
}, 50);
|
| 1953 |
}
|
| 1954 |
+
}
|
| 1955 |
+
|
| 1956 |
+
// Playback/Voting shortcuts (only when players are visible)
|
| 1957 |
+
else if (isPodcastPlaybackVisible) {
|
| 1958 |
+
if (e.key === ' ') { // Space to play/pause
|
| 1959 |
e.preventDefault();
|
| 1960 |
// If A is playing, toggle A, else if B is playing, toggle B, else play A
|
| 1961 |
if (podcastWavePlayers.a && podcastWavePlayers.a.isPlaying) {
|
|
|
|
| 1963 |
} else if (podcastWavePlayers.b && podcastWavePlayers.b.isPlaying) {
|
| 1964 |
podcastWavePlayers.b.togglePlayPause();
|
| 1965 |
} else if (podcastWavePlayers.a) {
|
| 1966 |
+
// If neither is playing, prefer playing A if it hasn't finished, else B
|
| 1967 |
+
if (podcastWavePlayers.a.wavesurfer.getCurrentTime() < podcastWavePlayers.a.wavesurfer.getDuration()) {
|
| 1968 |
+
podcastWavePlayers.a.play();
|
| 1969 |
+
} else if (podcastWavePlayers.b) {
|
| 1970 |
+
podcastWavePlayers.b.play();
|
| 1971 |
+
}
|
| 1972 |
+
}
|
| 1973 |
+
} else if (e.key.toLowerCase() === 'a') { // Vote A
|
| 1974 |
+
if (bothPodcastSamplesPlayed && !podcastVoteButtons[0].disabled) {
|
| 1975 |
+
handlePodcastVote('a');
|
| 1976 |
+
} else if (!bothPodcastSamplesPlayed) {
|
| 1977 |
+
openToast("Please listen to both audio samples before voting", "info");
|
| 1978 |
+
}
|
| 1979 |
+
} else if (e.key.toLowerCase() === 'b') { // Vote B
|
| 1980 |
+
if (bothPodcastSamplesPlayed && !podcastVoteButtons[1].disabled) {
|
| 1981 |
+
handlePodcastVote('b');
|
| 1982 |
+
} else if (!bothPodcastSamplesPlayed) {
|
| 1983 |
+
openToast("Please listen to both audio samples before voting", "info");
|
| 1984 |
}
|
| 1985 |
}
|
| 1986 |
}
|
| 1987 |
+
|
| 1988 |
+
// Next Round shortcut (only when next round button is visible)
|
| 1989 |
+
else if (isPodcastNextRoundVisible && e.key.toLowerCase() === 'n') {
|
| 1990 |
+
if (!e.ctrlKey && !e.metaKey) {
|
| 1991 |
+
e.preventDefault();
|
| 1992 |
+
}
|
| 1993 |
+
resetPodcastState();
|
| 1994 |
+
}
|
| 1995 |
});
|
| 1996 |
|
| 1997 |
// Event listeners
|