kokopu-react 3.2.0 → 3.3.1

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 (347) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/lib/chessboard/Chessboard.d.ts +27 -2
  3. package/dist/lib/chessboard/Chessboard.js +38 -18
  4. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  5. package/dist/lib/chessboard/ChessboardImpl.js +1 -1
  6. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  7. package/dist/lib/chessboard/Motion.js +1 -1
  8. package/dist/lib/chessboard/Motion.js.map +1 -1
  9. package/dist/lib/i18n.js +2 -2
  10. package/dist/lib/i18n.js.map +1 -1
  11. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  12. package/dist/lib/icons/ChessPieceIcon.d.ts +1 -4
  13. package/dist/lib/icons/ChessPieceIcon.js +1 -5
  14. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  15. package/dist/lib/icons/SquareMarkerIcon.d.ts +1 -4
  16. package/dist/lib/icons/SquareMarkerIcon.js +1 -5
  17. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  18. package/dist/lib/icons/TextMarkerIcon.d.ts +1 -4
  19. package/dist/lib/icons/TextMarkerIcon.js +1 -5
  20. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  21. package/dist/lib/index.d.ts +1 -1
  22. package/dist/lib/index.js +1 -1
  23. package/dist/lib/index.js.map +1 -1
  24. package/dist/lib/movetext/Movetext.js.map +1 -1
  25. package/dist/lib/movetext/MovetextImpl.js +4 -3
  26. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  27. package/dist/lib/movetext/htmlFilter.js +1 -1
  28. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  29. package/dist/lib/navigationboard/NavigationBoard.d.ts +37 -8
  30. package/dist/lib/navigationboard/NavigationBoard.js +67 -22
  31. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
  32. package/dist/lib/navigationboard/NavigationButton.d.ts +13 -1
  33. package/dist/lib/navigationboard/NavigationButton.js +32 -0
  34. package/dist/lib/navigationboard/NavigationButton.js.map +1 -1
  35. package/dist/lib/navigationboard/NavigationField.js +1 -1
  36. package/dist/lib/navigationboard/NavigationField.js.map +1 -1
  37. package/dist/lib/navigationboard/NavigationToolbar.d.ts +9 -2
  38. package/dist/lib/navigationboard/NavigationToolbar.js +34 -1
  39. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
  40. package/dist/lib/util.js +2 -2
  41. package/dist/lib/util.js.map +1 -1
  42. package/doc_src/demo/PageChessboardBase.tsx +57 -51
  43. package/doc_src/demo/PageChessboardInteraction.tsx +78 -63
  44. package/doc_src/demo/PageChessboardMove.tsx +35 -30
  45. package/doc_src/demo/PageChessboardSmallScreens.tsx +3 -3
  46. package/doc_src/demo/PageMovetextBase.tsx +91 -81
  47. package/doc_src/demo/PageMovetextInteraction.tsx +23 -21
  48. package/doc_src/demo/PageNavigationBoardBase.tsx +62 -54
  49. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +24 -18
  50. package/doc_src/theming/LogoRenderer.js +8 -9
  51. package/package.json +30 -28
  52. package/scripts/docker-compose.yml +1 -3
  53. package/src/chessboard/BoardProperties.ts +13 -13
  54. package/src/chessboard/Chessboard.tsx +106 -46
  55. package/src/chessboard/ChessboardImpl.tsx +58 -41
  56. package/src/chessboard/Draggable.tsx +15 -15
  57. package/src/chessboard/Motion.tsx +4 -4
  58. package/src/errorbox/ErrorBox.tsx +5 -5
  59. package/src/errorbox/parsing.tsx +6 -6
  60. package/src/i18n.ts +2 -2
  61. package/src/icons/AnnotationSymbolShape.tsx +5 -5
  62. package/src/icons/ArrowMarkerIcon.tsx +8 -4
  63. package/src/icons/ArrowTip.tsx +2 -2
  64. package/src/icons/ChessPieceIcon.tsx +4 -11
  65. package/src/icons/SquareMarkerIcon.tsx +3 -10
  66. package/src/icons/TextMarkerIcon.tsx +4 -11
  67. package/src/index.ts +1 -1
  68. package/src/movetext/Movetext.tsx +11 -10
  69. package/src/movetext/MovetextImpl.tsx +34 -28
  70. package/src/movetext/htmlFilter.tsx +4 -4
  71. package/src/navigationboard/NavigationBoard.tsx +150 -58
  72. package/src/navigationboard/NavigationButton.ts +47 -5
  73. package/src/navigationboard/NavigationField.tsx +6 -6
  74. package/src/navigationboard/NavigationToolbar.tsx +62 -15
  75. package/src/types.ts +26 -26
  76. package/src/util.ts +2 -2
  77. package/test/01_types.js +83 -61
  78. package/test/02_chessboard_util.js +79 -1
  79. package/test/03_error_box_graphic.js +1 -1
  80. package/test/07_chessboard_interaction.js +1 -2
  81. package/test/13_navigation_board_graphic.js +3 -3
  82. package/test/common/graphic.js +11 -11
  83. package/test/graphic_references/03_error_box_graphic/base/cut_beginning_of_text.png +0 -0
  84. package/test/graphic_references/03_error_box_graphic/base/cut_end_of_text.png +0 -0
  85. package/test/graphic_references/03_error_box_graphic/base/cut_on_line_breaks.png +0 -0
  86. package/test/graphic_references/03_error_box_graphic/base/error_index_not_integer.png +0 -0
  87. package/test/graphic_references/03_error_box_graphic/base/full.png +0 -0
  88. package/test/graphic_references/03_error_box_graphic/base/minimal.png +0 -0
  89. package/test/graphic_references/03_error_box_graphic/base/missing_error_index.png +0 -0
  90. package/test/graphic_references/03_error_box_graphic/base/missing_error_text.png +0 -0
  91. package/test/graphic_references/03_error_box_graphic/base/negative_error_index.png +0 -0
  92. package/test/graphic_references/03_error_box_graphic/base/single_character_text.png +0 -0
  93. package/test/graphic_references/03_error_box_graphic/base/too_large_error_index.png +0 -0
  94. package/test/graphic_references/03_error_box_graphic/localization/default.png +0 -0
  95. package/test/graphic_references/04_icons_graphic/chess_piece/customized_pieceset.png +0 -0
  96. package/test/graphic_references/04_icons_graphic/chess_piece/invalid_multiple_pieces.png +0 -0
  97. package/test/graphic_references/04_icons_graphic/chess_piece/invalid_pieceset.png +0 -0
  98. package/test/graphic_references/04_icons_graphic/chess_piece/invalid_single_piece.png +0 -0
  99. package/test/graphic_references/04_icons_graphic/chess_piece/invalid_size.png +0 -0
  100. package/test/graphic_references/04_icons_graphic/chess_piece/multiple_pieces.png +0 -0
  101. package/test/graphic_references/04_icons_graphic/chess_piece/single_piece.png +0 -0
  102. package/test/graphic_references/04_icons_graphic/marker/colorized_arrow.png +0 -0
  103. package/test/graphic_references/04_icons_graphic/marker/colorized_square.png +0 -0
  104. package/test/graphic_references/04_icons_graphic/marker/colorized_symbol.png +0 -0
  105. package/test/graphic_references/04_icons_graphic/marker/colorized_text.png +0 -0
  106. package/test/graphic_references/04_icons_graphic/marker/default_arrow.png +0 -0
  107. package/test/graphic_references/04_icons_graphic/marker/default_square.png +0 -0
  108. package/test/graphic_references/04_icons_graphic/marker/default_text.png +0 -0
  109. package/test/graphic_references/04_icons_graphic/marker/invalid_arrow_size.png +0 -0
  110. package/test/graphic_references/04_icons_graphic/marker/invalid_square_size.png +0 -0
  111. package/test/graphic_references/04_icons_graphic/marker/invalid_symbol.png +0 -0
  112. package/test/graphic_references/04_icons_graphic/marker/invalid_text_size.png +0 -0
  113. package/test/graphic_references/04_icons_graphic/marker/wrapped_arrow.png +0 -0
  114. package/test/graphic_references/04_icons_graphic/marker/wrapped_square.png +0 -0
  115. package/test/graphic_references/04_icons_graphic/marker/wrapped_symbol.png +0 -0
  116. package/test/graphic_references/04_icons_graphic/marker/wrapped_text.png +0 -0
  117. package/test/graphic_references/05_chessboard_graphic/annotations/overlap.png +0 -0
  118. package/test/graphic_references/05_chessboard_graphic/annotations/overlap_and_flip.png +0 -0
  119. package/test/graphic_references/05_chessboard_graphic/annotations/with_coordinates.png +0 -0
  120. package/test/graphic_references/05_chessboard_graphic/annotations/with_coordinates_and_flip.png +0 -0
  121. package/test/graphic_references/05_chessboard_graphic/annotations/without_coordinates.png +0 -0
  122. package/test/graphic_references/05_chessboard_graphic/annotations/without_coordinates_and_flip.png +0 -0
  123. package/test/graphic_references/05_chessboard_graphic/base/default.png +0 -0
  124. package/test/graphic_references/05_chessboard_graphic/base/empty.png +0 -0
  125. package/test/graphic_references/05_chessboard_graphic/base/from_fen.png +0 -0
  126. package/test/graphic_references/05_chessboard_graphic/base/from_kokopu_object.png +0 -0
  127. package/test/graphic_references/05_chessboard_graphic/base/parsing_error.png +0 -0
  128. package/test/graphic_references/05_chessboard_graphic/base/wrong_position_type.png +0 -0
  129. package/test/graphic_references/05_chessboard_graphic/chess_variants/chess960.png +0 -0
  130. package/test/graphic_references/05_chessboard_graphic/chess_variants/chess960_with_move.png +0 -0
  131. package/test/graphic_references/05_chessboard_graphic/chess_variants/invalid_variant.png +0 -0
  132. package/test/graphic_references/05_chessboard_graphic/chess_variants/invalid_variant_with_fen.png +0 -0
  133. package/test/graphic_references/05_chessboard_graphic/chess_variants/special_code.png +0 -0
  134. package/test/graphic_references/05_chessboard_graphic/chess_variants/variant_with_std_initial_position.png +0 -0
  135. package/test/graphic_references/05_chessboard_graphic/chess_variants/variant_without_std_initial_position.png +0 -0
  136. package/test/graphic_references/05_chessboard_graphic/flipped/default.png +0 -0
  137. package/test/graphic_references/05_chessboard_graphic/flipped/empty.png +0 -0
  138. package/test/graphic_references/05_chessboard_graphic/flipped/from_fen.png +0 -0
  139. package/test/graphic_references/05_chessboard_graphic/flipped/from_kokopu_object.png +0 -0
  140. package/test/graphic_references/05_chessboard_graphic/flipped/parsing_error.png +0 -0
  141. package/test/graphic_references/05_chessboard_graphic/move/capture.png +0 -0
  142. package/test/graphic_references/05_chessboard_graphic/move/castling_move.png +0 -0
  143. package/test/graphic_references/05_chessboard_graphic/move/default.png +0 -0
  144. package/test/graphic_references/05_chessboard_graphic/move/en-passant.png +0 -0
  145. package/test/graphic_references/05_chessboard_graphic/move/illegal_null-move.png +0 -0
  146. package/test/graphic_references/05_chessboard_graphic/move/no_move_arrow.png +0 -0
  147. package/test/graphic_references/05_chessboard_graphic/move/null-move.png +0 -0
  148. package/test/graphic_references/05_chessboard_graphic/move/parsing_error.png +0 -0
  149. package/test/graphic_references/05_chessboard_graphic/move/promotion.png +0 -0
  150. package/test/graphic_references/05_chessboard_graphic/move/with_forced_move_arrow_and_flip.png +0 -0
  151. package/test/graphic_references/05_chessboard_graphic/move/wrong_move_arrow_color_type.png +0 -0
  152. package/test/graphic_references/05_chessboard_graphic/move/wrong_move_type.png +0 -0
  153. package/test/graphic_references/05_chessboard_graphic/theme/custom_1.png +0 -0
  154. package/test/graphic_references/05_chessboard_graphic/theme/custom_2.png +0 -0
  155. package/test/graphic_references/05_chessboard_graphic/theme/custom_3.png +0 -0
  156. package/test/graphic_references/05_chessboard_graphic/theme/custom_4.png +0 -0
  157. package/test/graphic_references/05_chessboard_graphic/theme/custom_5.png +0 -0
  158. package/test/graphic_references/05_chessboard_graphic/theme/custom_6.png +0 -0
  159. package/test/graphic_references/05_chessboard_graphic/theme/default.png +0 -0
  160. package/test/graphic_references/05_chessboard_graphic/theme/large.png +0 -0
  161. package/test/graphic_references/05_chessboard_graphic/theme/small.png +0 -0
  162. package/test/graphic_references/05_chessboard_graphic/theme/wrong_colorset.png +0 -0
  163. package/test/graphic_references/05_chessboard_graphic/theme/wrong_pieceset.png +0 -0
  164. package/test/graphic_references/05_chessboard_graphic/theme/wrong_square_size_type.png +0 -0
  165. package/test/graphic_references/06_chessboard_animation/base_1/capture.png +0 -0
  166. package/test/graphic_references/06_chessboard_animation/base_1/castling_move.png +0 -0
  167. package/test/graphic_references/06_chessboard_animation/base_1/en-passant.png +0 -0
  168. package/test/graphic_references/06_chessboard_animation/base_1/move_1.png +0 -0
  169. package/test/graphic_references/06_chessboard_animation/base_1/move_2.png +0 -0
  170. package/test/graphic_references/06_chessboard_animation/base_1/promotion.png +0 -0
  171. package/test/graphic_references/06_chessboard_animation/base_2/capture.png +0 -0
  172. package/test/graphic_references/06_chessboard_animation/base_2/castling_move.png +0 -0
  173. package/test/graphic_references/06_chessboard_animation/base_2/en-passant.png +0 -0
  174. package/test/graphic_references/06_chessboard_animation/base_2/move_1.png +0 -0
  175. package/test/graphic_references/06_chessboard_animation/base_2/move_2.png +0 -0
  176. package/test/graphic_references/06_chessboard_animation/base_2/promotion.png +0 -0
  177. package/test/graphic_references/06_chessboard_animation/base_3/capture.png +0 -0
  178. package/test/graphic_references/06_chessboard_animation/base_3/castling_move.png +0 -0
  179. package/test/graphic_references/06_chessboard_animation/base_3/en-passant.png +0 -0
  180. package/test/graphic_references/06_chessboard_animation/base_3/move_1.png +0 -0
  181. package/test/graphic_references/06_chessboard_animation/base_3/move_2.png +0 -0
  182. package/test/graphic_references/06_chessboard_animation/base_3/promotion.png +0 -0
  183. package/test/graphic_references/06_chessboard_animation/on_redraw/final_state.png +0 -0
  184. package/test/graphic_references/06_chessboard_animation/on_redraw/initial_state.png +0 -0
  185. package/test/graphic_references/07_chessboard_interaction/edit_arrows/base_1.png +0 -0
  186. package/test/graphic_references/07_chessboard_interaction/edit_arrows/base_2.png +0 -0
  187. package/test/graphic_references/07_chessboard_interaction/edit_arrows/from_==_to.png +0 -0
  188. package/test/graphic_references/07_chessboard_interaction/edit_arrows/out_of_board.png +0 -0
  189. package/test/graphic_references/07_chessboard_interaction/edit_arrows/over_arrow_marker.png +0 -0
  190. package/test/graphic_references/07_chessboard_interaction/edit_arrows/over_square_marker.png +0 -0
  191. package/test/graphic_references/07_chessboard_interaction/error/edit_color_not_set.png +0 -0
  192. package/test/graphic_references/07_chessboard_interaction/error/wrong_interaction_mode.png +0 -0
  193. package/test/graphic_references/07_chessboard_interaction/move_pieces/after_move.png +0 -0
  194. package/test/graphic_references/07_chessboard_interaction/move_pieces/from_==_to.png +0 -0
  195. package/test/graphic_references/07_chessboard_interaction/move_pieces/move_empty_square.png +0 -0
  196. package/test/graphic_references/07_chessboard_interaction/move_pieces/out_of_board.png +0 -0
  197. package/test/graphic_references/07_chessboard_interaction/move_pieces/over_arrow_marker.png +0 -0
  198. package/test/graphic_references/07_chessboard_interaction/move_pieces/over_empty.png +0 -0
  199. package/test/graphic_references/07_chessboard_interaction/move_pieces/over_non-empty_1.png +0 -0
  200. package/test/graphic_references/07_chessboard_interaction/move_pieces/over_non-empty_2.png +0 -0
  201. package/test/graphic_references/07_chessboard_interaction/move_pieces/over_square_marker.png +0 -0
  202. package/test/graphic_references/07_chessboard_interaction/move_pieces/over_text_marker.png +0 -0
  203. package/test/graphic_references/08_chessboard_play_moves/base/castling_move.png +0 -0
  204. package/test/graphic_references/08_chessboard_play_moves/base/chess960_ambiguous_king_move.png +0 -0
  205. package/test/graphic_references/08_chessboard_play_moves/base/chess960_castling_move_1.png +0 -0
  206. package/test/graphic_references/08_chessboard_play_moves/base/chess960_castling_move_2.png +0 -0
  207. package/test/graphic_references/08_chessboard_play_moves/base/chess960_non-kxr_castling.png +0 -0
  208. package/test/graphic_references/08_chessboard_play_moves/base/from_==_to.png +0 -0
  209. package/test/graphic_references/08_chessboard_play_moves/base/illegal_move.png +0 -0
  210. package/test/graphic_references/08_chessboard_play_moves/base/illegal_position.png +0 -0
  211. package/test/graphic_references/08_chessboard_play_moves/base/out_of_board.png +0 -0
  212. package/test/graphic_references/08_chessboard_play_moves/base/regular_move_1.png +0 -0
  213. package/test/graphic_references/08_chessboard_play_moves/base/regular_move_2.png +0 -0
  214. package/test/graphic_references/08_chessboard_play_moves/base/wrong_color_moved.png +0 -0
  215. package/test/graphic_references/08_chessboard_play_moves/promotions/antichess_promotion.png +0 -0
  216. package/test/graphic_references/08_chessboard_play_moves/promotions/cancel_promotion.png +0 -0
  217. package/test/graphic_references/08_chessboard_play_moves/promotions/regular_promotion_1.png +0 -0
  218. package/test/graphic_references/08_chessboard_play_moves/promotions/regular_promotion_2.png +0 -0
  219. package/test/graphic_references/09_chessboard_small_screens/base/default.png +0 -0
  220. package/test/graphic_references/09_chessboard_small_screens/base/invalid_limits.png +0 -0
  221. package/test/graphic_references/09_chessboard_small_screens/base/width_690.png +0 -0
  222. package/test/graphic_references/09_chessboard_small_screens/base/width_700.png +0 -0
  223. package/test/graphic_references/09_chessboard_small_screens/base/width_710.png +0 -0
  224. package/test/graphic_references/09_chessboard_small_screens/base/width_720.png +0 -0
  225. package/test/graphic_references/09_chessboard_small_screens/base/width_730.png +0 -0
  226. package/test/graphic_references/09_chessboard_small_screens/base/width_740.png +0 -0
  227. package/test/graphic_references/09_chessboard_small_screens/base/width_750.png +0 -0
  228. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_bottom_component.png +0 -0
  229. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_top_component.png +0 -0
  230. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_bottom_component.png +0 -0
  231. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_top_component.png +0 -0
  232. package/test/graphic_references/10_movetext_graphic/base/game_1.png +0 -0
  233. package/test/graphic_references/10_movetext_graphic/base/game_2.png +0 -0
  234. package/test/graphic_references/10_movetext_graphic/base/game_3.png +0 -0
  235. package/test/graphic_references/10_movetext_graphic/base/game_4.png +0 -0
  236. package/test/graphic_references/10_movetext_graphic/error/pgn_parsing_error_1.png +0 -0
  237. package/test/graphic_references/10_movetext_graphic/error/pgn_parsing_error_2.png +0 -0
  238. package/test/graphic_references/10_movetext_graphic/error/wrong_game_index_1.png +0 -0
  239. package/test/graphic_references/10_movetext_graphic/error/wrong_game_index_2.png +0 -0
  240. package/test/graphic_references/10_movetext_graphic/error/wrong_game_index_type.png +0 -0
  241. package/test/graphic_references/10_movetext_graphic/error/wrong_game_type.png +0 -0
  242. package/test/graphic_references/10_movetext_graphic/format_move/format_text.png +0 -0
  243. package/test/graphic_references/10_movetext_graphic/html/filtered_tags_and_attributes.png +0 -0
  244. package/test/graphic_references/10_movetext_graphic/html/html_in_comments.png +0 -0
  245. package/test/graphic_references/10_movetext_graphic/html/html_in_headers.png +0 -0
  246. package/test/graphic_references/10_movetext_graphic/options/custom_piece_symbols.png +0 -0
  247. package/test/graphic_references/10_movetext_graphic/options/figurine_piece_symbols_and_diagram_options.png +0 -0
  248. package/test/graphic_references/10_movetext_graphic/options/hidden_diagrams.png +0 -0
  249. package/test/graphic_references/10_movetext_graphic/options/localized_piece_symbols.png +0 -0
  250. package/test/graphic_references/10_movetext_graphic/options/other_diagram_options.png +0 -0
  251. package/test/graphic_references/10_movetext_graphic/options/wrong_diagram_options_1.png +0 -0
  252. package/test/graphic_references/10_movetext_graphic/options/wrong_diagram_options_2.png +0 -0
  253. package/test/graphic_references/10_movetext_graphic/options/wrong_piece_symbol_value.png +0 -0
  254. package/test/graphic_references/11_movetext_interaction/error/wrong_interaction_mode.png +0 -0
  255. package/test/graphic_references/11_movetext_interaction/select_moves/click_on_disabled.png +0 -0
  256. package/test/graphic_references/11_movetext_interaction/select_moves/click_on_unselected.png +0 -0
  257. package/test/graphic_references/11_movetext_interaction/select_moves/click_on_unselected_without_callback.png +0 -0
  258. package/test/graphic_references/11_movetext_interaction/select_moves/click_on_with_variations.png +0 -0
  259. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  260. package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_0.png +0 -0
  261. package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_1.png +0 -0
  262. package/test/graphic_references/12_navigation_board_base/controlled/invalid_node_id.png +0 -0
  263. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  264. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_1.png +0 -0
  265. package/test/graphic_references/12_navigation_board_base/controlled/overriding_initial_node_id.png +0 -0
  266. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_0.png +0 -0
  267. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_1.png +0 -0
  268. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_2.png +0 -0
  269. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_3.png +0 -0
  270. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png +0 -0
  271. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png +0 -0
  272. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png +0 -0
  273. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png +0 -0
  274. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  275. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  276. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_end.png +0 -0
  277. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  278. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default.png +0 -0
  279. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default_with_game_index.png +0 -0
  280. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_on_null-move.png +0 -0
  281. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_0.png +0 -0
  282. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  283. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_2.png +0 -0
  284. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_3.png +0 -0
  285. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_4.png +0 -0
  286. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_0.png +0 -0
  287. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_1.png +0 -0
  288. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_0.png +0 -0
  289. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_1.png +0 -0
  290. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_2.png +0 -0
  291. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  292. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_4.png +0 -0
  293. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_5.png +0 -0
  294. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  295. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  296. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  297. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/single_button.png +0 -0
  298. package/test/graphic_references/13_navigation_board_graphic/error/pgn_parsing_error.png +0 -0
  299. package/test/graphic_references/13_navigation_board_graphic/error/wrong_game_type.png +0 -0
  300. package/test/graphic_references/13_navigation_board_graphic/theme/custom_1.png +0 -0
  301. package/test/graphic_references/13_navigation_board_graphic/theme/custom_2.png +0 -0
  302. package/test/graphic_references/13_navigation_board_graphic/theme/large.png +0 -0
  303. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  304. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  305. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  306. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  307. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  308. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_reaching_the_end.png +0 -0
  309. package/test/graphic_references/14_navigation_board_autoplay/controlled/already_at_the_end.png +0 -0
  310. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  311. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  312. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_at_the_end.png +0 -0
  313. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  314. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  315. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  316. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  317. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  318. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  319. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  320. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  321. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_default.png +0 -0
  322. package/test/graphic_test_app/03_error_box_graphic/base.tsx +18 -6
  323. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +12 -3
  324. package/test/graphic_test_app/04_icons_graphic/marker.tsx +14 -4
  325. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -3
  326. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +1 -1
  327. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +9 -2
  328. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +1 -1
  329. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +8 -6
  330. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +4 -2
  331. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -2
  332. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +3 -1
  333. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +4 -2
  334. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +12 -6
  335. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +12 -3
  336. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +3 -1
  337. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +8 -6
  338. package/test/graphic_test_app/10_movetext_graphic/error.tsx +1 -1
  339. package/test/graphic_test_app/10_movetext_graphic/options.tsx +16 -6
  340. package/test/graphic_test_app/11_movetext_interaction/error.tsx +4 -1
  341. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +24 -17
  342. package/test/graphic_test_app/13_navigation_board_graphic/error.tsx +1 -1
  343. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +34 -18
  344. package/test/graphic_test_app/common/test_app.tsx +4 -4
  345. package/.eslintrc.yml +0 -83
  346. package/test/.eslintrc.yml +0 -8
  347. package/test/graphic_test_app/.eslintrc.yml +0 -3
@@ -31,10 +31,10 @@ import { DEFAULT_PIECESET } from './piecesets';
31
31
  * Define a limit applicable to the parameters of a {@link Chessboard} on small-screen devices.
32
32
  */
33
33
  export interface SmallScreenLimit {
34
- width: number;
35
- squareSize?: number;
36
- coordinateVisible?: boolean;
37
- turnVisible?: boolean;
34
+ width: number,
35
+ squareSize?: number,
36
+ coordinateVisible?: boolean,
37
+ turnVisible?: boolean,
38
38
  }
39
39
 
40
40
 
@@ -46,27 +46,27 @@ export interface StaticBoardGraphicProps {
46
46
  /**
47
47
  * Size of the squares (in pixels). Must be an integer between `Chessboard.minSquareSize()` and `Chessboard.maxSquareSize()`.
48
48
  */
49
- squareSize: number;
49
+ squareSize: number,
50
50
 
51
51
  /**
52
52
  * Whether the row and column coordinates are visible or not.
53
53
  */
54
- coordinateVisible: boolean;
54
+ coordinateVisible: boolean,
55
55
 
56
56
  /**
57
57
  * Whether the turn flag is visible or not.
58
58
  */
59
- turnVisible: boolean;
59
+ turnVisible: boolean,
60
60
 
61
61
  /**
62
62
  * Color theme ID. Must be a property of `Chessboard.colorsets()`.
63
63
  */
64
- colorset: string;
64
+ colorset: string,
65
65
 
66
66
  /**
67
67
  * Piece theme ID. Must be a property of `Chessboard.piecesets()`.
68
68
  */
69
- pieceset: string;
69
+ pieceset: string,
70
70
 
71
71
  /**
72
72
  * Limits applicable on small-screen devices. For instance, if set to
@@ -81,7 +81,7 @@ export interface StaticBoardGraphicProps {
81
81
  * will be limited to 24 and the row and column coordinates will always be hidden (whatever the value of the
82
82
  * `coordinateVisible` attribute).
83
83
  */
84
- smallScreenLimits?: SmallScreenLimit[];
84
+ smallScreenLimits?: SmallScreenLimit[],
85
85
  }
86
86
 
87
87
 
@@ -93,17 +93,17 @@ export interface DynamicBoardGraphicProps extends StaticBoardGraphicProps {
93
93
  /**
94
94
  * Whether moves are highlighted with an arrow or not.
95
95
  */
96
- moveArrowVisible: boolean;
96
+ moveArrowVisible: boolean,
97
97
 
98
98
  /**
99
99
  * Color of the move arrow.
100
100
  */
101
- moveArrowColor: AnnotationColor;
101
+ moveArrowColor: AnnotationColor,
102
102
 
103
103
  /**
104
104
  * Whether moves are animated or not.
105
105
  */
106
- animated: boolean;
106
+ animated: boolean,
107
107
  }
108
108
 
109
109
 
@@ -49,36 +49,36 @@ export interface ChessboardProps extends DynamicBoardGraphicProps {
49
49
  * [game variant](https://kokopu.yo35.org/docs/current/types/GameVariant.html) supported by Kokopu. For instance:
50
50
  * `'chess960:nrkbqrbn/pppppppp/8/8/8/8/PPPPPPPP/NRKBQRBN w KQkq - 0 1'`.
51
51
  */
52
- position: Position | string;
52
+ position: Position | string,
53
53
 
54
54
  /**
55
55
  * Displayed move (optional), defined either as a [kokopu.MoveDescriptor](https://kokopu.yo35.org/docs/current/classes/MoveDescriptor.html) object
56
56
  * or as a [SAN string](https://en.wikipedia.org/wiki/Algebraic_notation_(chess)) (e.g. `'Nf3'`). Use `'--'` for a null-move.
57
57
  * In all cases, the move must be a legal move in position defined in attribute `position`.
58
58
  */
59
- move?: MoveDescriptor | string;
59
+ move?: MoveDescriptor | string,
60
60
 
61
61
  /**
62
62
  * Square markers, defined as a {@link SquareMarkerSet} (e.g. `{ e4: 'g', d5: 'r' }`) or as a comma-separated CSL string (e.g. `'Rd5,Ge4'`).
63
63
  */
64
- squareMarkers?: SquareMarkerSet | string;
64
+ squareMarkers?: SquareMarkerSet | string,
65
65
 
66
66
  /**
67
67
  * Text markers, defined as a {@link TextMarkerSet} (e.g. `{ e4: { symbol: 'A', color: 'g' }, d5: { symbol: 'z', color: 'r' }}`)
68
68
  * or as a comma-separated CTL string (e.g. `'Rzd5,GAe4'`).
69
69
  */
70
- textMarkers?: TextMarkerSet | string;
70
+ textMarkers?: TextMarkerSet | string,
71
71
 
72
72
  /**
73
73
  * Arrow markers, defined as a {@link ArrowMarkerSet} (e.g. `{ e2e4: 'g', g8f6: 'r', g8h6: 'y' }`)
74
74
  * or as a comma-separated CAL string (e.g. `'Ge2e4,Rg8f6,Yg8h6'`).
75
75
  */
76
- arrowMarkers?: ArrowMarkerSet | string;
76
+ arrowMarkers?: ArrowMarkerSet | string,
77
77
 
78
78
  /**
79
79
  * Whether the board is flipped (i.e. seen from Black's point of view) or not.
80
80
  */
81
- flipped: boolean;
81
+ flipped: boolean,
82
82
 
83
83
  /**
84
84
  * Type of action allowed with the mouse on the chessboard. If undefined, then the user cannot interact with the component.
@@ -93,44 +93,72 @@ export interface ChessboardProps extends DynamicBoardGraphicProps {
93
93
  /**
94
94
  * Color of the edited arrow. Mandatory if `interactionMode === 'editArrows'`, ignored otherwise.
95
95
  */
96
- editedArrowColor?: AnnotationColor;
96
+ editedArrowColor?: AnnotationColor,
97
97
 
98
98
  /**
99
99
  * Callback invoked when a piece is moved through drag&drop (only if `interactionMode` is set to `'movePieces'`).
100
100
  */
101
- onPieceMoved?: (from: Square, to: Square) => void;
101
+ onPieceMoved?: (from: Square, to: Square) => void,
102
102
 
103
103
  /**
104
104
  * Callback invoked when the user clicks on a square (only if `interactionMode` is set to `'clickSquares'`).
105
105
  */
106
- onSquareClicked?: (square: Square) => void;
106
+ onSquareClicked?: (square: Square) => void,
107
107
 
108
108
  /**
109
109
  * Callback invoked when an arrow is dragged (only if `interactionMode` is set to `'editArrows'`).
110
110
  */
111
- onArrowEdited?: (from: Square, to: Square) => void;
111
+ onArrowEdited?: (from: Square, to: Square) => void,
112
112
 
113
113
  /**
114
114
  * Callback invoked when a move is played (only if `interactionMode` is set to `'playMoves'`).
115
115
  */
116
- onMovePlayed?: (move: string) => void;
116
+ onMovePlayed?: (move: string) => void,
117
117
 
118
118
  /**
119
119
  * Optional component, to be rendered above the chessboard, and customized with the same square-size / coordinate-visible / turn-visible
120
120
  * parameter values as actually used for the chessboard (which may be different from what is defined in props because of small-screen limits).
121
121
  */
122
- topComponent?: (attr: Pick<StaticBoardGraphicProps, 'squareSize' | 'coordinateVisible' | 'turnVisible'>) => JSX.Element;
122
+ topComponent?: (attr: Pick<StaticBoardGraphicProps, 'squareSize' | 'coordinateVisible' | 'turnVisible'>) => JSX.Element,
123
123
 
124
124
  /**
125
125
  * Optional component, to be rendered below the chessboard, and customized with the same square-size / coordinate-visible / turn-visible
126
126
  * parameter values as actually used for the chessboard (which may be different from what is defined in props because of small-screen limits).
127
127
  */
128
- bottomComponent?: (attr: Pick<StaticBoardGraphicProps, 'squareSize' | 'coordinateVisible' | 'turnVisible'>) => JSX.Element;
128
+ bottomComponent?: (attr: Pick<StaticBoardGraphicProps, 'squareSize' | 'coordinateVisible' | 'turnVisible'>) => JSX.Element,
129
+ }
130
+
131
+
132
+ type AuxilliaryComponentSizeFunction = (attr: Pick<StaticBoardGraphicProps, 'squareSize' | 'coordinateVisible' | 'turnVisible'>) => { width: number, height: number };
133
+
134
+
135
+ /**
136
+ * Attributes for method `Chessboard.size()`.
137
+ */
138
+ export interface ChessboardSizeAttr {
139
+ squareSize?: ChessboardProps['squareSize'],
140
+ coordinateVisible?: ChessboardProps['coordinateVisible'],
141
+ turnVisible?: ChessboardProps['turnVisible'],
142
+ smallScreenLimits?: ChessboardProps['smallScreenLimits'],
143
+ topComponent?: AuxilliaryComponentSizeFunction,
144
+ bottomComponent?: AuxilliaryComponentSizeFunction,
145
+ }
146
+
147
+
148
+ /**
149
+ * Attributes for method `Chessboard.adaptSquareSize()`.
150
+ */
151
+ export interface ChessboardAdaptSquareSizeAttr {
152
+ coordinateVisible?: ChessboardProps['coordinateVisible'],
153
+ turnVisible?: ChessboardProps['turnVisible'],
154
+ smallScreenLimits?: ChessboardProps['smallScreenLimits'],
155
+ topComponent?: AuxilliaryComponentSizeFunction,
156
+ bottomComponent?: AuxilliaryComponentSizeFunction,
129
157
  }
130
158
 
131
159
 
132
160
  interface ChessboardState {
133
- windowWidth: number;
161
+ windowWidth: number,
134
162
  }
135
163
 
136
164
 
@@ -228,18 +256,21 @@ export class Chessboard extends React.Component<ChessboardProps, ChessboardState
228
256
  // (mandatory to ensure that the move animation works properly and that the internal state of the component remains consistent).
229
257
  const key = `${position.variant()}|${position.fen()}|${move ? position.notation(move) : ''}`;
230
258
 
231
- return (<>
232
- {this.props.topComponent ? this.props.topComponent(auxilliaryComponentAttr) : undefined}
233
- <ChessboardImpl key={key}
234
- position={position} move={move} squareMarkers={sqm} textMarkers={txtm} arrowMarkers={arm} flipped={flipped}
235
- squareSize={actualSquareSize} coordinateVisible={actualCoordinateVisible} turnVisible={actualTurnVisible}
236
- moveArrowVisible={moveArrowVisible} moveArrowColor={this.props.moveArrowColor} animated={animated}
237
- colorset={colorset} pieceset={pieceset}
238
- interactionMode={interactionMode} editedArrowColor={this.props.editedArrowColor}
239
- onPieceMoved={onPieceMoved} onSquareClicked={onSquareClicked} onArrowEdited={onArrowEdited} onMovePlayed={onMovePlayed}
240
- />
241
- {this.props.bottomComponent ? this.props.bottomComponent(auxilliaryComponentAttr) : undefined}
242
- </>);
259
+ return (
260
+ <>
261
+ {this.props.topComponent ? this.props.topComponent(auxilliaryComponentAttr) : undefined}
262
+ <ChessboardImpl
263
+ key={key}
264
+ position={position} move={move} squareMarkers={sqm} textMarkers={txtm} arrowMarkers={arm} flipped={flipped}
265
+ squareSize={actualSquareSize} coordinateVisible={actualCoordinateVisible} turnVisible={actualTurnVisible}
266
+ moveArrowVisible={moveArrowVisible} moveArrowColor={this.props.moveArrowColor} animated={animated}
267
+ colorset={colorset} pieceset={pieceset}
268
+ interactionMode={interactionMode} editedArrowColor={this.props.editedArrowColor}
269
+ onPieceMoved={onPieceMoved} onSquareClicked={onSquareClicked} onArrowEdited={onArrowEdited} onMovePlayed={onMovePlayed}
270
+ />
271
+ {this.props.bottomComponent ? this.props.bottomComponent(auxilliaryComponentAttr) : undefined}
272
+ </>
273
+ );
243
274
  }
244
275
 
245
276
  private getInteractionModeAndValidateEditedArrowColor() {
@@ -261,50 +292,54 @@ export class Chessboard extends React.Component<ChessboardProps, ChessboardState
261
292
  /**
262
293
  * Return the size of the chessboard, assuming it is built with the given attributes.
263
294
  */
264
- static size(attr?: Partial<Pick<ChessboardProps, 'squareSize' | 'coordinateVisible' | 'turnVisible' | 'smallScreenLimits'>>): { width: number, height: number } {
265
- let { squareSize, coordinateVisible, turnVisible, smallScreenLimits } = sanitizePartialObject(attr, () => new IllegalArgument('Chessboard.size()', 'attr'));
295
+ static size(attr?: ChessboardSizeAttr): { width: number, height: number } {
296
+ const { squareSize, coordinateVisible, turnVisible, smallScreenLimits, topComponent, bottomComponent } = sanitizePartialObject(attr,
297
+ () => new IllegalArgument('Chessboard.size()', 'attr'));
266
298
 
267
299
  // Sanitize the arguments.
268
- squareSize = squareSize === undefined ? DEFAULT_SQUARE_SIZE :
300
+ let actualSquareSize = squareSize === undefined ?
301
+ DEFAULT_SQUARE_SIZE :
269
302
  sanitizeBoundedInteger(squareSize, MIN_SQUARE_SIZE, MAX_SQUARE_SIZE, () => new IllegalArgument('Chessboard.size()', 'squareSize'));
270
- coordinateVisible = coordinateVisible === undefined ? true : sanitizeBoolean(coordinateVisible);
271
- turnVisible = turnVisible === undefined ? true : sanitizeBoolean(turnVisible);
272
- smallScreenLimits = sanitizeSmallScreenLimits(smallScreenLimits, () => new IllegalArgument('Chessboard.size()', 'smallScreenLimits'));
303
+ let actualCoordinateVisible = coordinateVisible === undefined ? true : sanitizeBoolean(coordinateVisible);
304
+ let actualTurnVisible = turnVisible === undefined ? true : sanitizeBoolean(turnVisible);
305
+ const actualLimits = sanitizeSmallScreenLimits(smallScreenLimits, () => new IllegalArgument('Chessboard.size()', 'smallScreenLimits'));
273
306
 
274
307
  // Enforce small-screen limits, if any.
275
308
  if (typeof window !== 'undefined') {
276
- squareSize = computeSquareSizeForSmallScreens(squareSize, smallScreenLimits, window.innerWidth);
277
- coordinateVisible = computeCoordinateVisibleForSmallScreens(coordinateVisible, smallScreenLimits, window.innerWidth);
278
- turnVisible = computeTurnVisibleForSmallScreens(turnVisible, smallScreenLimits, window.innerWidth);
309
+ actualSquareSize = computeSquareSizeForSmallScreens(actualSquareSize, actualLimits, window.innerWidth);
310
+ actualCoordinateVisible = computeCoordinateVisibleForSmallScreens(actualCoordinateVisible, actualLimits, window.innerWidth);
311
+ actualTurnVisible = computeTurnVisibleForSmallScreens(actualTurnVisible, actualLimits, window.innerWidth);
279
312
  }
280
313
 
281
314
  // Compute the dimensions.
282
- return chessboardSize(squareSize, coordinateVisible, turnVisible);
315
+ return chessBoardWithAuxilliaryComponentSize(actualSquareSize, actualCoordinateVisible, actualTurnVisible, topComponent, bottomComponent);
283
316
  }
284
317
 
285
318
  /**
286
319
  * Return the maximum square size that would allow the chessboard to fit in a rectangle of size `width x height`.
287
320
  */
288
- static adaptSquareSize(width: number, height: number, attr?: Partial<Pick<ChessboardProps, 'coordinateVisible' | 'turnVisible' | 'smallScreenLimits'>>): number {
289
- let { coordinateVisible, turnVisible, smallScreenLimits } = sanitizePartialObject(attr, () => new IllegalArgument('Chessboard.adaptSquareSize()', 'attr'));
321
+ static adaptSquareSize(width: number, height: number, attr?: ChessboardAdaptSquareSizeAttr): number {
322
+ const { coordinateVisible, turnVisible, smallScreenLimits, topComponent, bottomComponent } = sanitizePartialObject(attr,
323
+ () => new IllegalArgument('Chessboard.adaptSquareSize()', 'attr'));
290
324
 
291
325
  // Sanitize the arguments.
292
326
  width = sanitizeInteger(width, () => new IllegalArgument('Chessboard.adaptSquareSize()', 'width'));
293
327
  height = sanitizeInteger(height, () => new IllegalArgument('Chessboard.adaptSquareSize()', 'height'));
294
- coordinateVisible = coordinateVisible === undefined ? true : sanitizeBoolean(coordinateVisible);
295
- turnVisible = turnVisible === undefined ? true : sanitizeBoolean(turnVisible);
296
- smallScreenLimits = sanitizeSmallScreenLimits(smallScreenLimits, () => new IllegalArgument('Chessboard.adaptSquareSize()', 'smallScreenLimits'));
328
+ let actualCoordinateVisible = coordinateVisible === undefined ? true : sanitizeBoolean(coordinateVisible);
329
+ let actualTurnVisible = turnVisible === undefined ? true : sanitizeBoolean(turnVisible);
330
+ const actualLimits = sanitizeSmallScreenLimits(smallScreenLimits, () => new IllegalArgument('Chessboard.adaptSquareSize()', 'smallScreenLimits'));
297
331
 
298
332
  // Enforce small-screen limits, if any.
299
333
  let maxSquareSize = MAX_SQUARE_SIZE;
300
334
  if (typeof window !== 'undefined') {
301
- maxSquareSize = computeSquareSizeForSmallScreens(maxSquareSize, smallScreenLimits, window.innerWidth);
302
- coordinateVisible = computeCoordinateVisibleForSmallScreens(coordinateVisible, smallScreenLimits, window.innerWidth);
303
- turnVisible = computeTurnVisibleForSmallScreens(turnVisible, smallScreenLimits, window.innerWidth);
335
+ maxSquareSize = computeSquareSizeForSmallScreens(maxSquareSize, actualLimits, window.innerWidth);
336
+ actualCoordinateVisible = computeCoordinateVisibleForSmallScreens(actualCoordinateVisible, actualLimits, window.innerWidth);
337
+ actualTurnVisible = computeTurnVisibleForSmallScreens(actualTurnVisible, actualLimits, window.innerWidth);
304
338
  }
305
339
 
306
340
  function isAdapted(squareSize: number) {
307
- const { width: actualWidth, height: actualHeight } = chessboardSize(squareSize, coordinateVisible!, turnVisible!);
341
+ const { width: actualWidth, height: actualHeight } = chessBoardWithAuxilliaryComponentSize(squareSize, actualCoordinateVisible, actualTurnVisible,
342
+ topComponent, bottomComponent);
308
343
  return actualWidth <= width && actualHeight <= height;
309
344
  }
310
345
 
@@ -369,6 +404,31 @@ export class Chessboard extends React.Component<ChessboardProps, ChessboardState
369
404
  }
370
405
 
371
406
 
407
+ function chessBoardWithAuxilliaryComponentSize(squareSize: number, coordinateVisible: boolean, turnVisible: boolean,
408
+ topComponent: AuxilliaryComponentSizeFunction | undefined, bottomComponent: AuxilliaryComponentSizeFunction | undefined): { width: number, height: number } {
409
+
410
+ let { width, height } = chessboardSize(squareSize, coordinateVisible, turnVisible);
411
+ const auxilliaryComponentAttr = {
412
+ squareSize: squareSize,
413
+ coordinateVisible: coordinateVisible,
414
+ turnVisible: turnVisible,
415
+ };
416
+
417
+ if (topComponent) {
418
+ const { width: auxilliaryWidth, height: auxilliaryHeight } = topComponent(auxilliaryComponentAttr);
419
+ width = Math.max(width, auxilliaryWidth);
420
+ height += auxilliaryHeight;
421
+ }
422
+ if (bottomComponent) {
423
+ const { width: auxilliaryWidth, height: auxilliaryHeight } = bottomComponent(auxilliaryComponentAttr);
424
+ width = Math.max(width, auxilliaryWidth);
425
+ height += auxilliaryHeight;
426
+ }
427
+
428
+ return { width: width, height: height };
429
+ }
430
+
431
+
372
432
  /**
373
433
  * Compute the actual square size taking into account the given small-screen limits and window width.
374
434
  */
@@ -474,7 +534,7 @@ function sanitizeSmallScreenLimits(smallScreenLimits: SmallScreenLimit[] | undef
474
534
  width: sanitizeInteger(smallScreenLimit.width, exceptionBuilder),
475
535
  squareSize: sanitizeOptional(smallScreenLimit.squareSize, val => sanitizeBoundedInteger(val, MIN_SQUARE_SIZE, MAX_SQUARE_SIZE, exceptionBuilder)),
476
536
  coordinateVisible: sanitizeOptional(smallScreenLimit.coordinateVisible, sanitizeBoolean),
477
- turnVisible: sanitizeOptional(smallScreenLimit.turnVisible, sanitizeBoolean)
537
+ turnVisible: sanitizeOptional(smallScreenLimit.turnVisible, sanitizeBoolean),
478
538
  };
479
539
  });
480
540
  }
@@ -52,44 +52,44 @@ const FILE_LABELS = 'abcdefgh';
52
52
 
53
53
  interface ChessboardImplProps {
54
54
 
55
- position: Position;
56
- move?: MoveDescriptor;
57
-
58
- squareMarkers?: SquareMarkerSet;
59
- textMarkers?: TextMarkerSet;
60
- arrowMarkers?: ArrowMarkerSet;
61
-
62
- flipped: boolean;
63
- squareSize: number;
64
- coordinateVisible: boolean;
65
- turnVisible: boolean;
66
- moveArrowVisible: boolean;
67
- moveArrowColor: AnnotationColor;
68
- animated: boolean;
69
- colorset: Colorset;
70
- pieceset: Pieceset;
55
+ position: Position,
56
+ move?: MoveDescriptor,
57
+
58
+ squareMarkers?: SquareMarkerSet,
59
+ textMarkers?: TextMarkerSet,
60
+ arrowMarkers?: ArrowMarkerSet,
61
+
62
+ flipped: boolean,
63
+ squareSize: number,
64
+ coordinateVisible: boolean,
65
+ turnVisible: boolean,
66
+ moveArrowVisible: boolean,
67
+ moveArrowColor: AnnotationColor,
68
+ animated: boolean,
69
+ colorset: Colorset,
70
+ pieceset: Pieceset,
71
71
 
72
72
  interactionMode?: 'movePieces' | 'clickSquares' | 'editArrows' | 'playMoves',
73
- editedArrowColor?: AnnotationColor; // mandatory if `interactionMode === 'editArrows'`
73
+ editedArrowColor?: AnnotationColor, // mandatory if `interactionMode === 'editArrows'`
74
74
 
75
- onPieceMoved?: (from: Square, to: Square) => void;
76
- onSquareClicked?: (square: Square) => void;
77
- onArrowEdited?: (from: Square, to: Square) => void;
78
- onMovePlayed?: (move: string) => void;
75
+ onPieceMoved?: (from: Square, to: Square) => void,
76
+ onSquareClicked?: (square: Square) => void,
77
+ onArrowEdited?: (from: Square, to: Square) => void,
78
+ onMovePlayed?: (move: string) => void,
79
79
  }
80
80
 
81
81
 
82
82
  interface ChessboardImplState {
83
- inhibitedSquare?: Square;
84
- draggedSquare?: Square;
85
- hoveredSquare?: Square;
86
- dragPosition?: { x: number, y: number }; // mandatory if `dragged` is defined
87
- cursorOffset?: { x: number, y: number }; // mandatory if `dragged` is defined
83
+ inhibitedSquare?: Square,
84
+ draggedSquare?: Square,
85
+ hoveredSquare?: Square,
86
+ dragPosition?: { x: number, y: number }, // mandatory if `dragged` is defined
87
+ cursorOffset?: { x: number, y: number }, // mandatory if `dragged` is defined
88
88
  promotionDrawer?: {
89
89
  origin: Square,
90
90
  buttons: Piece[],
91
91
  builder: (promotion: Piece) => string,
92
- };
92
+ },
93
93
  }
94
94
 
95
95
 
@@ -309,12 +309,20 @@ export class ChessboardImpl extends React.Component<ChessboardImplProps, Chessbo
309
309
  });
310
310
  return (
311
311
  <>
312
- <rect className="kokopu-handle" x={0} y={0} width={this.props.squareSize * 8} height={this.props.squareSize * 8}
313
- onClick={() => this.handleDrawerCancelButtonClicked()} />
314
- <rect x={x} y={y0} width={this.props.squareSize} height={this.props.squareSize * this.state.promotionDrawer.buttons.length}
315
- fill={this.props.colorset.b} />
316
- <rect x={x} y={y0} width={this.props.squareSize} height={this.props.squareSize * this.state.promotionDrawer.buttons.length}
317
- className="kokopu-drawerMask" fill={this.props.colorset.w} />
312
+ <rect
313
+ className="kokopu-handle"
314
+ x={0} y={0} width={this.props.squareSize * 8} height={this.props.squareSize * 8}
315
+ onClick={() => this.handleDrawerCancelButtonClicked()}
316
+ />
317
+ <rect
318
+ x={x} y={y0} width={this.props.squareSize} height={this.props.squareSize * this.state.promotionDrawer.buttons.length}
319
+ fill={this.props.colorset.b}
320
+ />
321
+ <rect
322
+ className="kokopu-drawerMask"
323
+ x={x} y={y0} width={this.props.squareSize} height={this.props.squareSize * this.state.promotionDrawer.buttons.length}
324
+ fill={this.props.colorset.w}
325
+ />
318
326
  {buttons}
319
327
  </>
320
328
  );
@@ -329,7 +337,9 @@ export class ChessboardImpl extends React.Component<ChessboardImplProps, Chessbo
329
337
  if (dragEnabledForMovePieces || dragEnabledForEditArrows || dragEnabledForPlayMoves) {
330
338
  return (
331
339
  <Draggable
332
- key={'handle-' + sq} x={x} y={y} width={this.props.squareSize} height={this.props.squareSize} isArrowHandle={dragEnabledForEditArrows}
340
+ key={'handle-' + sq}
341
+ x={x} y={y} width={this.props.squareSize} height={this.props.squareSize}
342
+ isArrowHandle={dragEnabledForEditArrows}
333
343
  onDragStart={(x0, y0) => this.handleDragStart(sq, x0, y0)}
334
344
  onDrag={(dx, dy) => this.handleDrag(sq, dx, dy)}
335
345
  onDragStop={(dx, dy) => this.handleDragStop(sq, dx, dy)}
@@ -340,7 +350,8 @@ export class ChessboardImpl extends React.Component<ChessboardImplProps, Chessbo
340
350
  else if (this.props.interactionMode === 'clickSquares') {
341
351
  return (
342
352
  <rect
343
- key={'handle-' + sq} className="kokopu-handle kokopu-clickable" x={x} y={y} width={this.props.squareSize} height={this.props.squareSize}
353
+ key={'handle-' + sq} className="kokopu-handle kokopu-clickable"
354
+ x={x} y={y} width={this.props.squareSize} height={this.props.squareSize}
344
355
  onClick={() => this.handleSquareClicked(sq)}
345
356
  />
346
357
  );
@@ -357,7 +368,9 @@ export class ChessboardImpl extends React.Component<ChessboardImplProps, Chessbo
357
368
  return Object.entries(this.props.squareMarkers).map(([ sq, color ]) => {
358
369
  const { x, y } = this.getSquareCoordinates(sq as Square);
359
370
  return (
360
- <rect key={'sqm-' + sq} className="kokopu-annotation" x={x} y={y} width={this.props.squareSize} height={this.props.squareSize}
371
+ <rect
372
+ key={'sqm-' + sq} className="kokopu-annotation"
373
+ x={x} y={y} width={this.props.squareSize} height={this.props.squareSize}
361
374
  fill={this.getColorForAnnotation(color)}
362
375
  />
363
376
  );
@@ -401,8 +414,10 @@ export class ChessboardImpl extends React.Component<ChessboardImplProps, Chessbo
401
414
  yTo += Math.sign(yFrom - yTo) * ARROW_TIP_OFFSET_FACTOR * this.props.squareSize;
402
415
  return (
403
416
  <line
404
- key={'arm-' + vect} className="kokopu-annotation kokopu-arrow" x1={xFrom} y1={yFrom} x2={xTo} y2={yTo} strokeWidth={strokeWidth}
405
- stroke={this.getColorForAnnotation(color)} markerEnd={`url(#${this.getArrowTipId(color)})`}
417
+ key={'arm-' + vect} className="kokopu-annotation kokopu-arrow"
418
+ x1={xFrom} y1={yFrom} x2={xTo} y2={yTo}
419
+ strokeWidth={strokeWidth} stroke={this.getColorForAnnotation(color)}
420
+ markerEnd={`url(#${this.getArrowTipId(color)})`}
406
421
  />
407
422
  );
408
423
  });
@@ -425,8 +440,10 @@ export class ChessboardImpl extends React.Component<ChessboardImplProps, Chessbo
425
440
  const y = yTo * motionCursor + yFrom * (1 - motionCursor);
426
441
  return (
427
442
  <line
428
- className="kokopu-annotation kokopu-arrow" x1={xFrom} y1={yFrom} x2={x} y2={y} strokeWidth={strokeWidth}
429
- stroke={this.getColorForAnnotation(this.props.moveArrowColor)} markerEnd={`url(#${this.getArrowTipId(this.props.moveArrowColor)})`}
443
+ className="kokopu-annotation kokopu-arrow"
444
+ x1={xFrom} y1={yFrom} x2={x} y2={y}
445
+ strokeWidth={strokeWidth} stroke={this.getColorForAnnotation(this.props.moveArrowColor)}
446
+ markerEnd={`url(#${this.getArrowTipId(this.props.moveArrowColor)})`}
430
447
  />
431
448
  );
432
449
  }
@@ -478,7 +495,7 @@ export class ChessboardImpl extends React.Component<ChessboardImplProps, Chessbo
478
495
  }
479
496
 
480
497
  private handleDragStop(sq: Square, dx: number, dy: number) {
481
- const { x, y } = this.getSquareCoordinates( sq);
498
+ const { x, y } = this.getSquareCoordinates(sq);
482
499
  const targetSq = this.getSquareAt(x + dx + this.state.cursorOffset!.x, y + dy + this.state.cursorOffset!.y);
483
500
  this.setState({
484
501
  inhibitedSquare: undefined,
@@ -30,65 +30,65 @@ interface DraggableProps {
30
30
  /**
31
31
  * Initial X coordinate of the handle.
32
32
  */
33
- x: number;
33
+ x: number,
34
34
 
35
35
  /**
36
36
  * Initial Y coordinate of the handle.
37
37
  */
38
- y: number;
38
+ y: number,
39
39
 
40
40
  /**
41
41
  * Width of the handle.
42
42
  */
43
- width: number;
43
+ width: number,
44
44
 
45
45
  /**
46
46
  * Height of the handle.
47
47
  */
48
- height: number;
48
+ height: number,
49
49
 
50
50
  /**
51
51
  * `true` if the handle corresponds to a draggable arrow, `false` if it corresponds to a draggable piece.
52
52
  */
53
- isArrowHandle: boolean;
53
+ isArrowHandle: boolean,
54
54
 
55
55
  /**
56
56
  * Callback invoked when the drag starts. `x0` and `y0` correspond to the coordinates (relative to the hande) at which the drag has been initiated.
57
57
  */
58
- onDragStart?: (x0: number, y0: number) => void;
58
+ onDragStart?: (x0: number, y0: number) => void,
59
59
 
60
60
  /**
61
61
  * Callback invoked during the drag. `dx` and `dy` correspond to the coordinates of the drag translation vector.
62
62
  */
63
- onDrag?: (dx: number, dy: number) => void;
63
+ onDrag?: (dx: number, dy: number) => void,
64
64
 
65
65
  /**
66
66
  * Callback invoked when the drag stops. `dx` and `dy` correspond to the coordinates of the drag translation vector.
67
67
  */
68
- onDragStop?: (dx: number, dy: number) => void;
68
+ onDragStop?: (dx: number, dy: number) => void,
69
69
 
70
70
  /**
71
71
  * Callback invoked when the drag is canceled.
72
72
  */
73
- onDragCanceled?: () => void;
73
+ onDragCanceled?: () => void,
74
74
  }
75
75
 
76
76
 
77
77
  interface DragData {
78
- originX: number;
79
- originY: number;
78
+ originX: number,
79
+ originY: number,
80
80
  }
81
81
 
82
82
 
83
83
  interface PageCoordinates {
84
- pageX: number;
85
- pageY: number;
84
+ pageX: number,
85
+ pageY: number,
86
86
  }
87
87
 
88
88
 
89
89
  interface ClientCoordinates {
90
- clientX: number;
91
- clientY: number;
90
+ clientX: number,
91
+ clientY: number,
92
92
  }
93
93
 
94
94
 
@@ -32,17 +32,17 @@ interface MotionProps {
32
32
  /**
33
33
  * Duration of the animation. Must be > 0.
34
34
  */
35
- duration: number;
35
+ duration: number,
36
36
 
37
37
  /**
38
38
  * Factory for the content being animated. The animation cursor is guaranteed to be valued between 0 and 1 inclusive.
39
39
  */
40
- children: (cursor: number) => React.ReactNode;
40
+ children: (cursor: number) => React.ReactNode,
41
41
  }
42
42
 
43
43
 
44
44
  interface MotionState {
45
- cursor: number;
45
+ cursor: number,
46
46
  }
47
47
 
48
48
 
@@ -63,7 +63,7 @@ export class Motion extends React.Component<MotionProps, MotionState> {
63
63
  this.cursorStop = 1;
64
64
 
65
65
  // WARNING: this hack exists only for testing purposes. DO NOT USE IT IN PRODUCTION.
66
- const debugCursorStop = window[ /* eslint-disable @typescript-eslint/no-explicit-any */ DEBUG_KEY as any /* eslint-enable @typescript-eslint/no-explicit-any */ ];
66
+ const debugCursorStop = window[/* eslint-disable @typescript-eslint/no-explicit-any */ DEBUG_KEY as any /* eslint-enable */];
67
67
  if (typeof debugCursorStop === 'number' && debugCursorStop >= 0 && debugCursorStop <= 1) {
68
68
  this.cursorStop = debugCursorStop;
69
69
  }
@@ -40,27 +40,27 @@ export interface ErrorBoxProps {
40
40
  /**
41
41
  * Title of the error box.
42
42
  */
43
- title: string;
43
+ title: string,
44
44
 
45
45
  /**
46
46
  * Additional message providing details about the error.
47
47
  */
48
- message: string;
48
+ message: string,
49
49
 
50
50
  /**
51
51
  * Raw text whose processing results in the error.
52
52
  */
53
- text?: string;
53
+ text?: string,
54
54
 
55
55
  /**
56
56
  * Index of the character within `text` that results in the error.
57
57
  */
58
- errorIndex?: number;
58
+ errorIndex?: number,
59
59
 
60
60
  /**
61
61
  * Index (1-based) of the line in which is the character that results in the error.
62
62
  */
63
- lineNumber?: number;
63
+ lineNumber?: number,
64
64
  }
65
65
 
66
66