chessgroundxx
Version:
lichess.org chess ui
123 lines (106 loc) • 3.28 kB
text/typescript
import { HeadlessState } from "./state.js";
import { setVisible, createEl } from "./util.js";
import { colors, files, ranks, Elements } from "./types.js";
import {
createElement as createSVG,
setAttributes,
createDefs,
} from "./svg.js";
export function renderWrap(element: HTMLElement, s: HeadlessState): Elements {
// .cg-wrap (element passed to Chessground)
// cg-container
// cg-board
// svg.cg-shapes
// defs
// g
// svg.cg-custom-svgs
// g
// cg-auto-pieces
// coords.ranks
// coords.files
// piece.ghost
element.innerHTML = "";
// ensure the cg-wrap class is set
// so bounds calculation can use the CSS width/height values
// add that class yourself to the element before calling chessground
// for a slight performance improvement! (avoids recomputing style)
element.classList.add("cg-wrap");
for (const c of colors)
element.classList.toggle("orientation-" + c, s.orientation === c);
element.classList.toggle("manipulable", !s.viewOnly);
const container = createEl("cg-container");
element.appendChild(container);
const board = createEl("cg-board");
container.appendChild(board);
let svg: SVGElement | undefined;
let customSvg: SVGElement | undefined;
let autoPieces: HTMLElement | undefined;
if (s.drawable.visible) {
svg = setAttributes(createSVG("svg"), {
class: "cg-shapes",
viewBox: "-4.5 -5 9 10",
preserveAspectRatio: "xMidYMid slice",
});
svg.appendChild(createDefs());
svg.appendChild(createSVG("g"));
customSvg = setAttributes(createSVG("svg"), {
class: "cg-custom-svgs",
viewBox: "-4 -4.5 9 10",
preserveAspectRatio: "xMidYMid slice",
});
customSvg.appendChild(createSVG("g"));
autoPieces = createEl("cg-auto-pieces");
container.appendChild(svg);
container.appendChild(customSvg);
container.appendChild(autoPieces);
}
if (s.coordinates) {
const orientClass = s.orientation === "black" ? " black" : "";
const ranksPositionClass = s.ranksPosition === "left" ? " left" : "";
if (s.coordinatesOnSquares) {
const rankN: (i: number) => number =
s.orientation === "white" ? (i) => i + 1 : (i) => 8 - i;
files.forEach((f, i) =>
container.appendChild(
renderCoords(
ranks.map((r) => f + r),
"squares rank" + rankN(i) + orientClass + ranksPositionClass
)
)
);
} else {
container.appendChild(
renderCoords(ranks, "ranks" + orientClass + ranksPositionClass)
);
container.appendChild(renderCoords(files, "files" + orientClass));
}
}
let ghost: HTMLElement | undefined;
if (s.draggable.enabled && s.draggable.showGhost) {
ghost = createEl("piece", "ghost");
setVisible(ghost, false);
container.appendChild(ghost);
}
return {
board,
container,
wrap: element,
ghost,
svg,
customSvg,
autoPieces,
};
}
function renderCoords(
elems: readonly string[],
className: string
): HTMLElement {
const el = createEl("coords", className);
let f: HTMLElement;
for (const elem of elems) {
f = createEl("coord");
f.textContent = elem;
el.appendChild(f);
}
return el;
}