homepage UI

es2016
Thibault Duplessis 2019-02-27 15:57:53 +07:00
parent 05eb7bb30f
commit adc0b22989
38 changed files with 361 additions and 127 deletions

View File

@ -46,7 +46,7 @@ final class Preload(
leaderboard(()) zip
tourneyWinners zip
(ctx.noBot ?? dailyPuzzle()) zip
liveStreams().dmap(_.autoFeatured.withTitles(lightUserApi)) zip
liveStreams().dmap(_.autoFeatured withTitles lightUserApi) zip
(ctx.userId ?? getPlayban) flatMap {
case (data, povs) ~ posts ~ tours ~ events ~ simuls ~ feat ~ entries ~ lead ~ tWinners ~ puzzle ~ streams ~ playban =>
val currentGame = ctx.me ?? Preload.currentGameMyTurn(povs, lightUserApi.sync) _

View File

@ -1,6 +1,6 @@
@(form: Form[_])(implicit ctx: Context)
@layout(title = "New event") {
@layout(title = "New event", css = "mod.form") {
<div class="crud page-menu__content box box-pad">
<h1>New event</h1>
<form class="content_box_content form3" action="@routes.Event.create" method="POST">

View File

@ -1,6 +1,6 @@
@(event: lila.event.Event, form: Form[_])(implicit ctx: Context)
@layout(title = event.title) {
@layout(title = event.title, css = "mod.form") {
<div class="crud edit page-menu__content box box-pad">
<h1>
@event.title

View File

@ -1,4 +1,4 @@
@(title: String)(body: Html)(implicit ctx: Context)
@(title: String, css: String = "mod.misc")(body: Html)(implicit ctx: Context)
@moreJs = {
@flatpickrTag
@ -7,7 +7,7 @@
@base.layout(
title = title,
moreCss = responsiveCssTag("mod.misc"),
moreCss = responsiveCssTag(css),
responsive = true,
moreJs = moreJs) {
<main class="page-menu">

View File

@ -83,33 +83,31 @@ object bits {
}
def vstext(pov: Pov)(ctxOption: Option[Context]) =
div(cls := "vstext clearfix")(
div(cls := "left user_link")(
div(cls := "vstext")(
div(cls := "vstext__pl user_link")(
playerUsername(pov.player, withRating = false, withTitle = false),
br,
playerTitle(pov.player) map { t => frag(t, " ") },
pov.player.rating,
pov.player.provisional option "?"
),
div(cls := "right user_link")(
pov.game.clock map { c =>
div(cls := "vstext__clock")(shortClockName(c.config))
} orElse {
ctxOption flatMap { implicit ctx =>
pov.game.daysPerTurn map { days =>
div(cls := "vstext__clock")(
if (days == 1) trans.oneDay.frag() else trans.nbDays.pluralSame(days)
)
}
}
},
div(cls := "vstext__op user_link")(
playerUsername(pov.opponent, withRating = false, withTitle = false),
br,
pov.opponent.rating,
pov.opponent.provisional option "?",
playerTitle(pov.opponent) map { t => frag(" ", t) }
),
pov.game.clock map { c =>
div(cls := "center")(span(cls := "text", dataIcon := "p")(shortClockName(c.config)))
} orElse {
ctxOption flatMap { implicit ctx =>
pov.game.daysPerTurn map { days =>
div(cls := "center")(
span(title := trans.correspondence.txt())(
if (days == 1) trans.oneDay() else trans.nbDays.pluralSame(days)
)
)
}
}
}
)
)
}

View File

@ -19,12 +19,12 @@ object bits {
leaderboard: List[lila.user.User.LightPerf],
tournamentWinners: List[lila.tournament.Winner]
)(implicit ctx: Context) = frag(
div(cls := "lobby__leaderboard")(
div(cls := "undertable_top")(
a(cls := "more", href := routes.User.list)(trans.more(), " »"),
span(cls := "title text", dataIcon := "C")(trans.leaderboard())
div(cls := "lobby__leaderboard lobby__box")(
div(cls := "lobby__box__top")(
span(cls := "title text", dataIcon := "C")(trans.leaderboard.frag()),
a(cls := "more", href := routes.User.list)(trans.more.frag(), " »")
),
div(cls := "undertable_inner scroll-shadow-hard")(
div(cls := "lobby__box__content")(
table(tbody(
leaderboard map { l =>
tr(
@ -38,12 +38,12 @@ object bits {
))
)
),
div(cls := "lobby__winners")(
div(cls := "undertable_top")(
a(cls := "more", href := routes.Tournament.leaderboard)(trans.more(), " »"),
span(cls := "title text", dataIcon := "g")(trans.tournamentWinners())
div(cls := "lobby__winners lobby__box")(
div(cls := "lobby__box__top")(
span(cls := "title text", dataIcon := "g")(trans.tournamentWinners.frag()),
a(cls := "more", href := routes.Tournament.leaderboard)(trans.more.frag(), " »")
),
div(cls := "undertable_inner scroll-shadow-hard")(
div(cls := "lobby__box__content")(
table(tbody(
tournamentWinners take 10 map { w =>
tr(
@ -54,39 +54,39 @@ object bits {
))
)
),
div(cls := "lobby__tournaments")(
div(cls := "undertable_top")(
a(cls := "more", href := routes.Tournament.home())(frag(trans.more(), " »")),
span(cls := "title text", dataIcon := "g")(trans.openTournaments())
div(cls := "lobby__tournaments lobby__box")(
div(cls := "lobby__box__top")(
span(cls := "title text", dataIcon := "g")(trans.openTournaments.frag()),
a(cls := "more", href := routes.Tournament.home())(trans.more.frag(), " »")
),
div(id := "enterable_tournaments", cls := "enterable_list undertable_inner scroll-shadow-hard")(
div(id := "enterable_tournaments", cls := "enterable_list lobby__box__content scroll-shadow-hard")(
views.html.tournament.enterable(tours)
)
),
div(cls := List("lobby__simuls" -> true, "none" -> simuls.isEmpty))(
div(cls := "undertable_top")(
a(cls := "more", href := routes.Simul.home())(frag(trans.more(), " »")),
span(cls := "title text", dataIcon := "|")(trans.simultaneousExhibitions())
div(cls := "lobby__simuls lobby__box")(
div(cls := "lobby__box__top")(
span(cls := "title text", dataIcon := "|")(trans.simultaneousExhibitions.frag()),
a(cls := "more", href := routes.Simul.home())(trans.more.frag(), " »")
),
div(id := "enterable_simuls", cls := "enterable_list undertable_inner")(
div(id := "enterable_simuls", cls := "enterable_list lobby__box__content")(
views.html.simul.bits.allCreated(simuls)
)
)
)
def lastPosts(posts: List[lila.blog.MiniPost])(implicit ctx: Context): Option[Frag] = posts.nonEmpty option
div(cls := "lobby__forum")(
div(cls := "undertable_top")(
a(cls := "more", href := routes.Blog.index())(trans.more(), " »"),
span(cls := "title text", dataIcon := "6")(trans.latestUpdates())
div(cls := "lobby__blog lobby__box")(
div(cls := "lobby__box__top")(
span(cls := "title text", dataIcon := "6")(trans.latestUpdates.frag()),
a(cls := "more", href := routes.Blog.index())(trans.more.frag(), " »")
),
div(cls := "undertable_inner")(
div(cls := "lobby__box__content")(
posts map { post =>
a(cls := "post", href := routes.Blog.show(post.id, post.slug))(
img(src := post.image),
span(cls := "text")(
span(cls := "title")(post.title),
p(cls := "shortlede")(post.shortlede)
strong(post.title),
span(post.shortlede)
),
semanticDate(post.date)
)
@ -149,7 +149,7 @@ object bits {
def spotlight(e: lila.event.Event)(implicit ctx: Context) = a(
href := (if (e.isNow) e.url else routes.Event.show(e.id).url),
cls := List(
s"tour_spotlight event_spotlight id_${e.id}" -> true,
s"tour-spotlight event-spotlight id_${e.id}" -> true,
"invert" -> e.isNowOrSoon
)
)(

View File

@ -55,11 +55,13 @@ object home {
) {
main(cls := "lobby")(
div(cls := "lobby__side")(
ctx.noKid option st.section(id := "streams_on_air")(views.html.streamer.bits liveStreams streams),
events.map(bits.spotlight),
!ctx.isBot option frag(
lila.tournament.Spotlight.select(tours, ctx.me, 3) map { views.html.tournament.homepageSpotlight(_) },
simuls.find(_.spotlightable) take 2 map { views.html.simul.bits.homepageSpotlight(_) } toList
ctx.noKid option st.section(cls := "lobby__streams")(views.html.streamer.bits liveStreams streams),
div(cls := "lobby__spotlights")(
events.map(bits.spotlight),
!ctx.isBot option frag(
lila.tournament.Spotlight.select(tours, ctx.me, 3 - events.size) map { views.html.tournament.homepageSpotlight(_) },
simuls.find(_.spotlightable).headOption map views.html.simul.bits.homepageSpotlight
)
),
ctx.me map { u =>
div(cls := "timeline", dataHref := routes.Timeline.home)(
@ -117,26 +119,30 @@ object home {
)
},
ctx.noBot option bits.underboards(tours, simuls, leaderboard, tournamentWinners),
ctx.noKid option div(cls := "lobby__forum")(
div(cls := "undertable_top")(
a(cls := "more", href := routes.ForumCateg.index)(trans.more.frag(), " »"),
span(cls := "title text", dataIcon := "d")(trans.latestForumPosts.frag())
ctx.noKid option div(cls := "lobby__forum lobby__box")(
div(cls := "lobby__box__top")(
span(cls := "title text", dataIcon := "d")(trans.latestForumPosts.frag()),
a(cls := "more", href := routes.ForumCateg.index)(trans.more.frag(), " »")
),
div(cls := "undertable_inner scroll-shadow-hard")(
div(cls := "content")(views.html.forum.post recent forumRecent)
div(cls := "lobby__box__content scroll-shadow-hard")(
views.html.forum.post recent forumRecent
)
),
bits.lastPosts(lastPost),
div(cls := "lobby__support")(
a(href := routes.Plan.index)(
iconTag(patronIconChar),
strong("Lichess Patron"),
span(trans.directlySupportLichess.frag())
span(cls := "lobby__support__text")(
strong("Lichess Patron"),
span(trans.directlySupportLichess.frag())
)
),
a(href := routes.Page.swag)(
iconTag(""),
strong("Swag Store"),
span(trans.playChessInStyle.frag())
span(cls := "lobby__support__text")(
strong("Swag Store"),
span(trans.playChessInStyle.frag())
)
)
),
div(cls := "lobby__about")(a(href := "/about")(trans.aboutX.frag("lichess.org")))

View File

@ -40,7 +40,7 @@ object bits {
)
def allCreated(simuls: List[lila.simul.Simul]) =
table(cls := "tournaments")(
table(
simuls map { simul =>
tr(
td(cls := "name")(

View File

@ -11,7 +11,7 @@ object bits {
def liveStreams(l: lila.streamer.LiveStreams.WithTitles): Frag =
l.live.streams.map { s =>
a(cls := "stream highlight", href := routes.Streamer.show(s.streamer.id.value), title := s.status)(
span(cls := "text", dataIcon := "")(l titleName s),
strong(cls := "text", dataIcon := "")(l titleName s),
" ",
s.status
)

View File

@ -1,6 +1,6 @@
@(form: Form[_])(implicit ctx: Context)
@layout(title = "New tournament") {
@layout(title = "New tournament", css = "mod.form") {
<div class="crud page-menu__content box box-pad">
<h1>New tournament</h1>
<form class="content_box_content form3" action="@routes.TournamentCrud.create" method="POST">

View File

@ -1,6 +1,6 @@
@(tour: lila.tournament.Tournament, form: Form[_])(implicit ctx: Context)
@layout(title = tour.fullName) {
@layout(title = tour.fullName, css = "mod.form") {
<div class="crud edit page-menu__content box box-pad">
<h1>
<a href="@routes.Tournament.show(tour.id)">@tour.fullName</a>

View File

@ -1,4 +1,4 @@
@(title: String, evenMoreJs: Html = emptyHtml)(body: Html)(implicit ctx: Context)
@(title: String, evenMoreJs: Html = emptyHtml, css: String = "mod.misc")(body: Html)(implicit ctx: Context)
@moreJs = {
@flatpickrTag
@ -8,7 +8,7 @@
@base.layout(
title = title,
moreCss = responsiveCssTag("mod.misc"),
moreCss = responsiveCssTag(css),
responsive = true,
moreJs = moreJs) {
<main class="page-menu">

View File

@ -14,10 +14,7 @@ object enterable {
tours map { tour =>
tr(
td(cls := "name")(
a(cls := "text", href := routes.Tournament.show(tour.id))(
span(dataIcon := tournamentIconChar(tour)),
tour.name
)
a(cls := "text", dataIcon := tournamentIconChar(tour), href := routes.Tournament.show(tour.id))(tour.name)
),
tour.schedule.fold(td()) { s => td(momentFromNow(s.at)) },
td(tour.durationString),

View File

@ -55,7 +55,7 @@ final class LiveStreamApi(
// requested = false,
// granted = true,
// ignored = false,
// autoFeatured = false,
// autoFeatured = true,
// chatEnabled = true
// ),
// picturePath = none,
@ -70,6 +70,7 @@ final class LiveStreamApi(
// updatedAt = DateTime.now
// ))
// )))
def of(s: Streamer.WithUser): Fu[Streamer.WithUserAndStream] = all.map { live =>
Streamer.WithUserAndStream(s.streamer, s.user, live get s.streamer)
}

View File

@ -28,7 +28,7 @@ final class Tv(trouper: Trouper, roundProxyGame: Game.ID => Fu[Option[Game]]) {
_.map(roundProxyGame).sequenceFu.map(_.flatten)
}
def getBestGame = getGame(Tv.Channel.Best)
def getBestGame = getGame(Tv.Channel.Best) orElse lila.game.GameRepo.random
def getBestAndHistory = getGameAndHistory(Tv.Channel.Best)

View File

@ -1,6 +1,5 @@
%base-font {
font-family: 'Noto Sans';
font-weight: normal;
}
%roboto {
font-family: 'Roboto';

View File

@ -1,9 +1,6 @@
.user_link {
@extend %nowrap-hidden;
color: $c-font;
&:hover {
color: $c-link;
}
.line {
@extend %data-icon;
color: $c-font;
@ -48,3 +45,6 @@
color: $c-bad;
}
}
a.user_link:hover {
color: $c-link;
}

View File

@ -0,0 +1,19 @@
.vstext {
@extend %flex-between, %nowrap-hidden, %box-neat;
background: $c-bg-box;
padding: .3em .6em;
&__center {
text-align: center;
}
&__pl,
&__op {
text-overflow: ellipsis;
overflow: hidden;
}
&__pl {
text-align: left;
}
&__op {
text-align: right;
}
}

View File

@ -0,0 +1,95 @@
.lobby {
&__box {
@extend %flex-column, %box-neat-force;
background: $c-bg-box;
&__top {
@extend %metal, %flex-between;
flex: 0 0 auto;
padding: .3em .5em;
.more {
color: $c-font-dim;
}
.title {
font-weight: bold;
color: $c-font-dim;
padding: .3em;
}
}
&__content {
overflow: hidden;
&:hover {
overflow-y: auto;
}
}
.user_link {
font-weight: bold;
color: $c-font-dim;
}
table {
width: 100%;
height: 100%;
}
td {
padding: .5em .4em;
border-top: $border;
white-space: nowrap;
}
tr:nth-child(even) {
background: $c-bg-zebra;
}
}
&__leaderboard,
&__winners {
td:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
td:last-child {
text-align: right;
padding-right: .7em;
}
}
&__forum .lobby__box__top,
&__blog .lobby__box__top {
border-bottom: $border;
}
&__forum {
max-height: 20em;
li {
margin: 0.6em 0;
padding-left: 9px;
line-height: 14px;
white-space: nowrap;
}
.extract {
font-weight: 300;
}
}
&__blog {
.post {
@extend %flex-between;
color: $c-font;
flex-wrap: nowrap;
overflow: hidden;
padding: .2em .5em;
&:hover {
background: mix($c-link, $c-bg-box, 15%);
}
.text {
flex: 1 1 100%;
}
strong {
display: block;
}
img {
height: 4em;
width: 4em;
margin-right: .8em;
}
time {
color: $c-font-dim;
white-space: nowrap;
}
}
}
}

View File

@ -0,0 +1,12 @@
.lobby__forum {
li {
margin: 0.6em 0;
padding-left: 9px;
line-height: 14px;
white-space: nowrap;
}
.extract {
font-family: 'Roboto';
font-weight: 300;
}
}

View File

@ -1,7 +1,6 @@
$mq-col2: $mq-medium;
$mq-col3: $mq-x-large;
$col2-app-height: minmax(500px, 70vh);
$app-tabs-height: 30px;
.lobby {
@ -27,20 +26,21 @@ $app-tabs-height: 30px;
@include breakpoint($mq-col2) {
grid-template-columns: repeat(3, minmax(150px, 350px));
grid-template-columns:
minmax(150px, 350px)
minmax(150px, 400px)
minmax(150px, 400px);
grid-template-rows: min-content $col2-app-height;
grid-template-rows: max-content fit-content(0) fit-content(0) fit-content(0);
grid-template-areas:
'table app app '
'side app app '
'tv leader winner'
'puzzle tours tours '
'. simuls simuls'
'. forum forum '
'. blog blog '
'. support support'
'. about about ';
'table app app'
'side app app'
'tv leader winner'
'puzzle tours tours '
'about simuls simuls'
'support forum forum '
'. blog blog';
}
@include breakpoint($mq-col3) {
@ -51,17 +51,19 @@ $app-tabs-height: 30px;
minmax(150px, 300px)
minmax(150px, 350px);
grid-template-rows: $col2-app-height;
grid-template-rows: fit-content(0) fit-content(0);
grid-template-areas:
'side app app table '
'side app app table'
'tv leader winner puzzle'
'. tours tours . '
'. simuls simuls . '
'. forum forum . '
'. blog blog . '
'. support support . '
'. about about . ';
'about tours tours support'
'. simuls simuls .'
'. forum forum .'
'. blog blog .';
&__tournaments {
max-height: 20em;
}
}
&__side { grid-area: side; }

View File

@ -1,7 +1,19 @@
@import 'layout';
@import 'app/app';
@import 'puzzle';
@import 'side';
@import 'table';
@import 'stream';
@import 'spotlight';
@import 'timeline';
@import 'box';
@import 'support';
.lobby__side {
@extend %flex-column;
margin-top: .3em;
overflow: hidden;
}
.lobby__about {
justify-self: center;
margin-top: .5em;
}

View File

@ -1,4 +1,6 @@
.lobby__puzzle {
.mini-board {
.vstext {
display: block;
text-align: center;
}
}

View File

@ -1,4 +0,0 @@
.lobby__side {
@extend %flex-column;
padding-top: $app-tabs-height;
}

View File

@ -1,5 +1,9 @@
.lobby__spotlights {
@extend %box-radius-force;
flex: 0 0 auto;
}
.tour-spotlight {
@extend %flex-center, %box-radius, %nowrap-hidden;
@extend %flex-center-nowrap, %nowrap-hidden;
flex: 0 0 auto;
padding: .3em;
opacity: 0.8;
@ -7,6 +11,7 @@
background: $c-bg-low;
text-shadow: $text-shadow;
color: $c-font;
border-bottom: 1px solid $c-bg-page;
&.invert,
&.event-spotlight,
&:hover {
@ -18,13 +23,11 @@
opacity: 1;
}
.img {
flex: 0 0 40px;
margin: 0 10px 0 5px;
flex: 0 0 50px;
margin: 0 .5em 0 .3em;
}
img.img {
width: 40px;
filter: brightness(9);
filter: brightness(9);
}
i.img,
.img.icon {
@ -32,7 +35,7 @@
}
i.img::before {
color: #fff;
font-size: 40px;
font-size: 50px;
text-shadow: 1px 1px 3px rgba(0,0,0,0.3);
}
.name {
@ -53,10 +56,10 @@
}
&.little {
.img {
flex: 0 0 2.2em;
flex: 0 0 40px;
margin: 0 .5em 0 .3em;
&::before {
font-size: 2.2em;
font-size: 40px;
}
}
}

View File

@ -0,0 +1,20 @@
.lobby__streams {
a.stream {
@extend %roboto, %nowrap-hidden;
color: $c-font-page;
display: block;
text-overflow: ellipsis;
margin-bottom: .5em;
line-height: .9;
strong {
@extend %base-font;
}
&.highlight strong {
color: $c-brag;
}
strong:before {
font-size: 1.5em;
margin-right: .1rem;
}
}
}

View File

@ -0,0 +1,49 @@
$c-support: $c-brag;
.lobby__support {
a {
@extend %flex-center, %box-neat;
background: $c-bg-box;
box-sizing: border-box;
font-size: 1.3em;
margin-bottom: $block-gap;
padding: .2em .5em;
@include transition();
&:hover {
background: $c-support;
}
&:hover,
&:hover * {
color: #fff;
}
&:hover i::before {
opacity: 1;
color: #fff;
}
}
i {
flex: 0 0 auto;
margin: 0 .5em;
&::before {
margin-right: .15em;
color: $c-support;
font-size: 2.6em;
opacity: 0.8;
}
}
&__text {
flex: 1 1 auto;
color: $c-support;
strong {
color: $c-support;
font-weight: normal;
display: block;
}
span {
@extend %nowrap-hidden;
text-overflow: ellipsis;
display: block;
font-size: .8em;
}
}
}

View File

@ -8,22 +8,28 @@
justify-content: center;
flex: 1 1 auto;
a {
margin: 1.2em 0;
font-size: 1.3em;
padding: 1em;
text-align: center;
letter-spacing: -1px;
&.disabled {
opacity: 0.2;
}
margin: .2em 0;
padding: .5em;
@include breakpoint($mq-col3) {
margin: 1.2em 0;
padding: 1em;
}
}
}
&__counters {
position: absolute;
bottom: 0;
@extend %flex-column;
@include breakpoint($mq-col3) {
position: absolute;
bottom: 0;
}
a {
color: $c-font;
color: $c-font-page;
}
}
}

View File

@ -1,6 +1,7 @@
.timeline {
flex: 1 1 auto;
margin-top: 1em;
color: $c-font-page;
overflow: hidden;
&:hover {
overflow-y: auto;
@ -9,7 +10,7 @@
@extend %roboto;
a {
@extend %base-font;
color: $c-font;
color: $c-font-page;
}
&:hover a {
color: $c-link;

View File

@ -3,6 +3,7 @@
.lobby__app {
@extend %flex-column;
height: 700px;
user-select: none;
&__content {
flex: 1 1 100%;

View File

@ -4,11 +4,11 @@
justify-content: center;
align-items: flex-start;
border-bottom: 2px solid $c-border;
> span {
span {
@extend %roboto, %box-radius-bottom;
flex: 1 1 0;
flex: 1 1 auto;
text-align: center;
font-size: .9em;
// font-size: .9em;
line-height: #{$app-tabs-height - 2px};
padding: 0 .1em;
cursor: pointer;
@ -35,4 +35,7 @@
color: $c-accent;
}
}
.unread {
margin-left: .3em;
}
}

View File

@ -1,4 +1,5 @@
@import '../../../common/css/plugin';
@import '../../../common/css/component/scroll-shadow';
@import '../../../common/css/component/now-playing';
@import '../../../common/css/component/vs';
@import '../lobby';

View File

@ -31,7 +31,7 @@ module.exports = function(cfg, element) {
return l.slice(0, 2).toLowerCase();
});
langs.push($('html').attr('lang'));
$('#streams_on_air a, .event-spotlight').each(function() {
$('.lobby__streams a, .event-spotlight').each(function() {
var match = $(this).text().match(/\[(\w{2})\]/mi);
if (match && langs.indexOf(match[1].toLowerCase()) === -1) $(this).hide();
});
@ -60,7 +60,7 @@ module.exports = function(cfg, element) {
});
},
streams: function(html) {
$('#streams_on_air').html(html);
$('.lobby__streams').html(html);
filterStreams();
},
featured: function(o) {

View File

@ -24,7 +24,7 @@ export default function(ctrl: LobbyController) {
ctrl.isBot ? undefined : tab(ctrl, 'seeks', active, [ctrl.trans.noarg('correspondence')]),
(active === 'now_playing' || ctrl.data.nbNowPlaying > 0 || ctrl.isBot) ? tab(ctrl, 'now_playing', active, [
ctrl.trans.plural('nbGamesInPlay', ctrl.data.nbNowPlaying),
myTurnPovsNb > 0 ? h('span.unread', myTurnPovsNb) : null
myTurnPovsNb > 0 ? h('i.unread', myTurnPovsNb) : null
]) : null
];
};

View File

@ -0,0 +1,5 @@
@import '../../../common/css/plugin';
@import '../../../common/css/form/form3';
@import '../../../common/css/form/cmn-toggle';
@import '../../../common/css/vendor/flatpickr';
@import '../mod/misc';

View File

@ -0,0 +1,2 @@
@import '../../../common/css/theme/dark';
@import 'mod.form';

View File

@ -0,0 +1,2 @@
@import '../../../common/css/theme/light';
@import 'mod.form';

View File

@ -0,0 +1,2 @@
@import '../../../common/css/theme/transp';
@import 'mod.form';