kokopu-react 3.0.2 → 3.2.0

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