solve heatmap
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { useStore } from '../store'
|
||||
|
||||
export default function SolveHeatmap() {
|
||||
const { t } = useTranslation()
|
||||
const puzzle = useStore((s) => s.puzzle)
|
||||
const cellStatus = useStore((s) => s.cellStatus)
|
||||
const cellEverWrong = useStore((s) => s.cellEverWrong)
|
||||
|
||||
if (!puzzle) return null
|
||||
|
||||
const size = Math.min(200, window.innerWidth - 40)
|
||||
const cellW = size / puzzle.width
|
||||
const cellH = size / puzzle.height
|
||||
|
||||
function cellColor(r: number, c: number): string {
|
||||
if (puzzle!.cells[r][c] === 'black') return 'var(--cell-black, #1a1a2e)'
|
||||
if (cellStatus[r]?.[c] === 'revealed') return 'var(--heatmap-hint, #f59e0b)'
|
||||
if (cellEverWrong[r]?.[c]) return 'var(--heatmap-wrong, #ef4444)'
|
||||
return 'var(--heatmap-clean, #22c55e)'
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="solve-heatmap">
|
||||
<h4 className="solve-heatmap-title">{t('heatmap.title')}</h4>
|
||||
<svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} className="solve-heatmap-grid">
|
||||
{Array.from({ length: puzzle.height }, (_, r) =>
|
||||
Array.from({ length: puzzle.width }, (_, c) => (
|
||||
<rect key={`${r}-${c}`}
|
||||
x={c * cellW} y={r * cellH}
|
||||
width={cellW - 1} height={cellH - 1}
|
||||
rx={1}
|
||||
fill={cellColor(r, c)}
|
||||
/>
|
||||
))
|
||||
)}
|
||||
</svg>
|
||||
<div className="solve-heatmap-legend">
|
||||
<span><span className="heatmap-dot" style={{ background: 'var(--heatmap-clean, #22c55e)' }} /> {t('heatmap.clean')}</span>
|
||||
<span><span className="heatmap-dot" style={{ background: 'var(--heatmap-hint, #f59e0b)' }} /> {t('heatmap.hinted')}</span>
|
||||
<span><span className="heatmap-dot" style={{ background: 'var(--heatmap-wrong, #ef4444)' }} /> {t('heatmap.wrong')}</span>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user