From 9d65c86d90b832ca33ba4c3435b16480f0b03041 Mon Sep 17 00:00:00 2001 From: Jonathan Gamble Date: Sun, 11 Jun 2023 09:18:00 -0500 Subject: [PATCH 1/5] enable voice/keyboard move from puzzles --- ui/board/css/_menu.scss | 3 +++ ui/common/src/common.ts | 2 +- ui/common/src/controls.ts | 8 ++++++++ ui/puzzle/src/ctrl.ts | 1 + ui/puzzle/src/view/boardMenu.ts | 5 +++-- ui/round/src/ctrl.ts | 10 ---------- ui/round/src/view/boardMenu.ts | 5 +++-- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/ui/board/css/_menu.scss b/ui/board/css/_menu.scss index 6dcb0c0b46cc..2ac55ca1f954 100644 --- a/ui/board/css/_menu.scss +++ b/ui/board/css/_menu.scss @@ -1,5 +1,8 @@ .board-menu { @extend %flex-column, %dropdown-shadow; + @if $theme == 'transp' { + backdrop-filter: blur(6px); + } position: absolute; z-index: z(mz-menu); min-width: 100%; diff --git a/ui/common/src/common.ts b/ui/common/src/common.ts index bf0710924036..71a31ce33d45 100644 --- a/ui/common/src/common.ts +++ b/ui/common/src/common.ts @@ -72,5 +72,5 @@ export const scrollTo = (el: HTMLElement, target: HTMLElement | null) => { export const onClickAway = (f: () => void) => (el: HTMLElement) => { const listen: () => void = () => $(document).one('click', e => (el.contains(e.target) ? listen() : f())); - setTimeout(listen, 100); + setTimeout(listen, 300); }; diff --git a/ui/common/src/controls.ts b/ui/common/src/controls.ts index 2de0a11eef1b..19be173bd985 100644 --- a/ui/common/src/controls.ts +++ b/ui/common/src/controls.ts @@ -1,5 +1,7 @@ import { h, Hooks } from 'snabbdom'; import { bind, onInsert } from './snabbdom'; +import { toggle as baseToggle } from './common'; +import * as xhr from './xhr'; export interface ToggleSettings { name: string; @@ -43,3 +45,9 @@ export const rangeConfig = (read: () => number, write: (value: number) => void): el.addEventListener('input', _ => write(parseInt(el.value))); el.addEventListener('mouseout', _ => el.blur()); }); + +export const boolPrefXhrToggle = (prefKey: string, val: boolean, redraw?: () => void) => + baseToggle(val, async v => { + await xhr.text(`/pref/${prefKey}`, { method: 'post', body: xhr.form({ [prefKey]: v ? '1' : '0' }) }); + redraw ? redraw() : lichess.reload(); + }); diff --git a/ui/puzzle/src/ctrl.ts b/ui/puzzle/src/ctrl.ts index 5b3f56757bba..4b8e48fd2f42 100644 --- a/ui/puzzle/src/ctrl.ts +++ b/ui/puzzle/src/ctrl.ts @@ -51,6 +51,7 @@ export default function (opts: PuzzleOpts, redraw: Redraw): Controller { streakFailStorage.listen(_ => failStreak(streak)); } const session = new PuzzleSession(opts.data.angle.key, opts.data.user?.id, hasStreak); + const menu = boardMenuToggle(redraw); // required by ceval diff --git a/ui/puzzle/src/view/boardMenu.ts b/ui/puzzle/src/view/boardMenu.ts index 7f8ce4b392b4..8dab1b648d09 100644 --- a/ui/puzzle/src/view/boardMenu.ts +++ b/ui/puzzle/src/view/boardMenu.ts @@ -1,14 +1,15 @@ import { h } from 'snabbdom'; import { menu as menuDropdown } from 'board/menu'; import { Controller } from '../interfaces'; +import { boolPrefXhrToggle } from 'common/controls'; export default function (ctrl: Controller) { return menuDropdown(ctrl.trans, ctrl.redraw, ctrl.menu, menu => [ h('section', [menu.flip(ctrl.trans.noarg('flipBoard'), ctrl.flipped(), ctrl.flip)]), h('section', [ menu.zenMode(true), - // menu.voiceInput(ctrl.voiceMoveEnabled, !spectator), - // menu.keyboardInput(ctrl.keyboardMoveEnabled, !spectator), + menu.voiceInput(boolPrefXhrToggle('voice', !!ctrl.voiceMove), true), + menu.keyboardInput(boolPrefXhrToggle('keyboardMove', !!ctrl.keyboardMove), true), ]), h('section.board-menu__links', [ h('a', { attrs: { target: '_blank', href: '/account/preferences/display' } }, 'Game display preferences'), diff --git a/ui/round/src/ctrl.ts b/ui/round/src/ctrl.ts index b02daf5b24ec..af349197be51 100644 --- a/ui/round/src/ctrl.ts +++ b/ui/round/src/ctrl.ts @@ -75,8 +75,6 @@ export default class RoundController { firstSeconds = true; flip = false; menu: ToggleWithUsed; - voiceMoveEnabled: Toggle; - keyboardMoveEnabled: Toggle; confirmMoveEnabled: Toggle = toggle(true); loading = false; loadingTimeout: number; @@ -144,14 +142,6 @@ export default class RoundController { this.transientMove = new TransientMove(this.socket); this.menu = boardMenuToggle(redraw); - this.voiceMoveEnabled = toggle(d.pref.voiceMove, async v => { - await xhr.setPreference('voice', v ? '1' : '0'); - lichess.reload(); - }); - this.keyboardMoveEnabled = toggle(d.pref.keyboardMove, async v => { - await xhr.setPreference('keyboardMove', v ? '1' : '0'); - lichess.reload(); - }); this.trans = lichess.trans(opts.i18n); this.noarg = this.trans.noarg; diff --git a/ui/round/src/view/boardMenu.ts b/ui/round/src/view/boardMenu.ts index f7cbfc5ac580..543eef36e374 100644 --- a/ui/round/src/view/boardMenu.ts +++ b/ui/round/src/view/boardMenu.ts @@ -2,6 +2,7 @@ import { h } from 'snabbdom'; import RoundController from '../ctrl'; import { game as gameRoute } from 'game/router'; import { menu as menuDropdown } from 'board/menu'; +import { boolPrefXhrToggle } from 'common/controls'; export default function (ctrl: RoundController) { return menuDropdown(ctrl.trans, ctrl.redraw, ctrl.menu, menu => { @@ -17,8 +18,8 @@ export default function (ctrl: RoundController) { ]), h('section', [ menu.zenMode(!spectator), - menu.voiceInput(ctrl.voiceMoveEnabled, !spectator), - menu.keyboardInput(ctrl.keyboardMoveEnabled, !spectator), + menu.voiceInput(boolPrefXhrToggle('voice', !!ctrl.voiceMove), !spectator), + menu.keyboardInput(boolPrefXhrToggle('voice', !!ctrl.keyboardMove), !spectator), !spectator && d.pref.submitMove ? menu.confirmMove(ctrl.confirmMoveEnabled) : undefined, ]), h('section.board-menu__links', [ From 5756e523af89413fe1cf8edbb50df5b0aa94fbb1 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sun, 11 Jun 2023 19:08:25 +0200 Subject: [PATCH 2/5] make it more obvious that boolPrefXhrToggle reloads the page by default --- ui/common/src/controls.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/common/src/controls.ts b/ui/common/src/controls.ts index 19be173bd985..2f7b597c0cc4 100644 --- a/ui/common/src/controls.ts +++ b/ui/common/src/controls.ts @@ -46,8 +46,8 @@ export const rangeConfig = (read: () => number, write: (value: number) => void): el.addEventListener('mouseout', _ => el.blur()); }); -export const boolPrefXhrToggle = (prefKey: string, val: boolean, redraw?: () => void) => +export const boolPrefXhrToggle = (prefKey: string, val: boolean, effect: () => void = lichess.reload) => baseToggle(val, async v => { await xhr.text(`/pref/${prefKey}`, { method: 'post', body: xhr.form({ [prefKey]: v ? '1' : '0' }) }); - redraw ? redraw() : lichess.reload(); + effect(); }); From 5336834a0499ff28347d40a3284396d9854cf5d3 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sun, 11 Jun 2023 19:10:50 +0200 Subject: [PATCH 3/5] fix round board menu keyboardMove toggle --- ui/round/src/view/boardMenu.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/round/src/view/boardMenu.ts b/ui/round/src/view/boardMenu.ts index 543eef36e374..f577ba0f5a29 100644 --- a/ui/round/src/view/boardMenu.ts +++ b/ui/round/src/view/boardMenu.ts @@ -19,7 +19,7 @@ export default function (ctrl: RoundController) { h('section', [ menu.zenMode(!spectator), menu.voiceInput(boolPrefXhrToggle('voice', !!ctrl.voiceMove), !spectator), - menu.keyboardInput(boolPrefXhrToggle('voice', !!ctrl.keyboardMove), !spectator), + menu.keyboardInput(boolPrefXhrToggle('keyboardMove', !!ctrl.keyboardMove), !spectator), !spectator && d.pref.submitMove ? menu.confirmMove(ctrl.confirmMoveEnabled) : undefined, ]), h('section.board-menu__links', [ From fa45acbc56b49b68e5aae20a7a11af73773183cc Mon Sep 17 00:00:00 2001 From: Jonathan Gamble <101470903+schlawg@users.noreply.github.com> Date: Sun, 11 Jun 2023 13:26:14 -0500 Subject: [PATCH 4/5] fix glaring timer bug --- ui/voice/src/move/moveCtrl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/voice/src/move/moveCtrl.ts b/ui/voice/src/move/moveCtrl.ts index 61caef7360d8..0059a52ce0c6 100644 --- a/ui/voice/src/move/moveCtrl.ts +++ b/ui/voice/src/move/moveCtrl.ts @@ -307,7 +307,7 @@ export default (window as any).LichessVoiceMove = function ( } choices = new Map(); - const preferred = options.length === 1 || options[0][1] < options[1][1]; + const preferred = options.length === 1 || options[0][1].cost < options[1][1].cost; if (preferred) choices.set('yes', options[0][0]); if (colorsPref()) { const colorNames = [...brushes.keys()]; From 915eeec9dff4a3358a3c254e7793cbb5b9ec1e99 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Mon, 12 Jun 2023 07:10:42 +0200 Subject: [PATCH 5/5] New Crowdin updates (#12994) * New translations: site.xml (German) * New translations: site.xml (Japanese) --- translation/dest/site/de-DE.xml | 8 ++++---- translation/dest/site/ja-JP.xml | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/translation/dest/site/de-DE.xml b/translation/dest/site/de-DE.xml index 47d5aa8d5135..05840c35895c 100644 --- a/translation/dest/site/de-DE.xml +++ b/translation/dest/site/de-DE.xml @@ -683,11 +683,11 @@ zum Anfang/Ende zeige/verberge Kommentare Variante wählen/verlassen - Fordere eine Computer-Analyse an, lerne aus deinen Fehlern + Hole dir eine Computer-Analyse, lerne aus deinen Fehlern Als Nächstes (Lerne aus deinen Fehlern) - Nächster grober Patzer - Nächster Fehler - Nächste Ungenauigkeit + Der nächste schwere Fehler + Der nächste Fehler + Die nächste Ungenauigkeit Neues Turnier Schachturnier mit verschiedenen Zeitkontrollen und Schachvarianten Spiele rasante Turniere! Trete einem geplanten Turnier bei oder erstelle ein neues. Bullet, Blitz, Klassisch, Chess960, King of the Hill, Threecheck und weitere Schachvarianten für grenzenlosen Spaß. diff --git a/translation/dest/site/ja-JP.xml b/translation/dest/site/ja-JP.xml index 10b0dd7e439e..82769ff86e96 100644 --- a/translation/dest/site/ja-JP.xml +++ b/translation/dest/site/ja-JP.xml @@ -97,6 +97,7 @@ オープニング探索 序盤/終盤エクスプローラー %s オープニング探索 + 序盤/終盤エクスプローラーの最初の手を指す 勝勢ながら 50 手ルールでドロー 敗勢ながら 50 手ルールでドロー 勝ち、または以前の悪手のため50手ドロー @@ -646,6 +647,11 @@ 最初/最後に戻る コメントを表示する/隠す 変化に入る/出る + コンピュータ解析の要請、自分の悪手に学ぶ + 次(自分の悪手に学ぶ) + 次の大悪手 + 次の悪手 + 次のやや悪手 新しいトーナメント さまざまな持時間とルールのチェストーナメント 早指しのチェストーナメントに参加しよう! 定時のトーナメントに参加するほか、自分で作ることもできます。ブレット、ブリッツ、クラシック、チェス960、キングオブザヒル、3チェックなどチェスの無限の楽しみを。 @@ -741,6 +747,7 @@ 無効な FEN 自由設定 通知 + 通知:%1$s レーティング: %s あと %s 秒以内に初手を指してください