chessground
Version:
lichess.org chess ui
188 lines (144 loc) • 5.11 kB
text/typescript
import { State } from './state.js';
import * as board from './board.js';
import { write as fenWrite } from './fen.js';
import { Config, configure, applyAnimation } from './config.js';
import { anim, render } from './anim.js';
import { cancel as dragCancel, dragNewPiece } from './drag.js';
import { DrawShape } from './draw.js';
import { explosion } from './explosion.js';
import * as cg from './types.js';
export interface Api {
// reconfigure the instance. Accepts all config options, except for viewOnly & drawable.visible.
// board will be animated accordingly, if animations are enabled.
set(config: Config): void;
// read chessground state; write at your own risks.
state: State;
// get the position as a FEN string (only contains pieces, no flags)
// e.g. rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
getFen(): cg.FEN;
// change the view angle
toggleOrientation(): void;
// perform a move programmatically
move(orig: cg.Key, dest: cg.Key): void;
// add and/or remove arbitrary pieces on the board
setPieces(pieces: cg.PiecesDiff): void;
// click a square programmatically
selectSquare(key: cg.Key | null, force?: boolean): void;
// put a new piece on the board
newPiece(piece: cg.Piece, key: cg.Key): void;
// play the current premove, if any; returns true if premove was played
playPremove(): boolean;
// cancel the current premove, if any
cancelPremove(): void;
// play the current predrop, if any; returns true if premove was played
playPredrop(validate: (drop: cg.Drop) => boolean): boolean;
// cancel the current predrop, if any
cancelPredrop(): void;
// cancel the current move being made
cancelMove(): void;
// cancel current move and prevent further ones
stop(): void;
// make squares explode (atomic chess)
explode(keys: cg.Key[]): void;
// programmatically draw user shapes
setShapes(shapes: DrawShape[]): void;
// programmatically draw auto shapes
setAutoShapes(shapes: DrawShape[]): void;
// square name at this DOM position (like "e4")
getKeyAtDomPos(pos: cg.NumberPair): cg.Key | undefined;
// only useful when CSS changes the board width/height ratio (for 3D)
redrawAll: cg.Redraw;
// for crazyhouse and board editors
dragNewPiece(piece: cg.Piece, event: cg.MouchEvent, force?: boolean): void;
// unbinds all events
// (important for document-wide events like scroll and mousemove)
destroy: cg.Unbind;
}
// see API types and documentations in dts/api.d.ts
export function start(state: State, redrawAll: cg.Redraw): Api {
function toggleOrientation(): void {
board.toggleOrientation(state);
redrawAll();
}
return {
set(config): void {
if (config.orientation && config.orientation !== state.orientation) toggleOrientation();
applyAnimation(state, config);
(config.fen ? anim : render)(state => configure(state, config), state);
},
state,
getFen: () => fenWrite(state.pieces),
toggleOrientation,
setPieces(pieces): void {
anim(state => board.setPieces(state, pieces), state);
},
selectSquare(key, force): void {
if (key) anim(state => board.selectSquare(state, key, force), state);
else if (state.selected) {
board.unselect(state);
state.dom.redraw();
}
},
move(orig, dest): void {
anim(state => board.baseMove(state, orig, dest), state);
},
newPiece(piece, key): void {
anim(state => board.baseNewPiece(state, piece, key), state);
},
playPremove(): boolean {
if (state.premovable.current) {
if (anim(board.playPremove, state)) return true;
// if the premove couldn't be played, redraw to clear it up
state.dom.redraw();
}
return false;
},
playPredrop(validate): boolean {
if (state.predroppable.current) {
const result = board.playPredrop(state, validate);
state.dom.redraw();
return result;
}
return false;
},
cancelPremove(): void {
render(board.unsetPremove, state);
},
cancelPredrop(): void {
render(board.unsetPredrop, state);
},
cancelMove(): void {
render(state => {
board.cancelMove(state);
dragCancel(state);
}, state);
},
stop(): void {
render(state => {
board.stop(state);
dragCancel(state);
}, state);
},
explode(keys: cg.Key[]): void {
explosion(state, keys);
},
setAutoShapes(shapes: DrawShape[]): void {
render(state => (state.drawable.autoShapes = shapes), state);
},
setShapes(shapes: DrawShape[]): void {
render(state => (state.drawable.shapes = shapes), state);
},
getKeyAtDomPos(pos): cg.Key | undefined {
return board.getKeyAtDomPos(pos, board.whitePov(state), state.dom.bounds());
},
redrawAll,
dragNewPiece(piece, event, force): void {
dragNewPiece(state, piece, event, force);
},
destroy(): void {
board.stop(state);
state.dom.unbind && state.dom.unbind();
state.dom.destroyed = true;
},
};
}