@ankhorage/zora 25.11.1 → 26.0.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.
Files changed (82) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -4
  3. package/dist/capabilities/index.js +65 -41
  4. package/dist/capabilities/index.js.map +3 -3
  5. package/dist/features/chess/adapters/inbound/ChessBoard.d.ts +1 -1
  6. package/dist/features/chess/adapters/inbound/ChessBoard.d.ts.map +1 -1
  7. package/dist/features/chess/adapters/inbound/ChessBoard.js +130 -83
  8. package/dist/features/chess/adapters/inbound/ChessBoard.js.map +1 -1
  9. package/dist/features/chess/meta.d.ts +97 -72
  10. package/dist/features/chess/meta.d.ts.map +1 -1
  11. package/dist/features/chess/meta.js +64 -40
  12. package/dist/features/chess/meta.js.map +1 -1
  13. package/dist/features/chess/public.d.ts +1 -7
  14. package/dist/features/chess/public.d.ts.map +1 -1
  15. package/dist/features/chess/public.js +0 -6
  16. package/dist/features/chess/public.js.map +1 -1
  17. package/dist/features/chess/utils/createChessBoardCellPressHandler.d.ts +6 -0
  18. package/dist/features/chess/utils/createChessBoardCellPressHandler.d.ts.map +1 -0
  19. package/dist/features/chess/utils/createChessBoardCellPressHandler.js +17 -0
  20. package/dist/features/chess/utils/createChessBoardCellPressHandler.js.map +1 -0
  21. package/dist/features/chess/utils/createChessBoardCells.d.ts +12 -0
  22. package/dist/features/chess/utils/createChessBoardCells.d.ts.map +1 -0
  23. package/dist/features/chess/utils/createChessBoardCells.js +28 -0
  24. package/dist/features/chess/utils/createChessBoardCells.js.map +1 -0
  25. package/dist/readerFree.d.ts +2 -2
  26. package/dist/readerFree.d.ts.map +1 -1
  27. package/dist/readerFree.js +1 -1
  28. package/dist/readerFree.js.map +1 -1
  29. package/dist/types/authoring.d.ts +2 -1
  30. package/dist/types/authoring.d.ts.map +1 -1
  31. package/dist/types/authoring.js.map +1 -1
  32. package/dist/types/chess.d.ts +27 -20
  33. package/dist/types/chess.d.ts.map +1 -1
  34. package/dist/types/chess.js.map +1 -1
  35. package/package.json +31 -92
  36. package/src/features/chess/adapters/inbound/ChessBoard.tsx +263 -112
  37. package/src/features/chess/meta.ts +64 -40
  38. package/src/features/chess/public.test.tsx +77 -228
  39. package/src/features/chess/public.ts +2 -9
  40. package/src/features/chess/utils/createChessBoardCellPressHandler.ts +30 -0
  41. package/src/features/chess/utils/createChessBoardCells.ts +54 -0
  42. package/src/features/chessTabletopOwnership.test.ts +3 -7
  43. package/src/features/registry/componentMeta.test.ts +12 -1
  44. package/src/readerFree.ts +3 -15
  45. package/src/types/authoring.ts +2 -1
  46. package/src/types/chess.ts +28 -21
  47. package/web-dist/chunks/Accordion-91sjb3zh.js +453 -0
  48. package/web-dist/components/chess-board/ChessBoard.js +2 -1
  49. package/web-dist/components/opening-book/OpeningBook.js +2 -1
  50. package/web-dist/manifest.json +8 -4
  51. package/dist/features/chess/utils/chessEngine.d.ts +0 -8
  52. package/dist/features/chess/utils/chessEngine.d.ts.map +0 -1
  53. package/dist/features/chess/utils/chessEngine.js +0 -71
  54. package/dist/features/chess/utils/chessEngine.js.map +0 -1
  55. package/dist/features/chess/utils/chessSquares.d.ts +0 -4
  56. package/dist/features/chess/utils/chessSquares.d.ts.map +0 -1
  57. package/dist/features/chess/utils/chessSquares.js +0 -3
  58. package/dist/features/chess/utils/chessSquares.js.map +0 -1
  59. package/dist/features/chess/utils/createBoardSquares.d.ts +0 -4
  60. package/dist/features/chess/utils/createBoardSquares.d.ts.map +0 -1
  61. package/dist/features/chess/utils/createBoardSquares.js +0 -9
  62. package/dist/features/chess/utils/createBoardSquares.js.map +0 -1
  63. package/dist/features/chess/utils/getSquareFile.d.ts +0 -4
  64. package/dist/features/chess/utils/getSquareFile.d.ts.map +0 -1
  65. package/dist/features/chess/utils/getSquareFile.js +0 -5
  66. package/dist/features/chess/utils/getSquareFile.js.map +0 -1
  67. package/dist/features/chess/utils/getSquareRank.d.ts +0 -4
  68. package/dist/features/chess/utils/getSquareRank.d.ts.map +0 -1
  69. package/dist/features/chess/utils/getSquareRank.js +0 -5
  70. package/dist/features/chess/utils/getSquareRank.js.map +0 -1
  71. package/dist/features/chess/utils/isLightSquare.d.ts +0 -4
  72. package/dist/features/chess/utils/isLightSquare.d.ts.map +0 -1
  73. package/dist/features/chess/utils/isLightSquare.js +0 -6
  74. package/dist/features/chess/utils/isLightSquare.js.map +0 -1
  75. package/src/features/chess/utils/chessEngine.test.ts +0 -35
  76. package/src/features/chess/utils/chessEngine.ts +0 -83
  77. package/src/features/chess/utils/chessSquares.ts +0 -6
  78. package/src/features/chess/utils/createBoardSquares.ts +0 -13
  79. package/src/features/chess/utils/getSquareFile.ts +0 -6
  80. package/src/features/chess/utils/getSquareRank.ts +0 -6
  81. package/src/features/chess/utils/isLightSquare.ts +0 -8
  82. package/web-dist/chunks/Accordion-xcm1qc39.js +0 -3813
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
2
  import type { ChessBoardProps } from '../../../../types/chess';
3
- /*** Renders caller-owned or FEN-backed chess state with optional legal-move validation. */
3
+ /*** Renders a configurable caller-owned chess presentation through the shared GridView surface. */
4
4
  export declare const ChessBoard: (props: ChessBoardProps) => React.ReactElement | null;
5
5
  //# sourceMappingURL=ChessBoard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChessBoard.d.ts","sourceRoot":"","sources":["../../../../../src/features/chess/adapters/inbound/ChessBoard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,yBAAyB,CAAC;AAuBjC,2FAA2F;AAC3F,eAAO,MAAM,UAAU,uDAAsC,CAAC"}
1
+ {"version":3,"file":"ChessBoard.d.ts","sourceRoot":"","sources":["../../../../../src/features/chess/adapters/inbound/ChessBoard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAGV,eAAe,EAGhB,MAAM,yBAAyB,CAAC;AAyBjC,mGAAmG;AACnG,eAAO,MAAM,UAAU,uDAAsC,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import React from 'react';
2
2
  import { Pressable, StyleSheet, Text, View } from 'react-native';
3
+ import { GridView } from '../../../grid-view/public';
3
4
  import { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';
4
5
  import { useZoraTheme } from '../../../theme/composition/useZoraTheme';
5
- import { getLegalTargets, readChessPieces, tryMove } from '../../utils/chessEngine';
6
- import { createBoardSquares } from '../../utils/createBoardSquares';
6
+ import { createChessBoardCellPressHandler } from '../../utils/createChessBoardCellPressHandler';
7
+ import { createChessBoardCells } from '../../utils/createChessBoardCells';
7
8
  import { createChessBoardColorScheme } from '../../utils/createChessBoardColorScheme';
8
- import { isLightSquare } from '../../utils/isLightSquare';
9
9
  const symbols = new Map([
10
10
  ['white:p', '♙'],
11
11
  ['white:n', '♘'],
@@ -20,88 +20,140 @@ const symbols = new Map([
20
20
  ['black:q', '♛'],
21
21
  ['black:k', '♚'],
22
22
  ]);
23
- /*** Renders caller-owned or FEN-backed chess state with optional legal-move validation. */
23
+ const minimumDimension = 2;
24
+ const maximumDimension = 24;
25
+ /*** Renders a configurable caller-owned chess presentation through the shared GridView surface. */
24
26
  export const ChessBoard = withZoraThemeScope(ChessBoardInner);
25
- /*** Renders the current presentation state and delegates FEN validation to the core chess engine. */
26
- function ChessBoardInner({ fen, pieces, orientation = 'white', selectedSquare = null, legalTargets, lastMove = null, disabled = false, showCoordinates = false, validateMoves = true, colorScheme, onSquarePress, onMoveAttempt, onLegalMove, onInvalidMove, renderPiece, interactionPolicy, testID, }) {
27
+ /*** Renders board state and emits caller-owned cell and move intents without applying chess rules. */
28
+ function ChessBoardInner({ columns = 8, rows = 8, pieces, orientation = 'white', selectedCell = null, legalTargets = [], lastMove = null, disabled = false, showCoordinates = false, resizable = false, colorScheme, onCellPress, onMoveAttempt, onDimensionsChange, renderPiece, interactionPolicy, testID, }) {
27
29
  const { theme } = useZoraTheme();
28
30
  const colors = createChessBoardColorScheme(theme, colorScheme);
29
- const squares = createBoardSquares(orientation);
30
- const piecesBySquare = pieces === undefined
31
- ? fen === undefined
32
- ? new Map()
33
- : new Map(readChessPieces(fen))
34
- : new Map(pieces.map((piece) => [piece.square, piece]));
35
- const resolvedLegalTargets = legalTargets ??
36
- (fen !== undefined && selectedSquare !== null ? getLegalTargets(fen, selectedSquare) : []);
37
- const legalTargetSet = new Set(resolvedLegalTargets);
38
- const pressSquare = (square) => {
39
- if (disabled || interactionPolicy === 'passive')
40
- return;
41
- onSquarePress?.(square);
42
- if (selectedSquare === null || selectedSquare === square)
43
- return;
44
- const attempt = { from: selectedSquare, to: square };
45
- onMoveAttempt?.(attempt);
46
- if (!validateMoves || fen === undefined)
47
- return;
48
- const result = tryMove(fen, attempt);
49
- if (result)
50
- onLegalMove?.(result);
51
- else
52
- onInvalidMove?.(attempt);
53
- };
54
- return (<View accessibilityLabel="Chess board" style={[styles.board, { borderColor: colors.border, opacity: disabled ? 0.56 : 1 }]} testID={testID}>
55
- {squares.map((square) => {
56
- const piece = piecesBySquare.get(square);
57
- const light = isLightSquare(square);
58
- const isTarget = legalTargetSet.has(square);
59
- const backgroundColor = selectedSquare === square
60
- ? colors.selectedSquare
61
- : isTarget
62
- ? colors.legalTarget
63
- : lastMove?.from === square
64
- ? colors.lastMoveFrom
65
- : lastMove?.to === square
66
- ? colors.lastMoveTo
67
- : light
68
- ? colors.lightSquare
69
- : colors.darkSquare;
70
- const pieceContent = piece === undefined
71
- ? null
72
- : renderPiece
73
- ? renderPiece({
31
+ const dimensions = React.useMemo(() => ({ columns, rows }), [columns, rows]);
32
+ const [width, setWidth] = React.useState(0);
33
+ const cells = React.useMemo(() => createChessBoardCells(columns, rows, orientation), [columns, orientation, rows]);
34
+ const piecesByCell = React.useMemo(() => new Map((pieces ?? []).map((piece) => [getCellKey(piece.cell), piece])), [pieces]);
35
+ const cellById = React.useMemo(() => new Map(cells.map((cell) => [cell.id, cell])), [cells]);
36
+ const legalTargetSet = React.useMemo(() => new Set(legalTargets.map(getCellKey)), [legalTargets]);
37
+ const pressCell = createChessBoardCellPressHandler({
38
+ disabled,
39
+ interactionPolicy,
40
+ onCellPress,
41
+ onMoveAttempt,
42
+ selectedCell,
43
+ });
44
+ const canResize = resizable && onDimensionsChange !== undefined && !disabled && interactionPolicy !== 'passive';
45
+ const height = width * (dimensions.rows / dimensions.columns);
46
+ const cellSize = width / dimensions.columns;
47
+ return (<View accessibilityLabel="Chess board" onLayout={(event) => setWidth(event.nativeEvent.layout.width)} style={[
48
+ styles.board,
49
+ {
50
+ aspectRatio: dimensions.columns / dimensions.rows,
51
+ borderColor: colors.border,
52
+ opacity: disabled ? 0.56 : 1,
53
+ },
54
+ ]} testID={testID}>
55
+ {width > 0 ? (<GridView contentHeight={dimensions.rows} contentWidth={dimensions.columns} defaultViewport={{ pixelsPerUnitX: cellSize, pixelsPerUnitY: cellSize }} height={height} interactionPolicy="passive" items={cells} overscanPixels={0} renderItem={(item) => {
56
+ const cell = cellById.get(item.id);
57
+ return cell === undefined
58
+ ? null
59
+ : renderChessBoardCell({
60
+ cell,
61
+ cellSize,
62
+ colors,
63
+ disabled: disabled || interactionPolicy === 'passive',
64
+ lastMove,
65
+ legalTargetSet,
66
+ onPress: pressCell,
67
+ piece: piecesByCell.get(item.id),
68
+ renderPiece,
69
+ selectedCell,
70
+ showCoordinates,
71
+ testID,
72
+ });
73
+ }} width={width}/>) : null}
74
+ {canResize ? renderChessBoardResizeActions(dimensions, onDimensionsChange, testID) : null}
75
+ </View>);
76
+ }
77
+ /*** Render one accessible, caller-controlled rectangular board cell. */
78
+ function renderChessBoardCell({ cell, cellSize, colors, disabled, lastMove, legalTargetSet, onPress, piece, renderPiece, selectedCell, showCoordinates, testID, }) {
79
+ const light = (cell.column + cell.row) % 2 === 1;
80
+ const key = getCellKey(cell);
81
+ const backgroundColor = cellsEqual(selectedCell, cell)
82
+ ? colors.selectedSquare
83
+ : legalTargetSet.has(key)
84
+ ? colors.legalTarget
85
+ : cellsEqual(lastMove?.from, cell)
86
+ ? colors.lastMoveFrom
87
+ : cellsEqual(lastMove?.to, cell)
88
+ ? colors.lastMoveTo
89
+ : light
90
+ ? colors.lightSquare
91
+ : colors.darkSquare;
92
+ const pieceContent = piece === undefined
93
+ ? null
94
+ : renderPiece
95
+ ? renderPiece({
96
+ cell,
97
+ color: piece.color === 'white' ? colors.lightPiece : colors.darkPiece,
98
+ piece: piece.piece,
99
+ size: cellSize,
100
+ })
101
+ : (symbols.get(`${piece.color}:${piece.piece.toLowerCase()}`) ?? piece.piece);
102
+ const coordinate = formatCellCoordinate(cell);
103
+ return (<Pressable accessibilityLabel={coordinate} accessibilityRole="button" accessibilityState={{ disabled }} disabled={disabled} key={key} onPress={() => onPress(cell)} style={[styles.square, { backgroundColor }]} testID={testID === undefined ? undefined : `${testID}-cell-${coordinate}`}>
104
+ {showCoordinates ? (<Text style={[
105
+ styles.coordinate,
106
+ { color: light ? colors.lightSquareText : colors.darkSquareText },
107
+ ]}>
108
+ {coordinate}
109
+ </Text>) : null}
110
+ {piece === undefined ? null : (<View pointerEvents="none" style={styles.pieceContainer}>
111
+ {renderPiece ? (pieceContent) : (<Text style={[
112
+ styles.piece,
113
+ {
74
114
  color: piece.color === 'white' ? colors.lightPiece : colors.darkPiece,
75
- piece: piece.piece,
76
- square,
77
- })
78
- : (symbols.get(`${piece.color}:${piece.piece.toLowerCase()}`) ?? piece.piece);
79
- return (<Pressable accessibilityLabel={square} accessibilityRole="button" disabled={disabled || interactionPolicy === 'passive'} key={square} onPress={() => pressSquare(square)} style={[styles.square, { backgroundColor }]} testID={testID ? `${testID}-square-${square}` : undefined}>
80
- {showCoordinates ? (<Text style={[
81
- styles.coordinate,
82
- { color: light ? colors.lightSquareText : colors.darkSquareText },
83
- ]}>
84
- {square}
85
- </Text>) : null}
86
- {piece === undefined ? null : (<View pointerEvents="none" style={styles.pieceContainer}>
87
- {renderPiece ? (pieceContent) : (<Text style={[
88
- styles.piece,
89
- { color: piece.color === 'white' ? colors.lightPiece : colors.darkPiece },
90
- ]}>
91
- {pieceContent}
92
- </Text>)}
93
- </View>)}
94
- </Pressable>);
95
- })}
115
+ fontSize: cellSize * 0.58,
116
+ lineHeight: cellSize * 0.7,
117
+ },
118
+ ]}>
119
+ {pieceContent}
120
+ </Text>)}
121
+ </View>)}
122
+ </Pressable>);
123
+ }
124
+ /*** Render bounded editor actions only when the caller explicitly enables dimension editing. */
125
+ function renderChessBoardResizeActions(dimensions, onDimensionsChange, testID) {
126
+ return (<View accessibilityLabel="Chess board dimensions" style={styles.resizeActions}>
127
+ {renderResizeAction('Add row', { ...dimensions, rows: dimensions.rows + 1 }, onDimensionsChange, dimensions.rows < maximumDimension, testID)}
128
+ {renderResizeAction('Remove row', { ...dimensions, rows: dimensions.rows - 1 }, onDimensionsChange, dimensions.rows > minimumDimension, testID)}
129
+ {renderResizeAction('Add column', { ...dimensions, columns: dimensions.columns + 1 }, onDimensionsChange, dimensions.columns < maximumDimension, testID)}
130
+ {renderResizeAction('Remove column', { ...dimensions, columns: dimensions.columns - 1 }, onDimensionsChange, dimensions.columns > minimumDimension, testID)}
96
131
  </View>);
97
132
  }
133
+ /*** Render one caller-controlled dimension-change action. */
134
+ function renderResizeAction(label, dimensions, onDimensionsChange, enabled, testID) {
135
+ return (<Pressable accessibilityLabel={label} accessibilityRole="button" disabled={!enabled} onPress={() => onDimensionsChange(dimensions)} testID={testID === undefined ? undefined : `${testID}-${label.toLowerCase().replace(' ', '-')}`}>
136
+ <Text>{label}</Text>
137
+ </Pressable>);
138
+ }
139
+ /*** Compares optional cell coordinates without attaching chess-rule meaning to them. */
140
+ function cellsEqual(left, right) {
141
+ if (!left || !right)
142
+ return false;
143
+ return left.column === right.column && left.row === right.row;
144
+ }
145
+ /*** Format a stable display label for a bounded board cell. */
146
+ function formatCellCoordinate(cell) {
147
+ return `${String.fromCharCode(96 + cell.column)}${cell.row}`;
148
+ }
149
+ /*** Create a stable generic identity from caller-owned row and column values. */
150
+ function getCellKey(cell) {
151
+ return `${cell.column}:${cell.row}`;
152
+ }
98
153
  const styles = StyleSheet.create({
99
154
  board: {
100
- aspectRatio: 1,
101
155
  borderRadius: 12,
102
156
  borderWidth: StyleSheet.hairlineWidth,
103
- flexDirection: 'row',
104
- flexWrap: 'wrap',
105
157
  overflow: 'hidden',
106
158
  width: '100%',
107
159
  },
@@ -114,7 +166,7 @@ const styles = StyleSheet.create({
114
166
  top: 2,
115
167
  zIndex: 2,
116
168
  },
117
- piece: { fontSize: 32, fontWeight: '600', lineHeight: 38 },
169
+ piece: { fontWeight: '600' },
118
170
  pieceContainer: {
119
171
  alignItems: 'center',
120
172
  bottom: 0,
@@ -124,12 +176,7 @@ const styles = StyleSheet.create({
124
176
  right: 0,
125
177
  top: 0,
126
178
  },
127
- square: {
128
- alignItems: 'center',
129
- aspectRatio: 1,
130
- width: '12.5%',
131
- justifyContent: 'center',
132
- position: 'relative',
133
- },
179
+ resizeActions: { flexDirection: 'row', gap: 8, padding: 8 },
180
+ square: { alignItems: 'center', justifyContent: 'center', position: 'relative' },
134
181
  });
135
182
  //# sourceMappingURL=ChessBoard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChessBoard.js","sourceRoot":"","sources":["../../../../../src/features/chess/adapters/inbound/ChessBoard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAQjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAiB;IACtC,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,SAAS,EAAE,GAAG,CAAC;CACjB,CAAC,CAAC;AAEH,2FAA2F;AAC3F,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAE9D,qGAAqG;AACrG,SAAS,eAAe,CAAC,EACvB,GAAG,EACH,MAAM,EACN,WAAW,GAAG,OAAO,EACrB,cAAc,GAAG,IAAI,EACrB,YAAY,EACZ,QAAQ,GAAG,IAAI,EACf,QAAQ,GAAG,KAAK,EAChB,eAAe,GAAG,KAAK,EACvB,aAAa,GAAG,IAAI,EACpB,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,MAAM,GACU;IAChB,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,cAAc,GAClB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,GAAG,KAAK,SAAS;YACjB,CAAC,CAAC,IAAI,GAAG,EAAkC;YAC3C,CAAC,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,IAAI,GAAG,CAAiC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,oBAAoB,GACxB,YAAY;QACZ,CAAC,GAAG,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,CAAC,MAAqB,EAAE,EAAE;QAC5C,IAAI,QAAQ,IAAI,iBAAiB,KAAK,SAAS;YAAE,OAAO;QACxD,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,MAAM;YAAE,OAAO;QAEjE,MAAM,OAAO,GAAqB,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACvE,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,aAAa,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAEhD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM;YAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;;YAC7B,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IACF,OAAO,CACL,CAAC,IAAI,CACH,kBAAkB,CAAC,aAAa,CAChC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACpF,MAAM,CAAC,CAAC,MAAM,CAAC,CAEf;MAAA,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,eAAe,GACnB,cAAc,KAAK,MAAM;gBACvB,CAAC,CAAC,MAAM,CAAC,cAAc;gBACvB,CAAC,CAAC,QAAQ;oBACR,CAAC,CAAC,MAAM,CAAC,WAAW;oBACpB,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM;wBACzB,CAAC,CAAC,MAAM,CAAC,YAAY;wBACrB,CAAC,CAAC,QAAQ,EAAE,EAAE,KAAK,MAAM;4BACvB,CAAC,CAAC,MAAM,CAAC,UAAU;4BACnB,CAAC,CAAC,KAAK;gCACL,CAAC,CAAC,MAAM,CAAC,WAAW;gCACpB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YAChC,MAAM,YAAY,GAChB,KAAK,KAAK,SAAS;gBACjB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,WAAW;oBACX,CAAC,CAAC,WAAW,CAAC;wBACV,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS;wBACrE,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,MAAM;qBACP,CAAC;oBACJ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;YACpF,OAAO,CACL,CAAC,SAAS,CACR,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAC3B,iBAAiB,CAAC,QAAQ,CAC1B,QAAQ,CAAC,CAAC,QAAQ,IAAI,iBAAiB,KAAK,SAAS,CAAC,CACtD,GAAG,CAAC,CAAC,MAAM,CAAC,CACZ,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CACnC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,CAC5C,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAE1D;YAAA,CAAC,eAAe,CAAC,CAAC,CAAC,CACjB,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;wBACL,MAAM,CAAC,UAAU;wBACjB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE;qBAClE,CAAC,CAEF;gBAAA,CAAC,MAAM,CACT;cAAA,EAAE,IAAI,CAAC,CACR,CAAC,CAAC,CAAC,IAAI,CACR;YAAA,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5B,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CACtD;gBAAA,CAAC,WAAW,CAAC,CAAC,CAAC,CACb,YAAY,CACb,CAAC,CAAC,CAAC,CACF,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;4BACL,MAAM,CAAC,KAAK;4BACZ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;yBAC1E,CAAC,CAEF;oBAAA,CAAC,YAAY,CACf;kBAAA,EAAE,IAAI,CAAC,CACR,CACH;cAAA,EAAE,IAAI,CAAC,CACR,CACH;UAAA,EAAE,SAAS,CAAC,CACb,CAAC;QACJ,CAAC,CAAC,CACJ;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,KAAK,EAAE;QACL,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,UAAU,CAAC,aAAa;QACrC,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,MAAM;KACd;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,CAAC;QACN,MAAM,EAAE,CAAC;KACV;IACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;IAC1D,cAAc,EAAE;QACd,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,CAAC;QACT,cAAc,EAAE,QAAQ;QACxB,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,CAAC;KACP;IACD,MAAM,EAAE;QACN,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,OAAO;QACd,cAAc,EAAE,QAAQ;QACxB,QAAQ,EAAE,UAAU;KACrB;CACF,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport type {\n ChessBoardProps,\n ChessMoveAttempt,\n ChessPieceState,\n ChessSquareId,\n} from '../../../../types/chess';\nimport { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';\nimport { useZoraTheme } from '../../../theme/composition/useZoraTheme';\nimport { getLegalTargets, readChessPieces, tryMove } from '../../utils/chessEngine';\nimport { createBoardSquares } from '../../utils/createBoardSquares';\nimport { createChessBoardColorScheme } from '../../utils/createChessBoardColorScheme';\nimport { isLightSquare } from '../../utils/isLightSquare';\n\nconst symbols = new Map<string, string>([\n ['white:p', '♙'],\n ['white:n', '♘'],\n ['white:b', '♗'],\n ['white:r', '♖'],\n ['white:q', '♕'],\n ['white:k', '♔'],\n ['black:p', '♟'],\n ['black:n', '♞'],\n ['black:b', '♝'],\n ['black:r', '♜'],\n ['black:q', '♛'],\n ['black:k', '♚'],\n]);\n\n/*** Renders caller-owned or FEN-backed chess state with optional legal-move validation. */\nexport const ChessBoard = withZoraThemeScope(ChessBoardInner);\n\n/*** Renders the current presentation state and delegates FEN validation to the core chess engine. */\nfunction ChessBoardInner({\n fen,\n pieces,\n orientation = 'white',\n selectedSquare = null,\n legalTargets,\n lastMove = null,\n disabled = false,\n showCoordinates = false,\n validateMoves = true,\n colorScheme,\n onSquarePress,\n onMoveAttempt,\n onLegalMove,\n onInvalidMove,\n renderPiece,\n interactionPolicy,\n testID,\n}: ChessBoardProps) {\n const { theme } = useZoraTheme();\n const colors = createChessBoardColorScheme(theme, colorScheme);\n const squares = createBoardSquares(orientation);\n const piecesBySquare =\n pieces === undefined\n ? fen === undefined\n ? new Map<ChessSquareId, ChessPieceState>()\n : new Map(readChessPieces(fen))\n : new Map<ChessSquareId, ChessPieceState>(pieces.map((piece) => [piece.square, piece]));\n const resolvedLegalTargets =\n legalTargets ??\n (fen !== undefined && selectedSquare !== null ? getLegalTargets(fen, selectedSquare) : []);\n const legalTargetSet = new Set(resolvedLegalTargets);\n const pressSquare = (square: ChessSquareId) => {\n if (disabled || interactionPolicy === 'passive') return;\n onSquarePress?.(square);\n if (selectedSquare === null || selectedSquare === square) return;\n\n const attempt: ChessMoveAttempt = { from: selectedSquare, to: square };\n onMoveAttempt?.(attempt);\n if (!validateMoves || fen === undefined) return;\n\n const result = tryMove(fen, attempt);\n if (result) onLegalMove?.(result);\n else onInvalidMove?.(attempt);\n };\n return (\n <View\n accessibilityLabel=\"Chess board\"\n style={[styles.board, { borderColor: colors.border, opacity: disabled ? 0.56 : 1 }]}\n testID={testID}\n >\n {squares.map((square) => {\n const piece = piecesBySquare.get(square);\n const light = isLightSquare(square);\n const isTarget = legalTargetSet.has(square);\n const backgroundColor =\n selectedSquare === square\n ? colors.selectedSquare\n : isTarget\n ? colors.legalTarget\n : lastMove?.from === square\n ? colors.lastMoveFrom\n : lastMove?.to === square\n ? colors.lastMoveTo\n : light\n ? colors.lightSquare\n : colors.darkSquare;\n const pieceContent =\n piece === undefined\n ? null\n : renderPiece\n ? renderPiece({\n color: piece.color === 'white' ? colors.lightPiece : colors.darkPiece,\n piece: piece.piece,\n square,\n })\n : (symbols.get(`${piece.color}:${piece.piece.toLowerCase()}`) ?? piece.piece);\n return (\n <Pressable\n accessibilityLabel={square}\n accessibilityRole=\"button\"\n disabled={disabled || interactionPolicy === 'passive'}\n key={square}\n onPress={() => pressSquare(square)}\n style={[styles.square, { backgroundColor }]}\n testID={testID ? `${testID}-square-${square}` : undefined}\n >\n {showCoordinates ? (\n <Text\n style={[\n styles.coordinate,\n { color: light ? colors.lightSquareText : colors.darkSquareText },\n ]}\n >\n {square}\n </Text>\n ) : null}\n {piece === undefined ? null : (\n <View pointerEvents=\"none\" style={styles.pieceContainer}>\n {renderPiece ? (\n pieceContent\n ) : (\n <Text\n style={[\n styles.piece,\n { color: piece.color === 'white' ? colors.lightPiece : colors.darkPiece },\n ]}\n >\n {pieceContent}\n </Text>\n )}\n </View>\n )}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n board: {\n aspectRatio: 1,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n flexDirection: 'row',\n flexWrap: 'wrap',\n overflow: 'hidden',\n width: '100%',\n },\n coordinate: {\n fontSize: 9,\n fontWeight: '600',\n left: 3,\n opacity: 0.72,\n position: 'absolute',\n top: 2,\n zIndex: 2,\n },\n piece: { fontSize: 32, fontWeight: '600', lineHeight: 38 },\n pieceContainer: {\n alignItems: 'center',\n bottom: 0,\n justifyContent: 'center',\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n },\n square: {\n alignItems: 'center',\n aspectRatio: 1,\n width: '12.5%',\n justifyContent: 'center',\n position: 'relative',\n },\n});\n"]}
1
+ {"version":3,"file":"ChessBoard.js","sourceRoot":"","sources":["../../../../../src/features/chess/adapters/inbound/ChessBoard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport type {\n ChessBoardCell,\n ChessBoardDimensions,\n ChessBoardProps,\n ChessMoveAttempt,\n ChessPieceState,\n} from '../../../../types/chess';\nimport { GridView } from '../../../grid-view/public';\nimport { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';\nimport { useZoraTheme } from '../../../theme/composition/useZoraTheme';\nimport { createChessBoardCellPressHandler } from '../../utils/createChessBoardCellPressHandler';\nimport { createChessBoardCells } from '../../utils/createChessBoardCells';\nimport { createChessBoardColorScheme } from '../../utils/createChessBoardColorScheme';\n\nconst symbols = new Map<string, string>([\n ['white:p', '♙'],\n ['white:n', '♘'],\n ['white:b', '♗'],\n ['white:r', '♖'],\n ['white:q', '♕'],\n ['white:k', '♔'],\n ['black:p', '♟'],\n ['black:n', '♞'],\n ['black:b', '♝'],\n ['black:r', '♜'],\n ['black:q', '♛'],\n ['black:k', '♚'],\n]);\nconst minimumDimension = 2;\nconst maximumDimension = 24;\n\n/*** Renders a configurable caller-owned chess presentation through the shared GridView surface. */\nexport const ChessBoard = withZoraThemeScope(ChessBoardInner);\n\n/*** Renders board state and emits caller-owned cell and move intents without applying chess rules. */\nfunction ChessBoardInner({\n columns = 8,\n rows = 8,\n pieces,\n orientation = 'white',\n selectedCell = null,\n legalTargets = [],\n lastMove = null,\n disabled = false,\n showCoordinates = false,\n resizable = false,\n colorScheme,\n onCellPress,\n onMoveAttempt,\n onDimensionsChange,\n renderPiece,\n interactionPolicy,\n testID,\n}: ChessBoardProps) {\n const { theme } = useZoraTheme();\n const colors = createChessBoardColorScheme(theme, colorScheme);\n const dimensions = React.useMemo(() => ({ columns, rows }), [columns, rows]);\n const [width, setWidth] = React.useState(0);\n const cells = React.useMemo(\n () => createChessBoardCells(columns, rows, orientation),\n [columns, orientation, rows],\n );\n const piecesByCell = React.useMemo(\n () => new Map((pieces ?? []).map((piece) => [getCellKey(piece.cell), piece])),\n [pieces],\n );\n const cellById = React.useMemo(() => new Map(cells.map((cell) => [cell.id, cell])), [cells]);\n const legalTargetSet = React.useMemo(() => new Set(legalTargets.map(getCellKey)), [legalTargets]);\n const pressCell = createChessBoardCellPressHandler({\n disabled,\n interactionPolicy,\n onCellPress,\n onMoveAttempt,\n selectedCell,\n });\n const canResize =\n resizable && onDimensionsChange !== undefined && !disabled && interactionPolicy !== 'passive';\n const height = width * (dimensions.rows / dimensions.columns);\n const cellSize = width / dimensions.columns;\n\n return (\n <View\n accessibilityLabel=\"Chess board\"\n onLayout={(event) => setWidth(event.nativeEvent.layout.width)}\n style={[\n styles.board,\n {\n aspectRatio: dimensions.columns / dimensions.rows,\n borderColor: colors.border,\n opacity: disabled ? 0.56 : 1,\n },\n ]}\n testID={testID}\n >\n {width > 0 ? (\n <GridView\n contentHeight={dimensions.rows}\n contentWidth={dimensions.columns}\n defaultViewport={{ pixelsPerUnitX: cellSize, pixelsPerUnitY: cellSize }}\n height={height}\n interactionPolicy=\"passive\"\n items={cells}\n overscanPixels={0}\n renderItem={(item) => {\n const cell = cellById.get(item.id);\n return cell === undefined\n ? null\n : renderChessBoardCell({\n cell,\n cellSize,\n colors,\n disabled: disabled || interactionPolicy === 'passive',\n lastMove,\n legalTargetSet,\n onPress: pressCell,\n piece: piecesByCell.get(item.id),\n renderPiece,\n selectedCell,\n showCoordinates,\n testID,\n });\n }}\n width={width}\n />\n ) : null}\n {canResize ? renderChessBoardResizeActions(dimensions, onDimensionsChange, testID) : null}\n </View>\n );\n}\n\n/*** Render one accessible, caller-controlled rectangular board cell. */\nfunction renderChessBoardCell({\n cell,\n cellSize,\n colors,\n disabled,\n lastMove,\n legalTargetSet,\n onPress,\n piece,\n renderPiece,\n selectedCell,\n showCoordinates,\n testID,\n}: {\n readonly cell: ChessBoardCell & { readonly id: string };\n readonly cellSize: number;\n readonly colors: ReturnType<typeof createChessBoardColorScheme>;\n readonly disabled: boolean;\n readonly lastMove: ChessMoveAttempt | null;\n readonly legalTargetSet: ReadonlySet<string>;\n readonly onPress: (cell: ChessBoardCell) => void;\n readonly piece: ChessPieceState | undefined;\n readonly renderPiece: ChessBoardProps['renderPiece'];\n readonly selectedCell: ChessBoardCell | null;\n readonly showCoordinates: boolean;\n readonly testID: string | undefined;\n}) {\n const light = (cell.column + cell.row) % 2 === 1;\n const key = getCellKey(cell);\n const backgroundColor = cellsEqual(selectedCell, cell)\n ? colors.selectedSquare\n : legalTargetSet.has(key)\n ? colors.legalTarget\n : cellsEqual(lastMove?.from, cell)\n ? colors.lastMoveFrom\n : cellsEqual(lastMove?.to, cell)\n ? colors.lastMoveTo\n : light\n ? colors.lightSquare\n : colors.darkSquare;\n const pieceContent =\n piece === undefined\n ? null\n : renderPiece\n ? renderPiece({\n cell,\n color: piece.color === 'white' ? colors.lightPiece : colors.darkPiece,\n piece: piece.piece,\n size: cellSize,\n })\n : (symbols.get(`${piece.color}:${piece.piece.toLowerCase()}`) ?? piece.piece);\n const coordinate = formatCellCoordinate(cell);\n\n return (\n <Pressable\n accessibilityLabel={coordinate}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled }}\n disabled={disabled}\n key={key}\n onPress={() => onPress(cell)}\n style={[styles.square, { backgroundColor }]}\n testID={testID === undefined ? undefined : `${testID}-cell-${coordinate}`}\n >\n {showCoordinates ? (\n <Text\n style={[\n styles.coordinate,\n { color: light ? colors.lightSquareText : colors.darkSquareText },\n ]}\n >\n {coordinate}\n </Text>\n ) : null}\n {piece === undefined ? null : (\n <View pointerEvents=\"none\" style={styles.pieceContainer}>\n {renderPiece ? (\n pieceContent\n ) : (\n <Text\n style={[\n styles.piece,\n {\n color: piece.color === 'white' ? colors.lightPiece : colors.darkPiece,\n fontSize: cellSize * 0.58,\n lineHeight: cellSize * 0.7,\n },\n ]}\n >\n {pieceContent}\n </Text>\n )}\n </View>\n )}\n </Pressable>\n );\n}\n\n/*** Render bounded editor actions only when the caller explicitly enables dimension editing. */\nfunction renderChessBoardResizeActions(\n dimensions: ChessBoardDimensions,\n onDimensionsChange: (dimensions: ChessBoardDimensions) => void,\n testID: string | undefined,\n) {\n return (\n <View accessibilityLabel=\"Chess board dimensions\" style={styles.resizeActions}>\n {renderResizeAction(\n 'Add row',\n { ...dimensions, rows: dimensions.rows + 1 },\n onDimensionsChange,\n dimensions.rows < maximumDimension,\n testID,\n )}\n {renderResizeAction(\n 'Remove row',\n { ...dimensions, rows: dimensions.rows - 1 },\n onDimensionsChange,\n dimensions.rows > minimumDimension,\n testID,\n )}\n {renderResizeAction(\n 'Add column',\n { ...dimensions, columns: dimensions.columns + 1 },\n onDimensionsChange,\n dimensions.columns < maximumDimension,\n testID,\n )}\n {renderResizeAction(\n 'Remove column',\n { ...dimensions, columns: dimensions.columns - 1 },\n onDimensionsChange,\n dimensions.columns > minimumDimension,\n testID,\n )}\n </View>\n );\n}\n\n/*** Render one caller-controlled dimension-change action. */\nfunction renderResizeAction(\n label: string,\n dimensions: ChessBoardDimensions,\n onDimensionsChange: (dimensions: ChessBoardDimensions) => void,\n enabled: boolean,\n testID: string | undefined,\n) {\n return (\n <Pressable\n accessibilityLabel={label}\n accessibilityRole=\"button\"\n disabled={!enabled}\n onPress={() => onDimensionsChange(dimensions)}\n testID={\n testID === undefined ? undefined : `${testID}-${label.toLowerCase().replace(' ', '-')}`\n }\n >\n <Text>{label}</Text>\n </Pressable>\n );\n}\n\n/*** Compares optional cell coordinates without attaching chess-rule meaning to them. */\nfunction cellsEqual(\n left: ChessBoardCell | undefined | null,\n right: ChessBoardCell | undefined | null,\n): boolean {\n if (!left || !right) return false;\n return left.column === right.column && left.row === right.row;\n}\n\n/*** Format a stable display label for a bounded board cell. */\nfunction formatCellCoordinate(cell: ChessBoardCell): string {\n return `${String.fromCharCode(96 + cell.column)}${cell.row}`;\n}\n\n/*** Create a stable generic identity from caller-owned row and column values. */\nfunction getCellKey(cell: ChessBoardCell): string {\n return `${cell.column}:${cell.row}`;\n}\n\nconst styles = StyleSheet.create({\n board: {\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n width: '100%',\n },\n coordinate: {\n fontSize: 9,\n fontWeight: '600',\n left: 3,\n opacity: 0.72,\n position: 'absolute',\n top: 2,\n zIndex: 2,\n },\n piece: { fontWeight: '600' },\n pieceContainer: {\n alignItems: 'center',\n bottom: 0,\n justifyContent: 'center',\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n },\n resizeActions: { flexDirection: 'row', gap: 8, padding: 8 },\n square: { alignItems: 'center', justifyContent: 'center', position: 'relative' },\n});\n"]}
@@ -7,83 +7,46 @@ export declare const chessBoardMeta: {
7
7
  readonly blueprint: {
8
8
  readonly label: "Chess board";
9
9
  readonly defaultProps: {
10
+ readonly columns: 8;
10
11
  readonly pieces: readonly [];
11
12
  readonly orientation: "white";
13
+ readonly rows: 8;
12
14
  readonly showCoordinates: true;
13
- readonly validateMoves: true;
14
15
  };
15
16
  };
16
17
  readonly events: {
17
- readonly squarePress: {
18
- readonly label: "Square press";
19
- readonly eventType: "chess.squarePress";
18
+ readonly cellPress: {
19
+ readonly label: "Cell press";
20
+ readonly eventType: "chess.cellPress";
20
21
  readonly payloadFields: readonly [{
21
- readonly path: "square";
22
- readonly type: "string";
23
- readonly label: "Square";
22
+ readonly path: "column";
23
+ readonly type: "number";
24
+ readonly label: "Column";
25
+ }, {
26
+ readonly path: "row";
27
+ readonly type: "number";
28
+ readonly label: "Row";
24
29
  }];
25
30
  };
26
31
  readonly moveAttempt: {
27
32
  readonly label: "Move attempt";
28
33
  readonly eventType: "chess.moveAttempt";
29
34
  readonly payloadFields: readonly [{
30
- readonly path: "from";
31
- readonly type: "string";
32
- readonly label: "From";
35
+ readonly path: "from.column";
36
+ readonly type: "number";
37
+ readonly label: "From column";
33
38
  }, {
34
- readonly path: "to";
35
- readonly type: "string";
36
- readonly label: "To";
37
- }, {
38
- readonly path: "promotion";
39
- readonly type: "string";
40
- readonly label: "Promotion";
41
- }];
42
- };
43
- readonly legalMove: {
44
- readonly label: "Legal move";
45
- readonly eventType: "chess.legalMove";
46
- readonly payloadFields: readonly [{
47
- readonly path: "from";
48
- readonly type: "string";
49
- readonly label: "From";
39
+ readonly path: "from.row";
40
+ readonly type: "number";
41
+ readonly label: "From row";
50
42
  }, {
51
- readonly path: "to";
52
- readonly type: "string";
53
- readonly label: "To";
43
+ readonly path: "to.column";
44
+ readonly type: "number";
45
+ readonly label: "To column";
54
46
  }, {
55
- readonly path: "fen";
56
- readonly type: "string";
57
- readonly label: "Position";
58
- }, {
59
- readonly path: "san";
60
- readonly type: "string";
61
- readonly label: "SAN";
62
- }, {
63
- readonly path: "lan";
64
- readonly type: "string";
65
- readonly label: "LAN";
66
- }, {
67
- readonly path: "promotion";
68
- readonly type: "string";
69
- readonly label: "Promotion";
70
- }];
71
- };
72
- readonly invalidMove: {
73
- readonly label: "Invalid move";
74
- readonly eventType: "chess.invalidMove";
75
- readonly payloadFields: readonly [{
76
- readonly path: "from";
77
- readonly type: "string";
78
- readonly label: "From";
79
- }, {
80
- readonly path: "to";
81
- readonly type: "string";
82
- readonly label: "To";
83
- }, {
84
- readonly path: "promotion";
85
- readonly type: "string";
86
- readonly label: "Promotion";
47
+ readonly path: "to.row";
48
+ readonly type: "number";
49
+ readonly label: "To row";
87
50
  }];
88
51
  };
89
52
  };
@@ -98,11 +61,37 @@ export declare const chessBoardMeta: {
98
61
  readonly acceptsFallback: true;
99
62
  readonly acceptsTransforms: true;
100
63
  };
64
+ readonly selectedCell: {
65
+ readonly label: "Selected cell";
66
+ readonly value: {
67
+ readonly type: "object";
68
+ readonly fields: readonly [{
69
+ readonly path: "column";
70
+ readonly type: "number";
71
+ readonly label: "Column";
72
+ }, {
73
+ readonly path: "row";
74
+ readonly type: "number";
75
+ readonly label: "Row";
76
+ }];
77
+ };
78
+ readonly acceptsFallback: true;
79
+ readonly acceptsTransforms: true;
80
+ };
101
81
  readonly legalTargets: {
102
82
  readonly label: "Legal targets";
103
83
  readonly value: {
104
84
  readonly type: "array";
105
- readonly itemType: "string";
85
+ readonly itemType: "object";
86
+ readonly fields: readonly [{
87
+ readonly path: "[].column";
88
+ readonly type: "number";
89
+ readonly label: "Column";
90
+ }, {
91
+ readonly path: "[].row";
92
+ readonly type: "number";
93
+ readonly label: "Row";
94
+ }];
106
95
  };
107
96
  readonly acceptsFallback: true;
108
97
  readonly acceptsTransforms: true;
@@ -110,10 +99,20 @@ export declare const chessBoardMeta: {
110
99
  };
111
100
  };
112
101
  readonly props: {
113
- readonly fen: {
114
- readonly type: "string";
115
- readonly category: "Position";
116
- readonly label: "FEN";
102
+ readonly columns: {
103
+ readonly type: "number";
104
+ readonly category: "Board";
105
+ readonly label: "Columns";
106
+ readonly default: 8;
107
+ readonly authoring: {
108
+ readonly authority: "instance";
109
+ };
110
+ };
111
+ readonly rows: {
112
+ readonly type: "number";
113
+ readonly category: "Board";
114
+ readonly label: "Rows";
115
+ readonly default: 8;
117
116
  readonly authoring: {
118
117
  readonly authority: "instance";
119
118
  };
@@ -137,10 +136,23 @@ export declare const chessBoardMeta: {
137
136
  readonly authority: "instance";
138
137
  };
139
138
  };
140
- readonly selectedSquare: {
141
- readonly type: "string";
139
+ readonly selectedCell: {
140
+ readonly type: "object";
142
141
  readonly category: "Board";
143
- readonly label: "Selected square";
142
+ readonly label: "Selected cell";
143
+ readonly itemSchema: readonly [{
144
+ readonly key: "column";
145
+ readonly schema: {
146
+ readonly type: "number";
147
+ readonly category: "Cell";
148
+ };
149
+ }, {
150
+ readonly key: "row";
151
+ readonly schema: {
152
+ readonly type: "number";
153
+ readonly category: "Cell";
154
+ };
155
+ }];
144
156
  readonly authoring: {
145
157
  readonly authority: "instance";
146
158
  };
@@ -150,6 +162,19 @@ export declare const chessBoardMeta: {
150
162
  readonly category: "Board";
151
163
  readonly label: "Legal targets";
152
164
  readonly default: readonly [];
165
+ readonly itemSchema: readonly [{
166
+ readonly key: "column";
167
+ readonly schema: {
168
+ readonly type: "number";
169
+ readonly category: "Cell";
170
+ };
171
+ }, {
172
+ readonly key: "row";
173
+ readonly schema: {
174
+ readonly type: "number";
175
+ readonly category: "Cell";
176
+ };
177
+ }];
153
178
  readonly authoring: {
154
179
  readonly authority: "instance";
155
180
  };
@@ -163,11 +188,11 @@ export declare const chessBoardMeta: {
163
188
  readonly authority: "instance";
164
189
  };
165
190
  };
166
- readonly validateMoves: {
191
+ readonly resizable: {
167
192
  readonly type: "boolean";
168
193
  readonly category: "Behavior";
169
- readonly label: "Validate moves";
170
- readonly default: true;
194
+ readonly label: "Resizable";
195
+ readonly default: false;
171
196
  readonly authoring: {
172
197
  readonly authority: "instance";
173
198
  };
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/features/chess/meta.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHW,CAAC;AACvC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EU,CAAC"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/features/chess/meta.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiJW,CAAC;AACvC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EU,CAAC"}