@lichess-org/pgn-viewer 2.4.7 → 2.5.1
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/README.md +23 -0
- package/demo/frame.html +1 -1
- package/demo/index.html +1 -1
- package/demo/lichess-pgn-viewer.css +61 -28
- package/demo/lichess-pgn-viewer.js +697 -379
- package/demo/one.html +6 -6
- package/demo/one.js +1 -1
- package/dist/interfaces.d.ts +2 -1
- package/dist/lichess-pgn-viewer.css +1 -1
- package/dist/lichess-pgn-viewer.min.js +4 -4
- package/dist/pgnViewer.d.ts +1 -0
- package/dist/pgnViewer.js +4 -0
- package/dist/pgnViewer.js.map +1 -1
- package/dist/translation.d.ts +2 -2
- package/dist/translation.js +51 -3
- package/dist/translation.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/view/accessibleBoard.d.ts +3 -0
- package/dist/view/accessibleBoard.js +40 -0
- package/dist/view/accessibleBoard.js.map +1 -0
- package/dist/view/aria.d.ts +10 -0
- package/dist/view/aria.js +54 -0
- package/dist/view/aria.js.map +1 -0
- package/dist/view/glyph.d.ts +9 -0
- package/dist/view/glyph.js +1 -1
- package/dist/view/glyph.js.map +1 -1
- package/dist/view/main.js +9 -0
- package/dist/view/main.js.map +1 -1
- package/dist/view/menu.d.ts +3 -2
- package/dist/view/menu.js +76 -11
- package/dist/view/menu.js.map +1 -1
- package/dist/view/player.js +15 -10
- package/dist/view/player.js.map +1 -1
- package/dist/view/side.js +29 -14
- package/dist/view/side.js.map +1 -1
- package/dist/view/util.d.ts +5 -0
- package/dist/view/util.js +63 -0
- package/dist/view/util.js.map +1 -1
- package/package.json +13 -14
- package/scss/_side.scss +19 -4
- package/scss/_util.scss +10 -0
- package/src/interfaces.ts +2 -2
- package/src/pgnViewer.ts +6 -0
- package/src/translation.ts +53 -4
- package/src/view/accessibleBoard.ts +61 -0
- package/src/view/aria.ts +68 -0
- package/src/view/glyph.ts +1 -1
- package/src/view/main.ts +13 -0
- package/src/view/menu.ts +139 -61
- package/src/view/player.ts +19 -13
- package/src/view/side.ts +40 -16
- package/src/view/util.ts +66 -0
package/dist/view/menu.js
CHANGED
|
@@ -2,29 +2,49 @@ import { h } from 'snabbdom';
|
|
|
2
2
|
import { bind, bindMobileMousedown, onInsert } from './util';
|
|
3
3
|
import { eventRepeater } from '../events';
|
|
4
4
|
export const renderMenu = (ctrl) => {
|
|
5
|
-
var _a, _b;
|
|
6
|
-
return h('div.lpv__menu.lpv__pane',
|
|
5
|
+
var _a, _b, _c;
|
|
6
|
+
return h('div.lpv__menu.lpv__pane', {
|
|
7
|
+
attrs: {
|
|
8
|
+
role: 'menu',
|
|
9
|
+
'aria-label': (_a = ctrl.translate('menu')) !== null && _a !== void 0 ? _a : 'Menu',
|
|
10
|
+
},
|
|
11
|
+
hook: {
|
|
12
|
+
insert: (vnode) => {
|
|
13
|
+
const menuEl = vnode.elm;
|
|
14
|
+
// Focus first menu item when menu opens
|
|
15
|
+
const firstItem = menuEl.querySelector('[role="menuitem"]');
|
|
16
|
+
firstItem === null || firstItem === void 0 ? void 0 : firstItem.focus();
|
|
17
|
+
setupMenuKeyboard(ctrl, menuEl);
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
}, [
|
|
7
21
|
h('button.lpv__menu__entry.lpv__menu__flip.lpv__fbt', {
|
|
22
|
+
attrs: { role: 'menuitem' },
|
|
8
23
|
hook: bind('click', ctrl.flip),
|
|
9
24
|
}, ctrl.translate('flipTheBoard')),
|
|
10
|
-
((
|
|
25
|
+
((_b = ctrl.opts.menu.analysisBoard) === null || _b === void 0 ? void 0 : _b.enabled)
|
|
11
26
|
? h('a.lpv__menu__entry.lpv__menu__analysis.lpv__fbt', {
|
|
12
27
|
attrs: {
|
|
28
|
+
role: 'menuitem',
|
|
13
29
|
href: ctrl.analysisUrl(),
|
|
14
30
|
target: '_blank',
|
|
31
|
+
'aria-label': ctrl.translate('aria.linkOpensInNewTab', ctrl.translate('analysisBoard')),
|
|
15
32
|
},
|
|
16
33
|
}, ctrl.translate('analysisBoard'))
|
|
17
34
|
: undefined,
|
|
18
|
-
((
|
|
35
|
+
((_c = ctrl.opts.menu.practiceWithComputer) === null || _c === void 0 ? void 0 : _c.enabled)
|
|
19
36
|
? h('a.lpv__menu__entry.lpv__menu__practice.lpv__fbt', {
|
|
20
37
|
attrs: {
|
|
38
|
+
role: 'menuitem',
|
|
21
39
|
href: ctrl.practiceUrl(),
|
|
22
40
|
target: '_blank',
|
|
41
|
+
'aria-label': ctrl.translate('aria.linkOpensInNewTab', ctrl.translate('practiceWithComputer')),
|
|
23
42
|
},
|
|
24
43
|
}, ctrl.translate('practiceWithComputer'))
|
|
25
44
|
: undefined,
|
|
26
45
|
ctrl.opts.menu.getPgn.enabled
|
|
27
46
|
? h('button.lpv__menu__entry.lpv__menu__pgn.lpv__fbt', {
|
|
47
|
+
attrs: { role: 'menuitem' },
|
|
28
48
|
hook: bind('click', ctrl.togglePgn),
|
|
29
49
|
}, ctrl.translate('getPgn'))
|
|
30
50
|
: undefined,
|
|
@@ -33,15 +53,23 @@ export const renderMenu = (ctrl) => {
|
|
|
33
53
|
};
|
|
34
54
|
const renderExternalLink = (ctrl) => {
|
|
35
55
|
const link = ctrl.game.metadata.externalLink;
|
|
56
|
+
const linkText = ctrl.translate(ctrl.game.metadata.isLichess ? 'viewOnLichess' : 'viewOnSite');
|
|
36
57
|
return (link &&
|
|
37
58
|
h('a.lpv__menu__entry.lpv__fbt', {
|
|
38
59
|
attrs: {
|
|
60
|
+
role: 'menuitem',
|
|
39
61
|
href: link,
|
|
40
62
|
target: '_blank',
|
|
63
|
+
'aria-label': ctrl.translate('aria.linkOpensInNewTab', linkText),
|
|
41
64
|
},
|
|
42
|
-
},
|
|
65
|
+
}, linkText));
|
|
43
66
|
};
|
|
44
|
-
export const renderControls = (ctrl) => h('div.lpv__controls',
|
|
67
|
+
export const renderControls = (ctrl) => h('div.lpv__controls', {
|
|
68
|
+
attrs: {
|
|
69
|
+
role: 'navigation',
|
|
70
|
+
'aria-label': ctrl.translate('aria.navigationControls'),
|
|
71
|
+
},
|
|
72
|
+
}, [
|
|
45
73
|
ctrl.pane == 'board' ? undefined : dirButton(ctrl, 'first', 'step-backward'),
|
|
46
74
|
dirButton(ctrl, 'prev', 'left-open'),
|
|
47
75
|
h('button.lpv__fbt.lpv__controls__menu.lpv__icon', {
|
|
@@ -49,13 +77,50 @@ export const renderControls = (ctrl) => h('div.lpv__controls', [
|
|
|
49
77
|
active: ctrl.pane != 'board',
|
|
50
78
|
'lpv__icon-ellipsis-vert': ctrl.pane == 'board',
|
|
51
79
|
},
|
|
52
|
-
hook:
|
|
80
|
+
hook: {
|
|
81
|
+
insert: (vnode) => {
|
|
82
|
+
const el = vnode.elm;
|
|
83
|
+
el.addEventListener('click', ctrl.toggleMenu);
|
|
84
|
+
// Store reference for focus management
|
|
85
|
+
ctrl.menuButton = el;
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
attrs: {
|
|
89
|
+
'aria-label': ctrl.translate('menu'),
|
|
90
|
+
'aria-expanded': String(ctrl.pane === 'menu'),
|
|
91
|
+
'aria-haspopup': 'menu',
|
|
92
|
+
},
|
|
53
93
|
}, ctrl.pane == 'board' ? undefined : 'X'),
|
|
54
94
|
dirButton(ctrl, 'next', 'right-open'),
|
|
55
95
|
ctrl.pane == 'board' ? undefined : dirButton(ctrl, 'last', 'step-forward'),
|
|
56
96
|
]);
|
|
57
|
-
const dirButton = (ctrl, to, icon) =>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
97
|
+
const dirButton = (ctrl, to, icon) => {
|
|
98
|
+
const isDisabled = ctrl.pane == 'board' && !ctrl.canGoTo(to);
|
|
99
|
+
return h(`button.lpv__controls__goto.lpv__controls__goto--${to}.lpv__fbt.lpv__icon.lpv__icon-${icon}`, {
|
|
100
|
+
class: { disabled: isDisabled },
|
|
101
|
+
hook: onInsert(el => bindMobileMousedown(el, e => eventRepeater(() => ctrl.goTo(to), e))),
|
|
102
|
+
attrs: {
|
|
103
|
+
'aria-label': ctrl.translate(`aria.${to}`),
|
|
104
|
+
'aria-disabled': String(isDisabled),
|
|
105
|
+
disabled: isDisabled,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
const setupMenuKeyboard = (ctrl, menuEl) => {
|
|
110
|
+
const handleMenuKeydown = (e) => {
|
|
111
|
+
var _a;
|
|
112
|
+
switch (e.key) {
|
|
113
|
+
case 'Enter':
|
|
114
|
+
case ' ':
|
|
115
|
+
e.preventDefault();
|
|
116
|
+
(_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.click();
|
|
117
|
+
break;
|
|
118
|
+
case 'Escape':
|
|
119
|
+
e.preventDefault();
|
|
120
|
+
ctrl.toggleMenu();
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
menuEl.addEventListener('keydown', handleMenuKeydown);
|
|
125
|
+
};
|
|
61
126
|
//# sourceMappingURL=menu.js.map
|
package/dist/view/menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/view/menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/view/menu.ts"],"names":[],"mappings":"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"}
|
package/dist/view/player.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { opposite } from 'chessops';
|
|
2
2
|
import { h } from 'snabbdom';
|
|
3
|
+
import { clockContent } from './util';
|
|
3
4
|
export default function renderPlayer(ctrl, side) {
|
|
4
5
|
const color = side == 'bottom' ? ctrl.orientation() : opposite(ctrl.orientation());
|
|
5
6
|
const player = ctrl.game.players[color];
|
|
@@ -9,8 +10,13 @@ export default function renderPlayer(ctrl, side) {
|
|
|
9
10
|
player.rating ? h('span.lpv__player__rating', ['(', player.rating, ')']) : undefined,
|
|
10
11
|
];
|
|
11
12
|
return h(`div.lpv__player.lpv__player--${side}`, [
|
|
12
|
-
player.isLichessUser
|
|
13
|
-
? h('a.lpv__player__person.ulpt.user-link', {
|
|
13
|
+
player.isLichessUser && player.name
|
|
14
|
+
? h('a.lpv__player__person.ulpt.user-link', {
|
|
15
|
+
attrs: {
|
|
16
|
+
href: `${ctrl.opts.lichess}/@/${player.name}`,
|
|
17
|
+
'aria-label': ctrl.translate('aria.viewProfileOnLichess', player.name),
|
|
18
|
+
},
|
|
19
|
+
}, personEls)
|
|
14
20
|
: h('span.lpv__player__person', personEls),
|
|
15
21
|
ctrl.opts.showClocks ? renderClock(ctrl, color) : undefined,
|
|
16
22
|
]);
|
|
@@ -20,13 +26,12 @@ const renderClock = (ctrl, color) => {
|
|
|
20
26
|
const clock = move.clocks && move.clocks[color];
|
|
21
27
|
return typeof clock == undefined
|
|
22
28
|
? undefined
|
|
23
|
-
: h('div.lpv__player__clock', {
|
|
29
|
+
: h('div.lpv__player__clock', {
|
|
30
|
+
class: { active: color == move.turn },
|
|
31
|
+
attrs: {
|
|
32
|
+
role: 'timer',
|
|
33
|
+
'aria-label': clockContent(clock).join(''),
|
|
34
|
+
},
|
|
35
|
+
}, clockContent(clock));
|
|
24
36
|
};
|
|
25
|
-
const clockContent = (seconds) => {
|
|
26
|
-
if (!seconds && seconds !== 0)
|
|
27
|
-
return ['-'];
|
|
28
|
-
const date = new Date(seconds * 1000), sep = ':', baseStr = pad2(date.getUTCMinutes()) + sep + pad2(date.getUTCSeconds());
|
|
29
|
-
return seconds >= 3600 ? [Math.floor(seconds / 3600) + sep + baseStr] : [baseStr];
|
|
30
|
-
};
|
|
31
|
-
const pad2 = (num) => (num < 10 ? '0' : '') + num;
|
|
32
37
|
//# sourceMappingURL=player.js.map
|
package/dist/view/player.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.js","sourceRoot":"","sources":["../../src/view/player.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAS,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"player.js","sourceRoot":"","sources":["../../src/view/player.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAS,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,IAAe,EAAE,IAAsB;IAC1E,MAAM,KAAK,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG;QAChB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,CAAC,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KACrF,CAAC;IACF,OAAO,CAAC,CAAC,gCAAgC,IAAI,EAAE,EAAE;QAC/C,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI;YACjC,CAAC,CAAC,CAAC,CACC,sCAAsC,EACtC;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE;oBAC7C,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC;iBACvE;aACF,EACD,SAAS,CACV;YACH,CAAC,CAAC,CAAC,CAAC,0BAA0B,EAAE,SAAS,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,IAAe,EAAE,KAAY,EAAqB,EAAE;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,OAAO,KAAK,IAAI,SAAS;QAC9B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,CACC,wBAAwB,EACxB;YACE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;YACrC,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;aAC3C;SACF,EACD,YAAY,CAAC,KAAK,CAAC,CACpB,CAAC;AACR,CAAC,CAAC"}
|
package/dist/view/side.js
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { h } from 'snabbdom';
|
|
2
2
|
import { Path } from '../path';
|
|
3
3
|
import { renderNag } from './glyph';
|
|
4
|
+
import { formatMoveForScreenReader } from './util';
|
|
5
|
+
import { ariaHidden, presentation } from './aria';
|
|
4
6
|
export const renderMoves = (ctrl) => h('div.lpv__side', [
|
|
5
7
|
h('div.lpv__moves', {
|
|
8
|
+
attrs: {
|
|
9
|
+
role: 'complementary',
|
|
10
|
+
'aria-label': ctrl.translate('aria.gameMoves'),
|
|
11
|
+
},
|
|
6
12
|
hook: {
|
|
7
13
|
insert: vnode => {
|
|
8
14
|
const el = vnode.elm;
|
|
9
15
|
if (!ctrl.path.empty())
|
|
10
16
|
autoScroll(ctrl, el);
|
|
11
|
-
el.addEventListener('
|
|
12
|
-
const path = e.target.getAttribute('
|
|
17
|
+
el.addEventListener('click', e => {
|
|
18
|
+
const path = e.target.getAttribute('data-path');
|
|
13
19
|
if (path)
|
|
14
20
|
ctrl.toPath(new Path(path));
|
|
15
21
|
}, { passive: true });
|
|
@@ -25,13 +31,17 @@ export const renderMoves = (ctrl) => h('div.lpv__side', [
|
|
|
25
31
|
]);
|
|
26
32
|
const renderResultComment = (ctrl) => {
|
|
27
33
|
const res = ctrl.game.metadata.result;
|
|
28
|
-
return res && res != '*'
|
|
34
|
+
return res && res != '*'
|
|
35
|
+
? [
|
|
36
|
+
h('comment.result', { attrs: { role: 'note', 'aria-label': ctrl.translate('aria.gameResult') } }, ctrl.game.metadata.result),
|
|
37
|
+
]
|
|
38
|
+
: [];
|
|
29
39
|
};
|
|
30
|
-
const emptyMove = () => h('move.empty', '...');
|
|
31
|
-
const indexNode = (turn) => h('index', `${turn}.`);
|
|
32
|
-
const commentNode = (comment) => h('comment', comment);
|
|
33
|
-
const parenOpen = () => h('paren.open', '(');
|
|
34
|
-
const parenClose = () => h('paren.close', ')');
|
|
40
|
+
const emptyMove = () => h('button.move.empty', { attrs: { 'aria-hidden': 'true', disabled: true } }, '...');
|
|
41
|
+
const indexNode = (turn) => h('index', { attrs: presentation }, `${turn}.`);
|
|
42
|
+
const commentNode = (comment) => h('comment', { attrs: { role: 'note' } }, comment);
|
|
43
|
+
const parenOpen = () => h('paren.open', { attrs: ariaHidden }, '(');
|
|
44
|
+
const parenClose = () => h('paren.close', { attrs: ariaHidden }, ')');
|
|
35
45
|
const moveTurn = (move) => Math.floor((move.ply - 1) / 2) + 1;
|
|
36
46
|
const makeMoveNodes = (ctrl) => {
|
|
37
47
|
const moveDom = renderMove(ctrl);
|
|
@@ -49,23 +59,26 @@ const makeMoveNodes = (ctrl) => {
|
|
|
49
59
|
if (addEmptyMove)
|
|
50
60
|
elms.push(emptyMove());
|
|
51
61
|
move.comments.forEach(comment => elms.push(commentNode(comment)));
|
|
52
|
-
variations.forEach(variation => elms.push(makeMainVariation(moveDom, variation)));
|
|
62
|
+
variations.forEach(variation => elms.push(makeMainVariation(ctrl.translate, moveDom, variation)));
|
|
53
63
|
if (addEmptyMove)
|
|
54
64
|
elms.push(indexNode(moveTurn(move)), emptyMove());
|
|
55
65
|
variations = node.children.slice(1);
|
|
56
66
|
}
|
|
57
67
|
return elms;
|
|
58
68
|
};
|
|
59
|
-
const makeMainVariation = (moveDom, node) => h('variation',
|
|
69
|
+
const makeMainVariation = (translate, moveDom, node) => h('variation', { attrs: { role: 'group', 'aria-label': translate('aria.variation') } }, [
|
|
70
|
+
...node.data.startingComments.map(commentNode),
|
|
71
|
+
...makeVariationMoves(moveDom, node),
|
|
72
|
+
]);
|
|
60
73
|
const makeVariationMoves = (moveDom, node) => {
|
|
61
74
|
let elms = [];
|
|
62
75
|
let variations = [];
|
|
63
76
|
if (node.data.ply % 2 == 0)
|
|
64
|
-
elms.push(h('index', [moveTurn(node.data), '...']));
|
|
77
|
+
elms.push(h('index', { attrs: presentation }, [moveTurn(node.data), '...']));
|
|
65
78
|
do {
|
|
66
79
|
const move = node.data;
|
|
67
80
|
if (move.ply % 2 == 1)
|
|
68
|
-
elms.push(h('index', [moveTurn(move), '.']));
|
|
81
|
+
elms.push(h('index', { attrs: presentation }, [moveTurn(move), '.']));
|
|
69
82
|
elms.push(moveDom(move));
|
|
70
83
|
move.comments.forEach(comment => elms.push(commentNode(comment)));
|
|
71
84
|
variations.forEach(variation => {
|
|
@@ -76,7 +89,7 @@ const makeVariationMoves = (moveDom, node) => {
|
|
|
76
89
|
} while (node);
|
|
77
90
|
return elms;
|
|
78
91
|
};
|
|
79
|
-
const renderMove = (ctrl) => (move) => h('move', {
|
|
92
|
+
const renderMove = (ctrl) => (move) => h('button.move', {
|
|
80
93
|
class: {
|
|
81
94
|
current: ctrl.path.equals(move.path),
|
|
82
95
|
ancestor: ctrl.path.contains(move.path),
|
|
@@ -88,7 +101,9 @@ const renderMove = (ctrl) => (move) => h('move', {
|
|
|
88
101
|
inaccuracy: move.nags.includes(6),
|
|
89
102
|
},
|
|
90
103
|
attrs: {
|
|
91
|
-
|
|
104
|
+
'data-path': move.path.path,
|
|
105
|
+
role: 'button',
|
|
106
|
+
'aria-label': ctrl.translate('aria.move', Math.ceil(move.ply / 2).toString(), ctrl.translate(`aria.${move.ply % 2 === 1 ? 'white' : 'black'}`), formatMoveForScreenReader(move.san, move.nags, ctrl.translate)),
|
|
92
107
|
},
|
|
93
108
|
}, [move.san, ...move.nags.map(renderNag)]);
|
|
94
109
|
const autoScroll = (ctrl, cont) => {
|
package/dist/view/side.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side.js","sourceRoot":"","sources":["../../src/view/side.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAS,MAAM,UAAU,CAAC;AAIpC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"side.js","sourceRoot":"","sources":["../../src/view/side.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAS,MAAM,UAAU,CAAC;AAIpC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAe,EAAE,EAAE,CAC7C,CAAC,CAAC,eAAe,EAAE;IACjB,CAAC,CACC,gBAAgB,EAChB;QACE,KAAK,EAAE;YACL,IAAI,EAAE,eAAe;YACrB,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;SAC/C;QACD,IAAI,EAAE;YACJ,MAAM,EAAE,KAAK,CAAC,EAAE;gBACd,MAAM,EAAE,GAAG,KAAK,CAAC,GAAkB,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;oBAAE,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7C,EAAE,CAAC,gBAAgB,CACjB,OAAO,EACP,CAAC,CAAC,EAAE;oBACF,MAAM,IAAI,GAAI,CAAC,CAAC,MAAsB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;oBACjE,IAAI,IAAI;wBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxC,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;YACJ,CAAC;YACD,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;gBACtB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC7B,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,GAAkB,CAAC,CAAC;oBAC3C,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;gBACnC,CAAC;YACH,CAAC;SACF;KACF,EACD,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CACvG;CACF,CAAC,CAAC;AAEL,MAAM,mBAAmB,GAAG,CAAC,IAAe,EAAE,EAAE;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtC,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG;QACtB,CAAC,CAAC;YACE,CAAC,CACC,gBAAgB,EAChB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAC5E,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC1B;SACF;QACH,CAAC,CAAC,EAAE,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5G,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;AACpF,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5F,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;AACpE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;AACtE,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAExE,MAAM,aAAa,GAAG,CAAC,IAAe,EAA4B,EAAE;IAClE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAY,EAAE,CAAC;IACzB,IAAI,IAA0B,EAC5B,UAAU,GAAe,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzB,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpG,IAAI,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QAClG,IAAI,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAIF,MAAM,iBAAiB,GAAG,CAAC,SAAoB,EAAE,OAAkB,EAAE,IAAc,EAAE,EAAE,CACrF,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE;IACtF,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC;IAC9C,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC;CACrC,CAAC,CAAC;AAEL,MAAM,kBAAkB,GAAG,CAAC,OAAkB,EAAE,IAAc,EAAE,EAAE;IAChE,IAAI,IAAI,GAAY,EAAE,CAAC;IACvB,IAAI,UAAU,GAAe,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzG,GAAG,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAC7B,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,QAAQ,IAAI,EAAE;IACf,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAe,EAAE,EAAE,CAAC,CAAC,IAAc,EAAE,EAAE,CACzD,CAAC,CACC,aAAa,EACb;IACE,KAAK,EAAE;QACL,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACvC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3B,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9B,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;KAClC;IACD,KAAK,EAAE;QACL,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;QAC3B,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI,CAAC,SAAS,CAC1B,WAAW,EACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAClC,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAChE,yBAAyB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAC/D;KACF;CACF,EACD,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CACxC,CAAC;AAEJ,MAAM,UAAU,GAAG,CAAC,IAAe,EAAE,IAAiB,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAc,UAAU,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/C,OAAO;IACT,CAAC;IACD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;AAClF,CAAC,CAAC"}
|
package/dist/view/util.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { Hooks } from 'snabbdom';
|
|
2
|
+
import { Translate } from '../interfaces';
|
|
3
|
+
import { Piece, Rank } from 'chessground/types';
|
|
2
4
|
export declare function bindMobileMousedown(el: HTMLElement, f: (e: Event) => unknown, redraw?: () => void): void;
|
|
3
5
|
export declare const bind: <E extends Event>(eventName: string, f: (e: E) => any, redraw?: () => void, passive?: boolean) => Hooks;
|
|
4
6
|
export declare function onInsert<A extends HTMLElement>(f: (element: A) => void): Hooks;
|
|
7
|
+
export declare const clockContent: (seconds: number | undefined) => string[];
|
|
8
|
+
export declare const formatSquareForScreenReader: (translate: Translate, file: string, rank: Rank, piece?: Piece) => string;
|
|
9
|
+
export declare const formatMoveForScreenReader: (san: string, nags?: number[], translate?: Translate) => string;
|
package/dist/view/util.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { glyphs } from './glyph';
|
|
1
2
|
export function bindMobileMousedown(el, f, redraw) {
|
|
2
3
|
for (const mousedownEvent of ['touchstart', 'mousedown']) {
|
|
3
4
|
el.addEventListener(mousedownEvent, e => {
|
|
@@ -20,4 +21,66 @@ export function onInsert(f) {
|
|
|
20
21
|
insert: vnode => f(vnode.elm),
|
|
21
22
|
};
|
|
22
23
|
}
|
|
24
|
+
export const clockContent = (seconds) => {
|
|
25
|
+
if (!seconds && seconds !== 0)
|
|
26
|
+
return ['-'];
|
|
27
|
+
const date = new Date(seconds * 1000), sep = ':', baseStr = pad2(date.getUTCMinutes()) + sep + pad2(date.getUTCSeconds());
|
|
28
|
+
return seconds >= 3600 ? [Math.floor(seconds / 3600) + sep + baseStr] : [baseStr];
|
|
29
|
+
};
|
|
30
|
+
const pad2 = (num) => (num < 10 ? '0' : '') + num;
|
|
31
|
+
export const formatSquareForScreenReader = (translate, file, rank, piece) => {
|
|
32
|
+
const square = `${file.toUpperCase()}${rank}`;
|
|
33
|
+
if (!piece)
|
|
34
|
+
return `${square} ${translate('aria.empty')}`;
|
|
35
|
+
const pieceName = translate(`aria.piece.${piece.role}`);
|
|
36
|
+
return `${square} ${translate(`aria.${piece.color}`)} ${pieceName}`;
|
|
37
|
+
};
|
|
38
|
+
export const formatMoveForScreenReader = (san, nags, translate) => {
|
|
39
|
+
let formatted = translate ? transSanToWords(san, translate) : san;
|
|
40
|
+
if (nags && nags.length > 0) {
|
|
41
|
+
const annotations = nags
|
|
42
|
+
.map(nag => { var _a; return (_a = glyphs[nag]) === null || _a === void 0 ? void 0 : _a.name; })
|
|
43
|
+
.filter(name => name)
|
|
44
|
+
.join(', ');
|
|
45
|
+
if (annotations) {
|
|
46
|
+
formatted += `, ${annotations}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return formatted;
|
|
50
|
+
};
|
|
51
|
+
const transSanToWords = (san, translate) => san
|
|
52
|
+
.split('')
|
|
53
|
+
.map(c => {
|
|
54
|
+
if (c === 'x')
|
|
55
|
+
return translate('san.takes');
|
|
56
|
+
if (c === '+')
|
|
57
|
+
return translate('san.check');
|
|
58
|
+
if (c === '#')
|
|
59
|
+
return translate('san.checkmate');
|
|
60
|
+
if (c === '=')
|
|
61
|
+
return translate('san.promotesTo');
|
|
62
|
+
if (c === '@')
|
|
63
|
+
return translate('san.droppedOn');
|
|
64
|
+
const code = c.charCodeAt(0);
|
|
65
|
+
if (code > 48 && code < 58)
|
|
66
|
+
return c; // 1-8
|
|
67
|
+
if (code > 96 && code < 105)
|
|
68
|
+
return c.toUpperCase(); // a-h
|
|
69
|
+
if (c === 'K')
|
|
70
|
+
return translate('aria.piece.king');
|
|
71
|
+
if (c === 'Q')
|
|
72
|
+
return translate('aria.piece.queen');
|
|
73
|
+
if (c === 'R')
|
|
74
|
+
return translate('aria.piece.rook');
|
|
75
|
+
if (c === 'B')
|
|
76
|
+
return translate('aria.piece.bishop');
|
|
77
|
+
if (c === 'N')
|
|
78
|
+
return translate('aria.piece.knight');
|
|
79
|
+
if (c === 'O')
|
|
80
|
+
return 'O'; // for castling
|
|
81
|
+
return c;
|
|
82
|
+
})
|
|
83
|
+
.join(' ')
|
|
84
|
+
.replace('O - O - O', translate('san.longCastling'))
|
|
85
|
+
.replace('O - O', translate('san.shortCastling'));
|
|
23
86
|
//# sourceMappingURL=util.js.map
|
package/dist/view/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/view/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/view/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lichess-org/pgn-viewer",
|
|
3
3
|
"license": "GPL-3.0-or-later",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.5.1",
|
|
5
|
+
"// version is managed by the build system": "",
|
|
5
6
|
"repository": "github:lichess-org/pgn-viewer",
|
|
6
7
|
"author": "Lichess Team <contact@lichess.org>",
|
|
7
8
|
"funding": "https://lichess.org/patron",
|
|
@@ -30,24 +31,22 @@
|
|
|
30
31
|
}
|
|
31
32
|
},
|
|
32
33
|
"dependencies": {
|
|
33
|
-
"@types/node": "^
|
|
34
|
+
"@types/node": "^24.3.1",
|
|
34
35
|
"chessground": "^9.2.1",
|
|
35
|
-
"chessops": "^0.
|
|
36
|
+
"chessops": "^0.15.0",
|
|
36
37
|
"snabbdom": "^3.5.1"
|
|
37
38
|
},
|
|
38
|
-
"//":
|
|
39
|
-
"snabbdom pinned to 3.5.1 until https://github.com/snabbdom/snabbdom/issues/1114 is resolved"
|
|
40
|
-
],
|
|
39
|
+
"// snabbdom pinned to 3.5.1 until https://github.com/snabbdom/snabbdom/issues/1114 is resolved": "",
|
|
41
40
|
"devDependencies": {
|
|
42
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
43
|
-
"@typescript-eslint/parser": "^8.
|
|
44
|
-
"esbuild": "^0.
|
|
45
|
-
"eslint": "^9.
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^8.42.0",
|
|
42
|
+
"@typescript-eslint/parser": "^8.42.0",
|
|
43
|
+
"esbuild": "^0.25.9",
|
|
44
|
+
"eslint": "^9.35.0",
|
|
46
45
|
"http-server": "^14.1.1",
|
|
47
|
-
"prettier": "^3.
|
|
48
|
-
"sass": "^1.
|
|
49
|
-
"typescript": "^5.
|
|
50
|
-
"vitest": "^2.
|
|
46
|
+
"prettier": "^3.6.2",
|
|
47
|
+
"sass": "^1.92.1",
|
|
48
|
+
"typescript": "^5.9.2",
|
|
49
|
+
"vitest": "^3.2.4"
|
|
51
50
|
},
|
|
52
51
|
"files": [
|
|
53
52
|
"demo/*",
|
package/scss/_side.scss
CHANGED
|
@@ -26,7 +26,16 @@
|
|
|
26
26
|
display: flex;
|
|
27
27
|
justify-content: flex-end;
|
|
28
28
|
}
|
|
29
|
-
move {
|
|
29
|
+
.move {
|
|
30
|
+
border: none;
|
|
31
|
+
background: transparent;
|
|
32
|
+
font-family: inherit;
|
|
33
|
+
font-size: inherit;
|
|
34
|
+
text-align: left;
|
|
35
|
+
margin: 0;
|
|
36
|
+
padding: 4px 0 6px 0;
|
|
37
|
+
outline: none;
|
|
38
|
+
color: inherit;
|
|
30
39
|
border-radius: 3px;
|
|
31
40
|
padding-left: 3%;
|
|
32
41
|
font-weight: bold;
|
|
@@ -83,7 +92,7 @@
|
|
|
83
92
|
}
|
|
84
93
|
}
|
|
85
94
|
}
|
|
86
|
-
> move {
|
|
95
|
+
> .move {
|
|
87
96
|
flex: 0 0 41%;
|
|
88
97
|
font-size: 1.1em;
|
|
89
98
|
}
|
|
@@ -121,7 +130,13 @@
|
|
|
121
130
|
+ variation {
|
|
122
131
|
border-top: none;
|
|
123
132
|
}
|
|
124
|
-
move {
|
|
133
|
+
.move {
|
|
134
|
+
border: none;
|
|
135
|
+
background: transparent;
|
|
136
|
+
font-family: inherit;
|
|
137
|
+
font-size: inherit;
|
|
138
|
+
margin: 0;
|
|
139
|
+
outline: none;
|
|
125
140
|
display: inline-block;
|
|
126
141
|
padding: 0.1em 0.2em;
|
|
127
142
|
min-width: 2.5ch;
|
|
@@ -133,7 +148,7 @@
|
|
|
133
148
|
index {
|
|
134
149
|
margin: 0;
|
|
135
150
|
padding: 0.1em 0;
|
|
136
|
-
+ move {
|
|
151
|
+
+ .move {
|
|
137
152
|
margin-left: 0.1em;
|
|
138
153
|
}
|
|
139
154
|
}
|
package/scss/_util.scss
CHANGED
package/src/interfaces.ts
CHANGED
|
@@ -9,8 +9,8 @@ export type San = string;
|
|
|
9
9
|
export type Uci = string;
|
|
10
10
|
export type Ply = number;
|
|
11
11
|
|
|
12
|
-
export type Translate = (key: string) => string
|
|
13
|
-
|
|
12
|
+
export type Translate = (key: string, ...args: string[]) => string;
|
|
13
|
+
export type Translator = (key: string) => string | undefined;
|
|
14
14
|
export type Clocks = {
|
|
15
15
|
white?: number;
|
|
16
16
|
black?: number;
|
package/src/pgnViewer.ts
CHANGED
|
@@ -14,6 +14,7 @@ export default class PgnViewer {
|
|
|
14
14
|
translate: Translate;
|
|
15
15
|
ground?: CgApi;
|
|
16
16
|
div?: HTMLElement;
|
|
17
|
+
menuButton?: HTMLElement;
|
|
17
18
|
flipped = false;
|
|
18
19
|
pane = 'board';
|
|
19
20
|
autoScrollRequested = false;
|
|
@@ -59,6 +60,11 @@ export default class PgnViewer {
|
|
|
59
60
|
toggleMenu = () => {
|
|
60
61
|
this.pane = this.pane == 'board' ? 'menu' : 'board';
|
|
61
62
|
this.redraw();
|
|
63
|
+
|
|
64
|
+
if (this.pane == 'board') {
|
|
65
|
+
// Menu has been closed - return focus to menu button
|
|
66
|
+
setTimeout(() => this.menuButton?.focus(), 0);
|
|
67
|
+
}
|
|
62
68
|
};
|
|
63
69
|
togglePgn = () => {
|
|
64
70
|
this.pane = this.pane == 'pgn' ? 'board' : 'pgn';
|