激动
平静
亲近
疏离
{ event.preventDefault(); event.currentTarget.setPointerCapture(event.pointerId); setDragging(true); update(event); }}
onPointerMove={(event) => { if (dragging) update(event); }}
onPointerUp={(event) => { setDragging(false); setPointer(null); event.currentTarget.releasePointerCapture(event.pointerId); }}
onPointerCancel={() => { setDragging(false); setPointer(null); }}
onKeyDown={(event) => {
const column = Math.max(0, Math.min(4, selectedColumn + (event.key === "ArrowRight" ? 1 : event.key === "ArrowLeft" ? -1 : 0)));
const row = Math.max(0, Math.min(4, selectedRow + (event.key === "ArrowDown" ? 1 : event.key === "ArrowUp" ? -1 : 0)));
if (column !== selectedColumn || row !== selectedRow) { event.preventDefault(); onChange(canvasEmotionPresets[row * 5 + column]); }
}}
>
{canvasEmotionPresets.map((item, index) => {
const column = index % 5;
const row = Math.floor(index / 5);
const active = item.id === preset.id;
const onPath = !dragging && (column === selectedColumn || row === selectedRow);
const distance = pointer ? Math.hypot(pointer.x - column, pointer.y - row) : 4;
const proximity = dragging ? Math.max(0, 1 - distance / 1.7) : 0;
return (
);
})}
{dragging && pointer ? : null}
);
}
function EmotionHeadPreview({ preset }: { preset: CanvasEmotionPreset }) {
const theme = canvasThemes[useActiveTheme()];
return (