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