Fix Match: Progress bar + counter, audio on EN column too
- Progress bar under header (fills as pairs are matched) - Counter with symbols: ✓ first-try, ↻ retry, ✗ errors - EN column now also has audio buttons (small speaker icon) - All 3 columns have consistent height (flex layout) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -140,12 +140,19 @@ export default function MatchPage() {
|
|||||||
{t('back')}
|
{t('back')}
|
||||||
</button>
|
</button>
|
||||||
<h1 className={`text-lg font-bold ${isDark ? 'text-white' : 'text-slate-900'}`}>{t('match')}</h1>
|
<h1 className={`text-lg font-bold ${isDark ? 'text-white' : 'text-slate-900'}`}>{t('match')}</h1>
|
||||||
<div className={`text-sm ${isDark ? 'text-white/50' : 'text-slate-500'}`}>
|
<div className={`text-xs ${isDark ? 'text-white/50' : 'text-slate-500'}`}>
|
||||||
{matchedTotal}/{totalPairs} · <span className="text-green-400">{firstTryCorrect}</span>/<span className="text-yellow-400">{retryCorrect}</span>/<span className="text-red-400">{errors}</span>
|
<span className="text-green-400">✓{firstTryCorrect}</span>{' '}
|
||||||
|
<span className="text-yellow-400">↻{retryCorrect}</span>{' '}
|
||||||
|
<span className="text-red-400">✗{errors}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Progress bar */}
|
||||||
|
<div className="w-full h-1.5 bg-white/10">
|
||||||
|
<div className="h-full bg-gradient-to-r from-indigo-500 to-violet-500 transition-all" style={{ width: `${(matchedTotal / Math.max(totalPairs, 1)) * 100}%` }} />
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Native flash overlay */}
|
{/* Native flash overlay */}
|
||||||
{flashNative && (
|
{flashNative && (
|
||||||
<div className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 pointer-events-none">
|
<div className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 pointer-events-none">
|
||||||
@@ -199,20 +206,27 @@ export default function MatchPage() {
|
|||||||
{/* Left: English (click to select, no sound) */}
|
{/* Left: English (click to select, no sound) */}
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
{roundItems.map(item => (
|
{roundItems.map(item => (
|
||||||
<button
|
<div
|
||||||
key={`l-${item.id}`}
|
key={`l-${item.id}`}
|
||||||
onClick={() => handleLeftTap(item)}
|
className={`flex items-center gap-2 p-3 rounded-xl border-2 text-sm font-medium transition-all ${
|
||||||
disabled={matched.has(item.id)}
|
|
||||||
className={`w-full p-3 rounded-xl border-2 text-sm font-medium transition-all text-left ${
|
|
||||||
matched.has(item.id)
|
matched.has(item.id)
|
||||||
? 'opacity-30 border-green-400 bg-green-500/10 cursor-default'
|
? 'opacity-30 border-green-400 bg-green-500/10'
|
||||||
: selectedLeft === item.id
|
: selectedLeft === item.id
|
||||||
? (isDark ? 'border-blue-400 bg-blue-500/20 text-white' : 'border-blue-500 bg-blue-50 text-blue-900')
|
? (isDark ? 'border-blue-400 bg-blue-500/20 text-white' : 'border-blue-500 bg-blue-50 text-blue-900')
|
||||||
: (isDark ? 'border-white/20 bg-white/5 text-white hover:bg-white/10' : 'border-slate-200 bg-white text-slate-900 hover:bg-slate-50')
|
: (isDark ? 'border-white/20 bg-white/5 text-white' : 'border-slate-200 bg-white text-slate-900')
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{item.question}
|
<button
|
||||||
</button>
|
onClick={() => handleLeftTap(item)}
|
||||||
|
disabled={matched.has(item.id)}
|
||||||
|
className="flex-1 text-left hover:opacity-80"
|
||||||
|
>
|
||||||
|
{item.question}
|
||||||
|
</button>
|
||||||
|
{!matched.has(item.id) && (
|
||||||
|
<AudioButton text={item.question} lang="en" isDark={isDark} size="sm" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user