--- /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(" "))),
+ 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 {