Base layout, build info, UI libs
authorTomas Zeman <tzeman@volny.cz>
Tue, 04 Dec 2018 12:35:12 +0100
changeset 5 de7c56ce0654
parent 4 1a1347e8c5be
child 6 ba89bccede7e
Base layout, build info, UI libs
base/resources/public/css/site.css
base/resources/public/images/icon.png
base/src/sqwl/cms/Layout.scala
base/src/sqwl/cms/layout/Navbar.scala
build.sc
--- /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;
+}
Binary file base/resources/public/images/icon.png has changed
--- 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("&nbsp;"))),
+        script(src:=jquery),
+        script(src:=bootstrapJs)
       )
     )
   }
--- /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)))
+    )
+  }
+
+}
--- 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 {