@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.
Files changed (52) hide show
  1. package/README.md +23 -0
  2. package/demo/frame.html +1 -1
  3. package/demo/index.html +1 -1
  4. package/demo/lichess-pgn-viewer.css +61 -28
  5. package/demo/lichess-pgn-viewer.js +697 -379
  6. package/demo/one.html +6 -6
  7. package/demo/one.js +1 -1
  8. package/dist/interfaces.d.ts +2 -1
  9. package/dist/lichess-pgn-viewer.css +1 -1
  10. package/dist/lichess-pgn-viewer.min.js +4 -4
  11. package/dist/pgnViewer.d.ts +1 -0
  12. package/dist/pgnViewer.js +4 -0
  13. package/dist/pgnViewer.js.map +1 -1
  14. package/dist/translation.d.ts +2 -2
  15. package/dist/translation.js +51 -3
  16. package/dist/translation.js.map +1 -1
  17. package/dist/tsconfig.tsbuildinfo +1 -1
  18. package/dist/view/accessibleBoard.d.ts +3 -0
  19. package/dist/view/accessibleBoard.js +40 -0
  20. package/dist/view/accessibleBoard.js.map +1 -0
  21. package/dist/view/aria.d.ts +10 -0
  22. package/dist/view/aria.js +54 -0
  23. package/dist/view/aria.js.map +1 -0
  24. package/dist/view/glyph.d.ts +9 -0
  25. package/dist/view/glyph.js +1 -1
  26. package/dist/view/glyph.js.map +1 -1
  27. package/dist/view/main.js +9 -0
  28. package/dist/view/main.js.map +1 -1
  29. package/dist/view/menu.d.ts +3 -2
  30. package/dist/view/menu.js +76 -11
  31. package/dist/view/menu.js.map +1 -1
  32. package/dist/view/player.js +15 -10
  33. package/dist/view/player.js.map +1 -1
  34. package/dist/view/side.js +29 -14
  35. package/dist/view/side.js.map +1 -1
  36. package/dist/view/util.d.ts +5 -0
  37. package/dist/view/util.js +63 -0
  38. package/dist/view/util.js.map +1 -1
  39. package/package.json +13 -14
  40. package/scss/_side.scss +19 -4
  41. package/scss/_util.scss +10 -0
  42. package/src/interfaces.ts +2 -2
  43. package/src/pgnViewer.ts +6 -0
  44. package/src/translation.ts +53 -4
  45. package/src/view/accessibleBoard.ts +61 -0
  46. package/src/view/aria.ts +68 -0
  47. package/src/view/glyph.ts +1 -1
  48. package/src/view/main.ts +13 -0
  49. package/src/view/menu.ts +139 -61
  50. package/src/view/player.ts +19 -13
  51. package/src/view/side.ts +40 -16
  52. 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
- ((_a = ctrl.opts.menu.analysisBoard) === null || _a === void 0 ? void 0 : _a.enabled)
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
- ((_b = ctrl.opts.menu.practiceWithComputer) === null || _b === void 0 ? void 0 : _b.enabled)
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
- }, ctrl.translate(ctrl.game.metadata.isLichess ? 'viewOnLichess' : 'viewOnSite')));
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: bind('click', ctrl.toggleMenu),
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) => h(`button.lpv__controls__goto.lpv__controls__goto--${to}.lpv__fbt.lpv__icon.lpv__icon-${icon}`, {
58
- class: { disabled: ctrl.pane == 'board' && !ctrl.canGoTo(to) },
59
- hook: onInsert(el => bindMobileMousedown(el, e => eventRepeater(() => ctrl.goTo(to), e))),
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
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/view/menu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/view/menu.ts"],"names":[],"mappings":"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"}
@@ -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', { attrs: { href: `${ctrl.opts.lichess}/@/${player.name}` } }, personEls)
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', { class: { active: color == move.turn } }, clockContent(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
@@ -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;AAGpC,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;YAClB,CAAC,CAAC,CAAC,CACC,sCAAsC,EACtC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAC5D,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,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,OAA2B,EAAY,EAAE;IAC7D,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EACnC,GAAG,GAAG,GAAG,EACT,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1E,OAAO,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,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('mousedown', e => {
12
- const path = e.target.getAttribute('p');
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 != '*' ? [h('comment.result', ctrl.game.metadata.result)] : [];
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', [...node.data.startingComments.map(commentNode), ...makeVariationMoves(moveDom, node)]);
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
- p: move.path.path,
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) => {
@@ -1 +1 @@
1
- {"version":3,"file":"side.js","sourceRoot":"","sources":["../../src/view/side.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"side.js","sourceRoot":"","sources":["../../src/view/side.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/view/util.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,EAAe,EAAE,CAAwB,EAAE,MAAmB;IAChG,KAAK,MAAM,cAAc,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QACzD,EAAE,CAAC,gBAAgB,CACjB,cAAc,EACd,CAAC,CAAC,EAAE;YACF,CAAC,CAAC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,MAAM;gBAAE,MAAM,EAAE,CAAC;QACvB,CAAC,EACD,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,SAAiB,EACjB,CAAgB,EAChB,MAAmB,EACnB,OAAO,GAAG,IAAI,EACP,EAAE,CACT,QAAQ,CAAC,EAAE,CAAC,EAAE,CACZ,EAAE,CAAC,gBAAgB,CACjB,SAAS,EACT,CAAC,CAAC,EAAE;IACF,MAAM,GAAG,GAAG,CAAC,CAAC,CAAM,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,KAAK;QAAE,CAAC,CAAC,cAAc,EAAE,CAAC;IACtC,MAAM,aAAN,MAAM,uBAAN,MAAM,EAAI,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC,EACD,EAAE,OAAO,EAAE,CACZ,CACF,CAAC;AAEJ,MAAM,UAAU,QAAQ,CAAwB,CAAuB;IACrE,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAQ,CAAC;KACnC,CAAC;AACJ,CAAC"}
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.7",
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": "^22.13.4",
34
+ "@types/node": "^24.3.1",
34
35
  "chessground": "^9.2.1",
35
- "chessops": "^0.14.2",
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.24.1",
43
- "@typescript-eslint/parser": "^8.24.1",
44
- "esbuild": "^0.24.2",
45
- "eslint": "^9.20.1",
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.5.1",
48
- "sass": "^1.85.0",
49
- "typescript": "^5.7.3",
50
- "vitest": "^2.1.9"
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
@@ -5,3 +5,13 @@
5
5
  padding-bottom: 100%;
6
6
  width: 100%;
7
7
  }
8
+
9
+ .lpv__sr-only {
10
+ position: absolute;
11
+ left: -10000px;
12
+ width: 1px;
13
+ height: 1px;
14
+ overflow: hidden;
15
+ clip-path: inset(50%);
16
+ white-space: nowrap;
17
+ }
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 | undefined;
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';