@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.
- package/LICENSE +674 -0
- package/README.md +110 -0
- package/assets/chessground.base.css +224 -0
- package/assets/chessground.brown.css +62 -0
- package/assets/chessground.cburnett.css +37 -0
- package/dist/anim.d.ts +17 -0
- package/dist/anim.js +99 -0
- package/dist/anim.js.map +1 -0
- package/dist/api.d.ts +28 -0
- package/dist/api.js +98 -0
- package/dist/api.js.map +1 -0
- package/dist/autoPieces.d.ts +3 -0
- package/dist/autoPieces.js +38 -0
- package/dist/autoPieces.js.map +1 -0
- package/dist/board.d.ts +25 -0
- package/dist/board.js +331 -0
- package/dist/board.js.map +1 -0
- package/dist/chessground.d.ts +7 -0
- package/dist/chessground.js +63 -0
- package/dist/chessground.js.map +1 -0
- package/dist/chessground.min.js +1 -0
- package/dist/config.d.ts +87 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/drag.d.ts +20 -0
- package/dist/drag.js +208 -0
- package/dist/drag.js.map +1 -0
- package/dist/draw.d.ts +65 -0
- package/dist/draw.js +90 -0
- package/dist/draw.js.map +1 -0
- package/dist/drop.d.ts +5 -0
- package/dist/drop.js +31 -0
- package/dist/drop.js.map +1 -0
- package/dist/events.d.ts +4 -0
- package/dist/events.js +72 -0
- package/dist/events.js.map +1 -0
- package/dist/explosion.d.ts +3 -0
- package/dist/explosion.js +18 -0
- package/dist/explosion.js.map +1 -0
- package/dist/fen.d.ts +4 -0
- package/dist/fen.js +79 -0
- package/dist/fen.js.map +1 -0
- package/dist/premove.d.ts +6 -0
- package/dist/premove.js +57 -0
- package/dist/premove.js.map +1 -0
- package/dist/render.d.ts +4 -0
- package/dist/render.js +235 -0
- package/dist/render.js.map +1 -0
- package/dist/state.d.ts +100 -0
- package/dist/state.js +92 -0
- package/dist/state.js.map +1 -0
- package/dist/svg.d.ts +8 -0
- package/dist/svg.js +348 -0
- package/dist/svg.js.map +1 -0
- package/dist/sync.d.ts +8 -0
- package/dist/sync.js +27 -0
- package/dist/sync.js.map +1 -0
- package/dist/types.d.ts +94 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +20 -0
- package/dist/util.js +89 -0
- package/dist/util.js.map +1 -0
- package/dist/wrap.d.ts +3 -0
- package/dist/wrap.js +90 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +58 -0
- package/src/anim.ts +139 -0
- package/src/api.ts +187 -0
- package/src/autoPieces.ts +47 -0
- package/src/board.ts +371 -0
- package/src/chessground.ts +67 -0
- package/src/config.ts +165 -0
- package/src/drag.ts +223 -0
- package/src/draw.ts +154 -0
- package/src/drop.ts +36 -0
- package/src/events.ts +86 -0
- package/src/explosion.ts +19 -0
- package/src/fen.ts +78 -0
- package/src/premove.ts +76 -0
- package/src/render.ts +262 -0
- package/src/state.ts +199 -0
- package/src/svg.ts +441 -0
- package/src/sync.ts +36 -0
- package/src/types.ts +110 -0
- package/src/util.ts +105 -0
- package/src/wrap.ts +111 -0
package/README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Chessground
|
|
2
|
+
|
|
3
|
+
[](https://github.com/lichess-org/chessground/actions?query=workflow%3A%22Continuous+Integration%22)
|
|
4
|
+
[](https://www.npmjs.com/package/@lichess-org/chessground)
|
|
5
|
+
|
|
6
|
+

|
|
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
|
package/dist/anim.js.map
ADDED
|
@@ -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;
|