@connectorvol/chess-widgets 1.0.0 → 1.1.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/dist/index.d.ts +3 -1
- package/dist/index.js +2 -0
- package/dist/puzzle/mergePgnWithSetupFen.d.ts +8 -0
- package/dist/puzzle/mergePgnWithSetupFen.js +28 -0
- package/dist/puzzle/puzzlePreviewConstants.d.ts +4 -0
- package/dist/puzzle/puzzlePreviewConstants.js +4 -0
- package/dist/puzzle-creation/PuzzleBoardTreeViewerPane.svelte +106 -0
- package/dist/puzzle-creation/PuzzleBoardTreeViewerPane.svelte.d.ts +51 -0
- package/dist/puzzle-creation/PuzzleCreationWizard.svelte +6 -39
- package/dist/puzzle-creation/PuzzlePgnBoardTreeEditor.svelte +487 -0
- package/dist/puzzle-creation/PuzzlePgnBoardTreeEditor.svelte.d.ts +5 -0
- package/dist/puzzle-creation/StepMoves.svelte +14 -40
- package/dist/puzzle-creation/StepMoves.svelte.d.ts +1 -1
- package/dist/puzzle-creation/StepPosition.svelte +4 -4
- package/dist/puzzle-creation/StepPreview.svelte +14 -438
- package/dist/puzzle-creation/StepPreview.svelte.d.ts +1 -1
- package/dist/puzzle-creation/createPuzzleLineEditingBoard.d.ts +16 -0
- package/dist/puzzle-creation/createPuzzleLineEditingBoard.js +31 -0
- package/dist/puzzle-creation/types.d.ts +42 -0
- package/package.json +6 -5
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export { default as PuzzleCreationWizard } from "./puzzle-creation/PuzzleCreationWizard.svelte";
|
|
2
|
-
export
|
|
2
|
+
export { default as PuzzlePgnBoardTreeEditor } from "./puzzle-creation/PuzzlePgnBoardTreeEditor.svelte";
|
|
3
|
+
export type { TPuzzleCreationWizardProps, TPuzzlePgnBoardTreeEditorOutcome, TPuzzlePgnBoardTreeEditorProps, } from "./puzzle-creation/types.js";
|
|
3
4
|
export type { TPuzzleCreatedPayload } from "./puzzle/puzzleCreatedPayload.js";
|
|
4
5
|
export { puzzlePartsFromFullPgn } from "./puzzle/puzzleCreatedPayload.js";
|
|
5
6
|
export type { PuzzleData } from "./puzzle/puzzleData.js";
|
|
6
7
|
export { PUZZLE_EMPTY_BOARD_FEN, createInitialPuzzleData, createEmptyTreeFromFen, getMainLineFromTree, } from "./puzzle/puzzleData.js";
|
|
7
8
|
export type { TSolverMoveOutcome } from "./puzzle/puzzleStepPreviewSolver.js";
|
|
9
|
+
export { PREVIEW_WRONG_NO_VARIANT_MESSAGE } from "./puzzle/puzzlePreviewConstants.js";
|
|
8
10
|
export { DEFAULT_EDITABLE_BOARD_SETTINGS } from "./constants/editable-board-settings.js";
|
|
9
11
|
export { default as EditFen } from "./position-editor/EditFen.svelte";
|
|
10
12
|
export { default as EditMove } from "./position-editor/EditMove.svelte";
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { default as PuzzleCreationWizard } from "./puzzle-creation/PuzzleCreationWizard.svelte";
|
|
2
|
+
export { default as PuzzlePgnBoardTreeEditor } from "./puzzle-creation/PuzzlePgnBoardTreeEditor.svelte";
|
|
2
3
|
export { puzzlePartsFromFullPgn } from "./puzzle/puzzleCreatedPayload.js";
|
|
3
4
|
export { PUZZLE_EMPTY_BOARD_FEN, createInitialPuzzleData, createEmptyTreeFromFen, getMainLineFromTree, } from "./puzzle/puzzleData.js";
|
|
5
|
+
export { PREVIEW_WRONG_NO_VARIANT_MESSAGE } from "./puzzle/puzzlePreviewConstants.js";
|
|
4
6
|
export { DEFAULT_EDITABLE_BOARD_SETTINGS } from "./constants/editable-board-settings.js";
|
|
5
7
|
export { default as EditFen } from "./position-editor/EditFen.svelte";
|
|
6
8
|
export { default as EditMove } from "./position-editor/EditMove.svelte";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Представляет извлечение блока ходов из строки PGN без заголовков (только партия / варианты).
|
|
3
|
+
*/
|
|
4
|
+
export declare function stripPgnHeaders(movetextSource: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Представляет сборку строки PGN с заголовком `[FEN "..."]` для парсера дерева при раздельной передаче FEN и текста ходов.
|
|
7
|
+
*/
|
|
8
|
+
export declare function mergePgnWithSetupFen(movetextOrFullPgn: string, fen: string): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Представляет извлечение блока ходов из строки PGN без заголовков (только партия / варианты).
|
|
3
|
+
*/
|
|
4
|
+
export function stripPgnHeaders(movetextSource) {
|
|
5
|
+
const lines = movetextSource.split("\n");
|
|
6
|
+
let i = 0;
|
|
7
|
+
while (i < lines.length) {
|
|
8
|
+
const line = lines[i].trim();
|
|
9
|
+
if (line === "") {
|
|
10
|
+
i++;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (line.startsWith("[")) {
|
|
14
|
+
i++;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
return lines.slice(i).join("\n").trim();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Представляет сборку строки PGN с заголовком `[FEN "..."]` для парсера дерева при раздельной передаче FEN и текста ходов.
|
|
23
|
+
*/
|
|
24
|
+
export function mergePgnWithSetupFen(movetextOrFullPgn, fen) {
|
|
25
|
+
const escaped = fen.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
26
|
+
const body = stripPgnHeaders(movetextOrFullPgn);
|
|
27
|
+
return `[SetUp "1"]\n[FEN "${escaped}"]\n\n${body}`;
|
|
28
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Представляет текст сообщения «нет такого продолжения» для превью задачи (как на шаге 3).
|
|
3
|
+
*/
|
|
4
|
+
export declare const PREVIEW_WRONG_NO_VARIANT_MESSAGE = "\u0422\u0430\u043A\u043E\u0433\u043E \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u044F \u043D\u0435\u0442 \u0441\u0440\u0435\u0434\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447\u0438.";
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
|
|
4
|
+
import type { BoardApi } from "@connectorvol/chessboard";
|
|
5
|
+
import { Chessboard } from "@connectorvol/chessboard";
|
|
6
|
+
import type { ChessTree } from "@connectorvol/tree";
|
|
7
|
+
import { TreeViewer } from "@connectorvol/tree";
|
|
8
|
+
import { DEFAULT_PIECE_SET } from "@connectorvol/shared";
|
|
9
|
+
|
|
10
|
+
import { cn } from "../utils.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Представляет свойства панели разметки «доска и просмотр дерева партии».
|
|
14
|
+
*/
|
|
15
|
+
interface Props {
|
|
16
|
+
/**
|
|
17
|
+
* Возвращает API шахматной доски для компонента `Chessboard`.
|
|
18
|
+
*/
|
|
19
|
+
chessboard: BoardApi;
|
|
20
|
+
/**
|
|
21
|
+
* Возвращает экземпляр дерева ходов для `TreeViewer`.
|
|
22
|
+
*/
|
|
23
|
+
chessTree: ChessTree;
|
|
24
|
+
/**
|
|
25
|
+
* Возвращает обработчик выбора узла в дереве.
|
|
26
|
+
*/
|
|
27
|
+
onSelectNode: () => void;
|
|
28
|
+
/**
|
|
29
|
+
* Возвращает обработчик после удаления варианта.
|
|
30
|
+
*/
|
|
31
|
+
onDeleteVariant: () => void;
|
|
32
|
+
/**
|
|
33
|
+
* Возвращает функцию установки FEN в движке партии.
|
|
34
|
+
*/
|
|
35
|
+
setChessFen: (fen: string) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Возвращает функцию синхронизации FEN и UI доски.
|
|
38
|
+
*/
|
|
39
|
+
setChessboardFen: (animationTime?: number) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Возвращает признак режима правки дерева (`TreeViewer.editMode`).
|
|
42
|
+
*/
|
|
43
|
+
editMode?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Возвращает признак возможности выбора узлов в дереве.
|
|
46
|
+
*/
|
|
47
|
+
selectable?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Возвращает дополнительные классы Tailwind для корневого контейнера.
|
|
50
|
+
*/
|
|
51
|
+
class?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Возвращает фрагмент разметки под шахматной доской (например сообщение об ошибке в превью).
|
|
54
|
+
*/
|
|
55
|
+
belowChessboard?: Snippet;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const {
|
|
59
|
+
chessboard,
|
|
60
|
+
chessTree,
|
|
61
|
+
onSelectNode,
|
|
62
|
+
onDeleteVariant,
|
|
63
|
+
setChessFen,
|
|
64
|
+
setChessboardFen,
|
|
65
|
+
editMode = true,
|
|
66
|
+
selectable = true,
|
|
67
|
+
class: className,
|
|
68
|
+
belowChessboard,
|
|
69
|
+
}: Props = $props();
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
<div
|
|
73
|
+
class={cn(
|
|
74
|
+
"relative flex min-h-0 flex-col justify-start lg:flex-row lg:items-stretch lg:justify-start lg:gap-4",
|
|
75
|
+
className,
|
|
76
|
+
)}
|
|
77
|
+
>
|
|
78
|
+
<div
|
|
79
|
+
class="order-2 flex min-h-48 w-full flex-1 flex-col gap-2 lg:order-2 lg:min-h-0 lg:min-w-0"
|
|
80
|
+
>
|
|
81
|
+
<div
|
|
82
|
+
class="flex min-h-28 min-w-0 flex-1 flex-col overflow-hidden rounded-md border border-border lg:min-h-0"
|
|
83
|
+
>
|
|
84
|
+
<TreeViewer
|
|
85
|
+
chessTree={chessTree}
|
|
86
|
+
{onSelectNode}
|
|
87
|
+
{onDeleteVariant}
|
|
88
|
+
{setChessFen}
|
|
89
|
+
{setChessboardFen}
|
|
90
|
+
pieceSet={DEFAULT_PIECE_SET}
|
|
91
|
+
className="min-h-0 flex-1 border-x-0 border-t-0"
|
|
92
|
+
{editMode}
|
|
93
|
+
{selectable}
|
|
94
|
+
/>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div
|
|
99
|
+
class="order-1 flex w-full max-w-[38rem] shrink-0 flex-col gap-2 lg:order-1 lg:min-h-0"
|
|
100
|
+
>
|
|
101
|
+
<div class="w-full shrink-0">
|
|
102
|
+
<Chessboard facade={chessboard} />
|
|
103
|
+
</div>
|
|
104
|
+
{@render belowChessboard?.()}
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
import type { BoardApi } from "@connectorvol/chessboard";
|
|
3
|
+
import type { ChessTree } from "@connectorvol/tree";
|
|
4
|
+
/**
|
|
5
|
+
* Представляет свойства панели разметки «доска и просмотр дерева партии».
|
|
6
|
+
*/
|
|
7
|
+
interface Props {
|
|
8
|
+
/**
|
|
9
|
+
* Возвращает API шахматной доски для компонента `Chessboard`.
|
|
10
|
+
*/
|
|
11
|
+
chessboard: BoardApi;
|
|
12
|
+
/**
|
|
13
|
+
* Возвращает экземпляр дерева ходов для `TreeViewer`.
|
|
14
|
+
*/
|
|
15
|
+
chessTree: ChessTree;
|
|
16
|
+
/**
|
|
17
|
+
* Возвращает обработчик выбора узла в дереве.
|
|
18
|
+
*/
|
|
19
|
+
onSelectNode: () => void;
|
|
20
|
+
/**
|
|
21
|
+
* Возвращает обработчик после удаления варианта.
|
|
22
|
+
*/
|
|
23
|
+
onDeleteVariant: () => void;
|
|
24
|
+
/**
|
|
25
|
+
* Возвращает функцию установки FEN в движке партии.
|
|
26
|
+
*/
|
|
27
|
+
setChessFen: (fen: string) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Возвращает функцию синхронизации FEN и UI доски.
|
|
30
|
+
*/
|
|
31
|
+
setChessboardFen: (animationTime?: number) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Возвращает признак режима правки дерева (`TreeViewer.editMode`).
|
|
34
|
+
*/
|
|
35
|
+
editMode?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Возвращает признак возможности выбора узлов в дереве.
|
|
38
|
+
*/
|
|
39
|
+
selectable?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Возвращает дополнительные классы Tailwind для корневого контейнера.
|
|
42
|
+
*/
|
|
43
|
+
class?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Возвращает фрагмент разметки под шахматной доской (например сообщение об ошибке в превью).
|
|
46
|
+
*/
|
|
47
|
+
belowChessboard?: Snippet;
|
|
48
|
+
}
|
|
49
|
+
declare const PuzzleBoardTreeViewerPane: import("svelte").Component<Props, {}, "">;
|
|
50
|
+
type PuzzleBoardTreeViewerPane = ReturnType<typeof PuzzleBoardTreeViewerPane>;
|
|
51
|
+
export default PuzzleBoardTreeViewerPane;
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
import StepMoves from "./StepMoves.svelte";
|
|
9
9
|
import StepPosition from "./StepPosition.svelte";
|
|
10
10
|
import StepPreview from "./StepPreview.svelte";
|
|
11
|
-
import { DEFAULT_EDITABLE_BOARD_SETTINGS } from "../constants/editable-board-settings.js";
|
|
12
11
|
import type { TPuzzleCreationWizardProps } from "./types.js";
|
|
13
12
|
import {
|
|
14
13
|
createEmptyTreeFromFen,
|
|
@@ -17,15 +16,11 @@
|
|
|
17
16
|
} from "../puzzle/puzzleData.js";
|
|
18
17
|
import { PgnOps } from "@connectorvol/chessops/pgnOps.svelte";
|
|
19
18
|
import { ChessTree, createPgnFromTree } from "@connectorvol/tree";
|
|
20
|
-
import {
|
|
21
|
-
CHESSBOARD_THEMES,
|
|
22
|
-
createBoardApi,
|
|
23
|
-
DEFAULT_BOARD_SETTINGS,
|
|
24
|
-
Draggable,
|
|
25
|
-
type IChessBoardActions,
|
|
26
|
-
} from "@connectorvol/chessboard";
|
|
19
|
+
import { CHESSBOARD_THEMES, Draggable, type IChessBoardActions } from "@connectorvol/chessboard";
|
|
27
20
|
import { calculatePly, Color, Square } from "@connectorvol/shared";
|
|
28
21
|
|
|
22
|
+
import { createPuzzleLineEditingBoardApi } from "./createPuzzleLineEditingBoard.js";
|
|
23
|
+
|
|
29
24
|
const {
|
|
30
25
|
onPuzzleCreated,
|
|
31
26
|
fen: fenProp,
|
|
@@ -41,14 +36,6 @@
|
|
|
41
36
|
return t ? t : undefined;
|
|
42
37
|
}
|
|
43
38
|
|
|
44
|
-
/**
|
|
45
|
-
* Представляет извлечение признака стороны, имеющей ход, из полной строки FEN.
|
|
46
|
-
*/
|
|
47
|
-
function sideToMoveFromFullFen(fullFen: string): Color {
|
|
48
|
-
const token = fullFen.trim().split(/\s+/)[1];
|
|
49
|
-
return token === "b" ? Color.BLACK : Color.WHITE;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
39
|
let step = $state<1 | 2 | 3>(1);
|
|
53
40
|
let puzzleData = $derived<PuzzleData>(
|
|
54
41
|
createInitialPuzzleData(wizardSeedFen(fenProp)),
|
|
@@ -130,29 +117,9 @@
|
|
|
130
117
|
* Представляет сборку доски для шага построения линии: позиция и ориентация по стороне хода в FEN.
|
|
131
118
|
*/
|
|
132
119
|
function createMainChessboard(fullFen: string) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
orientation: _orientation,
|
|
137
|
-
draggable: _draggable,
|
|
138
|
-
...appearanceSettings
|
|
139
|
-
} = (boardAppearanceSettings ?? {}) as Record<string, unknown> & {
|
|
140
|
-
boardSize?: unknown;
|
|
141
|
-
orientation?: unknown;
|
|
142
|
-
draggable?: unknown;
|
|
143
|
-
};
|
|
144
|
-
return createBoardApi({
|
|
145
|
-
fen: fullFen,
|
|
146
|
-
settings: {
|
|
147
|
-
...DEFAULT_BOARD_SETTINGS,
|
|
148
|
-
...(appearanceSettings as typeof DEFAULT_BOARD_SETTINGS),
|
|
149
|
-
boardSize: DEFAULT_EDITABLE_BOARD_SETTINGS.boardSize,
|
|
150
|
-
isResizable: false,
|
|
151
|
-
orientation: side,
|
|
152
|
-
draggable: side === Color.WHITE ? Draggable.WHITE : Draggable.BLACK,
|
|
153
|
-
},
|
|
154
|
-
actions,
|
|
155
|
-
theme: boardTheme ?? CHESSBOARD_THEMES.blue,
|
|
120
|
+
return createPuzzleLineEditingBoardApi(fullFen, actions, {
|
|
121
|
+
boardTheme: boardTheme ?? CHESSBOARD_THEMES.blue,
|
|
122
|
+
boardAppearanceSettings,
|
|
156
123
|
});
|
|
157
124
|
}
|
|
158
125
|
|