# HG changeset patch # User Tomas Zeman # Date 1543923312 -3600 # Node ID de7c56ce06546cec27da94b0f9a6809d50c99cb1 # Parent 1a1347e8c5bea7ee2c56a16ee1e7fac014b9be5d Base layout, build info, UI libs diff -r 1a1347e8c5be -r de7c56ce0654 base/resources/public/css/site.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/resources/public/css/site.css Tue Dec 04 12:35:12 2018 +0100 @@ -0,0 +1,167 @@ +/* + * SQWL colors: + * - green: #006634 / #00532b / #008745 + * - red: #e94e1b + * - brown: #693e11 / #482500 / #9a744c / #eedece + */ + +body { + color: #693e11; +} + +h1, h2, h3, a { + color: #006634; +} + +small, h4 small { + color: #693e11; +} + +.col-centered{ + float: none; + margin: 0 auto; +} + +.jumbotron { + background-color: #eedece; +} + +.panel-title, .navbar-default .navbar-nav>li>a { + color: #006634; +} + +.panel-default { + border-color: #9a744c; +} + +.panel-default>.panel-heading { + background-color: #eedece; + border-color: #9a744c; + color: #693e11; +} + +.panel-default>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #9a744c; +} + +.panel-group .panel-heading+.panel-collapse>.list-group, +.panel-group .panel-heading+.panel-collapse>.panel-body { + border-top-color: #9a744c; +} + +.panel-footer { + background-color: #eedece; + border-color: #9a744c; +} + +.nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover, +.dropdown-menu>li>a { + color: #693e11; +} + +.navbar-brand { + font-size: 32px; +} + +.navbar-default { + background-color: #eedece; + border-color: #9a744c; +} + +.navbar-section { + font-size: 24px; +} + +.dropdown-menu>.active>a, .dropdown-menu>.active>a:focus, .dropdown-menu>.active>a:hover { + background-color: #006634; +} + +.btn-default { + border-color: #9a744c; + color: #693e11; + outline-color: #9a744c; +} + +.btn-default.active, .btn-default.focus, +.btn-default:active, .btn-default:focus, .btn-default:hover { + background-color: #eedece; + border-color: #9a744c; + color: #693e11; + outline-color: #9a744c; +} + +.btn-default.disabled, .btn-default.disabled.active, .btn-default.disabled.focus, +.btn-default.disabled:active, .btn-default.disabled:focus, +.btn-default.disabled:hover, .btn-default[disabled], .btn-default[disabled].active, +.btn-default[disabled].focus, .btn-default[disabled]:active, +.btn-default[disabled]:focus, .btn-default[disabled]:hover, +fieldset[disabled] .btn-default, fieldset[disabled] .btn-default.active, +fieldset[disabled] .btn-default.focus, fieldset[disabled] .btn-default:active, +fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:hover { + background-color: #eedece; + border-color: #9a744c; + color: #693e11; +} + +.btn-primary { + background-color: #006634; + border-color: #00532b; + outline-color: #00532b; +} + +.btn-primary.active, .btn-primary.focus, +.btn-primary:active, .btn-primary:focus, .btn-primary:hover { + background-color: #693e11; + border-color: #482500; + outline-color: #482500; +} + +.btn-primary.disabled, .btn-primary.disabled.active, .btn-primary.disabled.focus, +.btn-primary.disabled:active, .btn-primary.disabled:focus, +.btn-primary.disabled:hover, .btn-primary[disabled], .btn-primary[disabled].active, +.btn-primary[disabled].focus, .btn-primary[disabled]:active, +.btn-primary[disabled]:focus, .btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary.active, +fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:active, +fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:hover { + background-color: #008745; + border-color: #00532b; +} + +hr { + border-top-color: #eedece; +} + +.modal-header { + border-bottom-color: #eedece; +} + +div.modal-content a { + cursor: pointer; +} + +a.link { + cursor: pointer; +} + +/* SVG */ +svg g text { + cursor: default; +} + +svg g text.legend { + font-family: sans-serif; + font-size: 11px; + fill: #111; +} + +svg g line.level { + stroke: grey; + stroke-opacity: 0.75; + stroke-width: 0.3px; +} + +svg g line.level.level-val-100 { + stroke: #693e11; + stroke-width: 2px; +} diff -r 1a1347e8c5be -r de7c56ce0654 base/resources/public/images/icon.png Binary file base/resources/public/images/icon.png has changed diff -r 1a1347e8c5be -r de7c56ce0654 base/src/sqwl/cms/Layout.scala --- a/base/src/sqwl/cms/Layout.scala Thu Nov 29 12:20:20 2018 +0100 +++ b/base/src/sqwl/cms/Layout.scala Tue Dec 04 12:35:12 2018 +0100 @@ -1,13 +1,31 @@ package sqwl.cms +import BuildInfo.versions +import scalatags.Text.all import scalatags.Text.all._ import scalatags.Text.tags2 import scalatags.Text.TypedTag +import sqwl.cms.layout.Navbar -object Layout { +object Layout extends config { + + lazy val bootstrapCss = s"/${http.prefix}/assets/bootstrap/${versions.bootstrap}/css/bootstrap.min.css" + lazy val bootstrapJs = s"/${http.prefix}/assets/bootstrap/${versions.bootstrap}/js/bootstrap.min.js" + lazy val fontAwesomeCss = s"/${http.prefix}/assets/font-awesome/${versions.fontAwesome}/css/all.min.css" + lazy val siteCss = s"/${http.prefix}/public/css/site.css?${BuildInfo.hgId}" + lazy val jquery = s"/${http.prefix}/assets/jquery/${versions.jquery}/jquery.min.js" + def apply(content: iContent, st: ViewState): TypedTag[String] = { html( head( + tags2.style(""" + |.nav, .pagination, .carousel, .panel-title a, .panel a { cursor: pointer; }""".stripMargin), + meta(charset:="utf-8"), + meta(name:="viewport", all.content:="width=device-width, initial-scale=1"), + link(rel:="stylesheet", href:=bootstrapCss), + link(rel:="stylesheet", href:=fontAwesomeCss), + link(rel:="stylesheet", href:=siteCss), + link(rel:="icon", href:="favicon.ico"), tags2.title(st match { case ViewArticle(v) => v.title case ViewCategory(v) => v.name @@ -15,21 +33,21 @@ case Dashboard => "SQWL" case News => "Novinky" }) - ), - body( - div("foo"), - st match { - case ViewArticle(article) => div( - a(href:=article.pathSegment, article.title), - raw(article.htmlContent) - ) - case _ => "" - }, - div( - content.categories map(c => div(a(href:=c.pathSegment, c.name))) - ) - + body(paddingTop:=120, + Navbar(content, st), + div(role:="main", cls:="container", + st match { + case ViewArticle(article) => div( + a(href:=article.pathSegment, article.title), + raw(article.htmlContent) + ) + case _ => "" + } + ), + footer(id:="footer", p(raw(" "))), + script(src:=jquery), + script(src:=bootstrapJs) ) ) } diff -r 1a1347e8c5be -r de7c56ce0654 base/src/sqwl/cms/layout/Navbar.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/src/sqwl/cms/layout/Navbar.scala Tue Dec 04 12:35:12 2018 +0100 @@ -0,0 +1,47 @@ +package sqwl.cms.layout + +import scalatags.Text.all._ +import scalatags.Text.tags2 +import scalatags.Text.TypedTag +import sqwl.cms.{ViewState, config, iContent} + +object Navbar extends config { + + def apply(cnt: iContent, st: ViewState): TypedTag[String] = { + + val navMenu = ul(cls:="nav navbar-nav navbar-right", + li(a(href:="#about", "O aplikaci")) + ) + + val navSections = ul(cls:="nav navbar-nav navbar-section", width:="100%", + cnt.categories map(c => + li(cls:="text-center", a(href:=c.pathSegment, c.name)) + ) + ) + + header(cls:="navbar navbar-default navbar-fixed-top", id:="topnavbar", + div(cls:="navbar-inner", + div(cls:="container", + div(cls:="navbar-header", + button(`type`:="button", cls:="navbar-toggle", + attr("data-target"):="#navbar1", + span(cls:="sr-only", "Navigation"), + span(cls:="icon-bar"), + span(cls:="icon-bar"), + span(cls:="icon-bar") + ), + a(href:="#", cls:="navbar-brand", paddingTop:=4, paddingBottom:=4, + img(src:=s"/${http.prefix}/public/images/icon.png", alt:="SQWL", width:=40, height:=40)), + a(href:="#", cls:="navbar-brand visible-xs", + span("KPŽ")), + a(href:="#", cls:="navbar-brand hidden-xs", + span("Kvalita pracovního života v České republice")) + ), + tag("nav")(cls:="hidden-xs", navMenu) + ) + ), + div(cls:="navbar-inner hidden-xs", div(id:="navbar1", cls:="container", tag("nav")(navSections))) + ) + } + +} diff -r 1a1347e8c5be -r de7c56ce0654 build.sc --- a/build.sc Thu Nov 29 12:20:20 2018 +0100 +++ b/build.sc Tue Dec 04 12:35:12 2018 +0100 @@ -53,9 +53,20 @@ "-Xfuture", // Turn on future language features. "-target:jvm-1.8", )} + + def hgId: Input[String] = T.input { + os.proc("hg", "id", "-i").call().out.string.trim + } } -object base extends Common { +trait Versions { + //val bootstrap = "4.1.3" + val bootstrap = "3.3.7" + val fontAwesome = "5.5.0" + val jquery = "3.3.1-1" +} + +object base extends Common with Versions { override def scalacPluginIvyDeps: Target[Loose.Agg[Dep]] = super.scalacPluginIvyDeps() ++ Agg( ivy"org.scalamacros:::paradise:2.1.0" ) @@ -67,14 +78,33 @@ ivy"org.json4s::json4s-native:3.6.2", ivy"ch.qos.logback:logback-classic:1.2.3", ivy"com.lihaoyi::scalatags:0.6.7", - ivy"org.webjars:bootstrap:4.1.3", - ivy"org.webjars:font-awesome:5.5.0" + ivy"org.webjars:bootstrap:$bootstrap", + ivy"org.webjars:font-awesome:$fontAwesome", + ivy"org.webjars:jquery:$jquery" ) override def scalacOptions = T{super.scalacOptions.map(_ :+ "-Xmacro-settings:conf.output.dir=base/resources" )} + override def generatedSources: Target[Seq[PathRef]] = T{ + val dir = T.ctx().dest + write(dir / "buildInfo.scala", + s""" + | package sqwl.cms + | object BuildInfo { + | object versions { + | val bootstrap = "$bootstrap" + | val fontAwesome = "$fontAwesome" + | val jquery = "$jquery" + | } + | + | val hgId = "${hgId()}" + | } + """.stripMargin) + Seq(PathRef(dir)) + } + } object content extends Common {