@mirasen/chessboard 0.1.0 → 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +224 -47
- package/dist/animation/planner.d.ts +11 -6
- package/dist/animation/planner.js +167 -48
- package/dist/animation/render/fade.d.ts +5 -5
- package/dist/animation/render/fade.js +4 -4
- package/dist/animation/render/move.d.ts +6 -6
- package/dist/animation/render/move.js +6 -6
- package/dist/animation/render/plan.d.ts +6 -6
- package/dist/animation/render/plan.js +3 -3
- package/dist/animation/render/static.d.ts +5 -5
- package/dist/animation/render/static.js +4 -4
- package/dist/animation/render/types.d.ts +1 -1
- package/dist/animation/types.d.ts +15 -16
- package/dist/animation/types.js +1 -6
- package/dist/extensions/animation/factory.d.ts +1 -1
- package/dist/extensions/animation/factory.js +1 -1
- package/dist/extensions/animation/types.d.ts +1 -1
- package/dist/extensions/factory/main.d.ts +1 -1
- package/dist/extensions/factory/main.js +27 -6
- package/dist/extensions/factory/runtime.d.ts +6 -5
- package/dist/extensions/factory/runtime.js +48 -4
- package/dist/extensions/first-party/active-target/factory.d.ts +1 -1
- package/dist/extensions/first-party/active-target/factory.js +9 -9
- package/dist/extensions/first-party/active-target/types.d.ts +2 -2
- package/dist/extensions/first-party/auto-promote/factory.d.ts +2 -0
- package/dist/extensions/first-party/auto-promote/factory.js +51 -0
- package/dist/extensions/first-party/auto-promote/types.d.ts +14 -0
- package/dist/extensions/first-party/auto-promote/types.js +2 -0
- package/dist/extensions/first-party/board-events/factory.d.ts +1 -1
- package/dist/extensions/first-party/board-events/factory.js +3 -16
- package/dist/extensions/first-party/board-events/types.d.ts +6 -7
- package/dist/extensions/first-party/common/helpers.d.ts +2 -2
- package/dist/extensions/first-party/common/helpers.js +1 -1
- package/dist/extensions/first-party/common/types.d.ts +1 -1
- package/dist/extensions/first-party/last-move/factory.d.ts +1 -1
- package/dist/extensions/first-party/last-move/factory.js +10 -10
- package/dist/extensions/first-party/last-move/types.d.ts +2 -2
- package/dist/extensions/first-party/legal-moves/factory.d.ts +1 -1
- package/dist/extensions/first-party/legal-moves/factory.js +7 -7
- package/dist/extensions/first-party/legal-moves/types.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/animation/factory.d.ts +3 -3
- package/dist/extensions/first-party/main-renderer/animation/factory.js +3 -3
- package/dist/extensions/first-party/main-renderer/animation/render.d.ts +3 -3
- package/dist/extensions/first-party/main-renderer/animation/render.js +2 -3
- package/dist/extensions/first-party/main-renderer/animation/types.d.ts +7 -7
- package/dist/extensions/first-party/main-renderer/animation/update.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/animation/update.js +12 -26
- package/dist/extensions/first-party/main-renderer/board/factory.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/board/factory.js +2 -2
- package/dist/extensions/first-party/main-renderer/board/render.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/board/render.js +6 -6
- package/dist/extensions/first-party/main-renderer/board/types.d.ts +3 -3
- package/dist/extensions/first-party/main-renderer/board/update.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/board/update.js +8 -6
- package/dist/extensions/first-party/main-renderer/coordinates/factory.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/coordinates/factory.js +1 -1
- package/dist/extensions/first-party/main-renderer/coordinates/render.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/coordinates/render.js +7 -7
- package/dist/extensions/first-party/main-renderer/coordinates/types.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/drag/factory.d.ts +3 -3
- package/dist/extensions/first-party/main-renderer/drag/factory.js +2 -2
- package/dist/extensions/first-party/main-renderer/drag/render.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/drag/render.js +2 -2
- package/dist/extensions/first-party/main-renderer/drag/types.d.ts +4 -4
- package/dist/extensions/first-party/main-renderer/drag/update.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/drag/update.js +1 -1
- package/dist/extensions/first-party/main-renderer/factory.d.ts +1 -1
- package/dist/extensions/first-party/main-renderer/factory.js +9 -9
- package/dist/extensions/first-party/main-renderer/normalize.d.ts +2 -3
- package/dist/extensions/first-party/main-renderer/normalize.js +4 -4
- package/dist/extensions/first-party/main-renderer/pieces/factory.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/pieces/factory.js +2 -2
- package/dist/extensions/first-party/main-renderer/pieces/render.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/pieces/render.js +9 -9
- package/dist/extensions/first-party/main-renderer/pieces/suppress.d.ts +4 -4
- package/dist/extensions/first-party/main-renderer/pieces/suppress.js +7 -2
- package/dist/extensions/first-party/main-renderer/pieces/types.d.ts +5 -5
- package/dist/extensions/first-party/main-renderer/pieces/update.d.ts +4 -4
- package/dist/extensions/first-party/main-renderer/pieces/update.js +5 -5
- package/dist/extensions/first-party/main-renderer/types/extension.d.ts +3 -3
- package/dist/extensions/first-party/main-renderer/types/extension.js +1 -1
- package/dist/extensions/first-party/main-renderer/types/input.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/types/instance.d.ts +8 -8
- package/dist/extensions/first-party/main-renderer/types/internal.d.ts +2 -2
- package/dist/extensions/first-party/main-renderer/types/template.d.ts +1 -1
- package/dist/extensions/first-party/promotion/factory.d.ts +3 -0
- package/dist/extensions/first-party/promotion/factory.js +219 -0
- package/dist/extensions/first-party/promotion/normalize.d.ts +3 -0
- package/dist/extensions/first-party/promotion/normalize.js +37 -0
- package/dist/extensions/first-party/promotion/types/input.d.ts +10 -0
- package/dist/extensions/first-party/promotion/types/internal.d.ts +12 -0
- package/dist/extensions/first-party/promotion/types/internal.js +22 -0
- package/dist/extensions/first-party/promotion/types/main.d.ts +24 -0
- package/dist/extensions/first-party/promotion/types/main.js +2 -0
- package/dist/extensions/first-party/selected-square/factory.d.ts +1 -1
- package/dist/extensions/first-party/selected-square/factory.js +7 -7
- package/dist/extensions/first-party/selected-square/types.d.ts +2 -2
- package/dist/extensions/index.d.ts +8 -8
- package/dist/extensions/index.js +6 -6
- package/dist/extensions/invalidation/factory.d.ts +1 -1
- package/dist/extensions/types/basic/events.d.ts +10 -33
- package/dist/extensions/types/basic/events.js +9 -5
- package/dist/extensions/types/basic/interaction.d.ts +21 -0
- package/dist/extensions/types/basic/render.d.ts +2 -2
- package/dist/extensions/types/basic/transient-visuals.d.ts +3 -2
- package/dist/extensions/types/basic/update.d.ts +3 -3
- package/dist/extensions/types/context/animation.d.ts +3 -3
- package/dist/extensions/types/context/events.d.ts +5 -0
- package/dist/extensions/types/context/events.js +1 -0
- package/dist/extensions/types/context/render.d.ts +2 -2
- package/dist/extensions/types/context/transient-visuals.d.ts +2 -2
- package/dist/extensions/types/context/ui-move.d.ts +3 -15
- package/dist/extensions/types/context/update.d.ts +4 -4
- package/dist/extensions/types/context/update.js +1 -1
- package/dist/extensions/types/extension.d.ts +16 -14
- package/dist/extensions/types/main.d.ts +16 -11
- package/dist/extensions/types/surface/commands.d.ts +14 -5
- package/dist/extensions/types/surface/events.d.ts +2 -3
- package/dist/extensions/types/surface/main.d.ts +4 -4
- package/dist/extensions/types/wrapper.d.ts +23 -22
- package/dist/extensions/types/wrapper.js +34 -6
- package/dist/extensions/update.d.ts +3 -3
- package/dist/extensions/update.js +2 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/layout/factory.d.ts +1 -1
- package/dist/layout/factory.js +4 -4
- package/dist/layout/geometry/factory.d.ts +3 -12
- package/dist/layout/geometry/factory.js +17 -18
- package/dist/layout/geometry/helpers.d.ts +5 -0
- package/dist/layout/geometry/helpers.js +33 -0
- package/dist/layout/geometry/types.d.ts +14 -13
- package/dist/layout/helpers.d.ts +3 -4
- package/dist/layout/helpers.js +5 -5
- package/dist/layout/mutation.d.ts +1 -1
- package/dist/layout/reducers.d.ts +1 -1
- package/dist/layout/reducers.js +10 -9
- package/dist/layout/types.d.ts +7 -7
- package/dist/mutation/pipeline.d.ts +1 -1
- package/dist/mutation/pipeline.js +1 -1
- package/dist/mutation/session.d.ts +1 -1
- package/dist/render/factory.d.ts +1 -1
- package/dist/render/factory.js +7 -7
- package/dist/render/mount.d.ts +1 -1
- package/dist/render/mount.js +4 -4
- package/dist/render/rendering/animation.d.ts +1 -1
- package/dist/render/rendering/animation.js +1 -1
- package/dist/render/rendering/helpers.d.ts +1 -1
- package/dist/render/rendering/state.d.ts +2 -2
- package/dist/render/rendering/state.js +9 -9
- package/dist/render/rendering/visuals.d.ts +2 -2
- package/dist/render/rendering/visuals.js +1 -1
- package/dist/render/scheduler/scheduler.d.ts +1 -1
- package/dist/render/svg/factory.d.ts +2 -2
- package/dist/render/svg/factory.js +1 -1
- package/dist/render/svg/helpers.d.ts +1 -1
- package/dist/render/svg/helpers.js +1 -1
- package/dist/render/types.d.ts +5 -5
- package/dist/runtime/factory/events.d.ts +3 -0
- package/dist/runtime/factory/events.js +18 -0
- package/dist/runtime/factory/helpers.d.ts +2 -2
- package/dist/runtime/factory/helpers.js +14 -14
- package/dist/runtime/factory/input.d.ts +2 -2
- package/dist/runtime/factory/input.js +20 -13
- package/dist/runtime/factory/main.d.ts +1 -1
- package/dist/runtime/factory/main.js +56 -16
- package/dist/runtime/input/adapter/event.d.ts +3 -0
- package/dist/runtime/input/adapter/event.js +19 -0
- package/dist/runtime/input/adapter/factory.d.ts +1 -1
- package/dist/runtime/input/adapter/factory.js +19 -38
- package/dist/runtime/input/adapter/helpers.d.ts +3 -5
- package/dist/runtime/input/adapter/helpers.js +60 -12
- package/dist/runtime/input/adapter/pointer.d.ts +7 -11
- package/dist/runtime/input/adapter/pointer.js +37 -70
- package/dist/runtime/input/adapter/types.d.ts +7 -4
- package/dist/runtime/input/adapter/types.js +6 -1
- package/dist/runtime/input/controller/factory.d.ts +1 -1
- package/dist/runtime/input/controller/factory.js +13 -12
- package/dist/runtime/input/controller/helpers.d.ts +2 -2
- package/dist/runtime/input/controller/pointer.d.ts +6 -7
- package/dist/runtime/input/controller/pointer.js +39 -38
- package/dist/runtime/input/controller/transient-visuals.d.ts +3 -3
- package/dist/runtime/input/controller/transient-visuals.js +12 -5
- package/dist/runtime/input/controller/types.d.ts +8 -7
- package/dist/runtime/layout.d.ts +1 -1
- package/dist/runtime/layout.js +2 -2
- package/dist/runtime/lifecycle.d.ts +2 -2
- package/dist/runtime/lifecycle.js +8 -8
- package/dist/runtime/mutation/extension-update.d.ts +1 -1
- package/dist/runtime/mutation/factory.d.ts +1 -1
- package/dist/runtime/mutation/factory.js +6 -6
- package/dist/runtime/mutation/interaction.d.ts +1 -1
- package/dist/runtime/mutation/interaction.js +3 -7
- package/dist/runtime/mutation/invalidation.d.ts +1 -0
- package/dist/runtime/mutation/invalidation.js +1 -1
- package/dist/runtime/mutation/last-move.d.ts +1 -1
- package/dist/runtime/mutation/layout.d.ts +1 -1
- package/dist/runtime/mutation/pipeline.d.ts +6 -6
- package/dist/runtime/mutation/request-render.d.ts +1 -1
- package/dist/runtime/mutation/request-render.js +1 -1
- package/dist/runtime/mutation/run.d.ts +1 -1
- package/dist/runtime/mutation/types.d.ts +10 -8
- package/dist/runtime/types/main.d.ts +8 -6
- package/dist/state/board/check.d.ts +3 -3
- package/dist/state/board/check.js +1 -1
- package/dist/state/board/coords.d.ts +1 -1
- package/dist/state/board/denormalize.d.ts +3 -3
- package/dist/state/board/denormalize.js +4 -4
- package/dist/state/board/factory.d.ts +2 -2
- package/dist/state/board/factory.js +4 -4
- package/dist/state/board/mutation.d.ts +2 -2
- package/dist/state/board/normalize.d.ts +2 -2
- package/dist/state/board/normalize.js +2 -2
- package/dist/state/board/piece.d.ts +1 -1
- package/dist/state/board/position.d.ts +2 -2
- package/dist/state/board/position.js +2 -2
- package/dist/state/board/reducers.d.ts +2 -2
- package/dist/state/board/reducers.js +3 -3
- package/dist/state/board/types/input.d.ts +1 -1
- package/dist/state/board/types/internal.d.ts +1 -1
- package/dist/state/board/types/main.d.ts +3 -3
- package/dist/state/board/types/output.d.ts +2 -2
- package/dist/state/change/{factory.d.ts → factory/main.d.ts} +1 -1
- package/dist/state/change/{factory.js → factory/main.js} +8 -5
- package/dist/state/change/factory/ui-move.d.ts +4 -0
- package/dist/{runtime → state/change}/factory/ui-move.js +9 -9
- package/dist/state/change/helpers.d.ts +6 -4
- package/dist/state/change/helpers.js +12 -2
- package/dist/state/change/mutation.d.ts +2 -2
- package/dist/state/change/reducers.d.ts +4 -4
- package/dist/state/change/reducers.js +4 -4
- package/dist/state/change/types/main.d.ts +18 -0
- package/dist/state/change/types/main.js +1 -0
- package/dist/state/change/types/ui-move.d.ts +25 -0
- package/dist/state/change/types/ui-move.js +1 -0
- package/dist/state/factory.d.ts +1 -1
- package/dist/state/factory.js +4 -4
- package/dist/state/interaction/factory.d.ts +1 -1
- package/dist/state/interaction/factory.js +7 -5
- package/dist/state/interaction/helpers.d.ts +4 -2
- package/dist/state/interaction/helpers.js +5 -2
- package/dist/state/interaction/movability.d.ts +3 -3
- package/dist/state/interaction/movability.js +2 -2
- package/dist/state/interaction/mutation.d.ts +1 -1
- package/dist/state/interaction/normalize.d.ts +2 -2
- package/dist/state/interaction/normalize.js +2 -2
- package/dist/state/interaction/reducers.d.ts +3 -3
- package/dist/state/interaction/reducers.js +3 -3
- package/dist/state/interaction/types/input.d.ts +1 -1
- package/dist/state/interaction/types/internal.d.ts +10 -2
- package/dist/state/interaction/types/main.d.ts +4 -4
- package/dist/state/types.d.ts +6 -6
- package/dist/state/view/factory.d.ts +1 -1
- package/dist/state/view/factory.js +2 -2
- package/dist/state/view/mutation.d.ts +1 -1
- package/dist/state/view/reducers.d.ts +2 -2
- package/dist/state/view/types/internal.d.ts +1 -1
- package/dist/state/view/types/main.d.ts +4 -4
- package/dist/wrapper/factory.d.ts +2 -2
- package/dist/wrapper/factory.js +3 -27
- package/dist/wrapper/types.d.ts +4 -4
- package/package.json +9 -5
- package/dist/runtime/factory/ui-move.d.ts +0 -4
- package/dist/runtime/types/ui-move.d.ts +0 -9
- package/dist/state/change/types.d.ts +0 -17
- /package/dist/{runtime/types/ui-move.js → extensions/first-party/promotion/types/input.js} +0 -0
- /package/dist/{state/change/types.js → extensions/types/basic/interaction.js} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { setsEqual } from '../../../../helpers/util';
|
|
2
|
-
import { piecePositionsEqual } from '../../../../state/board/check';
|
|
3
|
-
import { isUpdateContextRenderable } from '../../../types/context/update';
|
|
4
|
-
import { DirtyLayer } from '../types/extension';
|
|
5
|
-
import { calculateSuppressedSquares } from './suppress';
|
|
1
|
+
import { setsEqual } from '../../../../helpers/util.js';
|
|
2
|
+
import { piecePositionsEqual } from '../../../../state/board/check.js';
|
|
3
|
+
import { isUpdateContextRenderable } from '../../../types/context/update.js';
|
|
4
|
+
import { DirtyLayer } from '../types/extension.js';
|
|
5
|
+
import { calculateSuppressedSquares } from './suppress.js';
|
|
6
6
|
export function rendererPiecesOnUpdate(state, context, animationSuppressedSquares) {
|
|
7
7
|
if (!isUpdateContextRenderable(context) ||
|
|
8
8
|
!context.mutation.hasMutation({
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ExtensionDefinition, ExtensionInstance } from '../../../types/extension';
|
|
2
|
-
import { MainRendererConfigInput } from './input';
|
|
1
|
+
import { ExtensionDefinition, ExtensionInstance } from '../../../types/extension.js';
|
|
2
|
+
import { MainRendererConfigInput } from './input.js';
|
|
3
3
|
export type MainRendererInitOptions = Partial<MainRendererConfigInput>;
|
|
4
4
|
export declare const EXTENSION_SLOTS: readonly ["board", "coordinates", "pieces", "animation", "drag"];
|
|
5
5
|
export type ExtensionSlotsType = typeof EXTENSION_SLOTS;
|
|
6
|
-
export declare const EXTENSION_ID: "
|
|
6
|
+
export declare const EXTENSION_ID: "renderer";
|
|
7
7
|
export type MainRendererDefinition = ExtensionDefinition<typeof EXTENSION_ID, typeof EXTENSION_SLOTS, never>;
|
|
8
8
|
export type MainRendererInstance = ExtensionInstance<typeof EXTENSION_ID, typeof EXTENSION_SLOTS, never>;
|
|
9
9
|
export declare enum DirtyLayer {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const EXTENSION_SLOTS = ['board', 'coordinates', 'pieces', 'animation', 'drag'];
|
|
2
|
-
export const EXTENSION_ID = '
|
|
2
|
+
export const EXTENSION_ID = 'renderer';
|
|
3
3
|
export var DirtyLayer;
|
|
4
4
|
(function (DirtyLayer) {
|
|
5
5
|
DirtyLayer[DirtyLayer["Board"] = 1] = "Board";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PieceString } from '../../../../state/board/types/input';
|
|
2
|
-
import { TMainRendererConfig } from './template';
|
|
1
|
+
import { PieceString } from '../../../../state/board/types/input.js';
|
|
2
|
+
import { TMainRendererConfig } from './template.js';
|
|
3
3
|
export type PieceUrlsInput = Record<PieceString, string>;
|
|
4
4
|
export type MainRendererConfigInput = TMainRendererConfig<PieceUrlsInput>;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { ExtensionRuntimeSurface } from '../../../types/surface/main';
|
|
2
|
-
import { ExtensionInternal } from '../../common/types';
|
|
3
|
-
import { MainRendererAnimation } from '../animation/types';
|
|
4
|
-
import { MainRendererBoard } from '../board/types';
|
|
5
|
-
import { MainRendererCoordinates } from '../coordinates/types';
|
|
6
|
-
import { MainRendererDrag } from '../drag/types';
|
|
7
|
-
import { MainRendererPieces } from '../pieces/types';
|
|
8
|
-
import { ExtensionSlotsType } from './extension';
|
|
1
|
+
import { ExtensionRuntimeSurface } from '../../../types/surface/main.js';
|
|
2
|
+
import { ExtensionInternal } from '../../common/types.js';
|
|
3
|
+
import { MainRendererAnimation } from '../animation/types.js';
|
|
4
|
+
import { MainRendererBoard } from '../board/types.js';
|
|
5
|
+
import { MainRendererCoordinates } from '../coordinates/types.js';
|
|
6
|
+
import { MainRendererDrag } from '../drag/types.js';
|
|
7
|
+
import { MainRendererPieces } from '../pieces/types.js';
|
|
8
|
+
import { ExtensionSlotsType } from './extension.js';
|
|
9
9
|
export interface MainRendererInstanceInternal extends ExtensionInternal<ExtensionSlotsType> {
|
|
10
10
|
readonly board: MainRendererBoard;
|
|
11
11
|
readonly coordinates: MainRendererCoordinates;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { NonEmptyPieceCode } from '../../../../state/board/types/internal';
|
|
2
|
-
import { TMainRendererConfig } from './template';
|
|
1
|
+
import { NonEmptyPieceCode } from '../../../../state/board/types/internal.js';
|
|
2
|
+
import { TMainRendererConfig } from './template.js';
|
|
3
3
|
export interface ConfigColorPair {
|
|
4
4
|
light: string;
|
|
5
5
|
dark: string;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import assert from '@ktarmyshov/assert';
|
|
2
|
+
import { createSvgElement, updateElementAttributes } from '../../../render/svg/helpers.js';
|
|
3
|
+
import { fileOf, rankOf, squareOf } from '../../../state/board/coords.js';
|
|
4
|
+
import { toPieceCode } from '../../../state/board/piece.js';
|
|
5
|
+
import { isUpdateContextRenderable } from '../../types/context/update.js';
|
|
6
|
+
import { extensionCreateInternalBase, extensionDestroy, extensionMount, extensionUnmount } from '../common/helpers.js';
|
|
7
|
+
import { normalizePromotionConfig } from './normalize.js';
|
|
8
|
+
import { EXTENSION_ID, EXTENSION_SLOTS } from './types/main.js';
|
|
9
|
+
export function createPromotion(config = {}) {
|
|
10
|
+
const mergedConfig = normalizePromotionConfig(config);
|
|
11
|
+
return {
|
|
12
|
+
id: EXTENSION_ID,
|
|
13
|
+
slots: EXTENSION_SLOTS,
|
|
14
|
+
createInstance(options) {
|
|
15
|
+
return createPromotionInstance(options, mergedConfig);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function createPromotionInternal(options, config) {
|
|
20
|
+
return {
|
|
21
|
+
...extensionCreateInternalBase(),
|
|
22
|
+
svgPromotionPieces: new Map(),
|
|
23
|
+
activePromotionSquares: new Map(),
|
|
24
|
+
svgHoverRect: null,
|
|
25
|
+
config,
|
|
26
|
+
runtimeSurface: options.runtimeSurface
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function extensionCleanPieceNode(state, roleCode) {
|
|
30
|
+
const pieceNode = state.svgPromotionPieces.get(roleCode);
|
|
31
|
+
if (pieceNode) {
|
|
32
|
+
pieceNode.svg.remove();
|
|
33
|
+
pieceNode.rect.remove();
|
|
34
|
+
state.svgPromotionPieces.delete(roleCode);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function extensionCleanPieceNodes(state) {
|
|
38
|
+
for (const pieceNode of state.svgPromotionPieces.values()) {
|
|
39
|
+
pieceNode.svg.remove();
|
|
40
|
+
pieceNode.rect.remove();
|
|
41
|
+
}
|
|
42
|
+
state.svgPromotionPieces.clear();
|
|
43
|
+
}
|
|
44
|
+
function extensionCleanHoverRect(state) {
|
|
45
|
+
if (state.svgHoverRect) {
|
|
46
|
+
state.svgHoverRect.remove();
|
|
47
|
+
state.svgHoverRect = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function extensionClean(state) {
|
|
51
|
+
extensionCleanPieceNodes(state);
|
|
52
|
+
extensionCleanHoverRect(state);
|
|
53
|
+
state.activePromotionSquares.clear();
|
|
54
|
+
}
|
|
55
|
+
function createPromotionInstance(options, config) {
|
|
56
|
+
const internalState = createPromotionInternal(options, config);
|
|
57
|
+
return {
|
|
58
|
+
id: EXTENSION_ID,
|
|
59
|
+
mount(env) {
|
|
60
|
+
extensionMount(internalState, env.slotRoots);
|
|
61
|
+
},
|
|
62
|
+
onUIMoveRequest(context) {
|
|
63
|
+
const request = context.request;
|
|
64
|
+
if (request.status !== 'unresolved')
|
|
65
|
+
return; // no-op if the request is already resolved or deferred
|
|
66
|
+
if (request.canBeAutoResolved)
|
|
67
|
+
return; // no-op, core will auto-resolve
|
|
68
|
+
// OK! now this one is our request!
|
|
69
|
+
request.defer(); // defer the request until the user selects a piece to promote to
|
|
70
|
+
},
|
|
71
|
+
onUpdate(context) {
|
|
72
|
+
const needsRender = context.mutation.hasMutation({
|
|
73
|
+
causes: ['state.change.setDeferredUIMoveRequest', 'layout.refreshGeometry']
|
|
74
|
+
}) && isUpdateContextRenderable(context);
|
|
75
|
+
if (!needsRender) {
|
|
76
|
+
return; // no-op
|
|
77
|
+
}
|
|
78
|
+
const request = context.currentFrame.state.change.deferredUIMoveRequest;
|
|
79
|
+
if (request !== null) {
|
|
80
|
+
internalState.runtimeSurface.transientVisuals.subscribe();
|
|
81
|
+
internalState.runtimeSurface.events.subscribeEvent('pointerdown');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
internalState.runtimeSurface.transientVisuals.unsubscribe();
|
|
85
|
+
internalState.runtimeSurface.events.unsubscribeEvent('pointerdown');
|
|
86
|
+
}
|
|
87
|
+
context.invalidation.markDirty(1 /* DirtyLayer.Promotion */);
|
|
88
|
+
},
|
|
89
|
+
render(context) {
|
|
90
|
+
assert(context.invalidation.dirtyLayers !== 0, 'Render should only be called when there are dirty layers');
|
|
91
|
+
const deferredRequest = context.currentFrame.state.change.deferredUIMoveRequest;
|
|
92
|
+
if (deferredRequest === null) {
|
|
93
|
+
// No deferred request, so we can clean up any existing promotion piece nodes and highlights
|
|
94
|
+
extensionClean(internalState);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const targetSquare = deferredRequest.destination.to;
|
|
98
|
+
const targetFile = fileOf(targetSquare);
|
|
99
|
+
const targetRank = rankOf(targetSquare);
|
|
100
|
+
const promotedTo = deferredRequest.destination.promotedTo;
|
|
101
|
+
assert(promotedTo && promotedTo.length > 1 && promotedTo.length <= 4, 'PromotedTo should be available in a deferred promotion request and have between 2 and 4 roles');
|
|
102
|
+
const promotedToSorted = promotedTo.toSorted((a, b) => b - a); // Descending order to render queen on top
|
|
103
|
+
const geometry = context.currentFrame.layout.geometry;
|
|
104
|
+
// Determine piece color from target rank
|
|
105
|
+
const isWhitePromotion = targetRank === 7;
|
|
106
|
+
const pieceColor = isWhitePromotion ? 0 /* ColorCode.White */ : 8 /* ColorCode.Black */;
|
|
107
|
+
// Direction: white pieces cascade downward (rank decreases), black upward (rank increases)
|
|
108
|
+
const rankStep = isWhitePromotion ? -1 : 1;
|
|
109
|
+
// Rebuild the active promotion squares set
|
|
110
|
+
internalState.activePromotionSquares.clear();
|
|
111
|
+
// Remove nodes for roles no longer in the desired set
|
|
112
|
+
const desiredRoles = new Set(promotedToSorted);
|
|
113
|
+
for (const [roleCode] of internalState.svgPromotionPieces) {
|
|
114
|
+
if (!desiredRoles.has(roleCode)) {
|
|
115
|
+
extensionCleanPieceNode(internalState, roleCode);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Create or update a node for each promotion role
|
|
119
|
+
assert(internalState.slotRoots, 'Slot roots should be available when render is called');
|
|
120
|
+
const layer = internalState.slotRoots.animation;
|
|
121
|
+
for (let i = 0; i < promotedToSorted.length; i++) {
|
|
122
|
+
const roleCode = promotedToSorted[i];
|
|
123
|
+
const displayRank = (targetRank + i * rankStep);
|
|
124
|
+
const displaySquare = squareOf(targetFile, displayRank);
|
|
125
|
+
const pieceCode = toPieceCode(roleCode, pieceColor);
|
|
126
|
+
const url = internalState.config.pieceUrls[pieceCode];
|
|
127
|
+
const r = geometry.getSquareRect(displaySquare);
|
|
128
|
+
const rectAttrs = {
|
|
129
|
+
x: r.x.toString(),
|
|
130
|
+
y: r.y.toString(),
|
|
131
|
+
width: r.width.toString(),
|
|
132
|
+
height: r.height.toString(),
|
|
133
|
+
fill: internalState.config.squareColor.color,
|
|
134
|
+
'fill-opacity': internalState.config.squareColor.opacity.toString(),
|
|
135
|
+
'shape-rendering': 'crispEdges'
|
|
136
|
+
};
|
|
137
|
+
const imageAttrs = {
|
|
138
|
+
href: url,
|
|
139
|
+
x: r.x.toString(),
|
|
140
|
+
y: r.y.toString(),
|
|
141
|
+
width: r.width.toString(),
|
|
142
|
+
height: r.height.toString()
|
|
143
|
+
};
|
|
144
|
+
internalState.activePromotionSquares.set(displaySquare, roleCode);
|
|
145
|
+
const existing = internalState.svgPromotionPieces.get(roleCode) ?? null;
|
|
146
|
+
if (existing !== null) {
|
|
147
|
+
updateElementAttributes(existing.rect, rectAttrs);
|
|
148
|
+
updateElementAttributes(existing.svg, imageAttrs);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const rect = createSvgElement(layer, 'rect', {
|
|
152
|
+
'data-chessboard-id': `promotion-bg-${roleCode}`,
|
|
153
|
+
...rectAttrs
|
|
154
|
+
});
|
|
155
|
+
const svg = createSvgElement(layer, 'image', {
|
|
156
|
+
'data-chessboard-id': `promotion-piece-${roleCode}`,
|
|
157
|
+
...imageAttrs
|
|
158
|
+
});
|
|
159
|
+
internalState.svgPromotionPieces.set(roleCode, { svg, rect });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
renderTransientVisuals(context) {
|
|
164
|
+
const target = context.transientInput.target;
|
|
165
|
+
if (target !== null && internalState.activePromotionSquares.has(target)) {
|
|
166
|
+
// Hover is over one of the promotion squares
|
|
167
|
+
const geometry = context.currentFrame.layout.geometry;
|
|
168
|
+
const r = geometry.getSquareRect(target);
|
|
169
|
+
const attrs = {
|
|
170
|
+
x: r.x.toString(),
|
|
171
|
+
y: r.y.toString(),
|
|
172
|
+
width: r.width.toString(),
|
|
173
|
+
height: r.height.toString(),
|
|
174
|
+
fill: internalState.config.hoverColor.color,
|
|
175
|
+
'fill-opacity': internalState.config.hoverColor.opacity.toString(),
|
|
176
|
+
'shape-rendering': 'crispEdges'
|
|
177
|
+
};
|
|
178
|
+
if (internalState.svgHoverRect) {
|
|
179
|
+
updateElementAttributes(internalState.svgHoverRect, attrs);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
assert(internalState.slotRoots, 'Slot roots should be available when renderTransientVisuals is called');
|
|
183
|
+
const layer = internalState.slotRoots.animation;
|
|
184
|
+
internalState.svgHoverRect = createSvgElement(layer, 'rect', {
|
|
185
|
+
'data-chessboard-id': 'promotion-hover',
|
|
186
|
+
...attrs
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// Not hovering over a promotion square — remove hover rect
|
|
192
|
+
extensionCleanHoverRect(internalState);
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
onEvent(context) {
|
|
196
|
+
assert(context.rawEvent.type === 'pointerdown', 'Only pointerdown events should be subscribed to');
|
|
197
|
+
const targetSquare = context.sceneEvent?.targetSquare ?? null;
|
|
198
|
+
if (targetSquare !== null) {
|
|
199
|
+
const roleCode = internalState.activePromotionSquares.get(targetSquare);
|
|
200
|
+
if (roleCode !== undefined) {
|
|
201
|
+
context.rawEvent.preventDefault(); // Prevent focus change and other side effects if it is our promotion square
|
|
202
|
+
internalState.runtimeSurface.commands.resolveDeferredUIMoveRequest({
|
|
203
|
+
promotedTo: roleCode
|
|
204
|
+
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
internalState.runtimeSurface.commands.cancelDeferredUIMoveRequest();
|
|
209
|
+
},
|
|
210
|
+
unmount() {
|
|
211
|
+
extensionUnmount(internalState);
|
|
212
|
+
extensionClean(internalState);
|
|
213
|
+
},
|
|
214
|
+
destroy() {
|
|
215
|
+
extensionDestroy(internalState);
|
|
216
|
+
extensionClean(internalState);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import assert from '@ktarmyshov/assert';
|
|
2
|
+
import { normalizePiece } from '../../../state/board/normalize.js';
|
|
3
|
+
import { ALL_NON_EMPTY_PROMOTION_PIECE_CODES, DEFAULT_CONFIG } from './types/internal.js';
|
|
4
|
+
function assertPieceUrlsComplete(pieceUrls) {
|
|
5
|
+
for (const pieceCode of ALL_NON_EMPTY_PROMOTION_PIECE_CODES) {
|
|
6
|
+
assert(pieceCode in pieceUrls, `Missing URL for piece code: ${pieceCode}`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function assertPieceCodeIsPromotionPieceCode(pieceCode) {
|
|
10
|
+
assert(pieceCode === 5 /* PieceCode.WhiteQueen */ ||
|
|
11
|
+
pieceCode === 4 /* PieceCode.WhiteRook */ ||
|
|
12
|
+
pieceCode === 3 /* PieceCode.WhiteBishop */ ||
|
|
13
|
+
pieceCode === 2 /* PieceCode.WhiteKnight */ ||
|
|
14
|
+
pieceCode === 13 /* PieceCode.BlackQueen */ ||
|
|
15
|
+
pieceCode === 12 /* PieceCode.BlackRook */ ||
|
|
16
|
+
pieceCode === 11 /* PieceCode.BlackBishop */ ||
|
|
17
|
+
pieceCode === 10 /* PieceCode.BlackKnight */, `Invalid promotion piece code: ${pieceCode}`);
|
|
18
|
+
}
|
|
19
|
+
function normalizePromotionPieceUrls(input) {
|
|
20
|
+
const normalized = {};
|
|
21
|
+
for (const [key, url] of Object.entries(input)) {
|
|
22
|
+
const pieceCode = normalizePiece(key);
|
|
23
|
+
assertPieceCodeIsPromotionPieceCode(pieceCode);
|
|
24
|
+
normalized[pieceCode] = url;
|
|
25
|
+
}
|
|
26
|
+
assertPieceUrlsComplete(normalized);
|
|
27
|
+
return normalized;
|
|
28
|
+
}
|
|
29
|
+
export function normalizePromotionConfig(config) {
|
|
30
|
+
return {
|
|
31
|
+
squareColor: config.squareColor ?? DEFAULT_CONFIG.squareColor,
|
|
32
|
+
hoverColor: config.hoverColor ?? DEFAULT_CONFIG.hoverColor,
|
|
33
|
+
pieceUrls: config.pieceUrls
|
|
34
|
+
? normalizePromotionPieceUrls(config.pieceUrls)
|
|
35
|
+
: DEFAULT_CONFIG.pieceUrls
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ColorShort, RolePromotionShort } from '../../../../state/board/types/input.js';
|
|
2
|
+
import { OpaqueColor } from '../../common/types.js';
|
|
3
|
+
import { PieceUrlsInput } from '../../main-renderer/types/input.js';
|
|
4
|
+
export type PromotionPieceString = `${ColorShort}${RolePromotionShort}`;
|
|
5
|
+
export type PromotionPieceUrlsInput = Pick<PieceUrlsInput, PromotionPieceString>;
|
|
6
|
+
export interface PromotionInitConfig {
|
|
7
|
+
squareColor?: OpaqueColor;
|
|
8
|
+
hoverColor?: OpaqueColor;
|
|
9
|
+
pieceUrls?: PromotionPieceUrlsInput;
|
|
10
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { NonEmptyPieceCode, PieceCode } from '../../../../state/board/types/internal.js';
|
|
2
|
+
import { OpaqueColor } from '../../common/types.js';
|
|
3
|
+
export type PromotionPieceCode = Exclude<NonEmptyPieceCode, PieceCode.WhitePawn | PieceCode.BlackPawn | PieceCode.BlackKing | PieceCode.WhiteKing>;
|
|
4
|
+
export type PromotionPieceUrls = Record<PromotionPieceCode, string>;
|
|
5
|
+
export interface PromotionConfig {
|
|
6
|
+
squareColor: OpaqueColor;
|
|
7
|
+
hoverColor: OpaqueColor;
|
|
8
|
+
pieceUrls: PromotionPieceUrls;
|
|
9
|
+
}
|
|
10
|
+
export declare const PROMOTION_CHESSNUT_PIECE_URLS: PromotionPieceUrls;
|
|
11
|
+
export declare const ALL_NON_EMPTY_PROMOTION_PIECE_CODES: PromotionPieceCode[];
|
|
12
|
+
export declare const DEFAULT_CONFIG: PromotionConfig;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const PROMOTION_CHESSNUT_PIECE_URLS = {
|
|
2
|
+
[5 /* PieceCode.WhiteQueen */]: new URL('../../../../../assets/pieces/chessnut/wQ.svg', import.meta.url).toString(),
|
|
3
|
+
[4 /* PieceCode.WhiteRook */]: new URL('../../../../../assets/pieces/chessnut/wR.svg', import.meta.url).toString(),
|
|
4
|
+
[3 /* PieceCode.WhiteBishop */]: new URL('../../../../../assets/pieces/chessnut/wB.svg', import.meta.url).toString(),
|
|
5
|
+
[2 /* PieceCode.WhiteKnight */]: new URL('../../../../../assets/pieces/chessnut/wN.svg', import.meta.url).toString(),
|
|
6
|
+
[13 /* PieceCode.BlackQueen */]: new URL('../../../../../assets/pieces/chessnut/bQ.svg', import.meta.url).toString(),
|
|
7
|
+
[12 /* PieceCode.BlackRook */]: new URL('../../../../../assets/pieces/chessnut/bR.svg', import.meta.url).toString(),
|
|
8
|
+
[11 /* PieceCode.BlackBishop */]: new URL('../../../../../assets/pieces/chessnut/bB.svg', import.meta.url).toString(),
|
|
9
|
+
[10 /* PieceCode.BlackKnight */]: new URL('../../../../../assets/pieces/chessnut/bN.svg', import.meta.url).toString()
|
|
10
|
+
};
|
|
11
|
+
export const ALL_NON_EMPTY_PROMOTION_PIECE_CODES = Object.keys(PROMOTION_CHESSNUT_PIECE_URLS).map((code) => Number(code));
|
|
12
|
+
export const DEFAULT_CONFIG = {
|
|
13
|
+
squareColor: {
|
|
14
|
+
color: 'rgba(255, 255, 255)',
|
|
15
|
+
opacity: 1
|
|
16
|
+
},
|
|
17
|
+
hoverColor: {
|
|
18
|
+
color: '#000000',
|
|
19
|
+
opacity: 0.15
|
|
20
|
+
},
|
|
21
|
+
pieceUrls: PROMOTION_CHESSNUT_PIECE_URLS
|
|
22
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RolePromotionCode, Square } from '../../../../state/board/types/internal.js';
|
|
2
|
+
import { ExtensionDefinition, ExtensionInstance } from '../../../types/extension.js';
|
|
3
|
+
import { ExtensionRuntimeSurface } from '../../../types/surface/main.js';
|
|
4
|
+
import { ExtensionInternal } from '../../common/types.js';
|
|
5
|
+
import { PromotionConfig } from './internal.js';
|
|
6
|
+
export declare const EXTENSION_SLOTS: readonly ["animation"];
|
|
7
|
+
export type ExtensionSlotsType = typeof EXTENSION_SLOTS;
|
|
8
|
+
export declare const EXTENSION_ID: "promotion";
|
|
9
|
+
export type PromotionDefinition = ExtensionDefinition<typeof EXTENSION_ID, typeof EXTENSION_SLOTS, never>;
|
|
10
|
+
export type PromotionInstance = ExtensionInstance<typeof EXTENSION_ID, typeof EXTENSION_SLOTS, never>;
|
|
11
|
+
export interface PromotionPieceNode {
|
|
12
|
+
readonly svg: SVGImageElement;
|
|
13
|
+
readonly rect: SVGRectElement;
|
|
14
|
+
}
|
|
15
|
+
export interface PromotionInstanceInternal extends ExtensionInternal<ExtensionSlotsType> {
|
|
16
|
+
readonly config: PromotionConfig;
|
|
17
|
+
readonly svgPromotionPieces: Map<RolePromotionCode, PromotionPieceNode>;
|
|
18
|
+
readonly activePromotionSquares: Map<Square, RolePromotionCode>;
|
|
19
|
+
svgHoverRect: SVGRectElement | null;
|
|
20
|
+
readonly runtimeSurface: ExtensionRuntimeSurface;
|
|
21
|
+
}
|
|
22
|
+
export declare const enum DirtyLayer {
|
|
23
|
+
Promotion = 1
|
|
24
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { SelectedSquareDefinition, SelectedSquareInitConfig } from './types';
|
|
1
|
+
import { SelectedSquareDefinition, SelectedSquareInitConfig } from './types.js';
|
|
2
2
|
export declare function createSelectedSquare(config?: SelectedSquareInitConfig): SelectedSquareDefinition;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import assert from '@ktarmyshov/assert';
|
|
2
2
|
import { toMerged } from 'es-toolkit';
|
|
3
|
-
import { createSvgElement, updateElementAttributes } from '../../../render/svg/helpers';
|
|
4
|
-
import { isUpdateContextRenderable } from '../../types/context/update';
|
|
5
|
-
import { extensionCreateInternalBase, extensionDestroy, extensionMount, extensionUnmount } from '../common/helpers';
|
|
6
|
-
import { DEFAULT_CONFIG, EXTENSION_ID, EXTENSION_SLOTS } from './types';
|
|
3
|
+
import { createSvgElement, updateElementAttributes } from '../../../render/svg/helpers.js';
|
|
4
|
+
import { isUpdateContextRenderable } from '../../types/context/update.js';
|
|
5
|
+
import { extensionCreateInternalBase, extensionDestroy, extensionMount, extensionUnmount } from '../common/helpers.js';
|
|
6
|
+
import { DEFAULT_CONFIG, EXTENSION_ID, EXTENSION_SLOTS } from './types.js';
|
|
7
7
|
export function createSelectedSquare(config = {}) {
|
|
8
8
|
const mergedConfig = toMerged(DEFAULT_CONFIG, config);
|
|
9
9
|
return {
|
|
@@ -55,12 +55,12 @@ function createSelectedSquareInstance(config) {
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
const geometry = context.currentFrame.layout.geometry;
|
|
58
|
-
const r = geometry.
|
|
58
|
+
const r = geometry.getSquareRect(selectedSquare);
|
|
59
59
|
const rectAttributes = {
|
|
60
60
|
x: r.x.toString(),
|
|
61
61
|
y: r.y.toString(),
|
|
62
|
-
width: r.
|
|
63
|
-
height: r.
|
|
62
|
+
width: r.width.toString(),
|
|
63
|
+
height: r.height.toString(),
|
|
64
64
|
fill: internalState.config.color,
|
|
65
65
|
'fill-opacity': internalState.config.opacity.toString(),
|
|
66
66
|
'shape-rendering': 'crispEdges'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PartialDeep } from 'type-fest';
|
|
2
|
-
import { ExtensionDefinition, ExtensionInstance } from '../../types/extension';
|
|
3
|
-
import { ExtensionInternal, OpaqueColor } from '../common/types';
|
|
2
|
+
import { ExtensionDefinition, ExtensionInstance } from '../../types/extension.js';
|
|
3
|
+
import { ExtensionInternal, OpaqueColor } from '../common/types.js';
|
|
4
4
|
export declare const EXTENSION_SLOTS: readonly ["underPieces"];
|
|
5
5
|
export type ExtensionSlotsType = typeof EXTENSION_SLOTS;
|
|
6
6
|
export declare const EXTENSION_ID: "selectedSquare";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { createActiveTarget } from './first-party/active-target/factory';
|
|
2
|
-
export { createBoardEvents } from './first-party/board-events/factory';
|
|
3
|
-
export { createLastMove } from './first-party/last-move/factory';
|
|
4
|
-
export { createLegalMoves } from './first-party/legal-moves/factory';
|
|
5
|
-
export { createMainRenderer } from './first-party/main-renderer/factory';
|
|
6
|
-
export { createSelectedSquare } from './first-party/selected-square/factory';
|
|
7
|
-
export type { AnyExtensionDefinition, ExtensionDefinitionId, ExtensionDefinitionPublicApi } from './types/extension';
|
|
8
|
-
export type {
|
|
1
|
+
export { createActiveTarget } from './first-party/active-target/factory.js';
|
|
2
|
+
export { createBoardEvents } from './first-party/board-events/factory.js';
|
|
3
|
+
export { createLastMove } from './first-party/last-move/factory.js';
|
|
4
|
+
export { createLegalMoves } from './first-party/legal-moves/factory.js';
|
|
5
|
+
export { createMainRenderer } from './first-party/main-renderer/factory.js';
|
|
6
|
+
export { createSelectedSquare } from './first-party/selected-square/factory.js';
|
|
7
|
+
export type { AnyExtensionDefinition, ExtensionDefinitionId, ExtensionDefinitionPublicApi } from './types/extension.js';
|
|
8
|
+
export type { builtInExtensionFactoryMap, BuiltInExtensionId } from './types/wrapper.js';
|
package/dist/extensions/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { createActiveTarget } from './first-party/active-target/factory';
|
|
2
|
-
export { createBoardEvents } from './first-party/board-events/factory';
|
|
3
|
-
export { createLastMove } from './first-party/last-move/factory';
|
|
4
|
-
export { createLegalMoves } from './first-party/legal-moves/factory';
|
|
5
|
-
export { createMainRenderer } from './first-party/main-renderer/factory';
|
|
6
|
-
export { createSelectedSquare } from './first-party/selected-square/factory';
|
|
1
|
+
export { createActiveTarget } from './first-party/active-target/factory.js';
|
|
2
|
+
export { createBoardEvents } from './first-party/board-events/factory.js';
|
|
3
|
+
export { createLastMove } from './first-party/last-move/factory.js';
|
|
4
|
+
export { createLegalMoves } from './first-party/legal-moves/factory.js';
|
|
5
|
+
export { createMainRenderer } from './first-party/main-renderer/factory.js';
|
|
6
|
+
export { createSelectedSquare } from './first-party/selected-square/factory.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ExtensionInvalidationState } from './types';
|
|
1
|
+
import type { ExtensionInvalidationState } from './types.js';
|
|
2
2
|
export declare function createExtensionInvalidationState(): ExtensionInvalidationState;
|
|
@@ -1,34 +1,11 @@
|
|
|
1
|
-
import { Square } from '../../../state/board/types/internal';
|
|
2
|
-
import { ScenePoint } from '../basic/transient-visuals';
|
|
3
|
-
interface
|
|
4
|
-
readonly
|
|
5
|
-
|
|
1
|
+
import { Square } from '../../../state/board/types/internal.js';
|
|
2
|
+
import { ScenePoint } from '../basic/transient-visuals.js';
|
|
3
|
+
export interface ScenePointerEvent {
|
|
4
|
+
readonly type: 'pointercancel' | 'pointerdown' | 'pointerenter' | 'pointerleave' | 'pointermove' | 'pointerout' | 'pointerover' | 'pointerrawupdate' | 'pointerup';
|
|
5
|
+
readonly point: ScenePoint;
|
|
6
|
+
readonly clampedPoint: ScenePoint;
|
|
7
|
+
readonly boardClampedPoint: ScenePoint | null;
|
|
8
|
+
readonly targetSquare: Square | null;
|
|
6
9
|
}
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
readonly pointerId: number;
|
|
10
|
-
readonly isPrimary: boolean;
|
|
11
|
-
readonly button: number;
|
|
12
|
-
readonly buttons: number;
|
|
13
|
-
readonly ctrlKey: boolean;
|
|
14
|
-
readonly altKey: boolean;
|
|
15
|
-
readonly shiftKey: boolean;
|
|
16
|
-
readonly metaKey: boolean;
|
|
17
|
-
readonly rawPoint: ScenePoint | null;
|
|
18
|
-
readonly clampedPoint: ScenePoint | null;
|
|
19
|
-
readonly target: Square | null;
|
|
20
|
-
}
|
|
21
|
-
export type ScenePointerEventType = ScenePointerEvent['type'];
|
|
22
|
-
export declare const SCENE_POINTER_EVENT_TYPES: ScenePointerEventType[];
|
|
23
|
-
export interface SceneKeyboardEvent extends SceneEventBase {
|
|
24
|
-
readonly type: 'keydown' | 'keyup';
|
|
25
|
-
readonly key: string;
|
|
26
|
-
readonly repeat: boolean;
|
|
27
|
-
readonly ctrlKey: boolean;
|
|
28
|
-
readonly altKey: boolean;
|
|
29
|
-
readonly shiftKey: boolean;
|
|
30
|
-
readonly metaKey: boolean;
|
|
31
|
-
}
|
|
32
|
-
export type SceneEvent = ScenePointerEvent | SceneKeyboardEvent;
|
|
33
|
-
export type SceneEventType = SceneEvent['type'];
|
|
34
|
-
export {};
|
|
10
|
+
export declare const ALL_SCENE_POINTER_EVENT_TYPES: ReadonlySet<string>;
|
|
11
|
+
export type SceneEvent = ScenePointerEvent;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
export const
|
|
1
|
+
export const ALL_SCENE_POINTER_EVENT_TYPES = new Set([
|
|
2
|
+
'pointercancel',
|
|
2
3
|
'pointerdown',
|
|
4
|
+
'pointerenter',
|
|
5
|
+
'pointerleave',
|
|
3
6
|
'pointermove',
|
|
4
|
-
'
|
|
5
|
-
'
|
|
6
|
-
'
|
|
7
|
-
|
|
7
|
+
'pointerout',
|
|
8
|
+
'pointerover',
|
|
9
|
+
'pointerrawupdate',
|
|
10
|
+
'pointerup'
|
|
11
|
+
]);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReadonlyDeep } from 'type-fest';
|
|
2
|
+
import type { PieceCode, Square } from '../../../state/board/types/internal.js';
|
|
3
|
+
export interface ExtensionDragSessionBase {
|
|
4
|
+
sourceSquare: Square | null;
|
|
5
|
+
sourcePieceCode: PieceCode | null;
|
|
6
|
+
targetSquare: Square | null;
|
|
7
|
+
}
|
|
8
|
+
export interface ExtensionDragSessionLiftedPiece extends ExtensionDragSessionBase {
|
|
9
|
+
type: 'lifted-piece-drag';
|
|
10
|
+
sourcePieceCode: PieceCode;
|
|
11
|
+
}
|
|
12
|
+
export interface ExtensionDragSessionReleaseTargeting extends ExtensionDragSessionBase {
|
|
13
|
+
type: 'release-targeting';
|
|
14
|
+
}
|
|
15
|
+
type ExtensionCustomDragSessionType = `ext:${string}`;
|
|
16
|
+
export interface ExtensionDragSessionCustom extends ExtensionDragSessionBase {
|
|
17
|
+
type: ExtensionCustomDragSessionType;
|
|
18
|
+
}
|
|
19
|
+
export type ExtensionDragSession = ExtensionDragSessionLiftedPiece | ExtensionDragSessionReleaseTargeting | ExtensionDragSessionCustom;
|
|
20
|
+
export type ExtensionDragSessionSnapshot = ReadonlyDeep<ExtensionDragSession>;
|
|
21
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { LayoutSnapshot } from '../../../layout/types';
|
|
2
|
-
import { RuntimeStateSnapshot } from '../../../state/types';
|
|
1
|
+
import { LayoutSnapshot } from '../../../layout/types.js';
|
|
2
|
+
import { RuntimeStateSnapshot } from '../../../state/types.js';
|
|
3
3
|
export interface RenderLayoutSnapshot extends LayoutSnapshot {
|
|
4
4
|
readonly geometry: NonNullable<LayoutSnapshot['geometry']>;
|
|
5
5
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { Square } from '../../../state/board/types/internal';
|
|
1
|
+
import { Square } from '../../../state/board/types/internal.js';
|
|
2
2
|
export interface ScenePoint {
|
|
3
3
|
readonly x: number;
|
|
4
4
|
readonly y: number;
|
|
5
5
|
}
|
|
6
6
|
export interface TransientInput {
|
|
7
7
|
target: Square | null;
|
|
8
|
-
|
|
8
|
+
point: ScenePoint;
|
|
9
9
|
clampedPoint: ScenePoint;
|
|
10
|
+
boardClampedPoint: ScenePoint;
|
|
10
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { LayoutSnapshot } from '../../../layout/types';
|
|
2
|
-
import { RuntimeStateSnapshot } from '../../../state/types';
|
|
3
|
-
import { RenderFrameSnapshot } from './render';
|
|
1
|
+
import { LayoutSnapshot } from '../../../layout/types.js';
|
|
2
|
+
import { RuntimeStateSnapshot } from '../../../state/types.js';
|
|
3
|
+
import { RenderFrameSnapshot } from './render.js';
|
|
4
4
|
export interface UpdateFrameSnapshotUnmounted {
|
|
5
5
|
readonly isMounted: false;
|
|
6
6
|
readonly state: RuntimeStateSnapshot;
|