@lichess-org/chessground 9.2.3

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 (87) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +110 -0
  3. package/assets/chessground.base.css +224 -0
  4. package/assets/chessground.brown.css +62 -0
  5. package/assets/chessground.cburnett.css +37 -0
  6. package/dist/anim.d.ts +17 -0
  7. package/dist/anim.js +99 -0
  8. package/dist/anim.js.map +1 -0
  9. package/dist/api.d.ts +28 -0
  10. package/dist/api.js +98 -0
  11. package/dist/api.js.map +1 -0
  12. package/dist/autoPieces.d.ts +3 -0
  13. package/dist/autoPieces.js +38 -0
  14. package/dist/autoPieces.js.map +1 -0
  15. package/dist/board.d.ts +25 -0
  16. package/dist/board.js +331 -0
  17. package/dist/board.js.map +1 -0
  18. package/dist/chessground.d.ts +7 -0
  19. package/dist/chessground.js +63 -0
  20. package/dist/chessground.js.map +1 -0
  21. package/dist/chessground.min.js +1 -0
  22. package/dist/config.d.ts +87 -0
  23. package/dist/config.js +64 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/drag.d.ts +20 -0
  26. package/dist/drag.js +208 -0
  27. package/dist/drag.js.map +1 -0
  28. package/dist/draw.d.ts +65 -0
  29. package/dist/draw.js +90 -0
  30. package/dist/draw.js.map +1 -0
  31. package/dist/drop.d.ts +5 -0
  32. package/dist/drop.js +31 -0
  33. package/dist/drop.js.map +1 -0
  34. package/dist/events.d.ts +4 -0
  35. package/dist/events.js +72 -0
  36. package/dist/events.js.map +1 -0
  37. package/dist/explosion.d.ts +3 -0
  38. package/dist/explosion.js +18 -0
  39. package/dist/explosion.js.map +1 -0
  40. package/dist/fen.d.ts +4 -0
  41. package/dist/fen.js +79 -0
  42. package/dist/fen.js.map +1 -0
  43. package/dist/premove.d.ts +6 -0
  44. package/dist/premove.js +57 -0
  45. package/dist/premove.js.map +1 -0
  46. package/dist/render.d.ts +4 -0
  47. package/dist/render.js +235 -0
  48. package/dist/render.js.map +1 -0
  49. package/dist/state.d.ts +100 -0
  50. package/dist/state.js +92 -0
  51. package/dist/state.js.map +1 -0
  52. package/dist/svg.d.ts +8 -0
  53. package/dist/svg.js +348 -0
  54. package/dist/svg.js.map +1 -0
  55. package/dist/sync.d.ts +8 -0
  56. package/dist/sync.js +27 -0
  57. package/dist/sync.js.map +1 -0
  58. package/dist/types.d.ts +94 -0
  59. package/dist/types.js +5 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/util.d.ts +20 -0
  62. package/dist/util.js +89 -0
  63. package/dist/util.js.map +1 -0
  64. package/dist/wrap.d.ts +3 -0
  65. package/dist/wrap.js +90 -0
  66. package/dist/wrap.js.map +1 -0
  67. package/package.json +58 -0
  68. package/src/anim.ts +139 -0
  69. package/src/api.ts +187 -0
  70. package/src/autoPieces.ts +47 -0
  71. package/src/board.ts +371 -0
  72. package/src/chessground.ts +67 -0
  73. package/src/config.ts +165 -0
  74. package/src/drag.ts +223 -0
  75. package/src/draw.ts +154 -0
  76. package/src/drop.ts +36 -0
  77. package/src/events.ts +86 -0
  78. package/src/explosion.ts +19 -0
  79. package/src/fen.ts +78 -0
  80. package/src/premove.ts +76 -0
  81. package/src/render.ts +262 -0
  82. package/src/state.ts +199 -0
  83. package/src/svg.ts +441 -0
  84. package/src/sync.ts +36 -0
  85. package/src/types.ts +110 -0
  86. package/src/util.ts +105 -0
  87. package/src/wrap.ts +111 -0
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # Chessground
2
+
3
+ [![Continuous Integration](https://github.com/lichess-org/chessground/workflows/Continuous%20Integration/badge.svg)](https://github.com/lichess-org/chessground/actions?query=workflow%3A%22Continuous+Integration%22)
4
+ [![npm](https://img.shields.io/npm/v/@lichess-org/chessground)](https://www.npmjs.com/package/@lichess-org/chessground)
5
+
6
+ ![Chessground in 2D and 3D](/screenshot/twin.jpg)
7
+
8
+ _Chessground_ is a free/libre open source chess UI developed for
9
+ [lichess.org](https://lichess.org).
10
+ It targets modern browsers, as well as mobile development using Cordova.
11
+
12
+ ## License
13
+
14
+ Chessground is distributed under the **GPL-3.0 license** (or any later version,
15
+ at your option).
16
+ When you use Chessground for your website, your combined work may be
17
+ distributed only under the GPL. **You must release your source code** to the
18
+ users of your website.
19
+
20
+ Please read more about GPL for JavaScript on [greendrake.info](https://greendrake.info/publications/js-gpl).
21
+
22
+ ## Demos
23
+
24
+ - [Embedded PGN viewer](https://github.com/lichess-org/pgn-viewer)
25
+ - [Chess TV](https://lichess.org/tv)
26
+ - [Board editor](https://lichess.org/editor)
27
+ - [Puzzles](https://lichess.org/training)
28
+ - [Analysis board](https://lichess.org/ofWXRFGy)
29
+ - [Game preview](https://lichess.org/games)
30
+
31
+ ## Features
32
+
33
+ Chessground is designed to fulfill all lichess.org web and mobile apps needs, so it is pretty featureful.
34
+
35
+ - Well typed with TypeScript
36
+ - Fast. Uses a custom DOM diff algorithm to reduce DOM writes to the absolute minimum.
37
+ - Small footprint: 10K gzipped (31K unzipped). No dependencies.
38
+ - SVG drawing of circles, arrows, and custom user shapes on the board
39
+ - Arrows snap to valid moves. Freehand arrows can be drawn by dragging the mouse off the board and back while drawing an arrow.
40
+ - Entirely configurable and reconfigurable at any time
41
+ - Styling with CSS only: board and pieces can be changed by simply switching a class
42
+ - Fluid layout: board can be resized at any time
43
+ - Support for 3D pieces and boards
44
+ - Full mobile support (touchstart, touchmove, touchend)
45
+ - Move pieces by click
46
+ - Move pieces by drag & drop
47
+ - Minimum distance before drag
48
+ - Centralisation of the piece under the cursor
49
+ - Piece ghost element
50
+ - Drop off revert or trash
51
+ - Premove by click or drag
52
+ - Drag new pieces onto the board (editor, Crazyhouse)
53
+ - Animation of pieces: moving and fading away
54
+ - Display last move, check, move destinations, and premove destinations (hover effects possible)
55
+ - Import and export positions in FEN notation
56
+ - User callbacks
57
+ - No chess logic inside: can be used for [chess variants](https://lichess.org/variant)
58
+
59
+ ## Installation
60
+
61
+ ```sh
62
+ npm install --save @lichess-org/chessground
63
+ ```
64
+
65
+ ### Usage
66
+
67
+ ```js
68
+ import { Chessground } from '@lichess-org/chessground';
69
+
70
+ const config = {};
71
+ const ground = Chessground(document.body, config);
72
+ ```
73
+
74
+ ### Wrappers
75
+
76
+ - React: [react-chess/chessground](https://github.com/react-chess/chessground), [ruilisi/react-chessground](https://github.com/ruilisi/react-chessground)
77
+ - Vue.js: [vitogit/vue-chessboard](https://github.com/vitogit/vue-chessboard), [qwerty084/vue3-chessboard](https://github.com/qwerty084/vue3-chessboard)
78
+ - Angular: [topce/ngx-chessground](https://github.com/topce/ngx-chessground)
79
+ - Svelte: [agelas/svelte-chessground-ui](https://github.com/agelas/svelte-chessground-ui), [gtim/svelte-chessground](https://github.com/gtim/svelte-chessground), [gtm-nayan/svelte-use-chessground](https://github.com/gtm-nayan/svelte-use-chessground)
80
+
81
+ More? Please make a pull request to include it here.
82
+
83
+ ## Documentation
84
+
85
+ - [Config types](https://github.com/lichess-org/chessground/tree/master/src/config.ts)
86
+ - [Default config values](https://github.com/lichess-org/chessground/tree/master/src/state.ts)
87
+ - [API type signatures](https://github.com/lichess-org/chessground/tree/master/src/api.ts)
88
+ - [Simple standalone example](https://github.com/lichess-org/chessground/blob/master/demo.html)
89
+ - [Examples repo](https://github.com/lichess-org/chessground-examples/tree/master/src/units)
90
+ - [Base CSS](https://github.com/lichess-org/chessground-examples/blob/master/assets/chessground.css)
91
+
92
+ ## Development
93
+
94
+ Install build dependencies:
95
+
96
+ ```sh
97
+ pnpm install
98
+ ```
99
+
100
+ To build the node module:
101
+
102
+ ```sh
103
+ pnpm run compile --watch
104
+ ```
105
+
106
+ To build the standalone:
107
+
108
+ ```sh
109
+ pnpm run dist
110
+ ```
@@ -0,0 +1,224 @@
1
+ .cg-wrap {
2
+ box-sizing: content-box;
3
+ position: relative;
4
+ display: block;
5
+ }
6
+
7
+ cg-container {
8
+ position: absolute;
9
+ width: 100%;
10
+ height: 100%;
11
+ display: block;
12
+ top: 0;
13
+ }
14
+
15
+ cg-board {
16
+ position: absolute;
17
+ top: 0;
18
+ left: 0;
19
+ width: 100%;
20
+ height: 100%;
21
+ -webkit-user-select: none;
22
+ -moz-user-select: none;
23
+ -ms-user-select: none;
24
+ user-select: none;
25
+ line-height: 0;
26
+ background-size: cover;
27
+ }
28
+
29
+ .cg-wrap.manipulable cg-board {
30
+ cursor: pointer;
31
+ }
32
+
33
+ cg-board square {
34
+ position: absolute;
35
+ top: 0;
36
+ left: 0;
37
+ width: 12.5%;
38
+ height: 12.5%;
39
+ pointer-events: none;
40
+ }
41
+
42
+ cg-board square.move-dest {
43
+ pointer-events: auto;
44
+ }
45
+
46
+ cg-board square.last-move {
47
+ will-change: transform;
48
+ }
49
+
50
+ .cg-wrap piece {
51
+ position: absolute;
52
+ top: 0;
53
+ left: 0;
54
+ width: 12.5%;
55
+ height: 12.5%;
56
+ background-size: cover;
57
+ z-index: 2;
58
+ will-change: transform;
59
+ pointer-events: none;
60
+ }
61
+
62
+ cg-board piece.dragging {
63
+ cursor: move;
64
+ /* !important to override z-index from 3D piece inline style */
65
+ z-index: 11 !important;
66
+ }
67
+
68
+ piece.anim {
69
+ z-index: 8;
70
+ }
71
+
72
+ piece.fading {
73
+ z-index: 1;
74
+ opacity: 0.5;
75
+ }
76
+
77
+ .cg-wrap piece.ghost {
78
+ opacity: 0.3;
79
+ }
80
+
81
+ .cg-wrap piece svg {
82
+ overflow: hidden;
83
+ position: relative;
84
+ top: 0px;
85
+ left: 0px;
86
+ width: 100%;
87
+ height: 100%;
88
+ pointer-events: none;
89
+ z-index: 2;
90
+ opacity: 0.6;
91
+ }
92
+
93
+ .cg-wrap cg-auto-pieces,
94
+ .cg-wrap .cg-shapes,
95
+ .cg-wrap .cg-custom-svgs {
96
+ overflow: visible;
97
+ position: absolute;
98
+ top: 0px;
99
+ left: 0px;
100
+ width: 100%;
101
+ height: 100%;
102
+ pointer-events: none;
103
+ }
104
+
105
+ .cg-wrap cg-auto-pieces {
106
+ z-index: 2;
107
+ }
108
+
109
+ .cg-wrap cg-auto-pieces piece {
110
+ opacity: 0.3;
111
+ }
112
+
113
+ .cg-wrap .cg-shapes {
114
+ overflow: hidden;
115
+ opacity: 0.6;
116
+ z-index: 2;
117
+ }
118
+
119
+ .cg-wrap .cg-custom-svgs {
120
+ /* over piece.anim = 8, but under piece.dragging = 11 */
121
+ z-index: 9;
122
+ }
123
+
124
+ .cg-wrap .cg-custom-svgs svg {
125
+ overflow: visible;
126
+ }
127
+
128
+ .cg-wrap coords {
129
+ position: absolute;
130
+ display: flex;
131
+ pointer-events: none;
132
+ opacity: 0.8;
133
+ font-family: sans-serif;
134
+ font-size: 9px;
135
+ }
136
+
137
+ .cg-wrap coords.ranks {
138
+ left: 4px;
139
+ top: -20px;
140
+ flex-flow: column-reverse;
141
+ height: 100%;
142
+ width: 12px;
143
+ }
144
+
145
+ .cg-wrap coords.ranks.black {
146
+ flex-flow: column;
147
+ }
148
+
149
+ .cg-wrap coords.ranks.left {
150
+ left: -15px;
151
+ align-items: flex-end;
152
+ }
153
+
154
+ .cg-wrap coords.files {
155
+ bottom: -4px;
156
+ left: 24px;
157
+ flex-flow: row;
158
+ width: 100%;
159
+ height: 16px;
160
+ text-transform: uppercase;
161
+ text-align: center;
162
+ }
163
+
164
+ .cg-wrap coords.files.black {
165
+ flex-flow: row-reverse;
166
+ }
167
+
168
+ .cg-wrap coords coord {
169
+ flex: 1 1 auto;
170
+ }
171
+
172
+ .cg-wrap coords.ranks coord {
173
+ transform: translateY(39%);
174
+ }
175
+
176
+ .cg-wrap coords.squares {
177
+ bottom: 0;
178
+ left: 0;
179
+ text-transform: uppercase;
180
+ text-align: right;
181
+ flex-flow: column-reverse;
182
+ height: 100%;
183
+ width: 12.5%;
184
+ }
185
+
186
+ .cg-wrap coords.squares.black {
187
+ flex-flow: column;
188
+ }
189
+
190
+ .cg-wrap coords.squares.left {
191
+ text-align: left;
192
+ }
193
+
194
+ .cg-wrap coords.squares coord {
195
+ padding: 6% 4%;
196
+ }
197
+
198
+ .cg-wrap coords.squares.rank2 {
199
+ transform: translateX(100%);
200
+ }
201
+
202
+ .cg-wrap coords.squares.rank3 {
203
+ transform: translateX(200%);
204
+ }
205
+
206
+ .cg-wrap coords.squares.rank4 {
207
+ transform: translateX(300%);
208
+ }
209
+
210
+ .cg-wrap coords.squares.rank5 {
211
+ transform: translateX(400%);
212
+ }
213
+
214
+ .cg-wrap coords.squares.rank6 {
215
+ transform: translateX(500%);
216
+ }
217
+
218
+ .cg-wrap coords.squares.rank7 {
219
+ transform: translateX(600%);
220
+ }
221
+
222
+ .cg-wrap coords.squares.rank8 {
223
+ transform: translateX(700%);
224
+ }
@@ -0,0 +1,62 @@
1
+ /** Colored board squares as an embedded SVG */
2
+ cg-board {
3
+ background-color: #f0d9b5;
4
+ background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgIHZpZXdCb3g9IjAgMCA4IDgiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyI+CjxnIGlkPSJhIj4KICA8ZyBpZD0iYiI+CiAgICA8ZyBpZD0iYyI+CiAgICAgIDxnIGlkPSJkIj4KICAgICAgICA8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpZD0iZSIgb3BhY2l0eT0iMCIvPgogICAgICAgIDx1c2UgeD0iMSIgeT0iMSIgaHJlZj0iI2UiIHg6aHJlZj0iI2UiLz4KICAgICAgICA8cmVjdCB5PSIxIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpZD0iZiIgb3BhY2l0eT0iMC4yIi8+CiAgICAgICAgPHVzZSB4PSIxIiB5PSItMSIgaHJlZj0iI2YiIHg6aHJlZj0iI2YiLz4KICAgICAgPC9nPgogICAgICA8dXNlIHg9IjIiIGhyZWY9IiNkIiB4OmhyZWY9IiNkIi8+CiAgICA8L2c+CiAgICA8dXNlIHg9IjQiIGhyZWY9IiNjIiB4OmhyZWY9IiNjIi8+CiAgPC9nPgogIDx1c2UgeT0iMiIgaHJlZj0iI2IiIHg6aHJlZj0iI2IiLz4KPC9nPgo8dXNlIHk9IjQiIGhyZWY9IiNhIiB4OmhyZWY9IiNhIi8+Cjwvc3ZnPg==');
5
+ }
6
+
7
+ /** Interactive board square colors */
8
+ cg-board square.move-dest {
9
+ background: radial-gradient(rgba(20, 85, 30, 0.5) 22%, #208530 0, rgba(0, 0, 0, 0.3) 0, rgba(0, 0, 0, 0) 0);
10
+ }
11
+ cg-board square.premove-dest {
12
+ background: radial-gradient(rgba(20, 30, 85, 0.5) 22%, #203085 0, rgba(0, 0, 0, 0.3) 0, rgba(0, 0, 0, 0) 0);
13
+ }
14
+ cg-board square.oc.move-dest {
15
+ background: radial-gradient(transparent 0%, transparent 80%, rgba(20, 85, 0, 0.3) 80%);
16
+ }
17
+ cg-board square.oc.premove-dest {
18
+ background: radial-gradient(transparent 0%, transparent 80%, rgba(20, 30, 85, 0.2) 80%);
19
+ }
20
+ cg-board square.move-dest:hover {
21
+ background: rgba(20, 85, 30, 0.3);
22
+ }
23
+ cg-board square.premove-dest:hover {
24
+ background: rgba(20, 30, 85, 0.2);
25
+ }
26
+ cg-board square.last-move {
27
+ background-color: rgba(155, 199, 0, 0.41);
28
+ }
29
+ cg-board square.selected {
30
+ background-color: rgba(20, 85, 30, 0.5);
31
+ }
32
+ cg-board square.check {
33
+ background: radial-gradient(
34
+ ellipse at center,
35
+ rgba(255, 0, 0, 1) 0%,
36
+ rgba(231, 0, 0, 1) 25%,
37
+ rgba(169, 0, 0, 0) 89%,
38
+ rgba(158, 0, 0, 0) 100%
39
+ );
40
+ }
41
+ cg-board square.current-premove {
42
+ background-color: rgba(20, 30, 85, 0.5);
43
+ }
44
+
45
+ /** Alternating colors in rank/file/square labels */
46
+ .orientation-white .ranks :nth-child(odd),
47
+ .orientation-white .files :nth-child(even),
48
+ .orientation-black .ranks :nth-child(even),
49
+ .orientation-black .files :nth-child(odd),
50
+ coords.squares:nth-of-type(odd) :nth-child(even),
51
+ coords.squares:nth-of-type(even) :nth-child(odd) {
52
+ color: rgba(72, 72, 72, 0.8);
53
+ }
54
+
55
+ .orientation-white .ranks :nth-child(even),
56
+ .orientation-white .files :nth-child(odd),
57
+ .orientation-black .ranks :nth-child(odd),
58
+ .orientation-black .files :nth-child(even),
59
+ coords.squares:nth-of-type(odd) :nth-child(odd),
60
+ coords.squares:nth-of-type(even) :nth-child(even) {
61
+ color: rgba(255, 255, 255, 0.8);
62
+ }
@@ -0,0 +1,37 @@
1
+ /** Embedded SVGs for all chess pieces */
2
+ .cg-wrap piece.pawn.white {
3
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PHBhdGggZD0iTTIyLjUgOWMtMi4yMSAwLTQgMS43OS00IDQgMCAuODkuMjkgMS43MS43OCAyLjM4QzE3LjMzIDE2LjUgMTYgMTguNTkgMTYgMjFjMCAyLjAzLjk0IDMuODQgMi40MSA1LjAzLTMgMS4wNi03LjQxIDUuNTUtNy40MSAxMy40N2gyM2MwLTcuOTItNC40MS0xMi40MS03LjQxLTEzLjQ3IDEuNDctMS4xOSAyLjQxLTMgMi40MS01LjAzIDAtMi40MS0xLjMzLTQuNS0zLjI4LTUuNjIuNDktLjY3Ljc4LTEuNDkuNzgtMi4zOCAwLTIuMjEtMS43OS00LTQtNHoiIGZpbGw9IiNmZmYiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjwvc3ZnPg==');
4
+ }
5
+ .cg-wrap piece.bishop.white {
6
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxnIGZpbGw9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJidXR0Ij48cGF0aCBkPSJNOSAzNmMzLjM5LS45NyAxMC4xMS40MyAxMy41LTIgMy4zOSAyLjQzIDEwLjExIDEuMDMgMTMuNSAyIDAgMCAxLjY1LjU0IDMgMi0uNjguOTctMS42NS45OS0zIC41LTMuMzktLjk3LTEwLjExLjQ2LTEzLjUtMS0zLjM5IDEuNDYtMTAuMTEuMDMtMTMuNSAxLTEuMzU0LjQ5LTIuMzIzLjQ3LTMtLjUgMS4zNTQtMS45NCAzLTIgMy0yeiIvPjxwYXRoIGQ9Ik0xNSAzMmMyLjUgMi41IDEyLjUgMi41IDE1IDAgLjUtMS41IDAtMiAwLTIgMC0yLjUtMi41LTQtMi41LTQgNS41LTEuNSA2LTExLjUtNS0xNS41LTExIDQtMTAuNSAxNC01IDE1LjUgMCAwLTIuNSAxLjUtMi41IDQgMCAwLS41LjUgMCAyeiIvPjxwYXRoIGQ9Ik0yNSA4YTIuNSAyLjUgMCAxIDEtNSAwIDIuNSAyLjUgMCAxIDEgNSAweiIvPjwvZz48cGF0aCBkPSJNMTcuNSAyNmgxME0xNSAzMGgxNW0tNy41LTE0LjV2NU0yMCAxOGg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+PC9nPjwvc3ZnPg==');
7
+ }
8
+ .cg-wrap piece.knight.white {
9
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMiAxMGMxMC41IDEgMTYuNSA4IDE2IDI5SDE1YzAtOSAxMC02LjUgOC0yMSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0yNCAxOGMuMzggMi45MS01LjU1IDcuMzctOCA5LTMgMi0yLjgyIDQuMzQtNSA0LTEuMDQyLS45NCAxLjQxLTMuMDQgMC0zLTEgMCAuMTkgMS4yMy0xIDItMSAwLTQuMDAzIDEtNC00IDAtMiA2LTEyIDYtMTJzMS44OS0xLjkgMi0zLjVjLS43My0uOTk0LS41LTItLjUtMyAxLTEgMyAyLjUgMyAyLjVoMnMuNzgtMS45OTIgMi41LTNjMSAwIDEgMyAxIDMiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNOS41IDI1LjVhLjUuNSAwIDEgMS0xIDAgLjUuNSAwIDEgMSAxIDB6bTUuNDMzLTkuNzVhLjUgMS41IDMwIDEgMS0uODY2LS41LjUgMS41IDMwIDEgMSAuODY2LjV6IiBmaWxsPSIjMDAwIi8+PC9nPjwvc3ZnPg==');
10
+ }
11
+ .cg-wrap piece.rook.white {
12
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik05IDM5aDI3di0zSDl2M3ptMy0zdi00aDIxdjRIMTJ6bS0xLTIyVjloNHYyaDVWOWg1djJoNVY5aDR2NSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz48cGF0aCBkPSJNMzQgMTRsLTMgM0gxNGwtMy0zIi8+PHBhdGggZD0iTTMxIDE3djEyLjVIMTRWMTciIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+PHBhdGggZD0iTTMxIDI5LjVsMS41IDIuNWgtMjBsMS41LTIuNSIvPjxwYXRoIGQ9Ik0xMSAxNGgyMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPjwvZz48L3N2Zz4=');
13
+ }
14
+ .cg-wrap piece.queen.white {
15
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik04IDEyYTIgMiAwIDEgMS00IDAgMiAyIDAgMSAxIDQgMHptMTYuNS00LjVhMiAyIDAgMSAxLTQgMCAyIDIgMCAxIDEgNCAwek00MSAxMmEyIDIgMCAxIDEtNCAwIDIgMiAwIDEgMSA0IDB6TTE2IDguNWEyIDIgMCAxIDEtNCAwIDIgMiAwIDEgMSA0IDB6TTMzIDlhMiAyIDAgMSAxLTQgMCAyIDIgMCAxIDEgNCAweiIvPjxwYXRoIGQ9Ik05IDI2YzguNS0xLjUgMjEtMS41IDI3IDBsMi0xMi03IDExVjExbC01LjUgMTMuNS0zLTE1LTMgMTUtNS41LTE0VjI1TDcgMTRsMiAxMnoiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+PHBhdGggZD0iTTkgMjZjMCAyIDEuNSAyIDIuNSA0IDEgMS41IDEgMSAuNSAzLjUtMS41IDEtMS41IDIuNS0xLjUgMi41LTEuNSAxLjUuNSAyLjUuNSAyLjUgNi41IDEgMTYuNSAxIDIzIDAgMCAwIDEuNS0xIDAtMi41IDAgMCAuNS0xLjUtMS0yLjUtLjUtMi41LS41LTIgLjUtMy41IDEtMiAyLjUtMiAyLjUtNC04LjUtMS41LTE4LjUtMS41LTI3IDB6IiBzdHJva2UtbGluZWNhcD0iYnV0dCIvPjxwYXRoIGQ9Ik0xMS41IDMwYzMuNS0xIDE4LjUtMSAyMiAwTTEyIDMzLjVjNi0xIDE1LTEgMjEgMCIgZmlsbD0ibm9uZSIvPjwvZz48L3N2Zz4=');
16
+ }
17
+ .cg-wrap piece.king.white {
18
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMi41IDExLjYzVjZNMjAgOGg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+PHBhdGggZD0iTTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgZmlsbD0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz48cGF0aCBkPSJNMTEuNSAzN2M1LjUgMy41IDE1LjUgMy41IDIxIDB2LTdzOS00LjUgNi0xMC41Yy00LTYuNS0xMy41LTMuNS0xNiA0VjI3di0zLjVjLTMuNS03LjUtMTMtMTAuNS0xNi00LTMgNiA1IDEwIDUgMTBWMzd6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExLjUgMzBjNS41LTMgMTUuNS0zIDIxIDBtLTIxIDMuNWM1LjUtMyAxNS41LTMgMjEgMG0tMjEgMy41YzUuNS0zIDE1LjUtMyAyMSAwIi8+PC9nPjwvc3ZnPg==');
19
+ }
20
+ .cg-wrap piece.pawn.black {
21
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PHBhdGggZD0iTTIyLjUgOWMtMi4yMSAwLTQgMS43OS00IDQgMCAuODkuMjkgMS43MS43OCAyLjM4QzE3LjMzIDE2LjUgMTYgMTguNTkgMTYgMjFjMCAyLjAzLjk0IDMuODQgMi40MSA1LjAzLTMgMS4wNi03LjQxIDUuNTUtNy40MSAxMy40N2gyM2MwLTcuOTItNC40MS0xMi40MS03LjQxLTEzLjQ3IDEuNDctMS4xOSAyLjQxLTMgMi40MS01LjAzIDAtMi40MS0xLjMzLTQuNS0zLjI4LTUuNjIuNDktLjY3Ljc4LTEuNDkuNzgtMi4zOCAwLTIuMjEtMS43OS00LTQtNHoiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjwvc3ZnPg==');
22
+ }
23
+ .cg-wrap piece.bishop.black {
24
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxnIGZpbGw9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJidXR0Ij48cGF0aCBkPSJNOSAzNmMzLjM5LS45NyAxMC4xMS40MyAxMy41LTIgMy4zOSAyLjQzIDEwLjExIDEuMDMgMTMuNSAyIDAgMCAxLjY1LjU0IDMgMi0uNjguOTctMS42NS45OS0zIC41LTMuMzktLjk3LTEwLjExLjQ2LTEzLjUtMS0zLjM5IDEuNDYtMTAuMTEuMDMtMTMuNSAxLTEuMzU0LjQ5LTIuMzIzLjQ3LTMtLjUgMS4zNTQtMS45NCAzLTIgMy0yeiIvPjxwYXRoIGQ9Ik0xNSAzMmMyLjUgMi41IDEyLjUgMi41IDE1IDAgLjUtMS41IDAtMiAwLTIgMC0yLjUtMi41LTQtMi41LTQgNS41LTEuNSA2LTExLjUtNS0xNS41LTExIDQtMTAuNSAxNC01IDE1LjUgMCAwLTIuNSAxLjUtMi41IDQgMCAwLS41LjUgMCAyeiIvPjxwYXRoIGQ9Ik0yNSA4YTIuNSAyLjUgMCAxIDEtNSAwIDIuNSAyLjUgMCAxIDEgNSAweiIvPjwvZz48cGF0aCBkPSJNMTcuNSAyNmgxME0xNSAzMGgxNW0tNy41LTE0LjV2NU0yMCAxOGg1IiBzdHJva2U9IiNlY2VjZWMiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz48L2c+PC9zdmc+');
25
+ }
26
+ .cg-wrap piece.knight.black {
27
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMiAxMGMxMC41IDEgMTYuNSA4IDE2IDI5SDE1YzAtOSAxMC02LjUgOC0yMSIgZmlsbD0iIzAwMCIvPjxwYXRoIGQ9Ik0yNCAxOGMuMzggMi45MS01LjU1IDcuMzctOCA5LTMgMi0yLjgyIDQuMzQtNSA0LTEuMDQyLS45NCAxLjQxLTMuMDQgMC0zLTEgMCAuMTkgMS4yMy0xIDItMSAwLTQuMDAzIDEtNC00IDAtMiA2LTEyIDYtMTJzMS44OS0xLjkgMi0zLjVjLS43My0uOTk0LS41LTItLjUtMyAxLTEgMyAyLjUgMyAyLjVoMnMuNzgtMS45OTIgMi41LTNjMSAwIDEgMyAxIDMiIGZpbGw9IiMwMDAiLz48cGF0aCBkPSJNOS41IDI1LjVhLjUuNSAwIDEgMS0xIDAgLjUuNSAwIDEgMSAxIDB6bTUuNDMzLTkuNzVhLjUgMS41IDMwIDEgMS0uODY2LS41LjUgMS41IDMwIDEgMSAuODY2LjV6IiBmaWxsPSIjZWNlY2VjIiBzdHJva2U9IiNlY2VjZWMiLz48cGF0aCBkPSJNMjQuNTUgMTAuNGwtLjQ1IDEuNDUuNS4xNWMzLjE1IDEgNS42NSAyLjQ5IDcuOSA2Ljc1UzM1Ljc1IDI5LjA2IDM1LjI1IDM5bC0uMDUuNWgyLjI1bC4wNS0uNWMuNS0xMC4wNi0uODgtMTYuODUtMy4yNS0yMS4zNC0yLjM3LTQuNDktNS43OS02LjY0LTkuMTktNy4xNmwtLjUxLS4xeiIgZmlsbD0iI2VjZWNlYyIgc3Ryb2tlPSJub25lIi8+PC9nPjwvc3ZnPg==');
28
+ }
29
+ .cg-wrap piece.rook.black {
30
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik05IDM5aDI3di0zSDl2M3ptMy41LTdsMS41LTIuNWgxN2wxLjUgMi41aC0yMHptLS41IDR2LTRoMjF2NEgxMnoiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+PHBhdGggZD0iTTE0IDI5LjV2LTEzaDE3djEzSDE0eiIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz48cGF0aCBkPSJNMTQgMTYuNUwxMSAxNGgyM2wtMyAyLjVIMTR6TTExIDE0VjloNHYyaDVWOWg1djJoNVY5aDR2NUgxMXoiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+PHBhdGggZD0iTTEyIDM1LjVoMjFtLTIwLTRoMTltLTE4LTJoMTdtLTE3LTEzaDE3TTExIDE0aDIzIiBmaWxsPSJub25lIiBzdHJva2U9IiNlY2VjZWMiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPjwvZz48L3N2Zz4=');
31
+ }
32
+ .cg-wrap piece.queen.black {
33
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxnIHN0cm9rZT0ibm9uZSI+PGNpcmNsZSBjeD0iNiIgY3k9IjEyIiByPSIyLjc1Ii8+PGNpcmNsZSBjeD0iMTQiIGN5PSI5IiByPSIyLjc1Ii8+PGNpcmNsZSBjeD0iMjIuNSIgY3k9IjgiIHI9IjIuNzUiLz48Y2lyY2xlIGN4PSIzMSIgY3k9IjkiIHI9IjIuNzUiLz48Y2lyY2xlIGN4PSIzOSIgY3k9IjEyIiByPSIyLjc1Ii8+PC9nPjxwYXRoIGQ9Ik05IDI2YzguNS0xLjUgMjEtMS41IDI3IDBsMi41LTEyLjVMMzEgMjVsLS4zLTE0LjEtNS4yIDEzLjYtMy0xNC41LTMgMTQuNS01LjItMTMuNkwxNCAyNSA2LjUgMTMuNSA5IDI2eiIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz48cGF0aCBkPSJNOSAyNmMwIDIgMS41IDIgMi41IDQgMSAxLjUgMSAxIC41IDMuNS0xLjUgMS0xLjUgMi41LTEuNSAyLjUtMS41IDEuNS41IDIuNS41IDIuNSA2LjUgMSAxNi41IDEgMjMgMCAwIDAgMS41LTEgMC0yLjUgMCAwIC41LTEuNS0xLTIuNS0uNS0yLjUtLjUtMiAuNS0zLjUgMS0yIDIuNS0yIDIuNS00LTguNS0xLjUtMTguNS0xLjUtMjcgMHoiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+PHBhdGggZD0iTTExIDM4LjVhMzUgMzUgMSAwIDAgMjMgMCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz48cGF0aCBkPSJNMTEgMjlhMzUgMzUgMSAwIDEgMjMgMG0tMjEuNSAyLjVoMjBtLTIxIDNhMzUgMzUgMSAwIDAgMjIgMG0tMjMgM2EzNSAzNSAxIDAgMCAyNCAwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlY2VjZWMiLz48L2c+PC9zdmc+');
34
+ }
35
+ .cg-wrap piece.king.black {
36
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMi41IDExLjYzVjYiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz48cGF0aCBkPSJNMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBmaWxsPSIjMDAwIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPjxwYXRoIGQ9Ik0xMS41IDM3YzUuNSAzLjUgMTUuNSAzLjUgMjEgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDRWMjd2LTMuNWMtMy41LTcuNS0xMy0xMC41LTE2LTQtMyA2IDUgMTAgNSAxMFYzN3oiIGZpbGw9IiMwMDAiLz48cGF0aCBkPSJNMjAgOGg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+PHBhdGggZD0iTTMyIDI5LjVzOC41LTQgNi4wMy05LjY1QzM0LjE1IDE0IDI1IDE4IDIyLjUgMjQuNWwuMDEgMi4xLS4wMS0yLjFDMjAgMTggOS45MDYgMTQgNi45OTcgMTkuODVjLTIuNDk3IDUuNjUgNC44NTMgOSA0Ljg1MyA5IiBzdHJva2U9IiNlY2VjZWMiLz48cGF0aCBkPSJNMTEuNSAzMGM1LjUtMyAxNS41LTMgMjEgMG0tMjEgMy41YzUuNS0zIDE1LjUtMyAyMSAwbS0yMSAzLjVjNS41LTMgMTUuNS0zIDIxIDAiIHN0cm9rZT0iI2VjZWNlYyIvPjwvZz48L3N2Zz4=');
37
+ }
package/dist/anim.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { State } from './state.js';
2
+ import * as cg from './types.js';
3
+ export type Mutation<A> = (state: State) => A;
4
+ export type AnimVector = cg.NumberQuad;
5
+ export type AnimVectors = Map<cg.Key, AnimVector>;
6
+ export type AnimFadings = Map<cg.Key, cg.Piece>;
7
+ export interface AnimPlan {
8
+ anims: AnimVectors;
9
+ fadings: AnimFadings;
10
+ }
11
+ export interface AnimCurrent {
12
+ start: DOMHighResTimeStamp;
13
+ frequency: cg.KHz;
14
+ plan: AnimPlan;
15
+ }
16
+ export declare const anim: <A>(mutation: Mutation<A>, state: State) => A;
17
+ export declare function render<A>(mutation: Mutation<A>, state: State): A;
package/dist/anim.js ADDED
@@ -0,0 +1,99 @@
1
+ import * as util from './util.js';
2
+ export const anim = (mutation, state) => state.animation.enabled ? animate(mutation, state) : render(mutation, state);
3
+ export function render(mutation, state) {
4
+ const result = mutation(state);
5
+ state.dom.redraw();
6
+ return result;
7
+ }
8
+ const makePiece = (key, piece) => ({
9
+ key: key,
10
+ pos: util.key2pos(key),
11
+ piece: piece,
12
+ });
13
+ const closer = (piece, pieces) => pieces.sort((p1, p2) => util.distanceSq(piece.pos, p1.pos) - util.distanceSq(piece.pos, p2.pos))[0];
14
+ function computePlan(prevPieces, current) {
15
+ const anims = new Map(), animedOrigs = [], fadings = new Map(), missings = [], news = [], prePieces = new Map();
16
+ let curP, preP, vector;
17
+ for (const [k, p] of prevPieces) {
18
+ prePieces.set(k, makePiece(k, p));
19
+ }
20
+ for (const key of util.allKeys) {
21
+ curP = current.pieces.get(key);
22
+ preP = prePieces.get(key);
23
+ if (curP) {
24
+ if (preP) {
25
+ if (!util.samePiece(curP, preP.piece)) {
26
+ missings.push(preP);
27
+ news.push(makePiece(key, curP));
28
+ }
29
+ }
30
+ else
31
+ news.push(makePiece(key, curP));
32
+ }
33
+ else if (preP)
34
+ missings.push(preP);
35
+ }
36
+ for (const newP of news) {
37
+ preP = closer(newP, missings.filter(p => util.samePiece(newP.piece, p.piece)));
38
+ if (preP) {
39
+ vector = [preP.pos[0] - newP.pos[0], preP.pos[1] - newP.pos[1]];
40
+ anims.set(newP.key, vector.concat(vector));
41
+ animedOrigs.push(preP.key);
42
+ }
43
+ }
44
+ for (const p of missings) {
45
+ if (!animedOrigs.includes(p.key))
46
+ fadings.set(p.key, p.piece);
47
+ }
48
+ return {
49
+ anims: anims,
50
+ fadings: fadings,
51
+ };
52
+ }
53
+ function step(state, now) {
54
+ const cur = state.animation.current;
55
+ if (cur === undefined) {
56
+ // animation was canceled :(
57
+ if (!state.dom.destroyed)
58
+ state.dom.redrawNow();
59
+ return;
60
+ }
61
+ const rest = 1 - (now - cur.start) * cur.frequency;
62
+ if (rest <= 0) {
63
+ state.animation.current = undefined;
64
+ state.dom.redrawNow();
65
+ }
66
+ else {
67
+ const ease = easing(rest);
68
+ for (const cfg of cur.plan.anims.values()) {
69
+ cfg[2] = cfg[0] * ease;
70
+ cfg[3] = cfg[1] * ease;
71
+ }
72
+ state.dom.redrawNow(true); // optimisation: don't render SVG changes during animations
73
+ requestAnimationFrame((now = performance.now()) => step(state, now));
74
+ }
75
+ }
76
+ function animate(mutation, state) {
77
+ // clone state before mutating it
78
+ const prevPieces = new Map(state.pieces);
79
+ const result = mutation(state);
80
+ const plan = computePlan(prevPieces, state);
81
+ if (plan.anims.size || plan.fadings.size) {
82
+ const alreadyRunning = state.animation.current && state.animation.current.start;
83
+ state.animation.current = {
84
+ start: performance.now(),
85
+ frequency: 1 / state.animation.duration,
86
+ plan: plan,
87
+ };
88
+ if (!alreadyRunning)
89
+ step(state, performance.now());
90
+ }
91
+ else {
92
+ // don't animate, just render right away
93
+ state.dom.redraw();
94
+ }
95
+ return result;
96
+ }
97
+ // https://gist.github.com/gre/1650294
98
+ const easing = (t) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1);
99
+ //# sourceMappingURL=anim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anim.js","sourceRoot":"","sources":["../src/anim.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { State } from './state.js';
2
+ import { Config } from './config.js';
3
+ import { DrawShape } from './draw.js';
4
+ import * as cg from './types.js';
5
+ export interface Api {
6
+ set(config: Config): void;
7
+ state: State;
8
+ getFen(): cg.FEN;
9
+ toggleOrientation(): void;
10
+ move(orig: cg.Key, dest: cg.Key): void;
11
+ setPieces(pieces: cg.PiecesDiff): void;
12
+ selectSquare(key: cg.Key | null, force?: boolean): void;
13
+ newPiece(piece: cg.Piece, key: cg.Key): void;
14
+ playPremove(): boolean;
15
+ cancelPremove(): void;
16
+ playPredrop(validate: (drop: cg.Drop) => boolean): boolean;
17
+ cancelPredrop(): void;
18
+ cancelMove(): void;
19
+ stop(): void;
20
+ explode(keys: cg.Key[]): void;
21
+ setShapes(shapes: DrawShape[]): void;
22
+ setAutoShapes(shapes: DrawShape[]): void;
23
+ getKeyAtDomPos(pos: cg.NumberPair): cg.Key | undefined;
24
+ redrawAll: cg.Redraw;
25
+ dragNewPiece(piece: cg.Piece, event: cg.MouchEvent, force?: boolean): void;
26
+ destroy: cg.Unbind;
27
+ }
28
+ export declare function start(state: State, redrawAll: cg.Redraw): Api;