kokopu-react 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/.eslintrc.yml +1 -1
  2. package/CHANGELOG.md +10 -0
  3. package/dist/lib/chessboard/BoardProperties.js.map +1 -1
  4. package/dist/lib/chessboard/Chessboard.css +13 -13
  5. package/dist/lib/chessboard/Chessboard.d.ts +27 -2
  6. package/dist/lib/chessboard/Chessboard.js +36 -17
  7. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  8. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  9. package/dist/lib/chessboard/Draggable.js.map +1 -1
  10. package/dist/lib/chessboard/Motion.js.map +1 -1
  11. package/dist/lib/chessboard/colorsets.js.map +1 -1
  12. package/dist/lib/chessboard/piecesets.js.map +1 -1
  13. package/dist/lib/errorbox/ErrorBox.css +18 -18
  14. package/dist/lib/errorbox/ErrorBox.js.map +1 -1
  15. package/dist/lib/errorbox/parsing.js.map +1 -1
  16. package/dist/lib/exception.js.map +1 -1
  17. package/dist/lib/i18n.d.ts +1 -0
  18. package/dist/lib/i18n.js +1 -0
  19. package/dist/lib/i18n.js.map +1 -1
  20. package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
  21. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
  22. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  23. package/dist/lib/icons/ArrowTip.js.map +1 -1
  24. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  25. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  26. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  27. package/dist/lib/icons/arrow.css +1 -1
  28. package/dist/lib/index.d.ts +1 -0
  29. package/dist/lib/index.js +1 -0
  30. package/dist/lib/index.js.map +1 -1
  31. package/dist/lib/movetext/Movetext.css +27 -27
  32. package/dist/lib/movetext/Movetext.js.map +1 -1
  33. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  34. package/dist/lib/movetext/fonts.css +7 -7
  35. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  36. package/dist/lib/movetext/moveFormatter.js.map +1 -1
  37. package/dist/lib/navigationboard/NavigationBoard.d.ts +68 -1
  38. package/dist/lib/navigationboard/NavigationBoard.js +141 -13
  39. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
  40. package/dist/lib/navigationboard/NavigationButton.d.ts +66 -0
  41. package/dist/lib/navigationboard/NavigationButton.js +67 -0
  42. package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
  43. package/dist/lib/navigationboard/NavigationField.css +7 -7
  44. package/dist/lib/navigationboard/NavigationField.js.map +1 -1
  45. package/dist/lib/navigationboard/NavigationToolbar.css +16 -13
  46. package/dist/lib/navigationboard/NavigationToolbar.d.ts +10 -10
  47. package/dist/lib/navigationboard/NavigationToolbar.js +61 -79
  48. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
  49. package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
  50. package/dist/lib/navigationboard/iconPaths.js +91 -0
  51. package/dist/lib/navigationboard/iconPaths.js.map +1 -0
  52. package/dist/lib/sanitization.js.map +1 -1
  53. package/dist/lib/types.js.map +1 -1
  54. package/dist/lib/util.js.map +1 -1
  55. package/doc_src/demo/PageChessboardBase.tsx +115 -115
  56. package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
  57. package/doc_src/demo/PageChessboardMove.tsx +173 -173
  58. package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
  59. package/doc_src/demo/PageMovetextBase.tsx +180 -180
  60. package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
  61. package/doc_src/demo/PageNavigationBoardBase.tsx +144 -137
  62. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +69 -69
  63. package/doc_src/demo/decs.d.ts +4 -4
  64. package/doc_src/demo/demo.css +12 -12
  65. package/doc_src/demo/util.ts +1 -1
  66. package/doc_src/examples/NavigationBoard.md +1 -1
  67. package/doc_src/theming/LogoRenderer.js +13 -13
  68. package/doc_src/theming/theming.css +5 -5
  69. package/package.json +95 -95
  70. package/scripts/doc.styleguide.config.js +131 -131
  71. package/scripts/doc.tsconfig.json +5 -5
  72. package/scripts/docker-compose.yml +1 -1
  73. package/scripts/test-graphic.tsconfig.json +5 -5
  74. package/scripts/test-graphic.webpack.config.js +57 -57
  75. package/scripts/test-headless.webpack.config.js +29 -29
  76. package/src/chessboard/BoardProperties.ts +68 -68
  77. package/src/chessboard/Chessboard.css +13 -13
  78. package/src/chessboard/Chessboard.tsx +436 -380
  79. package/src/chessboard/ChessboardImpl.tsx +557 -557
  80. package/src/chessboard/Draggable.tsx +185 -185
  81. package/src/chessboard/Motion.tsx +67 -67
  82. package/src/chessboard/colorsets.ts +66 -66
  83. package/src/chessboard/piecesets.ts +84 -84
  84. package/src/decs.d.ts +2 -2
  85. package/src/errorbox/ErrorBox.css +18 -18
  86. package/src/errorbox/ErrorBox.tsx +75 -75
  87. package/src/errorbox/parsing.tsx +95 -95
  88. package/src/exception.ts +17 -17
  89. package/src/i18n.ts +1 -0
  90. package/src/icons/AnnotationSymbolShape.css +6 -6
  91. package/src/icons/AnnotationSymbolShape.tsx +31 -31
  92. package/src/icons/ArrowMarkerIcon.tsx +34 -34
  93. package/src/icons/ArrowTip.tsx +14 -14
  94. package/src/icons/ChessPieceIcon.tsx +45 -45
  95. package/src/icons/SquareMarkerIcon.tsx +20 -20
  96. package/src/icons/TextMarkerIcon.tsx +29 -29
  97. package/src/icons/arrow.css +1 -1
  98. package/src/index.ts +3 -2
  99. package/src/movetext/Movetext.css +27 -27
  100. package/src/movetext/Movetext.tsx +158 -158
  101. package/src/movetext/MovetextImpl.tsx +345 -345
  102. package/src/movetext/fonts.css +7 -7
  103. package/src/movetext/htmlFilter.tsx +129 -129
  104. package/src/movetext/moveFormatter.tsx +37 -37
  105. package/src/navigationboard/NavigationBoard.tsx +386 -180
  106. package/src/navigationboard/NavigationButton.ts +114 -0
  107. package/src/navigationboard/NavigationField.css +7 -7
  108. package/src/navigationboard/NavigationField.tsx +90 -90
  109. package/src/navigationboard/NavigationToolbar.css +16 -13
  110. package/src/navigationboard/NavigationToolbar.tsx +98 -112
  111. package/src/navigationboard/iconPaths.ts +98 -0
  112. package/src/sanitization.ts +17 -17
  113. package/src/types.ts +116 -116
  114. package/src/util.ts +11 -11
  115. package/test/01_types.js +167 -167
  116. package/test/02_chessboard_util.js +191 -115
  117. package/test/03_error_box_graphic.js +16 -16
  118. package/test/04_icons_graphic.js +32 -32
  119. package/test/05_chessboard_graphic.js +60 -60
  120. package/test/06_chessboard_animation.js +36 -36
  121. package/test/07_chessboard_interaction.js +101 -101
  122. package/test/08_chessboard_play_moves.js +62 -62
  123. package/test/09_chessboard_small_screens.js +32 -32
  124. package/test/10_movetext_graphic.js +32 -32
  125. package/test/11_movetext_interaction.js +100 -100
  126. package/test/12_navigation_board_base.js +151 -0
  127. package/test/13_navigation_board_graphic.js +68 -0
  128. package/test/14_navigation_board_autoplay.js +100 -0
  129. package/test/common/graphic.js +106 -97
  130. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  131. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_1.png → 12_navigation_board_base/controlled/forbidden_navigation_0.png} +0 -0
  132. package/test/graphic_references/{12_navigation_board/controlled/invalid_node_id.png → 12_navigation_board_base/controlled/forbidden_navigation_1.png} +0 -0
  133. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_0.png → 12_navigation_board_base/controlled/invalid_node_id.png} +0 -0
  134. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  135. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/no_callback_defined_1.png +0 -0
  136. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/overriding_initial_node_id.png +0 -0
  137. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_1.png → 12_navigation_board_base/controlled/regular_navigation_0.png} +0 -0
  138. package/test/graphic_references/{12_navigation_board/uncontrolled/initial_state_at_specific_id.png → 12_navigation_board_base/controlled/regular_navigation_1.png} +0 -0
  139. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_3.png → 12_navigation_board_base/controlled/regular_navigation_2.png} +0 -0
  140. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_0.png → 12_navigation_board_base/controlled/regular_navigation_3.png} +0 -0
  141. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_2.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png} +0 -0
  142. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png} +0 -0
  143. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_1.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png} +0 -0
  144. package/test/graphic_references/{12_navigation_board/controlled/no_callback_defined_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png} +0 -0
  145. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  146. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  147. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_at_end.png +0 -0
  148. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  149. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default.png +0 -0
  150. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default_with_game_index.png +0 -0
  151. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_on_null-move.png +0 -0
  152. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_0.png +0 -0
  153. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  154. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_2.png +0 -0
  155. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_3.png +0 -0
  156. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_4.png +0 -0
  157. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_0.png +0 -0
  158. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_1.png +0 -0
  159. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_0.png +0 -0
  160. package/test/graphic_references/{12_navigation_board/controlled/default.png → 12_navigation_board_base/uncontrolled/regular_navigation_1.png} +0 -0
  161. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_2.png +0 -0
  162. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  163. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_4.png +0 -0
  164. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_5.png +0 -0
  165. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  166. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  167. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  168. package/test/graphic_references/{12_navigation_board/uncontrolled/regular_navigation_3.png → 13_navigation_board_graphic/additional_buttons/single_button.png} +0 -0
  169. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_1.png +0 -0
  170. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_2.png +0 -0
  171. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png +0 -0
  172. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  173. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  174. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  175. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  176. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  177. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_1.png → 14_navigation_board_autoplay/controlled/after_reaching_the_end.png} +0 -0
  178. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_2.png → 14_navigation_board_autoplay/controlled/already_at_the_end.png} +0 -0
  179. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  180. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  181. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_0.png → 14_navigation_board_autoplay/controlled/initial_state_at_the_end.png} +0 -0
  182. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  183. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  184. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  185. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  186. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  187. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  188. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  189. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  190. package/test/graphic_references/{12_navigation_board/uncontrolled/navigation_with_keys_1.png → 14_navigation_board_autoplay/uncontrolled/initial_state_default.png} +0 -0
  191. package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
  192. package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
  193. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
  194. package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
  195. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
  196. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
  197. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
  198. package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
  199. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -12
  200. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
  201. package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
  202. package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
  203. package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
  204. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
  205. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
  206. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
  207. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
  208. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
  209. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
  210. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
  211. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
  212. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +9 -9
  213. package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
  214. package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
  215. package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +1 -1
  216. package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
  217. package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -10
  218. package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
  219. package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -11
  220. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/controlled.tsx +5 -5
  221. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/uncontrolled.tsx +7 -7
  222. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
  223. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/error.tsx +2 -2
  224. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/theme.tsx +4 -4
  225. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
  226. package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
  227. package/test/graphic_test_app/common/decs.d.ts +2 -2
  228. package/test/graphic_test_app/common/test_app.css +15 -15
  229. package/test/graphic_test_app/common/test_app.tsx +48 -48
  230. package/tsconfig.json +13 -13
  231. package/test/12_navigation_board.js +0 -168
  232. package/test/graphic_references/12_navigation_board/controlled/regular_navigation_2.png +0 -0
  233. package/test/graphic_references/12_navigation_board/theme/small.png +0 -0
  234. package/test/graphic_references/12_navigation_board/uncontrolled/regular_navigation_1.png +0 -0
  235. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/pgn_parsing_error.png +0 -0
  236. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/wrong_game_type.png +0 -0
@@ -27,68 +27,68 @@ import * as React from 'react';
27
27
 
28
28
  interface DraggableProps {
29
29
 
30
- /**
31
- * Initial X coordinate of the handle.
32
- */
33
- x: number;
34
-
35
- /**
36
- * Initial Y coordinate of the handle.
37
- */
38
- y: number;
39
-
40
- /**
41
- * Width of the handle.
42
- */
43
- width: number;
44
-
45
- /**
46
- * Height of the handle.
47
- */
48
- height: number;
49
-
50
- /**
51
- * `true` if the handle corresponds to a draggable arrow, `false` if it corresponds to a draggable piece.
52
- */
53
- isArrowHandle: boolean;
54
-
55
- /**
56
- * Callback invoked when the drag starts. `x0` and `y0` correspond to the coordinates (relative to the hande) at which the drag has been initiated.
57
- */
58
- onDragStart?: (x0: number, y0: number) => void;
59
-
60
- /**
61
- * Callback invoked during the drag. `dx` and `dy` correspond to the coordinates of the drag translation vector.
62
- */
63
- onDrag?: (dx: number, dy: number) => void;
64
-
65
- /**
66
- * Callback invoked when the drag stops. `dx` and `dy` correspond to the coordinates of the drag translation vector.
67
- */
68
- onDragStop?: (dx: number, dy: number) => void;
69
-
70
- /**
71
- * Callback invoked when the drag is canceled.
72
- */
73
- onDragCanceled?: () => void;
30
+ /**
31
+ * Initial X coordinate of the handle.
32
+ */
33
+ x: number;
34
+
35
+ /**
36
+ * Initial Y coordinate of the handle.
37
+ */
38
+ y: number;
39
+
40
+ /**
41
+ * Width of the handle.
42
+ */
43
+ width: number;
44
+
45
+ /**
46
+ * Height of the handle.
47
+ */
48
+ height: number;
49
+
50
+ /**
51
+ * `true` if the handle corresponds to a draggable arrow, `false` if it corresponds to a draggable piece.
52
+ */
53
+ isArrowHandle: boolean;
54
+
55
+ /**
56
+ * Callback invoked when the drag starts. `x0` and `y0` correspond to the coordinates (relative to the hande) at which the drag has been initiated.
57
+ */
58
+ onDragStart?: (x0: number, y0: number) => void;
59
+
60
+ /**
61
+ * Callback invoked during the drag. `dx` and `dy` correspond to the coordinates of the drag translation vector.
62
+ */
63
+ onDrag?: (dx: number, dy: number) => void;
64
+
65
+ /**
66
+ * Callback invoked when the drag stops. `dx` and `dy` correspond to the coordinates of the drag translation vector.
67
+ */
68
+ onDragStop?: (dx: number, dy: number) => void;
69
+
70
+ /**
71
+ * Callback invoked when the drag is canceled.
72
+ */
73
+ onDragCanceled?: () => void;
74
74
  }
75
75
 
76
76
 
77
77
  interface DragData {
78
- originX: number;
79
- originY: number;
78
+ originX: number;
79
+ originY: number;
80
80
  }
81
81
 
82
82
 
83
83
  interface PageCoordinates {
84
- pageX: number;
85
- pageY: number;
84
+ pageX: number;
85
+ pageY: number;
86
86
  }
87
87
 
88
88
 
89
89
  interface ClientCoordinates {
90
- clientX: number;
91
- clientY: number;
90
+ clientX: number;
91
+ clientY: number;
92
92
  }
93
93
 
94
94
 
@@ -97,139 +97,139 @@ interface ClientCoordinates {
97
97
  */
98
98
  export class Draggable extends React.Component<DraggableProps> {
99
99
 
100
- private innerRef: React.RefObject<SVGRectElement> = React.createRef();
101
- private dragData?: DragData;
102
-
103
- private mouseDownListener = (evt: MouseEvent) => this.handleMouseDown(evt);
104
- private mouseMoveListener = (evt: MouseEvent) => this.handleMouseMove(evt);
105
- private mouseUpListener = (evt: MouseEvent) => this.handleMouseUp(evt);
106
- private touchStartListener = (evt: TouchEvent) => this.handleTouchStart(evt);
107
- private touchMoveListener = (evt: TouchEvent) => this.handleTouchMove(evt);
108
- private touchEndListener = (evt: TouchEvent) => this.handleTouchEnd(evt);
109
- private touchCancelListener = (evt: TouchEvent) => this.handleTouchCancel(evt);
110
-
111
- componentDidMount() {
112
- this.innerRef.current!.addEventListener('mousedown', this.mouseDownListener);
113
- window.addEventListener('mousemove', this.mouseMoveListener);
114
- window.addEventListener('mouseup', this.mouseUpListener);
115
- this.innerRef.current!.addEventListener('touchstart', this.touchStartListener, { passive: false });
116
- window.addEventListener('touchmove', this.touchMoveListener, { passive: false });
117
- window.addEventListener('touchend', this.touchEndListener);
118
- window.addEventListener('touchcancel', this.touchCancelListener);
119
- }
120
-
121
- componentWillUnmount() {
122
- this.innerRef.current!.removeEventListener('mousedown', this.mouseDownListener);
123
- window.removeEventListener('mousemove', this.mouseMoveListener);
124
- window.removeEventListener('mouseup', this.mouseUpListener);
125
- this.innerRef.current!.removeEventListener('touchstart', this.touchStartListener);
126
- window.removeEventListener('touchmove', this.touchMoveListener);
127
- window.removeEventListener('touchend', this.touchEndListener);
128
- window.removeEventListener('touchcancel', this.touchCancelListener);
129
- }
130
-
131
- render() {
132
- const classNames = [ 'kokopu-handle', this.props.isArrowHandle ? 'kokopu-arrowDraggable' : 'kokopu-pieceDraggable' ];
133
- return <rect ref={this.innerRef} className={classNames.join(' ')} x={this.props.x} y={this.props.y} width={this.props.width} height={this.props.height} />;
134
- }
135
-
136
- private handleTouchStart(evt: TouchEvent) {
137
- if (this.dragData || evt.touches.length !== 1) {
138
- return;
139
- }
140
- evt.preventDefault();
141
- this.doInitDrag(evt.target as Element, evt.touches[0]);
142
- }
143
-
144
- private handleTouchMove(evt: TouchEvent) {
145
- if (!this.dragData) {
146
- return;
147
- }
148
- evt.preventDefault();
149
- if (evt.touches.length === 1) {
150
- this.doUpdateDrag(evt.touches[0]);
151
- }
152
- else {
153
- this.doCancelDrag();
154
- }
155
- }
156
-
157
- private handleTouchEnd(evt: TouchEvent) {
158
- if (!this.dragData) {
159
- return;
160
- }
161
- evt.preventDefault();
162
- if (evt.touches.length === 0 && evt.changedTouches.length === 1) {
163
- this.doEndDrag(evt.changedTouches[0]);
164
- }
165
- else {
166
- this.doCancelDrag();
167
- }
168
- }
169
-
170
- private handleTouchCancel(evt: TouchEvent) {
171
- if (!this.dragData) {
172
- return;
173
- }
174
- evt.preventDefault();
175
- this.doCancelDrag();
176
- }
177
-
178
- private handleMouseDown(evt: MouseEvent) {
179
- if (this.dragData || evt.button !== 0) {
180
- return;
181
- }
182
- evt.preventDefault();
183
- this.doInitDrag(evt.target as Element, evt);
184
- }
185
-
186
- private handleMouseMove(evt: MouseEvent) {
187
- if (!this.dragData) {
188
- return;
189
- }
190
- evt.preventDefault();
191
- this.doUpdateDrag(evt);
192
- }
193
-
194
- private handleMouseUp(evt: MouseEvent) {
195
- if (!this.dragData) {
196
- return;
197
- }
198
- evt.preventDefault();
199
- this.doEndDrag(evt);
200
- }
201
-
202
- private doInitDrag(target: Element, { pageX, pageY, clientX, clientY }: PageCoordinates & ClientCoordinates) {
203
- this.dragData = {
204
- originX: pageX,
205
- originY: pageY,
206
- };
207
- const handleBoundary = target.getBoundingClientRect();
208
- const x0 = clientX - handleBoundary.left;
209
- const y0 = clientY - handleBoundary.top;
210
- if (this.props.onDragStart) {
211
- this.props.onDragStart(x0, y0);
212
- }
213
- }
214
-
215
- private doUpdateDrag({ pageX, pageY }: PageCoordinates) {
216
- const { originX, originY } = this.dragData!;
217
- if (this.props.onDrag) {
218
- this.props.onDrag(pageX - originX, pageY - originY);
219
- }
220
- }
221
-
222
- private doEndDrag({ pageX, pageY }: PageCoordinates) {
223
- const { originX, originY } = this.dragData!;
224
- this.dragData = undefined;
225
- if (this.props.onDragStop) {
226
- this.props.onDragStop(pageX - originX, pageY - originY);
227
- }
228
- }
229
-
230
- private doCancelDrag() {
231
- if (this.props.onDragCanceled) {
232
- this.props.onDragCanceled();
233
- }
234
- }
100
+ private innerRef: React.RefObject<SVGRectElement> = React.createRef();
101
+ private dragData?: DragData;
102
+
103
+ private mouseDownListener = (evt: MouseEvent) => this.handleMouseDown(evt);
104
+ private mouseMoveListener = (evt: MouseEvent) => this.handleMouseMove(evt);
105
+ private mouseUpListener = (evt: MouseEvent) => this.handleMouseUp(evt);
106
+ private touchStartListener = (evt: TouchEvent) => this.handleTouchStart(evt);
107
+ private touchMoveListener = (evt: TouchEvent) => this.handleTouchMove(evt);
108
+ private touchEndListener = (evt: TouchEvent) => this.handleTouchEnd(evt);
109
+ private touchCancelListener = (evt: TouchEvent) => this.handleTouchCancel(evt);
110
+
111
+ componentDidMount() {
112
+ this.innerRef.current!.addEventListener('mousedown', this.mouseDownListener);
113
+ window.addEventListener('mousemove', this.mouseMoveListener);
114
+ window.addEventListener('mouseup', this.mouseUpListener);
115
+ this.innerRef.current!.addEventListener('touchstart', this.touchStartListener, { passive: false });
116
+ window.addEventListener('touchmove', this.touchMoveListener, { passive: false });
117
+ window.addEventListener('touchend', this.touchEndListener);
118
+ window.addEventListener('touchcancel', this.touchCancelListener);
119
+ }
120
+
121
+ componentWillUnmount() {
122
+ this.innerRef.current!.removeEventListener('mousedown', this.mouseDownListener);
123
+ window.removeEventListener('mousemove', this.mouseMoveListener);
124
+ window.removeEventListener('mouseup', this.mouseUpListener);
125
+ this.innerRef.current!.removeEventListener('touchstart', this.touchStartListener);
126
+ window.removeEventListener('touchmove', this.touchMoveListener);
127
+ window.removeEventListener('touchend', this.touchEndListener);
128
+ window.removeEventListener('touchcancel', this.touchCancelListener);
129
+ }
130
+
131
+ render() {
132
+ const classNames = [ 'kokopu-handle', this.props.isArrowHandle ? 'kokopu-arrowDraggable' : 'kokopu-pieceDraggable' ];
133
+ return <rect ref={this.innerRef} className={classNames.join(' ')} x={this.props.x} y={this.props.y} width={this.props.width} height={this.props.height} />;
134
+ }
135
+
136
+ private handleTouchStart(evt: TouchEvent) {
137
+ if (this.dragData || evt.touches.length !== 1) {
138
+ return;
139
+ }
140
+ evt.preventDefault();
141
+ this.doInitDrag(evt.target as Element, evt.touches[0]);
142
+ }
143
+
144
+ private handleTouchMove(evt: TouchEvent) {
145
+ if (!this.dragData) {
146
+ return;
147
+ }
148
+ evt.preventDefault();
149
+ if (evt.touches.length === 1) {
150
+ this.doUpdateDrag(evt.touches[0]);
151
+ }
152
+ else {
153
+ this.doCancelDrag();
154
+ }
155
+ }
156
+
157
+ private handleTouchEnd(evt: TouchEvent) {
158
+ if (!this.dragData) {
159
+ return;
160
+ }
161
+ evt.preventDefault();
162
+ if (evt.touches.length === 0 && evt.changedTouches.length === 1) {
163
+ this.doEndDrag(evt.changedTouches[0]);
164
+ }
165
+ else {
166
+ this.doCancelDrag();
167
+ }
168
+ }
169
+
170
+ private handleTouchCancel(evt: TouchEvent) {
171
+ if (!this.dragData) {
172
+ return;
173
+ }
174
+ evt.preventDefault();
175
+ this.doCancelDrag();
176
+ }
177
+
178
+ private handleMouseDown(evt: MouseEvent) {
179
+ if (this.dragData || evt.button !== 0) {
180
+ return;
181
+ }
182
+ evt.preventDefault();
183
+ this.doInitDrag(evt.target as Element, evt);
184
+ }
185
+
186
+ private handleMouseMove(evt: MouseEvent) {
187
+ if (!this.dragData) {
188
+ return;
189
+ }
190
+ evt.preventDefault();
191
+ this.doUpdateDrag(evt);
192
+ }
193
+
194
+ private handleMouseUp(evt: MouseEvent) {
195
+ if (!this.dragData) {
196
+ return;
197
+ }
198
+ evt.preventDefault();
199
+ this.doEndDrag(evt);
200
+ }
201
+
202
+ private doInitDrag(target: Element, { pageX, pageY, clientX, clientY }: PageCoordinates & ClientCoordinates) {
203
+ this.dragData = {
204
+ originX: pageX,
205
+ originY: pageY,
206
+ };
207
+ const handleBoundary = target.getBoundingClientRect();
208
+ const x0 = clientX - handleBoundary.left;
209
+ const y0 = clientY - handleBoundary.top;
210
+ if (this.props.onDragStart) {
211
+ this.props.onDragStart(x0, y0);
212
+ }
213
+ }
214
+
215
+ private doUpdateDrag({ pageX, pageY }: PageCoordinates) {
216
+ const { originX, originY } = this.dragData!;
217
+ if (this.props.onDrag) {
218
+ this.props.onDrag(pageX - originX, pageY - originY);
219
+ }
220
+ }
221
+
222
+ private doEndDrag({ pageX, pageY }: PageCoordinates) {
223
+ const { originX, originY } = this.dragData!;
224
+ this.dragData = undefined;
225
+ if (this.props.onDragStop) {
226
+ this.props.onDragStop(pageX - originX, pageY - originY);
227
+ }
228
+ }
229
+
230
+ private doCancelDrag() {
231
+ if (this.props.onDragCanceled) {
232
+ this.props.onDragCanceled();
233
+ }
234
+ }
235
235
  }
@@ -29,20 +29,20 @@ const DEBUG_KEY = '__kokopu_debug_freeze_motion';
29
29
 
30
30
  interface MotionProps {
31
31
 
32
- /**
33
- * Duration of the animation. Must be > 0.
34
- */
35
- duration: number;
36
-
37
- /**
38
- * Factory for the content being animated. The animation cursor is guaranteed to be valued between 0 and 1 inclusive.
39
- */
40
- children: (cursor: number) => React.ReactNode;
32
+ /**
33
+ * Duration of the animation. Must be > 0.
34
+ */
35
+ duration: number;
36
+
37
+ /**
38
+ * Factory for the content being animated. The animation cursor is guaranteed to be valued between 0 and 1 inclusive.
39
+ */
40
+ children: (cursor: number) => React.ReactNode;
41
41
  }
42
42
 
43
43
 
44
44
  interface MotionState {
45
- cursor: number;
45
+ cursor: number;
46
46
  }
47
47
 
48
48
 
@@ -51,61 +51,61 @@ interface MotionState {
51
51
  */
52
52
  export class Motion extends React.Component<MotionProps, MotionState> {
53
53
 
54
- private animationFrameId?: number;
55
- private initialTimestamp?: number;
56
- private cursorStop: number;
57
-
58
- constructor(props: MotionProps) {
59
- super(props);
60
- this.state = {
61
- cursor: 0,
62
- };
63
- this.cursorStop = 1;
64
-
65
- // WARNING: this hack exists only for testing purposes. DO NOT USE IT IN PRODUCTION.
66
- const debugCursorStop = window[ /* eslint-disable @typescript-eslint/no-explicit-any */ DEBUG_KEY as any /* eslint-enable @typescript-eslint/no-explicit-any */ ];
67
- if (typeof debugCursorStop === 'number' && debugCursorStop >= 0 && debugCursorStop <= 1) {
68
- this.cursorStop = debugCursorStop;
69
- }
70
- }
71
-
72
- componentDidMount() {
73
- this.animationFrameId = window.requestAnimationFrame(ts => this.handleAnimationStep(ts));
74
- }
75
-
76
- componentWillUnmount() {
77
- if (this.animationFrameId !== undefined) {
78
- window.cancelAnimationFrame(this.animationFrameId);
79
- this.animationFrameId = undefined;
80
- }
81
- }
82
-
83
- private handleAnimationStep(timestamp: number) {
84
- if (this.initialTimestamp === undefined) {
85
- this.initialTimestamp = timestamp;
86
- }
87
-
88
- // Compute the animation cursor and update the state.
89
- let cursor = (timestamp - this.initialTimestamp) / this.props.duration;
90
- // istanbul ignore if
91
- if (cursor < 0) { // This case is not supposed to happen if timestamps are generated with a monotonic clock.
92
- cursor = 0;
93
- }
94
- else if (cursor > this.cursorStop) {
95
- cursor = this.cursorStop;
96
- }
97
- this.setState({ cursor: cursor });
98
-
99
- // Schedule the next animation frame if necessary.
100
- if (cursor === this.cursorStop) {
101
- this.animationFrameId = undefined;
102
- }
103
- else {
104
- this.animationFrameId = window.requestAnimationFrame(ts => this.handleAnimationStep(ts));
105
- }
106
- }
107
-
108
- render() {
109
- return this.props.children(this.state.cursor);
110
- }
54
+ private animationFrameId?: number;
55
+ private initialTimestamp?: number;
56
+ private cursorStop: number;
57
+
58
+ constructor(props: MotionProps) {
59
+ super(props);
60
+ this.state = {
61
+ cursor: 0,
62
+ };
63
+ this.cursorStop = 1;
64
+
65
+ // WARNING: this hack exists only for testing purposes. DO NOT USE IT IN PRODUCTION.
66
+ const debugCursorStop = window[ /* eslint-disable @typescript-eslint/no-explicit-any */ DEBUG_KEY as any /* eslint-enable @typescript-eslint/no-explicit-any */ ];
67
+ if (typeof debugCursorStop === 'number' && debugCursorStop >= 0 && debugCursorStop <= 1) {
68
+ this.cursorStop = debugCursorStop;
69
+ }
70
+ }
71
+
72
+ componentDidMount() {
73
+ this.animationFrameId = window.requestAnimationFrame(ts => this.handleAnimationStep(ts));
74
+ }
75
+
76
+ componentWillUnmount() {
77
+ if (this.animationFrameId !== undefined) {
78
+ window.cancelAnimationFrame(this.animationFrameId);
79
+ this.animationFrameId = undefined;
80
+ }
81
+ }
82
+
83
+ private handleAnimationStep(timestamp: number) {
84
+ if (this.initialTimestamp === undefined) {
85
+ this.initialTimestamp = timestamp;
86
+ }
87
+
88
+ // Compute the animation cursor and update the state.
89
+ let cursor = (timestamp - this.initialTimestamp) / this.props.duration;
90
+ // istanbul ignore if
91
+ if (cursor < 0) { // This case is not supposed to happen if timestamps are generated with a monotonic clock.
92
+ cursor = 0;
93
+ }
94
+ else if (cursor > this.cursorStop) {
95
+ cursor = this.cursorStop;
96
+ }
97
+ this.setState({ cursor: cursor });
98
+
99
+ // Schedule the next animation frame if necessary.
100
+ if (cursor === this.cursorStop) {
101
+ this.animationFrameId = undefined;
102
+ }
103
+ else {
104
+ this.animationFrameId = window.requestAnimationFrame(ts => this.handleAnimationStep(ts));
105
+ }
106
+ }
107
+
108
+ render() {
109
+ return this.props.children(this.state.cursor);
110
+ }
111
111
  }