From ba650ee339aea60cc34925e12fa110392e26182d Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Thu, 8 Jan 2015 13:03:45 +0100 Subject: [PATCH] moar progress on opening trainer, with score perf --- app/views/opening/JsData.scala | 4 +- app/views/opening/layout.scala.html | 1 + app/views/opening/show.scala.html | 8 ++- app/views/user/show.scala.html | 8 +++ conf/messages | 4 ++ modules/i18n/src/main/I18nKeys.scala | 6 ++- modules/opening/src/main/Finisher.scala | 7 ++- modules/opening/src/main/Opening.scala | 2 +- modules/opening/src/main/UserInfos.scala | 2 +- public/font28/fonts/lichess.woff | Bin 13092 -> 0 bytes public/{font28 => font29}/fonts/lichess.eot | Bin 18148 -> 19100 bytes public/{font28 => font29}/fonts/lichess.svg | 3 ++ public/{font28 => font29}/fonts/lichess.ttf | Bin 17984 -> 18936 bytes public/font29/fonts/lichess.woff | Bin 0 -> 13756 bytes .../{font28 => font29}/icons-reference.html | 24 +++++++++ public/{font28 => font29}/styles.css | 9 ++++ public/stylesheets/common.css | 4 +- public/stylesheets/dark.css | 3 -- public/stylesheets/opening.css | 31 +++++++++--- ui/opening/src/ctrl.js | 47 ++++++++++++++---- ui/opening/src/view.js | 46 ++++++++++++++--- ui/opening/src/xhr.js | 2 +- 22 files changed, 174 insertions(+), 37 deletions(-) delete mode 100644 public/font28/fonts/lichess.woff rename public/{font28 => font29}/fonts/lichess.eot (86%) rename public/{font28 => font29}/fonts/lichess.svg (94%) rename public/{font28 => font29}/fonts/lichess.ttf (86%) create mode 100644 public/font29/fonts/lichess.woff rename public/{font28 => font29}/icons-reference.html (97%) rename public/{font28 => font29}/styles.css (97%) diff --git a/app/views/opening/JsData.scala b/app/views/opening/JsData.scala index 4accd37503..25ddf08560 100644 --- a/app/views/opening/JsData.scala +++ b/app/views/opening/JsData.scala @@ -17,13 +17,15 @@ object JsData extends lila.Steroids { Html(Json.stringify(Json.obj( "opening" -> Json.obj( "id" -> opening.id, + "score" -> opening.score.toInt, "attempts" -> opening.attempts, "goal" -> opening.goal, "fen" -> opening.fen, "color" -> opening.color.name, "moves" -> JsArray(opening.qualityMoves.map { case QualityMove(move, quality) => Json.obj( - "first" -> move.first, + "uci" -> move.first, + "san" -> move.line.headOption, "cp" -> move.cp, "line" -> move.line.mkString(" "), "quality" -> quality.name) diff --git a/app/views/opening/layout.scala.html b/app/views/opening/layout.scala.html index e9e3714608..f3d8da2e30 100644 --- a/app/views/opening/layout.scala.html +++ b/app/views/opening/layout.scala.html @@ -7,6 +7,7 @@ } @moreJs = { +@jsTag("vendor/sparkline.min.js") @jsAt(s"compiled/lichess.opening${isProd??(".min")}.js") @evenMoreJs } diff --git a/app/views/opening/show.scala.html b/app/views/opening/show.scala.html index c67bddb2d6..e523393268 100644 --- a/app/views/opening/show.scala.html +++ b/app/views/opening/show.scala.html @@ -14,7 +14,13 @@ trans.toTrackYourProgress, trans.signUp, trans.trainingSignupExplanation, trans.giveUp, -trans.continueTraining +trans.yourTurn, +trans.continueTraining, +trans.openingId, +trans.scoreX, +trans.playedXTimes, +trans.yourOpeningScoreX, +trans.findNbStrongMoves ))) ); } diff --git a/app/views/user/show.scala.html b/app/views/user/show.scala.html index 94e7b65804..a00d113dc0 100644 --- a/app/views/user/show.scala.html +++ b/app/views/user/show.scala.html @@ -48,6 +48,14 @@
} @showPerf(u.perfs.puzzle, PerfType.Puzzle) +
+

OPENING TRAINER

+
+ @u.perfs.opening.averageScore.getOrElse("?") + / @u.perfs.opening.nb.localize Openings + @showProgress(u.perfs.opening.progress) +
+
} diff --git a/conf/messages b/conf/messages index 063d553e70..6929670380 100644 --- a/conf/messages +++ b/conf/messages @@ -309,3 +309,7 @@ youHaveNbSecondsToMakeYourFirstMove=You have %s seconds to make your first move! nbGamesInPlay=%s games in play automaticallyProceedToNextGameAfterMoving=Automatically proceed to next game after moving autoSwitch=Auto switch +openingId=Opening %s +scoreX=Score: %s +yourOpeningScoreX=Your opening score: %s +findNbStrongMoves=Find %s strong moves diff --git a/modules/i18n/src/main/I18nKeys.scala b/modules/i18n/src/main/I18nKeys.scala index e17676a70d..d094d30593 100644 --- a/modules/i18n/src/main/I18nKeys.scala +++ b/modules/i18n/src/main/I18nKeys.scala @@ -333,8 +333,12 @@ final class I18nKeys(translator: Translator) { val `nbGamesInPlay` = new Key("nbGamesInPlay") val `automaticallyProceedToNextGameAfterMoving` = new Key("automaticallyProceedToNextGameAfterMoving") val `autoSwitch` = new Key("autoSwitch") + val `openingId` = new Key("openingId") + val `scoreX` = new Key("scoreX") + val `yourOpeningScoreX` = new Key("yourOpeningScoreX") + val `findNbStrongMoves` = new Key("findNbStrongMoves") - def keys = List(`playWithAFriend`, `playWithTheMachine`, `toInviteSomeoneToPlayGiveThisUrl`, `gameOver`, `waitingForOpponent`, `waiting`, `yourTurn`, `aiNameLevelAiLevel`, `level`, `toggleTheChat`, `toggleSound`, `chat`, `resign`, `checkmate`, `stalemate`, `white`, `black`, `randomColor`, `createAGame`, `whiteIsVictorious`, `blackIsVictorious`, `playWithTheSameOpponentAgain`, `newOpponent`, `playWithAnotherOpponent`, `yourOpponentWantsToPlayANewGameWithYou`, `joinTheGame`, `whitePlays`, `blackPlays`, `theOtherPlayerHasLeftTheGameYouCanForceResignationOrWaitForHim`, `makeYourOpponentResign`, `forceResignation`, `forceDraw`, `talkInChat`, `theFirstPersonToComeOnThisUrlWillPlayWithYou`, `whiteCreatesTheGame`, `blackCreatesTheGame`, `whiteJoinsTheGame`, `blackJoinsTheGame`, `whiteResigned`, `blackResigned`, `whiteLeftTheGame`, `blackLeftTheGame`, `shareThisUrlToLetSpectatorsSeeTheGame`, `youAreViewingThisGameAsASpectator`, `replayAndAnalyse`, `computerAnalysisInProgress`, `theComputerAnalysisHasFailed`, `viewTheComputerAnalysis`, `requestAComputerAnalysis`, `computerAnalysis`, `analysis`, `blunders`, `mistakes`, `inaccuracies`, `moveTimes`, `flipBoard`, `threefoldRepetition`, `claimADraw`, `offerDraw`, `draw`, `nbConnectedPlayers`, `gamesBeingPlayedRightNow`, `viewAllNbGames`, `viewNbCheckmates`, `nbBookmarks`, `nbPopularGames`, `nbAnalysedGames`, `bookmarkedByNbPlayers`, `viewInFullSize`, `logOut`, `signIn`, `newToLichess`, `youNeedAnAccountToDoThat`, `signUp`, `computersAreNotAllowedToPlay`, `games`, `forum`, `xPostedInForumY`, `latestForumPosts`, `players`, `minutesPerSide`, `variant`, `timeControl`, `realTime`, `correspondence`, `daysPerTurn`, `oneDay`, `nbDays`, `nbHours`, `time`, `rating`, `username`, `password`, `haveAnAccount`, `allYouNeedIsAUsernameAndAPassword`, `changePassword`, `changeEmail`, `email`, `emailIsOptional`, `passwordReset`, `forgotPassword`, `learnMoreAboutLichess`, `rank`, `gamesPlayed`, `nbGamesWithYou`, `declineInvitation`, `cancel`, `timeOut`, `drawOfferSent`, `drawOfferDeclined`, `drawOfferAccepted`, `drawOfferCanceled`, `whiteOffersDraw`, `blackOffersDraw`, `whiteDeclinesDraw`, `blackDeclinesDraw`, `yourOpponentOffersADraw`, `accept`, `decline`, `playingRightNow`, `finished`, `abortGame`, `gameAborted`, `standard`, `unlimited`, `mode`, `casual`, `rated`, `thisGameIsRated`, `rematch`, `rematchOfferSent`, `rematchOfferAccepted`, `rematchOfferCanceled`, `rematchOfferDeclined`, `cancelRematchOffer`, `viewRematch`, `play`, `inbox`, `chatRoom`, `spectatorRoom`, `composeMessage`, `noNewMessages`, `subject`, `recipient`, `send`, `incrementInSeconds`, `freeOnlineChess`, `spectators`, `nbWins`, `nbLosses`, `nbDraws`, `exportGames`, `ratingRange`, `giveNbSeconds`, `premoveEnabledClickAnywhereToCancel`, `thisPlayerUsesChessComputerAssistance`, `opening`, `takeback`, `proposeATakeback`, `takebackPropositionSent`, `takebackPropositionDeclined`, `takebackPropositionAccepted`, `takebackPropositionCanceled`, `yourOpponentProposesATakeback`, `bookmarkThisGame`, `search`, `advancedSearch`, `tournament`, `tournaments`, `tournamentPoints`, `viewTournament`, `backToTournament`, `backToGame`, `freeOnlineChessGamePlayChessNowInACleanInterfaceNoRegistrationNoAdsNoPluginRequiredPlayChessWithComputerFriendsOrRandomOpponents`, `teams`, `nbMembers`, `allTeams`, `newTeam`, `myTeams`, `noTeamFound`, `joinTeam`, `quitTeam`, `anyoneCanJoin`, `aConfirmationIsRequiredToJoin`, `joiningPolicy`, `teamLeader`, `teamBestPlayers`, `teamRecentMembers`, `xJoinedTeamY`, `xCreatedTeamY`, `averageElo`, `location`, `settings`, `filterGames`, `reset`, `apply`, `leaderboard`, `pasteTheFenStringHere`, `pasteThePgnStringHere`, `fromPosition`, `continueFromHere`, `importGame`, `nbImportedGames`, `thisIsAChessCaptcha`, `clickOnTheBoardToMakeYourMove`, `notACheckmate`, `colorPlaysCheckmateInOne`, `retry`, `reconnecting`, `onlineFriends`, `noFriendsOnline`, `findFriends`, `favoriteOpponents`, `follow`, `following`, `unfollow`, `block`, `blocked`, `unblock`, `followsYou`, `xStartedFollowingY`, `nbFollowers`, `nbFollowing`, `more`, `memberSince`, `lastLogin`, `challengeToPlay`, `player`, `list`, `graph`, `lessThanNbMinutes`, `xToYMinutes`, `textIsTooShort`, `textIsTooLong`, `required`, `openTournaments`, `duration`, `winner`, `standing`, `createANewTournament`, `join`, `withdraw`, `points`, `wins`, `losses`, `winStreak`, `createdBy`, `waitingForNbPlayers`, `tournamentIsStarting`, `membersOnly`, `boardEditor`, `startPosition`, `clearBoard`, `savePosition`, `loadPosition`, `isPrivate`, `reportXToModerators`, `profile`, `editProfile`, `firstName`, `lastName`, `biography`, `country`, `preferences`, `watchLichessTV`, `previouslyOnLichessTV`, `todaysLeaders`, `onlinePlayers`, `progressToday`, `progressThisWeek`, `progressThisMonth`, `leaderboardThisWeek`, `leaderboardThisMonth`, `activeToday`, `activeThisWeek`, `activePlayers`, `bewareTheGameIsRatedButHasNoClock`, `training`, `yourPuzzleRatingX`, `findTheBestMoveForWhite`, `findTheBestMoveForBlack`, `toTrackYourProgress`, `trainingSignupExplanation`, `recentlyPlayedPuzzles`, `puzzleId`, `puzzleOfTheDay`, `clickToSolve`, `goodMove`, `butYouCanDoBetter`, `bestMove`, `keepGoing`, `puzzleFailed`, `butYouCanKeepTrying`, `victory`, `giveUp`, `puzzleSolvedInXSeconds`, `wasThisPuzzleAnyGood`, `pleaseVotePuzzle`, `thankYou`, `ratingX`, `playedXTimes`, `fromGameLink`, `startTraining`, `continueTraining`, `retryThisPuzzle`, `thisPuzzleIsCorrect`, `thisPuzzleIsWrong`, `youHaveNbSecondsToMakeYourFirstMove`, `nbGamesInPlay`, `automaticallyProceedToNextGameAfterMoving`, `autoSwitch`) + def keys = List(`playWithAFriend`, `playWithTheMachine`, `toInviteSomeoneToPlayGiveThisUrl`, `gameOver`, `waitingForOpponent`, `waiting`, `yourTurn`, `aiNameLevelAiLevel`, `level`, `toggleTheChat`, `toggleSound`, `chat`, `resign`, `checkmate`, `stalemate`, `white`, `black`, `randomColor`, `createAGame`, `whiteIsVictorious`, `blackIsVictorious`, `playWithTheSameOpponentAgain`, `newOpponent`, `playWithAnotherOpponent`, `yourOpponentWantsToPlayANewGameWithYou`, `joinTheGame`, `whitePlays`, `blackPlays`, `theOtherPlayerHasLeftTheGameYouCanForceResignationOrWaitForHim`, `makeYourOpponentResign`, `forceResignation`, `forceDraw`, `talkInChat`, `theFirstPersonToComeOnThisUrlWillPlayWithYou`, `whiteCreatesTheGame`, `blackCreatesTheGame`, `whiteJoinsTheGame`, `blackJoinsTheGame`, `whiteResigned`, `blackResigned`, `whiteLeftTheGame`, `blackLeftTheGame`, `shareThisUrlToLetSpectatorsSeeTheGame`, `youAreViewingThisGameAsASpectator`, `replayAndAnalyse`, `computerAnalysisInProgress`, `theComputerAnalysisHasFailed`, `viewTheComputerAnalysis`, `requestAComputerAnalysis`, `computerAnalysis`, `analysis`, `blunders`, `mistakes`, `inaccuracies`, `moveTimes`, `flipBoard`, `threefoldRepetition`, `claimADraw`, `offerDraw`, `draw`, `nbConnectedPlayers`, `gamesBeingPlayedRightNow`, `viewAllNbGames`, `viewNbCheckmates`, `nbBookmarks`, `nbPopularGames`, `nbAnalysedGames`, `bookmarkedByNbPlayers`, `viewInFullSize`, `logOut`, `signIn`, `newToLichess`, `youNeedAnAccountToDoThat`, `signUp`, `computersAreNotAllowedToPlay`, `games`, `forum`, `xPostedInForumY`, `latestForumPosts`, `players`, `minutesPerSide`, `variant`, `timeControl`, `realTime`, `correspondence`, `daysPerTurn`, `oneDay`, `nbDays`, `nbHours`, `time`, `rating`, `username`, `password`, `haveAnAccount`, `allYouNeedIsAUsernameAndAPassword`, `changePassword`, `changeEmail`, `email`, `emailIsOptional`, `passwordReset`, `forgotPassword`, `learnMoreAboutLichess`, `rank`, `gamesPlayed`, `nbGamesWithYou`, `declineInvitation`, `cancel`, `timeOut`, `drawOfferSent`, `drawOfferDeclined`, `drawOfferAccepted`, `drawOfferCanceled`, `whiteOffersDraw`, `blackOffersDraw`, `whiteDeclinesDraw`, `blackDeclinesDraw`, `yourOpponentOffersADraw`, `accept`, `decline`, `playingRightNow`, `finished`, `abortGame`, `gameAborted`, `standard`, `unlimited`, `mode`, `casual`, `rated`, `thisGameIsRated`, `rematch`, `rematchOfferSent`, `rematchOfferAccepted`, `rematchOfferCanceled`, `rematchOfferDeclined`, `cancelRematchOffer`, `viewRematch`, `play`, `inbox`, `chatRoom`, `spectatorRoom`, `composeMessage`, `noNewMessages`, `subject`, `recipient`, `send`, `incrementInSeconds`, `freeOnlineChess`, `spectators`, `nbWins`, `nbLosses`, `nbDraws`, `exportGames`, `ratingRange`, `giveNbSeconds`, `premoveEnabledClickAnywhereToCancel`, `thisPlayerUsesChessComputerAssistance`, `opening`, `takeback`, `proposeATakeback`, `takebackPropositionSent`, `takebackPropositionDeclined`, `takebackPropositionAccepted`, `takebackPropositionCanceled`, `yourOpponentProposesATakeback`, `bookmarkThisGame`, `search`, `advancedSearch`, `tournament`, `tournaments`, `tournamentPoints`, `viewTournament`, `backToTournament`, `backToGame`, `freeOnlineChessGamePlayChessNowInACleanInterfaceNoRegistrationNoAdsNoPluginRequiredPlayChessWithComputerFriendsOrRandomOpponents`, `teams`, `nbMembers`, `allTeams`, `newTeam`, `myTeams`, `noTeamFound`, `joinTeam`, `quitTeam`, `anyoneCanJoin`, `aConfirmationIsRequiredToJoin`, `joiningPolicy`, `teamLeader`, `teamBestPlayers`, `teamRecentMembers`, `xJoinedTeamY`, `xCreatedTeamY`, `averageElo`, `location`, `settings`, `filterGames`, `reset`, `apply`, `leaderboard`, `pasteTheFenStringHere`, `pasteThePgnStringHere`, `fromPosition`, `continueFromHere`, `importGame`, `nbImportedGames`, `thisIsAChessCaptcha`, `clickOnTheBoardToMakeYourMove`, `notACheckmate`, `colorPlaysCheckmateInOne`, `retry`, `reconnecting`, `onlineFriends`, `noFriendsOnline`, `findFriends`, `favoriteOpponents`, `follow`, `following`, `unfollow`, `block`, `blocked`, `unblock`, `followsYou`, `xStartedFollowingY`, `nbFollowers`, `nbFollowing`, `more`, `memberSince`, `lastLogin`, `challengeToPlay`, `player`, `list`, `graph`, `lessThanNbMinutes`, `xToYMinutes`, `textIsTooShort`, `textIsTooLong`, `required`, `openTournaments`, `duration`, `winner`, `standing`, `createANewTournament`, `join`, `withdraw`, `points`, `wins`, `losses`, `winStreak`, `createdBy`, `waitingForNbPlayers`, `tournamentIsStarting`, `membersOnly`, `boardEditor`, `startPosition`, `clearBoard`, `savePosition`, `loadPosition`, `isPrivate`, `reportXToModerators`, `profile`, `editProfile`, `firstName`, `lastName`, `biography`, `country`, `preferences`, `watchLichessTV`, `previouslyOnLichessTV`, `todaysLeaders`, `onlinePlayers`, `progressToday`, `progressThisWeek`, `progressThisMonth`, `leaderboardThisWeek`, `leaderboardThisMonth`, `activeToday`, `activeThisWeek`, `activePlayers`, `bewareTheGameIsRatedButHasNoClock`, `training`, `yourPuzzleRatingX`, `findTheBestMoveForWhite`, `findTheBestMoveForBlack`, `toTrackYourProgress`, `trainingSignupExplanation`, `recentlyPlayedPuzzles`, `puzzleId`, `puzzleOfTheDay`, `clickToSolve`, `goodMove`, `butYouCanDoBetter`, `bestMove`, `keepGoing`, `puzzleFailed`, `butYouCanKeepTrying`, `victory`, `giveUp`, `puzzleSolvedInXSeconds`, `wasThisPuzzleAnyGood`, `pleaseVotePuzzle`, `thankYou`, `ratingX`, `playedXTimes`, `fromGameLink`, `startTraining`, `continueTraining`, `retryThisPuzzle`, `thisPuzzleIsCorrect`, `thisPuzzleIsWrong`, `youHaveNbSecondsToMakeYourFirstMove`, `nbGamesInPlay`, `automaticallyProceedToNextGameAfterMoving`, `autoSwitch`, `openingId`, `scoreX`, `yourOpeningScoreX`, `findNbStrongMoves`) lazy val count = keys.size } diff --git a/modules/opening/src/main/Finisher.scala b/modules/opening/src/main/Finisher.scala index 6e57289f81..5ee7238576 100644 --- a/modules/opening/src/main/Finisher.scala +++ b/modules/opening/src/main/Finisher.scala @@ -11,12 +11,17 @@ private[opening] final class Finisher( api: OpeningApi, openingColl: Coll) { + private def computeScore(opening: Opening, found: Int, failed: Int): Int = { + val base = 100d * found / goal + + } + def apply(opening: Opening, user: User, found: Int, failed: Int): Fu[Attempt] = api.attempt.find(opening.id, user.id) flatMap { case Some(a) => fuccess(a) case None => val date = DateTime.now - val score = 50 + val score = computeScore(opening, found, failed) val userScorePerf = user.perfs.opening.add(score, DateTime.now) val openingScore = 0.1 * (score - opening.score) + opening.score val a = new Attempt( diff --git a/modules/opening/src/main/Opening.scala b/modules/opening/src/main/Opening.scala index 16eeff6966..ef246ccb06 100644 --- a/modules/opening/src/main/Opening.scala +++ b/modules/opening/src/main/Opening.scala @@ -17,7 +17,7 @@ case class Opening( attempts: Int, score: Double) { - def goal = qualityMoves.size min 5 + lazy val goal = qualityMoves.count(_.quality == Quality.Good) min 5 lazy val qualityMoves: List[QualityMove] = { val bestCp = moves.foldLeft(Int.MaxValue) { diff --git a/modules/opening/src/main/UserInfos.scala b/modules/opening/src/main/UserInfos.scala index 16aef0c0f4..379ecccee1 100644 --- a/modules/opening/src/main/UserInfos.scala +++ b/modules/opening/src/main/UserInfos.scala @@ -46,7 +46,7 @@ object UserInfos { private def makeChart(attempts: List[Attempt]) = JsArray { val scores = attempts.take(chartSize).reverse map (_.score) - val filled = List.fill(chartSize - scores.size)(Glicko.default.intRating) ::: scores + val filled = List.fill(chartSize - scores.size)(0) ::: scores filled map { JsNumber(_) } } } diff --git a/public/font28/fonts/lichess.woff b/public/font28/fonts/lichess.woff deleted file mode 100644 index 615195bf8763cfa3ca41d4dc57814fde9816c9de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13092 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 diff --git a/public/font28/fonts/lichess.eot b/public/font29/fonts/lichess.eot similarity index 86% rename from public/font28/fonts/lichess.eot rename to public/font29/fonts/lichess.eot index dfcfb4441ca672dd971a112f20bd6114e79a7722..1380a396c626b14445014dad9155a06e9298c1f5 100644 GIT binary patch delta 1521 zcmY*ZU2GIp6h7zv&hF0s&(0LOZMR+7ZPFCj?amId6c*DK@daaIgdi;yw*>+eDN5Ct ztuf(AAIJm}3?@FAKq4yeVq%Q?pfNFoM0h}bXbfs%e3BUPht_kqYoasvo_o%BzH@)h znYnl0z>DWlU3?7S{;spC&hJgJv)iBVdQL8m0POk>0P;J>Cnn)_P-K5}_N%U1^Uq6n z0N5gRH8-N)jU7;NUGfayV2(RNXPG9>TeS9iswoH$arsvxe z8o}FI9t7MaJlYO5bMJ#Gc$toBo_^R5GacR7YfAvU6wdM;_;mOVze;ki$g}-Z;c0O> z?3342-FUkLB}2Guhz$~ri%l$QLH+FqlU0n z8o~jUD-M*#a2r-#uiXDXaw&<$vM!eW5ic+ekK8&x*o8}7gEtSPQU_8?j@@wVCEID( zPVekuYqqzs3by0e*p`Jx!L&7j%jb_!;9%F%k)H{%9m8|%>y^>b3XKG`MVoJ83bb>| zS`IegFZeASgID1krNq@-X;thWD3{8mpcd5qTDj(zgL<$HTO{j&zXp>!h9!geYpP${ zj>d18?Sa&hs+X%%I=r=MDH~dOCRIep)_qr!Med-!9cyKiEUj{e(ZT8+Oyf^6wOh8* z>CDO>ZqBi^LV7r3$dR_o5rtGrGsc9HmTr3l`KU3*IVZ0rwf@G9+G=+!679Zk5vq!4 zsi@{pGJEAVA`@3o2~?!K%arJCBa(5ZsPij=w;0FMDQD$DCT=HFxopPFD`-(-Gn8m$ z5_UuqUotC`)e*&nP^dE5h~|RUGaSvRDWMEN3#5|n%7ce=R7&kgp>e&mr6uTKf@h>T z4&P@iCNmV@;z(a0nlB&!!c{m7kfqZnu?IDc^yXZTUX#w8GI}4<$ETI+jbhI69M7#% zjmB`K8q`LDc6R->QkAL7R2WkidQI&&VbR};r5Y94nB~8p7;9OG%1gu(u8=~-H#YL! zR0W;%SUklgQ>i#@)uLo2Qgk+{c`Cuv(Fmo3iQ!ENYke+l#gue1y;MG?v$3HqxQa!} zSfwH;b?N;2?o7mv4<}UG$;f?WTEr4ODP_I%<1$=e_k$sU{vKc4K4{pV8r2Z?d) APyhe` delta 635 zcmYjPK}Zx)82;YOo7r83A_5t0HrL#Ypvj$Sk`AUx>$)34w=fiK&`pEY9asyigLLp9 z7__{C$f85gA%fZzqD~8er$U2H=0RjnbFe>OJb}(n_)ars41UpMX>xfH{;LOko*1)x7xGaEFuOZ9ws<^J%Z(*J@CK!9S!8 zPv>r5zqa%B3ZNx`zNwk4H>EuLu^|i=UHla~1hBWHE9df)-plpJWq{99{c+Y?@bQ{; z()u~7V{_hY_RE7?6TroX#4Y>z!hFOCx6*rJw7v~SBlUMHOREzHd-u_-5CLqJzg7Ot zwJIfqB9&nR5bMlhV{3ctEW1pBWoVdnBcMu^6q?}Jqq(WRMSAvQ6nE)}vUOkpUVvrY zuuft@%&7ySq?X!Y9BXYmVn&a)$2yL8#=Ck>p0ZANCv4}8dzChbd;FEKv=SMwRkUoM z*dOXzjN?v_f+K`C0oKrr%>e7f|C9-NgqQsdIma_jp&tLJefFl3^ diff --git a/public/font28/fonts/lichess.svg b/public/font29/fonts/lichess.svg similarity index 94% rename from public/font28/fonts/lichess.svg rename to public/font29/fonts/lichess.svg index 6c99796642..6209469603 100644 --- a/public/font28/fonts/lichess.svg +++ b/public/font29/fonts/lichess.svg @@ -96,4 +96,7 @@ + + + diff --git a/public/font28/fonts/lichess.ttf b/public/font29/fonts/lichess.ttf similarity index 86% rename from public/font28/fonts/lichess.ttf rename to public/font29/fonts/lichess.ttf index 49d3b1b4e725afdffd32fb0c83ad3d5d4bb4b570..685e7d5d9f8817452ab545990ed44adee78427d3 100644 GIT binary patch delta 1601 zcmY*ZTW?fV6kcmz&&-^;pP4D0Ugkn)YHBZYCzO@}+ae~WL`6z~!dM3iX=$ZItHex= zuRJ-C1Oq<+6H$Q|qYuD?mls0CX?}0>BxvU!Gg6 zE!Y3P@&JIXQdK8vE6W=jG!yK-L4NDR!kfqA7cbLzSq0b~n6KAfWw(DTlh4dwo}aHb zYGQ~-^%`RnMO~L-r?Rf4Q(USNkgS;1vL|M)u9c+UhcVjA`<3BRg@rwpgDz zcg|O!Z|v#d6IAhYHe(6qpU^st>$gE z3lBFLzt(%WBekV7-qqdHn@IMhw`R&uJv}%yJd(>7iU;AyZ1XPvuz5~gSG^x3&Lpkt zBeFi;AbB9c03TAGA}|1>@EkEI)s0THkj$6Iu&C3i;wa{wilYXwm>Iy7ilkGSF&xKy zG?q>NFF51JbXKRcr9!M?UOaX0LVpLYb@bmk76=>*tT}eovDa*;YCAp0R~yHBsvBTC zj*YE0QB9b4v%!ZKPSL>rj{m!gs^a#zYbv6wYtX%#UMZLZwrH2&;S)3Ol^hSvXzMjT5k zq=z$x9BI28QAnjUV@xP%>6S;3k6y+&=j64d*55_lwwm_1-0?>iu_}$0a%;Yy+3WWa znYfBdpd#=QQ=+HENXD6>%C8FEU>x5FIO|VBUfUmtghOUtL5or}Ly1<%XS*cDOJ;?_ z+NGEf3RNiV(p=DbCPp)Ql~9JD1p@x)`jf5NEv0s((AX($X$d-*;2~*_!w(sY$q*$f!M#WypH|V>C`O!^6N~04M`KvXSBiy7 zOWo3Dsbk|%6i zw4m^aplmju>2IXq_0|nQcNb{5(#8@z@J$;l;(szXi*OO+YyB7oGr}Ehp2Gx;w6P%m zVjD|{!l!Mlh`$dDl$be~hdQiKf#&v!{e=n)LXK*l=Ey+_U~1{~*{P*7C+dm(&`4r? zV&UZ6e0^nwP-QSTm> delta 603 zcmYLFO=uHA7=5!p>9(O2QKW@Eq#Eognk-Q~XtbE0JyfDts%Wq-ZEOyWU1*S~V7zz; z^dOE0LDZWE5wuni^EM0wL4!{*xTUVTd9;Ap0P_adEizG@k+H;kACaf zO#Ya>H9I%u-G6$k1sFB*7gewBm9U)XduS^ zS`dx_pDbLvJ-KQBcSJSHz`Itv^RH^{&JA%ul$J7Lk0{c)at}Kg1pbhz_pxE%Gix6# zX#9YKIE~B9s@5<@;e}XnHDMu(x_qOJ%6@%OK)%v#j>(Vu1KBhd36~C;<%~R5*f|o% zrSLifJ$Mvi6H%;&I70oayjvI^agkJ(j9wZVz`YQg*oJ2zj!<8h4R=U(3u9Xxq>(@h z4*w2kQ%K8GuHEOP6DcR*BvWa5#XTWExZ6cZ{&1h?0{_gS1y>J{4k{_&Ix`Dite9FV QCsxm_{8IJ*leRm50iPs&iU0rr diff --git a/public/font29/fonts/lichess.woff b/public/font29/fonts/lichess.woff new file mode 100644 index 0000000000000000000000000000000000000000..6bed193e649d87a8471003b21d5769a39b7c286c GIT binary patch literal 13756 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 UA@#reLJ%?r-s0PkI1q^c14<;Ax&QzG literal 0 HcmV?d00001 diff --git a/public/font28/icons-reference.html b/public/font29/icons-reference.html similarity index 97% rename from public/font28/icons-reference.html rename to public/font29/icons-reference.html index 84bd6ec47f..04f35f79cd 100644 --- a/public/font28/icons-reference.html +++ b/public/font29/icons-reference.html @@ -401,6 +401,18 @@ h2{font-size:18px;padding:0 0 21px 5px;margin:45px 0 0 0;text-transform:uppercas
+
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • Character mapping

      @@ -760,6 +772,18 @@ h2{font-size:18px;padding:0 0 21px 5px;margin:45px 0 0 0;text-transform:uppercas
      +
    • +
      + +
    • +
    • +
      + +
    • +
    • +
      + +