Fix L46/L71/L74: unify yt-dlp missing message, editable dir inputs, swatch a11y

L46: Introduced YTDLP_MISSING_MSG constant in binaries.ts. All four callers
     (download, indexer, probe, ytdlp) now emit the same user-facing string:
     "yt-dlp.exe is missing. Open Settings -> Software update to re-download it."
     This removes newline-embedded messages and four divergent phrasings.

L71: Removed readOnly from videoDir/audioDir folder inputs in SettingsView.
     Added onChange handler so users can paste or type a path directly without
     being forced to use the Browse button. The path still flows through
     applySettings() in main, which validates it.

L74: Accent color swatches were triple-labeled (aria-pressed + aria-label +
     title). Replaced with a single aria-label that embeds "(selected)" state,
     plus title for the hover tooltip. Removed the incorrect aria-pressed
     (these are selection buttons, not toggles).

typecheck + 242 tests green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 14:27:02 -04:00
parent b035a88873
commit 3ae4a5357c
7 changed files with 20 additions and 16 deletions
+3 -4
View File
@@ -485,11 +485,11 @@ export function SettingsView(): React.JSX.Element {
>
<div className={styles.folderRow}>
<Input
readOnly
className={styles.folderInput}
value={videoDir}
placeholder="Documents\Video (default)"
contentBefore={<FolderRegular />}
onChange={(_, d) => update({ videoDir: d.value })}
/>
<Button icon={<FolderRegular />} onClick={() => chooseDir('videoDir')}>
Browse
@@ -508,11 +508,11 @@ export function SettingsView(): React.JSX.Element {
>
<div className={styles.folderRow}>
<Input
readOnly
className={styles.folderInput}
value={audioDir}
placeholder="Documents\Audio (default)"
contentBefore={<FolderRegular />}
onChange={(_, d) => update({ audioDir: d.value })}
/>
<Button icon={<FolderRegular />} onClick={() => chooseDir('audioDir')}>
Browse
@@ -625,8 +625,7 @@ export function SettingsView(): React.JSX.Element {
)}
style={{ backgroundColor: opt.swatch }}
onClick={() => update({ accentColor: opt.value as AccentColor })}
aria-pressed={accentColor === opt.value}
aria-label={opt.label}
aria-label={`${opt.label}${accentColor === opt.value ? ' (selected)' : ''}`}
title={opt.label}
/>
))}