kokopu-react 3.1.0 → 3.2.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 (234) hide show
  1. package/.eslintrc.yml +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/dist/lib/chessboard/BoardProperties.js.map +1 -1
  4. package/dist/lib/chessboard/Chessboard.css +13 -13
  5. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  6. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  7. package/dist/lib/chessboard/Draggable.js.map +1 -1
  8. package/dist/lib/chessboard/Motion.js.map +1 -1
  9. package/dist/lib/chessboard/colorsets.js.map +1 -1
  10. package/dist/lib/chessboard/piecesets.js.map +1 -1
  11. package/dist/lib/errorbox/ErrorBox.css +18 -18
  12. package/dist/lib/errorbox/ErrorBox.js.map +1 -1
  13. package/dist/lib/errorbox/parsing.js.map +1 -1
  14. package/dist/lib/exception.js.map +1 -1
  15. package/dist/lib/i18n.d.ts +1 -0
  16. package/dist/lib/i18n.js +1 -0
  17. package/dist/lib/i18n.js.map +1 -1
  18. package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
  19. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
  20. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  21. package/dist/lib/icons/ArrowTip.js.map +1 -1
  22. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  23. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  24. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  25. package/dist/lib/icons/arrow.css +1 -1
  26. package/dist/lib/index.d.ts +1 -0
  27. package/dist/lib/index.js +1 -0
  28. package/dist/lib/index.js.map +1 -1
  29. package/dist/lib/movetext/Movetext.css +27 -27
  30. package/dist/lib/movetext/Movetext.js.map +1 -1
  31. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  32. package/dist/lib/movetext/fonts.css +7 -7
  33. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  34. package/dist/lib/movetext/moveFormatter.js.map +1 -1
  35. package/dist/lib/navigationboard/NavigationBoard.d.ts +39 -1
  36. package/dist/lib/navigationboard/NavigationBoard.js +94 -11
  37. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
  38. package/dist/lib/navigationboard/NavigationButton.d.ts +54 -0
  39. package/dist/lib/navigationboard/NavigationButton.js +35 -0
  40. package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
  41. package/dist/lib/navigationboard/NavigationField.css +7 -7
  42. package/dist/lib/navigationboard/NavigationField.js.map +1 -1
  43. package/dist/lib/navigationboard/NavigationToolbar.css +16 -13
  44. package/dist/lib/navigationboard/NavigationToolbar.d.ts +3 -10
  45. package/dist/lib/navigationboard/NavigationToolbar.js +31 -82
  46. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
  47. package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
  48. package/dist/lib/navigationboard/iconPaths.js +91 -0
  49. package/dist/lib/navigationboard/iconPaths.js.map +1 -0
  50. package/dist/lib/sanitization.js.map +1 -1
  51. package/dist/lib/types.js.map +1 -1
  52. package/dist/lib/util.js.map +1 -1
  53. package/doc_src/demo/PageChessboardBase.tsx +115 -115
  54. package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
  55. package/doc_src/demo/PageChessboardMove.tsx +173 -173
  56. package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
  57. package/doc_src/demo/PageMovetextBase.tsx +180 -180
  58. package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
  59. package/doc_src/demo/PageNavigationBoardBase.tsx +144 -137
  60. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +69 -69
  61. package/doc_src/demo/decs.d.ts +4 -4
  62. package/doc_src/demo/demo.css +12 -12
  63. package/doc_src/demo/util.ts +1 -1
  64. package/doc_src/examples/NavigationBoard.md +1 -1
  65. package/doc_src/theming/LogoRenderer.js +13 -13
  66. package/doc_src/theming/theming.css +5 -5
  67. package/package.json +95 -95
  68. package/scripts/doc.styleguide.config.js +131 -131
  69. package/scripts/doc.tsconfig.json +5 -5
  70. package/scripts/docker-compose.yml +1 -1
  71. package/scripts/test-graphic.tsconfig.json +5 -5
  72. package/scripts/test-graphic.webpack.config.js +57 -57
  73. package/scripts/test-headless.webpack.config.js +29 -29
  74. package/src/chessboard/BoardProperties.ts +68 -68
  75. package/src/chessboard/Chessboard.css +13 -13
  76. package/src/chessboard/Chessboard.tsx +380 -380
  77. package/src/chessboard/ChessboardImpl.tsx +557 -557
  78. package/src/chessboard/Draggable.tsx +185 -185
  79. package/src/chessboard/Motion.tsx +67 -67
  80. package/src/chessboard/colorsets.ts +66 -66
  81. package/src/chessboard/piecesets.ts +84 -84
  82. package/src/decs.d.ts +2 -2
  83. package/src/errorbox/ErrorBox.css +18 -18
  84. package/src/errorbox/ErrorBox.tsx +75 -75
  85. package/src/errorbox/parsing.tsx +95 -95
  86. package/src/exception.ts +17 -17
  87. package/src/i18n.ts +1 -0
  88. package/src/icons/AnnotationSymbolShape.css +6 -6
  89. package/src/icons/AnnotationSymbolShape.tsx +31 -31
  90. package/src/icons/ArrowMarkerIcon.tsx +34 -34
  91. package/src/icons/ArrowTip.tsx +14 -14
  92. package/src/icons/ChessPieceIcon.tsx +45 -45
  93. package/src/icons/SquareMarkerIcon.tsx +20 -20
  94. package/src/icons/TextMarkerIcon.tsx +29 -29
  95. package/src/icons/arrow.css +1 -1
  96. package/src/index.ts +3 -2
  97. package/src/movetext/Movetext.css +27 -27
  98. package/src/movetext/Movetext.tsx +158 -158
  99. package/src/movetext/MovetextImpl.tsx +345 -345
  100. package/src/movetext/fonts.css +7 -7
  101. package/src/movetext/htmlFilter.tsx +129 -129
  102. package/src/movetext/moveFormatter.tsx +37 -37
  103. package/src/navigationboard/NavigationBoard.tsx +297 -178
  104. package/src/navigationboard/NavigationButton.ts +72 -0
  105. package/src/navigationboard/NavigationField.css +7 -7
  106. package/src/navigationboard/NavigationField.tsx +90 -90
  107. package/src/navigationboard/NavigationToolbar.css +16 -13
  108. package/src/navigationboard/NavigationToolbar.tsx +60 -117
  109. package/src/navigationboard/iconPaths.ts +98 -0
  110. package/src/sanitization.ts +17 -17
  111. package/src/types.ts +116 -116
  112. package/src/util.ts +11 -11
  113. package/test/01_types.js +167 -167
  114. package/test/02_chessboard_util.js +114 -114
  115. package/test/03_error_box_graphic.js +16 -16
  116. package/test/04_icons_graphic.js +32 -32
  117. package/test/05_chessboard_graphic.js +60 -60
  118. package/test/06_chessboard_animation.js +36 -36
  119. package/test/07_chessboard_interaction.js +101 -101
  120. package/test/08_chessboard_play_moves.js +62 -62
  121. package/test/09_chessboard_small_screens.js +32 -32
  122. package/test/10_movetext_graphic.js +32 -32
  123. package/test/11_movetext_interaction.js +100 -100
  124. package/test/12_navigation_board_base.js +151 -0
  125. package/test/13_navigation_board_graphic.js +68 -0
  126. package/test/14_navigation_board_autoplay.js +100 -0
  127. package/test/common/graphic.js +106 -97
  128. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  129. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_1.png → 12_navigation_board_base/controlled/forbidden_navigation_0.png} +0 -0
  130. package/test/graphic_references/{12_navigation_board/controlled/invalid_node_id.png → 12_navigation_board_base/controlled/forbidden_navigation_1.png} +0 -0
  131. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_0.png → 12_navigation_board_base/controlled/invalid_node_id.png} +0 -0
  132. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  133. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/no_callback_defined_1.png +0 -0
  134. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/overriding_initial_node_id.png +0 -0
  135. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_1.png → 12_navigation_board_base/controlled/regular_navigation_0.png} +0 -0
  136. package/test/graphic_references/{12_navigation_board/uncontrolled/initial_state_at_specific_id.png → 12_navigation_board_base/controlled/regular_navigation_1.png} +0 -0
  137. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_3.png → 12_navigation_board_base/controlled/regular_navigation_2.png} +0 -0
  138. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_0.png → 12_navigation_board_base/controlled/regular_navigation_3.png} +0 -0
  139. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_2.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png} +0 -0
  140. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png} +0 -0
  141. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_1.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png} +0 -0
  142. package/test/graphic_references/{12_navigation_board/controlled/no_callback_defined_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png} +0 -0
  143. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  144. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  145. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_at_end.png +0 -0
  146. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  147. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default.png +0 -0
  148. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default_with_game_index.png +0 -0
  149. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_on_null-move.png +0 -0
  150. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_0.png +0 -0
  151. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  152. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_2.png +0 -0
  153. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_3.png +0 -0
  154. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_4.png +0 -0
  155. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_0.png +0 -0
  156. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_1.png +0 -0
  157. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_0.png +0 -0
  158. package/test/graphic_references/{12_navigation_board/controlled/default.png → 12_navigation_board_base/uncontrolled/regular_navigation_1.png} +0 -0
  159. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_2.png +0 -0
  160. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  161. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_4.png +0 -0
  162. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_5.png +0 -0
  163. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  164. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  165. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  166. package/test/graphic_references/{12_navigation_board/uncontrolled/regular_navigation_3.png → 13_navigation_board_graphic/additional_buttons/single_button.png} +0 -0
  167. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_1.png +0 -0
  168. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_2.png +0 -0
  169. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png +0 -0
  170. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  171. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  172. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  173. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  174. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  175. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_1.png → 14_navigation_board_autoplay/controlled/after_reaching_the_end.png} +0 -0
  176. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_2.png → 14_navigation_board_autoplay/controlled/already_at_the_end.png} +0 -0
  177. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  178. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  179. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_0.png → 14_navigation_board_autoplay/controlled/initial_state_at_the_end.png} +0 -0
  180. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  181. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  182. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  183. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  184. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  185. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  186. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  187. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  188. package/test/graphic_references/{12_navigation_board/uncontrolled/navigation_with_keys_1.png → 14_navigation_board_autoplay/uncontrolled/initial_state_default.png} +0 -0
  189. package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
  190. package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
  191. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
  192. package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
  193. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
  194. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
  195. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
  196. package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
  197. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -12
  198. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
  199. package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
  200. package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
  201. package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
  202. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
  203. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
  204. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
  205. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
  206. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
  207. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
  208. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
  209. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
  210. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +9 -9
  211. package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
  212. package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
  213. package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +1 -1
  214. package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
  215. package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -10
  216. package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
  217. package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -11
  218. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/controlled.tsx +5 -5
  219. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/uncontrolled.tsx +7 -7
  220. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
  221. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/error.tsx +2 -2
  222. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/theme.tsx +4 -4
  223. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
  224. package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
  225. package/test/graphic_test_app/common/decs.d.ts +2 -2
  226. package/test/graphic_test_app/common/test_app.css +15 -15
  227. package/test/graphic_test_app/common/test_app.tsx +48 -48
  228. package/tsconfig.json +13 -13
  229. package/test/12_navigation_board.js +0 -168
  230. package/test/graphic_references/12_navigation_board/controlled/regular_navigation_2.png +0 -0
  231. package/test/graphic_references/12_navigation_board/theme/small.png +0 -0
  232. package/test/graphic_references/12_navigation_board/uncontrolled/regular_navigation_1.png +0 -0
  233. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/pgn_parsing_error.png +0 -0
  234. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/wrong_game_type.png +0 -0
@@ -48,190 +48,190 @@ import invalidGame from './game-invalid.pgn';
48
48
 
49
49
 
50
50
  interface PageState {
51
- pgn: string;
52
- headerVisible: boolean;
53
- diagramVisible: boolean;
54
- pieceSymbols: 'native' | 'figurines' | 'custom';
55
- customSymbols: PieceSymbolMapping;
56
- diagramOptions: {
57
- flipped: boolean;
58
- squareSize: number;
59
- coordinateVisible: boolean;
60
- turnVisible: boolean;
61
- colorset: string;
62
- pieceset: string;
63
- };
51
+ pgn: string;
52
+ headerVisible: boolean;
53
+ diagramVisible: boolean;
54
+ pieceSymbols: 'native' | 'figurines' | 'custom';
55
+ customSymbols: PieceSymbolMapping;
56
+ diagramOptions: {
57
+ flipped: boolean;
58
+ squareSize: number;
59
+ coordinateVisible: boolean;
60
+ turnVisible: boolean;
61
+ colorset: string;
62
+ pieceset: string;
63
+ };
64
64
  }
65
65
 
66
66
 
67
67
  export default class Page extends React.Component<object, PageState> {
68
68
 
69
- constructor(props: object) {
70
- super(props);
71
- this.state = {
72
- pgn: game1,
73
- headerVisible: true,
74
- diagramVisible: true,
75
- pieceSymbols: 'figurines',
76
- customSymbols: { K:'R', Q:'D', R:'T', B:'F', N:'C', P:'P' },
77
- diagramOptions: {
78
- flipped: false,
79
- squareSize: 32,
80
- coordinateVisible: true,
81
- turnVisible: true,
82
- colorset: 'original',
83
- pieceset: 'cburnett',
84
- },
85
- };
86
- }
87
-
88
- render() {
89
- return (
90
- <Stack spacing={2} mt={2}>
91
- {this.renderControls()}
92
- {this.renderMovetext()}
93
- {this.renderCode()}
94
- </Stack>
95
- );
96
- }
97
-
98
- private renderControls() {
99
- const opts = this.state.diagramOptions;
100
- return (<>
101
- <Stack direction="row" spacing={2} alignItems="center">
102
- <ButtonGroup color="primary" size="small">
103
- <Button onClick={() => this.setState({ pgn: game1 })}>Game 1</Button>
104
- <Button onClick={() => this.setState({ pgn: game2 })}>Game 2</Button>
105
- <Button onClick={() => this.setState({ pgn: invalidGame })}>Invalid game</Button>
106
- </ButtonGroup>
107
- <FormControlLabel label="Show headers"
108
- control={<Switch checked={this.state.headerVisible} onChange={() => this.setState({ headerVisible: !this.state.headerVisible })} color="primary" />}
109
- />
110
- <FormControlLabel label="Show diagrams"
111
- control={<Switch checked={this.state.diagramVisible} onChange={() => this.setState({ diagramVisible: !this.state.diagramVisible })} color="primary" />}
112
- />
113
- </Stack>
114
- <Stack direction="row" spacing={2} alignItems="center">
115
- <FormControl variant="standard">
116
- <InputLabel id="piecesymbols-label">Piece symbols</InputLabel>
117
- <Select labelId="piecesymbols-label" sx={{ width: '8em' }} value={this.state.pieceSymbols}
118
- onChange={evt => this.setState({ pieceSymbols: evt.target.value as PageState['pieceSymbols'] })}
119
- >
120
- <MenuItem value="native">Native</MenuItem>
121
- <MenuItem value="figurines">Figurines</MenuItem>
122
- <MenuItem value="custom">Custom</MenuItem>
123
- </Select>
124
- </FormControl>
125
- {this.renderCustomSymbolSelector()}
126
- </Stack>
127
- <Stack direction="row" spacing={2} alignItems="center">
128
- <FormControlLabel label="Flip diagram(s)"
129
- control={<Switch checked={opts.flipped} onChange={() => this.setDiagramOption({ flipped: !opts.flipped })} color="primary" />}
130
- />
131
- <FormControlLabel label="Show coordinates in diagram(s)"
132
- control={<Switch checked={opts.coordinateVisible} onChange={() => this.setDiagramOption({ coordinateVisible: !opts.coordinateVisible })} color="primary" />}
133
- />
134
- <FormControlLabel label="Show turn in diagram(s)"
135
- control={<Switch checked={opts.turnVisible} onChange={() => this.setDiagramOption({ turnVisible: !opts.turnVisible })} color="primary" />}
136
- />
137
- </Stack>
138
- <Stack direction="row" spacing={2} alignItems="center">
139
- <FormControl variant="standard">
140
- <InputLabel id="colorset-label">Colorset</InputLabel>
141
- <Select labelId="colorset-label" sx={{ width: '8em' }} value={opts.colorset} onChange={evt => this.setDiagramOption({ colorset: evt.target.value })}>
142
- {Object.keys(Chessboard.colorsets()).sort().map(colorset => <MenuItem key={colorset} value={colorset}>{colorset}</MenuItem>)}
143
- </Select>
144
- </FormControl>
145
- <FormControl variant="standard">
146
- <InputLabel id="pieceset-label">Pieceset</InputLabel>
147
- <Select labelId="pieceset-label" sx={{ width: '8em' }} value={opts.pieceset} onChange={evt => this.setDiagramOption({ pieceset: evt.target.value })}>
148
- {Object.keys(Chessboard.piecesets()).sort().map(pieceset => <MenuItem key={pieceset} value={pieceset}>{pieceset}</MenuItem>)}
149
- </Select>
150
- </FormControl>
151
- </Stack>
152
- <Box>
153
- <Typography gutterBottom>Diagram square size</Typography>
154
- <Slider
155
- value={opts.squareSize} onChange={(_, newValue) => this.setDiagramOption({ squareSize: newValue as number })}
156
- min={Chessboard.minSquareSize()} max={Chessboard.maxSquareSize()} step={1} valueLabelDisplay="on" color="primary"
157
- />
158
- </Box>
159
- </>);
160
- }
161
-
162
- private renderCustomSymbolSelector() {
163
- if (this.state.pieceSymbols !== 'custom') {
164
- return undefined;
165
- }
166
- const symbols = this.state.customSymbols;
167
- return (<>
168
- <TextField variant="standard" sx={{ width: '3em' }} label="King" value={symbols.K} onChange={evt => this.handleCustomSymbolChanged('K', evt.target.value)} />
169
- <TextField variant="standard" sx={{ width: '3em' }} label="Queen" value={symbols.Q} onChange={evt => this.handleCustomSymbolChanged('Q', evt.target.value)} />
170
- <TextField variant="standard" sx={{ width: '3em' }} label="Rook" value={symbols.R} onChange={evt => this.handleCustomSymbolChanged('R', evt.target.value)} />
171
- <TextField variant="standard" sx={{ width: '3em' }} label="Bishop" value={symbols.B} onChange={evt => this.handleCustomSymbolChanged('B', evt.target.value)} />
172
- <TextField variant="standard" sx={{ width: '3em' }} label="Knight" value={symbols.N} onChange={evt => this.handleCustomSymbolChanged('N', evt.target.value)} />
173
- <TextField variant="standard" sx={{ width: '3em' }} label="Pawn" value={symbols.P} onChange={evt => this.handleCustomSymbolChanged('P', evt.target.value)} />
174
- </>);
175
- }
176
-
177
- private renderMovetext() {
178
- return (
179
- <Box>
180
- <Movetext
181
- game={this.state.pgn}
182
- headerVisible={this.state.headerVisible}
183
- diagramVisible={this.state.diagramVisible}
184
- pieceSymbols={this.state.pieceSymbols === 'custom' ? this.state.customSymbols : this.state.pieceSymbols}
185
- diagramOptions={this.state.diagramOptions}
186
- />
187
- </Box>
188
- );
189
- }
190
-
191
- private renderCode() {
192
- const attributes: string[] = [];
193
- attributes.push('game={pgn}');
194
- attributes.push(`headerVisible={${this.state.headerVisible}}`);
195
- attributes.push(`pieceSymbols=${this.getPieceSymbolsAsText()}`);
196
- attributes.push(`diagramVisible={${this.state.diagramVisible}}`);
197
- attributes.push(`diagramOptions={{ ${this.getDiagramAttributesAsText()} }}`);
198
- const pgnDeclaration = 'const pgn = `\n' + this.state.pgn.trim() + '`;\n\n';
199
- return <pre className="kokopu-demoCode">{pgnDeclaration + buildComponentDemoCode('Movetext', attributes)}</pre>;
200
- }
201
-
202
- private handleCustomSymbolChanged(key: keyof PieceSymbolMapping, value: string) {
203
- const symbols = { ...this.state.customSymbols };
204
- symbols[key] = value;
205
- this.setState({ customSymbols: symbols });
206
- }
207
-
208
- private setDiagramOption(opts: Partial<PageState['diagramOptions']>) {
209
- const diagramOptions = { ...this.state.diagramOptions };
210
- Object.assign(diagramOptions, opts);
211
- this.setState({ diagramOptions: diagramOptions });
212
- }
213
-
214
- private getPieceSymbolsAsText() {
215
- if (this.state.pieceSymbols === 'custom') {
216
- const symbols = this.state.customSymbols;
217
- return `{{ K:'${symbols.K}', Q:'${symbols.Q}', R:'${symbols.R}', B:'${symbols.B}', N:'${symbols.N}', P:'${symbols.P}' }}`;
218
- }
219
- else {
220
- return `"${this.state.pieceSymbols}"`;
221
- }
222
- }
223
-
224
- private getDiagramAttributesAsText() {
225
- const attributes: string[] = [];
226
- if (this.state.diagramOptions.flipped) {
227
- attributes.push('flipped:true');
228
- }
229
- attributes.push(`squareSize:${this.state.diagramOptions.squareSize}`);
230
- attributes.push(`coordinateVisible:${this.state.diagramOptions.coordinateVisible}`);
231
- attributes.push(`turnVisible:${this.state.diagramOptions.turnVisible}`);
232
- attributes.push(`colorset:'${this.state.diagramOptions.colorset}'`);
233
- attributes.push(`pieceset:'${this.state.diagramOptions.pieceset}'`);
234
- return attributes.join(', ');
235
- }
69
+ constructor(props: object) {
70
+ super(props);
71
+ this.state = {
72
+ pgn: game1,
73
+ headerVisible: true,
74
+ diagramVisible: true,
75
+ pieceSymbols: 'figurines',
76
+ customSymbols: { K:'R', Q:'D', R:'T', B:'F', N:'C', P:'P' },
77
+ diagramOptions: {
78
+ flipped: false,
79
+ squareSize: 32,
80
+ coordinateVisible: true,
81
+ turnVisible: true,
82
+ colorset: 'original',
83
+ pieceset: 'cburnett',
84
+ },
85
+ };
86
+ }
87
+
88
+ render() {
89
+ return (
90
+ <Stack spacing={2} mt={2}>
91
+ {this.renderControls()}
92
+ {this.renderMovetext()}
93
+ {this.renderCode()}
94
+ </Stack>
95
+ );
96
+ }
97
+
98
+ private renderControls() {
99
+ const opts = this.state.diagramOptions;
100
+ return (<>
101
+ <Stack direction="row" spacing={2} alignItems="center">
102
+ <ButtonGroup color="primary" size="small">
103
+ <Button onClick={() => this.setState({ pgn: game1 })}>Game 1</Button>
104
+ <Button onClick={() => this.setState({ pgn: game2 })}>Game 2</Button>
105
+ <Button onClick={() => this.setState({ pgn: invalidGame })}>Invalid game</Button>
106
+ </ButtonGroup>
107
+ <FormControlLabel label="Show headers"
108
+ control={<Switch checked={this.state.headerVisible} onChange={() => this.setState({ headerVisible: !this.state.headerVisible })} color="primary" />}
109
+ />
110
+ <FormControlLabel label="Show diagrams"
111
+ control={<Switch checked={this.state.diagramVisible} onChange={() => this.setState({ diagramVisible: !this.state.diagramVisible })} color="primary" />}
112
+ />
113
+ </Stack>
114
+ <Stack direction="row" spacing={2} alignItems="center">
115
+ <FormControl variant="standard">
116
+ <InputLabel id="piecesymbols-label">Piece symbols</InputLabel>
117
+ <Select labelId="piecesymbols-label" sx={{ width: '8em' }} value={this.state.pieceSymbols}
118
+ onChange={evt => this.setState({ pieceSymbols: evt.target.value as PageState['pieceSymbols'] })}
119
+ >
120
+ <MenuItem value="native">Native</MenuItem>
121
+ <MenuItem value="figurines">Figurines</MenuItem>
122
+ <MenuItem value="custom">Custom</MenuItem>
123
+ </Select>
124
+ </FormControl>
125
+ {this.renderCustomSymbolSelector()}
126
+ </Stack>
127
+ <Stack direction="row" spacing={2} alignItems="center">
128
+ <FormControlLabel label="Flip diagram(s)"
129
+ control={<Switch checked={opts.flipped} onChange={() => this.setDiagramOption({ flipped: !opts.flipped })} color="primary" />}
130
+ />
131
+ <FormControlLabel label="Show coordinates in diagram(s)"
132
+ control={<Switch checked={opts.coordinateVisible} onChange={() => this.setDiagramOption({ coordinateVisible: !opts.coordinateVisible })} color="primary" />}
133
+ />
134
+ <FormControlLabel label="Show turn in diagram(s)"
135
+ control={<Switch checked={opts.turnVisible} onChange={() => this.setDiagramOption({ turnVisible: !opts.turnVisible })} color="primary" />}
136
+ />
137
+ </Stack>
138
+ <Stack direction="row" spacing={2} alignItems="center">
139
+ <FormControl variant="standard">
140
+ <InputLabel id="colorset-label">Colorset</InputLabel>
141
+ <Select labelId="colorset-label" sx={{ width: '8em' }} value={opts.colorset} onChange={evt => this.setDiagramOption({ colorset: evt.target.value })}>
142
+ {Object.keys(Chessboard.colorsets()).sort().map(colorset => <MenuItem key={colorset} value={colorset}>{colorset}</MenuItem>)}
143
+ </Select>
144
+ </FormControl>
145
+ <FormControl variant="standard">
146
+ <InputLabel id="pieceset-label">Pieceset</InputLabel>
147
+ <Select labelId="pieceset-label" sx={{ width: '8em' }} value={opts.pieceset} onChange={evt => this.setDiagramOption({ pieceset: evt.target.value })}>
148
+ {Object.keys(Chessboard.piecesets()).sort().map(pieceset => <MenuItem key={pieceset} value={pieceset}>{pieceset}</MenuItem>)}
149
+ </Select>
150
+ </FormControl>
151
+ </Stack>
152
+ <Box>
153
+ <Typography gutterBottom>Diagram square size</Typography>
154
+ <Slider
155
+ value={opts.squareSize} onChange={(_, newValue) => this.setDiagramOption({ squareSize: newValue as number })}
156
+ min={Chessboard.minSquareSize()} max={Chessboard.maxSquareSize()} step={1} valueLabelDisplay="on" color="primary"
157
+ />
158
+ </Box>
159
+ </>);
160
+ }
161
+
162
+ private renderCustomSymbolSelector() {
163
+ if (this.state.pieceSymbols !== 'custom') {
164
+ return undefined;
165
+ }
166
+ const symbols = this.state.customSymbols;
167
+ return (<>
168
+ <TextField variant="standard" sx={{ width: '3em' }} label="King" value={symbols.K} onChange={evt => this.handleCustomSymbolChanged('K', evt.target.value)} />
169
+ <TextField variant="standard" sx={{ width: '3em' }} label="Queen" value={symbols.Q} onChange={evt => this.handleCustomSymbolChanged('Q', evt.target.value)} />
170
+ <TextField variant="standard" sx={{ width: '3em' }} label="Rook" value={symbols.R} onChange={evt => this.handleCustomSymbolChanged('R', evt.target.value)} />
171
+ <TextField variant="standard" sx={{ width: '3em' }} label="Bishop" value={symbols.B} onChange={evt => this.handleCustomSymbolChanged('B', evt.target.value)} />
172
+ <TextField variant="standard" sx={{ width: '3em' }} label="Knight" value={symbols.N} onChange={evt => this.handleCustomSymbolChanged('N', evt.target.value)} />
173
+ <TextField variant="standard" sx={{ width: '3em' }} label="Pawn" value={symbols.P} onChange={evt => this.handleCustomSymbolChanged('P', evt.target.value)} />
174
+ </>);
175
+ }
176
+
177
+ private renderMovetext() {
178
+ return (
179
+ <Box>
180
+ <Movetext
181
+ game={this.state.pgn}
182
+ headerVisible={this.state.headerVisible}
183
+ diagramVisible={this.state.diagramVisible}
184
+ pieceSymbols={this.state.pieceSymbols === 'custom' ? this.state.customSymbols : this.state.pieceSymbols}
185
+ diagramOptions={this.state.diagramOptions}
186
+ />
187
+ </Box>
188
+ );
189
+ }
190
+
191
+ private renderCode() {
192
+ const attributes: string[] = [];
193
+ attributes.push('game={pgn}');
194
+ attributes.push(`headerVisible={${this.state.headerVisible}}`);
195
+ attributes.push(`pieceSymbols=${this.getPieceSymbolsAsText()}`);
196
+ attributes.push(`diagramVisible={${this.state.diagramVisible}}`);
197
+ attributes.push(`diagramOptions={{ ${this.getDiagramAttributesAsText()} }}`);
198
+ const pgnDeclaration = 'const pgn = `\n' + this.state.pgn.trim() + '`;\n\n';
199
+ return <pre className="kokopu-demoCode">{pgnDeclaration + buildComponentDemoCode('Movetext', attributes)}</pre>;
200
+ }
201
+
202
+ private handleCustomSymbolChanged(key: keyof PieceSymbolMapping, value: string) {
203
+ const symbols = { ...this.state.customSymbols };
204
+ symbols[key] = value;
205
+ this.setState({ customSymbols: symbols });
206
+ }
207
+
208
+ private setDiagramOption(opts: Partial<PageState['diagramOptions']>) {
209
+ const diagramOptions = { ...this.state.diagramOptions };
210
+ Object.assign(diagramOptions, opts);
211
+ this.setState({ diagramOptions: diagramOptions });
212
+ }
213
+
214
+ private getPieceSymbolsAsText() {
215
+ if (this.state.pieceSymbols === 'custom') {
216
+ const symbols = this.state.customSymbols;
217
+ return `{{ K:'${symbols.K}', Q:'${symbols.Q}', R:'${symbols.R}', B:'${symbols.B}', N:'${symbols.N}', P:'${symbols.P}' }}`;
218
+ }
219
+ else {
220
+ return `"${this.state.pieceSymbols}"`;
221
+ }
222
+ }
223
+
224
+ private getDiagramAttributesAsText() {
225
+ const attributes: string[] = [];
226
+ if (this.state.diagramOptions.flipped) {
227
+ attributes.push('flipped:true');
228
+ }
229
+ attributes.push(`squareSize:${this.state.diagramOptions.squareSize}`);
230
+ attributes.push(`coordinateVisible:${this.state.diagramOptions.coordinateVisible}`);
231
+ attributes.push(`turnVisible:${this.state.diagramOptions.turnVisible}`);
232
+ attributes.push(`colorset:'${this.state.diagramOptions.colorset}'`);
233
+ attributes.push(`pieceset:'${this.state.diagramOptions.pieceset}'`);
234
+ return attributes.join(', ');
235
+ }
236
236
 
237
237
  }
@@ -44,133 +44,133 @@ import game2 from './game-2.pgn';
44
44
 
45
45
 
46
46
  interface PageState {
47
- pgn: string;
48
- selection: string;
49
- interactionMode: 'none' | 'selectMove';
50
- withPopup: boolean;
51
- withMove: boolean;
47
+ pgn: string;
48
+ selection: string;
49
+ interactionMode: 'none' | 'selectMove';
50
+ withPopup: boolean;
51
+ withMove: boolean;
52
52
  }
53
53
 
54
54
 
55
55
  export default class Page extends React.Component<object, PageState> {
56
56
 
57
- constructor(props: object) {
58
- super(props);
59
- this.state = {
60
- pgn: game1,
61
- selection: '28b',
62
- interactionMode: 'selectMove',
63
- withPopup: true,
64
- withMove: false,
65
- };
66
- }
67
-
68
- render() {
69
- return (
70
- <Stack spacing={2} mt={2}>
71
- {this.renderControls()}
72
- {this.renderMovetext()}
73
- {this.renderCode()}
74
- {this.renderNavigationBoard()}
75
- </Stack>
76
- );
77
- }
78
-
79
- private renderControls() {
80
- return (<>
81
- <Stack direction="row" spacing={2} alignItems="center">
82
- <ButtonGroup color="primary" size="small">
83
- <Button onClick={() => this.setState({ pgn: game1, selection: '28b' })}>Game 1</Button>
84
- <Button onClick={() => this.setState({ pgn: game2, selection: '15b' })}>Game 2</Button>
85
- </ButtonGroup>
86
- </Stack>
87
- <Box>
88
- <Typography gutterBottom>Interaction mode</Typography>
89
- <RadioGroup value={this.state.interactionMode} onChange={evt => this.setState({ interactionMode: evt.target.value as PageState['interactionMode'] })}>
90
- <FormControlLabel value="none" control={<Radio color="primary" />} label="None" />
91
- <FormControlLabel value="selectMove" control={<Radio color="primary" />} label="Select moves" />
92
- </RadioGroup>
93
- </Box>
94
- </>);
95
- }
96
-
97
- private renderMovetext() {
98
- return (
99
- <Box>
100
- <Movetext
101
- game={this.state.pgn}
102
- selection={this.state.selection}
103
- pieceSymbols="figurines"
104
- diagramVisible={false}
105
- interactionMode={this.getMovetextInterationMode()}
106
- onMoveSelected={(nodeId, evtOrigin) => this.handleMoveSelected(nodeId, evtOrigin)}
107
- />
108
- </Box>
109
- );
110
- }
111
-
112
- private renderCode() {
113
- const attributes: string[] = [];
114
- attributes.push('game={pgn}');
115
- attributes.push('pieceSymbols="figurines"');
116
- attributes.push('diagramVisible={false}');
117
- attributes.push(`selection="${this.state.selection}"`);
118
- switch (this.state.interactionMode) {
119
- case 'selectMove':
120
- attributes.push('interactionMode="selectMove"');
121
- attributes.push('onMoveSelected={nodeId => handleMoveSelected(nodeId)}');
122
- break;
123
- default:
124
- break;
125
- }
126
- const pgnDeclaration = 'const pgn = `\n' + this.state.pgn.trim() + '`;\n\n';
127
- return <pre className="kokopu-demoCode">{pgnDeclaration + buildComponentDemoCode('Movetext', attributes)}</pre>;
128
- }
129
-
130
- private renderNavigationBoard() {
131
- const button = <Button size="small" onClick={() => this.setState({ withPopup: !this.state.withPopup })}>{this.state.withPopup ? 'Reduce' : 'Open'}</Button>;
132
- const { position, move, csl, cal } = this.getCurrentPositionAndAnnotations();
133
- const content = this.state.withPopup ?
134
- <Stack><Chessboard position={position} move={move} squareMarkers={csl} arrowMarkers={cal} animated={true} />{button}</Stack> :
135
- button;
136
- return <Paper className="kokopu-fixedPopup" elevation={3}>{content}</Paper>;
137
- }
138
-
139
- private handleMoveSelected(nodeId: string | undefined, evtOrigin: MoveSelectEventOrigin) {
140
- if (nodeId) {
141
- this.setState({ selection: nodeId, withMove: evtOrigin === 'key-next' });
142
- }
143
- }
144
-
145
- private getMovetextInterationMode(): MovetextProps['interactionMode'] {
146
- switch (this.state.interactionMode) {
147
- case 'selectMove':
148
- return this.state.interactionMode;
149
- default:
150
- return undefined;
151
- }
152
- }
153
-
154
- private getCurrentPositionAndAnnotations() {
155
- const game = pgnRead(this.state.pgn, 0);
156
- if (this.state.selection === 'start') {
157
- const mainVariation = game.mainVariation();
158
- return {
159
- position: mainVariation.initialPosition(),
160
- move: undefined,
161
- csl: mainVariation.tag('csl'),
162
- cal: mainVariation.tag('cal'),
163
- };
164
- }
165
- else {
166
- const node = game.findById(this.state.selection) as GameNode;
167
- return {
168
- position: this.state.withMove ? node.positionBefore() : node.position(),
169
- move: this.state.withMove ? node.notation() : undefined,
170
- csl: node.tag('csl'),
171
- cal: node.tag('cal'),
172
- };
173
- }
174
- }
57
+ constructor(props: object) {
58
+ super(props);
59
+ this.state = {
60
+ pgn: game1,
61
+ selection: '28b',
62
+ interactionMode: 'selectMove',
63
+ withPopup: true,
64
+ withMove: false,
65
+ };
66
+ }
67
+
68
+ render() {
69
+ return (
70
+ <Stack spacing={2} mt={2}>
71
+ {this.renderControls()}
72
+ {this.renderMovetext()}
73
+ {this.renderCode()}
74
+ {this.renderNavigationBoard()}
75
+ </Stack>
76
+ );
77
+ }
78
+
79
+ private renderControls() {
80
+ return (<>
81
+ <Stack direction="row" spacing={2} alignItems="center">
82
+ <ButtonGroup color="primary" size="small">
83
+ <Button onClick={() => this.setState({ pgn: game1, selection: '28b' })}>Game 1</Button>
84
+ <Button onClick={() => this.setState({ pgn: game2, selection: '15b' })}>Game 2</Button>
85
+ </ButtonGroup>
86
+ </Stack>
87
+ <Box>
88
+ <Typography gutterBottom>Interaction mode</Typography>
89
+ <RadioGroup value={this.state.interactionMode} onChange={evt => this.setState({ interactionMode: evt.target.value as PageState['interactionMode'] })}>
90
+ <FormControlLabel value="none" control={<Radio color="primary" />} label="None" />
91
+ <FormControlLabel value="selectMove" control={<Radio color="primary" />} label="Select moves" />
92
+ </RadioGroup>
93
+ </Box>
94
+ </>);
95
+ }
96
+
97
+ private renderMovetext() {
98
+ return (
99
+ <Box>
100
+ <Movetext
101
+ game={this.state.pgn}
102
+ selection={this.state.selection}
103
+ pieceSymbols="figurines"
104
+ diagramVisible={false}
105
+ interactionMode={this.getMovetextInterationMode()}
106
+ onMoveSelected={(nodeId, evtOrigin) => this.handleMoveSelected(nodeId, evtOrigin)}
107
+ />
108
+ </Box>
109
+ );
110
+ }
111
+
112
+ private renderCode() {
113
+ const attributes: string[] = [];
114
+ attributes.push('game={pgn}');
115
+ attributes.push('pieceSymbols="figurines"');
116
+ attributes.push('diagramVisible={false}');
117
+ attributes.push(`selection="${this.state.selection}"`);
118
+ switch (this.state.interactionMode) {
119
+ case 'selectMove':
120
+ attributes.push('interactionMode="selectMove"');
121
+ attributes.push('onMoveSelected={nodeId => handleMoveSelected(nodeId)}');
122
+ break;
123
+ default:
124
+ break;
125
+ }
126
+ const pgnDeclaration = 'const pgn = `\n' + this.state.pgn.trim() + '`;\n\n';
127
+ return <pre className="kokopu-demoCode">{pgnDeclaration + buildComponentDemoCode('Movetext', attributes)}</pre>;
128
+ }
129
+
130
+ private renderNavigationBoard() {
131
+ const button = <Button size="small" onClick={() => this.setState({ withPopup: !this.state.withPopup })}>{this.state.withPopup ? 'Reduce' : 'Open'}</Button>;
132
+ const { position, move, csl, cal } = this.getCurrentPositionAndAnnotations();
133
+ const content = this.state.withPopup ?
134
+ <Stack><Chessboard position={position} move={move} squareMarkers={csl} arrowMarkers={cal} animated={true} />{button}</Stack> :
135
+ button;
136
+ return <Paper className="kokopu-fixedPopup" elevation={3}>{content}</Paper>;
137
+ }
138
+
139
+ private handleMoveSelected(nodeId: string | undefined, evtOrigin: MoveSelectEventOrigin) {
140
+ if (nodeId) {
141
+ this.setState({ selection: nodeId, withMove: evtOrigin === 'key-next' });
142
+ }
143
+ }
144
+
145
+ private getMovetextInterationMode(): MovetextProps['interactionMode'] {
146
+ switch (this.state.interactionMode) {
147
+ case 'selectMove':
148
+ return this.state.interactionMode;
149
+ default:
150
+ return undefined;
151
+ }
152
+ }
153
+
154
+ private getCurrentPositionAndAnnotations() {
155
+ const game = pgnRead(this.state.pgn, 0);
156
+ if (this.state.selection === 'start') {
157
+ const mainVariation = game.mainVariation();
158
+ return {
159
+ position: mainVariation.initialPosition(),
160
+ move: undefined,
161
+ csl: mainVariation.tag('csl'),
162
+ cal: mainVariation.tag('cal'),
163
+ };
164
+ }
165
+ else {
166
+ const node = game.findById(this.state.selection) as GameNode;
167
+ return {
168
+ position: this.state.withMove ? node.positionBefore() : node.position(),
169
+ move: this.state.withMove ? node.notation() : undefined,
170
+ csl: node.tag('csl'),
171
+ cal: node.tag('cal'),
172
+ };
173
+ }
174
+ }
175
175
 
176
176
  }