kokopu-react 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/.eslintrc.yml +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/dist/lib/chessboard/BoardProperties.js.map +1 -1
  4. package/dist/lib/chessboard/Chessboard.css +13 -13
  5. package/dist/lib/chessboard/Chessboard.js.map +1 -1
  6. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
  7. package/dist/lib/chessboard/Draggable.js.map +1 -1
  8. package/dist/lib/chessboard/Motion.js.map +1 -1
  9. package/dist/lib/chessboard/colorsets.js.map +1 -1
  10. package/dist/lib/chessboard/piecesets.js.map +1 -1
  11. package/dist/lib/errorbox/ErrorBox.css +18 -18
  12. package/dist/lib/errorbox/ErrorBox.js.map +1 -1
  13. package/dist/lib/errorbox/parsing.js.map +1 -1
  14. package/dist/lib/exception.js.map +1 -1
  15. package/dist/lib/i18n.d.ts +1 -0
  16. package/dist/lib/i18n.js +1 -0
  17. package/dist/lib/i18n.js.map +1 -1
  18. package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
  19. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
  20. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
  21. package/dist/lib/icons/ArrowTip.js.map +1 -1
  22. package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
  23. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
  24. package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
  25. package/dist/lib/icons/arrow.css +1 -1
  26. package/dist/lib/index.d.ts +1 -0
  27. package/dist/lib/index.js +1 -0
  28. package/dist/lib/index.js.map +1 -1
  29. package/dist/lib/movetext/Movetext.css +27 -27
  30. package/dist/lib/movetext/Movetext.js.map +1 -1
  31. package/dist/lib/movetext/MovetextImpl.js.map +1 -1
  32. package/dist/lib/movetext/fonts.css +7 -7
  33. package/dist/lib/movetext/htmlFilter.js.map +1 -1
  34. package/dist/lib/movetext/moveFormatter.js.map +1 -1
  35. package/dist/lib/navigationboard/NavigationBoard.d.ts +39 -1
  36. package/dist/lib/navigationboard/NavigationBoard.js +94 -11
  37. package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
  38. package/dist/lib/navigationboard/NavigationButton.d.ts +54 -0
  39. package/dist/lib/navigationboard/NavigationButton.js +35 -0
  40. package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
  41. package/dist/lib/navigationboard/NavigationField.css +7 -7
  42. package/dist/lib/navigationboard/NavigationField.js.map +1 -1
  43. package/dist/lib/navigationboard/NavigationToolbar.css +16 -13
  44. package/dist/lib/navigationboard/NavigationToolbar.d.ts +3 -10
  45. package/dist/lib/navigationboard/NavigationToolbar.js +31 -82
  46. package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
  47. package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
  48. package/dist/lib/navigationboard/iconPaths.js +91 -0
  49. package/dist/lib/navigationboard/iconPaths.js.map +1 -0
  50. package/dist/lib/sanitization.js.map +1 -1
  51. package/dist/lib/types.js.map +1 -1
  52. package/dist/lib/util.js.map +1 -1
  53. package/doc_src/demo/PageChessboardBase.tsx +115 -115
  54. package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
  55. package/doc_src/demo/PageChessboardMove.tsx +173 -173
  56. package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
  57. package/doc_src/demo/PageMovetextBase.tsx +180 -180
  58. package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
  59. package/doc_src/demo/PageNavigationBoardBase.tsx +144 -137
  60. package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +69 -69
  61. package/doc_src/demo/decs.d.ts +4 -4
  62. package/doc_src/demo/demo.css +12 -12
  63. package/doc_src/demo/util.ts +1 -1
  64. package/doc_src/examples/NavigationBoard.md +1 -1
  65. package/doc_src/theming/LogoRenderer.js +13 -13
  66. package/doc_src/theming/theming.css +5 -5
  67. package/package.json +95 -95
  68. package/scripts/doc.styleguide.config.js +131 -131
  69. package/scripts/doc.tsconfig.json +5 -5
  70. package/scripts/docker-compose.yml +1 -1
  71. package/scripts/test-graphic.tsconfig.json +5 -5
  72. package/scripts/test-graphic.webpack.config.js +57 -57
  73. package/scripts/test-headless.webpack.config.js +29 -29
  74. package/src/chessboard/BoardProperties.ts +68 -68
  75. package/src/chessboard/Chessboard.css +13 -13
  76. package/src/chessboard/Chessboard.tsx +380 -380
  77. package/src/chessboard/ChessboardImpl.tsx +557 -557
  78. package/src/chessboard/Draggable.tsx +185 -185
  79. package/src/chessboard/Motion.tsx +67 -67
  80. package/src/chessboard/colorsets.ts +66 -66
  81. package/src/chessboard/piecesets.ts +84 -84
  82. package/src/decs.d.ts +2 -2
  83. package/src/errorbox/ErrorBox.css +18 -18
  84. package/src/errorbox/ErrorBox.tsx +75 -75
  85. package/src/errorbox/parsing.tsx +95 -95
  86. package/src/exception.ts +17 -17
  87. package/src/i18n.ts +1 -0
  88. package/src/icons/AnnotationSymbolShape.css +6 -6
  89. package/src/icons/AnnotationSymbolShape.tsx +31 -31
  90. package/src/icons/ArrowMarkerIcon.tsx +34 -34
  91. package/src/icons/ArrowTip.tsx +14 -14
  92. package/src/icons/ChessPieceIcon.tsx +45 -45
  93. package/src/icons/SquareMarkerIcon.tsx +20 -20
  94. package/src/icons/TextMarkerIcon.tsx +29 -29
  95. package/src/icons/arrow.css +1 -1
  96. package/src/index.ts +3 -2
  97. package/src/movetext/Movetext.css +27 -27
  98. package/src/movetext/Movetext.tsx +158 -158
  99. package/src/movetext/MovetextImpl.tsx +345 -345
  100. package/src/movetext/fonts.css +7 -7
  101. package/src/movetext/htmlFilter.tsx +129 -129
  102. package/src/movetext/moveFormatter.tsx +37 -37
  103. package/src/navigationboard/NavigationBoard.tsx +297 -178
  104. package/src/navigationboard/NavigationButton.ts +72 -0
  105. package/src/navigationboard/NavigationField.css +7 -7
  106. package/src/navigationboard/NavigationField.tsx +90 -90
  107. package/src/navigationboard/NavigationToolbar.css +16 -13
  108. package/src/navigationboard/NavigationToolbar.tsx +60 -117
  109. package/src/navigationboard/iconPaths.ts +98 -0
  110. package/src/sanitization.ts +17 -17
  111. package/src/types.ts +116 -116
  112. package/src/util.ts +11 -11
  113. package/test/01_types.js +167 -167
  114. package/test/02_chessboard_util.js +114 -114
  115. package/test/03_error_box_graphic.js +16 -16
  116. package/test/04_icons_graphic.js +32 -32
  117. package/test/05_chessboard_graphic.js +60 -60
  118. package/test/06_chessboard_animation.js +36 -36
  119. package/test/07_chessboard_interaction.js +101 -101
  120. package/test/08_chessboard_play_moves.js +62 -62
  121. package/test/09_chessboard_small_screens.js +32 -32
  122. package/test/10_movetext_graphic.js +32 -32
  123. package/test/11_movetext_interaction.js +100 -100
  124. package/test/12_navigation_board_base.js +151 -0
  125. package/test/13_navigation_board_graphic.js +68 -0
  126. package/test/14_navigation_board_autoplay.js +100 -0
  127. package/test/common/graphic.js +106 -97
  128. package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
  129. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_1.png → 12_navigation_board_base/controlled/forbidden_navigation_0.png} +0 -0
  130. package/test/graphic_references/{12_navigation_board/controlled/invalid_node_id.png → 12_navigation_board_base/controlled/forbidden_navigation_1.png} +0 -0
  131. package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_0.png → 12_navigation_board_base/controlled/invalid_node_id.png} +0 -0
  132. package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
  133. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/no_callback_defined_1.png +0 -0
  134. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/overriding_initial_node_id.png +0 -0
  135. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_1.png → 12_navigation_board_base/controlled/regular_navigation_0.png} +0 -0
  136. package/test/graphic_references/{12_navigation_board/uncontrolled/initial_state_at_specific_id.png → 12_navigation_board_base/controlled/regular_navigation_1.png} +0 -0
  137. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_3.png → 12_navigation_board_base/controlled/regular_navigation_2.png} +0 -0
  138. package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_0.png → 12_navigation_board_base/controlled/regular_navigation_3.png} +0 -0
  139. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_2.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png} +0 -0
  140. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png} +0 -0
  141. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_1.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png} +0 -0
  142. package/test/graphic_references/{12_navigation_board/controlled/no_callback_defined_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png} +0 -0
  143. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
  144. package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
  145. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_at_end.png +0 -0
  146. package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
  147. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default.png +0 -0
  148. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default_with_game_index.png +0 -0
  149. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_on_null-move.png +0 -0
  150. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_0.png +0 -0
  151. package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
  152. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_2.png +0 -0
  153. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_3.png +0 -0
  154. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_4.png +0 -0
  155. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_0.png +0 -0
  156. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_1.png +0 -0
  157. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_0.png +0 -0
  158. package/test/graphic_references/{12_navigation_board/controlled/default.png → 12_navigation_board_base/uncontrolled/regular_navigation_1.png} +0 -0
  159. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_2.png +0 -0
  160. package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
  161. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_4.png +0 -0
  162. package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_5.png +0 -0
  163. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
  164. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
  165. package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
  166. package/test/graphic_references/{12_navigation_board/uncontrolled/regular_navigation_3.png → 13_navigation_board_graphic/additional_buttons/single_button.png} +0 -0
  167. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_1.png +0 -0
  168. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_2.png +0 -0
  169. package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png +0 -0
  170. package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
  171. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
  172. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
  173. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
  174. package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
  175. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_1.png → 14_navigation_board_autoplay/controlled/after_reaching_the_end.png} +0 -0
  176. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_2.png → 14_navigation_board_autoplay/controlled/already_at_the_end.png} +0 -0
  177. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
  178. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
  179. package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_0.png → 14_navigation_board_autoplay/controlled/initial_state_at_the_end.png} +0 -0
  180. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
  181. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
  182. package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
  183. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
  184. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
  185. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
  186. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
  187. package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
  188. package/test/graphic_references/{12_navigation_board/uncontrolled/navigation_with_keys_1.png → 14_navigation_board_autoplay/uncontrolled/initial_state_default.png} +0 -0
  189. package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
  190. package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
  191. package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
  192. package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
  193. package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
  194. package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
  195. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
  196. package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
  197. package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -12
  198. package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
  199. package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
  200. package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
  201. package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
  202. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
  203. package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
  204. package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
  205. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
  206. package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
  207. package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
  208. package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
  209. package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
  210. package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +9 -9
  211. package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
  212. package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
  213. package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +1 -1
  214. package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
  215. package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -10
  216. package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
  217. package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -11
  218. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/controlled.tsx +5 -5
  219. package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/uncontrolled.tsx +7 -7
  220. package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
  221. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/error.tsx +2 -2
  222. package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/theme.tsx +4 -4
  223. package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
  224. package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
  225. package/test/graphic_test_app/common/decs.d.ts +2 -2
  226. package/test/graphic_test_app/common/test_app.css +15 -15
  227. package/test/graphic_test_app/common/test_app.tsx +48 -48
  228. package/tsconfig.json +13 -13
  229. package/test/12_navigation_board.js +0 -168
  230. package/test/graphic_references/12_navigation_board/controlled/regular_navigation_2.png +0 -0
  231. package/test/graphic_references/12_navigation_board/theme/small.png +0 -0
  232. package/test/graphic_references/12_navigation_board/uncontrolled/regular_navigation_1.png +0 -0
  233. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/pgn_parsing_error.png +0 -0
  234. /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/wrong_game_type.png +0 -0
@@ -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
  }