feat(ui): modified-piece indicator on board

This commit is contained in:
Joey Yakimowich-Payne 2026-04-19 09:16:07 -06:00
commit d555232696
No known key found for this signature in database
2 changed files with 53 additions and 22 deletions

View file

@ -13,6 +13,7 @@ import {
type SquareOverlayComponent, type SquareOverlayComponent,
} from './preset-overlays'; } from './preset-overlays';
import { VisualEffectLayer } from './VisualEffectLayer'; import { VisualEffectLayer } from './VisualEffectLayer';
import { ModifiedPieceIndicator } from './ModifiedPieceIndicator.js';
import '../presets/ui-overlays-index'; import '../presets/ui-overlays-index';
interface BoardProps { interface BoardProps {
@ -327,6 +328,7 @@ export function Board({ facts, legalMoves, onMove, turn, myColor, lastMove, chec
* FLIP clean. * FLIP clean.
*/} */}
{piece && ( {piece && (
<>
<div <div
key={piece.id} key={piece.id}
className="absolute inset-0 z-20" className="absolute inset-0 z-20"
@ -349,6 +351,10 @@ export function Board({ facts, legalMoves, onMove, turn, myColor, lastMove, chec
onDragEnd={handleDragEnd} onDragEnd={handleDragEnd}
/> />
</div> </div>
{engine !== undefined && (
<ModifiedPieceIndicator pieceId={piece.id} engine={engine} />
)}
</>
)} )}
{/* Rank/File labels (optional but helpful for debug) */} {/* Rank/File labels (optional but helpful for debug) */}

View file

@ -0,0 +1,25 @@
import { MODIFIER_REGISTRY } from '../modifiers/registry';
import type { ChessEngine } from '../engine';
import type { EntityId } from '@paratype/rete';
interface Props {
pieceId: number;
engine: ChessEngine;
}
export function ModifiedPieceIndicator({ pieceId, engine }: Props) {
const isModified = MODIFIER_REGISTRY.list().some((descriptor) => {
return engine.session.get(pieceId as unknown as EntityId, descriptor.attrName) !== undefined;
});
if (!isModified) {
return null;
}
return (
<div
data-testid={`modifier-indicator-${pieceId}`}
className="absolute top-1 right-1 w-2 h-2 bg-fuchsia-500 rounded-full ring-1 ring-white shadow-sm pointer-events-none z-30"
/>
);
}