Spaces:
Sleeping
Sleeping
File size: 1,374 Bytes
005f181 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import React from 'react';
// Fix #4: Memoized grid cell — only re-renders when its own visual state changes
const GridCell = React.memo(({ cellClass, isObstacle, isHighCost, isStart, isEnd, tooltipContent }) => {
const inner = (
<div
className={`w-6 h-6 sm:w-8 sm:h-8 md:w-10 md:h-10 rounded-md border flex items-center justify-center text-[10px] font-mono transition-all duration-300 ${cellClass}`}
role="gridcell"
>
{isObstacle && !isStart && !isEnd && (
<div className="w-1.5 h-1.5 rounded-full bg-slate-700" />
)}
{isHighCost && !isStart && !isEnd && (
<div className="w-1 h-1 rounded-full bg-slate-800/50" />
)}
</div>
);
if (!tooltipContent) return inner;
return (
<div className="group relative flex flex-col items-center">
{inner}
<div className="absolute bottom-full mb-2 hidden flex-col items-center group-hover:flex z-50 pointer-events-none">
<div className="relative z-10 p-2 text-xs leading-none text-slate-200 whitespace-nowrap bg-slate-800 border border-slate-700 shadow-xl rounded-md flex flex-col gap-1 min-w-[120px]">
{tooltipContent}
</div>
<div className="w-3 h-3 -mt-2 rotate-45 bg-slate-800 border-r border-b border-slate-700" />
</div>
</div>
);
});
GridCell.displayName = 'GridCell';
export default GridCell;
|