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
@@ -26,7 +26,7 @@ import * as React from 'react';
26
26
  import { Position, Color, ColoredPiece, Square, SquareCouple, oppositeColor } from 'kokopu';
27
27
 
28
28
  import { AnnotationColor, AnnotationSymbol, SquareMarkerSet, TextMarkerSet, ArrowMarkerSet, Chessboard, ChessboardProps, SquareMarkerIcon, TextMarkerIcon, ArrowMarkerIcon,
29
- flattenSquareMarkers, flattenTextMarkers, flattenArrowMarkers } from '../../src/index';
29
+ flattenSquareMarkers, flattenTextMarkers, flattenArrowMarkers } from '../../src/index';
30
30
  import { buildComponentDemoCode } from './util';
31
31
 
32
32
  import Box from '@mui/material/Box';
@@ -52,330 +52,330 @@ const DEFAULT_FEN = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';
52
52
 
53
53
 
54
54
  interface PageState {
55
- position: Position;
56
- flipped: boolean;
57
- interactionMode: 'none' | 'addRemovePieces' | 'movePieces' | 'playMoves' | 'editSquareMarkers' | 'editTextMarkers' | 'editArrowMarkers';
58
- pieceEditMode: ColoredPiece;
59
- squareMarkerColor: AnnotationColor;
60
- textMarkerColor: AnnotationColor;
61
- textMarkerSymbol: AnnotationSymbol;
62
- arrowMarkerColor: AnnotationColor;
63
- squareMarkers: SquareMarkerSet;
64
- textMarkers: TextMarkerSet;
65
- arrowMarkers: ArrowMarkerSet;
55
+ position: Position;
56
+ flipped: boolean;
57
+ interactionMode: 'none' | 'addRemovePieces' | 'movePieces' | 'playMoves' | 'editSquareMarkers' | 'editTextMarkers' | 'editArrowMarkers';
58
+ pieceEditMode: ColoredPiece;
59
+ squareMarkerColor: AnnotationColor;
60
+ textMarkerColor: AnnotationColor;
61
+ textMarkerSymbol: AnnotationSymbol;
62
+ arrowMarkerColor: AnnotationColor;
63
+ squareMarkers: SquareMarkerSet;
64
+ textMarkers: TextMarkerSet;
65
+ arrowMarkers: ArrowMarkerSet;
66
66
  }
67
67
 
68
68
 
69
69
  export default class Page extends React.Component<object, PageState> {
70
70
 
71
- constructor(props: object) {
72
- super(props);
73
- this.state = {
74
- position: new Position(),
75
- flipped: false,
76
- interactionMode: 'movePieces',
77
- pieceEditMode: 'wp',
78
- squareMarkerColor: 'g',
79
- textMarkerColor: 'g',
80
- textMarkerSymbol: 'A',
81
- arrowMarkerColor: 'g',
82
- squareMarkers: {},
83
- textMarkers: {},
84
- arrowMarkers: {},
85
- };
86
- }
71
+ constructor(props: object) {
72
+ super(props);
73
+ this.state = {
74
+ position: new Position(),
75
+ flipped: false,
76
+ interactionMode: 'movePieces',
77
+ pieceEditMode: 'wp',
78
+ squareMarkerColor: 'g',
79
+ textMarkerColor: 'g',
80
+ textMarkerSymbol: 'A',
81
+ arrowMarkerColor: 'g',
82
+ squareMarkers: {},
83
+ textMarkers: {},
84
+ arrowMarkers: {},
85
+ };
86
+ }
87
87
 
88
- render() {
89
- return (
90
- <Stack spacing={2} mt={2}>
91
- {this.renderControls()}
92
- {this.renderChessboard()}
93
- {this.renderCode()}
94
- </Stack>
95
- );
96
- }
88
+ render() {
89
+ return (
90
+ <Stack spacing={2} mt={2}>
91
+ {this.renderControls()}
92
+ {this.renderChessboard()}
93
+ {this.renderCode()}
94
+ </Stack>
95
+ );
96
+ }
97
97
 
98
- private renderControls() {
99
- return (<>
100
- <Stack direction="row" spacing={2} alignItems="center">
101
- <FormControlLabel label="Flip"
102
- control={<Switch checked={this.state.flipped} onChange={() => this.setState({ flipped: !this.state.flipped })} color="primary" />}
103
- />
104
- <Button color="primary" size="small" variant="contained" onClick={() => this.handleTurnClicked(oppositeColor(this.state.position.turn()))}>
105
- Change turn
106
- </Button>
107
- <ButtonGroup color="primary" size="small">
108
- <Button onClick={() => this.setState({ position: new Position('empty') })}>Clear</Button>
109
- <Button onClick={() => this.setState({ position: new Position() })}>Reset</Button>
110
- </ButtonGroup>
111
- </Stack>
112
- <Box>
113
- <Typography gutterBottom>Interaction mode</Typography>
114
- <RadioGroup value={this.state.interactionMode} onChange={evt => this.setState({ interactionMode: evt.target.value as PageState['interactionMode'] })}>
115
- <FormControlLabel value="none" control={<Radio color="primary" />} label="None" />
116
- <FormControlLabel value="addRemovePieces" control={<Radio color="primary" />} label={
117
- <Stack direction="row" spacing={2} alignItems="center">
118
- <span>Add/remove pieces</span>
119
- {this.renderPieceSelector()}
120
- </Stack>
121
- } />
122
- <FormControlLabel value="movePieces" control={<Radio color="primary" />} label="Move pieces" />
123
- <FormControlLabel value="playMoves" control={<Radio color="primary" />} label="Move pieces (obeying chess rules)" />
124
- <FormControlLabel value="editSquareMarkers" control={<Radio color="primary" />} label={
125
- <Stack direction="row" spacing={2} alignItems="center">
126
- <span>Edit square annotations</span>
127
- {this.renderMarkerColorSelector('editSquareMarkers', this.state.squareMarkerColor, newColor => this.handleSquareMarkerColorChanged(newColor))}
128
- </Stack>
129
- } />
130
- <FormControlLabel value="editTextMarkers" control={<Radio color="primary" />} label={
131
- <Stack direction="row" spacing={2} alignItems="center">
132
- <span>Edit text annotations</span>
133
- {this.renderMarkerColorSelector('editTextMarkers', this.state.textMarkerColor, newColor => this.handleTextMarkerColorChanged(newColor))}
134
- {this.renderTextMarkerSymbolSelector()}
135
- </Stack>
136
- } />
137
- <FormControlLabel value="editArrowMarkers" control={<Radio color="primary" />} label={
138
- <Stack direction="row" spacing={2} alignItems="center">
139
- <span>Edit arrow annotations</span>
140
- {this.renderMarkerColorSelector('editArrowMarkers', this.state.arrowMarkerColor, newColor => this.handleArrowMarkerColorChanged(newColor))}
141
- </Stack>
142
- } />
143
- </RadioGroup>
144
- </Box>
145
- </>);
146
- }
98
+ private renderControls() {
99
+ return (<>
100
+ <Stack direction="row" spacing={2} alignItems="center">
101
+ <FormControlLabel label="Flip"
102
+ control={<Switch checked={this.state.flipped} onChange={() => this.setState({ flipped: !this.state.flipped })} color="primary" />}
103
+ />
104
+ <Button color="primary" size="small" variant="contained" onClick={() => this.handleTurnClicked(oppositeColor(this.state.position.turn()))}>
105
+ Change turn
106
+ </Button>
107
+ <ButtonGroup color="primary" size="small">
108
+ <Button onClick={() => this.setState({ position: new Position('empty') })}>Clear</Button>
109
+ <Button onClick={() => this.setState({ position: new Position() })}>Reset</Button>
110
+ </ButtonGroup>
111
+ </Stack>
112
+ <Box>
113
+ <Typography gutterBottom>Interaction mode</Typography>
114
+ <RadioGroup value={this.state.interactionMode} onChange={evt => this.setState({ interactionMode: evt.target.value as PageState['interactionMode'] })}>
115
+ <FormControlLabel value="none" control={<Radio color="primary" />} label="None" />
116
+ <FormControlLabel value="addRemovePieces" control={<Radio color="primary" />} label={
117
+ <Stack direction="row" spacing={2} alignItems="center">
118
+ <span>Add/remove pieces</span>
119
+ {this.renderPieceSelector()}
120
+ </Stack>
121
+ } />
122
+ <FormControlLabel value="movePieces" control={<Radio color="primary" />} label="Move pieces" />
123
+ <FormControlLabel value="playMoves" control={<Radio color="primary" />} label="Move pieces (obeying chess rules)" />
124
+ <FormControlLabel value="editSquareMarkers" control={<Radio color="primary" />} label={
125
+ <Stack direction="row" spacing={2} alignItems="center">
126
+ <span>Edit square annotations</span>
127
+ {this.renderMarkerColorSelector('editSquareMarkers', this.state.squareMarkerColor, newColor => this.handleSquareMarkerColorChanged(newColor))}
128
+ </Stack>
129
+ } />
130
+ <FormControlLabel value="editTextMarkers" control={<Radio color="primary" />} label={
131
+ <Stack direction="row" spacing={2} alignItems="center">
132
+ <span>Edit text annotations</span>
133
+ {this.renderMarkerColorSelector('editTextMarkers', this.state.textMarkerColor, newColor => this.handleTextMarkerColorChanged(newColor))}
134
+ {this.renderTextMarkerSymbolSelector()}
135
+ </Stack>
136
+ } />
137
+ <FormControlLabel value="editArrowMarkers" control={<Radio color="primary" />} label={
138
+ <Stack direction="row" spacing={2} alignItems="center">
139
+ <span>Edit arrow annotations</span>
140
+ {this.renderMarkerColorSelector('editArrowMarkers', this.state.arrowMarkerColor, newColor => this.handleArrowMarkerColorChanged(newColor))}
141
+ </Stack>
142
+ } />
143
+ </RadioGroup>
144
+ </Box>
145
+ </>);
146
+ }
147
147
 
148
- private renderPieceSelector() {
149
- if (this.state.interactionMode !== 'addRemovePieces') {
150
- return undefined;
151
- }
152
- const pieceset = Chessboard.piecesets()['cburnett'];
153
- return (
154
- <Stack spacing={0.5}>
155
- <ToggleButtonGroup value={this.state.pieceEditMode} exclusive size="small" onChange={(_, newMode) => this.handlePieceEditModeChanged(newMode)}>
156
- <ToggleButton value="wk"><img src={pieceset.wk} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
157
- <ToggleButton value="wq"><img src={pieceset.wq} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
158
- <ToggleButton value="wr"><img src={pieceset.wr} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
159
- <ToggleButton value="wb"><img src={pieceset.wb} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
160
- <ToggleButton value="wn"><img src={pieceset.wn} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
161
- <ToggleButton value="wp"><img src={pieceset.wp} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
162
- </ToggleButtonGroup>
163
- <ToggleButtonGroup value={this.state.pieceEditMode} exclusive size="small" onChange={(_, newMode) => this.handlePieceEditModeChanged(newMode)}>
164
- <ToggleButton value="bk"><img src={pieceset.bk} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
165
- <ToggleButton value="bq"><img src={pieceset.bq} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
166
- <ToggleButton value="br"><img src={pieceset.br} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
167
- <ToggleButton value="bb"><img src={pieceset.bb} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
168
- <ToggleButton value="bn"><img src={pieceset.bn} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
169
- <ToggleButton value="bp"><img src={pieceset.bp} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
170
- </ToggleButtonGroup>
171
- </Stack>
172
- );
173
- }
148
+ private renderPieceSelector() {
149
+ if (this.state.interactionMode !== 'addRemovePieces') {
150
+ return undefined;
151
+ }
152
+ const pieceset = Chessboard.piecesets()['cburnett'];
153
+ return (
154
+ <Stack spacing={0.5}>
155
+ <ToggleButtonGroup value={this.state.pieceEditMode} exclusive size="small" onChange={(_, newMode) => this.handlePieceEditModeChanged(newMode)}>
156
+ <ToggleButton value="wk"><img src={pieceset.wk} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
157
+ <ToggleButton value="wq"><img src={pieceset.wq} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
158
+ <ToggleButton value="wr"><img src={pieceset.wr} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
159
+ <ToggleButton value="wb"><img src={pieceset.wb} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
160
+ <ToggleButton value="wn"><img src={pieceset.wn} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
161
+ <ToggleButton value="wp"><img src={pieceset.wp} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
162
+ </ToggleButtonGroup>
163
+ <ToggleButtonGroup value={this.state.pieceEditMode} exclusive size="small" onChange={(_, newMode) => this.handlePieceEditModeChanged(newMode)}>
164
+ <ToggleButton value="bk"><img src={pieceset.bk} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
165
+ <ToggleButton value="bq"><img src={pieceset.bq} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
166
+ <ToggleButton value="br"><img src={pieceset.br} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
167
+ <ToggleButton value="bb"><img src={pieceset.bb} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
168
+ <ToggleButton value="bn"><img src={pieceset.bn} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
169
+ <ToggleButton value="bp"><img src={pieceset.bp} width={PIECE_ICON_SIZE} height={PIECE_ICON_SIZE} /></ToggleButton>
170
+ </ToggleButtonGroup>
171
+ </Stack>
172
+ );
173
+ }
174
174
 
175
- private renderTextMarkerSymbolSelector() {
176
- if (this.state.interactionMode !== 'editTextMarkers') {
177
- return undefined;
178
- }
179
- const availableSymbols = [ 'plus', 'times', 'dot', 'circle' ].concat([...'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789']);
180
- return (
181
- <Select variant="standard" value={this.state.textMarkerSymbol} onChange={evt => this.setState({ textMarkerSymbol: evt.target.value as AnnotationSymbol })}>
182
- {availableSymbols.map(mode => <MenuItem key={mode} value={mode}>{mode}</MenuItem>)}
183
- </Select>
184
- );
185
- }
175
+ private renderTextMarkerSymbolSelector() {
176
+ if (this.state.interactionMode !== 'editTextMarkers') {
177
+ return undefined;
178
+ }
179
+ const availableSymbols = [ 'plus', 'times', 'dot', 'circle' ].concat([...'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789']);
180
+ return (
181
+ <Select variant="standard" value={this.state.textMarkerSymbol} onChange={evt => this.setState({ textMarkerSymbol: evt.target.value as AnnotationSymbol })}>
182
+ {availableSymbols.map(mode => <MenuItem key={mode} value={mode}>{mode}</MenuItem>)}
183
+ </Select>
184
+ );
185
+ }
186
186
 
187
- private renderMarkerColorSelector(expectedInterationMode: PageState['interactionMode'], currentColor: AnnotationColor, onChange: (newColor: AnnotationColor | null) => void) {
188
- if (this.state.interactionMode !== expectedInterationMode) {
189
- return undefined;
190
- }
191
- const colorset = Chessboard.colorsets()['original'];
192
- return (
193
- <ToggleButtonGroup value={currentColor} exclusive size="small" onChange={(_, newColor) => onChange(newColor)}>
194
- <ToggleButton className="kokopu-fixTextTransform" value="b">{this.renderColorButtonLabel(colorset.cb)}</ToggleButton>
195
- <ToggleButton className="kokopu-fixTextTransform" value="g">{this.renderColorButtonLabel(colorset.cg)}</ToggleButton>
196
- <ToggleButton className="kokopu-fixTextTransform" value="r">{this.renderColorButtonLabel(colorset.cr)}</ToggleButton>
197
- <ToggleButton className="kokopu-fixTextTransform" value="y">{this.renderColorButtonLabel(colorset.cy)}</ToggleButton>
198
- </ToggleButtonGroup>
199
- );
200
- }
187
+ private renderMarkerColorSelector(expectedInterationMode: PageState['interactionMode'], currentColor: AnnotationColor, onChange: (newColor: AnnotationColor | null) => void) {
188
+ if (this.state.interactionMode !== expectedInterationMode) {
189
+ return undefined;
190
+ }
191
+ const colorset = Chessboard.colorsets()['original'];
192
+ return (
193
+ <ToggleButtonGroup value={currentColor} exclusive size="small" onChange={(_, newColor) => onChange(newColor)}>
194
+ <ToggleButton className="kokopu-fixTextTransform" value="b">{this.renderColorButtonLabel(colorset.cb)}</ToggleButton>
195
+ <ToggleButton className="kokopu-fixTextTransform" value="g">{this.renderColorButtonLabel(colorset.cg)}</ToggleButton>
196
+ <ToggleButton className="kokopu-fixTextTransform" value="r">{this.renderColorButtonLabel(colorset.cr)}</ToggleButton>
197
+ <ToggleButton className="kokopu-fixTextTransform" value="y">{this.renderColorButtonLabel(colorset.cy)}</ToggleButton>
198
+ </ToggleButtonGroup>
199
+ );
200
+ }
201
201
 
202
- private renderColorButtonLabel(color: string) {
203
- switch (this.state.interactionMode) {
204
- case 'editSquareMarkers':
205
- return <SquareMarkerIcon size={COLOR_ICON_SIZE} color={color} />;
206
- case 'editTextMarkers':
207
- return <TextMarkerIcon size={COLOR_ICON_SIZE} symbol={this.state.textMarkerSymbol} color={color} />;
208
- case 'editArrowMarkers':
209
- return <ArrowMarkerIcon size={COLOR_ICON_SIZE} color={color} />;
210
- default:
211
- return undefined;
212
- }
213
- }
202
+ private renderColorButtonLabel(color: string) {
203
+ switch (this.state.interactionMode) {
204
+ case 'editSquareMarkers':
205
+ return <SquareMarkerIcon size={COLOR_ICON_SIZE} color={color} />;
206
+ case 'editTextMarkers':
207
+ return <TextMarkerIcon size={COLOR_ICON_SIZE} symbol={this.state.textMarkerSymbol} color={color} />;
208
+ case 'editArrowMarkers':
209
+ return <ArrowMarkerIcon size={COLOR_ICON_SIZE} color={color} />;
210
+ default:
211
+ return undefined;
212
+ }
213
+ }
214
214
 
215
- private renderChessboard() {
216
- return (
217
- <Box>
218
- <Chessboard
219
- position={this.state.position}
220
- flipped={this.state.flipped}
221
- squareMarkers={this.state.squareMarkers}
222
- textMarkers={this.state.textMarkers}
223
- arrowMarkers={this.state.arrowMarkers}
224
- interactionMode={this.getChessboardInterationMode()}
225
- editedArrowColor={this.state.arrowMarkerColor}
226
- onPieceMoved={(from, to) => this.handlePieceMoved(from, to)}
227
- onMovePlayed={move => this.handleMovePlayed(move)}
228
- onArrowEdited={(from, to) => this.handleArrowEdited(from, to)}
229
- onSquareClicked={sq => this.handleSquareClicked(sq)}
230
- />
231
- </Box>
232
- );
233
- }
215
+ private renderChessboard() {
216
+ return (
217
+ <Box>
218
+ <Chessboard
219
+ position={this.state.position}
220
+ flipped={this.state.flipped}
221
+ squareMarkers={this.state.squareMarkers}
222
+ textMarkers={this.state.textMarkers}
223
+ arrowMarkers={this.state.arrowMarkers}
224
+ interactionMode={this.getChessboardInterationMode()}
225
+ editedArrowColor={this.state.arrowMarkerColor}
226
+ onPieceMoved={(from, to) => this.handlePieceMoved(from, to)}
227
+ onMovePlayed={move => this.handleMovePlayed(move)}
228
+ onArrowEdited={(from, to) => this.handleArrowEdited(from, to)}
229
+ onSquareClicked={sq => this.handleSquareClicked(sq)}
230
+ />
231
+ </Box>
232
+ );
233
+ }
234
234
 
235
- private renderCode() {
236
- const attributes: string[] = [];
237
- const fen = this.state.position.fen();
238
- if (fen !== DEFAULT_FEN) {
239
- attributes.push(`position="${fen}"`);
240
- }
241
- if (this.state.flipped) {
242
- attributes.push('flipped');
243
- }
244
- const squareMarkers = flattenSquareMarkers(this.state.squareMarkers);
245
- const textMarkers = flattenTextMarkers(this.state.textMarkers);
246
- const arrowMarkers = flattenArrowMarkers(this.state.arrowMarkers);
247
- if (squareMarkers !== '') {
248
- attributes.push(`squareMarkers="${squareMarkers}"`);
249
- }
250
- if (textMarkers !== '') {
251
- attributes.push(`textMarkers="${textMarkers}"`);
252
- }
253
- if (arrowMarkers !== '') {
254
- attributes.push(`arrowMarkers="${arrowMarkers}"`);
255
- }
256
- switch (this.state.interactionMode) {
257
- case 'addRemovePieces':
258
- case 'editSquareMarkers':
259
- case 'editTextMarkers':
260
- attributes.push('interactionMode="clickSquares"');
261
- attributes.push('onSquareClicked={sq => handleSquareClicked(sq)}');
262
- break;
263
- case 'editArrowMarkers':
264
- attributes.push('interactionMode="editArrows"');
265
- attributes.push(`editedArrowColor="${this.state.arrowMarkerColor}"`);
266
- attributes.push('onArrowEdited={(from, to) => handleArrowEdited(from, to)}');
267
- break;
268
- case 'movePieces':
269
- attributes.push('interactionMode="movePieces"');
270
- attributes.push('onPieceMoved={(from, to) => handlePieceMoved(from, to)}');
271
- break;
272
- case 'playMoves':
273
- attributes.push('interactionMode="playMoves"');
274
- attributes.push('onMovePlayed={move => handleMovePlayed(move)}');
275
- break;
276
- default:
277
- break;
278
- }
279
- return <pre className="kokopu-demoCode">{buildComponentDemoCode('Chessboard', attributes)}</pre>;
280
- }
235
+ private renderCode() {
236
+ const attributes: string[] = [];
237
+ const fen = this.state.position.fen();
238
+ if (fen !== DEFAULT_FEN) {
239
+ attributes.push(`position="${fen}"`);
240
+ }
241
+ if (this.state.flipped) {
242
+ attributes.push('flipped');
243
+ }
244
+ const squareMarkers = flattenSquareMarkers(this.state.squareMarkers);
245
+ const textMarkers = flattenTextMarkers(this.state.textMarkers);
246
+ const arrowMarkers = flattenArrowMarkers(this.state.arrowMarkers);
247
+ if (squareMarkers !== '') {
248
+ attributes.push(`squareMarkers="${squareMarkers}"`);
249
+ }
250
+ if (textMarkers !== '') {
251
+ attributes.push(`textMarkers="${textMarkers}"`);
252
+ }
253
+ if (arrowMarkers !== '') {
254
+ attributes.push(`arrowMarkers="${arrowMarkers}"`);
255
+ }
256
+ switch (this.state.interactionMode) {
257
+ case 'addRemovePieces':
258
+ case 'editSquareMarkers':
259
+ case 'editTextMarkers':
260
+ attributes.push('interactionMode="clickSquares"');
261
+ attributes.push('onSquareClicked={sq => handleSquareClicked(sq)}');
262
+ break;
263
+ case 'editArrowMarkers':
264
+ attributes.push('interactionMode="editArrows"');
265
+ attributes.push(`editedArrowColor="${this.state.arrowMarkerColor}"`);
266
+ attributes.push('onArrowEdited={(from, to) => handleArrowEdited(from, to)}');
267
+ break;
268
+ case 'movePieces':
269
+ attributes.push('interactionMode="movePieces"');
270
+ attributes.push('onPieceMoved={(from, to) => handlePieceMoved(from, to)}');
271
+ break;
272
+ case 'playMoves':
273
+ attributes.push('interactionMode="playMoves"');
274
+ attributes.push('onMovePlayed={move => handleMovePlayed(move)}');
275
+ break;
276
+ default:
277
+ break;
278
+ }
279
+ return <pre className="kokopu-demoCode">{buildComponentDemoCode('Chessboard', attributes)}</pre>;
280
+ }
281
281
 
282
- private handlePieceEditModeChanged(newPieceEditMode: ColoredPiece | null) {
283
- if (newPieceEditMode !== null) {
284
- this.setState({ pieceEditMode: newPieceEditMode });
285
- }
286
- }
282
+ private handlePieceEditModeChanged(newPieceEditMode: ColoredPiece | null) {
283
+ if (newPieceEditMode !== null) {
284
+ this.setState({ pieceEditMode: newPieceEditMode });
285
+ }
286
+ }
287
287
 
288
- private handleSquareMarkerColorChanged(newColor: AnnotationColor | null) {
289
- if (newColor !== null) {
290
- this.setState({ squareMarkerColor: newColor });
291
- }
292
- }
288
+ private handleSquareMarkerColorChanged(newColor: AnnotationColor | null) {
289
+ if (newColor !== null) {
290
+ this.setState({ squareMarkerColor: newColor });
291
+ }
292
+ }
293
293
 
294
- private handleTextMarkerColorChanged(newColor: AnnotationColor | null) {
295
- if (newColor !== null) {
296
- this.setState({ textMarkerColor: newColor });
297
- }
298
- }
294
+ private handleTextMarkerColorChanged(newColor: AnnotationColor | null) {
295
+ if (newColor !== null) {
296
+ this.setState({ textMarkerColor: newColor });
297
+ }
298
+ }
299
299
 
300
- private handleArrowMarkerColorChanged(newColor: AnnotationColor | null) {
301
- if (newColor !== null) {
302
- this.setState({ arrowMarkerColor: newColor });
303
- }
304
- }
300
+ private handleArrowMarkerColorChanged(newColor: AnnotationColor | null) {
301
+ if (newColor !== null) {
302
+ this.setState({ arrowMarkerColor: newColor });
303
+ }
304
+ }
305
305
 
306
- private handleTurnClicked(newTurn: Color) {
307
- const newPosition = new Position(this.state.position);
308
- newPosition.turn(newTurn);
309
- this.setState({ position: newPosition });
310
- }
306
+ private handleTurnClicked(newTurn: Color) {
307
+ const newPosition = new Position(this.state.position);
308
+ newPosition.turn(newTurn);
309
+ this.setState({ position: newPosition });
310
+ }
311
311
 
312
- private handlePieceMoved(from: Square, to: Square) {
313
- const newPosition = new Position(this.state.position);
314
- newPosition.square(to, newPosition.square(from));
315
- newPosition.square(from, '-');
316
- this.setState({ position: newPosition });
317
- }
312
+ private handlePieceMoved(from: Square, to: Square) {
313
+ const newPosition = new Position(this.state.position);
314
+ newPosition.square(to, newPosition.square(from));
315
+ newPosition.square(from, '-');
316
+ this.setState({ position: newPosition });
317
+ }
318
318
 
319
- private handleMovePlayed(move: string) {
320
- const newPosition = new Position(this.state.position);
321
- newPosition.play(move);
322
- this.setState({ position: newPosition });
323
- }
319
+ private handleMovePlayed(move: string) {
320
+ const newPosition = new Position(this.state.position);
321
+ newPosition.play(move);
322
+ this.setState({ position: newPosition });
323
+ }
324
324
 
325
- private handleArrowEdited(from: Square, to: Square) {
326
- const newArrowMarkers = { ...this.state.arrowMarkers };
327
- const key = from + to as SquareCouple;
328
- if (newArrowMarkers[key] === this.state.arrowMarkerColor) {
329
- delete newArrowMarkers[key];
330
- }
331
- else {
332
- newArrowMarkers[key] = this.state.arrowMarkerColor;
333
- }
334
- this.setState({ arrowMarkers: newArrowMarkers });
335
- }
325
+ private handleArrowEdited(from: Square, to: Square) {
326
+ const newArrowMarkers = { ...this.state.arrowMarkers };
327
+ const key = from + to as SquareCouple;
328
+ if (newArrowMarkers[key] === this.state.arrowMarkerColor) {
329
+ delete newArrowMarkers[key];
330
+ }
331
+ else {
332
+ newArrowMarkers[key] = this.state.arrowMarkerColor;
333
+ }
334
+ this.setState({ arrowMarkers: newArrowMarkers });
335
+ }
336
336
 
337
- private handleSquareClicked(sq: Square) {
338
- if (this.state.interactionMode === 'editSquareMarkers') {
339
- const newSquareMarkers = { ...this.state.squareMarkers };
340
- if (newSquareMarkers[sq] === this.state.squareMarkerColor) {
341
- delete newSquareMarkers[sq];
342
- }
343
- else {
344
- newSquareMarkers[sq] = this.state.squareMarkerColor;
345
- }
346
- this.setState({ squareMarkers: newSquareMarkers });
347
- }
348
- else if (this.state.interactionMode === 'editTextMarkers') {
349
- const newTextMarkers = { ...this.state.textMarkers };
350
- if (newTextMarkers[sq] && newTextMarkers[sq]!.color === this.state.textMarkerColor && newTextMarkers[sq]!.symbol === this.state.textMarkerSymbol) {
351
- delete newTextMarkers[sq];
352
- }
353
- else {
354
- newTextMarkers[sq] = { color: this.state.textMarkerColor, symbol: this.state.textMarkerSymbol };
355
- }
356
- this.setState({ textMarkers: newTextMarkers });
357
- }
358
- else if (this.state.interactionMode === 'addRemovePieces') {
359
- const newPosition = new Position(this.state.position);
360
- newPosition.square(sq, newPosition.square(sq) === this.state.pieceEditMode ? '-' : this.state.pieceEditMode);
361
- this.setState({ position: newPosition });
362
- }
363
- }
337
+ private handleSquareClicked(sq: Square) {
338
+ if (this.state.interactionMode === 'editSquareMarkers') {
339
+ const newSquareMarkers = { ...this.state.squareMarkers };
340
+ if (newSquareMarkers[sq] === this.state.squareMarkerColor) {
341
+ delete newSquareMarkers[sq];
342
+ }
343
+ else {
344
+ newSquareMarkers[sq] = this.state.squareMarkerColor;
345
+ }
346
+ this.setState({ squareMarkers: newSquareMarkers });
347
+ }
348
+ else if (this.state.interactionMode === 'editTextMarkers') {
349
+ const newTextMarkers = { ...this.state.textMarkers };
350
+ if (newTextMarkers[sq] && newTextMarkers[sq]!.color === this.state.textMarkerColor && newTextMarkers[sq]!.symbol === this.state.textMarkerSymbol) {
351
+ delete newTextMarkers[sq];
352
+ }
353
+ else {
354
+ newTextMarkers[sq] = { color: this.state.textMarkerColor, symbol: this.state.textMarkerSymbol };
355
+ }
356
+ this.setState({ textMarkers: newTextMarkers });
357
+ }
358
+ else if (this.state.interactionMode === 'addRemovePieces') {
359
+ const newPosition = new Position(this.state.position);
360
+ newPosition.square(sq, newPosition.square(sq) === this.state.pieceEditMode ? '-' : this.state.pieceEditMode);
361
+ this.setState({ position: newPosition });
362
+ }
363
+ }
364
364
 
365
- private getChessboardInterationMode(): ChessboardProps['interactionMode'] {
366
- switch (this.state.interactionMode) {
367
- case 'addRemovePieces':
368
- case 'editSquareMarkers':
369
- case 'editTextMarkers':
370
- return 'clickSquares';
371
- case 'editArrowMarkers':
372
- return 'editArrows';
373
- case 'movePieces':
374
- case 'playMoves':
375
- return this.state.interactionMode;
376
- default:
377
- return undefined;
378
- }
379
- }
365
+ private getChessboardInterationMode(): ChessboardProps['interactionMode'] {
366
+ switch (this.state.interactionMode) {
367
+ case 'addRemovePieces':
368
+ case 'editSquareMarkers':
369
+ case 'editTextMarkers':
370
+ return 'clickSquares';
371
+ case 'editArrowMarkers':
372
+ return 'editArrows';
373
+ case 'movePieces':
374
+ case 'playMoves':
375
+ return this.state.interactionMode;
376
+ default:
377
+ return undefined;
378
+ }
379
+ }
380
380
 
381
381
  }