dangerous UI refactoring

This commit is contained in:
Thibault Duplessis 2014-07-13 23:35:07 +02:00
parent 06576dd09e
commit 496dfe2bb7
60 changed files with 197 additions and 242 deletions

View file

@ -146,7 +146,7 @@ object Round extends LilaController with TheftPrevention {
val table = if (player) html.round.table.end(pov, tour) else html.round.table.watch(pov)
Ok(Json.obj(
"players" -> players,
"infobox" -> html.game.infoBox(pov, tour, withTourStanding = player).toString,
"side" -> html.game.side(pov, tour, withTourStanding = player).toString,
"table" -> table.toString)) as JSON
},
api = apiVersion => fuccess(Ok(Json.obj(

View file

@ -1,8 +1,8 @@
@(title: String, goodies: Option[Html] = None, chat: Option[Html] = None, underchat: Option[Html] = None, moreCss: Html = Html(""), moreJs: Html = Html(""), openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@(title: String, side: Option[Html] = None, chat: Option[Html] = None, underchat: Option[Html] = None, moreCss: Html = Html(""), moreJs: Html = Html(""), openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@base.layout(
title = title,
goodies = goodies,
side = side,
chat = chat,
underchat = underchat,
active = siteMenu.game.some,

View file

@ -37,7 +37,7 @@
@analyse.layout(
title = title,
goodies = views.html.game.infoBox(pov, tour, withTourStanding = false).some,
side = views.html.game.side(pov, tour, withTourStanding = false).some,
chat = chat.map(c => base.chat(c, trans.spectatorRoom.str())),
underchat = underchat.some,
moreCss = moreCss,

View file

@ -1,4 +1,4 @@
@(title: String, goodies: Option[Html] = None, zen: Boolean = false)(body: Html)(implicit ctx: Context)
@(title: String, side: Option[Html] = None, zen: Boolean = false)(body: Html)(implicit ctx: Context)
@moreCss = {
@cssTag("user-signup.css")

View file

@ -1,8 +1,8 @@
@(chat: lila.chat.AnyChat, title: String)(implicit ctx: Context)
<div id="chat">
<div id="chat" class="side_box">
<div class="top">
<span class="title">@title</span>
<span>@title</span>
<input title="@trans.toggleTheChat()" class="toggle_chat" type="checkbox" />
</div>
<ol class="messages content scroll-shadow-soft"></ol>

View file

@ -3,7 +3,7 @@ title: String,
fullTitle: Option[String] = None,
active: Option[lila.app.ui.SiteMenu.Elem] = None,
baseline: Option[Html] = None,
goodies: Option[Html] = None,
side: Option[Html] = None,
menu: Option[Html] = None,
chat: Option[Html] = None,
underchat: Option[Html] = None,
@ -176,7 +176,7 @@ openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@menu.map { side =>
<div class="side_menu">@side</div>
}
@goodies
@side
@chat
@underchat.map { g =>
<div class="under_chat">@g</div>

View file

@ -1,4 +1,4 @@
@(title: String, goodies: Option[Html] = None, openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@(title: String, side: Option[Html] = None, openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@moreCss = {
@cssTag("blog.css")
@ -7,7 +7,7 @@
@base.layout(
title = title,
moreCss = moreCss,
goodies = goodies,
side = side,
openGraph = openGraph) {
<div id="lichess_blog" class="content_box">
@body

View file

@ -1,13 +1,13 @@
@(doc: io.prismic.Document)(implicit ctx: Context, prismic: lila.blog.BlogApi.Context)
@goodies = {
@side = {
<br />
<a href="@routes.Blog.index(prismic.maybeRef)">Return to blog</a>
}
@layout(
title = s"${~doc.getText("blog.title")} | Blog",
goodies = goodies.some,
side = side.some,
openGraph = Map(
'type -> "article",
'image -> doc.getImage("blog.image", "main").??(_.url),

View file

@ -5,7 +5,7 @@
<input type="hidden" name="custom" value="@ctx.userId">
}
@goodies = {
@side = {
<h2>@progress.month Progress</h2>
<div class="progress">
<div class="progressbar green flashy">
@ -38,7 +38,7 @@
@site.layout(
moreCss = moreCss,
goodies = goodies.some,
side = side.some,
title = s"${~doc.getText("doc.title")}") {
<div class="content_box small_box doc_box donate_box">

View file

@ -1,8 +1,8 @@
@(title: String, searchText: String = "", goodies: Option[Html] = None, moreJs: Html = Html(""))(body: Html)(implicit ctx: Context)
@(title: String, searchText: String = "", side: Option[Html] = None, moreJs: Html = Html(""))(body: Html)(implicit ctx: Context)
@base.layout(
title = title,
goodies = goodies,
side = side,
moreCss = cssTag("forum.css"),
moreJs = moreJs,
active = siteMenu.forum.some) {

View file

@ -1,8 +1,8 @@
@(title: String, goodies: Option[Html] = None, menu: Option[Html] = None, moreJs: Html = Html(""), moreCss: Html = Html(""))(body: Html)(implicit ctx: Context)
@(title: String, side: Option[Html] = None, menu: Option[Html] = None, moreJs: Html = Html(""), moreCss: Html = Html(""))(body: Html)(implicit ctx: Context)
@base.layout(
title = title,
goodies = goodies,
side = side,
menu = menu,
active = siteMenu.game.some,
moreJs = moreJs,

View file

@ -3,8 +3,8 @@
@import pov._
@import lila.tournament.arena
<div class="goodies">
<div class="box">
<div class="side">
<div class="side_box padded">
@bookmark.toggle(game)
@game.pgnImport.flatMap(_.date).map { date =>
PGN Import - @date
@ -21,7 +21,7 @@
<br />
}
<br />
@tour.map { t =>
@tour.filter(_.isFinished).map { t =>
@tournamentLink(t)
<br /><br />
}
@ -53,8 +53,10 @@
@tour match {
case Some(t: lila.tournament.StartedOrFinished) => {
<div class="game_tournament box no_padding scroll-shadow-soft">
<span class="title">&nbsp;@if(t.scheduled) {@t.name} else {@trans.xTournament(t.name)}</span>
<div class="game_tournament side_box no_padding scroll-shadow-soft">
<p class="top" data-icon="g">
@if(t.scheduled) {@t.name} else {@trans.xTournament(t.name)}
</p>
@t match {
case t: lila.tournament.Started => {
<div class="clock" data-time="@t.remainingSeconds">

View file

@ -1,4 +1,4 @@
@(title: String, goodies: Option[Html] = None)(body: Html)(implicit ctx: Context)
@(title: String, side: Option[Html] = None)(body: Html)(implicit ctx: Context)
@moreCss = {
@cssTag("translation.css")
@ -11,7 +11,7 @@
title = title,
moreCss = moreCss,
moreJs = moreJs,
goodies = goodies,
side = side,
active = none) {
<div class="content_box">
@body

View file

@ -1,13 +1,13 @@
@(info: lila.i18n.TransInfo, form: Form[_], keys: lila.i18n.I18nKeys, baseLang: Lang, rawTrans: String => Option[String], captcha: lila.common.Captcha, data: Map[String, String], context: Map[String, String])(implicit ctx: Context)
@goodies = {
@side = {
<br />
<a href="@routes.I18n.contribute">View all languages</a>
}
@i18n.layout(
title = info.codeAndName,
goodies = goodies.some) {
side = side.some) {
<h1 class="lichess_title">@info.codeAndName</h1>
<div class="progressbar flashy @info.complete.fold("green", "")">

View file

@ -17,7 +17,7 @@
@embedJs(s"var lichess_preload = $preload;")
}
@goodies = {
@side = {
@ctx.me.map { u =>
@if(playing.nonEmpty) {
<div id="now_playing">
@ -46,7 +46,7 @@ title = "",
fullTitle = Some("lichess.org • " + trans.freeOnlineChess.str()),
baseline = baseline.some,
active = siteMenu.play.some,
goodies = goodies.some,
side = side.some,
moreJs = moreJs,
moreCss = cssTag("home.css"),
underchat = underchat.some,

View file

@ -8,7 +8,7 @@
@jsTag("vendor/jquery.infinitescroll.min.js")
}
@goodies = {
@side = {
<div class="sidebar">
<a href="@routes.Message.inbox(1)" class="goto_inbox">@trans.inbox()</a>
<a href="@routes.Message.form" class="goto_compose button" data-icon="m">&nbsp;@trans.composeMessage()</a>
@ -19,7 +19,7 @@
title = title,
moreCss = moreCss,
moreJs = moreJs,
goodies = goodies.some,
side = side.some,
active = siteMenu.message.some) {
<div id="lichess_message" class="content_box">
@body

View file

@ -4,7 +4,7 @@
@cssTag("mod-communication.css")
}
@goodies = {
@side = {
<br />
<br />
<a data-icon="i" href="@routes.Report.list">&nbsp;Return to the report list</a>
@ -13,7 +13,7 @@
@base.layout(
title = u.username + " communications",
moreCss = moreCss,
goodies = goodies.some) {
side = side.some) {
<div id="communication" class="content_box">
<h1>@userLink(u) communications</h1>

View file

@ -1,11 +1,11 @@
@(setup: lila.pool.PoolSetup)(implicit ctx: Context)
@goodies = {
@side = {
<a href="@routes.Pool.show(setup.id)">Return to the pool</a>
}
@base.layout(
goodies = goodies.some,
side = side.some,
title = s"${setup.name} Pool help",
moreCss = cssTag("pool.css")) {

View file

@ -1,6 +1,6 @@
@(p: lila.pool.Pool, games: List[Game])(implicit ctx: Context)
<div>
<div class="pool_side">@side(p)</div>
<div class="pool_side">@pairings(p)</div>
@pool.standing(p)
</div>

View file

@ -1,19 +1,17 @@
@(p: lila.pool.Pool, version: Int, chat: Option[lila.chat.UserChat], pov: Option[Pov])(implicit ctx: Context)
@goodies = {
<div class="goodies">
<div class="box">
<span data-icon="p"> @(p.setup.clockLimit / 60) + @p.setup.clockIncrement</span>,
@variantName(p.setup.variant).capitalize, @trans.rated() -
<a href="@routes.Pool.help(p.setup.id)">Help</a>
@ctx.me.map(_.perfs.pool(p.setup.id)).map { perf =>
<br />
<br />
@trans.ratingX(s"""<strong>${perf.intRating}</strong> <small class="hint--bottom" data-hint="Glicko rating deviation"> ±${perf.glicko.intDeviationDoubled}</small>""")
<br />
<strong>@perf.nb</strong> @trans.gamesPlayed()
}
</div>
@side = {
<div class="side_box padded">
<span data-icon="p"> @(p.setup.clockLimit / 60) + @p.setup.clockIncrement</span>,
@variantName(p.setup.variant).capitalize, @trans.rated() -
<a href="@routes.Pool.help(p.setup.id)">Help</a>
@ctx.me.map(_.perfs.pool(p.setup.id)).map { perf =>
<br />
<br />
@trans.ratingX(s"""<strong>${perf.intRating}</strong> <small class="hint--bottom" data-hint="Glicko rating deviation"> ±${perf.glicko.intDeviationDoubled}</small>""")
<br />
<strong>@perf.nb</strong> @trans.gamesPlayed()
}
</div>
}
@ -26,7 +24,7 @@
@base.layout(
title = s"${p.setup.name} pool",
moreCss = cssTag("pool.css"),
goodies = goodies.some,
side = side.some,
chat = chat.map(c => base.chat(c, trans.chatRoom.str())),
underchat = underchat.some) {
@ -36,7 +34,7 @@ underchat = underchat.some) {
data-socket-url="@routes.Pool.websocket(p.setup.id)"
data-href="@routes.Pool.reload(p.setup.id)">
<div class="pool_side scroll-shadow">
@side(p)
@pairings(p)
</div>
<div class="content_box no_padding pool_box pool_show">
<h1 data-icon="8">

View file

@ -2,7 +2,7 @@
@layout(
title = "Ask a new question" ,
goodies = popularBox(popular).some) {
side = popularBox(popular).some) {
<div class="content_box_top">
<h1 class="lichess_title">

View file

@ -4,7 +4,7 @@
@layout(
title = title,
goodies = popularBox(popular).some) {
side = popularBox(popular).some) {
<div class="content_box_top">
<h1 class="lichess_title">

View file

@ -1,12 +1,12 @@
@(questions: Paginator[lila.qa.Question], popular: List[lila.qa.Question])(implicit ctx: Context)
@goodies = {
@side = {
@popularBox(popular)
}
@layout(
title = "Questions & Answers",
goodies = goodies.some) {
side = side.some) {
<div class="content_box_top">
<h1 data-icon="&" class="is4 lichess_title"> Questions &amp; Answers</h1>

View file

@ -1,10 +1,10 @@
@(title: String, goodies: Option[Html] = None, openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@(title: String, side: Option[Html] = None, openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@side = {
<div class="goodies">
<div class="side">
@searchForm()
<a class="ask" href="@routes.QaQuestion.ask">Ask a question</a>
@goodies
@side
</div>
}
@ -18,7 +18,7 @@
title = s"Q&A - $title",
moreCss = cssTag("qa.css"),
moreJs = moreJs,
goodies = side.some,
side = side.some,
openGraph = openGraph) {
<div id="qa" class="content_box no_padding">
@body

View file

@ -2,7 +2,7 @@
@layout(
title = "Not allowed yet" ,
goodies = popularBox(popular).some) {
side = popularBox(popular).some) {
<div class="content_box_top">
<h1 class="lichess_title">

View file

@ -1,13 +1,13 @@
@(q: lila.qa.Question, answers: List[lila.qa.Answer], popular: List[lila.qa.Question], related: List[lila.qa.Question], answerForm: Option[Form[_]], captcha: Option[lila.common.Captcha])(implicit ctx: Context)
@goodies = {
@side = {
@relatedBox(related)
@popularBox(popular)
}
@layout(
title = q.title,
goodies = goodies.some) {
side = side.some) {
<div class="question">
<div class="content_box_top">

View file

@ -1,8 +1,8 @@
@(title: String, goodies: Html, chat: Option[Html] = None, underchat: Option[Html] = None, robots: Boolean = true, signedJs: Option[String] = None, active: Option[lila.app.ui.SiteMenu.Elem] = None, openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@(title: String, side: Html, chat: Option[Html] = None, underchat: Option[Html] = None, robots: Boolean = true, signedJs: Option[String] = None, active: Option[lila.app.ui.SiteMenu.Elem] = None, openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@base.layout(
title = title,
goodies = goodies.some,
side = side.some,
active = (active | siteMenu.play).some,
chat = chat,
underchat = underchat,

View file

@ -6,7 +6,7 @@
@round.layout(
title = title,
goodies = views.html.game.infoBox(pov, tour, withTourStanding = true),
side = views.html.game.side(pov, tour, withTourStanding = true),
chat = chat.map(c => base.chat(c, trans.chatRoom.str())),
underchat = views.html.game.watchers().some,
signedJs = hijackEnabled(pov.game) option routes.Round.signedJs(pov.gameId) map (_.toString),

View file

@ -6,7 +6,7 @@
@round.layout(
title = title,
goodies = views.html.game.infoBox(pov, tour, withTourStanding = false),
side = views.html.game.side(pov, tour, withTourStanding = false),
chat = chat.map(c => base.chat(c, trans.spectatorRoom.str())),
underchat = views.html.game.watchers().some,
openGraph = povOpenGraph(pov)) {

View file

@ -4,7 +4,7 @@
@round.layout(
title = userOption.isDefined.fold(trans.challengeToPlay,trans.playWithAFriend).str(),
goodies = Html(""),
side = Html(""),
signedJs = routes.Round.signedJs(pov.gameId).toString.some) {
<div class="lichess_game lichess_game_not_started waiting_opponent clearfix lichess_player_@color">
<div class="lichess_board_wrap">

View file

@ -4,7 +4,7 @@
@round.layout(
title = trans.playWithAFriend.str(),
goodies = Html(""),
side = Html(""),
signedJs = routes.Round.signedJs(pov.gameId).toString.some) {
<div class="lichess_game lichess_game_not_started clearfix lichess_player_@color">
<div class="lichess_board_wrap">

View file

@ -1,6 +1,6 @@
@(teams: List[lila.team.Team])(implicit ctx: Context)
@goodies = {
@side = {
<br />
<br />
You can chat here,<br />
@ -19,7 +19,7 @@ Channels: <br />
@site.layout(
title = trans.chat.str(),
goodies = goodies.some,
side = side.some,
moreCss = cssTag("irc.css")) {
<div class="content_box irc_box">

View file

@ -1,7 +1,7 @@
@(title: String, moreCss: Html = Html(""), goodies: Option[Html] = None)(body: Html)(implicit ctx: Context)
@(title: String, moreCss: Html = Html(""), side: Option[Html] = None)(body: Html)(implicit ctx: Context)
@base.layout(
title = title,
goodies = goodies,
side = side,
active = none,
moreCss = moreCss)(body)

View file

@ -8,7 +8,7 @@
@jsTag("vendor/jquery.infinitescroll.min.js")
}
@goodies = {
@side = {
<div class="side_menu">
@defining(~currentTab) { tab =>
@if(ctx.teamNbRequests > 0) {
@ -37,7 +37,7 @@
title = title,
moreCss = moreCss,
moreJs = moreJs,
goodies = goodies.some,
side = side.some,
active = siteMenu.team.some) {
@body
}

View file

@ -1,12 +1,12 @@
@()(implicit ctx: Context)
@goodies = {
@side = {
<div class="tournament_links">
<a href="@routes.Tournament.home()">Return to tournaments</a>
</div>
}
@tournament.layout(title = "Tournament FAQ", goodies = goodies.some) {
@tournament.layout(title = "Tournament FAQ", side = side.some) {
<div id="tournament">
<div class="content_box small_box faq_page">
<h1>Tournament FAQ</h1>

View file

@ -1,6 +1,6 @@
@(createds: List[lila.tournament.Created], starteds: List[lila.tournament.Started], finisheds: List[lila.tournament.Finished], scheduled: List[lila.tournament.Created], leaderboard: List[User])(implicit ctx: Context)
@goodies = {
@side = {
<div class="tournament_links">
<a href="@routes.Tournament.faq()">Tournament help</a>
</div>
@ -25,7 +25,7 @@
@tournament.layout(
title = trans.tournaments.str(),
goodies = goodies.some) {
side = side.some) {
<div id="tournament" data-href="@routes.Tournament.homeReload()">
@tournament.homeInner(createds, starteds, finisheds)
</div>

View file

@ -1,47 +0,0 @@
@(tour: lila.tournament.Tournament)(implicit ctx: Context)
<div class="goodies">
<div class="box">
@trans.createdBy() @userIdLink(tour.createdBy.some, withOnline = false)
<br />
@tour.schedule.map { s =>
@momentFormat(s.at)
}.getOrElse {
@momentFormat(tour.createdAt)
}
@tour.password.map { password =>
<br />
<span data-icon="a">
@if(ctx.userId == tour.createdBy.some) {
@trans.password(): @tour.password
} else {
@trans.isPrivate()
}
</span>
}
<br /><br />
<span data-icon="p"> @tour.clock.show</span>,
@variantName(tour.variant).capitalize,
@{ tour.rated.fold(trans.rated(), trans.casual()) }
<br /><br />
@trans.system(): @systemName(tour.system).capitalize
<br /><br />
@trans.duration(): @tour.minutes minutes
@if(tour.isRunning) {
<br /><br />
@if(tour isActive ctx.me) {
<form action="@routes.Tournament.withdraw(tour.id)" method="POST">
<button type="submit" class="submit button strong" data-icon="b"> @trans.withdraw()</button>
</form>
} else {
<form class="inline" action="@routes.Tournament.join(tour.id)" method="POST">
<button data-icon="@tour.hasPassword.fold("a", "G")" type="submit" class="submit button">&nbsp;@trans.join()</button>
</form>
}
}
@tour.winner.filter(_ => tour.isFinished).map { winner =>
<br /><br />
@trans.winner(): @userInfosLink(winner.id, none)
}
</div>
</div>

View file

@ -13,7 +13,7 @@
@tournament.show.layout(
tour = tour,
goodies = tournament.infoBox(tour),
side = tournament.side(tour),
chat = None,
version = version,
title = trans.join.str() + trans.xTournament(tour.name)) {

View file

@ -1,4 +1,4 @@
@(title: String, moreJs: Html = Html(""), goodies: Option[Html] = None, chat: Option[Html] = None, underchat: Option[Html] = None)(body: Html)(implicit ctx: Context)
@(title: String, moreJs: Html = Html(""), side: Option[Html] = None, chat: Option[Html] = None, underchat: Option[Html] = None)(body: Html)(implicit ctx: Context)
@moreCss = {
@cssTag("tournament.css")
@ -8,7 +8,7 @@
title = title,
moreCss = moreCss,
moreJs = moreJs,
goodies = goodies,
side = side,
chat = chat,
active = siteMenu.tournament.some,
underchat = underchat) {

View file

@ -2,7 +2,7 @@
@tournament.show.layout(
tour = tour,
goodies = tournament.infoBox(tour),
side = tournament.side(tour),
chat = chat,
version = version,
title = trans.xTournament.str(tour.name)) {

View file

@ -2,10 +2,10 @@
@tournament.show.layout(
tour = tour,
goodies = tournament.infoBox(tour),
side = tournament.side(tour),
chat = chat,
version = version,
side = tournament.pairings(tour).some,
pairings = tournament.pairings(tour).some,
title = trans.xTournament.str(tour.name)) {
@tournament.show.finishedInner(tour, games)
}

View file

@ -1,6 +1,6 @@
@(side: Option[Html])(body: Html)(implicit ctx: Context)
@(pairings: Option[Html])(body: Html)(implicit ctx: Context)
@side.map { s =>
@pairings.map { s =>
<div id="tournament_side" class="scroll-shadow-soft">@s</div>
}
<div id="tournament_main">

View file

@ -1,4 +1,4 @@
@(tour: lila.tournament.Tournament, chat: Option[lila.chat.UserChat], title: String, version: Int, goodies: Html, side: Option[Html] = None)(body: Html)(implicit ctx: Context)
@(tour: lila.tournament.Tournament, chat: Option[lila.chat.UserChat], title: String, version: Int, side: Html, pairings: Option[Html] = None)(body: Html)(implicit ctx: Context)
@underchat = {
<div class="watchers" data-icon="v">
@ -8,7 +8,7 @@
@tournament.layout(
title = title,
goodies = goodies.some,
side = side.some,
chat = chat.map(c => base.chat(c, trans.chatRoom.str())),
underchat = underchat.some) {
<div
@ -16,7 +16,7 @@ underchat = underchat.some) {
@if(tour.scheduled) { class="scheduled" }
data-href="@routes.Tournament.reload(tour.id)"
data-socket-url="@routes.Tournament.websocket(tour.id)">
@tournament.show.inner(side)(body)
@tournament.show.inner(pairings)(body)
</div>
@embedJs("var _ld_ = " + tournamentJsData(tour, version, ctx.me))
}

View file

@ -2,10 +2,10 @@
@tournament.show.layout(
tour = tour,
goodies = tournament.infoBox(tour),
side = tournament.side(tour),
chat = chat,
version = version,
side = tournament.pairings(tour).some,
pairings = tournament.pairings(tour).some,
title = trans.xTournament.str(tour.name)) {
@tournament.show.startedInner(tour, games, pov)
}

View file

@ -0,0 +1,45 @@
@(tour: lila.tournament.Tournament)(implicit ctx: Context)
<div class="side_box padded">
@trans.createdBy() @userIdLink(tour.createdBy.some, withOnline = false)
<br />
@tour.schedule.map { s =>
@momentFormat(s.at)
}.getOrElse {
@momentFormat(tour.createdAt)
}
@tour.password.map { password =>
<br />
<span data-icon="a">
@if(ctx.userId == tour.createdBy.some) {
@trans.password(): @tour.password
} else {
@trans.isPrivate()
}
</span>
}
<br /><br />
<span data-icon="p"> @tour.clock.show</span>,
@variantName(tour.variant).capitalize,
@{ tour.rated.fold(trans.rated(), trans.casual()) }
<br /><br />
@trans.system(): @systemName(tour.system).capitalize
<br /><br />
@trans.duration(): @tour.minutes minutes
@if(tour.isRunning) {
<br /><br />
@if(tour isActive ctx.me) {
<form action="@routes.Tournament.withdraw(tour.id)" method="POST">
<button type="submit" class="submit button strong" data-icon="b"> @trans.withdraw()</button>
</form>
} else {
<form class="inline" action="@routes.Tournament.join(tour.id)" method="POST">
<button data-icon="@tour.hasPassword.fold("a", "G")" type="submit" class="submit button">&nbsp;@trans.join()</button>
</form>
}
}
@tour.winner.filter(_ => tour.isFinished).map { winner =>
<br /><br />
@trans.winner(): @userInfosLink(winner.id, none)
}
</div>

View file

@ -2,8 +2,8 @@
@title = @{ s"TV ${playerText(pov.player)} vs ${playerText(pov.opponent)}" }
@goodies = {
<div class="goodies">
@side = {
<div class="side">
<div class="box">
<h2 data-icon="1">&nbsp;Lichess TV</h2>
<br />
@ -50,7 +50,7 @@
@round.layout(
title = title,
goodies = goodies,
side = side,
underchat = game.watchers().some,
active = siteMenu.tv.some) {
@round.watcherGame(pov)

View file

@ -6,8 +6,8 @@
@cssTag("stream.css")
}
@goodies = {
<div class="goodies">
@side = {
<div class="side">
@s.service match {
case "twitch" => {
<iframe
@ -42,7 +42,7 @@
@base.layout(
title = title,
goodies = goodies.some,
side = side.some,
active = siteMenu.tv.some,
moreCss = moreCss) {
<div class="tv_stream">

View file

@ -1,4 +1,4 @@
@(title: String, goodies: Option[Html] = None, robots: Boolean = true, evenMoreJs: Html = Html(""), evenMoreCss: Html = Html(""), openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@(title: String, side: Option[Html] = None, robots: Boolean = true, evenMoreJs: Html = Html(""), evenMoreCss: Html = Html(""), openGraph: Map[Symbol, String] = Map.empty)(body: Html)(implicit ctx: Context)
@moreCss = {
@cssTag("user-list.css")
@ -14,7 +14,7 @@
@base.layout(
title = title,
goodies = goodies,
side = side,
moreCss = moreCss,
moreJs = moreJs,
robots = robots,

View file

@ -1,7 +1,7 @@
@(progressDay: List[User], tourneyWinners: List[lila.tournament.Winner], toint: List[User], rating: List[User], ratingDay: List[User], ratingWeek: List[User], online: List[User], bullet: List[User], blitz: List[User], slow: List[User], nb: List[(User, Int)], nbDay: List[(User, Int)], nbWeek: List[(User, Int)])(implicit ctx: Context)
@goodies = {
<div class="goodies">
@side = {
<div class="side">
<form class="search" action="@routes.User.show("")">
<input placeholder="@trans.search()" class="search_user autocomplete" data-provider="@routes.User.autocomplete" />
</form>
@ -26,7 +26,7 @@
</div>
}
@user.layout(trans.players.str(), goodies = goodies.some) {
@user.layout(trans.players.str(), side = side.some) {
<div class="content_box">
<div class="user_lists">

View file

@ -21,8 +21,8 @@
</div>
}
@goodies = {
<div class="goodies sub_ratings">
@side = {
<div class="side sub_ratings">
@showPerf("global", u.perfs.global)
<br />
@showPerf("standard", u.perfs.standard)
@ -51,7 +51,7 @@
@user.layout(
title = title,
goodies = goodies.some,
side = side.some,
robots = false,
evenMoreJs = evenMoreJs,
openGraph = Map(

View file

@ -4,7 +4,7 @@
@cssTag("wiki.css")
}
@goodies = {
@side = {
<div class="sidebar">
@wiki.menu(pages)
</div>
@ -13,7 +13,7 @@
@base.layout(
title = title,
moreCss = moreCss,
goodies = goodies.some,
side = side.some,
active = none) {
<div id="wiki">@body</div>
}

View file

@ -473,7 +473,7 @@ var storage = {
$('#site_header .side_menu').prependTo('div.content_box:first');
} else {
$(document.body).removeClass("tight");
$('#timeline, div.goodies div.box, div.under_chat').each(function() {
$('#timeline, div.side_box, div.under_chat').each(function() {
var ol = $(this).offset().left;
if (ol < 3) {
var dec = 3 - ol;
@ -911,7 +911,6 @@ var storage = {
self.initTable();
self.initClocks();
if (self.$chat) self.$chat.chat({
resize: true,
messages: lichess_chat
});
self.$watchers.watchers();
@ -1550,10 +1549,9 @@ var storage = {
self.$tableInner.html(data.table);
self.initTable();
if (!(self.options.player.spectator && self.options.tv)) {
$('div.goodies').replaceWith(data.infobox);
$('div.side').replaceWith(data.side);
startTournamentClock();
}
if (self.$chat) self.$chat.chat('resize');
if ($.isFunction(callback)) callback();
$('body').trigger('lichess.content_loaded');
});
@ -1732,15 +1730,13 @@ var storage = {
$.widget("lichess.chat", {
_create: function() {
this.options = $.extend({
messages: [],
resize: false
messages: []
}, this.options);
var self = this;
self.$msgs = self.element.find('.messages');
self.$msgs.on('click', 'a', function() {
$(this).attr('target', '_blank');
});
if (self.options.resize) self.resize();
var $form = self.element.find('form');
var $input = self.element.find('input.lichess_say');
@ -1776,14 +1772,6 @@ var storage = {
}
if (self.options.messages.length > 0) self._appendMany(self.options.messages);
},
resize: function() {
var self = this;
setTimeout(function() {
var headHeight = self.element.parent().height();
self.element.css("top", headHeight + 13);
self.$msgs.css('height', 455 - headHeight).scrollTop(999999);
}, 10);
},
append: function(msg) {
this._appendHtml(this._render(msg));
},
@ -2668,7 +2656,6 @@ var storage = {
var $chat = $('#chat');
if ($chat.length) $chat.chat({
resize: true,
messages: lichess_chat
});
@ -2753,7 +2740,6 @@ var storage = {
var $chat = $('#chat');
if ($chat.length) $chat.chat({
resize: true,
messages: lichess_chat
});
@ -2863,7 +2849,6 @@ var storage = {
});
var $chat = $('#chat');
if ($chat.length) $chat.chat({
resize: true,
messages: lichess_chat
});
var $watchers = $("div.watchers").watchers();

View file

@ -2,7 +2,7 @@
function customFunctionOnPgnGameLoad() {
$('div.goodies a.rotate_board').click(function() {
$('div.side a.rotate_board').click(function() {
$('#GameBoard').toggleClass('flip');
$('#player_links div:first').appendTo($('#player_links'));
redrawBoardMarks();

View file

@ -733,11 +733,8 @@ body.pirouetti.light div.lichess_cemetery div.piece.white {
-webkit-filter: brightness(0.7) contrast(160%) drop-shadow(0 0 0.5px #000);
}
div.under_chat {
width: 224px;
margin-left: -28px;
position: absolute;
top: 529px;
left: 0;
width: 228px;
margin: 10px 0 0 -30px;
}
div.under_chat .watchtv {
display: block;
@ -746,26 +743,10 @@ div.under_chat .watchtv {
text-align: center;
margin-top: -24px;
}
#chat {
font-size: 11.5px;
position: absolute;
top: 205px;
left: 0;
width: 228px;
margin-left: -30px;
}
#chat div.top {
border: 1px solid #ccc;
padding: 3px 5px;
position: relative;
}
#chat div.top span.title {
font-weight: bold;
color: #999;
}
#chat div.top span.title span {
font-weight: normal;
}
#chat input.toggle_chat {
#chat div.top input.toggle_chat {
cursor: pointer;
position: absolute;
top: 4px;
@ -774,8 +755,6 @@ div.under_chat .watchtv {
}
#chat .messages {
height: 263px;
border: 1px solid #ccc;
border-top: none;
overflow: hidden;
overflow-y: auto;
}
@ -783,8 +762,8 @@ div.under_chat .watchtv {
position: relative;
}
#chat form input {
border: 1px solid #ccc;
border-top: 0;
border: 0;
border-top: 1px solid #ccc;
padding: 2px 20px 2px 4px;
width: 202px;
}
@ -837,24 +816,18 @@ div.under_chat .watchtv {
opacity: 0;
}
div.game_tournament {
text-align: center;
line-height: 2em;
max-height: 300px;
overflow: hidden;
}
div.game_tournament:hover {
overflow-y: auto;
}
div.game_tournament .title {
display: block;
font-weight: bold;
line-height: 3em;
}
div.game_tournament .clock {
display: block;
text-align: center;
font-size: 20px;
font-family: monospace;
font-weight: bold;
margin: 10px 0;
}
div.game_tournament table.standing {
border-bottom: none;
@ -865,6 +838,7 @@ div.game_tournament table.standing tr.me td {
div.game_tournament table.standing td {
padding: 0 10px;
text-align: left;
line-height: 2em;
}
div.game_tournament table.standing td.name span {
display: inline-block;

View file

@ -796,46 +796,46 @@ table.slist th:first-child {
#tv_history tr:hover td {
background-color: #f8f8f8;
}
div.goodies h2 {
div.side h2 {
text-align: center;
font-size: 1.5em;
}
div.goodies div.box {
margin-top: 1em;
div.side_box {
margin-top: 12px;
margin-left: -30px;
width: 212px;
width: 226px;
border: 1px solid #ccc;
}
div.side_box.padded {
width: 212px;
padding: 7px;
}
div.goodies div.box.no_padding {
width: 226px;
padding: 0;
}
div.goodies div.box .title {
div.side_box .top {
border-bottom: 1px solid #ccc;
padding: 3px 5px;
font-weight: bold;
color: #999;
}
div.goodies div.box .content {
div.side_box .padded {
padding: 7px;
}
div.goodies div.confrontation {
div.side div.confrontation {
text-align: center;
margin-bottom: 5px;
}
div.goodies div.confrontation em {
div.side div.confrontation em {
font-style: italic;
}
div.goodies div.buttons {
div.side div.buttons {
width: 228px;
margin-left: -30px;
margin-top: 2em;
text-align: center;
}
div.goodies form.search {
div.side form.search {
margin: 1em 0 0 0;
}
div.goodies form.search input {
div.side form.search input {
border: 1px solid #ccc;
padding: 3px 5px;
width: 186px;
@ -1205,8 +1205,7 @@ div.join_warning {
#crosstable th,
#friend_box .title,
#chat div.top,
div.goodies div.box .title,
div.side_box div.top,
div.undertable_top,
.button,
a.button,

View file

@ -31,7 +31,7 @@ body.dark #trainer .lichess_board,
body.dark .mini_board,
body.dark #nb_connected_players,
body.dark #chat div.top,
body.dark div.goodies div.box .title,
body.dark div.side_box div.top,
body.dark #chat .messages,
body.dark div.undertable_top,
body.dark div.undertable_inner,
@ -43,8 +43,7 @@ body.dark #footer_wrap,
body.dark div.game_config .optional_config,
body.dark .ui-state-default,
body.dark .ui-widget-content,
body.dark div.goodies div.box,
body.dark div.training div.box,
body.dark div.side_box,
body.dark div.lichess_table,
body.dark div.lichess_separator,
body.dark div.lichess_table_wrap > div.clock > div.time,
@ -61,7 +60,7 @@ body.dark div.content_box_inter a:hover,
body.dark input.copyable,
body.dark #site_header div.side_menu a.active,
body.dark div.game_row,
body.dark div.goodies form.search input,
body.dark div.side form.search input,
body.dark div.user_show div.boxed_data,
body.dark #lichess_forum div.post,
body.dark #lichess_forum textarea,
@ -180,7 +179,7 @@ body.dark #promotion_choice {
}
body.dark #GameText,
body.dark #chat .messages,
body.dark div.goodies div.box,
body.dark div.side_box,
body.dark div.lichess_table,
body.dark div.lichess_table_wrap > div.clock > div.time,
body.dark #friend_box .content a:hover,
@ -337,7 +336,7 @@ body.dark div.content_box_top {
body.dark #crosstable th,
body.dark #chat div.top,
body.dark div.goodies div.box .title,
body.dark div.side_box div.top,
body.dark #friend_box .title,
body.dark div.undertable_top,
body.dark .button,

View file

@ -47,19 +47,19 @@
#qa .lichess_title a {
text-decoration: none;
}
div.goodies form.search {
div.side form.search {
margin-bottom: 1em;
}
div.goodies div.box .questions {
div.side div.box .questions {
padding-top: 0;
padding-bottom: 0;
}
div.goodies .questions a {
div.side .questions a {
display: block;
text-decoration: none;
padding: 5px 0;
}
div.goodies .questions a:hover {
div.side .questions a:hover {
text-decoration: underline;
}
#qa .big_search {

View file

@ -10,10 +10,10 @@
overflow: hidden;
white-space: nowrap;
}
div.goodies div.box {
div.side div.box {
width: 312px;
}
div.goodies iframe {
div.side iframe {
margin-top: 1em;
width: 328px;
margin-left: -30px;

View file

@ -18,14 +18,14 @@ div.user_lists h2 {
#lichess div.user_lists div.user_top.last {
margin-right: 0;
}
div.goodies div.user_top {
div.side div.user_top {
margin-top: 1em;
}
div.goodies div.user_top td:first-child {
div.side div.user_top td:first-child {
max-width: 140px;
overflow: hidden;
}
div.goodies a.more {
div.side a.more {
display: block;
text-align: right;
margin-top: 0.5em;