kokopu-react 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/.eslintrc.yml +1 -1
  2. package/CHANGELOG.md +10 -0
  3. package/dist/lib/chessboard/BoardProperties.js.map +1 -1
  4. package/dist/lib/chessboard/Chessboard.css +13 -13
  5. package/dist/lib/chessboard/Chessboard.d.ts +27 -2
  6. package/dist/lib/chessboard/Chessboard.js +36 -17
  7. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  8. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  9. package/dist/lib/chessboard/Draggable.js.map +1 -1
  10. package/dist/lib/chessboard/Motion.js.map +1 -1
  11. package/dist/lib/chessboard/colorsets.js.map +1 -1
  12. package/dist/lib/chessboard/piecesets.js.map +1 -1
  13. package/dist/lib/errorbox/ErrorBox.css +18 -18
  14. package/dist/lib/errorbox/ErrorBox.js.map +1 -1
  15. package/dist/lib/errorbox/parsing.js.map +1 -1
  16. package/dist/lib/exception.js.map +1 -1
  17. package/dist/lib/i18n.d.ts +1 -0
  18. package/dist/lib/i18n.js +1 -0
  19. package/dist/lib/i18n.js.map +1 -1
  20. package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
  21. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
  22. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  23. package/dist/lib/icons/ArrowTip.js.map +1 -1
  24. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  25. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  26. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  27. package/dist/lib/icons/arrow.css +1 -1
  28. package/dist/lib/index.d.ts +1 -0
  29. package/dist/lib/index.js +1 -0
  30. package/dist/lib/index.js.map +1 -1
  31. package/dist/lib/movetext/Movetext.css +27 -27
  32. package/dist/lib/movetext/Movetext.js.map +1 -1
  33. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  34. package/dist/lib/movetext/fonts.css +7 -7
  35. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  36. package/dist/lib/movetext/moveFormatter.js.map +1 -1
  37. package/dist/lib/navigationboard/NavigationBoard.d.ts +68 -1
  38. package/dist/lib/navigationboard/NavigationBoard.js +141 -13
  39. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
  40. package/dist/lib/navigationboard/NavigationButton.d.ts +66 -0
  41. package/dist/lib/navigationboard/NavigationButton.js +67 -0
  42. package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
  43. package/dist/lib/navigationboard/NavigationField.css +7 -7
  44. package/dist/lib/navigationboard/NavigationField.js.map +1 -1
  45. package/dist/lib/navigationboard/NavigationToolbar.css +16 -13
  46. package/dist/lib/navigationboard/NavigationToolbar.d.ts +10 -10
  47. package/dist/lib/navigationboard/NavigationToolbar.js +61 -79
  48. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
  49. package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
  50. package/dist/lib/navigationboard/iconPaths.js +91 -0
  51. package/dist/lib/navigationboard/iconPaths.js.map +1 -0
  52. package/dist/lib/sanitization.js.map +1 -1
  53. package/dist/lib/types.js.map +1 -1
  54. package/dist/lib/util.js.map +1 -1
  55. package/doc_src/demo/PageChessboardBase.tsx +115 -115
  56. package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
  57. package/doc_src/demo/PageChessboardMove.tsx +173 -173
  58. package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
  59. package/doc_src/demo/PageMovetextBase.tsx +180 -180
  60. package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
  61. package/doc_src/demo/PageNavigationBoardBase.tsx +144 -137
  62. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +69 -69
  63. package/doc_src/demo/decs.d.ts +4 -4
  64. package/doc_src/demo/demo.css +12 -12
  65. package/doc_src/demo/util.ts +1 -1
  66. package/doc_src/examples/NavigationBoard.md +1 -1
  67. package/doc_src/theming/LogoRenderer.js +13 -13
  68. package/doc_src/theming/theming.css +5 -5
  69. package/package.json +95 -95
  70. package/scripts/doc.styleguide.config.js +131 -131
  71. package/scripts/doc.tsconfig.json +5 -5
  72. package/scripts/docker-compose.yml +1 -1
  73. package/scripts/test-graphic.tsconfig.json +5 -5
  74. package/scripts/test-graphic.webpack.config.js +57 -57
  75. package/scripts/test-headless.webpack.config.js +29 -29
  76. package/src/chessboard/BoardProperties.ts +68 -68
  77. package/src/chessboard/Chessboard.css +13 -13
  78. package/src/chessboard/Chessboard.tsx +436 -380
  79. package/src/chessboard/ChessboardImpl.tsx +557 -557
  80. package/src/chessboard/Draggable.tsx +185 -185
  81. package/src/chessboard/Motion.tsx +67 -67
  82. package/src/chessboard/colorsets.ts +66 -66
  83. package/src/chessboard/piecesets.ts +84 -84
  84. package/src/decs.d.ts +2 -2
  85. package/src/errorbox/ErrorBox.css +18 -18
  86. package/src/errorbox/ErrorBox.tsx +75 -75
  87. package/src/errorbox/parsing.tsx +95 -95
  88. package/src/exception.ts +17 -17
  89. package/src/i18n.ts +1 -0
  90. package/src/icons/AnnotationSymbolShape.css +6 -6
  91. package/src/icons/AnnotationSymbolShape.tsx +31 -31
  92. package/src/icons/ArrowMarkerIcon.tsx +34 -34
  93. package/src/icons/ArrowTip.tsx +14 -14
  94. package/src/icons/ChessPieceIcon.tsx +45 -45
  95. package/src/icons/SquareMarkerIcon.tsx +20 -20
  96. package/src/icons/TextMarkerIcon.tsx +29 -29
  97. package/src/icons/arrow.css +1 -1
  98. package/src/index.ts +3 -2
  99. package/src/movetext/Movetext.css +27 -27
  100. package/src/movetext/Movetext.tsx +158 -158
  101. package/src/movetext/MovetextImpl.tsx +345 -345
  102. package/src/movetext/fonts.css +7 -7
  103. package/src/movetext/htmlFilter.tsx +129 -129
  104. package/src/movetext/moveFormatter.tsx +37 -37
  105. package/src/navigationboard/NavigationBoard.tsx +386 -180
  106. package/src/navigationboard/NavigationButton.ts +114 -0
  107. package/src/navigationboard/NavigationField.css +7 -7
  108. package/src/navigationboard/NavigationField.tsx +90 -90
  109. package/src/navigationboard/NavigationToolbar.css +16 -13
  110. package/src/navigationboard/NavigationToolbar.tsx +98 -112
  111. package/src/navigationboard/iconPaths.ts +98 -0
  112. package/src/sanitization.ts +17 -17
  113. package/src/types.ts +116 -116
  114. package/src/util.ts +11 -11
  115. package/test/01_types.js +167 -167
  116. package/test/02_chessboard_util.js +191 -115
  117. package/test/03_error_box_graphic.js +16 -16
  118. package/test/04_icons_graphic.js +32 -32
  119. package/test/05_chessboard_graphic.js +60 -60
  120. package/test/06_chessboard_animation.js +36 -36
  121. package/test/07_chessboard_interaction.js +101 -101
  122. package/test/08_chessboard_play_moves.js +62 -62
  123. package/test/09_chessboard_small_screens.js +32 -32
  124. package/test/10_movetext_graphic.js +32 -32
  125. package/test/11_movetext_interaction.js +100 -100
  126. package/test/12_navigation_board_base.js +151 -0
  127. package/test/13_navigation_board_graphic.js +68 -0
  128. package/test/14_navigation_board_autoplay.js +100 -0
  129. package/test/common/graphic.js +106 -97
  130. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  131. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_1.png → 12_navigation_board_base/controlled/forbidden_navigation_0.png} +0 -0
  132. package/test/graphic_references/{12_navigation_board/controlled/invalid_node_id.png → 12_navigation_board_base/controlled/forbidden_navigation_1.png} +0 -0
  133. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_0.png → 12_navigation_board_base/controlled/invalid_node_id.png} +0 -0
  134. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  135. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/no_callback_defined_1.png +0 -0
  136. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/overriding_initial_node_id.png +0 -0
  137. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_1.png → 12_navigation_board_base/controlled/regular_navigation_0.png} +0 -0
  138. package/test/graphic_references/{12_navigation_board/uncontrolled/initial_state_at_specific_id.png → 12_navigation_board_base/controlled/regular_navigation_1.png} +0 -0
  139. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_3.png → 12_navigation_board_base/controlled/regular_navigation_2.png} +0 -0
  140. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_0.png → 12_navigation_board_base/controlled/regular_navigation_3.png} +0 -0
  141. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_2.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png} +0 -0
  142. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png} +0 -0
  143. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_1.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png} +0 -0
  144. package/test/graphic_references/{12_navigation_board/controlled/no_callback_defined_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png} +0 -0
  145. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  146. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  147. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_at_end.png +0 -0
  148. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  149. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default.png +0 -0
  150. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default_with_game_index.png +0 -0
  151. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_on_null-move.png +0 -0
  152. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_0.png +0 -0
  153. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  154. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_2.png +0 -0
  155. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_3.png +0 -0
  156. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_4.png +0 -0
  157. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_0.png +0 -0
  158. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_1.png +0 -0
  159. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_0.png +0 -0
  160. package/test/graphic_references/{12_navigation_board/controlled/default.png → 12_navigation_board_base/uncontrolled/regular_navigation_1.png} +0 -0
  161. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_2.png +0 -0
  162. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  163. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_4.png +0 -0
  164. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_5.png +0 -0
  165. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  166. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  167. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  168. package/test/graphic_references/{12_navigation_board/uncontrolled/regular_navigation_3.png → 13_navigation_board_graphic/additional_buttons/single_button.png} +0 -0
  169. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_1.png +0 -0
  170. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_2.png +0 -0
  171. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png +0 -0
  172. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  173. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  174. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  175. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  176. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  177. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_1.png → 14_navigation_board_autoplay/controlled/after_reaching_the_end.png} +0 -0
  178. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_2.png → 14_navigation_board_autoplay/controlled/already_at_the_end.png} +0 -0
  179. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  180. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  181. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_0.png → 14_navigation_board_autoplay/controlled/initial_state_at_the_end.png} +0 -0
  182. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  183. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  184. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  185. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  186. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  187. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  188. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  189. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  190. package/test/graphic_references/{12_navigation_board/uncontrolled/navigation_with_keys_1.png → 14_navigation_board_autoplay/uncontrolled/initial_state_default.png} +0 -0
  191. package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
  192. package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
  193. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
  194. package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
  195. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
  196. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
  197. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
  198. package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
  199. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -12
  200. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
  201. package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
  202. package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
  203. package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
  204. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
  205. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
  206. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
  207. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
  208. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
  209. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
  210. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
  211. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
  212. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +9 -9
  213. package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
  214. package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
  215. package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +1 -1
  216. package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
  217. package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -10
  218. package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
  219. package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -11
  220. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/controlled.tsx +5 -5
  221. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/uncontrolled.tsx +7 -7
  222. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
  223. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/error.tsx +2 -2
  224. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/theme.tsx +4 -4
  225. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
  226. package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
  227. package/test/graphic_test_app/common/decs.d.ts +2 -2
  228. package/test/graphic_test_app/common/test_app.css +15 -15
  229. package/test/graphic_test_app/common/test_app.tsx +48 -48
  230. package/tsconfig.json +13 -13
  231. package/test/12_navigation_board.js +0 -168
  232. package/test/graphic_references/12_navigation_board/controlled/regular_navigation_2.png +0 -0
  233. package/test/graphic_references/12_navigation_board/theme/small.png +0 -0
  234. package/test/graphic_references/12_navigation_board/uncontrolled/regular_navigation_1.png +0 -0
  235. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/pgn_parsing_error.png +0 -0
  236. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/wrong_game_type.png +0 -0
@@ -44,183 +44,183 @@ const COLOR_ICON_SIZE = 16;
44
44
 
45
45
 
46
46
  interface PageState {
47
- position: Position;
48
- positionAfter: Position | null; // non-null only if a valid move has been played
49
- flipped: boolean;
50
- moveArrowVisible: boolean;
51
- moveArrowColor: AnnotationColor;
52
- animated: boolean;
53
- editedMove: string;
54
- playedMove: string;
47
+ position: Position;
48
+ positionAfter: Position | null; // non-null only if a valid move has been played
49
+ flipped: boolean;
50
+ moveArrowVisible: boolean;
51
+ moveArrowColor: AnnotationColor;
52
+ animated: boolean;
53
+ editedMove: string;
54
+ playedMove: string;
55
55
  }
56
56
 
57
57
 
58
58
  export default class Page extends React.Component<object, PageState> {
59
59
 
60
- constructor(props: object) {
61
- super(props);
62
- const position = new Position();
63
- const positionAfter = new Position(position);
64
- positionAfter.play('e4');
65
- this.state = {
66
- position: position,
67
- positionAfter: positionAfter,
68
- flipped: false,
69
- moveArrowVisible: true,
70
- moveArrowColor: 'b',
71
- animated: true,
72
- editedMove: 'Nf6',
73
- playedMove: 'e4',
74
- };
75
- }
76
-
77
- render() {
78
- return (
79
- <Stack spacing={2} mt={2}>
80
- {this.renderControls()}
81
- {this.renderChessboard()}
82
- {this.renderCode()}
83
- </Stack>
84
- );
85
- }
86
-
87
- private renderControls() {
88
- return (<>
89
- <Stack direction="row" spacing={2} alignItems="center">
90
- <FormControlLabel label="Flip"
91
- control={<Switch checked={this.state.flipped} onChange={() => this.setState({ flipped: !this.state.flipped })} color="primary" />}
92
- />
93
- <FormControlLabel label="Animation" disabled={!this.state.positionAfter}
94
- control={<Switch checked={this.state.animated} onChange={() => this.setState({ animated: !this.state.animated })} color="primary" />}
95
- />
96
- <FormControlLabel label="Show move arrow" disabled={!this.state.positionAfter}
97
- control={<Switch checked={this.state.moveArrowVisible} onChange={() => this.setState({ moveArrowVisible: !this.state.moveArrowVisible })} color="primary" />}
98
- />
99
- {this.renderColorSelector()}
100
- </Stack>
101
- <Stack direction="row" spacing={2} alignItems="center">
102
- <TextField label="Move" variant="standard" value={this.state.editedMove} onChange={evt => this.setState({ editedMove: evt.target.value })} />
103
- <Button color="primary" size="small" variant="contained" onClick={() => this.handlePlayClicked()}>Play</Button>
104
- <ButtonGroup color="primary" size="small">
105
- <Button onClick={() => this.handlePositionChanged(new Position('empty'))}>Clear</Button>
106
- <Button onClick={() => this.handlePositionChanged(new Position())}>Reset</Button>
107
- </ButtonGroup>
108
- </Stack>
109
- </>);
110
- }
111
-
112
- private renderColorSelector() {
113
- if (!this.state.moveArrowVisible) {
114
- return undefined;
115
- }
116
- const colorset = Chessboard.colorsets()['original'];
117
- return (
118
- <ToggleButtonGroup value={this.state.moveArrowColor} exclusive size="small" disabled={!this.state.positionAfter} onChange={(_, newColor) => this.handleMoveColorChanged(newColor)}>
119
- <ToggleButton className="kokopu-fixOpacity" value="b"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cb} /></ToggleButton>
120
- <ToggleButton className="kokopu-fixOpacity" value="g"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cg} /></ToggleButton>
121
- <ToggleButton className="kokopu-fixOpacity" value="r"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cr} /></ToggleButton>
122
- <ToggleButton className="kokopu-fixOpacity" value="y"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cy} /></ToggleButton>
123
- </ToggleButtonGroup>
124
- );
125
- }
126
-
127
- private renderChessboard() {
128
- return (
129
- <Box>
130
- <Chessboard
131
- position={this.state.position}
132
- move={this.state.playedMove === '' ? undefined : this.state.playedMove}
133
- flipped={this.state.flipped}
134
- moveArrowVisible={this.state.moveArrowVisible}
135
- moveArrowColor={this.state.moveArrowColor}
136
- animated={this.state.animated}
137
- />
138
- </Box>
139
- );
140
- }
141
-
142
- private renderCode() {
143
- const attributes: string[] = [];
144
- attributes.push(`position="${this.state.position.fen()}"`);
145
- if (this.state.playedMove !== '') {
146
- attributes.push(`move="${this.state.playedMove}"`);
147
- }
148
- if (this.state.flipped) {
149
- attributes.push('flipped');
150
- }
151
- attributes.push(`animated={${this.state.animated}}`);
152
- attributes.push(`moveArrowVisible={${this.state.moveArrowVisible}}`);
153
- if (this.state.moveArrowVisible) {
154
- attributes.push(`moveArrowColor={${this.state.moveArrowColor}}`);
155
- }
156
- return <pre className="kokopu-demoCode">{buildComponentDemoCode('Chessboard', attributes)}</pre>;
157
- }
158
-
159
- private handleMoveColorChanged(newColor: AnnotationColor | null) {
160
- if (newColor !== null) {
161
- this.setState({ moveArrowColor: newColor });
162
- }
163
- }
164
-
165
- private handlePositionChanged(newPosition: Position) {
166
- this.setState({
167
- position: newPosition,
168
- playedMove: '',
169
- positionAfter: null,
170
- });
171
- }
172
-
173
- private handlePlayClicked() {
174
- const currentPosition = new Position(this.state.positionAfter ? this.state.positionAfter : this.state.position);
175
- const move = this.state.editedMove.trim();
176
- if (move === '') {
177
- this.setState({
178
- position: currentPosition,
179
- playedMove: '',
180
- positionAfter: null,
181
- });
182
- }
183
- else if (move === '--') {
184
- const positionAfter = new Position(currentPosition);
185
- if (positionAfter.playNullMove()) {
186
- this.setState({
187
- position: currentPosition,
188
- playedMove: '--',
189
- positionAfter: positionAfter,
190
- });
191
- }
192
- else {
193
- this.setState({
194
- position: currentPosition,
195
- playedMove: '',
196
- positionAfter: null,
197
- });
198
- }
199
- }
200
- else {
201
- try {
202
- const moveDescriptor = currentPosition.notation(move);
203
- const positionAfter = new Position(currentPosition);
204
- positionAfter.play(moveDescriptor);
205
- this.setState({
206
- position: currentPosition,
207
- playedMove: currentPosition.notation(moveDescriptor),
208
- positionAfter: positionAfter,
209
- });
210
- }
211
- catch (e) {
212
- if (e instanceof exception.InvalidNotation) {
213
- this.setState({
214
- position: currentPosition,
215
- playedMove: '',
216
- positionAfter: null,
217
- });
218
- }
219
- else {
220
- throw e;
221
- }
222
- }
223
- }
224
- }
60
+ constructor(props: object) {
61
+ super(props);
62
+ const position = new Position();
63
+ const positionAfter = new Position(position);
64
+ positionAfter.play('e4');
65
+ this.state = {
66
+ position: position,
67
+ positionAfter: positionAfter,
68
+ flipped: false,
69
+ moveArrowVisible: true,
70
+ moveArrowColor: 'b',
71
+ animated: true,
72
+ editedMove: 'Nf6',
73
+ playedMove: 'e4',
74
+ };
75
+ }
76
+
77
+ render() {
78
+ return (
79
+ <Stack spacing={2} mt={2}>
80
+ {this.renderControls()}
81
+ {this.renderChessboard()}
82
+ {this.renderCode()}
83
+ </Stack>
84
+ );
85
+ }
86
+
87
+ private renderControls() {
88
+ return (<>
89
+ <Stack direction="row" spacing={2} alignItems="center">
90
+ <FormControlLabel label="Flip"
91
+ control={<Switch checked={this.state.flipped} onChange={() => this.setState({ flipped: !this.state.flipped })} color="primary" />}
92
+ />
93
+ <FormControlLabel label="Animation" disabled={!this.state.positionAfter}
94
+ control={<Switch checked={this.state.animated} onChange={() => this.setState({ animated: !this.state.animated })} color="primary" />}
95
+ />
96
+ <FormControlLabel label="Show move arrow" disabled={!this.state.positionAfter}
97
+ control={<Switch checked={this.state.moveArrowVisible} onChange={() => this.setState({ moveArrowVisible: !this.state.moveArrowVisible })} color="primary" />}
98
+ />
99
+ {this.renderColorSelector()}
100
+ </Stack>
101
+ <Stack direction="row" spacing={2} alignItems="center">
102
+ <TextField label="Move" variant="standard" value={this.state.editedMove} onChange={evt => this.setState({ editedMove: evt.target.value })} />
103
+ <Button color="primary" size="small" variant="contained" onClick={() => this.handlePlayClicked()}>Play</Button>
104
+ <ButtonGroup color="primary" size="small">
105
+ <Button onClick={() => this.handlePositionChanged(new Position('empty'))}>Clear</Button>
106
+ <Button onClick={() => this.handlePositionChanged(new Position())}>Reset</Button>
107
+ </ButtonGroup>
108
+ </Stack>
109
+ </>);
110
+ }
111
+
112
+ private renderColorSelector() {
113
+ if (!this.state.moveArrowVisible) {
114
+ return undefined;
115
+ }
116
+ const colorset = Chessboard.colorsets()['original'];
117
+ return (
118
+ <ToggleButtonGroup value={this.state.moveArrowColor} exclusive size="small" disabled={!this.state.positionAfter} onChange={(_, newColor) => this.handleMoveColorChanged(newColor)}>
119
+ <ToggleButton className="kokopu-fixOpacity" value="b"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cb} /></ToggleButton>
120
+ <ToggleButton className="kokopu-fixOpacity" value="g"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cg} /></ToggleButton>
121
+ <ToggleButton className="kokopu-fixOpacity" value="r"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cr} /></ToggleButton>
122
+ <ToggleButton className="kokopu-fixOpacity" value="y"><ArrowMarkerIcon size={COLOR_ICON_SIZE} color={colorset.cy} /></ToggleButton>
123
+ </ToggleButtonGroup>
124
+ );
125
+ }
126
+
127
+ private renderChessboard() {
128
+ return (
129
+ <Box>
130
+ <Chessboard
131
+ position={this.state.position}
132
+ move={this.state.playedMove === '' ? undefined : this.state.playedMove}
133
+ flipped={this.state.flipped}
134
+ moveArrowVisible={this.state.moveArrowVisible}
135
+ moveArrowColor={this.state.moveArrowColor}
136
+ animated={this.state.animated}
137
+ />
138
+ </Box>
139
+ );
140
+ }
141
+
142
+ private renderCode() {
143
+ const attributes: string[] = [];
144
+ attributes.push(`position="${this.state.position.fen()}"`);
145
+ if (this.state.playedMove !== '') {
146
+ attributes.push(`move="${this.state.playedMove}"`);
147
+ }
148
+ if (this.state.flipped) {
149
+ attributes.push('flipped');
150
+ }
151
+ attributes.push(`animated={${this.state.animated}}`);
152
+ attributes.push(`moveArrowVisible={${this.state.moveArrowVisible}}`);
153
+ if (this.state.moveArrowVisible) {
154
+ attributes.push(`moveArrowColor={${this.state.moveArrowColor}}`);
155
+ }
156
+ return <pre className="kokopu-demoCode">{buildComponentDemoCode('Chessboard', attributes)}</pre>;
157
+ }
158
+
159
+ private handleMoveColorChanged(newColor: AnnotationColor | null) {
160
+ if (newColor !== null) {
161
+ this.setState({ moveArrowColor: newColor });
162
+ }
163
+ }
164
+
165
+ private handlePositionChanged(newPosition: Position) {
166
+ this.setState({
167
+ position: newPosition,
168
+ playedMove: '',
169
+ positionAfter: null,
170
+ });
171
+ }
172
+
173
+ private handlePlayClicked() {
174
+ const currentPosition = new Position(this.state.positionAfter ? this.state.positionAfter : this.state.position);
175
+ const move = this.state.editedMove.trim();
176
+ if (move === '') {
177
+ this.setState({
178
+ position: currentPosition,
179
+ playedMove: '',
180
+ positionAfter: null,
181
+ });
182
+ }
183
+ else if (move === '--') {
184
+ const positionAfter = new Position(currentPosition);
185
+ if (positionAfter.playNullMove()) {
186
+ this.setState({
187
+ position: currentPosition,
188
+ playedMove: '--',
189
+ positionAfter: positionAfter,
190
+ });
191
+ }
192
+ else {
193
+ this.setState({
194
+ position: currentPosition,
195
+ playedMove: '',
196
+ positionAfter: null,
197
+ });
198
+ }
199
+ }
200
+ else {
201
+ try {
202
+ const moveDescriptor = currentPosition.notation(move);
203
+ const positionAfter = new Position(currentPosition);
204
+ positionAfter.play(moveDescriptor);
205
+ this.setState({
206
+ position: currentPosition,
207
+ playedMove: currentPosition.notation(moveDescriptor),
208
+ positionAfter: positionAfter,
209
+ });
210
+ }
211
+ catch (e) {
212
+ if (e instanceof exception.InvalidNotation) {
213
+ this.setState({
214
+ position: currentPosition,
215
+ playedMove: '',
216
+ positionAfter: null,
217
+ });
218
+ }
219
+ else {
220
+ throw e;
221
+ }
222
+ }
223
+ }
224
+ }
225
225
 
226
226
  }
@@ -35,104 +35,104 @@ import './demo.css';
35
35
 
36
36
 
37
37
  interface PageState {
38
- squareSize: number;
39
- windowWidth: number;
40
- limits: SmallScreenLimit[];
38
+ squareSize: number;
39
+ windowWidth: number;
40
+ limits: SmallScreenLimit[];
41
41
  }
42
42
 
43
43
 
44
44
  export default class Page extends React.Component<object, PageState> {
45
45
 
46
- private windowResizeListener = () => this.handleWindowResize();
47
-
48
- constructor(props: object) {
49
- super(props);
50
- this.state = {
51
- squareSize: 56,
52
- windowWidth: window.innerWidth,
53
- limits: [
54
- { width: 160, squareSize: 12 },
55
- { width: 224, squareSize: 16 },
56
- { width: 250, turnVisible: false },
57
- { width: 340, squareSize: 24, coordinateVisible: false },
58
- { width: 450, squareSize: 32 },
59
- { width: 560, squareSize: 44 },
60
- { width: 600, squareSize: 52, coordinateVisible: true },
61
- { width: 640, squareSize: 24, coordinateVisible: false },
62
- { width: 750, squareSize: 32 },
63
- { width: 860, squareSize: 44 },
64
- ],
65
- };
66
- }
67
-
68
- componentDidMount() {
69
- window.addEventListener('resize', this.windowResizeListener);
70
- }
71
-
72
- componentWillUnmount() {
73
- window.removeEventListener('resize', this.windowResizeListener);
74
- }
75
-
76
- render() {
77
- return (
78
- <Stack spacing={2} mt={2}>
79
- {this.renderControls()}
80
- {this.renderChessboard()}
81
- {this.renderCode()}
82
- </Stack>
83
- );
84
- }
85
-
86
- private renderControls() {
87
- return (
88
- <Box>
89
- <Typography>Resize the browser to see the chessboard adapt its size...</Typography>
90
- <Typography>{`Current browser width: ${this.state.windowWidth} px`}</Typography>
91
- </Box>
92
- );
93
- }
94
-
95
- private renderChessboard() {
96
- return (
97
- <Box>
98
- <Chessboard squareSize={this.state.squareSize} smallScreenLimits={this.state.limits} />
99
- </Box>
100
- );
101
- }
102
-
103
- private renderCode() {
104
-
105
- const limits = this.state.limits.map(limit => {
106
- const limitAttributes = [ `width: ${limit.width}` ];
107
- if ('squareSize' in limit) {
108
- limitAttributes.push(`squareSize: ${limit.squareSize}`);
109
- }
110
- if ('coordinateVisible' in limit) {
111
- limitAttributes.push(`coordinateVisible: ${limit.coordinateVisible}`);
112
- }
113
- if ('turnVisible' in limit) {
114
- limitAttributes.push(`turnVisible: ${limit.turnVisible}`);
115
- }
116
- return ` { ${limitAttributes.join(', ')} },\n`;
117
- });
118
-
119
- const attributes: string[] = [];
120
- attributes.push(`squareSize={${this.state.squareSize}}`);
121
- attributes.push('smallScreenLimits={limits}');
122
- return (
123
- <pre className="kokopu-demoCode">
124
- {
125
- 'const limits = [\n' +
126
- limits.join('') +
127
- '];\n' +
128
- buildComponentDemoCode('Chessboard', attributes)
129
- }
130
- </pre>
131
- );
132
- }
133
-
134
- private handleWindowResize() {
135
- this.setState({ windowWidth: window.innerWidth });
136
- }
46
+ private windowResizeListener = () => this.handleWindowResize();
47
+
48
+ constructor(props: object) {
49
+ super(props);
50
+ this.state = {
51
+ squareSize: 56,
52
+ windowWidth: window.innerWidth,
53
+ limits: [
54
+ { width: 160, squareSize: 12 },
55
+ { width: 224, squareSize: 16 },
56
+ { width: 250, turnVisible: false },
57
+ { width: 340, squareSize: 24, coordinateVisible: false },
58
+ { width: 450, squareSize: 32 },
59
+ { width: 560, squareSize: 44 },
60
+ { width: 600, squareSize: 52, coordinateVisible: true },
61
+ { width: 640, squareSize: 24, coordinateVisible: false },
62
+ { width: 750, squareSize: 32 },
63
+ { width: 860, squareSize: 44 },
64
+ ],
65
+ };
66
+ }
67
+
68
+ componentDidMount() {
69
+ window.addEventListener('resize', this.windowResizeListener);
70
+ }
71
+
72
+ componentWillUnmount() {
73
+ window.removeEventListener('resize', this.windowResizeListener);
74
+ }
75
+
76
+ render() {
77
+ return (
78
+ <Stack spacing={2} mt={2}>
79
+ {this.renderControls()}
80
+ {this.renderChessboard()}
81
+ {this.renderCode()}
82
+ </Stack>
83
+ );
84
+ }
85
+
86
+ private renderControls() {
87
+ return (
88
+ <Box>
89
+ <Typography>Resize the browser to see the chessboard adapt its size...</Typography>
90
+ <Typography>{`Current browser width: ${this.state.windowWidth} px`}</Typography>
91
+ </Box>
92
+ );
93
+ }
94
+
95
+ private renderChessboard() {
96
+ return (
97
+ <Box>
98
+ <Chessboard squareSize={this.state.squareSize} smallScreenLimits={this.state.limits} />
99
+ </Box>
100
+ );
101
+ }
102
+
103
+ private renderCode() {
104
+
105
+ const limits = this.state.limits.map(limit => {
106
+ const limitAttributes = [ `width: ${limit.width}` ];
107
+ if ('squareSize' in limit) {
108
+ limitAttributes.push(`squareSize: ${limit.squareSize}`);
109
+ }
110
+ if ('coordinateVisible' in limit) {
111
+ limitAttributes.push(`coordinateVisible: ${limit.coordinateVisible}`);
112
+ }
113
+ if ('turnVisible' in limit) {
114
+ limitAttributes.push(`turnVisible: ${limit.turnVisible}`);
115
+ }
116
+ return ` { ${limitAttributes.join(', ')} },\n`;
117
+ });
118
+
119
+ const attributes: string[] = [];
120
+ attributes.push(`squareSize={${this.state.squareSize}}`);
121
+ attributes.push('smallScreenLimits={limits}');
122
+ return (
123
+ <pre className="kokopu-demoCode">
124
+ {
125
+ 'const limits = [\n' +
126
+ limits.join('') +
127
+ '];\n' +
128
+ buildComponentDemoCode('Chessboard', attributes)
129
+ }
130
+ </pre>
131
+ );
132
+ }
133
+
134
+ private handleWindowResize() {
135
+ this.setState({ windowWidth: window.innerWidth });
136
+ }
137
137
 
138
138
  }