"use client"; import { useState, useEffect, useMemo, useCallback } from "react"; import { PatchesPuzzle, Region } from "@/lib/generators/patches"; import { createRng, shuffle } from "@/lib/rng"; import WinBanner from "./WinBanner"; interface Props { puzzle: PatchesPuzzle; date: string; onSolve?: (elapsed: number) => void; } const STORAGE_KEY = (d: string) => `patches-${d}`; /** Canonical key for shape comparison: sorted "r,c" list. */ function shapeKey(cells: [number, number][]): string { return cells .map(([r, c]) => `${r},${c}`) .sort() .join("|"); } /** Mini polyomino preview rendered as a small grid. */ function ShapePreview({ relCells, previewRows, previewCols, color, cellPx, faded, }: { relCells: [number, number][]; previewRows: number; previewCols: number; color: string; cellPx: number; faded?: boolean; }) { const filled = new Set(relCells.map(([r, c]) => `${r},${c}`)); return (