kokopu-react 3.0.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/.eslintrc.yml +1 -1
  2. package/CHANGELOG.md +13 -1
  3. package/dist/lib/chessboard/BoardProperties.d.ts +91 -0
  4. package/dist/lib/chessboard/BoardProperties.js +43 -0
  5. package/dist/lib/chessboard/BoardProperties.js.map +1 -0
  6. package/dist/lib/chessboard/Chessboard.css +13 -13
  7. package/dist/lib/chessboard/Chessboard.d.ts +14 -58
  8. package/dist/lib/chessboard/Chessboard.js +26 -92
  9. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  10. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  11. package/dist/lib/chessboard/Draggable.js.map +1 -1
  12. package/dist/lib/chessboard/Motion.js.map +1 -1
  13. package/dist/lib/chessboard/colorsets.js.map +1 -1
  14. package/dist/lib/chessboard/piecesets.js.map +1 -1
  15. package/dist/lib/errorbox/ErrorBox.css +18 -18
  16. package/dist/lib/errorbox/ErrorBox.js.map +1 -1
  17. package/dist/lib/errorbox/parsing.d.ts +57 -0
  18. package/dist/lib/errorbox/parsing.js +140 -0
  19. package/dist/lib/errorbox/parsing.js.map +1 -0
  20. package/dist/lib/exception.js.map +1 -1
  21. package/dist/lib/i18n.d.ts +6 -0
  22. package/dist/lib/i18n.js +7 -0
  23. package/dist/lib/i18n.js.map +1 -1
  24. package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
  25. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
  26. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  27. package/dist/lib/icons/ArrowTip.js.map +1 -1
  28. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  29. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  30. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  31. package/dist/lib/icons/arrow.css +1 -1
  32. package/dist/lib/index.d.ts +5 -1
  33. package/dist/lib/index.js +3 -0
  34. package/dist/lib/index.js.map +1 -1
  35. package/dist/lib/movetext/Movetext.css +27 -40
  36. package/dist/lib/movetext/Movetext.d.ts +9 -43
  37. package/dist/lib/movetext/Movetext.js +15 -67
  38. package/dist/lib/movetext/Movetext.js.map +1 -1
  39. package/dist/lib/movetext/MovetextImpl.d.ts +7 -28
  40. package/dist/lib/movetext/MovetextImpl.js +15 -94
  41. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  42. package/dist/lib/movetext/fonts.css +7 -7
  43. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  44. package/dist/lib/movetext/moveFormatter.js.map +1 -1
  45. package/dist/lib/navigationboard/NavigationBoard.d.ts +156 -0
  46. package/dist/lib/navigationboard/NavigationBoard.js +195 -0
  47. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -0
  48. package/dist/lib/navigationboard/NavigationButton.d.ts +54 -0
  49. package/dist/lib/navigationboard/NavigationButton.js +35 -0
  50. package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
  51. package/dist/lib/navigationboard/NavigationField.css +36 -0
  52. package/dist/lib/navigationboard/NavigationField.d.ts +81 -0
  53. package/dist/lib/navigationboard/NavigationField.js +154 -0
  54. package/dist/lib/navigationboard/NavigationField.js.map +1 -0
  55. package/dist/lib/navigationboard/NavigationToolbar.css +54 -0
  56. package/dist/lib/navigationboard/NavigationToolbar.d.ts +34 -0
  57. package/dist/lib/navigationboard/NavigationToolbar.js +73 -0
  58. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -0
  59. package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
  60. package/dist/lib/navigationboard/iconPaths.js +91 -0
  61. package/dist/lib/navigationboard/iconPaths.js.map +1 -0
  62. package/dist/lib/sanitization.js.map +1 -1
  63. package/dist/lib/types.js.map +1 -1
  64. package/dist/lib/util.js.map +1 -1
  65. package/doc_src/demo/PageChessboardBase.tsx +115 -115
  66. package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
  67. package/doc_src/demo/PageChessboardMove.tsx +173 -156
  68. package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
  69. package/doc_src/demo/PageMovetextBase.tsx +180 -180
  70. package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
  71. package/doc_src/demo/PageNavigationBoardBase.tsx +201 -0
  72. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +114 -0
  73. package/doc_src/demo/decs.d.ts +4 -4
  74. package/doc_src/demo/demo.css +12 -12
  75. package/doc_src/demo/game-3.pgn +10 -0
  76. package/doc_src/demo/util.ts +1 -1
  77. package/doc_src/examples/Movetext.md +1 -1
  78. package/doc_src/examples/NavigationBoard.md +15 -0
  79. package/doc_src/theming/LogoRenderer.js +13 -13
  80. package/doc_src/theming/theming.css +5 -5
  81. package/package.json +95 -95
  82. package/scripts/doc.styleguide.config.js +133 -123
  83. package/scripts/doc.tsconfig.json +5 -5
  84. package/scripts/docker-compose.yml +1 -1
  85. package/scripts/test-graphic.tsconfig.json +5 -5
  86. package/scripts/test-graphic.webpack.config.js +57 -57
  87. package/scripts/test-headless.webpack.config.js +29 -29
  88. package/src/chessboard/BoardProperties.ts +131 -0
  89. package/src/chessboard/Chessboard.css +13 -13
  90. package/src/chessboard/Chessboard.tsx +389 -518
  91. package/src/chessboard/ChessboardImpl.tsx +557 -557
  92. package/src/chessboard/Draggable.tsx +185 -185
  93. package/src/chessboard/Motion.tsx +67 -67
  94. package/src/chessboard/colorsets.ts +66 -66
  95. package/src/chessboard/piecesets.ts +84 -84
  96. package/src/decs.d.ts +2 -2
  97. package/src/errorbox/ErrorBox.css +18 -18
  98. package/src/errorbox/ErrorBox.tsx +75 -75
  99. package/src/errorbox/parsing.tsx +158 -0
  100. package/src/exception.ts +17 -17
  101. package/src/i18n.ts +8 -0
  102. package/src/icons/AnnotationSymbolShape.css +6 -6
  103. package/src/icons/AnnotationSymbolShape.tsx +31 -31
  104. package/src/icons/ArrowMarkerIcon.tsx +34 -34
  105. package/src/icons/ArrowTip.tsx +14 -14
  106. package/src/icons/ChessPieceIcon.tsx +45 -45
  107. package/src/icons/SquareMarkerIcon.tsx +20 -20
  108. package/src/icons/TextMarkerIcon.tsx +29 -29
  109. package/src/icons/arrow.css +1 -1
  110. package/src/index.ts +8 -3
  111. package/src/movetext/Movetext.css +27 -40
  112. package/src/movetext/Movetext.tsx +163 -228
  113. package/src/movetext/MovetextImpl.tsx +351 -438
  114. package/src/movetext/fonts.css +7 -7
  115. package/src/movetext/htmlFilter.tsx +129 -129
  116. package/src/movetext/moveFormatter.tsx +37 -37
  117. package/src/navigationboard/NavigationBoard.tsx +350 -0
  118. package/src/navigationboard/NavigationButton.ts +72 -0
  119. package/src/navigationboard/NavigationField.css +36 -0
  120. package/src/navigationboard/NavigationField.tsx +185 -0
  121. package/src/navigationboard/NavigationToolbar.css +54 -0
  122. package/src/navigationboard/NavigationToolbar.tsx +117 -0
  123. package/src/navigationboard/iconPaths.ts +98 -0
  124. package/src/sanitization.ts +17 -17
  125. package/src/types.ts +116 -116
  126. package/src/util.ts +11 -11
  127. package/test/01_types.js +167 -167
  128. package/test/02_chessboard_util.js +114 -114
  129. package/test/03_error_box_graphic.js +16 -16
  130. package/test/04_icons_graphic.js +32 -32
  131. package/test/05_chessboard_graphic.js +60 -58
  132. package/test/06_chessboard_animation.js +36 -36
  133. package/test/07_chessboard_interaction.js +101 -101
  134. package/test/08_chessboard_play_moves.js +62 -62
  135. package/test/09_chessboard_small_screens.js +42 -21
  136. package/test/10_movetext_graphic.js +36 -31
  137. package/test/11_movetext_interaction.js +100 -96
  138. package/test/12_navigation_board_base.js +151 -0
  139. package/test/13_navigation_board_graphic.js +68 -0
  140. package/test/14_navigation_board_autoplay.js +100 -0
  141. package/test/common/graphic.js +106 -97
  142. package/test/graphic_references/05_chessboard_graphic/move/illegal_null-move.png +0 -0
  143. package/test/graphic_references/05_chessboard_graphic/move/null-move.png +0 -0
  144. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_bottom_component.png +0 -0
  145. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_top_component.png +0 -0
  146. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_bottom_component.png +0 -0
  147. package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_top_component.png +0 -0
  148. package/test/graphic_references/10_movetext_graphic/format_move/format_text.png +0 -0
  149. package/test/graphic_references/10_movetext_graphic/options/wrong_piece_symbol_value.png +0 -0
  150. package/test/graphic_references/11_movetext_interaction/select_moves/click_on_unselected_without_callback.png +0 -0
  151. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  152. package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_0.png +0 -0
  153. package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_1.png +0 -0
  154. package/test/graphic_references/12_navigation_board_base/controlled/invalid_node_id.png +0 -0
  155. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  156. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_1.png +0 -0
  157. package/test/graphic_references/12_navigation_board_base/controlled/overriding_initial_node_id.png +0 -0
  158. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_0.png +0 -0
  159. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_1.png +0 -0
  160. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_2.png +0 -0
  161. package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_3.png +0 -0
  162. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png +0 -0
  163. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png +0 -0
  164. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png +0 -0
  165. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png +0 -0
  166. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  167. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  168. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_end.png +0 -0
  169. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  170. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default.png +0 -0
  171. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default_with_game_index.png +0 -0
  172. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_on_null-move.png +0 -0
  173. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_0.png +0 -0
  174. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  175. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_2.png +0 -0
  176. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_3.png +0 -0
  177. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_4.png +0 -0
  178. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_0.png +0 -0
  179. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_1.png +0 -0
  180. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_0.png +0 -0
  181. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_1.png +0 -0
  182. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_2.png +0 -0
  183. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  184. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_4.png +0 -0
  185. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_5.png +0 -0
  186. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  187. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  188. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  189. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/single_button.png +0 -0
  190. package/test/graphic_references/13_navigation_board_graphic/error/pgn_parsing_error.png +0 -0
  191. package/test/graphic_references/13_navigation_board_graphic/error/wrong_game_type.png +0 -0
  192. package/test/graphic_references/13_navigation_board_graphic/theme/custom_1.png +0 -0
  193. package/test/graphic_references/13_navigation_board_graphic/theme/custom_2.png +0 -0
  194. package/test/graphic_references/13_navigation_board_graphic/theme/large.png +0 -0
  195. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  196. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  197. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  198. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  199. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  200. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_reaching_the_end.png +0 -0
  201. package/test/graphic_references/14_navigation_board_autoplay/controlled/already_at_the_end.png +0 -0
  202. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  203. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  204. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_at_the_end.png +0 -0
  205. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  206. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  207. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  208. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  209. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  210. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  211. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  212. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  213. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_default.png +0 -0
  214. package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
  215. package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
  216. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
  217. package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
  218. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
  219. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
  220. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
  221. package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
  222. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -10
  223. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
  224. package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
  225. package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
  226. package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
  227. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
  228. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
  229. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
  230. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
  231. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
  232. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
  233. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
  234. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
  235. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +48 -0
  236. package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
  237. package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
  238. package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +31 -0
  239. package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
  240. package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -9
  241. package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
  242. package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -10
  243. package/test/graphic_test_app/12_navigation_board_base/controlled.tsx +43 -0
  244. package/test/graphic_test_app/12_navigation_board_base/uncontrolled.tsx +56 -0
  245. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
  246. package/test/graphic_test_app/13_navigation_board_graphic/error.tsx +34 -0
  247. package/test/graphic_test_app/13_navigation_board_graphic/theme.tsx +38 -0
  248. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
  249. package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
  250. package/test/graphic_test_app/common/decs.d.ts +2 -2
  251. package/test/graphic_test_app/common/test_app.css +15 -15
  252. package/test/graphic_test_app/common/test_app.tsx +48 -48
  253. package/tsconfig.json +13 -13
@@ -33,25 +33,25 @@ import { AnnotationSymbolShape } from './AnnotationSymbolShape';
33
33
 
34
34
  export interface TextMarkerIconProps {
35
35
 
36
- /**
37
- * Width and height (in pixels) of the icon.
38
- */
39
- size: number;
40
-
41
- /**
42
- * Symbol to represent on the icon.
43
- */
44
- symbol: AnnotationSymbol;
45
-
46
- /**
47
- * [CSS color](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value) to use to colorize the icon (for example: `'green'`, `'#ff0000'`...).
48
- */
49
- color: string;
36
+ /**
37
+ * Width and height (in pixels) of the icon.
38
+ */
39
+ size: number;
40
+
41
+ /**
42
+ * Symbol to represent on the icon.
43
+ */
44
+ symbol: AnnotationSymbol;
45
+
46
+ /**
47
+ * [CSS color](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value) to use to colorize the icon (for example: `'green'`, `'#ff0000'`...).
48
+ */
49
+ color: string;
50
50
  }
51
51
 
52
52
 
53
53
  const defaultProps: Partial<TextMarkerIconProps> = {
54
- color: 'currentcolor',
54
+ color: 'currentcolor',
55
55
  };
56
56
 
57
57
 
@@ -60,20 +60,20 @@ const defaultProps: Partial<TextMarkerIconProps> = {
60
60
  */
61
61
  export function TextMarkerIcon({ size, symbol, color }: TextMarkerIconProps) {
62
62
 
63
- // Sanitize the inputs.
64
- size = sanitizeBoundedInteger(size, MIN_SQUARE_SIZE, MAX_SQUARE_SIZE, () => new IllegalArgument('TextMarkerIcon', 'size'));
65
- if (!isAnnotationSymbol(symbol)) {
66
- throw new IllegalArgument('TextMarkerIcon', 'symbol');
67
- }
68
- color = sanitizeString(color);
69
-
70
- // Render the component.
71
- const viewBox = `0 0 ${size} ${size}`;
72
- return (
73
- <svg className="kokopu-textMarkerIcon" viewBox={viewBox} width={size} height={size}>
74
- <AnnotationSymbolShape x={size / 2} y={size / 2} size={size} symbol={symbol} color={color} />
75
- </svg>
76
- );
63
+ // Sanitize the inputs.
64
+ size = sanitizeBoundedInteger(size, MIN_SQUARE_SIZE, MAX_SQUARE_SIZE, () => new IllegalArgument('TextMarkerIcon', 'size'));
65
+ if (!isAnnotationSymbol(symbol)) {
66
+ throw new IllegalArgument('TextMarkerIcon', 'symbol');
67
+ }
68
+ color = sanitizeString(color);
69
+
70
+ // Render the component.
71
+ const viewBox = `0 0 ${size} ${size}`;
72
+ return (
73
+ <svg className="kokopu-textMarkerIcon" viewBox={viewBox} width={size} height={size}>
74
+ <AnnotationSymbolShape x={size / 2} y={size / 2} size={size} symbol={symbol} color={color} />
75
+ </svg>
76
+ );
77
77
  }
78
78
 
79
79
  TextMarkerIcon.defaultProps = defaultProps;
@@ -23,5 +23,5 @@
23
23
 
24
24
 
25
25
  .kokopu-arrow {
26
- stroke-linecap: round;
26
+ stroke-linecap: round;
27
27
  }
package/src/index.ts CHANGED
@@ -26,8 +26,8 @@ export { i18n } from './i18n';
26
26
  export * as exception from './exception';
27
27
 
28
28
  export { ChessPieceIconType, Colorset, Pieceset, PieceSymbolMapping, AnnotationColor, AnnotationSymbol, SquareMarkerSet, TextMarkerSet, ArrowMarkerSet,
29
- isChessPieceIconType, isPieceSymbolMapping, isAnnotationColor, isAnnotationSymbol, flattenSquareMarkers, flattenTextMarkers, flattenArrowMarkers,
30
- parseSquareMarkers, parseTextMarkers, parseArrowMarkers } from './types';
29
+ isChessPieceIconType, isPieceSymbolMapping, isAnnotationColor, isAnnotationSymbol, flattenSquareMarkers, flattenTextMarkers, flattenArrowMarkers,
30
+ parseSquareMarkers, parseTextMarkers, parseArrowMarkers } from './types';
31
31
 
32
32
  export { ErrorBox, ErrorBoxProps } from './errorbox/ErrorBox';
33
33
 
@@ -36,7 +36,12 @@ export { TextMarkerIcon, TextMarkerIconProps } from './icons/TextMarkerIcon';
36
36
  export { ArrowMarkerIcon, ArrowMarkerIconProps } from './icons/ArrowMarkerIcon';
37
37
  export { ChessPieceIcon, ChessPieceIconProps } from './icons/ChessPieceIcon';
38
38
 
39
- export { Chessboard, ChessboardProps, SmallScreenLimit } from './chessboard/Chessboard';
39
+ export { SmallScreenLimit } from './chessboard/BoardProperties';
40
+ export { Chessboard, ChessboardProps } from './chessboard/Chessboard';
40
41
 
41
42
  export { formatMove, moveFormatter } from './movetext/moveFormatter';
42
43
  export { Movetext, MovetextProps, MoveSelectEventOrigin } from './movetext/Movetext';
44
+
45
+ export { NavigationButton, NavigationButtonList, isNavigationButton } from './navigationboard/NavigationButton';
46
+ export { firstNodeId, previousNodeId, nextNodeId, lastNodeId } from './navigationboard/NavigationField';
47
+ export { NavigationBoard, NavigationBoardProps } from './navigationboard/NavigationBoard';
@@ -23,101 +23,88 @@
23
23
 
24
24
 
25
25
  .kokopu-colorTag {
26
- width : 1.2em;
27
- height: 1.2em;
28
- vertical-align: middle;
29
- display: inline-block;
30
- border: 1px solid black;
31
- margin-right: 0.25em;
26
+ width : 1.2em;
27
+ height: 1.2em;
28
+ vertical-align: middle;
29
+ display: inline-block;
30
+ border: 1px solid black;
31
+ margin-right: 0.25em;
32
32
  }
33
33
 
34
34
  .kokopu-headerGroup-whitePlayer .kokopu-colorTag {
35
- background-color: white;
35
+ background-color: white;
36
36
  }
37
37
 
38
38
  .kokopu-headerGroup-blackPlayer .kokopu-colorTag {
39
- background-color: black;
39
+ background-color: black;
40
40
  }
41
41
 
42
42
  .kokopu-headerGroup-titleRating:before,
43
43
  .kokopu-header-round:before {
44
- content: "\a0("; /* \a0 == &nbsp; */
44
+ content: "\a0("; /* \a0 == &nbsp; */
45
45
  }
46
46
 
47
47
  .kokopu-headerGroup-titleRating:after,
48
48
  .kokopu-header-round:after {
49
- content: ")";
49
+ content: ")";
50
50
  }
51
51
 
52
52
  .kokopu-header-round,
53
53
  .kokopu-header-annotator {
54
- font-style: italic;
54
+ font-style: italic;
55
55
  }
56
56
 
57
57
  * + .kokopu-move:before,
58
58
  * + .kokopu-gameResult:before,
59
59
  * + span.kokopu-comment:before {
60
- content: " ";
60
+ content: " ";
61
61
  }
62
62
 
63
63
  span.kokopu-variation:before {
64
- content: " (";
64
+ content: " (";
65
65
  }
66
66
 
67
67
  span.kokopu-variation:after {
68
- content: ")";
68
+ content: ")";
69
69
  }
70
70
 
71
71
  * + .kokopu-nag:before {
72
- content: "\a0"; /* \a0 == &nbsp; */
72
+ content: "\a0"; /* \a0 == &nbsp; */
73
73
  }
74
74
 
75
75
  div.kokopu-subVariation {
76
- margin-left: 1.5em;
76
+ margin-left: 1.5em;
77
77
  }
78
78
 
79
79
  .kokopu-move,
80
80
  .kokopu-gameResult {
81
- font-weight: bold;
81
+ font-weight: bold;
82
82
  }
83
83
 
84
84
  .kokopu-subVariation .kokopu-move {
85
- font-weight: inherit;
85
+ font-weight: inherit;
86
86
  }
87
87
 
88
88
  .kokopu-diagram {
89
- text-align: center;
90
- line-height: 0px;
89
+ text-align: center;
90
+ line-height: 0px;
91
91
  }
92
92
 
93
93
  .kokopu-moveContent {
94
- display: inline-block;
95
- padding-left: 1px;
96
- padding-right: 1px;
94
+ display: inline-block;
95
+ padding-left: 1px;
96
+ padding-right: 1px;
97
97
  }
98
98
 
99
99
  .kokopu-selectedMove .kokopu-moveContent {
100
- background-color: currentcolor;
100
+ background-color: currentcolor;
101
101
  }
102
102
 
103
103
  .kokopu-selectedMove .kokopu-moveContent > * {
104
- filter: invert(1);
104
+ filter: invert(1);
105
105
  }
106
106
 
107
107
  .kokopu-clickableMove .kokopu-moveContent:hover {
108
- text-decoration: underline;
109
- cursor: pointer;
110
- }
111
-
112
- .kokopu-focusFieldContainer {
113
- position: fixed;
114
- bottom: 0px;
115
- right: 0px;
116
- width: 0px;
117
- height: 0px;
118
- overflow: hidden;
119
- }
120
-
121
- .kokopu-focusField {
122
- position: absolute; /* see #1 */
108
+ text-decoration: underline;
109
+ cursor: pointer;
123
110
  }
@@ -24,17 +24,17 @@
24
24
 
25
25
  import * as React from 'react';
26
26
 
27
- import { exception as kokopuException, Database, Game, pgnRead } from 'kokopu';
27
+ import { Database, Game } from 'kokopu';
28
28
 
29
29
  import { IllegalArgument } from '../exception';
30
- import { i18n } from '../i18n';
31
30
  import { sanitizeString, sanitizeBoolean, sanitizeOptional } from '../sanitization';
32
31
  import { PieceSymbolMapping } from '../types';
33
32
 
34
- import { ChessboardProps } from '../chessboard/Chessboard';
35
- import { ErrorBox } from '../errorbox/ErrorBox';
33
+ import { StaticBoardGraphicProps } from '../chessboard/BoardProperties';
34
+ import { parseGame } from '../errorbox/parsing';
35
+ import { firstNodeId as firstNodeIdImpl, previousNodeId as previousNodeIdImpl, nextNodeId as nextNodeIdImpl, lastNodeId as lastNodeIdImpl } from '../navigationboard/NavigationField';
36
36
  import { moveFormatter } from './moveFormatter';
37
- import { MovetextImpl, firstNodeIdImpl, previousNodeIdImpl, nextNodeIdImpl, lastNodeIdImpl } from './MovetextImpl';
37
+ import { MovetextImpl } from './MovetextImpl';
38
38
 
39
39
  import './Movetext.css';
40
40
 
@@ -47,75 +47,69 @@ export type MoveSelectEventOrigin = 'key-first' | 'key-previous' | 'key-next' |
47
47
 
48
48
  export interface MovetextProps {
49
49
 
50
- /**
51
- * Displayed position. Can be a [kokopu.Game](https://kokopu.yo35.org/docs/current/classes/Game.html) object,
52
- * a [kokopu.Database](https://kokopu.yo35.org/docs/current/classes/Database.html) object,
53
- * or a [PGN string](https://en.wikipedia.org/wiki/Portable_Game_Notation).
54
- */
55
- game: Game | Database | string;
56
-
57
- /**
58
- * Index of the game to display (only if attribute `game` is a [kokopu.Database](https://kokopu.yo35.org/docs/current/classes/Database.html)
59
- * or a [PGN string](https://en.wikipedia.org/wiki/Portable_Game_Notation)): `0` for the first game of the database/PGN, `1` for the second one, etc.
60
- * If omitted, the first game of the database/PGN is displayed.
61
- */
62
- gameIndex: number;
63
-
64
- /**
65
- * Options applicable to the diagrams in the comments. See [Chessboard](#/Components/Chessboard) for more details about each option.
66
- */
67
- diagramOptions: {
68
- flipped?: ChessboardProps['flipped'],
69
- squareSize?: ChessboardProps['squareSize'],
70
- coordinateVisible?: ChessboardProps['coordinateVisible'],
71
- turnVisible?: ChessboardProps['turnVisible'],
72
- colorset?: ChessboardProps['colorset'],
73
- pieceset?: ChessboardProps['pieceset'],
74
- smallScreenLimits?: ChessboardProps['smallScreenLimits'],
75
- };
76
-
77
- /**
78
- * Symbols to use for the chess pieces. See {@link moveFormatter}.
79
- */
80
- pieceSymbols: 'native' | 'localized' | 'figurines' | PieceSymbolMapping;
81
-
82
- /**
83
- * Whether the diagrams within the comments (if any) are displayed or not.
84
- */
85
- diagramVisible: boolean;
86
-
87
- /**
88
- * Whether the game headers (if any) are displayed or not.
89
- */
90
- headerVisible: boolean;
91
-
92
- /**
93
- * ID of the selected move (or `'start'` for the beginning of the main variation).
94
- * Use [kokopu.Node#id](https://kokopu.yo35.org/docs/current/classes/Node.html#id) to get the ID of a game move.
95
- */
96
- selection?: string;
97
-
98
- /**
99
- * Type of action allowed with the mouse/keys on the component. If undefined, then the user cannot interact with the component.
100
- *
101
- * - `'selectMove'` allows the user to select a move.
102
- */
103
- interactionMode?: 'selectMove';
104
-
105
- /**
106
- * Callback invoked when the user selects a move (only if `interactionMode` is set to `'selectMove'`).
107
- *
108
- * @param nodeId - ID of the selected move (as returned by [kokopu.Node#id](https://kokopu.yo35.org/docs/current/classes/Node.html#id)),
109
- * `'start'` for the beginning of the main variation, or `undefined` if the user unselects the previously selected move.
110
- * @param evtOrigin - Origin of the event. Can be:
111
- * - `'key-first'`: the event has been triggered by the "go-to-first-move" key (aka. the home key),
112
- * - `'key-previous'`: the event has been triggered by the "go-to-previous-move" key (aka. the arrow left key),
113
- * - `'key-next'`: the event has been triggered by the "go-to-next-move" key (aka. the arrow right key),
114
- * - `'key-last'`: the event has been triggered by the "go-to-last-move" key (aka. the end key),
115
- * - `'key-exit'`: the event has been triggered by the "unselect-move" key (aka. the escape key),
116
- * - `'click'`: the event has been triggered by a mouse click on a move.
117
- */
118
- onMoveSelected?: (nodeId: string | undefined, evtOrigin: MoveSelectEventOrigin) => void;
50
+ /**
51
+ * Displayed game. Can be a [kokopu.Game](https://kokopu.yo35.org/docs/current/classes/Game.html) object,
52
+ * a [kokopu.Database](https://kokopu.yo35.org/docs/current/classes/Database.html) object,
53
+ * or a [PGN string](https://en.wikipedia.org/wiki/Portable_Game_Notation).
54
+ */
55
+ game: Game | Database | string;
56
+
57
+ /**
58
+ * Index of the game to display (only if attribute `game` is a [kokopu.Database](https://kokopu.yo35.org/docs/current/classes/Database.html)
59
+ * or a [PGN string](https://en.wikipedia.org/wiki/Portable_Game_Notation)): `0` for the first game of the database/PGN, `1` for the second one, etc.
60
+ * If omitted, the first game of the database/PGN is displayed.
61
+ */
62
+ gameIndex: number;
63
+
64
+ /**
65
+ * Options applicable to the diagrams in the comments. See [Chessboard](#/Components/Chessboard) for more details about each option.
66
+ */
67
+ diagramOptions: Partial<StaticBoardGraphicProps> & {
68
+ flipped?: boolean,
69
+ };
70
+
71
+ /**
72
+ * Symbols to use for the chess pieces. See {@link moveFormatter}.
73
+ */
74
+ pieceSymbols: 'native' | 'localized' | 'figurines' | PieceSymbolMapping;
75
+
76
+ /**
77
+ * Whether the diagrams within the comments (if any) are displayed or not.
78
+ */
79
+ diagramVisible: boolean;
80
+
81
+ /**
82
+ * Whether the game headers (if any) are displayed or not.
83
+ */
84
+ headerVisible: boolean;
85
+
86
+ /**
87
+ * ID of the selected move (or `'start'`/`'end'` for the beginning/end of the main variation).
88
+ * Use [kokopu.Node#id](https://kokopu.yo35.org/docs/current/classes/Node.html#id) to get the ID of a game move.
89
+ */
90
+ selection?: string;
91
+
92
+ /**
93
+ * Type of action allowed with the mouse/keys on the component. If undefined, then the user cannot interact with the component.
94
+ *
95
+ * - `'selectMove'` allows the user to select a move.
96
+ */
97
+ interactionMode?: 'selectMove';
98
+
99
+ /**
100
+ * Callback invoked when the user selects a move (only if `interactionMode` is set to `'selectMove'`).
101
+ *
102
+ * @param nodeId - ID of the selected move (as returned by [kokopu.Node#id](https://kokopu.yo35.org/docs/current/classes/Node.html#id)),
103
+ * `'start'` for the beginning of the main variation, or `undefined` if the user unselects the previously selected move.
104
+ * @param evtOrigin - Origin of the event. Can be:
105
+ * - `'key-first'`: the event has been triggered by the "go-to-first-move" key (aka. the home key),
106
+ * - `'key-previous'`: the event has been triggered by the "go-to-previous-move" key (aka. the arrow left key),
107
+ * - `'key-next'`: the event has been triggered by the "go-to-next-move" key (aka. the arrow right key),
108
+ * - `'key-last'`: the event has been triggered by the "go-to-last-move" key (aka. the end key),
109
+ * - `'key-exit'`: the event has been triggered by the "unselect-move" key (aka. the escape key),
110
+ * - `'click'`: the event has been triggered by a mouse click on a move.
111
+ */
112
+ onMoveSelected?: (nodeId: string | undefined, evtOrigin: MoveSelectEventOrigin) => void;
119
113
  }
120
114
 
121
115
 
@@ -124,159 +118,100 @@ export interface MovetextProps {
124
118
  */
125
119
  export class Movetext extends React.Component<MovetextProps> {
126
120
 
127
- static defaultProps = {
128
- game: new Game(),
129
- gameIndex: 0,
130
- diagramOptions: {},
131
- pieceSymbols: 'native',
132
- diagramVisible: true,
133
- headerVisible: true,
134
- };
135
-
136
- private implRef: React.RefObject<MovetextImpl> = React.createRef();
137
-
138
- render() {
139
-
140
- // Validate the game and game-index attributes.
141
- const info = parseGame(this.props.game, this.props.gameIndex);
142
- if (info.error) {
143
- return (
144
- <ErrorBox
145
- title={i18n.INVALID_PGN_ERROR_TITLE} message={info.pgnException.message} text={info.pgnException.pgn}
146
- errorIndex={info.pgnException.index} lineNumber={info.pgnException.lineNumber}
147
- />
148
- );
149
- }
150
-
151
- // Validate the appearance attributes.
152
- if (typeof this.props.diagramOptions !== 'object' || this.props.diagramOptions === null) {
153
- throw new IllegalArgument('Movetext', 'diagramOptions');
154
- }
155
- const formatter = moveFormatter(this.props.pieceSymbols);
156
- const diagramVisible = sanitizeBoolean(this.props.diagramVisible);
157
- const headerVisible = sanitizeBoolean(this.props.headerVisible);
158
-
159
- // Validate the interaction attributes and the callbacks.
160
- const selection = sanitizeOptional(this.props.selection, sanitizeString);
161
- const interactionMode = this.getInteractionMode();
162
- const { onMoveSelected } = this.props;
163
-
164
- return (
165
- <MovetextImpl ref={this.implRef}
166
- game={info.game}
167
- diagramOptions={this.props.diagramOptions} moveFormatter={formatter} diagramVisible={diagramVisible} headerVisible={headerVisible}
168
- selection={selection} interactionMode={interactionMode} onMoveSelected={onMoveSelected}
169
- />
170
- );
171
- }
172
-
173
- private getInteractionMode() {
174
- const interactionMode = sanitizeOptional(this.props.interactionMode, sanitizeString);
175
- if (interactionMode === undefined || interactionMode === 'selectMove') {
176
- return interactionMode;
177
- }
178
- else {
179
- throw new IllegalArgument('Movetext', 'interactionMode');
180
- }
181
- }
182
-
183
- /**
184
- * Set the focus to the current component.
185
- *
186
- * @public
187
- */
188
- focus() {
189
- const movetextImpl = this.implRef.current;
190
- if (movetextImpl) {
191
- movetextImpl.focus();
192
- }
193
- }
194
-
195
- /**
196
- * Return the ID of the main variation in the given chess game.
197
- * If the given selection corresponds already at the main variation, `undefined` is returned.
198
- *
199
- * This corresponds to the operation performed when the user presses key "home" on a `Movetext` component.
200
- *
201
- * @param game - Considered chess game.
202
- * @param selection - ID of the selected move (or `'start'` for the beginning of the main variation).
203
- * @public
204
- */
205
- static firstNodeId(game: Game, selection: string): string | undefined {
206
- return firstNodeIdImpl(game, selection);
207
- }
208
-
209
- /**
210
- * Return the ID of the node immediately preceding the given selection in the given chess game.
211
- * If no such node exists, `undefined` is returned.
212
- *
213
- * This corresponds to the operation performed when the user presses key "arrow left" on a `Movetext` component.
214
- *
215
- * @param game - Considered chess game.
216
- * @param selection - ID of the selected move (or `'start'` for the beginning of the main variation).
217
- * @public
218
- */
219
- static previousNodeId(game: Game, selection: string): string | undefined {
220
- return previousNodeIdImpl(game, selection);
221
- }
222
-
223
- /**
224
- * Return the ID of the node immediately following the given selection in the given chess game.
225
- * If no such node exists, `undefined` is returned.
226
- *
227
- * This corresponds to the operation performed when the user presses key "arrow right" on a `Movetext` component.
228
- *
229
- * @param game - Considered chess game.
230
- * @param selection - ID of the selected move (or `'start'` for the beginning of the main variation).
231
- * @public
232
- */
233
- static nextNodeId(game: Game, selection: string): string | undefined {
234
- return nextNodeIdImpl(game, selection);
235
- }
236
-
237
- /**
238
- * Return the ID of the node at then end of the variation in which lies the given selection in the given chess game.
239
- * If the selection is already at the end its variation, `undefined` is returned.
240
- *
241
- * This corresponds to the operation performed when the user presses key "end" on a `Movetext` component.
242
- *
243
- * @param game - Considered chess game.
244
- * @param selection - ID of the selected move (or `'start'` for the beginning of the main variation).
245
- * @public
246
- */
247
- static lastNodeId(game: Game, selection: string): string | undefined {
248
- return lastNodeIdImpl(game, selection);
249
- }
121
+ static defaultProps = {
122
+ game: new Game(),
123
+ gameIndex: 0,
124
+ diagramOptions: {},
125
+ pieceSymbols: 'native',
126
+ diagramVisible: true,
127
+ headerVisible: true,
128
+ };
129
+
130
+ private implRef: React.RefObject<MovetextImpl> = React.createRef();
131
+
132
+ render() {
133
+
134
+ // Validate the game and game-index attributes.
135
+ const info = parseGame(this.props.game, this.props.gameIndex, 'Movetext');
136
+ if (info.error) {
137
+ return info.errorBox;
138
+ }
139
+
140
+ // Validate the appearance attributes.
141
+ if (typeof this.props.diagramOptions !== 'object' || this.props.diagramOptions === null) {
142
+ throw new IllegalArgument('Movetext', 'diagramOptions');
143
+ }
144
+ const formatter = moveFormatter(this.props.pieceSymbols);
145
+ const diagramVisible = sanitizeBoolean(this.props.diagramVisible);
146
+ const headerVisible = sanitizeBoolean(this.props.headerVisible);
147
+
148
+ // Validate the interaction attributes and the callbacks.
149
+ const selection = sanitizeOptional(this.props.selection, sanitizeString);
150
+ const interactionMode = this.getInteractionMode();
151
+ const { onMoveSelected } = this.props;
152
+
153
+ return (
154
+ <MovetextImpl ref={this.implRef}
155
+ game={info.game}
156
+ diagramOptions={this.props.diagramOptions} moveFormatter={formatter} diagramVisible={diagramVisible} headerVisible={headerVisible}
157
+ selection={selection} interactionMode={interactionMode} onMoveSelected={onMoveSelected}
158
+ />
159
+ );
160
+ }
161
+
162
+ private getInteractionMode() {
163
+ const interactionMode = sanitizeOptional(this.props.interactionMode, sanitizeString);
164
+ if (interactionMode === undefined || interactionMode === 'selectMove') {
165
+ return interactionMode;
166
+ }
167
+ else {
168
+ throw new IllegalArgument('Movetext', 'interactionMode');
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Set the focus to the current component.
174
+ *
175
+ * @public
176
+ */
177
+ focus() {
178
+ const movetextImpl = this.implRef.current;
179
+ // istanbul ignore else
180
+ if (movetextImpl) {
181
+ movetextImpl.focus();
182
+ }
183
+ }
184
+
185
+ /**
186
+ * @deprecated
187
+ */
188
+ // istanbul ignore next
189
+ static firstNodeId(game: Game, selection: string): string | undefined {
190
+ return firstNodeIdImpl(game, selection);
191
+ }
192
+
193
+ /**
194
+ * @deprecated
195
+ */
196
+ // istanbul ignore next
197
+ static previousNodeId(game: Game, selection: string): string | undefined {
198
+ return previousNodeIdImpl(game, selection);
199
+ }
200
+
201
+ /**
202
+ * @deprecated
203
+ */
204
+ // istanbul ignore next
205
+ static nextNodeId(game: Game, selection: string): string | undefined {
206
+ return nextNodeIdImpl(game, selection);
207
+ }
208
+
209
+ /**
210
+ * @deprecated
211
+ */
212
+ // istanbul ignore next
213
+ static lastNodeId(game: Game, selection: string): string | undefined {
214
+ return lastNodeIdImpl(game, selection);
215
+ }
250
216
 
251
217
  }
252
-
253
-
254
- /**
255
- * Try to interpret the given object as a chess game.
256
- */
257
- function parseGame(game: Game | Database | string, gameIndex: number): { error: true, pgnException: kokopuException.InvalidPGN } | { error: false, game: Game } {
258
- if (game instanceof Game) {
259
- return { error: false, game: game };
260
- }
261
- else if (game instanceof Database || typeof game === 'string') {
262
- if (!Number.isInteger(gameIndex) || gameIndex < 0) {
263
- throw new IllegalArgument('Movetext', 'gameIndex');
264
- }
265
- try {
266
- const result = game instanceof Database ? game.game(gameIndex) : pgnRead(game, gameIndex);
267
- return { error: false, game: result };
268
- }
269
- catch (e) {
270
- // istanbul ignore else
271
- if (e instanceof kokopuException.InvalidPGN) {
272
- return { error: true, pgnException: e };
273
- }
274
- else {
275
- throw e;
276
- }
277
- }
278
- }
279
- else {
280
- throw new IllegalArgument('Movetext', 'game');
281
- }
282
- }