Compare commits
2 Commits
5f7ce36845
...
6086cd51c1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6086cd51c1 | ||
|
|
35769959f4 |
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "twitch-vod-manager",
|
"name": "twitch-vod-manager",
|
||||||
"version": "4.6.49",
|
"version": "4.6.50",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "twitch-vod-manager",
|
"name": "twitch-vod-manager",
|
||||||
"version": "4.6.49",
|
"version": "4.6.50",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.6.0",
|
"axios": "^1.6.0",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "twitch-vod-manager",
|
"name": "twitch-vod-manager",
|
||||||
"version": "4.6.49",
|
"version": "4.6.50",
|
||||||
"description": "Twitch VOD Manager - Download Twitch VODs easily",
|
"description": "Twitch VOD Manager - Download Twitch VODs easily",
|
||||||
"main": "dist/main.js",
|
"main": "dist/main.js",
|
||||||
"author": "xRangerDE",
|
"author": "xRangerDE",
|
||||||
|
|||||||
@ -356,7 +356,8 @@ const UI_TEXT_DE = {
|
|||||||
autoRecordScanEmpty: 'Manueller Scan: kein Streamer ist gerade live.',
|
autoRecordScanEmpty: 'Manueller Scan: kein Streamer ist gerade live.',
|
||||||
liveNowTooltip: 'Aktuell live auf Twitch',
|
liveNowTooltip: 'Aktuell live auf Twitch',
|
||||||
modalCloseAria: 'Dialog schliessen',
|
modalCloseAria: 'Dialog schliessen',
|
||||||
sidebarEmpty: 'Noch keine Streamer. Fuege oben rechts einen hinzu.'
|
sidebarEmpty: 'Noch keine Streamer. Fuege oben rechts einen hinzu.',
|
||||||
|
removeAria: 'Entfernen'
|
||||||
},
|
},
|
||||||
vods: {
|
vods: {
|
||||||
noneTitle: 'Keine VODs',
|
noneTitle: 'Keine VODs',
|
||||||
|
|||||||
@ -356,7 +356,8 @@ const UI_TEXT_EN = {
|
|||||||
autoRecordScanEmpty: 'Manual scan: no streamers currently live.',
|
autoRecordScanEmpty: 'Manual scan: no streamers currently live.',
|
||||||
liveNowTooltip: 'Currently live on Twitch',
|
liveNowTooltip: 'Currently live on Twitch',
|
||||||
modalCloseAria: 'Close dialog',
|
modalCloseAria: 'Close dialog',
|
||||||
sidebarEmpty: 'No streamers yet. Add one via the input at the top right.'
|
sidebarEmpty: 'No streamers yet. Add one via the input at the top right.',
|
||||||
|
removeAria: 'Remove'
|
||||||
},
|
},
|
||||||
vods: {
|
vods: {
|
||||||
noneTitle: 'No VODs',
|
noneTitle: 'No VODs',
|
||||||
|
|||||||
@ -572,7 +572,7 @@ function renderQueue(): void {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
${item.status === 'error' ? `<button class="queue-retry-btn" title="${escapeHtml(UI_TEXT.queue.retryItem)}" onclick="retryQueueItem('${item.id}')">↻</button>` : ''}
|
${item.status === 'error' ? `<button class="queue-retry-btn" title="${escapeHtml(UI_TEXT.queue.retryItem)}" onclick="retryQueueItem('${item.id}')">↻</button>` : ''}
|
||||||
<span class="remove" onclick="removeFromQueue('${item.id}')">x</span>
|
<span class="remove" role="button" tabindex="0" aria-label="${escapeHtml(UI_TEXT.streamers.removeAria)}" onclick="removeFromQueue('${item.id}')" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();removeFromQueue('${item.id}');}">x</span>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}).join('');
|
}).join('');
|
||||||
|
|||||||
@ -525,10 +525,20 @@ function renderStreamers(): void {
|
|||||||
const removeSpan = document.createElement('span');
|
const removeSpan = document.createElement('span');
|
||||||
removeSpan.className = 'remove';
|
removeSpan.className = 'remove';
|
||||||
removeSpan.textContent = 'x';
|
removeSpan.textContent = 'x';
|
||||||
|
removeSpan.setAttribute('role', 'button');
|
||||||
|
removeSpan.setAttribute('tabindex', '0');
|
||||||
|
removeSpan.setAttribute('aria-label', UI_TEXT.streamers.removeAria);
|
||||||
removeSpan.addEventListener('click', (e) => {
|
removeSpan.addEventListener('click', (e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
void removeStreamer(streamer);
|
void removeStreamer(streamer);
|
||||||
});
|
});
|
||||||
|
removeSpan.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
void removeStreamer(streamer);
|
||||||
|
}
|
||||||
|
});
|
||||||
item.append(nameSpan, autoBtn, vodBtn, recBtn, removeSpan);
|
item.append(nameSpan, autoBtn, vodBtn, recBtn, removeSpan);
|
||||||
|
|
||||||
item.addEventListener('click', () => {
|
item.addEventListener('click', () => {
|
||||||
|
|||||||
@ -443,10 +443,18 @@ body {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.streamer-item:hover .remove {
|
.streamer-item:hover .remove,
|
||||||
|
.streamer-item .remove:focus-visible {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.streamer-item .remove:focus-visible,
|
||||||
|
.queue-item .remove:focus-visible {
|
||||||
|
outline: none;
|
||||||
|
box-shadow: 0 0 0 2px rgba(255, 70, 70, 0.5);
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Live-dot — red pulsing indicator shown next to a streamer's name in
|
/* Live-dot — red pulsing indicator shown next to a streamer's name in
|
||||||
the sidebar when they are currently broadcasting on Twitch. */
|
the sidebar when they are currently broadcasting on Twitch. */
|
||||||
.streamer-live-dot {
|
.streamer-live-dot {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user