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.
- package/.eslintrc.yml +1 -1
- package/CHANGELOG.md +13 -1
- package/dist/lib/chessboard/BoardProperties.d.ts +91 -0
- package/dist/lib/chessboard/BoardProperties.js +43 -0
- package/dist/lib/chessboard/BoardProperties.js.map +1 -0
- package/dist/lib/chessboard/Chessboard.css +13 -13
- package/dist/lib/chessboard/Chessboard.d.ts +14 -58
- package/dist/lib/chessboard/Chessboard.js +26 -92
- package/dist/lib/chessboard/Chessboard.js.map +1 -1
- package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
- package/dist/lib/chessboard/Draggable.js.map +1 -1
- package/dist/lib/chessboard/Motion.js.map +1 -1
- package/dist/lib/chessboard/colorsets.js.map +1 -1
- package/dist/lib/chessboard/piecesets.js.map +1 -1
- package/dist/lib/errorbox/ErrorBox.css +18 -18
- package/dist/lib/errorbox/ErrorBox.js.map +1 -1
- package/dist/lib/errorbox/parsing.d.ts +57 -0
- package/dist/lib/errorbox/parsing.js +140 -0
- package/dist/lib/errorbox/parsing.js.map +1 -0
- package/dist/lib/exception.js.map +1 -1
- package/dist/lib/i18n.d.ts +6 -0
- package/dist/lib/i18n.js +7 -0
- package/dist/lib/i18n.js.map +1 -1
- package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
- package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
- package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
- package/dist/lib/icons/ArrowTip.js.map +1 -1
- package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
- package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
- package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
- package/dist/lib/icons/arrow.css +1 -1
- package/dist/lib/index.d.ts +5 -1
- package/dist/lib/index.js +3 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/movetext/Movetext.css +27 -40
- package/dist/lib/movetext/Movetext.d.ts +9 -43
- package/dist/lib/movetext/Movetext.js +15 -67
- package/dist/lib/movetext/Movetext.js.map +1 -1
- package/dist/lib/movetext/MovetextImpl.d.ts +7 -28
- package/dist/lib/movetext/MovetextImpl.js +15 -94
- package/dist/lib/movetext/MovetextImpl.js.map +1 -1
- package/dist/lib/movetext/fonts.css +7 -7
- package/dist/lib/movetext/htmlFilter.js.map +1 -1
- package/dist/lib/movetext/moveFormatter.js.map +1 -1
- package/dist/lib/navigationboard/NavigationBoard.d.ts +156 -0
- package/dist/lib/navigationboard/NavigationBoard.js +195 -0
- package/dist/lib/navigationboard/NavigationBoard.js.map +1 -0
- package/dist/lib/navigationboard/NavigationButton.d.ts +54 -0
- package/dist/lib/navigationboard/NavigationButton.js +35 -0
- package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
- package/dist/lib/navigationboard/NavigationField.css +36 -0
- package/dist/lib/navigationboard/NavigationField.d.ts +81 -0
- package/dist/lib/navigationboard/NavigationField.js +154 -0
- package/dist/lib/navigationboard/NavigationField.js.map +1 -0
- package/dist/lib/navigationboard/NavigationToolbar.css +54 -0
- package/dist/lib/navigationboard/NavigationToolbar.d.ts +34 -0
- package/dist/lib/navigationboard/NavigationToolbar.js +73 -0
- package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -0
- package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
- package/dist/lib/navigationboard/iconPaths.js +91 -0
- package/dist/lib/navigationboard/iconPaths.js.map +1 -0
- package/dist/lib/sanitization.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/util.js.map +1 -1
- package/doc_src/demo/PageChessboardBase.tsx +115 -115
- package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
- package/doc_src/demo/PageChessboardMove.tsx +173 -156
- package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
- package/doc_src/demo/PageMovetextBase.tsx +180 -180
- package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
- package/doc_src/demo/PageNavigationBoardBase.tsx +201 -0
- package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +114 -0
- package/doc_src/demo/decs.d.ts +4 -4
- package/doc_src/demo/demo.css +12 -12
- package/doc_src/demo/game-3.pgn +10 -0
- package/doc_src/demo/util.ts +1 -1
- package/doc_src/examples/Movetext.md +1 -1
- package/doc_src/examples/NavigationBoard.md +15 -0
- package/doc_src/theming/LogoRenderer.js +13 -13
- package/doc_src/theming/theming.css +5 -5
- package/package.json +95 -95
- package/scripts/doc.styleguide.config.js +133 -123
- package/scripts/doc.tsconfig.json +5 -5
- package/scripts/docker-compose.yml +1 -1
- package/scripts/test-graphic.tsconfig.json +5 -5
- package/scripts/test-graphic.webpack.config.js +57 -57
- package/scripts/test-headless.webpack.config.js +29 -29
- package/src/chessboard/BoardProperties.ts +131 -0
- package/src/chessboard/Chessboard.css +13 -13
- package/src/chessboard/Chessboard.tsx +389 -518
- package/src/chessboard/ChessboardImpl.tsx +557 -557
- package/src/chessboard/Draggable.tsx +185 -185
- package/src/chessboard/Motion.tsx +67 -67
- package/src/chessboard/colorsets.ts +66 -66
- package/src/chessboard/piecesets.ts +84 -84
- package/src/decs.d.ts +2 -2
- package/src/errorbox/ErrorBox.css +18 -18
- package/src/errorbox/ErrorBox.tsx +75 -75
- package/src/errorbox/parsing.tsx +158 -0
- package/src/exception.ts +17 -17
- package/src/i18n.ts +8 -0
- package/src/icons/AnnotationSymbolShape.css +6 -6
- package/src/icons/AnnotationSymbolShape.tsx +31 -31
- package/src/icons/ArrowMarkerIcon.tsx +34 -34
- package/src/icons/ArrowTip.tsx +14 -14
- package/src/icons/ChessPieceIcon.tsx +45 -45
- package/src/icons/SquareMarkerIcon.tsx +20 -20
- package/src/icons/TextMarkerIcon.tsx +29 -29
- package/src/icons/arrow.css +1 -1
- package/src/index.ts +8 -3
- package/src/movetext/Movetext.css +27 -40
- package/src/movetext/Movetext.tsx +163 -228
- package/src/movetext/MovetextImpl.tsx +351 -438
- package/src/movetext/fonts.css +7 -7
- package/src/movetext/htmlFilter.tsx +129 -129
- package/src/movetext/moveFormatter.tsx +37 -37
- package/src/navigationboard/NavigationBoard.tsx +350 -0
- package/src/navigationboard/NavigationButton.ts +72 -0
- package/src/navigationboard/NavigationField.css +36 -0
- package/src/navigationboard/NavigationField.tsx +185 -0
- package/src/navigationboard/NavigationToolbar.css +54 -0
- package/src/navigationboard/NavigationToolbar.tsx +117 -0
- package/src/navigationboard/iconPaths.ts +98 -0
- package/src/sanitization.ts +17 -17
- package/src/types.ts +116 -116
- package/src/util.ts +11 -11
- package/test/01_types.js +167 -167
- package/test/02_chessboard_util.js +114 -114
- package/test/03_error_box_graphic.js +16 -16
- package/test/04_icons_graphic.js +32 -32
- package/test/05_chessboard_graphic.js +60 -58
- package/test/06_chessboard_animation.js +36 -36
- package/test/07_chessboard_interaction.js +101 -101
- package/test/08_chessboard_play_moves.js +62 -62
- package/test/09_chessboard_small_screens.js +42 -21
- package/test/10_movetext_graphic.js +36 -31
- package/test/11_movetext_interaction.js +100 -96
- package/test/12_navigation_board_base.js +151 -0
- package/test/13_navigation_board_graphic.js +68 -0
- package/test/14_navigation_board_autoplay.js +100 -0
- package/test/common/graphic.js +106 -97
- package/test/graphic_references/05_chessboard_graphic/move/illegal_null-move.png +0 -0
- package/test/graphic_references/05_chessboard_graphic/move/null-move.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_bottom_component.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_top_component.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_bottom_component.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_top_component.png +0 -0
- package/test/graphic_references/10_movetext_graphic/format_move/format_text.png +0 -0
- package/test/graphic_references/10_movetext_graphic/options/wrong_piece_symbol_value.png +0 -0
- package/test/graphic_references/11_movetext_interaction/select_moves/click_on_unselected_without_callback.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/invalid_node_id.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/overriding_initial_node_id.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_3.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_end.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default_with_game_index.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_on_null-move.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_3.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_4.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_4.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_5.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/single_button.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/error/pgn_parsing_error.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/error/wrong_game_type.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/custom_1.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/custom_2.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/large.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_reaching_the_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/already_at_the_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_at_the_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_default.png +0 -0
- package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
- package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
- package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
- package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
- package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
- package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
- package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
- package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
- package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -10
- package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
- package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
- package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
- package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
- package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
- package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
- package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
- package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
- package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
- package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +48 -0
- package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
- package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
- package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +31 -0
- package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
- package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -9
- package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
- package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -10
- package/test/graphic_test_app/12_navigation_board_base/controlled.tsx +43 -0
- package/test/graphic_test_app/12_navigation_board_base/uncontrolled.tsx +56 -0
- package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
- package/test/graphic_test_app/13_navigation_board_graphic/error.tsx +34 -0
- package/test/graphic_test_app/13_navigation_board_graphic/theme.tsx +38 -0
- package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
- package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
- package/test/graphic_test_app/common/decs.d.ts +2 -2
- package/test/graphic_test_app/common/test_app.css +15 -15
- package/test/graphic_test_app/common/test_app.tsx +48 -48
- package/tsconfig.json +13 -13
|
@@ -33,25 +33,25 @@ import { AnnotationSymbolShape } from './AnnotationSymbolShape';
|
|
|
33
33
|
|
|
34
34
|
export interface TextMarkerIconProps {
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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;
|
package/src/icons/arrow.css
CHANGED
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
|
-
|
|
30
|
-
|
|
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 {
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
35
|
+
background-color: white;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
.kokopu-headerGroup-blackPlayer .kokopu-colorTag {
|
|
39
|
-
|
|
39
|
+
background-color: black;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
.kokopu-headerGroup-titleRating:before,
|
|
43
43
|
.kokopu-header-round:before {
|
|
44
|
-
|
|
44
|
+
content: "\a0("; /* \a0 == */
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
.kokopu-headerGroup-titleRating:after,
|
|
48
48
|
.kokopu-header-round:after {
|
|
49
|
-
|
|
49
|
+
content: ")";
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
.kokopu-header-round,
|
|
53
53
|
.kokopu-header-annotator {
|
|
54
|
-
|
|
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
|
-
|
|
60
|
+
content: " ";
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
span.kokopu-variation:before {
|
|
64
|
-
|
|
64
|
+
content: " (";
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
span.kokopu-variation:after {
|
|
68
|
-
|
|
68
|
+
content: ")";
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
* + .kokopu-nag:before {
|
|
72
|
-
|
|
72
|
+
content: "\a0"; /* \a0 == */
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
div.kokopu-subVariation {
|
|
76
|
-
|
|
76
|
+
margin-left: 1.5em;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
.kokopu-move,
|
|
80
80
|
.kokopu-gameResult {
|
|
81
|
-
|
|
81
|
+
font-weight: bold;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
.kokopu-subVariation .kokopu-move {
|
|
85
|
-
|
|
85
|
+
font-weight: inherit;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
.kokopu-diagram {
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
text-align: center;
|
|
90
|
+
line-height: 0px;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
.kokopu-moveContent {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
display: inline-block;
|
|
95
|
+
padding-left: 1px;
|
|
96
|
+
padding-right: 1px;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
.kokopu-selectedMove .kokopu-moveContent {
|
|
100
|
-
|
|
100
|
+
background-color: currentcolor;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
.kokopu-selectedMove .kokopu-moveContent > * {
|
|
104
|
-
|
|
104
|
+
filter: invert(1);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
.kokopu-clickableMove .kokopu-moveContent:hover {
|
|
108
|
-
|
|
109
|
-
|
|
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 {
|
|
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 {
|
|
35
|
-
import {
|
|
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
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
-
}
|