kokopu-react 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/.eslintrc.yml +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/dist/lib/chessboard/BoardProperties.js.map +1 -1
  4. package/dist/lib/chessboard/Chessboard.css +13 -13
  5. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  6. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  7. package/dist/lib/chessboard/Draggable.js.map +1 -1
  8. package/dist/lib/chessboard/Motion.js.map +1 -1
  9. package/dist/lib/chessboard/colorsets.js.map +1 -1
  10. package/dist/lib/chessboard/piecesets.js.map +1 -1
  11. package/dist/lib/errorbox/ErrorBox.css +18 -18
  12. package/dist/lib/errorbox/ErrorBox.js.map +1 -1
  13. package/dist/lib/errorbox/parsing.js.map +1 -1
  14. package/dist/lib/exception.js.map +1 -1
  15. package/dist/lib/i18n.d.ts +1 -0
  16. package/dist/lib/i18n.js +1 -0
  17. package/dist/lib/i18n.js.map +1 -1
  18. package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
  19. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
  20. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  21. package/dist/lib/icons/ArrowTip.js.map +1 -1
  22. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  23. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  24. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  25. package/dist/lib/icons/arrow.css +1 -1
  26. package/dist/lib/index.d.ts +1 -0
  27. package/dist/lib/index.js +1 -0
  28. package/dist/lib/index.js.map +1 -1
  29. package/dist/lib/movetext/Movetext.css +27 -27
  30. package/dist/lib/movetext/Movetext.js.map +1 -1
  31. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  32. package/dist/lib/movetext/fonts.css +7 -7
  33. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  34. package/dist/lib/movetext/moveFormatter.js.map +1 -1
  35. package/dist/lib/navigationboard/NavigationBoard.d.ts +39 -1
  36. package/dist/lib/navigationboard/NavigationBoard.js +94 -11
  37. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
  38. package/dist/lib/navigationboard/NavigationButton.d.ts +54 -0
  39. package/dist/lib/navigationboard/NavigationButton.js +35 -0
  40. package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
  41. package/dist/lib/navigationboard/NavigationField.css +7 -7
  42. package/dist/lib/navigationboard/NavigationField.js.map +1 -1
  43. package/dist/lib/navigationboard/NavigationToolbar.css +16 -13
  44. package/dist/lib/navigationboard/NavigationToolbar.d.ts +3 -10
  45. package/dist/lib/navigationboard/NavigationToolbar.js +31 -82
  46. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
  47. package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
  48. package/dist/lib/navigationboard/iconPaths.js +91 -0
  49. package/dist/lib/navigationboard/iconPaths.js.map +1 -0
  50. package/dist/lib/sanitization.js.map +1 -1
  51. package/dist/lib/types.js.map +1 -1
  52. package/dist/lib/util.js.map +1 -1
  53. package/doc_src/demo/PageChessboardBase.tsx +115 -115
  54. package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
  55. package/doc_src/demo/PageChessboardMove.tsx +173 -173
  56. package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
  57. package/doc_src/demo/PageMovetextBase.tsx +180 -180
  58. package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
  59. package/doc_src/demo/PageNavigationBoardBase.tsx +144 -137
  60. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +69 -69
  61. package/doc_src/demo/decs.d.ts +4 -4
  62. package/doc_src/demo/demo.css +12 -12
  63. package/doc_src/demo/util.ts +1 -1
  64. package/doc_src/examples/NavigationBoard.md +1 -1
  65. package/doc_src/theming/LogoRenderer.js +13 -13
  66. package/doc_src/theming/theming.css +5 -5
  67. package/package.json +95 -95
  68. package/scripts/doc.styleguide.config.js +131 -131
  69. package/scripts/doc.tsconfig.json +5 -5
  70. package/scripts/docker-compose.yml +1 -1
  71. package/scripts/test-graphic.tsconfig.json +5 -5
  72. package/scripts/test-graphic.webpack.config.js +57 -57
  73. package/scripts/test-headless.webpack.config.js +29 -29
  74. package/src/chessboard/BoardProperties.ts +68 -68
  75. package/src/chessboard/Chessboard.css +13 -13
  76. package/src/chessboard/Chessboard.tsx +380 -380
  77. package/src/chessboard/ChessboardImpl.tsx +557 -557
  78. package/src/chessboard/Draggable.tsx +185 -185
  79. package/src/chessboard/Motion.tsx +67 -67
  80. package/src/chessboard/colorsets.ts +66 -66
  81. package/src/chessboard/piecesets.ts +84 -84
  82. package/src/decs.d.ts +2 -2
  83. package/src/errorbox/ErrorBox.css +18 -18
  84. package/src/errorbox/ErrorBox.tsx +75 -75
  85. package/src/errorbox/parsing.tsx +95 -95
  86. package/src/exception.ts +17 -17
  87. package/src/i18n.ts +1 -0
  88. package/src/icons/AnnotationSymbolShape.css +6 -6
  89. package/src/icons/AnnotationSymbolShape.tsx +31 -31
  90. package/src/icons/ArrowMarkerIcon.tsx +34 -34
  91. package/src/icons/ArrowTip.tsx +14 -14
  92. package/src/icons/ChessPieceIcon.tsx +45 -45
  93. package/src/icons/SquareMarkerIcon.tsx +20 -20
  94. package/src/icons/TextMarkerIcon.tsx +29 -29
  95. package/src/icons/arrow.css +1 -1
  96. package/src/index.ts +3 -2
  97. package/src/movetext/Movetext.css +27 -27
  98. package/src/movetext/Movetext.tsx +158 -158
  99. package/src/movetext/MovetextImpl.tsx +345 -345
  100. package/src/movetext/fonts.css +7 -7
  101. package/src/movetext/htmlFilter.tsx +129 -129
  102. package/src/movetext/moveFormatter.tsx +37 -37
  103. package/src/navigationboard/NavigationBoard.tsx +297 -178
  104. package/src/navigationboard/NavigationButton.ts +72 -0
  105. package/src/navigationboard/NavigationField.css +7 -7
  106. package/src/navigationboard/NavigationField.tsx +90 -90
  107. package/src/navigationboard/NavigationToolbar.css +16 -13
  108. package/src/navigationboard/NavigationToolbar.tsx +60 -117
  109. package/src/navigationboard/iconPaths.ts +98 -0
  110. package/src/sanitization.ts +17 -17
  111. package/src/types.ts +116 -116
  112. package/src/util.ts +11 -11
  113. package/test/01_types.js +167 -167
  114. package/test/02_chessboard_util.js +114 -114
  115. package/test/03_error_box_graphic.js +16 -16
  116. package/test/04_icons_graphic.js +32 -32
  117. package/test/05_chessboard_graphic.js +60 -60
  118. package/test/06_chessboard_animation.js +36 -36
  119. package/test/07_chessboard_interaction.js +101 -101
  120. package/test/08_chessboard_play_moves.js +62 -62
  121. package/test/09_chessboard_small_screens.js +32 -32
  122. package/test/10_movetext_graphic.js +32 -32
  123. package/test/11_movetext_interaction.js +100 -100
  124. package/test/12_navigation_board_base.js +151 -0
  125. package/test/13_navigation_board_graphic.js +68 -0
  126. package/test/14_navigation_board_autoplay.js +100 -0
  127. package/test/common/graphic.js +106 -97
  128. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  129. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_1.png → 12_navigation_board_base/controlled/forbidden_navigation_0.png} +0 -0
  130. package/test/graphic_references/{12_navigation_board/controlled/invalid_node_id.png → 12_navigation_board_base/controlled/forbidden_navigation_1.png} +0 -0
  131. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_0.png → 12_navigation_board_base/controlled/invalid_node_id.png} +0 -0
  132. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  133. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/no_callback_defined_1.png +0 -0
  134. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/overriding_initial_node_id.png +0 -0
  135. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_1.png → 12_navigation_board_base/controlled/regular_navigation_0.png} +0 -0
  136. package/test/graphic_references/{12_navigation_board/uncontrolled/initial_state_at_specific_id.png → 12_navigation_board_base/controlled/regular_navigation_1.png} +0 -0
  137. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_3.png → 12_navigation_board_base/controlled/regular_navigation_2.png} +0 -0
  138. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_0.png → 12_navigation_board_base/controlled/regular_navigation_3.png} +0 -0
  139. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_2.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png} +0 -0
  140. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png} +0 -0
  141. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_1.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png} +0 -0
  142. package/test/graphic_references/{12_navigation_board/controlled/no_callback_defined_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png} +0 -0
  143. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  144. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  145. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_at_end.png +0 -0
  146. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  147. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default.png +0 -0
  148. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default_with_game_index.png +0 -0
  149. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_on_null-move.png +0 -0
  150. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_0.png +0 -0
  151. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  152. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_2.png +0 -0
  153. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_3.png +0 -0
  154. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_4.png +0 -0
  155. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_0.png +0 -0
  156. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_1.png +0 -0
  157. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_0.png +0 -0
  158. package/test/graphic_references/{12_navigation_board/controlled/default.png → 12_navigation_board_base/uncontrolled/regular_navigation_1.png} +0 -0
  159. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_2.png +0 -0
  160. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  161. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_4.png +0 -0
  162. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_5.png +0 -0
  163. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  164. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  165. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  166. package/test/graphic_references/{12_navigation_board/uncontrolled/regular_navigation_3.png → 13_navigation_board_graphic/additional_buttons/single_button.png} +0 -0
  167. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_1.png +0 -0
  168. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_2.png +0 -0
  169. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png +0 -0
  170. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  171. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  172. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  173. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  174. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  175. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_1.png → 14_navigation_board_autoplay/controlled/after_reaching_the_end.png} +0 -0
  176. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_2.png → 14_navigation_board_autoplay/controlled/already_at_the_end.png} +0 -0
  177. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  178. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  179. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_0.png → 14_navigation_board_autoplay/controlled/initial_state_at_the_end.png} +0 -0
  180. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  181. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  182. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  183. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  184. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  185. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  186. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  187. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  188. package/test/graphic_references/{12_navigation_board/uncontrolled/navigation_with_keys_1.png → 14_navigation_board_autoplay/uncontrolled/initial_state_default.png} +0 -0
  189. package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
  190. package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
  191. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
  192. package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
  193. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
  194. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
  195. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
  196. package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
  197. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -12
  198. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
  199. package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
  200. package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
  201. package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
  202. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
  203. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
  204. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
  205. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
  206. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
  207. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
  208. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
  209. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
  210. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +9 -9
  211. package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
  212. package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
  213. package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +1 -1
  214. package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
  215. package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -10
  216. package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
  217. package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -11
  218. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/controlled.tsx +5 -5
  219. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/uncontrolled.tsx +7 -7
  220. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
  221. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/error.tsx +2 -2
  222. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/theme.tsx +4 -4
  223. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
  224. package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
  225. package/test/graphic_test_app/common/decs.d.ts +2 -2
  226. package/test/graphic_test_app/common/test_app.css +15 -15
  227. package/test/graphic_test_app/common/test_app.tsx +48 -48
  228. package/tsconfig.json +13 -13
  229. package/test/12_navigation_board.js +0 -168
  230. package/test/graphic_references/12_navigation_board/controlled/regular_navigation_2.png +0 -0
  231. package/test/graphic_references/12_navigation_board/theme/small.png +0 -0
  232. package/test/graphic_references/12_navigation_board/uncontrolled/regular_navigation_1.png +0 -0
  233. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/pgn_parsing_error.png +0 -0
  234. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/wrong_game_type.png +0 -0
@@ -0,0 +1,49 @@
1
+ /*!
2
+ * -------------------------------------------------------------------------- *
3
+ * *
4
+ * Kokopu-React - A React-based library of chess-related components. *
5
+ * <https://www.npmjs.com/package/kokopu-react> *
6
+ * Copyright (C) 2021-2024 Yoann Le Montagner <yo35 -at- melix.net> *
7
+ * *
8
+ * Kokopu-React is free software: you can redistribute it and/or *
9
+ * modify it under the terms of the GNU Lesser General Public License *
10
+ * as published by the Free Software Foundation, either version 3 of *
11
+ * the License, or (at your option) any later version. *
12
+ * *
13
+ * Kokopu-React is distributed in the hope that it will be useful, *
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16
+ * GNU Lesser General Public License for more details. *
17
+ * *
18
+ * You should have received a copy of the GNU Lesser General *
19
+ * Public License along with this program. If not, see *
20
+ * <http://www.gnu.org/licenses/>. *
21
+ * *
22
+ * -------------------------------------------------------------------------- */
23
+
24
+
25
+ import * as React from 'react';
26
+ import { setSandbox, testApp } from '../common/test_app';
27
+ import { NavigationBoard } from '../../../dist/lib/index';
28
+
29
+ import pgn from '../common/games.pgn';
30
+
31
+ testApp([ /* eslint-disable react/jsx-key */
32
+ <NavigationBoard game={pgn} additionalButtons={{ iconPath: 'M 11 11 H 21 V 21 H 11 Z' }} />,
33
+ <NavigationBoard game={pgn} additionalButtons={[
34
+ { iconPath: 'M 11 11 H 21 V 21 H 11 Z', tooltip: 'Button 0', enabled: true },
35
+ { iconPath: 'M 9 16 L 16 9 L 23 16 L 16 23 Z', tooltip: 'Button A', onClick: () => setSandbox('Button A clicked') },
36
+ 'spacer',
37
+ { iconPath: 'M 16 22 L 10 11 H 22 Z', tooltip: 'Button B', onClick: () => setSandbox('Button B clicked') },
38
+ 'spacer',
39
+ 'spacer',
40
+ { iconPath: 'M 16 10 L 22 21 H 10 Z', tooltip: 'Button C', enabled: false, onClick: () => setSandbox('Button C clicked') },
41
+ ]} />,
42
+ <NavigationBoard game={pgn} additionalButtons={
43
+ /* eslint-disable @typescript-eslint/no-explicit-any */ 'not a button nor a spacer' as any /* eslint-enable @typescript-eslint/no-explicit-any */
44
+ } />,
45
+ <NavigationBoard game={pgn} additionalButtons={[
46
+ { iconPath: 'M 11 11 H 21 V 21 H 11 Z' },
47
+ /* eslint-disable @typescript-eslint/no-explicit-any */ 'not a button nor a spacer' as any /* eslint-enable @typescript-eslint/no-explicit-any */,
48
+ ]} />,
49
+ ]); /* eslint-enable react/jsx-key */
@@ -29,6 +29,6 @@ import { NavigationBoard } from '../../../dist/lib/index';
29
29
  import dummyPgn from '../common/dummy.pgn';
30
30
 
31
31
  testApp([ /* eslint-disable react/jsx-key */
32
- <NavigationBoard game={dummyPgn} />,
33
- <NavigationBoard game={ /* eslint-disable @typescript-eslint/no-explicit-any */ 42 as any /* eslint-enable @typescript-eslint/no-explicit-any */ } />,
32
+ <NavigationBoard game={dummyPgn} />,
33
+ <NavigationBoard game={ /* eslint-disable @typescript-eslint/no-explicit-any */ 42 as any /* eslint-enable @typescript-eslint/no-explicit-any */ } />,
34
34
  ], 'width-600'); /* eslint-enable react/jsx-key */
@@ -31,8 +31,8 @@ const game = new Game();
31
31
  game.mainVariation().play('e4');
32
32
 
33
33
  testApp([ /* eslint-disable react/jsx-key */
34
- <NavigationBoard game={game} initialNodeId="end" squareSize={20} coordinateVisible={false} />,
35
- <NavigationBoard game={game} initialNodeId="end" squareSize={53} colorset="scid" pieceset="celtic" flipButtonVisible={false} />,
36
- <NavigationBoard game={game} initialNodeId="end" turnVisible={false} moveArrowColor="g" />,
37
- <div style={{ color: 'red' }}><NavigationBoard game={game} initialNodeId="end" squareSize={48} moveArrowVisible={false} /></div>,
34
+ <NavigationBoard game={game} initialNodeId="end" squareSize={20} coordinateVisible={false} />,
35
+ <NavigationBoard game={game} initialNodeId="end" squareSize={53} colorset="scid" pieceset="celtic" flipButtonVisible={false} />,
36
+ <NavigationBoard game={game} initialNodeId="end" turnVisible={false} moveArrowColor="g" />,
37
+ <div style={{ color: 'red' }}><NavigationBoard game={game} initialNodeId="end" squareSize={48} moveArrowVisible={false} /></div>,
38
38
  ]); /* eslint-enable react/jsx-key */
@@ -0,0 +1,73 @@
1
+ /*!
2
+ * -------------------------------------------------------------------------- *
3
+ * *
4
+ * Kokopu-React - A React-based library of chess-related components. *
5
+ * <https://www.npmjs.com/package/kokopu-react> *
6
+ * Copyright (C) 2021-2024 Yoann Le Montagner <yo35 -at- melix.net> *
7
+ * *
8
+ * Kokopu-React is free software: you can redistribute it and/or *
9
+ * modify it under the terms of the GNU Lesser General Public License *
10
+ * as published by the Free Software Foundation, either version 3 of *
11
+ * the License, or (at your option) any later version. *
12
+ * *
13
+ * Kokopu-React is distributed in the hope that it will be useful, *
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16
+ * GNU Lesser General Public License for more details. *
17
+ * *
18
+ * You should have received a copy of the GNU Lesser General *
19
+ * Public License along with this program. If not, see *
20
+ * <http://www.gnu.org/licenses/>. *
21
+ * *
22
+ * -------------------------------------------------------------------------- */
23
+
24
+
25
+ import * as React from 'react';
26
+ import { setSandbox, testApp } from '../common/test_app';
27
+ import { NavigationBoard } from '../../../dist/lib/index';
28
+
29
+ import pgn from '../common/games.pgn';
30
+
31
+ const HISTORY_0: string[] = [];
32
+ const HISTORY_1: string[] = [];
33
+ const HISTORY_2: string[] = [];
34
+
35
+ interface NavigationBoardWithNodeIdControllerProps {
36
+ initialNodeId: string;
37
+ sandboxHistory: string[];
38
+ }
39
+
40
+ function NavigationBoardWithNodeIdController({ initialNodeId, sandboxHistory }: NavigationBoardWithNodeIdControllerProps) {
41
+
42
+ const [ nodeId, setNodeId ] = React.useState(initialNodeId);
43
+
44
+ return <NavigationBoard game={pgn} playButtonVisible nodeId={nodeId} onNodeIdChanged={newNodeId => {
45
+ sandboxHistory.push(`Node ID changed: ${newNodeId}`);
46
+ setSandbox(sandboxHistory.join('\n'));
47
+ setNodeId(newNodeId);
48
+ }} />;
49
+ }
50
+
51
+ function NavigationBoardWithIsPlayingController() {
52
+
53
+ const [ isPlaying, setIsPlaying ] = React.useState(false);
54
+
55
+ return <NavigationBoard game={pgn} playButtonVisible initialNodeId="5b" isPlaying={isPlaying} onIsPlayingChanged={newIsPlaying => {
56
+ setSandbox(`is-playing flag changed: ${newIsPlaying}`);
57
+ setIsPlaying(newIsPlaying);
58
+ }} />;
59
+ }
60
+
61
+ testApp([ /* eslint-disable react/jsx-key */
62
+ <NavigationBoard game={pgn} playButtonVisible nodeId="3w" onNodeIdChanged={nodeId => {
63
+ HISTORY_0.push(`Node ID changed: ${nodeId}`);
64
+ setSandbox(HISTORY_0.join('\n'));
65
+ }} />,
66
+ <NavigationBoardWithNodeIdController initialNodeId="3w" sandboxHistory={HISTORY_1} />,
67
+ <NavigationBoardWithNodeIdController initialNodeId="20w" sandboxHistory={HISTORY_2} />,
68
+ <NavigationBoard game={pgn} playButtonVisible initialNodeId="5b" isPlaying={false} onIsPlayingChanged={isPlaying => {
69
+ setSandbox(`is-playing flag changed: ${isPlaying}`);
70
+ }} />,
71
+ <NavigationBoardWithIsPlayingController />,
72
+ <NavigationBoard game={pgn} playButtonVisible initialNodeId="20b" isPlaying={true} />,
73
+ ]); /* eslint-enable react/jsx-key */
@@ -0,0 +1,34 @@
1
+ /*!
2
+ * -------------------------------------------------------------------------- *
3
+ * *
4
+ * Kokopu-React - A React-based library of chess-related components. *
5
+ * <https://www.npmjs.com/package/kokopu-react> *
6
+ * Copyright (C) 2021-2024 Yoann Le Montagner <yo35 -at- melix.net> *
7
+ * *
8
+ * Kokopu-React is free software: you can redistribute it and/or *
9
+ * modify it under the terms of the GNU Lesser General Public License *
10
+ * as published by the Free Software Foundation, either version 3 of *
11
+ * the License, or (at your option) any later version. *
12
+ * *
13
+ * Kokopu-React is distributed in the hope that it will be useful, *
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16
+ * GNU Lesser General Public License for more details. *
17
+ * *
18
+ * You should have received a copy of the GNU Lesser General *
19
+ * Public License along with this program. If not, see *
20
+ * <http://www.gnu.org/licenses/>. *
21
+ * *
22
+ * -------------------------------------------------------------------------- */
23
+
24
+
25
+ import * as React from 'react';
26
+ import { testApp } from '../common/test_app';
27
+ import { NavigationBoard } from '../../../dist/lib/index';
28
+
29
+ import pgn from '../common/games.pgn';
30
+
31
+ testApp([ /* eslint-disable react/jsx-key */
32
+ <NavigationBoard game={pgn} playButtonVisible />,
33
+ <NavigationBoard game={pgn} playButtonVisible initialNodeId="20w" />,
34
+ ]); /* eslint-enable react/jsx-key */
@@ -23,6 +23,6 @@
23
23
 
24
24
 
25
25
  declare module '*.pgn' {
26
- const pgnText: string;
27
- export default pgnText;
26
+ const pgnText: string;
27
+ export default pgnText;
28
28
  }
@@ -25,34 +25,34 @@
25
25
  .test-item,
26
26
  .test-item-container,
27
27
  #test-app {
28
- display: inline-block;
28
+ display: inline-block;
29
29
  }
30
30
 
31
31
  body {
32
- background-color: lightgray;
32
+ background-color: lightgray;
33
33
  }
34
34
 
35
35
  .test-item-container {
36
- margin: 2px;
37
- padding: 3px;
38
- background-color: white;
36
+ margin: 2px;
37
+ padding: 3px;
38
+ background-color: white;
39
39
  }
40
40
 
41
41
  .test-item-error {
42
- display: inline-block;
43
- border: solid 1px #999;
44
- background-color: #eee;
45
- font-family: sans-serif;
46
- font-size: 12px;
47
- padding: 0.5em;
42
+ display: inline-block;
43
+ border: solid 1px #999;
44
+ background-color: #eee;
45
+ font-family: sans-serif;
46
+ font-size: 12px;
47
+ padding: 0.5em;
48
48
  }
49
49
 
50
50
  #sandbox {
51
- padding: 3px;
52
- background-color: lightgoldenrodyellow;
53
- height: 100px;
51
+ padding: 3px;
52
+ background-color: lightgoldenrodyellow;
53
+ height: 100px;
54
54
  }
55
55
 
56
56
  .width-600 .test-item {
57
- width: 600px;
57
+ width: 600px;
58
58
  }
@@ -30,54 +30,54 @@ import './test_app.css';
30
30
 
31
31
  // This global variable allows to freeze animations in an intermediate stage.
32
32
  declare global {
33
- interface Window {
34
- '__kokopu_debug_freeze_motion': number;
35
- }
33
+ interface Window {
34
+ '__kokopu_debug_freeze_motion': number;
35
+ }
36
36
  }
37
37
 
38
38
 
39
39
  interface TestItemContainerProps {
40
- index: number;
41
- children: React.ReactNode;
40
+ index: number;
41
+ children: React.ReactNode;
42
42
  }
43
43
 
44
44
 
45
45
  interface TestItemContainerState {
46
- hasError: boolean;
46
+ hasError: boolean;
47
47
  }
48
48
 
49
49
 
50
50
  class TestItemContainer extends React.Component<TestItemContainerProps, TestItemContainerState> {
51
51
 
52
- constructor(props: TestItemContainerProps) {
53
- super(props);
54
- this.state = { hasError: false };
55
- }
56
-
57
- static getDerivedStateFromError() {
58
- return { hasError: true };
59
- }
60
-
61
- render() {
62
- return (
63
- <div className="test-item-container">
64
- <div className="test-item" id={'test-item-' + this.props.index}>{this.renderContent()}</div>
65
- </div>
66
- );
67
- }
68
-
69
- private renderContent() {
70
- return this.state.hasError ? <span className="test-item-error">Exception thrown</span> : this.props.children;
71
- }
52
+ constructor(props: TestItemContainerProps) {
53
+ super(props);
54
+ this.state = { hasError: false };
55
+ }
56
+
57
+ static getDerivedStateFromError() {
58
+ return { hasError: true };
59
+ }
60
+
61
+ render() {
62
+ return (
63
+ <div className="test-item-container">
64
+ <div className="test-item" id={'test-item-' + this.props.index}>{this.renderContent()}</div>
65
+ </div>
66
+ );
67
+ }
68
+
69
+ private renderContent() {
70
+ return this.state.hasError ? <span className="test-item-error">Exception thrown</span> : this.props.children;
71
+ }
72
72
  }
73
73
 
74
74
 
75
75
  function flattenMultiElements(elements: React.ReactNode[], containerClassName: string[]) {
76
- const items = [];
77
- for (let i = 0; i < elements.length; ++i) {
78
- items.push(<TestItemContainer key={i} index={i}>{elements[i]}</TestItemContainer>);
79
- }
80
- return <div className={containerClassName.join(' ')}>{items}</div>;
76
+ const items = [];
77
+ for (let i = 0; i < elements.length; ++i) {
78
+ items.push(<TestItemContainer key={i} index={i}>{elements[i]}</TestItemContainer>);
79
+ }
80
+ return <div className={containerClassName.join(' ')}>{items}</div>;
81
81
  }
82
82
 
83
83
 
@@ -86,20 +86,20 @@ function flattenMultiElements(elements: React.ReactNode[], containerClassName: s
86
86
  */
87
87
  export function testApp(elements: React.ReactNode[], ...containerClassName: string[]) {
88
88
 
89
- // Create the main anchor.
90
- const anchor = document.createElement('div');
91
- anchor.id = 'test-app';
92
- document.body.appendChild(anchor);
89
+ // Create the main anchor.
90
+ const anchor = document.createElement('div');
91
+ anchor.id = 'test-app';
92
+ document.body.appendChild(anchor);
93
93
 
94
- // Render the content.
95
- const root = createRoot(anchor);
96
- const content = flattenMultiElements(elements, containerClassName);
97
- root.render(content);
94
+ // Render the content.
95
+ const root = createRoot(anchor);
96
+ const content = flattenMultiElements(elements, containerClassName);
97
+ root.render(content);
98
98
 
99
- // Append a text area
100
- const sandbox = document.createElement('pre');
101
- sandbox.id = 'sandbox';
102
- document.body.appendChild(sandbox);
99
+ // Append a text area
100
+ const sandbox = document.createElement('pre');
101
+ sandbox.id = 'sandbox';
102
+ document.body.appendChild(sandbox);
103
103
  }
104
104
 
105
105
 
@@ -107,9 +107,9 @@ export function testApp(elements: React.ReactNode[], ...containerClassName: stri
107
107
  * Set the content of the sandbox.
108
108
  */
109
109
  export function setSandbox(text: string) {
110
- const sandbox = document.getElementById('sandbox');
111
- if (sandbox === null) {
112
- throw new Error('Cannot locate the sandbox...');
113
- }
114
- sandbox.innerText = text;
110
+ const sandbox = document.getElementById('sandbox');
111
+ if (sandbox === null) {
112
+ throw new Error('Cannot locate the sandbox...');
113
+ }
114
+ sandbox.innerText = text;
115
115
  }
package/tsconfig.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
- "include": [ "./src/**/*" ],
3
- "compilerOptions": {
4
- "sourceMap": true,
5
- "declaration": true,
6
- "module": "es2020",
7
- "target": "es2020",
8
- "jsx": "react",
9
- "types": [],
10
- "allowJs": false,
11
- "strict": true,
12
- "forceConsistentCasingInFileNames": true,
13
- "moduleResolution": "node"
14
- }
2
+ "include": [ "./src/**/*" ],
3
+ "compilerOptions": {
4
+ "sourceMap": true,
5
+ "declaration": true,
6
+ "module": "es2020",
7
+ "target": "es2020",
8
+ "jsx": "react",
9
+ "types": [],
10
+ "allowJs": false,
11
+ "strict": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "moduleResolution": "node"
14
+ }
15
15
  }
@@ -1,168 +0,0 @@
1
- /*!
2
- * -------------------------------------------------------------------------- *
3
- * *
4
- * Kokopu-React - A React-based library of chess-related components. *
5
- * <https://www.npmjs.com/package/kokopu-react> *
6
- * Copyright (C) 2021-2024 Yoann Le Montagner <yo35 -at- melix.net> *
7
- * *
8
- * Kokopu-React is free software: you can redistribute it and/or *
9
- * modify it under the terms of the GNU Lesser General Public License *
10
- * as published by the Free Software Foundation, either version 3 of *
11
- * the License, or (at your option) any later version. *
12
- * *
13
- * Kokopu-React is distributed in the hope that it will be useful, *
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16
- * GNU Lesser General Public License for more details. *
17
- * *
18
- * You should have received a copy of the GNU Lesser General *
19
- * Public License along with this program. If not, see *
20
- * <http://www.gnu.org/licenses/>. *
21
- * *
22
- * -------------------------------------------------------------------------- */
23
-
24
-
25
- const { describeWithBrowser, itCustom, setSandbox, compareSandbox, takeScreenshot, compareScreenshot, itChecksScreenshots } = require('./common/graphic');
26
- const { By, Key } = require('selenium-webdriver');
27
- const test = require('unit.js');
28
-
29
-
30
- describeWithBrowser('Navigation board - Uncontrolled behavior', browserContext => {
31
-
32
- itChecksScreenshots(browserContext, '12_navigation_board/uncontrolled', [
33
- 'initial state default',
34
- 'initial state at end',
35
- 'initial state at specific ID',
36
- 'initial state default with game index',
37
- 'initial state on null-move',
38
- ]);
39
-
40
- function itCheckClickButton(itemIndex, label, buttons) {
41
- itCustom(browserContext, '12_navigation_board/uncontrolled', itemIndex, label, async element => {
42
- await setSandbox(browserContext, '');
43
- for (let i = 0; i < buttons.length; ++i) {
44
- const buttonElement = await element.findElement(By.xpath(`.//div[@title='${buttons[i].title}']`));
45
- await buttonElement.click();
46
- await compareSandbox(browserContext, buttons[i].expectedSandbox ?? '');
47
- await takeScreenshot(browserContext, `${label} ${i}`, element);
48
- }
49
- for (let i = 0; i < buttons.length; ++i) {
50
- await compareScreenshot(browserContext, `${label} ${i}`);
51
- }
52
- });
53
- }
54
-
55
- itCheckClickButton(0, 'regular flipping', [
56
- { title: 'Flip the board' },
57
- { title: 'Flip the board' },
58
- ]);
59
-
60
- itCheckClickButton(2, 'regular navigation', [
61
- { title: 'Go to the next move' },
62
- { title: 'Go to the previous move' },
63
- { title: 'Go to the previous move' },
64
- { title: 'Go to the beginning of the game' },
65
- { title: 'Go to the end of the game' },
66
- { title: 'Flip the board' },
67
- ]);
68
-
69
- itCheckClickButton(3, 'forbidden navigation at beginning', [
70
- { title: 'Go to the previous move' },
71
- { title: 'Go to the beginning of the game' },
72
- { title: 'Flip the board', expectedSandbox: 'Flip state changed: false' },
73
- ]);
74
-
75
- itCheckClickButton(1, 'forbidden navigation at end', [
76
- { title: 'Go to the next move' },
77
- { title: 'Go to the end of the game' },
78
- { title: 'Flip the board' },
79
- ]);
80
-
81
- function itCheckPressKey(itemIndex, label, keys) {
82
- itCustom(browserContext, '12_navigation_board/uncontrolled', itemIndex, label, async element => {
83
- await setSandbox(browserContext, '');
84
- const focusFieldElements = await element.findElements(By.className('kokopu-focusField'));
85
-
86
- test.value(focusFieldElements.length).is(1);
87
- const focusFieldElement = focusFieldElements[0];
88
-
89
- for (let i = 0; i < keys.length; ++i) {
90
- await focusFieldElement.sendKeys(keys[i].code);
91
- await compareSandbox(browserContext, keys[i].expectedSandbox ?? '');
92
- await takeScreenshot(browserContext, `${label} ${i}`, element);
93
- }
94
- for (let i = 0; i < keys.length; ++i) {
95
- await compareScreenshot(browserContext, `${label} ${i}`);
96
- }
97
- });
98
- }
99
-
100
- itCheckPressKey(4, 'navigation with keys', [
101
- { code: Key.ARROW_LEFT },
102
- { code: Key.HOME },
103
- { code: Key.ARROW_RIGHT },
104
- { code: Key.ESCAPE },
105
- { code: Key.END },
106
- ]);
107
-
108
- });
109
-
110
-
111
- describeWithBrowser('Navigation board - Controlled behavior', browserContext => {
112
-
113
- itChecksScreenshots(browserContext, '12_navigation_board/controlled', [
114
- 'default',
115
- 'overriding initial node ID',
116
- 'invalid node ID',
117
- ]);
118
-
119
- function itCheckClickButton(itemIndex, label, buttons) {
120
- itCustom(browserContext, '12_navigation_board/controlled', itemIndex, label, async element => {
121
- await setSandbox(browserContext, '');
122
- for (let i = 0; i < buttons.length; ++i) {
123
- const buttonElement = await element.findElement(By.xpath(`.//div[@title='${buttons[i].title}']`));
124
- await buttonElement.click();
125
- await compareSandbox(browserContext, buttons[i].expectedSandbox ?? '');
126
- await takeScreenshot(browserContext, `${label} ${i}`, element);
127
- }
128
- for (let i = 0; i < buttons.length; ++i) {
129
- await compareScreenshot(browserContext, `${label} ${i}`);
130
- }
131
- });
132
- }
133
-
134
- itCheckClickButton(0, 'regular navigation', [
135
- { title: 'Go to the beginning of the game', expectedSandbox: 'Node ID changed: start' },
136
- { title: 'Go to the previous move', expectedSandbox: 'Node ID changed: 16b' },
137
- { title: 'Go to the next move', expectedSandbox: 'Node ID changed: 17b' },
138
- { title: 'Go to the end of the game', expectedSandbox: 'Node ID changed: 28b' },
139
- ]);
140
-
141
- itCheckClickButton(1, 'no callback defined', [
142
- { title: 'Go to the beginning of the game' },
143
- { title: 'Flip the board' },
144
- ]);
145
-
146
- itCheckClickButton(2, 'forbidden navigation', [
147
- { title: 'Go to the previous move' },
148
- { title: 'Flip the board', expectedSandbox: 'Flip state changed: true' },
149
- ]);
150
-
151
- });
152
-
153
-
154
- describeWithBrowser('Navigation board graphic', browserContext => {
155
-
156
- itChecksScreenshots(browserContext, '12_navigation_board/error', [
157
- 'pgn parsing error',
158
- 'wrong game type',
159
- ]);
160
-
161
- itChecksScreenshots(browserContext, '12_navigation_board/theme', [
162
- 'small',
163
- 'large',
164
- 'custom 1',
165
- 'custom 2',
166
- ]);
167
-
168
- });