kokopu-react 3.1.0 → 3.3.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 (236) hide show
  1. package/.eslintrc.yml +1 -1
  2. package/CHANGELOG.md +10 -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.d.ts +27 -2
  6. package/dist/lib/chessboard/Chessboard.js +36 -17
  7. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  8. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  9. package/dist/lib/chessboard/Draggable.js.map +1 -1
  10. package/dist/lib/chessboard/Motion.js.map +1 -1
  11. package/dist/lib/chessboard/colorsets.js.map +1 -1
  12. package/dist/lib/chessboard/piecesets.js.map +1 -1
  13. package/dist/lib/errorbox/ErrorBox.css +18 -18
  14. package/dist/lib/errorbox/ErrorBox.js.map +1 -1
  15. package/dist/lib/errorbox/parsing.js.map +1 -1
  16. package/dist/lib/exception.js.map +1 -1
  17. package/dist/lib/i18n.d.ts +1 -0
  18. package/dist/lib/i18n.js +1 -0
  19. package/dist/lib/i18n.js.map +1 -1
  20. package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
  21. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
  22. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  23. package/dist/lib/icons/ArrowTip.js.map +1 -1
  24. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  25. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  26. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  27. package/dist/lib/icons/arrow.css +1 -1
  28. package/dist/lib/index.d.ts +1 -0
  29. package/dist/lib/index.js +1 -0
  30. package/dist/lib/index.js.map +1 -1
  31. package/dist/lib/movetext/Movetext.css +27 -27
  32. package/dist/lib/movetext/Movetext.js.map +1 -1
  33. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  34. package/dist/lib/movetext/fonts.css +7 -7
  35. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  36. package/dist/lib/movetext/moveFormatter.js.map +1 -1
  37. package/dist/lib/navigationboard/NavigationBoard.d.ts +68 -1
  38. package/dist/lib/navigationboard/NavigationBoard.js +141 -13
  39. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
  40. package/dist/lib/navigationboard/NavigationButton.d.ts +66 -0
  41. package/dist/lib/navigationboard/NavigationButton.js +67 -0
  42. package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
  43. package/dist/lib/navigationboard/NavigationField.css +7 -7
  44. package/dist/lib/navigationboard/NavigationField.js.map +1 -1
  45. package/dist/lib/navigationboard/NavigationToolbar.css +16 -13
  46. package/dist/lib/navigationboard/NavigationToolbar.d.ts +10 -10
  47. package/dist/lib/navigationboard/NavigationToolbar.js +61 -79
  48. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
  49. package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
  50. package/dist/lib/navigationboard/iconPaths.js +91 -0
  51. package/dist/lib/navigationboard/iconPaths.js.map +1 -0
  52. package/dist/lib/sanitization.js.map +1 -1
  53. package/dist/lib/types.js.map +1 -1
  54. package/dist/lib/util.js.map +1 -1
  55. package/doc_src/demo/PageChessboardBase.tsx +115 -115
  56. package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
  57. package/doc_src/demo/PageChessboardMove.tsx +173 -173
  58. package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
  59. package/doc_src/demo/PageMovetextBase.tsx +180 -180
  60. package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
  61. package/doc_src/demo/PageNavigationBoardBase.tsx +144 -137
  62. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +69 -69
  63. package/doc_src/demo/decs.d.ts +4 -4
  64. package/doc_src/demo/demo.css +12 -12
  65. package/doc_src/demo/util.ts +1 -1
  66. package/doc_src/examples/NavigationBoard.md +1 -1
  67. package/doc_src/theming/LogoRenderer.js +13 -13
  68. package/doc_src/theming/theming.css +5 -5
  69. package/package.json +95 -95
  70. package/scripts/doc.styleguide.config.js +131 -131
  71. package/scripts/doc.tsconfig.json +5 -5
  72. package/scripts/docker-compose.yml +1 -1
  73. package/scripts/test-graphic.tsconfig.json +5 -5
  74. package/scripts/test-graphic.webpack.config.js +57 -57
  75. package/scripts/test-headless.webpack.config.js +29 -29
  76. package/src/chessboard/BoardProperties.ts +68 -68
  77. package/src/chessboard/Chessboard.css +13 -13
  78. package/src/chessboard/Chessboard.tsx +436 -380
  79. package/src/chessboard/ChessboardImpl.tsx +557 -557
  80. package/src/chessboard/Draggable.tsx +185 -185
  81. package/src/chessboard/Motion.tsx +67 -67
  82. package/src/chessboard/colorsets.ts +66 -66
  83. package/src/chessboard/piecesets.ts +84 -84
  84. package/src/decs.d.ts +2 -2
  85. package/src/errorbox/ErrorBox.css +18 -18
  86. package/src/errorbox/ErrorBox.tsx +75 -75
  87. package/src/errorbox/parsing.tsx +95 -95
  88. package/src/exception.ts +17 -17
  89. package/src/i18n.ts +1 -0
  90. package/src/icons/AnnotationSymbolShape.css +6 -6
  91. package/src/icons/AnnotationSymbolShape.tsx +31 -31
  92. package/src/icons/ArrowMarkerIcon.tsx +34 -34
  93. package/src/icons/ArrowTip.tsx +14 -14
  94. package/src/icons/ChessPieceIcon.tsx +45 -45
  95. package/src/icons/SquareMarkerIcon.tsx +20 -20
  96. package/src/icons/TextMarkerIcon.tsx +29 -29
  97. package/src/icons/arrow.css +1 -1
  98. package/src/index.ts +3 -2
  99. package/src/movetext/Movetext.css +27 -27
  100. package/src/movetext/Movetext.tsx +158 -158
  101. package/src/movetext/MovetextImpl.tsx +345 -345
  102. package/src/movetext/fonts.css +7 -7
  103. package/src/movetext/htmlFilter.tsx +129 -129
  104. package/src/movetext/moveFormatter.tsx +37 -37
  105. package/src/navigationboard/NavigationBoard.tsx +386 -180
  106. package/src/navigationboard/NavigationButton.ts +114 -0
  107. package/src/navigationboard/NavigationField.css +7 -7
  108. package/src/navigationboard/NavigationField.tsx +90 -90
  109. package/src/navigationboard/NavigationToolbar.css +16 -13
  110. package/src/navigationboard/NavigationToolbar.tsx +98 -112
  111. package/src/navigationboard/iconPaths.ts +98 -0
  112. package/src/sanitization.ts +17 -17
  113. package/src/types.ts +116 -116
  114. package/src/util.ts +11 -11
  115. package/test/01_types.js +167 -167
  116. package/test/02_chessboard_util.js +191 -115
  117. package/test/03_error_box_graphic.js +16 -16
  118. package/test/04_icons_graphic.js +32 -32
  119. package/test/05_chessboard_graphic.js +60 -60
  120. package/test/06_chessboard_animation.js +36 -36
  121. package/test/07_chessboard_interaction.js +101 -101
  122. package/test/08_chessboard_play_moves.js +62 -62
  123. package/test/09_chessboard_small_screens.js +32 -32
  124. package/test/10_movetext_graphic.js +32 -32
  125. package/test/11_movetext_interaction.js +100 -100
  126. package/test/12_navigation_board_base.js +151 -0
  127. package/test/13_navigation_board_graphic.js +68 -0
  128. package/test/14_navigation_board_autoplay.js +100 -0
  129. package/test/common/graphic.js +106 -97
  130. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  131. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_1.png → 12_navigation_board_base/controlled/forbidden_navigation_0.png} +0 -0
  132. package/test/graphic_references/{12_navigation_board/controlled/invalid_node_id.png → 12_navigation_board_base/controlled/forbidden_navigation_1.png} +0 -0
  133. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_0.png → 12_navigation_board_base/controlled/invalid_node_id.png} +0 -0
  134. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  135. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/no_callback_defined_1.png +0 -0
  136. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/overriding_initial_node_id.png +0 -0
  137. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_1.png → 12_navigation_board_base/controlled/regular_navigation_0.png} +0 -0
  138. 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
  139. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_3.png → 12_navigation_board_base/controlled/regular_navigation_2.png} +0 -0
  140. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_0.png → 12_navigation_board_base/controlled/regular_navigation_3.png} +0 -0
  141. 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
  142. 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
  143. 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
  144. 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
  145. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  146. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  147. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_at_end.png +0 -0
  148. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  149. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default.png +0 -0
  150. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default_with_game_index.png +0 -0
  151. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_on_null-move.png +0 -0
  152. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_0.png +0 -0
  153. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  154. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_2.png +0 -0
  155. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_3.png +0 -0
  156. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_4.png +0 -0
  157. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_0.png +0 -0
  158. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_1.png +0 -0
  159. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_0.png +0 -0
  160. package/test/graphic_references/{12_navigation_board/controlled/default.png → 12_navigation_board_base/uncontrolled/regular_navigation_1.png} +0 -0
  161. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_2.png +0 -0
  162. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  163. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_4.png +0 -0
  164. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_5.png +0 -0
  165. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  166. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  167. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  168. package/test/graphic_references/{12_navigation_board/uncontrolled/regular_navigation_3.png → 13_navigation_board_graphic/additional_buttons/single_button.png} +0 -0
  169. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_1.png +0 -0
  170. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_2.png +0 -0
  171. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png +0 -0
  172. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  173. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  174. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  175. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  176. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  177. 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
  178. 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
  179. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  180. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  181. 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
  182. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  183. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  184. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  185. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  186. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  187. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  188. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  189. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  190. package/test/graphic_references/{12_navigation_board/uncontrolled/navigation_with_keys_1.png → 14_navigation_board_autoplay/uncontrolled/initial_state_default.png} +0 -0
  191. package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
  192. package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
  193. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
  194. package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
  195. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
  196. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
  197. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
  198. package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
  199. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -12
  200. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
  201. package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
  202. package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
  203. package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
  204. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
  205. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
  206. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
  207. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
  208. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
  209. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
  210. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
  211. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
  212. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +9 -9
  213. package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
  214. package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
  215. package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +1 -1
  216. package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
  217. package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -10
  218. package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
  219. package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -11
  220. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/controlled.tsx +5 -5
  221. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/uncontrolled.tsx +7 -7
  222. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
  223. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/error.tsx +2 -2
  224. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/theme.tsx +4 -4
  225. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
  226. package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
  227. package/test/graphic_test_app/common/decs.d.ts +2 -2
  228. package/test/graphic_test_app/common/test_app.css +15 -15
  229. package/test/graphic_test_app/common/test_app.tsx +48 -48
  230. package/tsconfig.json +13 -13
  231. package/test/12_navigation_board.js +0 -168
  232. package/test/graphic_references/12_navigation_board/controlled/regular_navigation_2.png +0 -0
  233. package/test/graphic_references/12_navigation_board/theme/small.png +0 -0
  234. package/test/graphic_references/12_navigation_board/uncontrolled/regular_navigation_1.png +0 -0
  235. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/pgn_parsing_error.png +0 -0
  236. /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
  }