react-native-chess-kit 0.4.1 → 0.5.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/lib/commonjs/board-coordinates.js +76 -9
- package/lib/commonjs/board-coordinates.js.map +1 -1
- package/lib/commonjs/board.js +57 -13
- package/lib/commonjs/board.js.map +1 -1
- package/lib/commonjs/constants.js +4 -1
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/static-board.js +44 -9
- package/lib/commonjs/static-board.js.map +1 -1
- package/lib/module/board-coordinates.js +77 -10
- package/lib/module/board-coordinates.js.map +1 -1
- package/lib/module/board.js +58 -14
- package/lib/module/board.js.map +1 -1
- package/lib/module/constants.js +3 -0
- package/lib/module/constants.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/static-board.js +45 -10
- package/lib/module/static-board.js.map +1 -1
- package/lib/typescript/board-coordinates.d.ts +10 -4
- package/lib/typescript/board-coordinates.d.ts.map +1 -1
- package/lib/typescript/board.d.ts.map +1 -1
- package/lib/typescript/constants.d.ts +2 -0
- package/lib/typescript/constants.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/static-board.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +29 -8
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/board-coordinates.tsx +103 -9
- package/src/board.tsx +69 -19
- package/src/constants.ts +3 -0
- package/src/index.ts +1 -0
- package/src/static-board.tsx +47 -10
- package/src/types.ts +30 -8
|
@@ -7,6 +7,6 @@ export { PromotionPicker } from './promotion-picker';
|
|
|
7
7
|
export { DefaultPieceSet } from './pieces';
|
|
8
8
|
export { BOARD_THEMES, BOARD_COLORS } from './themes';
|
|
9
9
|
export { DEFAULT_BOARD_COLORS, DEFAULT_LAST_MOVE_COLOR, DEFAULT_CHECK_COLOR, DEFAULT_SELECTED_COLOR, DEFAULT_PREMOVE_COLOR, DEFAULT_DRAG_TARGET_COLOR, DEFAULT_ARROW_COLOR, DEFAULT_SHAPE_COLOR, DEFAULT_ANNOTATION_BG, DEFAULT_ANNOTATION_TEXT, DEFAULT_MOVE_DURATION, CAPTURE_FADE_DURATION, } from './constants';
|
|
10
|
-
export type { ChessColor, MoveMethod, PromotionPiece, HapticType, PieceCode, BoardRef, BoardProps, BoardColors, StaticBoardProps, BoardPiece, ParsedPiece, PieceSetMap, HighlightData, ArrowData, ShapeData, AnnotationData, PremoveData, AnimationConfig, TimingAnimationConfig, SpringAnimationConfig, BoardTheme, GestureState, LegalMoveTarget, } from './types';
|
|
10
|
+
export type { ChessColor, MoveMethod, PromotionPiece, HapticType, PieceCode, BoardRef, BoardProps, BoardColors, StaticBoardProps, CoordinatePosition, BoardPiece, ParsedPiece, PieceSetMap, HighlightData, ArrowData, ShapeData, AnnotationData, PremoveData, AnimationConfig, TimingAnimationConfig, SpringAnimationConfig, BoardTheme, GestureState, LegalMoveTarget, } from './types';
|
|
11
11
|
export { squareToXY, xyToSquare } from './use-board-pieces';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAM3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMtD,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAMrB,YAAY,EAEV,UAAU,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EAGT,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAM3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMtD,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAMrB,YAAY,EAEV,UAAU,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EAGT,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAGlB,UAAU,EACV,WAAW,EACX,WAAW,EAGX,aAAa,EACb,SAAS,EACT,SAAS,EACT,cAAc,EACd,WAAW,EAGX,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EAGrB,UAAU,EAGV,YAAY,EAGZ,eAAe,GAChB,MAAM,SAAS,CAAC;AAMjB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-board.d.ts","sourceRoot":"","sources":["../../src/static-board.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAG9D,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,SAAS,CAAC;AAUvE;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"static-board.d.ts","sourceRoot":"","sources":["../../src/static-board.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAG9D,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,SAAS,CAAC;AAUvE;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,8CAqKtB,CAAC"}
|
|
@@ -3,6 +3,8 @@ import type { SharedValue, BaseAnimationBuilder } from 'react-native-reanimated'
|
|
|
3
3
|
export type ChessColor = 'white' | 'black';
|
|
4
4
|
/** How the user interacts with pieces */
|
|
5
5
|
export type MoveMethod = 'drag' | 'click' | 'both';
|
|
6
|
+
/** Where to render file/rank coordinate labels */
|
|
7
|
+
export type CoordinatePosition = 'inside' | 'outside' | 'none';
|
|
6
8
|
/** Promotion piece choice */
|
|
7
9
|
export type PromotionPiece = 'q' | 'r' | 'b' | 'n';
|
|
8
10
|
/** Haptic feedback event types -- consumer wires to their preferred haptics library */
|
|
@@ -147,9 +149,18 @@ export type BoardProps = {
|
|
|
147
149
|
premovesEnabled?: boolean;
|
|
148
150
|
/** Board square colors. Default: green theme */
|
|
149
151
|
colors?: BoardColors;
|
|
150
|
-
/**
|
|
152
|
+
/**
|
|
153
|
+
* Where to render file/rank coordinate labels.
|
|
154
|
+
* - 'inside' — overlaid on the edge squares (default)
|
|
155
|
+
* - 'outside' — in a gutter around the board (board shrinks slightly)
|
|
156
|
+
* - 'none' — hidden
|
|
157
|
+
*
|
|
158
|
+
* @default 'inside'
|
|
159
|
+
*/
|
|
160
|
+
coordinatePosition?: CoordinatePosition;
|
|
161
|
+
/** @deprecated Use coordinatePosition instead. Kept for backwards compat. */
|
|
151
162
|
withLetters?: boolean;
|
|
152
|
-
/**
|
|
163
|
+
/** @deprecated Use coordinatePosition instead. Kept for backwards compat. */
|
|
153
164
|
withNumbers?: boolean;
|
|
154
165
|
/** Custom piece renderer. Receives piece code ('wp', 'bk', etc.) and pixel size. */
|
|
155
166
|
renderPiece?: (pieceCode: string, size: number) => React.ReactElement;
|
|
@@ -188,12 +199,13 @@ export type BoardProps = {
|
|
|
188
199
|
animateFlip?: boolean;
|
|
189
200
|
/**
|
|
190
201
|
* Custom exiting animation for pieces (played on unmount, e.g. captures).
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
202
|
+
* - `undefined` (or omitted): uses default FadeOut.duration(150)
|
|
203
|
+
* - `null`: disables all piece exit animations (pieces vanish instantly).
|
|
204
|
+
* Useful when remounting the entire board via a React key change to
|
|
205
|
+
* prevent all pieces from fading out simultaneously.
|
|
206
|
+
* - Any `BaseAnimationBuilder`: uses the provided animation.
|
|
195
207
|
*/
|
|
196
|
-
pieceExitAnimation?: BaseAnimationBuilder | typeof BaseAnimationBuilder;
|
|
208
|
+
pieceExitAnimation?: BaseAnimationBuilder | typeof BaseAnimationBuilder | null;
|
|
197
209
|
/**
|
|
198
210
|
* Called when a pawn promotion occurs. If not provided, auto-promotes to queen.
|
|
199
211
|
* Return the chosen piece to complete the promotion.
|
|
@@ -232,7 +244,16 @@ export type StaticBoardProps = {
|
|
|
232
244
|
boardSize?: number;
|
|
233
245
|
/** Board square colors. Default: green theme */
|
|
234
246
|
colors?: BoardColors;
|
|
235
|
-
/**
|
|
247
|
+
/**
|
|
248
|
+
* Where to render file/rank coordinate labels.
|
|
249
|
+
* - 'inside' — overlaid on the edge squares
|
|
250
|
+
* - 'outside' — in a gutter around the board (board shrinks slightly)
|
|
251
|
+
* - 'none' — hidden (default)
|
|
252
|
+
*
|
|
253
|
+
* @default 'none'
|
|
254
|
+
*/
|
|
255
|
+
coordinatePosition?: CoordinatePosition;
|
|
256
|
+
/** @deprecated Use coordinatePosition instead */
|
|
236
257
|
withCoordinates?: boolean;
|
|
237
258
|
/** Custom piece renderer */
|
|
238
259
|
renderPiece?: (pieceCode: string, size: number) => React.ReactElement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-chess-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "High-performance chess board for React Native. Single gesture handler, ~40 components, 0 re-renders during drag. Built on Reanimated + Gesture Handler.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { View, Text } from 'react-native';
|
|
3
3
|
|
|
4
|
-
import type { ChessColor } from './types';
|
|
4
|
+
import type { ChessColor, CoordinatePosition } from './types';
|
|
5
5
|
|
|
6
6
|
type BoardCoordinatesProps = {
|
|
7
7
|
boardSize: number;
|
|
@@ -10,6 +10,10 @@ type BoardCoordinatesProps = {
|
|
|
10
10
|
darkColor: string;
|
|
11
11
|
withLetters: boolean;
|
|
12
12
|
withNumbers: boolean;
|
|
13
|
+
/** 'inside' overlays on edge squares, 'outside' renders in a gutter area. */
|
|
14
|
+
position?: 'inside' | 'outside';
|
|
15
|
+
/** Gutter width in pixels (only used when position='outside'). */
|
|
16
|
+
gutterWidth?: number;
|
|
13
17
|
};
|
|
14
18
|
|
|
15
19
|
const FILES_WHITE = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
|
|
@@ -18,11 +22,13 @@ const RANKS_WHITE = ['8', '7', '6', '5', '4', '3', '2', '1'];
|
|
|
18
22
|
const RANKS_BLACK = ['1', '2', '3', '4', '5', '6', '7', '8'];
|
|
19
23
|
|
|
20
24
|
/**
|
|
21
|
-
* File letters (a-h) and rank numbers (1-8) drawn on the board
|
|
25
|
+
* File letters (a-h) and rank numbers (1-8) drawn on or around the board.
|
|
22
26
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
27
|
+
* Two modes:
|
|
28
|
+
* - **inside** (default): absolute-positioned inside each edge square, colors
|
|
29
|
+
* alternate to contrast with the square behind them.
|
|
30
|
+
* - **outside**: rendered in a gutter area around the board. Rank numbers to
|
|
31
|
+
* the left, file letters along the bottom. Uses the dark square color.
|
|
26
32
|
*/
|
|
27
33
|
export const BoardCoordinates = React.memo(function BoardCoordinates({
|
|
28
34
|
boardSize,
|
|
@@ -31,15 +37,105 @@ export const BoardCoordinates = React.memo(function BoardCoordinates({
|
|
|
31
37
|
darkColor,
|
|
32
38
|
withLetters,
|
|
33
39
|
withNumbers,
|
|
40
|
+
position = 'inside',
|
|
41
|
+
gutterWidth = 0,
|
|
34
42
|
}: BoardCoordinatesProps) {
|
|
35
43
|
if (!withLetters && !withNumbers) return null;
|
|
36
44
|
|
|
37
45
|
const squareSize = boardSize / 8;
|
|
38
|
-
const fontSize = squareSize * 0.22;
|
|
39
|
-
const padding = squareSize * 0.06;
|
|
40
46
|
const files = orientation === 'white' ? FILES_WHITE : FILES_BLACK;
|
|
41
47
|
const ranks = orientation === 'white' ? RANKS_WHITE : RANKS_BLACK;
|
|
42
48
|
|
|
49
|
+
// ── Outside mode: labels in gutter area around the board ──
|
|
50
|
+
if (position === 'outside') {
|
|
51
|
+
const fontSize = gutterWidth * 0.65;
|
|
52
|
+
const textColor = darkColor;
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<>
|
|
56
|
+
{/* Rank numbers — left gutter, vertically centered on each row */}
|
|
57
|
+
{withNumbers && (
|
|
58
|
+
<View
|
|
59
|
+
style={{
|
|
60
|
+
position: 'absolute',
|
|
61
|
+
left: 0,
|
|
62
|
+
top: 0,
|
|
63
|
+
width: gutterWidth,
|
|
64
|
+
height: boardSize,
|
|
65
|
+
}}
|
|
66
|
+
pointerEvents="none"
|
|
67
|
+
>
|
|
68
|
+
{ranks.map((rank, row) => (
|
|
69
|
+
<View
|
|
70
|
+
key={`r-${rank}`}
|
|
71
|
+
style={{
|
|
72
|
+
position: 'absolute',
|
|
73
|
+
top: row * squareSize,
|
|
74
|
+
width: gutterWidth,
|
|
75
|
+
height: squareSize,
|
|
76
|
+
alignItems: 'center',
|
|
77
|
+
justifyContent: 'center',
|
|
78
|
+
}}
|
|
79
|
+
>
|
|
80
|
+
<Text
|
|
81
|
+
style={{
|
|
82
|
+
fontSize,
|
|
83
|
+
fontWeight: '600',
|
|
84
|
+
color: textColor,
|
|
85
|
+
}}
|
|
86
|
+
>
|
|
87
|
+
{rank}
|
|
88
|
+
</Text>
|
|
89
|
+
</View>
|
|
90
|
+
))}
|
|
91
|
+
</View>
|
|
92
|
+
)}
|
|
93
|
+
|
|
94
|
+
{/* File letters — bottom gutter, horizontally centered on each column */}
|
|
95
|
+
{withLetters && (
|
|
96
|
+
<View
|
|
97
|
+
style={{
|
|
98
|
+
position: 'absolute',
|
|
99
|
+
left: withNumbers ? gutterWidth : 0,
|
|
100
|
+
bottom: 0,
|
|
101
|
+
width: boardSize,
|
|
102
|
+
height: gutterWidth,
|
|
103
|
+
}}
|
|
104
|
+
pointerEvents="none"
|
|
105
|
+
>
|
|
106
|
+
{files.map((file, col) => (
|
|
107
|
+
<View
|
|
108
|
+
key={`f-${file}`}
|
|
109
|
+
style={{
|
|
110
|
+
position: 'absolute',
|
|
111
|
+
left: col * squareSize,
|
|
112
|
+
width: squareSize,
|
|
113
|
+
height: gutterWidth,
|
|
114
|
+
alignItems: 'center',
|
|
115
|
+
justifyContent: 'center',
|
|
116
|
+
}}
|
|
117
|
+
>
|
|
118
|
+
<Text
|
|
119
|
+
style={{
|
|
120
|
+
fontSize,
|
|
121
|
+
fontWeight: '600',
|
|
122
|
+
color: textColor,
|
|
123
|
+
}}
|
|
124
|
+
>
|
|
125
|
+
{file}
|
|
126
|
+
</Text>
|
|
127
|
+
</View>
|
|
128
|
+
))}
|
|
129
|
+
</View>
|
|
130
|
+
)}
|
|
131
|
+
</>
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// ── Inside mode (default): absolute-positioned inside edge squares ──
|
|
136
|
+
const fontSize = squareSize * 0.22;
|
|
137
|
+
const padding = squareSize * 0.06;
|
|
138
|
+
|
|
43
139
|
return (
|
|
44
140
|
<View
|
|
45
141
|
style={{ position: 'absolute', width: boardSize, height: boardSize }}
|
|
@@ -48,7 +144,6 @@ export const BoardCoordinates = React.memo(function BoardCoordinates({
|
|
|
48
144
|
{/* Rank numbers along left edge (inside each row's first square) */}
|
|
49
145
|
{withNumbers &&
|
|
50
146
|
ranks.map((rank, row) => {
|
|
51
|
-
// First column square: row 0 col 0 = light if (0+0)%2===0
|
|
52
147
|
const isLight = row % 2 === 0;
|
|
53
148
|
const textColor = isLight ? darkColor : lightColor;
|
|
54
149
|
|
|
@@ -72,7 +167,6 @@ export const BoardCoordinates = React.memo(function BoardCoordinates({
|
|
|
72
167
|
{/* File letters along bottom edge (inside each column's last square) */}
|
|
73
168
|
{withLetters &&
|
|
74
169
|
files.map((file, col) => {
|
|
75
|
-
// Last row (7), column col: light if (7+col)%2===0
|
|
76
170
|
const isLight = (7 + col) % 2 === 0;
|
|
77
171
|
const textColor = isLight ? darkColor : lightColor;
|
|
78
172
|
|
package/src/board.tsx
CHANGED
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
DEFAULT_PREMOVE_COLOR,
|
|
34
34
|
DEFAULT_DRAG_TARGET_COLOR,
|
|
35
35
|
CAPTURE_FADE_DURATION,
|
|
36
|
+
COORDINATE_GUTTER_SCALE,
|
|
36
37
|
} from './constants';
|
|
37
38
|
import { DefaultPieceSet } from './pieces';
|
|
38
39
|
import { useBoardPieces } from './use-board-pieces';
|
|
@@ -131,8 +132,9 @@ export const Board = forwardRef<BoardRef, BoardProps>(function Board(
|
|
|
131
132
|
|
|
132
133
|
// Appearance
|
|
133
134
|
colors,
|
|
134
|
-
|
|
135
|
-
|
|
135
|
+
coordinatePosition: coordinatePositionProp,
|
|
136
|
+
withLetters: withLettersProp,
|
|
137
|
+
withNumbers: withNumbersProp,
|
|
136
138
|
renderPiece,
|
|
137
139
|
pieceSet,
|
|
138
140
|
|
|
@@ -155,7 +157,7 @@ export const Board = forwardRef<BoardRef, BoardProps>(function Board(
|
|
|
155
157
|
moveDuration = DEFAULT_MOVE_DURATION,
|
|
156
158
|
animationConfig,
|
|
157
159
|
animateFlip = true,
|
|
158
|
-
pieceExitAnimation
|
|
160
|
+
pieceExitAnimation,
|
|
159
161
|
|
|
160
162
|
// Promotion
|
|
161
163
|
onPromotion,
|
|
@@ -179,10 +181,26 @@ export const Board = forwardRef<BoardRef, BoardProps>(function Board(
|
|
|
179
181
|
setMeasuredSize(Math.min(width, height));
|
|
180
182
|
}, []);
|
|
181
183
|
|
|
182
|
-
const
|
|
183
|
-
const squareSize = boardSize / 8;
|
|
184
|
+
const outerSize = boardSizeProp ?? measuredSize;
|
|
184
185
|
const boardColors = colors ?? DEFAULT_BOARD_COLORS;
|
|
185
186
|
|
|
187
|
+
// Resolve coordinate position: new prop takes precedence over legacy booleans
|
|
188
|
+
const coordinatePosition = coordinatePositionProp
|
|
189
|
+
?? (withLettersProp === false && withNumbersProp === false ? 'none' : 'inside');
|
|
190
|
+
const isOutside = coordinatePosition === 'outside';
|
|
191
|
+
const isCoordVisible = coordinatePosition !== 'none';
|
|
192
|
+
|
|
193
|
+
// When outside: reserve gutter space; inner board = outer minus gutters
|
|
194
|
+
const gutterWidth = isOutside ? Math.round((outerSize / 8) * COORDINATE_GUTTER_SCALE) : 0;
|
|
195
|
+
const boardSize = isOutside ? outerSize - gutterWidth : outerSize;
|
|
196
|
+
const squareSize = boardSize / 8;
|
|
197
|
+
|
|
198
|
+
// Resolve piece exit animation: null = disabled, undefined = default FadeOut
|
|
199
|
+
const resolvedPieceExitAnimation =
|
|
200
|
+
pieceExitAnimation === null
|
|
201
|
+
? undefined
|
|
202
|
+
: (pieceExitAnimation ?? FadeOut.duration(CAPTURE_FADE_DURATION));
|
|
203
|
+
|
|
186
204
|
// --- Board flip animation ---
|
|
187
205
|
const flipRotation = useSharedValue(orientation === 'black' ? 180 : 0);
|
|
188
206
|
const prevOrientationRef = useRef(orientation);
|
|
@@ -506,17 +524,20 @@ export const Board = forwardRef<BoardRef, BoardProps>(function Board(
|
|
|
506
524
|
}));
|
|
507
525
|
|
|
508
526
|
// If no size yet (auto-sizing), render invisible container for measurement
|
|
509
|
-
if (
|
|
527
|
+
if (outerSize === 0) {
|
|
510
528
|
return (
|
|
511
529
|
<View style={{ flex: 1, aspectRatio: 1 }} onLayout={handleLayout} />
|
|
512
530
|
);
|
|
513
531
|
}
|
|
514
532
|
|
|
515
|
-
|
|
533
|
+
// Inner board with all interactive layers
|
|
534
|
+
const boardContent = (
|
|
516
535
|
<GestureDetector gesture={gesture}>
|
|
517
536
|
<View
|
|
518
|
-
style={
|
|
519
|
-
|
|
537
|
+
style={isOutside
|
|
538
|
+
? { width: boardSize, height: boardSize, position: 'absolute', top: 0, right: 0 }
|
|
539
|
+
: { width: boardSize, height: boardSize }}
|
|
540
|
+
onLayout={!isOutside && !boardSizeProp ? handleLayout : undefined}
|
|
520
541
|
accessibilityLabel="Chess board"
|
|
521
542
|
accessibilityRole="adjustable"
|
|
522
543
|
>
|
|
@@ -527,15 +548,18 @@ export const Board = forwardRef<BoardRef, BoardProps>(function Board(
|
|
|
527
548
|
darkColor={boardColors.dark}
|
|
528
549
|
/>
|
|
529
550
|
|
|
530
|
-
{/* Layer 2:
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
551
|
+
{/* Layer 2: Inside coordinate labels (when position='inside') */}
|
|
552
|
+
{isCoordVisible && !isOutside && (
|
|
553
|
+
<BoardCoordinates
|
|
554
|
+
boardSize={boardSize}
|
|
555
|
+
orientation={orientation}
|
|
556
|
+
lightColor={boardColors.light}
|
|
557
|
+
darkColor={boardColors.dark}
|
|
558
|
+
withLetters
|
|
559
|
+
withNumbers
|
|
560
|
+
position="inside"
|
|
561
|
+
/>
|
|
562
|
+
)}
|
|
539
563
|
|
|
540
564
|
{/* Layer 3: Square highlights (last move, check, selected, premove, custom, imperative) */}
|
|
541
565
|
<BoardHighlights
|
|
@@ -583,7 +607,7 @@ export const Board = forwardRef<BoardRef, BoardProps>(function Board(
|
|
|
583
607
|
renderPiece={resolvedRenderer}
|
|
584
608
|
activeSquare={gestureState.activeSquare}
|
|
585
609
|
isDragging={gestureState.isDragging}
|
|
586
|
-
exitingAnimation={
|
|
610
|
+
exitingAnimation={resolvedPieceExitAnimation}
|
|
587
611
|
/>
|
|
588
612
|
|
|
589
613
|
{/* Layer 7: Arrows + shapes (SVG overlay) */}
|
|
@@ -632,4 +656,30 @@ export const Board = forwardRef<BoardRef, BoardProps>(function Board(
|
|
|
632
656
|
</View>
|
|
633
657
|
</GestureDetector>
|
|
634
658
|
);
|
|
659
|
+
|
|
660
|
+
// Outside coordinates: wrap board in outer container with gutter
|
|
661
|
+
if (isOutside) {
|
|
662
|
+
return (
|
|
663
|
+
<View
|
|
664
|
+
style={{ width: outerSize, height: boardSize + gutterWidth }}
|
|
665
|
+
onLayout={boardSizeProp ? undefined : handleLayout}
|
|
666
|
+
>
|
|
667
|
+
{boardContent}
|
|
668
|
+
|
|
669
|
+
{/* Outside coordinate labels in the gutter area */}
|
|
670
|
+
<BoardCoordinates
|
|
671
|
+
boardSize={boardSize}
|
|
672
|
+
orientation={orientation}
|
|
673
|
+
lightColor={boardColors.light}
|
|
674
|
+
darkColor={boardColors.dark}
|
|
675
|
+
withLetters
|
|
676
|
+
withNumbers
|
|
677
|
+
position="outside"
|
|
678
|
+
gutterWidth={gutterWidth}
|
|
679
|
+
/>
|
|
680
|
+
</View>
|
|
681
|
+
);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
return boardContent;
|
|
635
685
|
});
|
package/src/constants.ts
CHANGED
|
@@ -75,6 +75,9 @@ export const ANNOTATION_SCALE = 0.35;
|
|
|
75
75
|
/** Coordinate font size as fraction of square size */
|
|
76
76
|
export const COORDINATE_FONT_SCALE = 0.22;
|
|
77
77
|
|
|
78
|
+
/** Outside-coordinate gutter width as fraction of square size */
|
|
79
|
+
export const COORDINATE_GUTTER_SCALE = 0.45;
|
|
80
|
+
|
|
78
81
|
/** Drag ghost scale factor (1.1x larger than normal piece) */
|
|
79
82
|
export const DRAG_GHOST_SCALE = 1.1;
|
|
80
83
|
|
package/src/index.ts
CHANGED
package/src/static-board.tsx
CHANGED
|
@@ -2,7 +2,7 @@ import React, { useState, useCallback, useMemo } from 'react';
|
|
|
2
2
|
import { View, type LayoutChangeEvent } from 'react-native';
|
|
3
3
|
|
|
4
4
|
import type { StaticBoardProps, ChessColor, PieceCode } from './types';
|
|
5
|
-
import { DEFAULT_BOARD_COLORS, DEFAULT_LAST_MOVE_COLOR } from './constants';
|
|
5
|
+
import { DEFAULT_BOARD_COLORS, DEFAULT_LAST_MOVE_COLOR, COORDINATE_GUTTER_SCALE } from './constants';
|
|
6
6
|
import { DefaultPieceSet } from './pieces';
|
|
7
7
|
import { useBoardPieces, squareToXY } from './use-board-pieces';
|
|
8
8
|
import { BoardBackground } from './board-background';
|
|
@@ -24,7 +24,8 @@ export const StaticBoard = React.memo(function StaticBoard({
|
|
|
24
24
|
orientation = 'white',
|
|
25
25
|
boardSize: boardSizeProp,
|
|
26
26
|
colors,
|
|
27
|
-
|
|
27
|
+
coordinatePosition: coordinatePositionProp,
|
|
28
|
+
withCoordinates,
|
|
28
29
|
renderPiece,
|
|
29
30
|
pieceSet,
|
|
30
31
|
lastMove,
|
|
@@ -39,10 +40,19 @@ export const StaticBoard = React.memo(function StaticBoard({
|
|
|
39
40
|
setMeasuredSize(Math.min(width, height));
|
|
40
41
|
}, []);
|
|
41
42
|
|
|
42
|
-
const
|
|
43
|
-
const squareSize = boardSize / 8;
|
|
43
|
+
const outerSize = boardSizeProp ?? measuredSize;
|
|
44
44
|
const boardColors = colors ?? DEFAULT_BOARD_COLORS;
|
|
45
45
|
|
|
46
|
+
// Resolve coordinate position: new prop > legacy boolean > 'none'
|
|
47
|
+
const coordinatePosition = coordinatePositionProp
|
|
48
|
+
?? (withCoordinates ? 'inside' : 'none');
|
|
49
|
+
const isOutside = coordinatePosition === 'outside';
|
|
50
|
+
const isCoordVisible = coordinatePosition !== 'none';
|
|
51
|
+
|
|
52
|
+
const gutterWidth = isOutside ? Math.round((outerSize / 8) * COORDINATE_GUTTER_SCALE) : 0;
|
|
53
|
+
const boardSize = isOutside ? outerSize - gutterWidth : outerSize;
|
|
54
|
+
const squareSize = boardSize / 8;
|
|
55
|
+
|
|
46
56
|
// --- Piece data from FEN ---
|
|
47
57
|
const pieces = useBoardPieces(fen);
|
|
48
58
|
|
|
@@ -59,16 +69,18 @@ export const StaticBoard = React.memo(function StaticBoard({
|
|
|
59
69
|
}, [renderPiece, pieceSet]);
|
|
60
70
|
|
|
61
71
|
// If no size yet (auto-sizing), render invisible container for measurement
|
|
62
|
-
if (
|
|
72
|
+
if (outerSize === 0) {
|
|
63
73
|
return (
|
|
64
74
|
<View style={{ flex: 1, aspectRatio: 1 }} onLayout={handleLayout} />
|
|
65
75
|
);
|
|
66
76
|
}
|
|
67
77
|
|
|
68
|
-
|
|
78
|
+
const boardContent = (
|
|
69
79
|
<View
|
|
70
|
-
style={
|
|
71
|
-
|
|
80
|
+
style={isOutside
|
|
81
|
+
? { width: boardSize, height: boardSize, position: 'absolute', top: 0, right: 0 }
|
|
82
|
+
: { width: boardSize, height: boardSize }}
|
|
83
|
+
onLayout={!isOutside && !boardSizeProp ? handleLayout : undefined}
|
|
72
84
|
accessibilityLabel="Chess board"
|
|
73
85
|
accessibilityRole="image"
|
|
74
86
|
>
|
|
@@ -79,8 +91,8 @@ export const StaticBoard = React.memo(function StaticBoard({
|
|
|
79
91
|
darkColor={boardColors.dark}
|
|
80
92
|
/>
|
|
81
93
|
|
|
82
|
-
{/* Layer 2:
|
|
83
|
-
{
|
|
94
|
+
{/* Layer 2: Inside coordinates */}
|
|
95
|
+
{isCoordVisible && !isOutside && (
|
|
84
96
|
<BoardCoordinates
|
|
85
97
|
boardSize={boardSize}
|
|
86
98
|
orientation={orientation}
|
|
@@ -88,6 +100,7 @@ export const StaticBoard = React.memo(function StaticBoard({
|
|
|
88
100
|
darkColor={boardColors.dark}
|
|
89
101
|
withLetters
|
|
90
102
|
withNumbers
|
|
103
|
+
position="inside"
|
|
91
104
|
/>
|
|
92
105
|
)}
|
|
93
106
|
|
|
@@ -147,4 +160,28 @@ export const StaticBoard = React.memo(function StaticBoard({
|
|
|
147
160
|
)}
|
|
148
161
|
</View>
|
|
149
162
|
);
|
|
163
|
+
|
|
164
|
+
if (isOutside) {
|
|
165
|
+
return (
|
|
166
|
+
<View
|
|
167
|
+
style={{ width: outerSize, height: boardSize + gutterWidth }}
|
|
168
|
+
onLayout={boardSizeProp ? undefined : handleLayout}
|
|
169
|
+
>
|
|
170
|
+
{boardContent}
|
|
171
|
+
|
|
172
|
+
<BoardCoordinates
|
|
173
|
+
boardSize={boardSize}
|
|
174
|
+
orientation={orientation}
|
|
175
|
+
lightColor={boardColors.light}
|
|
176
|
+
darkColor={boardColors.dark}
|
|
177
|
+
withLetters
|
|
178
|
+
withNumbers
|
|
179
|
+
position="outside"
|
|
180
|
+
gutterWidth={gutterWidth}
|
|
181
|
+
/>
|
|
182
|
+
</View>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return boardContent;
|
|
150
187
|
});
|
package/src/types.ts
CHANGED
|
@@ -10,6 +10,9 @@ export type ChessColor = 'white' | 'black';
|
|
|
10
10
|
/** How the user interacts with pieces */
|
|
11
11
|
export type MoveMethod = 'drag' | 'click' | 'both';
|
|
12
12
|
|
|
13
|
+
/** Where to render file/rank coordinate labels */
|
|
14
|
+
export type CoordinatePosition = 'inside' | 'outside' | 'none';
|
|
15
|
+
|
|
13
16
|
/** Promotion piece choice */
|
|
14
17
|
export type PromotionPiece = 'q' | 'r' | 'b' | 'n';
|
|
15
18
|
|
|
@@ -208,9 +211,18 @@ export type BoardProps = {
|
|
|
208
211
|
|
|
209
212
|
/** Board square colors. Default: green theme */
|
|
210
213
|
colors?: BoardColors;
|
|
211
|
-
/**
|
|
214
|
+
/**
|
|
215
|
+
* Where to render file/rank coordinate labels.
|
|
216
|
+
* - 'inside' — overlaid on the edge squares (default)
|
|
217
|
+
* - 'outside' — in a gutter around the board (board shrinks slightly)
|
|
218
|
+
* - 'none' — hidden
|
|
219
|
+
*
|
|
220
|
+
* @default 'inside'
|
|
221
|
+
*/
|
|
222
|
+
coordinatePosition?: CoordinatePosition;
|
|
223
|
+
/** @deprecated Use coordinatePosition instead. Kept for backwards compat. */
|
|
212
224
|
withLetters?: boolean;
|
|
213
|
-
/**
|
|
225
|
+
/** @deprecated Use coordinatePosition instead. Kept for backwards compat. */
|
|
214
226
|
withNumbers?: boolean;
|
|
215
227
|
/** Custom piece renderer. Receives piece code ('wp', 'bk', etc.) and pixel size. */
|
|
216
228
|
renderPiece?: (pieceCode: string, size: number) => React.ReactElement;
|
|
@@ -255,12 +267,13 @@ export type BoardProps = {
|
|
|
255
267
|
animateFlip?: boolean;
|
|
256
268
|
/**
|
|
257
269
|
* Custom exiting animation for pieces (played on unmount, e.g. captures).
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
270
|
+
* - `undefined` (or omitted): uses default FadeOut.duration(150)
|
|
271
|
+
* - `null`: disables all piece exit animations (pieces vanish instantly).
|
|
272
|
+
* Useful when remounting the entire board via a React key change to
|
|
273
|
+
* prevent all pieces from fading out simultaneously.
|
|
274
|
+
* - Any `BaseAnimationBuilder`: uses the provided animation.
|
|
262
275
|
*/
|
|
263
|
-
pieceExitAnimation?: BaseAnimationBuilder | typeof BaseAnimationBuilder;
|
|
276
|
+
pieceExitAnimation?: BaseAnimationBuilder | typeof BaseAnimationBuilder | null;
|
|
264
277
|
|
|
265
278
|
// --- Promotion ---
|
|
266
279
|
|
|
@@ -307,7 +320,16 @@ export type StaticBoardProps = {
|
|
|
307
320
|
boardSize?: number;
|
|
308
321
|
/** Board square colors. Default: green theme */
|
|
309
322
|
colors?: BoardColors;
|
|
310
|
-
/**
|
|
323
|
+
/**
|
|
324
|
+
* Where to render file/rank coordinate labels.
|
|
325
|
+
* - 'inside' — overlaid on the edge squares
|
|
326
|
+
* - 'outside' — in a gutter around the board (board shrinks slightly)
|
|
327
|
+
* - 'none' — hidden (default)
|
|
328
|
+
*
|
|
329
|
+
* @default 'none'
|
|
330
|
+
*/
|
|
331
|
+
coordinatePosition?: CoordinatePosition;
|
|
332
|
+
/** @deprecated Use coordinatePosition instead */
|
|
311
333
|
withCoordinates?: boolean;
|
|
312
334
|
/** Custom piece renderer */
|
|
313
335
|
renderPiece?: (pieceCode: string, size: number) => React.ReactElement;
|