diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ff2ae26
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+.idea*
+*.iml
+project/target
+target
+lib
+out
+.DS_Store
+.gitconfig
+.vscode
+.bloop
+.metals
diff --git a/.scalafmt.conf b/.scalafmt.conf
new file mode 100644
index 0000000..f4a5aed
--- /dev/null
+++ b/.scalafmt.conf
@@ -0,0 +1 @@
+version = "2.4.2"
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..533765f
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,7 @@
+# Changes #
+
+## Versions
+
+### 0.1.0-SNAPSHOT
+
+* initial Version
\ No newline at end of file
diff --git a/README.md b/README.md
index 243604d..3735cc9 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,7 @@
# Chatto-Desktop-ScalaFX
-WIP desktop client for Chatto reimplemented in ScalaFX and Sapphire Framework
\ No newline at end of file
+WIP desktop client for Chatto reimplemented in ScalaFX and Sapphire Framework
+
+## Based on Sapphire
+
+A JavaFX Application Framework for Scala User. [https://sfxcode.github.io/sapphire-core](https://sfxcode.github.io/sapphire-core)
diff --git a/build.sbt b/build.sbt
new file mode 100644
index 0000000..4bec638
--- /dev/null
+++ b/build.sbt
@@ -0,0 +1,84 @@
+name := "chatto-sapphire"
+
+organization := "wow.doge"
+
+scalaVersion := "2.13.1"
+
+mainClass := Some("wow.doge.chatto.Application")
+
+resolvers += "sfxcode-maven" at "https://bintray.com/sfxcode/maven/"
+resolvers += "javafx-markdown-renderer" at "https://sandec.bintray.com/repo"
+
+libraryDependencies += "org.specs2" %% "specs2-core" % "4.7.1" % Test
+
+val JavaFXVersion = "11.0.2"
+
+val osName = System.getProperty("os.name") match {
+ case n if n.startsWith("Linux") => "linux"
+ case n if n.startsWith("Mac") => "mac"
+ case n if n.startsWith("Windows") => "win"
+ case _ => throw new Exception("Unknown platform!")
+}
+
+fork := true
+
+libraryDependencies ++= Seq(
+ "base",
+ "controls",
+ "fxml",
+ "graphics",
+ "media",
+ "swing",
+ "web"
+).map(m => "org.openjfx" % s"javafx-$m" % JavaFXVersion classifier osName)
+
+libraryDependencies += "com.sfxcode.sapphire" %% "sapphire-core" % "1.7.3"
+
+libraryDependencies += "com.sfxcode.sapphire" %% "sapphire-extension" % "1.0.6"
+
+libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3"
+
+libraryDependencies ++= Seq(
+ "org.scalafx" %% "scalafx" % "12.0.2-R18",
+ "org.scalafx" %% "scalafx-extras" % "0.3.4",
+ "com.softwaremill.sttp.client" %% "json4s" % "2.1.1",
+ "org.json4s" %% "json4s-native" % "3.6.7",
+ "org.scala-lang.modules" %% "scala-async" % "0.10.0",
+ "org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided,
+ // "org.kordamp.ikonli" %% "ikonli-javafx" % "11.4.0",
+ // "org.kordamp.ikonli" %% "ikonli-fontawesome-pack" % "11.4.0",
+ // "org.kordamp.ikonli" %% "ikonli-fontawesome5-pack" % "11.4.0",
+ "org.jsoup" % "jsoup" % "1.13.1",
+ "com.sandec" % "mdfx" % "0.1.6",
+ "com.softwaremill.sttp.client" %% "async-http-client-backend-future" % "2.1.1",
+ "com.softwaremill.quicklens" %% "quicklens" % "1.5.0"
+)
+libraryDependencies += "org.asynchttpclient" % "async-http-client" % "2.12.1"
+libraryDependencies += "com.softwaremill.macwire" %% "macros" % "2.3.3"
+scalacOptions ++= Seq("-Ymacro-annotations", "-deprecation")
+
+libraryDependencies += "org.scalafx" %% "scalafxml-core-sfx8" % "0.5"
+// https://mvnrepository.com/artifact/com.jfoenix/jfoenix
+libraryDependencies += "com.jfoenix" % "jfoenix" % "9.0.9"
+// https://mvnrepository.com/artifact/org.kordamp.bootstrapfx/bootstrapfx-core
+libraryDependencies += "org.kordamp.bootstrapfx" % "bootstrapfx-core" % "0.2.4"
+
+enablePlugins(BuildInfoPlugin)
+
+buildInfoPackage := "wow.doge.chatto"
+
+buildInfoOptions += BuildInfoOption.BuildTime
+
+enablePlugins(JavaFxPlugin)
+
+javaFxMainClass := "wow.doge.chatto.Application"
+
+javaFxJvmargs := Seq("-Xms512m", "-Xmx1024m", "-XX:ReservedCodeCacheSize=128m")
+
+javaFxTitle := "chatto-sapphire"
+
+javaFxCategory := "Aplication"
+
+javaFxNativeBundles := "image"
+
+javaFxVerbose := true
diff --git a/project/build.properties b/project/build.properties
new file mode 100644
index 0000000..a919a9b
--- /dev/null
+++ b/project/build.properties
@@ -0,0 +1 @@
+sbt.version=1.3.8
diff --git a/project/metals.sbt b/project/metals.sbt
new file mode 100644
index 0000000..e36d9e9
--- /dev/null
+++ b/project/metals.sbt
@@ -0,0 +1,4 @@
+// DO NOT EDIT! This file is auto-generated.
+// This file enables sbt-bloop to create bloop config files.
+
+addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.0-RC1-229-b7c15aa9")
diff --git a/project/plugin.sbt b/project/plugin.sbt
new file mode 100644
index 0000000..56e0685
--- /dev/null
+++ b/project/plugin.sbt
@@ -0,0 +1,6 @@
+addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.5.0")
+
+addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.9.0")
+
+addSbtPlugin("com.quadstingray" % "sbt-javafx" % "1.5.2")
+
diff --git a/src/main/resources/META-INF/beans.xml b/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf
new file mode 100644
index 0000000..98fce76
--- /dev/null
+++ b/src/main/resources/application.conf
@@ -0,0 +1,8 @@
+sapphire.core.fxml.basePath="/fxml/"
+application.name = "Application"
+project.name = "chatto-sapphire"
+project.version = "0.1.0-SNAPSHOT"
+stage.default {
+ height = 600
+ width = 800
+}
\ No newline at end of file
diff --git a/src/main/resources/bundles/application.properties b/src/main/resources/bundles/application.properties
new file mode 100644
index 0000000..d527374
--- /dev/null
+++ b/src/main/resources/bundles/application.properties
@@ -0,0 +1 @@
+navigation.toggle=Toggle Workspace
\ No newline at end of file
diff --git a/src/main/resources/bundles/application_de.properties b/src/main/resources/bundles/application_de.properties
new file mode 100644
index 0000000..dee264b
--- /dev/null
+++ b/src/main/resources/bundles/application_de.properties
@@ -0,0 +1 @@
+navigation.toggle=Bereich wechseln
\ No newline at end of file
diff --git a/src/main/resources/fxml/Chat.fxml b/src/main/resources/fxml/Chat.fxml
new file mode 100644
index 0000000..7b2beb4
--- /dev/null
+++ b/src/main/resources/fxml/Chat.fxml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/fxml/Login.fxml b/src/main/resources/fxml/Login.fxml
new file mode 100644
index 0000000..f0d10d0
--- /dev/null
+++ b/src/main/resources/fxml/Login.fxml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/fxml/MainView.fxml b/src/main/resources/fxml/MainView.fxml
new file mode 100644
index 0000000..c844e78
--- /dev/null
+++ b/src/main/resources/fxml/MainView.fxml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/fxml/Navigation.fxml b/src/main/resources/fxml/Navigation.fxml
new file mode 100644
index 0000000..3698833
--- /dev/null
+++ b/src/main/resources/fxml/Navigation.fxml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/fxml/UserBox.fxml b/src/main/resources/fxml/UserBox.fxml
new file mode 100644
index 0000000..1d9da75
--- /dev/null
+++ b/src/main/resources/fxml/UserBox.fxml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/fxml/Workspace.fxml b/src/main/resources/fxml/Workspace.fxml
new file mode 100644
index 0000000..f5cfe4c
--- /dev/null
+++ b/src/main/resources/fxml/Workspace.fxml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/fxml/default.css b/src/main/resources/fxml/default.css
new file mode 100644
index 0000000..949ff07
--- /dev/null
+++ b/src/main/resources/fxml/default.css
@@ -0,0 +1,29 @@
+.navigation {
+ -fx-background-color: derive(cadetblue, 60%);
+ -fx-font-size: 14px;
+}
+
+.status {
+ -fx-background-color: derive(lightgray, 30%);
+ -fx-font-size: 12px;
+}
+
+.workspace2 {
+ -fx-background-color: azure;
+ -fx-font-size: 16px;
+}
+
+.workspace {
+ -fx-background-color: beige;
+ -fx-font-size: 13px;
+}
+
+.personPane {
+ -fx-font-size: 11px;
+}
+
+
+
+
+
+
diff --git a/src/main/resources/images/backgroung.jpg b/src/main/resources/images/backgroung.jpg
new file mode 100644
index 0000000..30849ba
Binary files /dev/null and b/src/main/resources/images/backgroung.jpg differ
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..afaebf8
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/styles/bootstrapfx.css b/src/main/resources/styles/bootstrapfx.css
new file mode 100644
index 0000000..8aa5448
--- /dev/null
+++ b/src/main/resources/styles/bootstrapfx.css
@@ -0,0 +1,1513 @@
+/*!
+ * BootstrapFX v0.1.0
+ * Copyright 2015 Andres Almiray
+ */
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+* {
+ -fx-font-family: 'sans-serif';
+}
+
+.b,
+.strong {
+ -fx-font-weight: bold;
+}
+
+.i,
+.em,
+.italic,
+.dfn {
+ -fx-font-style: italic;
+}
+
+.h1 {
+ -fx-font-size: 2em;
+}
+
+.small {
+ -fx-font-size: 80%;
+}
+
+.code,
+.kbd,
+.pre,
+.samp {
+ -fx-font-family: 'monospace';
+ -fx-font-size: 1em;
+}
+
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ -fx-text-fill: inherit;
+ -fx-fill: inherit;
+}
+.h1 small,
+.h1 .small, .h2 small,
+.h2 .small, .h3 small,
+.h3 .small, .h4 small,
+.h4 .small, .h5 small,
+.h5 .small, .h6 small,
+.h6 .small {
+ -fx-font-weight: normal;
+ -fx-text-fill: #777777;
+ -fx-fill: #777777;
+}
+
+.h1 small,
+.h1 .small,
+.h2 small,
+.h2 .small,
+.h3 small,
+.h3 .small {
+ -fx-font-size: 65%;
+}
+
+.h4 small,
+.h4 .small,
+.h5 small,
+.h5 .small,
+.h6 small,
+.h6 .small {
+ -fx-font-size: 75%;
+}
+
+.h1 {
+ -fx-font-size: 36px;
+}
+
+.h2 {
+ -fx-font-size: 30px;
+}
+
+.h3 {
+ -fx-font-size: 24px;
+}
+
+.h4 {
+ -fx-font-size: 18px;
+}
+
+.h5 {
+ -fx-font-size: 14px;
+}
+
+.h6 {
+ -fx-font-size: 12px;
+}
+
+.lead {
+ -fx-font-size: 16px;
+ -fx-font-weight: 300;
+}
+
+.small {
+ -fx-font-size: 85%;
+}
+
+/*
+.mark {
+ -fx-background-color: $state-warning-bg;
+ -fx-padding: .2em;
+}
+*/
+.text-left {
+ -fx-text-alignment: left;
+}
+
+.text-right {
+ -fx-text-alignment: right;
+}
+
+.text-center {
+ -fx-text-alignment: center;
+}
+
+.text-justify {
+ -fx-text-alignment: justify;
+}
+
+.text-muted {
+ -fx-text-fill: #777777;
+ -fx-fill: #777777;
+}
+
+.text-primary {
+ -fx-text-fill: #337ab7;
+ -fx-fill: #337ab7;
+}
+
+a.text-primary:hover,
+a.text-primary:focused {
+ -fx-text-fill: #286090;
+ -fx-fill: #286090;
+}
+
+.text-success {
+ -fx-text-fill: #3c763d;
+ -fx-fill: #3c763d;
+}
+
+a.text-success:hover,
+a.text-success:focused {
+ -fx-text-fill: #2b542c;
+ -fx-fill: #2b542c;
+}
+
+.text-info {
+ -fx-text-fill: #31708f;
+ -fx-fill: #31708f;
+}
+
+a.text-info:hover,
+a.text-info:focused {
+ -fx-text-fill: #245269;
+ -fx-fill: #245269;
+}
+
+.text-warning {
+ -fx-text-fill: #8a6d3b;
+ -fx-fill: #8a6d3b;
+}
+
+a.text-warning:hover,
+a.text-warning:focused {
+ -fx-text-fill: #66512c;
+ -fx-fill: #66512c;
+}
+
+.text-danger {
+ -fx-text-fill: #a94442;
+ -fx-fill: #a94442;
+}
+
+a.text-danger:hover,
+a.text-danger:focused {
+ -fx-text-fill: #843534;
+ -fx-fill: #843534;
+}
+
+.bg-primary {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+}
+
+.bg-primary {
+ -fx-background-color: #337ab7;
+}
+
+a.bg-primary:hover,
+a.bg-primary:focused {
+ --fxbackground-color: #286090;
+}
+
+.bg-success {
+ -fx-background-color: #dff0d8;
+}
+
+a.bg-success:hover,
+a.bg-success:focused {
+ --fxbackground-color: #c1e2b3;
+}
+
+.bg-info {
+ -fx-background-color: #d9edf7;
+}
+
+a.bg-info:hover,
+a.bg-info:focused {
+ --fxbackground-color: #afd9ee;
+}
+
+.bg-warning {
+ -fx-background-color: #fcf8e3;
+}
+
+a.bg-warning:hover,
+a.bg-warning:focused {
+ --fxbackground-color: #f7ecb5;
+}
+
+.bg-danger {
+ -fx-background-color: #f2dede;
+}
+
+a.bg-danger:hover,
+a.bg-danger:focused {
+ --fxbackground-color: #e4b9b9;
+}
+
+.btn {
+ -fx-font-weight: normal;
+ -fx-text-alignment: center;
+ -fx-cursor: default;
+ -fx-border-color: transparent;
+ -fx-border-width: 1px;
+ -fx-border-style: solid;
+ -fx-background-insets: 0, 0, -1, 0;
+ -fx-padding: 6px 12px 6px 12px;
+ -fx-font-size: 14px;
+ -fx-border-radius: 4px;
+ -fx-background-radius: 4px;
+ -fx-min-width: 80;
+}
+.btn:hover, .btn:focused, .btn.focused {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+}
+.btn:pressed, .btn.pressed {
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.125), 5px, 0, 0, 3px);
+}
+.btn.disabled, .btn[disabled], fieldset[disabled] .btn {
+ -fx-cursor: wait;
+ -fx-opacity: 0.65;
+}
+
+.btn-default {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #fff;
+ -fx-border-color: #ccc;
+}
+.btn-default:focused, .btn-default.focused {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #8c8c8c;
+}
+.btn-default:hover {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #adadad;
+}
+.btn-default:pressed, .btn-default.pressed, .open > .btn-default.dropdown-toggle {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #adadad;
+}
+.btn-default:pressed:hover, .btn-default:pressed:focused, .btn-default:pressed.focused, .btn-default.pressed:hover, .btn-default.pressed:focused, .btn-default.pressed.focused, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focused, .open > .btn-default.dropdown-toggle.focused {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #d4d4d4;
+ -fx-border-color: #8c8c8c;
+}
+.btn-default:selected, .btn-default.selected {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #adadad;
+}
+.btn-default:selected:hover, .btn-default:selected:focused, .btn-default:selected.focused, .btn-default.selected:hover, .btn-default.selected:focused, .btn-default.selected.focused {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #d4d4d4;
+ -fx-border-color: #8c8c8c;
+}
+.btn-default:pressed, .btn-default.pressed, .open > .btn-default.dropdown-toggle {
+ background-image: none;
+}
+.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focused, .btn-default.disabled.focused, .btn-default.disabled:pressed, .btn-default.disabled.pressed, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focused, .btn-default[disabled].focused, .btn-default[disabled]:pressed, .btn-default[disabled].pressed, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focused, fieldset[disabled] .btn-default.focused, fieldset[disabled] .btn-default:pressed, fieldset[disabled] .btn-default.pressed {
+ -fx-background-color: #fff;
+ -fx-border-color: #ccc;
+}
+.btn-default .badge {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #333;
+}
+
+.btn-primary {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #337ab7;
+ -fx-border-color: #2e6da4;
+}
+.btn-primary:focused, .btn-primary.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #122b40;
+}
+.btn-primary:hover {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #204d74;
+}
+.btn-primary:pressed, .btn-primary.pressed, .open > .btn-primary.dropdown-toggle {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #204d74;
+}
+.btn-primary:pressed:hover, .btn-primary:pressed:focused, .btn-primary:pressed.focused, .btn-primary.pressed:hover, .btn-primary.pressed:focused, .btn-primary.pressed.focused, .open > .btn-primary.dropdown-toggle:hover, .open > .btn-primary.dropdown-toggle:focused, .open > .btn-primary.dropdown-toggle.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #204d74;
+ -fx-border-color: #122b40;
+}
+.btn-primary:selected, .btn-primary.selected {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #204d74;
+}
+.btn-primary:selected:hover, .btn-primary:selected:focused, .btn-primary:selected.focused, .btn-primary.selected:hover, .btn-primary.selected:focused, .btn-primary.selected.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #204d74;
+ -fx-border-color: #122b40;
+}
+.btn-primary:pressed, .btn-primary.pressed, .open > .btn-primary.dropdown-toggle {
+ background-image: none;
+}
+.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focused, .btn-primary.disabled.focused, .btn-primary.disabled:pressed, .btn-primary.disabled.pressed, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focused, .btn-primary[disabled].focused, .btn-primary[disabled]:pressed, .btn-primary[disabled].pressed, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focused, fieldset[disabled] .btn-primary.focused, fieldset[disabled] .btn-primary:pressed, fieldset[disabled] .btn-primary.pressed {
+ -fx-background-color: #337ab7;
+ -fx-border-color: #2e6da4;
+}
+.btn-primary .badge {
+ -fx-text-fill: #337ab7;
+ -fx-fill: #337ab7;
+ -fx-background-color: #fff;
+}
+
+.btn-success {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #5cb85c;
+ -fx-border-color: #4cae4c;
+}
+.btn-success:focused, .btn-success.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #255625;
+}
+.btn-success:hover {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #398439;
+}
+.btn-success:pressed, .btn-success.pressed, .open > .btn-success.dropdown-toggle {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #398439;
+}
+.btn-success:pressed:hover, .btn-success:pressed:focused, .btn-success:pressed.focused, .btn-success.pressed:hover, .btn-success.pressed:focused, .btn-success.pressed.focused, .open > .btn-success.dropdown-toggle:hover, .open > .btn-success.dropdown-toggle:focused, .open > .btn-success.dropdown-toggle.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #398439;
+ -fx-border-color: #255625;
+}
+.btn-success:selected, .btn-success.selected {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #398439;
+}
+.btn-success:selected:hover, .btn-success:selected:focused, .btn-success:selected.focused, .btn-success.selected:hover, .btn-success.selected:focused, .btn-success.selected.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #398439;
+ -fx-border-color: #255625;
+}
+.btn-success:pressed, .btn-success.pressed, .open > .btn-success.dropdown-toggle {
+ background-image: none;
+}
+.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focused, .btn-success.disabled.focused, .btn-success.disabled:pressed, .btn-success.disabled.pressed, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focused, .btn-success[disabled].focused, .btn-success[disabled]:pressed, .btn-success[disabled].pressed, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focused, fieldset[disabled] .btn-success.focused, fieldset[disabled] .btn-success:pressed, fieldset[disabled] .btn-success.pressed {
+ -fx-background-color: #5cb85c;
+ -fx-border-color: #4cae4c;
+}
+.btn-success .badge {
+ -fx-text-fill: #5cb85c;
+ -fx-fill: #5cb85c;
+ -fx-background-color: #fff;
+}
+
+.btn-info {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #5bc0de;
+ -fx-border-color: #46b8da;
+}
+.btn-info:focused, .btn-info.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #1b6d85;
+}
+.btn-info:hover {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #269abc;
+}
+.btn-info:pressed, .btn-info.pressed, .open > .btn-info.dropdown-toggle {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #269abc;
+}
+.btn-info:pressed:hover, .btn-info:pressed:focused, .btn-info:pressed.focused, .btn-info.pressed:hover, .btn-info.pressed:focused, .btn-info.pressed.focused, .open > .btn-info.dropdown-toggle:hover, .open > .btn-info.dropdown-toggle:focused, .open > .btn-info.dropdown-toggle.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #269abc;
+ -fx-border-color: #1b6d85;
+}
+.btn-info:selected, .btn-info.selected {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #269abc;
+}
+.btn-info:selected:hover, .btn-info:selected:focused, .btn-info:selected.focused, .btn-info.selected:hover, .btn-info.selected:focused, .btn-info.selected.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #269abc;
+ -fx-border-color: #1b6d85;
+}
+.btn-info:pressed, .btn-info.pressed, .open > .btn-info.dropdown-toggle {
+ background-image: none;
+}
+.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focused, .btn-info.disabled.focused, .btn-info.disabled:pressed, .btn-info.disabled.pressed, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focused, .btn-info[disabled].focused, .btn-info[disabled]:pressed, .btn-info[disabled].pressed, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focused, fieldset[disabled] .btn-info.focused, fieldset[disabled] .btn-info:pressed, fieldset[disabled] .btn-info.pressed {
+ -fx-background-color: #5bc0de;
+ -fx-border-color: #46b8da;
+}
+.btn-info .badge {
+ -fx-text-fill: #5bc0de;
+ -fx-fill: #5bc0de;
+ -fx-background-color: #fff;
+}
+
+.btn-warning {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #f0ad4e;
+ -fx-border-color: #eea236;
+}
+.btn-warning:focused, .btn-warning.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #985f0d;
+}
+.btn-warning:hover {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #d58512;
+}
+.btn-warning:pressed, .btn-warning.pressed, .open > .btn-warning.dropdown-toggle {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #d58512;
+}
+.btn-warning:pressed:hover, .btn-warning:pressed:focused, .btn-warning:pressed.focused, .btn-warning.pressed:hover, .btn-warning.pressed:focused, .btn-warning.pressed.focused, .open > .btn-warning.dropdown-toggle:hover, .open > .btn-warning.dropdown-toggle:focused, .open > .btn-warning.dropdown-toggle.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #d58512;
+ -fx-border-color: #985f0d;
+}
+.btn-warning:selected, .btn-warning.selected {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #d58512;
+}
+.btn-warning:selected:hover, .btn-warning:selected:focused, .btn-warning:selected.focused, .btn-warning.selected:hover, .btn-warning.selected:focused, .btn-warning.selected.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #d58512;
+ -fx-border-color: #985f0d;
+}
+.btn-warning:pressed, .btn-warning.pressed, .open > .btn-warning.dropdown-toggle {
+ background-image: none;
+}
+.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focused, .btn-warning.disabled.focused, .btn-warning.disabled:pressed, .btn-warning.disabled.pressed, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focused, .btn-warning[disabled].focused, .btn-warning[disabled]:pressed, .btn-warning[disabled].pressed, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focused, fieldset[disabled] .btn-warning.focused, fieldset[disabled] .btn-warning:pressed, fieldset[disabled] .btn-warning.pressed {
+ -fx-background-color: #f0ad4e;
+ -fx-border-color: #eea236;
+}
+.btn-warning .badge {
+ -fx-text-fill: #f0ad4e;
+ -fx-fill: #f0ad4e;
+ -fx-background-color: #fff;
+}
+
+.btn-danger {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #d9534f;
+ -fx-border-color: #d43f3a;
+}
+.btn-danger:focused, .btn-danger.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #761c19;
+}
+.btn-danger:hover {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #ac2925;
+}
+.btn-danger:pressed, .btn-danger.pressed, .open > .btn-danger.dropdown-toggle {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #ac2925;
+}
+.btn-danger:pressed:hover, .btn-danger:pressed:focused, .btn-danger:pressed.focused, .btn-danger.pressed:hover, .btn-danger.pressed:focused, .btn-danger.pressed.focused, .open > .btn-danger.dropdown-toggle:hover, .open > .btn-danger.dropdown-toggle:focused, .open > .btn-danger.dropdown-toggle.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ac2925;
+ -fx-border-color: #761c19;
+}
+.btn-danger:selected, .btn-danger.selected {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #ac2925;
+}
+.btn-danger:selected:hover, .btn-danger:selected:focused, .btn-danger:selected.focused, .btn-danger.selected:hover, .btn-danger.selected:focused, .btn-danger.selected.focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ac2925;
+ -fx-border-color: #761c19;
+}
+.btn-danger:pressed, .btn-danger.pressed, .open > .btn-danger.dropdown-toggle {
+ background-image: none;
+}
+.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focused, .btn-danger.disabled.focused, .btn-danger.disabled:pressed, .btn-danger.disabled.pressed, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focused, .btn-danger[disabled].focused, .btn-danger[disabled]:pressed, .btn-danger[disabled].pressed, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focused, fieldset[disabled] .btn-danger.focused, fieldset[disabled] .btn-danger:pressed, fieldset[disabled] .btn-danger.pressed {
+ -fx-background-color: #d9534f;
+ -fx-border-color: #d43f3a;
+}
+.btn-danger .badge {
+ -fx-text-fill: #d9534f;
+ -fx-fill: #d9534f;
+ -fx-background-color: #fff;
+}
+
+.btn-lg {
+ -fx-padding: 10px 16px 10px 16px;
+ -fx-font-size: 18px;
+ -fx-border-radius: 6px;
+ -fx-background-radius: 6px;
+}
+
+.btn-sm {
+ -fx-padding: 5px 10px 5px 10px;
+ -fx-font-size: 12px;
+ -fx-border-radius: 3px;
+ -fx-background-radius: 3px;
+}
+
+.btn-xs {
+ -fx-padding: 1px 5px 1px 5px;
+ -fx-font-size: 12px;
+ -fx-border-radius: 3px;
+ -fx-background-radius: 3px;
+}
+
+.btn-block {
+ width: 100%;
+}
+
+.split-menu-btn {
+ -fx-font-weight: normal;
+ -fx-text-alignment: center;
+ -fx-cursor: default;
+ -fx-border-color: transparent;
+ -fx-border-width: 1px;
+ -fx-border-style: solid;
+ -fx-background-insets: 0, 0, -1, 0;
+ -fx-font-size: 14px;
+ -fx-border-radius: 4px;
+ -fx-background-radius: 4px;
+ -fx-min-width: 80;
+}
+.split-menu-btn > .label {
+ -fx-border-radius: 4px 0 0 4px;
+ -fx-background-radius: 3px 0 0 3px;
+ -fx-border-width: 1 0 1 1;
+}
+.split-menu-btn > .arrow-button {
+ -fx-border-radius: 0 4px 4px 0;
+ -fx-background-radius: 0 3px 3px 0;
+}
+.split-menu-btn:hover > .label, .split-menu-btn:hover > .arrow-button, .split-menu-btn:focused > .label, .split-menu-btn:focused > .arrow-button, .split-menu-btn.focused > .label, .split-menu-btn.focused > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+}
+.split-menu-btn:pressed, .split-menu-btn.pressed {
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.125), 5px, 0, 0, 3px);
+}
+.split-menu-btn:pressed > .label, .split-menu-btn:pressed > .arrow-button, .split-menu-btn.pressed > .label, .split-menu-btn.pressed > .arrow-button {
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.125), 5px, 0, 0, 3px);
+}
+.split-menu-btn.disabled, .split-menu-btn[disabled], fieldset[disabled] .split-menu-btn {
+ -fx-cursor: wait;
+ -fx-opacity: 0.65;
+}
+
+.split-menu-btn-default > .arrow {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+}
+.split-menu-btn-default > .label, .split-menu-btn-default > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #fff;
+ -fx-border-color: #fff;
+}
+.split-menu-btn-default:focused > .label, .split-menu-btn-default:focused > .arrow-button, .split-menu-btn-default.focused > .label, .split-menu-btn-default.focused > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #8c8c8c;
+}
+.split-menu-btn-default:hover > .label, .split-menu-btn-default:hover > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #adadad;
+}
+.split-menu-btn-default:pressed > .label, .split-menu-btn-default:pressed > .arrow-button, .split-menu-btn-default.pressed > .label, .split-menu-btn-default.pressed > .arrow-button, .open > .split-menu-btn-default.dropdown-toggle > .label, .open > .split-menu-btn-default.dropdown-toggle > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #adadad;
+}
+.split-menu-btn-default:pressed:hover > .label, .split-menu-btn-default:pressed:hover > .arrow-button, .split-menu-btn-default:pressed:focused > .label, .split-menu-btn-default:pressed:focused > .arrow-button, .split-menu-btn-default:pressed.focused > .label, .split-menu-btn-default:pressed.focused > .arrow-button, .split-menu-btn-default.pressed:hover > .label, .split-menu-btn-default.pressed:hover > .arrow-button, .split-menu-btn-default.pressed:focused > .label, .split-menu-btn-default.pressed:focused > .arrow-button, .split-menu-btn-default.pressed.focused > .label, .split-menu-btn-default.pressed.focused > .arrow-button, .open > .split-menu-btn-default.dropdown-toggle:hover > .label, .open > .split-menu-btn-default.dropdown-toggle:hover > .arrow-button, .open > .split-menu-btn-default.dropdown-toggle:focused > .label, .open > .split-menu-btn-default.dropdown-toggle:focused > .arrow-button, .open > .split-menu-btn-default.dropdown-toggle.focused > .label, .open > .split-menu-btn-default.dropdown-toggle.focused > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #d4d4d4;
+ -fx-border-color: #8c8c8c;
+}
+.split-menu-btn-default:selected > .label, .split-menu-btn-default:selected > .arrow-button, .split-menu-btn-default.selected > .label, .split-menu-btn-default.selected > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #adadad;
+}
+.split-menu-btn-default:selected:hover > .label, .split-menu-btn-default:selected:hover > .arrow-button, .split-menu-btn-default:selected:focused > .label, .split-menu-btn-default:selected:focused > .arrow-button, .split-menu-btn-default:selected.focused > .label, .split-menu-btn-default:selected.focused > .arrow-button, .split-menu-btn-default.selected:hover > .label, .split-menu-btn-default.selected:hover > .arrow-button, .split-menu-btn-default.selected:focused > .label, .split-menu-btn-default.selected:focused > .arrow-button, .split-menu-btn-default.selected.focused > .label, .split-menu-btn-default.selected.focused > .arrow-button {
+ -fx-text-fill: #333;
+ -fx-fill: #333;
+ -fx-background-color: #d4d4d4;
+ -fx-border-color: #8c8c8c;
+}
+.split-menu-btn-default:pressed, .split-menu-btn-default.pressed, .open > .split-menu-btn-default.dropdown-toggle {
+ background-image: none;
+}
+.split-menu-btn-default.disabled > .label, .split-menu-btn-default.disabled > .arrow-button, .split-menu-btn-default.disabled:hover > .label, .split-menu-btn-default.disabled:hover > .arrow-button, .split-menu-btn-default.disabled:focused > .label, .split-menu-btn-default.disabled:focused > .arrow-button, .split-menu-btn-default.disabled.focused > .label, .split-menu-btn-default.disabled.focused > .arrow-button, .split-menu-btn-default.disabled:pressed > .label, .split-menu-btn-default.disabled:pressed > .arrow-button, .split-menu-btn-default.disabled.pressed > .label, .split-menu-btn-default.disabled.pressed > .arrow-button, .split-menu-btn-default[disabled] > .label, .split-menu-btn-default[disabled] > .arrow-button, .split-menu-btn-default[disabled]:hover > .label, .split-menu-btn-default[disabled]:hover > .arrow-button, .split-menu-btn-default[disabled]:focused > .label, .split-menu-btn-default[disabled]:focused > .arrow-button, .split-menu-btn-default[disabled].focused > .label, .split-menu-btn-default[disabled].focused > .arrow-button, .split-menu-btn-default[disabled]:pressed > .label, .split-menu-btn-default[disabled]:pressed > .arrow-button, .split-menu-btn-default[disabled].pressed > .label, .split-menu-btn-default[disabled].pressed > .arrow-button, fieldset[disabled] .split-menu-btn-default > .label, fieldset[disabled] .split-menu-btn-default > .arrow-button, fieldset[disabled] .split-menu-btn-default:hover > .label, fieldset[disabled] .split-menu-btn-default:hover > .arrow-button, fieldset[disabled] .split-menu-btn-default:focused > .label, fieldset[disabled] .split-menu-btn-default:focused > .arrow-button, fieldset[disabled] .split-menu-btn-default.focused > .label, fieldset[disabled] .split-menu-btn-default.focused > .arrow-button, fieldset[disabled] .split-menu-btn-default:pressed > .label, fieldset[disabled] .split-menu-btn-default:pressed > .arrow-button, fieldset[disabled] .split-menu-btn-default.pressed > .label, fieldset[disabled] .split-menu-btn-default.pressed > .arrow-button {
+ -fx-background-color: #fff;
+ -fx-border-color: #ccc;
+}
+
+.split-menu-btn-primary > .arrow {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+}
+.split-menu-btn-primary > .label, .split-menu-btn-primary > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #337ab7;
+ -fx-border-color: #337ab7;
+}
+.split-menu-btn-primary:focused > .label, .split-menu-btn-primary:focused > .arrow-button, .split-menu-btn-primary.focused > .label, .split-menu-btn-primary.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #122b40;
+}
+.split-menu-btn-primary:hover > .label, .split-menu-btn-primary:hover > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #204d74;
+}
+.split-menu-btn-primary:pressed > .label, .split-menu-btn-primary:pressed > .arrow-button, .split-menu-btn-primary.pressed > .label, .split-menu-btn-primary.pressed > .arrow-button, .open > .split-menu-btn-primary.dropdown-toggle > .label, .open > .split-menu-btn-primary.dropdown-toggle > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #204d74;
+}
+.split-menu-btn-primary:pressed:hover > .label, .split-menu-btn-primary:pressed:hover > .arrow-button, .split-menu-btn-primary:pressed:focused > .label, .split-menu-btn-primary:pressed:focused > .arrow-button, .split-menu-btn-primary:pressed.focused > .label, .split-menu-btn-primary:pressed.focused > .arrow-button, .split-menu-btn-primary.pressed:hover > .label, .split-menu-btn-primary.pressed:hover > .arrow-button, .split-menu-btn-primary.pressed:focused > .label, .split-menu-btn-primary.pressed:focused > .arrow-button, .split-menu-btn-primary.pressed.focused > .label, .split-menu-btn-primary.pressed.focused > .arrow-button, .open > .split-menu-btn-primary.dropdown-toggle:hover > .label, .open > .split-menu-btn-primary.dropdown-toggle:hover > .arrow-button, .open > .split-menu-btn-primary.dropdown-toggle:focused > .label, .open > .split-menu-btn-primary.dropdown-toggle:focused > .arrow-button, .open > .split-menu-btn-primary.dropdown-toggle.focused > .label, .open > .split-menu-btn-primary.dropdown-toggle.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #204d74;
+ -fx-border-color: #122b40;
+}
+.split-menu-btn-primary:selected > .label, .split-menu-btn-primary:selected > .arrow-button, .split-menu-btn-primary.selected > .label, .split-menu-btn-primary.selected > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #286090;
+ -fx-border-color: #204d74;
+}
+.split-menu-btn-primary:selected:hover > .label, .split-menu-btn-primary:selected:hover > .arrow-button, .split-menu-btn-primary:selected:focused > .label, .split-menu-btn-primary:selected:focused > .arrow-button, .split-menu-btn-primary:selected.focused > .label, .split-menu-btn-primary:selected.focused > .arrow-button, .split-menu-btn-primary.selected:hover > .label, .split-menu-btn-primary.selected:hover > .arrow-button, .split-menu-btn-primary.selected:focused > .label, .split-menu-btn-primary.selected:focused > .arrow-button, .split-menu-btn-primary.selected.focused > .label, .split-menu-btn-primary.selected.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #204d74;
+ -fx-border-color: #122b40;
+}
+.split-menu-btn-primary:pressed, .split-menu-btn-primary.pressed, .open > .split-menu-btn-primary.dropdown-toggle {
+ background-image: none;
+}
+.split-menu-btn-primary.disabled > .label, .split-menu-btn-primary.disabled > .arrow-button, .split-menu-btn-primary.disabled:hover > .label, .split-menu-btn-primary.disabled:hover > .arrow-button, .split-menu-btn-primary.disabled:focused > .label, .split-menu-btn-primary.disabled:focused > .arrow-button, .split-menu-btn-primary.disabled.focused > .label, .split-menu-btn-primary.disabled.focused > .arrow-button, .split-menu-btn-primary.disabled:pressed > .label, .split-menu-btn-primary.disabled:pressed > .arrow-button, .split-menu-btn-primary.disabled.pressed > .label, .split-menu-btn-primary.disabled.pressed > .arrow-button, .split-menu-btn-primary[disabled] > .label, .split-menu-btn-primary[disabled] > .arrow-button, .split-menu-btn-primary[disabled]:hover > .label, .split-menu-btn-primary[disabled]:hover > .arrow-button, .split-menu-btn-primary[disabled]:focused > .label, .split-menu-btn-primary[disabled]:focused > .arrow-button, .split-menu-btn-primary[disabled].focused > .label, .split-menu-btn-primary[disabled].focused > .arrow-button, .split-menu-btn-primary[disabled]:pressed > .label, .split-menu-btn-primary[disabled]:pressed > .arrow-button, .split-menu-btn-primary[disabled].pressed > .label, .split-menu-btn-primary[disabled].pressed > .arrow-button, fieldset[disabled] .split-menu-btn-primary > .label, fieldset[disabled] .split-menu-btn-primary > .arrow-button, fieldset[disabled] .split-menu-btn-primary:hover > .label, fieldset[disabled] .split-menu-btn-primary:hover > .arrow-button, fieldset[disabled] .split-menu-btn-primary:focused > .label, fieldset[disabled] .split-menu-btn-primary:focused > .arrow-button, fieldset[disabled] .split-menu-btn-primary.focused > .label, fieldset[disabled] .split-menu-btn-primary.focused > .arrow-button, fieldset[disabled] .split-menu-btn-primary:pressed > .label, fieldset[disabled] .split-menu-btn-primary:pressed > .arrow-button, fieldset[disabled] .split-menu-btn-primary.pressed > .label, fieldset[disabled] .split-menu-btn-primary.pressed > .arrow-button {
+ -fx-background-color: #337ab7;
+ -fx-border-color: #2e6da4;
+}
+
+.split-menu-btn-success > .arrow {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+}
+.split-menu-btn-success > .label, .split-menu-btn-success > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #5cb85c;
+ -fx-border-color: #5cb85c;
+}
+.split-menu-btn-success:focused > .label, .split-menu-btn-success:focused > .arrow-button, .split-menu-btn-success.focused > .label, .split-menu-btn-success.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #255625;
+}
+.split-menu-btn-success:hover > .label, .split-menu-btn-success:hover > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #398439;
+}
+.split-menu-btn-success:pressed > .label, .split-menu-btn-success:pressed > .arrow-button, .split-menu-btn-success.pressed > .label, .split-menu-btn-success.pressed > .arrow-button, .open > .split-menu-btn-success.dropdown-toggle > .label, .open > .split-menu-btn-success.dropdown-toggle > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #398439;
+}
+.split-menu-btn-success:pressed:hover > .label, .split-menu-btn-success:pressed:hover > .arrow-button, .split-menu-btn-success:pressed:focused > .label, .split-menu-btn-success:pressed:focused > .arrow-button, .split-menu-btn-success:pressed.focused > .label, .split-menu-btn-success:pressed.focused > .arrow-button, .split-menu-btn-success.pressed:hover > .label, .split-menu-btn-success.pressed:hover > .arrow-button, .split-menu-btn-success.pressed:focused > .label, .split-menu-btn-success.pressed:focused > .arrow-button, .split-menu-btn-success.pressed.focused > .label, .split-menu-btn-success.pressed.focused > .arrow-button, .open > .split-menu-btn-success.dropdown-toggle:hover > .label, .open > .split-menu-btn-success.dropdown-toggle:hover > .arrow-button, .open > .split-menu-btn-success.dropdown-toggle:focused > .label, .open > .split-menu-btn-success.dropdown-toggle:focused > .arrow-button, .open > .split-menu-btn-success.dropdown-toggle.focused > .label, .open > .split-menu-btn-success.dropdown-toggle.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #398439;
+ -fx-border-color: #255625;
+}
+.split-menu-btn-success:selected > .label, .split-menu-btn-success:selected > .arrow-button, .split-menu-btn-success.selected > .label, .split-menu-btn-success.selected > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #449d44;
+ -fx-border-color: #398439;
+}
+.split-menu-btn-success:selected:hover > .label, .split-menu-btn-success:selected:hover > .arrow-button, .split-menu-btn-success:selected:focused > .label, .split-menu-btn-success:selected:focused > .arrow-button, .split-menu-btn-success:selected.focused > .label, .split-menu-btn-success:selected.focused > .arrow-button, .split-menu-btn-success.selected:hover > .label, .split-menu-btn-success.selected:hover > .arrow-button, .split-menu-btn-success.selected:focused > .label, .split-menu-btn-success.selected:focused > .arrow-button, .split-menu-btn-success.selected.focused > .label, .split-menu-btn-success.selected.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #398439;
+ -fx-border-color: #255625;
+}
+.split-menu-btn-success:pressed, .split-menu-btn-success.pressed, .open > .split-menu-btn-success.dropdown-toggle {
+ background-image: none;
+}
+.split-menu-btn-success.disabled > .label, .split-menu-btn-success.disabled > .arrow-button, .split-menu-btn-success.disabled:hover > .label, .split-menu-btn-success.disabled:hover > .arrow-button, .split-menu-btn-success.disabled:focused > .label, .split-menu-btn-success.disabled:focused > .arrow-button, .split-menu-btn-success.disabled.focused > .label, .split-menu-btn-success.disabled.focused > .arrow-button, .split-menu-btn-success.disabled:pressed > .label, .split-menu-btn-success.disabled:pressed > .arrow-button, .split-menu-btn-success.disabled.pressed > .label, .split-menu-btn-success.disabled.pressed > .arrow-button, .split-menu-btn-success[disabled] > .label, .split-menu-btn-success[disabled] > .arrow-button, .split-menu-btn-success[disabled]:hover > .label, .split-menu-btn-success[disabled]:hover > .arrow-button, .split-menu-btn-success[disabled]:focused > .label, .split-menu-btn-success[disabled]:focused > .arrow-button, .split-menu-btn-success[disabled].focused > .label, .split-menu-btn-success[disabled].focused > .arrow-button, .split-menu-btn-success[disabled]:pressed > .label, .split-menu-btn-success[disabled]:pressed > .arrow-button, .split-menu-btn-success[disabled].pressed > .label, .split-menu-btn-success[disabled].pressed > .arrow-button, fieldset[disabled] .split-menu-btn-success > .label, fieldset[disabled] .split-menu-btn-success > .arrow-button, fieldset[disabled] .split-menu-btn-success:hover > .label, fieldset[disabled] .split-menu-btn-success:hover > .arrow-button, fieldset[disabled] .split-menu-btn-success:focused > .label, fieldset[disabled] .split-menu-btn-success:focused > .arrow-button, fieldset[disabled] .split-menu-btn-success.focused > .label, fieldset[disabled] .split-menu-btn-success.focused > .arrow-button, fieldset[disabled] .split-menu-btn-success:pressed > .label, fieldset[disabled] .split-menu-btn-success:pressed > .arrow-button, fieldset[disabled] .split-menu-btn-success.pressed > .label, fieldset[disabled] .split-menu-btn-success.pressed > .arrow-button {
+ -fx-background-color: #5cb85c;
+ -fx-border-color: #4cae4c;
+}
+
+.split-menu-btn-info > .arrow {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+}
+.split-menu-btn-info > .label, .split-menu-btn-info > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #5bc0de;
+ -fx-border-color: #5bc0de;
+}
+.split-menu-btn-info:focused > .label, .split-menu-btn-info:focused > .arrow-button, .split-menu-btn-info.focused > .label, .split-menu-btn-info.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #1b6d85;
+}
+.split-menu-btn-info:hover > .label, .split-menu-btn-info:hover > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #269abc;
+}
+.split-menu-btn-info:pressed > .label, .split-menu-btn-info:pressed > .arrow-button, .split-menu-btn-info.pressed > .label, .split-menu-btn-info.pressed > .arrow-button, .open > .split-menu-btn-info.dropdown-toggle > .label, .open > .split-menu-btn-info.dropdown-toggle > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #269abc;
+}
+.split-menu-btn-info:pressed:hover > .label, .split-menu-btn-info:pressed:hover > .arrow-button, .split-menu-btn-info:pressed:focused > .label, .split-menu-btn-info:pressed:focused > .arrow-button, .split-menu-btn-info:pressed.focused > .label, .split-menu-btn-info:pressed.focused > .arrow-button, .split-menu-btn-info.pressed:hover > .label, .split-menu-btn-info.pressed:hover > .arrow-button, .split-menu-btn-info.pressed:focused > .label, .split-menu-btn-info.pressed:focused > .arrow-button, .split-menu-btn-info.pressed.focused > .label, .split-menu-btn-info.pressed.focused > .arrow-button, .open > .split-menu-btn-info.dropdown-toggle:hover > .label, .open > .split-menu-btn-info.dropdown-toggle:hover > .arrow-button, .open > .split-menu-btn-info.dropdown-toggle:focused > .label, .open > .split-menu-btn-info.dropdown-toggle:focused > .arrow-button, .open > .split-menu-btn-info.dropdown-toggle.focused > .label, .open > .split-menu-btn-info.dropdown-toggle.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #269abc;
+ -fx-border-color: #1b6d85;
+}
+.split-menu-btn-info:selected > .label, .split-menu-btn-info:selected > .arrow-button, .split-menu-btn-info.selected > .label, .split-menu-btn-info.selected > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #269abc;
+}
+.split-menu-btn-info:selected:hover > .label, .split-menu-btn-info:selected:hover > .arrow-button, .split-menu-btn-info:selected:focused > .label, .split-menu-btn-info:selected:focused > .arrow-button, .split-menu-btn-info:selected.focused > .label, .split-menu-btn-info:selected.focused > .arrow-button, .split-menu-btn-info.selected:hover > .label, .split-menu-btn-info.selected:hover > .arrow-button, .split-menu-btn-info.selected:focused > .label, .split-menu-btn-info.selected:focused > .arrow-button, .split-menu-btn-info.selected.focused > .label, .split-menu-btn-info.selected.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #269abc;
+ -fx-border-color: #1b6d85;
+}
+.split-menu-btn-info:pressed, .split-menu-btn-info.pressed, .open > .split-menu-btn-info.dropdown-toggle {
+ background-image: none;
+}
+.split-menu-btn-info.disabled > .label, .split-menu-btn-info.disabled > .arrow-button, .split-menu-btn-info.disabled:hover > .label, .split-menu-btn-info.disabled:hover > .arrow-button, .split-menu-btn-info.disabled:focused > .label, .split-menu-btn-info.disabled:focused > .arrow-button, .split-menu-btn-info.disabled.focused > .label, .split-menu-btn-info.disabled.focused > .arrow-button, .split-menu-btn-info.disabled:pressed > .label, .split-menu-btn-info.disabled:pressed > .arrow-button, .split-menu-btn-info.disabled.pressed > .label, .split-menu-btn-info.disabled.pressed > .arrow-button, .split-menu-btn-info[disabled] > .label, .split-menu-btn-info[disabled] > .arrow-button, .split-menu-btn-info[disabled]:hover > .label, .split-menu-btn-info[disabled]:hover > .arrow-button, .split-menu-btn-info[disabled]:focused > .label, .split-menu-btn-info[disabled]:focused > .arrow-button, .split-menu-btn-info[disabled].focused > .label, .split-menu-btn-info[disabled].focused > .arrow-button, .split-menu-btn-info[disabled]:pressed > .label, .split-menu-btn-info[disabled]:pressed > .arrow-button, .split-menu-btn-info[disabled].pressed > .label, .split-menu-btn-info[disabled].pressed > .arrow-button, fieldset[disabled] .split-menu-btn-info > .label, fieldset[disabled] .split-menu-btn-info > .arrow-button, fieldset[disabled] .split-menu-btn-info:hover > .label, fieldset[disabled] .split-menu-btn-info:hover > .arrow-button, fieldset[disabled] .split-menu-btn-info:focused > .label, fieldset[disabled] .split-menu-btn-info:focused > .arrow-button, fieldset[disabled] .split-menu-btn-info.focused > .label, fieldset[disabled] .split-menu-btn-info.focused > .arrow-button, fieldset[disabled] .split-menu-btn-info:pressed > .label, fieldset[disabled] .split-menu-btn-info:pressed > .arrow-button, fieldset[disabled] .split-menu-btn-info.pressed > .label, fieldset[disabled] .split-menu-btn-info.pressed > .arrow-button {
+ -fx-background-color: #5bc0de;
+ -fx-border-color: #46b8da;
+}
+
+.split-menu-btn-warning > .arrow {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+}
+.split-menu-btn-warning > .label, .split-menu-btn-warning > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #f0ad4e;
+ -fx-border-color: #f0ad4e;
+}
+.split-menu-btn-warning:focused > .label, .split-menu-btn-warning:focused > .arrow-button, .split-menu-btn-warning.focused > .label, .split-menu-btn-warning.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #985f0d;
+}
+.split-menu-btn-warning:hover > .label, .split-menu-btn-warning:hover > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #d58512;
+}
+.split-menu-btn-warning:pressed > .label, .split-menu-btn-warning:pressed > .arrow-button, .split-menu-btn-warning.pressed > .label, .split-menu-btn-warning.pressed > .arrow-button, .open > .split-menu-btn-warning.dropdown-toggle > .label, .open > .split-menu-btn-warning.dropdown-toggle > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #d58512;
+}
+.split-menu-btn-warning:pressed:hover > .label, .split-menu-btn-warning:pressed:hover > .arrow-button, .split-menu-btn-warning:pressed:focused > .label, .split-menu-btn-warning:pressed:focused > .arrow-button, .split-menu-btn-warning:pressed.focused > .label, .split-menu-btn-warning:pressed.focused > .arrow-button, .split-menu-btn-warning.pressed:hover > .label, .split-menu-btn-warning.pressed:hover > .arrow-button, .split-menu-btn-warning.pressed:focused > .label, .split-menu-btn-warning.pressed:focused > .arrow-button, .split-menu-btn-warning.pressed.focused > .label, .split-menu-btn-warning.pressed.focused > .arrow-button, .open > .split-menu-btn-warning.dropdown-toggle:hover > .label, .open > .split-menu-btn-warning.dropdown-toggle:hover > .arrow-button, .open > .split-menu-btn-warning.dropdown-toggle:focused > .label, .open > .split-menu-btn-warning.dropdown-toggle:focused > .arrow-button, .open > .split-menu-btn-warning.dropdown-toggle.focused > .label, .open > .split-menu-btn-warning.dropdown-toggle.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #d58512;
+ -fx-border-color: #985f0d;
+}
+.split-menu-btn-warning:selected > .label, .split-menu-btn-warning:selected > .arrow-button, .split-menu-btn-warning.selected > .label, .split-menu-btn-warning.selected > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ec971f;
+ -fx-border-color: #d58512;
+}
+.split-menu-btn-warning:selected:hover > .label, .split-menu-btn-warning:selected:hover > .arrow-button, .split-menu-btn-warning:selected:focused > .label, .split-menu-btn-warning:selected:focused > .arrow-button, .split-menu-btn-warning:selected.focused > .label, .split-menu-btn-warning:selected.focused > .arrow-button, .split-menu-btn-warning.selected:hover > .label, .split-menu-btn-warning.selected:hover > .arrow-button, .split-menu-btn-warning.selected:focused > .label, .split-menu-btn-warning.selected:focused > .arrow-button, .split-menu-btn-warning.selected.focused > .label, .split-menu-btn-warning.selected.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #d58512;
+ -fx-border-color: #985f0d;
+}
+.split-menu-btn-warning:pressed, .split-menu-btn-warning.pressed, .open > .split-menu-btn-warning.dropdown-toggle {
+ background-image: none;
+}
+.split-menu-btn-warning.disabled > .label, .split-menu-btn-warning.disabled > .arrow-button, .split-menu-btn-warning.disabled:hover > .label, .split-menu-btn-warning.disabled:hover > .arrow-button, .split-menu-btn-warning.disabled:focused > .label, .split-menu-btn-warning.disabled:focused > .arrow-button, .split-menu-btn-warning.disabled.focused > .label, .split-menu-btn-warning.disabled.focused > .arrow-button, .split-menu-btn-warning.disabled:pressed > .label, .split-menu-btn-warning.disabled:pressed > .arrow-button, .split-menu-btn-warning.disabled.pressed > .label, .split-menu-btn-warning.disabled.pressed > .arrow-button, .split-menu-btn-warning[disabled] > .label, .split-menu-btn-warning[disabled] > .arrow-button, .split-menu-btn-warning[disabled]:hover > .label, .split-menu-btn-warning[disabled]:hover > .arrow-button, .split-menu-btn-warning[disabled]:focused > .label, .split-menu-btn-warning[disabled]:focused > .arrow-button, .split-menu-btn-warning[disabled].focused > .label, .split-menu-btn-warning[disabled].focused > .arrow-button, .split-menu-btn-warning[disabled]:pressed > .label, .split-menu-btn-warning[disabled]:pressed > .arrow-button, .split-menu-btn-warning[disabled].pressed > .label, .split-menu-btn-warning[disabled].pressed > .arrow-button, fieldset[disabled] .split-menu-btn-warning > .label, fieldset[disabled] .split-menu-btn-warning > .arrow-button, fieldset[disabled] .split-menu-btn-warning:hover > .label, fieldset[disabled] .split-menu-btn-warning:hover > .arrow-button, fieldset[disabled] .split-menu-btn-warning:focused > .label, fieldset[disabled] .split-menu-btn-warning:focused > .arrow-button, fieldset[disabled] .split-menu-btn-warning.focused > .label, fieldset[disabled] .split-menu-btn-warning.focused > .arrow-button, fieldset[disabled] .split-menu-btn-warning:pressed > .label, fieldset[disabled] .split-menu-btn-warning:pressed > .arrow-button, fieldset[disabled] .split-menu-btn-warning.pressed > .label, fieldset[disabled] .split-menu-btn-warning.pressed > .arrow-button {
+ -fx-background-color: #f0ad4e;
+ -fx-border-color: #eea236;
+}
+
+.split-menu-btn-danger > .arrow {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+}
+.split-menu-btn-danger > .label, .split-menu-btn-danger > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #d9534f;
+ -fx-border-color: #d9534f;
+}
+.split-menu-btn-danger:focused > .label, .split-menu-btn-danger:focused > .arrow-button, .split-menu-btn-danger.focused > .label, .split-menu-btn-danger.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #761c19;
+}
+.split-menu-btn-danger:hover > .label, .split-menu-btn-danger:hover > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #ac2925;
+}
+.split-menu-btn-danger:pressed > .label, .split-menu-btn-danger:pressed > .arrow-button, .split-menu-btn-danger.pressed > .label, .split-menu-btn-danger.pressed > .arrow-button, .open > .split-menu-btn-danger.dropdown-toggle > .label, .open > .split-menu-btn-danger.dropdown-toggle > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #ac2925;
+}
+.split-menu-btn-danger:pressed:hover > .label, .split-menu-btn-danger:pressed:hover > .arrow-button, .split-menu-btn-danger:pressed:focused > .label, .split-menu-btn-danger:pressed:focused > .arrow-button, .split-menu-btn-danger:pressed.focused > .label, .split-menu-btn-danger:pressed.focused > .arrow-button, .split-menu-btn-danger.pressed:hover > .label, .split-menu-btn-danger.pressed:hover > .arrow-button, .split-menu-btn-danger.pressed:focused > .label, .split-menu-btn-danger.pressed:focused > .arrow-button, .split-menu-btn-danger.pressed.focused > .label, .split-menu-btn-danger.pressed.focused > .arrow-button, .open > .split-menu-btn-danger.dropdown-toggle:hover > .label, .open > .split-menu-btn-danger.dropdown-toggle:hover > .arrow-button, .open > .split-menu-btn-danger.dropdown-toggle:focused > .label, .open > .split-menu-btn-danger.dropdown-toggle:focused > .arrow-button, .open > .split-menu-btn-danger.dropdown-toggle.focused > .label, .open > .split-menu-btn-danger.dropdown-toggle.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ac2925;
+ -fx-border-color: #761c19;
+}
+.split-menu-btn-danger:selected > .label, .split-menu-btn-danger:selected > .arrow-button, .split-menu-btn-danger.selected > .label, .split-menu-btn-danger.selected > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #c9302c;
+ -fx-border-color: #ac2925;
+}
+.split-menu-btn-danger:selected:hover > .label, .split-menu-btn-danger:selected:hover > .arrow-button, .split-menu-btn-danger:selected:focused > .label, .split-menu-btn-danger:selected:focused > .arrow-button, .split-menu-btn-danger:selected.focused > .label, .split-menu-btn-danger:selected.focused > .arrow-button, .split-menu-btn-danger.selected:hover > .label, .split-menu-btn-danger.selected:hover > .arrow-button, .split-menu-btn-danger.selected:focused > .label, .split-menu-btn-danger.selected:focused > .arrow-button, .split-menu-btn-danger.selected.focused > .label, .split-menu-btn-danger.selected.focused > .arrow-button {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: #ac2925;
+ -fx-border-color: #761c19;
+}
+.split-menu-btn-danger:pressed, .split-menu-btn-danger.pressed, .open > .split-menu-btn-danger.dropdown-toggle {
+ background-image: none;
+}
+.split-menu-btn-danger.disabled > .label, .split-menu-btn-danger.disabled > .arrow-button, .split-menu-btn-danger.disabled:hover > .label, .split-menu-btn-danger.disabled:hover > .arrow-button, .split-menu-btn-danger.disabled:focused > .label, .split-menu-btn-danger.disabled:focused > .arrow-button, .split-menu-btn-danger.disabled.focused > .label, .split-menu-btn-danger.disabled.focused > .arrow-button, .split-menu-btn-danger.disabled:pressed > .label, .split-menu-btn-danger.disabled:pressed > .arrow-button, .split-menu-btn-danger.disabled.pressed > .label, .split-menu-btn-danger.disabled.pressed > .arrow-button, .split-menu-btn-danger[disabled] > .label, .split-menu-btn-danger[disabled] > .arrow-button, .split-menu-btn-danger[disabled]:hover > .label, .split-menu-btn-danger[disabled]:hover > .arrow-button, .split-menu-btn-danger[disabled]:focused > .label, .split-menu-btn-danger[disabled]:focused > .arrow-button, .split-menu-btn-danger[disabled].focused > .label, .split-menu-btn-danger[disabled].focused > .arrow-button, .split-menu-btn-danger[disabled]:pressed > .label, .split-menu-btn-danger[disabled]:pressed > .arrow-button, .split-menu-btn-danger[disabled].pressed > .label, .split-menu-btn-danger[disabled].pressed > .arrow-button, fieldset[disabled] .split-menu-btn-danger > .label, fieldset[disabled] .split-menu-btn-danger > .arrow-button, fieldset[disabled] .split-menu-btn-danger:hover > .label, fieldset[disabled] .split-menu-btn-danger:hover > .arrow-button, fieldset[disabled] .split-menu-btn-danger:focused > .label, fieldset[disabled] .split-menu-btn-danger:focused > .arrow-button, fieldset[disabled] .split-menu-btn-danger.focused > .label, fieldset[disabled] .split-menu-btn-danger.focused > .arrow-button, fieldset[disabled] .split-menu-btn-danger:pressed > .label, fieldset[disabled] .split-menu-btn-danger:pressed > .arrow-button, fieldset[disabled] .split-menu-btn-danger.pressed > .label, fieldset[disabled] .split-menu-btn-danger.pressed > .arrow-button {
+ -fx-background-color: #d9534f;
+ -fx-border-color: #d43f3a;
+}
+
+.split-menu-btn-lg {
+ -fx-font-size: 18px;
+ -fx-border-radius: 6px;
+ -fx-background-radius: 6px;
+}
+
+.split-menu-btn-sm {
+ -fx-font-size: 12px;
+ -fx-border-radius: 3px;
+ -fx-background-radius: 3px;
+}
+
+.split-menu-btn-xs {
+ -fx-font-size: 12px;
+ -fx-border-radius: 3px;
+ -fx-background-radius: 3px;
+}
+
+.btn-group-horizontal {
+ -fx-spacing: 0;
+}
+.btn-group-horizontal > .first {
+ -fx-border-radius: 4px 0 0 4px;
+ -fx-background-radius: 4px 0 0 4px;
+}
+.btn-group-horizontal > .middle {
+ -fx-border-radius: 0;
+ -fx-background-radius: 0;
+}
+.btn-group-horizontal > .last {
+ -fx-border-radius: 0 4px 4px 0;
+ -fx-background-radius: 0 4px 4px 0;
+}
+
+.btn-group-vertical {
+ -fx-spacing: 0;
+ -fx-alignment: center;
+ -fx-fill-width: true;
+}
+.btn-group-vertical > .first {
+ -fx-border-radius: 4px 4px 0 0;
+ -fx-background-radius: 4px 4px 0 0;
+}
+.btn-group-vertical > .middle {
+ -fx-border-radius: 0;
+ -fx-background-radius: 0;
+}
+.btn-group-vertical > .last {
+ -fx-border-radius: 0 0 4px 4px;
+ -fx-background-radius: 0 0 4px 4px;
+}
+
+.lbl {
+ -fx-padding: .2em .6em .3em .6em;
+ -fx-font-size: 75%;
+ -fx-font-weight: bold;
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-text-alignment: center;
+ -fx-alignment: baseline-center;
+ -fx-border-radius: .25em;
+ -fx-background-radius: .25em;
+}
+
+.lbl-default {
+ -fx-background-color: #777777;
+}
+.lbl-default[href]:hover, .lbl-default[href]:focused {
+ -fx-background-color: #5e5e5e;
+}
+
+.lbl-primary {
+ -fx-background-color: #337ab7;
+}
+.lbl-primary[href]:hover, .lbl-primary[href]:focused {
+ -fx-background-color: #286090;
+}
+
+.lbl-success {
+ -fx-background-color: #5cb85c;
+}
+.lbl-success[href]:hover, .lbl-success[href]:focused {
+ -fx-background-color: #449d44;
+}
+
+.lbl-info {
+ -fx-background-color: #5bc0de;
+}
+.lbl-info[href]:hover, .lbl-info[href]:focused {
+ -fx-background-color: #31b0d5;
+}
+
+.lbl-warning {
+ -fx-background-color: #f0ad4e;
+}
+.lbl-warning[href]:hover, .lbl-warning[href]:focused {
+ -fx-background-color: #ec971f;
+}
+
+.lbl-danger {
+ -fx-background-color: #d9534f;
+}
+.lbl-danger[href]:hover, .lbl-danger[href]:focused {
+ -fx-background-color: #c9302c;
+}
+
+.badge {
+ -fx-min-width: 10px;
+ -fx-padding: 3px 7px 3px 7px;
+ -fx-font-size: 12px;
+ -fx-font-weight: bold;
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-alignment: center;
+ -fx-text-alignment: center;
+ -fx-background-color: #777777;
+ -fx-border-radius: 10px;
+ -fx-background-radius: 10px;
+}
+.btn-xs .badge, .btn-group-xs > .btn .badge {
+ -fx-padding: 1px 5px 1px 5px;
+}
+.list-group-item.active > .badge, .nav-pills > .active > a > .badge {
+ -fx-text-fill: #337ab7;
+ -fx-fill: #337ab7;
+ -fx-background-color: #fff;
+}
+
+a.badge:hover, a.badge:focused {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-cursor: default;
+}
+
+.alert {
+ -fx-padding: 15px;
+ -fx-border-width: 1px;
+ -fx-border-style: solid;
+ -fx-border-color: black;
+ -fx-border-radius: 4px;
+ -fx-background-radius: 4px;
+}
+
+.alert-success {
+ -fx-background-color: linear-gradient(to bottom, #dff0d8 0px, #c8e5bc 100%);
+ -fx-border-color: #d6e9c6;
+ -fx-text-fill: #3c763d;
+ -fx-fill: #3c763d;
+}
+.alert-success * {
+ -fx-background-color: transparent;
+ -fx-text-fill: #3c763d;
+ -fx-fill: #3c763d;
+}
+
+.alert-info {
+ -fx-background-color: linear-gradient(to bottom, #d9edf7 0px, #b9def0 100%);
+ -fx-border-color: #bce8f1;
+ -fx-text-fill: #31708f;
+ -fx-fill: #31708f;
+}
+.alert-info * {
+ -fx-background-color: transparent;
+ -fx-text-fill: #31708f;
+ -fx-fill: #31708f;
+}
+
+.alert-warning {
+ -fx-background-color: linear-gradient(to bottom, #fcf8e3 0px, #f8efc0 100%);
+ -fx-border-color: #faebcc;
+ -fx-text-fill: #8a6d3b;
+ -fx-fill: #8a6d3b;
+}
+.alert-warning * {
+ -fx-background-color: transparent;
+ -fx-text-fill: #8a6d3b;
+ -fx-fill: #8a6d3b;
+}
+
+.alert-danger {
+ -fx-background-color: linear-gradient(to bottom, #f2dede 0px, #e7c3c3 100%);
+ -fx-border-color: #ebccd1;
+ -fx-text-fill: #a94442;
+ -fx-fill: #a94442;
+}
+.alert-danger * {
+ -fx-background-color: transparent;
+ -fx-text-fill: #a94442;
+ -fx-fill: #a94442;
+}
+
+.progress-bar-primary > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #337ab7;
+ -fx-progress-color: #337ab7;
+ -fx-text-fill: #fff;
+ -fx-text-alignment: center;
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.15), -1px, 0, 0, 0);
+}
+.progress-bar-primary > .track {
+ -fx-pref-height: 10;
+ -fx-background-radius: 4px;
+ -fx-effect: innershadow(gaussian, #eeeeee, 4, 0, 0, 1);
+ -fx-background-color: #f5f5f5;
+}
+
+.progress-bar-success > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #5cb85c;
+ -fx-progress-color: #5cb85c;
+ -fx-text-fill: #fff;
+ -fx-text-alignment: center;
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.15), -1px, 0, 0, 0);
+}
+.progress-bar-success > .track {
+ -fx-pref-height: 10;
+ -fx-background-radius: 4px;
+ -fx-effect: innershadow(gaussian, #eeeeee, 4, 0, 0, 1);
+ -fx-background-color: #f5f5f5;
+}
+
+.progress-bar-info > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #5bc0de;
+ -fx-progress-color: #5bc0de;
+ -fx-text-fill: #fff;
+ -fx-text-alignment: center;
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.15), -1px, 0, 0, 0);
+}
+.progress-bar-info > .track {
+ -fx-pref-height: 10;
+ -fx-background-radius: 4px;
+ -fx-effect: innershadow(gaussian, #eeeeee, 4, 0, 0, 1);
+ -fx-background-color: #f5f5f5;
+}
+
+.progress-bar-warning > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #f0ad4e;
+ -fx-progress-color: #f0ad4e;
+ -fx-text-fill: #fff;
+ -fx-text-alignment: center;
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.15), -1px, 0, 0, 0);
+}
+.progress-bar-warning > .track {
+ -fx-pref-height: 10;
+ -fx-background-radius: 4px;
+ -fx-effect: innershadow(gaussian, #eeeeee, 4, 0, 0, 1);
+ -fx-background-color: #f5f5f5;
+}
+
+.progress-bar-danger > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #d9534f;
+ -fx-progress-color: #d9534f;
+ -fx-text-fill: #fff;
+ -fx-text-alignment: center;
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.15), -1px, 0, 0, 0);
+}
+.progress-bar-danger > .track {
+ -fx-pref-height: 10;
+ -fx-background-radius: 4px;
+ -fx-effect: innershadow(gaussian, #eeeeee, 4, 0, 0, 1);
+ -fx-background-color: #f5f5f5;
+}
+
+.tooltip-primary {
+ -fx-background: #337ab7;
+ -fx-background-color: #337ab7;
+ -fx-text-fill: #fff;
+ -fx-border-color: #3175af;
+ -fx-background-radius: 4px;
+ -fx-border-radius: 4px;
+ -fx-background-insets: 0;
+ -fx-padding: 0.667em 0.75em 0.667em 0.75em;
+ /* 10px */
+ -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.5), 10, 0, 0, 3);
+ -fx-font-size: 0.85em;
+}
+
+.tooltip-success {
+ -fx-background: #5cb85c;
+ -fx-background-color: #5cb85c;
+ -fx-text-fill: #fff;
+ -fx-border-color: #55b555;
+ -fx-background-radius: 4px;
+ -fx-border-radius: 4px;
+ -fx-background-insets: 0;
+ -fx-padding: 0.667em 0.75em 0.667em 0.75em;
+ /* 10px */
+ -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.5), 10, 0, 0, 3);
+ -fx-font-size: 0.85em;
+}
+
+.tooltip-info {
+ -fx-background: #5bc0de;
+ -fx-background-color: #5bc0de;
+ -fx-text-fill: #fff;
+ -fx-border-color: #53bddc;
+ -fx-background-radius: 4px;
+ -fx-border-radius: 4px;
+ -fx-background-insets: 0;
+ -fx-padding: 0.667em 0.75em 0.667em 0.75em;
+ /* 10px */
+ -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.5), 10, 0, 0, 3);
+ -fx-font-size: 0.85em;
+}
+
+.tooltip-warning {
+ -fx-background: #f0ad4e;
+ -fx-background-color: #f0ad4e;
+ -fx-text-fill: #fff;
+ -fx-border-color: #efa945;
+ -fx-background-radius: 4px;
+ -fx-border-radius: 4px;
+ -fx-background-insets: 0;
+ -fx-padding: 0.667em 0.75em 0.667em 0.75em;
+ /* 10px */
+ -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.5), 10, 0, 0, 3);
+ -fx-font-size: 0.85em;
+}
+
+.tooltip-danger {
+ -fx-background: #d9534f;
+ -fx-background-color: #d9534f;
+ -fx-text-fill: #fff;
+ -fx-border-color: #d74b47;
+ -fx-background-radius: 4px;
+ -fx-border-radius: 4px;
+ -fx-background-insets: 0;
+ -fx-padding: 0.667em 0.75em 0.667em 0.75em;
+ /* 10px */
+ -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.5), 10, 0, 0, 3);
+ -fx-font-size: 0.85em;
+}
+
+.panel {
+ -fx-background-color: #fff;
+ -fx-border-width: 1px;
+ -fx-border-style: solid;
+ -fx-border-color: transparent;
+ -fx-border-radius: 4px;
+ -fx-effect: innershadow(gaussian, rgba(0, 0, 0, 0.05), 1px, 0, 0, 1px);
+}
+
+.panel-body {
+ -fx-padding: 15px;
+}
+
+.panel-heading {
+ -fx-padding: 10px 15px;
+ -fx-border-width: 1px;
+ -fx-border-style: solid;
+ -fx-border-color: transparent;
+ -fx-border-radius: 3px, 0, 0, 0;
+}
+
+.panel-title {
+ -fx-font-size: 16px;
+}
+
+.panel-footer {
+ -fx-padding: 10px 15px;
+ -fx-background-color: #f5f5f5;
+ -fx-border-width: 1px;
+ -fx-border-style: solid;
+ -fx-border-color: #ddd;
+ -fx-border-radius: 0, 0, 3px, 0;
+}
+
+.panel-default {
+ -fx-border-color: #ddd;
+}
+.panel-default > .panel-heading {
+ -fx-text-fill: #333333;
+ -fx-fill: #333333;
+ -fx-background-color: linear-gradient(to bottom, #f5f5f5 0px, #e2e2e2 100%);
+ -fx-border-color: #ddd;
+}
+.panel-default > .panel-heading * {
+ -fx-text-fill: #333333;
+ -fx-fill: #333333;
+}
+.panel-default > .panel-heading .badge {
+ -fx-text-fill: #f5f5f5;
+ -fx-fill: #f5f5f5;
+ -fx-background-color: #333333;
+}
+
+.panel-primary {
+ -fx-border-color: #337ab7;
+}
+.panel-primary > .panel-heading {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+ -fx-background-color: linear-gradient(to bottom, #337ab7 0px, #2b669a 100%);
+ -fx-border-color: #337ab7;
+}
+.panel-primary > .panel-heading * {
+ -fx-text-fill: #fff;
+ -fx-fill: #fff;
+}
+.panel-primary > .panel-heading .badge {
+ -fx-text-fill: #337ab7;
+ -fx-fill: #337ab7;
+ -fx-background-color: #fff;
+}
+
+.panel-success {
+ -fx-border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+ -fx-text-fill: #3c763d;
+ -fx-fill: #3c763d;
+ -fx-background-color: linear-gradient(to bottom, #dff0d8 0px, #c8e5bc 100%);
+ -fx-border-color: #d6e9c6;
+}
+.panel-success > .panel-heading * {
+ -fx-text-fill: #3c763d;
+ -fx-fill: #3c763d;
+}
+.panel-success > .panel-heading .badge {
+ -fx-text-fill: #dff0d8;
+ -fx-fill: #dff0d8;
+ -fx-background-color: #3c763d;
+}
+
+.panel-info {
+ -fx-border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+ -fx-text-fill: #31708f;
+ -fx-fill: #31708f;
+ -fx-background-color: linear-gradient(to bottom, #d9edf7 0px, #b9def0 100%);
+ -fx-border-color: #bce8f1;
+}
+.panel-info > .panel-heading * {
+ -fx-text-fill: #31708f;
+ -fx-fill: #31708f;
+}
+.panel-info > .panel-heading .badge {
+ -fx-text-fill: #d9edf7;
+ -fx-fill: #d9edf7;
+ -fx-background-color: #31708f;
+}
+
+.panel-warning {
+ -fx-border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+ -fx-text-fill: #8a6d3b;
+ -fx-fill: #8a6d3b;
+ -fx-background-color: linear-gradient(to bottom, #fcf8e3 0px, #f8efc0 100%);
+ -fx-border-color: #faebcc;
+}
+.panel-warning > .panel-heading * {
+ -fx-text-fill: #8a6d3b;
+ -fx-fill: #8a6d3b;
+}
+.panel-warning > .panel-heading .badge {
+ -fx-text-fill: #fcf8e3;
+ -fx-fill: #fcf8e3;
+ -fx-background-color: #8a6d3b;
+}
+
+.panel-danger {
+ -fx-border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+ -fx-text-fill: #a94442;
+ -fx-fill: #a94442;
+ -fx-background-color: linear-gradient(to bottom, #f2dede 0px, #e7c3c3 100%);
+ -fx-border-color: #ebccd1;
+}
+.panel-danger > .panel-heading * {
+ -fx-text-fill: #a94442;
+ -fx-fill: #a94442;
+}
+.panel-danger > .panel-heading .badge {
+ -fx-text-fill: #f2dede;
+ -fx-fill: #f2dede;
+ -fx-background-color: #a94442;
+}
+
+.tool-bar {
+ -fx-background-color: white;
+ -fx-border-color: transparent transparent #eeeeee transparent;
+}
+
+.tool-bar:vertical {
+ -fx-border-color: transparent #eeeeee transparent transparent;
+ -fx-background-insets: 0, 0 1 0 0;
+}
+
+.menu-item {
+ -fx-min-width: 200;
+}
+
+.menu-item:focused {
+ -fx-background-color: #f5f5f5;
+}
+
+.menu-item:focused > * {
+ -fx-text-fill: #222222;
+}
+
+.menu-item:focused .arrow {
+ -fx-background-color: #333;
+}
+
+.check-menu-item:checked:hover > .left-container > .check,
+.check-menu-item:checked:focused > .left-container > .check,
+.radio-menu-item:checked:hover > .left-container > .radio,
+.radio-menu-item:checked:focused > .left-container > .radio {
+ -fx-background-color: #333;
+}
+
+.context-menu {
+ -fx-border-radius: 4px;
+ -fx-background-radius: 4px;
+ -fx-border-color: #bebec0;
+}
+
+.context-menu > * {
+ -fx-padding: 5 0 5 0;
+}
+
+.separator {
+ -fx-padding: 5 0 5 0;
+}
diff --git a/src/main/resources/styles/markdown.css b/src/main/resources/styles/markdown.css
new file mode 100644
index 0000000..5b7af15
--- /dev/null
+++ b/src/main/resources/styles/markdown.css
@@ -0,0 +1,18 @@
+* {
+ -mdfx-font-color: white;
+ -mdfx-border-color-1: #888;
+
+ -mdfx-bg-color-1: #ccc;
+ -mdfx-bg-color-2: #ddd;
+ -mdfx-bg-color-3: #eee;
+}
+
+.markdown-text {
+ -fx-font-family: ARIAL;
+}
+.markdown-italic {
+ -fx-font-style: italic;
+}
+.markdown-bold {
+ -fx-font-weight: bold;
+}
\ No newline at end of file
diff --git a/src/main/resources/styles/style2.css b/src/main/resources/styles/style2.css
new file mode 100644
index 0000000..e2c230e
--- /dev/null
+++ b/src/main/resources/styles/style2.css
@@ -0,0 +1,16 @@
+#rootPane{
+ -fx-background-image: url("../images/backgroung.jpg");
+ -fx-background-size: 1920.0 1080.0;
+ -fx-background-position: center center;
+}
+
+.ikonli-font-icon{
+ -fx-icon-size: 100px;
+ -fx-icon-color: blue;
+}
+
+ .user-radio .radio {
+ visibility: hidden;
+ -fx-pref-width: 0px;
+ -fx-max-width: 0px;
+}
\ No newline at end of file
diff --git a/src/main/resources/styles/ui.css b/src/main/resources/styles/ui.css
new file mode 100644
index 0000000..1997cf2
--- /dev/null
+++ b/src/main/resources/styles/ui.css
@@ -0,0 +1,57 @@
+/* .button {
+ -fx-background-color: #009688;
+ -fx-background-radius: 0.0;
+ -fx-text-fill: #FFFFFF;
+ -fx-margin: 0.0;
+ -fx-background-radius: 21.0px;
+} */
+
+/* .userButton{
+ -fx-background-color: #ff9688;
+ -fx-background-radius: 0.0px;
+ -fx-pref-width: 100px;
+ -fx-pref-height: 40px;
+ -fx-background-insets: 5px;
+} */
+.root{
+ -fx-padding: 5.0 5.0 5.0 5.0;
+ -fx-background-image: url("../images/backgroung.jpg");
+ -fx-background-size: 1920.0 1080.0;
+ -fx-background-position: center center;
+}
+
+
+#flowPane {
+ -fx-hgap: 5.0px;
+ -fx-vgap: 5.0px;
+}
+
+.userVbox {
+ -fx-padding: 5.0 5.0 5.0 5.0;
+ -fx-background-insets: 5px;
+ -fx-background-size: 1920.0 1080.0;
+ -fx-background-position: center center;
+ -fx-background-color: #ff0055;
+ -fx-background-radius: 10px;
+
+}
+
+#chatTextArea{
+ -fx-font-size: 1.4em;
+}
+
+.my-list-cell {
+ -fx-background-color: null;
+}
+
+.my-list-view {
+ -fx-background-color: null;
+}
+
+.my-list-view > .list-cell {
+ -fx-background-color: null;
+}
+
+/*.myButton {
+ -fx-background-radius: 21.0px;
+}*/
diff --git a/src/main/resources/styles/userbox.css b/src/main/resources/styles/userbox.css
new file mode 100644
index 0000000..54773c0
--- /dev/null
+++ b/src/main/resources/styles/userbox.css
@@ -0,0 +1,30 @@
+.user-box {
+ -fx-padding: 0.0 2.5 0.0 0.0;
+ -fx-background-radius: 0px;
+ -fx-border-color: #337ab7;
+ }
+.user-box:selected {
+ -fx-background-color: red;
+ }
+.user-radio .radio {
+ visibility: hidden;
+ -fx-pref-width: 0.0px;
+ -fx-max-width: 0.0px;
+ -fx-padding: 0.0 0.0 0.0 0.0;
+}
+
+
+.user-radio {
+ -fx-font-size: 20px ;
+}
+#nameLabel {
+ -fx-text-fill: #fff;
+}
+.user-radio {
+ -fx-text-fill: #fff;
+}
+.messageLabel {
+ -fx-padding: 0.0 0.0 0.0 5.0;
+ -fx-text-fill: #fff;
+ -fx-font-size: 15px ;
+}
\ No newline at end of file
diff --git a/src/main/scala/wow/doge/chatto/Application.scala b/src/main/scala/wow/doge/chatto/Application.scala
new file mode 100644
index 0000000..d16b96b
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/Application.scala
@@ -0,0 +1,9 @@
+package wow.doge.chatto
+
+import com.sfxcode.sapphire.core.ConfigValues
+import com.sfxcode.sapphire.core.application.FXApp
+
+object Application extends FXApp with ConfigValues {
+
+ override def title: String = configStringValue("project.name")
+}
diff --git a/src/main/scala/wow/doge/chatto/ApplicationController.scala b/src/main/scala/wow/doge/chatto/ApplicationController.scala
new file mode 100644
index 0000000..6b4cd4b
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/ApplicationController.scala
@@ -0,0 +1,102 @@
+package wow.doge.chatto
+
+import javax.enterprise.context.ApplicationScoped
+import javax.enterprise.inject.Produces
+import javax.inject.Named
+import com.typesafe.config.ConfigFactory
+import com.sfxcode.sapphire.core.controller.DefaultWindowController
+// import org.asynchttpclient.Dsl._
+import wow.doge.chatto.controller.MainViewController
+import sttp.client.asynchttpclient.future.AsyncHttpClientFutureBackend
+import sttp.client._
+import scala.concurrent.ExecutionContext.Implicits.global
+import scala.async.Async.{async, await}
+import sttp.client.json4s._
+import org.json4s._
+import org.json4s.native.JsonMethods._
+import org.json4s.JsonDSL._
+import scala.util.Success
+import scala.util.Failure
+import com.softwaremill.quicklens._
+@Named
+@ApplicationScoped
+class ApplicationController extends DefaultWindowController {
+ // import ApplicationController._
+
+ lazy val mainViewController = getController[MainViewController]()
+ private implicit lazy val serialization = org.json4s.native.Serialization
+ private implicit lazy val backend = AsyncHttpClientFutureBackend()
+
+ // override def width: Int = 400
+
+ def applicationDidLaunch() = {
+ logger.info("start " + this)
+ applicationEnvironment.loadResourceBundle("bundles/application")
+ replaceSceneContent(mainViewController)
+ }
+
+ @Produces
+ def applicationName: ApplicationName = {
+ ApplicationName(configStringValue("application.name"))
+ }
+
+ @Produces var appData: AppData = synchronized {
+ AppData(User.empty, "")
+ }
+
+ @Produces
+ def httpBackend = backend
+
+ def replacePrimarySceneContent(): Unit = {
+ // Styling
+ reloadStyles()
+ // Resources
+ applicationEnvironment.clearResourceBundleCache()
+ applicationEnvironment.loadResourceBundle("bundles/application")
+ // FXML
+ val newMainViewController = getController[MainViewController]()
+ replaceSceneContent(newMainViewController)
+ }
+
+ override def applicationWillStop(): Unit = async {
+ super.applicationWillStop()
+ println("stopping")
+ await(httpBackend.close())
+ System.exit(0)
+ }
+
+ def showLoginPane() = {
+ appData = appData.copy(user = User.empty)
+ appData = appData.modify(_.user).using(_ => User.empty)
+ appData = appData.modify(_.user.username).using(_ => "")
+ replaceSceneContent(mainViewController.loginController)
+ }
+
+ def showChatPane(): Unit = {
+ // import org.scalafx.extras._
+ replaceSceneContent(mainViewController.chatController, true)
+ // httpBackend.send(basicRequest.get(uri""))
+ // val willBeResponse = basicRequest
+ // .get(uri"https://httpbin.org/get")
+ // .response(asJson[HttpBinResponse])
+ // .send()
+ // async {
+ // val r = await { willBeResponse }
+ // r.body.map(println)
+ // }
+
+ // willBeResponse onComplete {
+ // case Success(x) => { x.body }
+ // case Failure(x) => {}
+ // }
+ // val body = for {
+ // r <- willBeResponse
+ // } yield (r.body)
+ }
+}
+final case class ApplicationName(name: String)
+final case class User(username: String, password: String, token: String)
+object User {
+ def empty = User("", "", "")
+}
+final case class AppData(user: User, sumth: String)
diff --git a/src/main/scala/wow/doge/chatto/config/Beans.scala b/src/main/scala/wow/doge/chatto/config/Beans.scala
new file mode 100644
index 0000000..f926f0d
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/config/Beans.scala
@@ -0,0 +1,10 @@
+package wow.doge.chatto.config
+
+import javax.enterprise.context.ApplicationScoped
+import javax.enterprise.inject.Produces
+
+@ApplicationScoped
+class AppBeans {
+ @Produces
+ def something: String = "Hello"
+}
diff --git a/src/main/scala/wow/doge/chatto/control/UserBox.scala b/src/main/scala/wow/doge/chatto/control/UserBox.scala
new file mode 100644
index 0000000..6ca04fd
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/control/UserBox.scala
@@ -0,0 +1,52 @@
+package wow.doge.chatto.control
+
+import javafx.scene.layout.VBox
+import javafx.fxml.FXML
+import javafx.scene.control.RadioButton
+import javafx.scene.control.Label
+import javafx.fxml.FXMLLoader
+import scalafx.Includes._
+
+class UserBox() extends VBox() {
+ @FXML private var _userRadioButton: RadioButton = _
+ @FXML private var _messageLabel: Label = _
+
+ def userRadioButton = this._userRadioButton
+ def messageLabel = this._messageLabel
+
+ init()
+
+ def init() = {
+ val fxmlLoader = new FXMLLoader(
+ getClass().getResource("/fxml/UserBox.fxml")
+ )
+ fxmlLoader.setRoot(this);
+ fxmlLoader.setController(this);
+
+ fxmlLoader.load();
+
+ // userRadioButton
+ // .selectedProperty()
+ // .addListener(changeListener => {
+ // if (userRadioButton.isSelected()) {
+ // getStyleClass().clear();
+ // getStyleClass().addAll("btn", "btn-primary", "user-box");
+ // } else {
+ // getStyleClass().clear();
+ // getStyleClass().addAll("btn", "btn-primary", "user-box");
+ // }
+ // });
+
+ userRadioButton.selected.onChange { (_, _, _) =>
+ {
+ getStyleClass().clear();
+ getStyleClass().addAll("btn", "btn-primary", "user-box");
+ }
+ }
+ }
+
+}
+
+object UserBox {
+// val ub = new UserBox()
+}
diff --git a/src/main/scala/wow/doge/chatto/controller/AbstractViewController.scala b/src/main/scala/wow/doge/chatto/controller/AbstractViewController.scala
new file mode 100644
index 0000000..b7ce326
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/controller/AbstractViewController.scala
@@ -0,0 +1,37 @@
+package wow.doge.chatto.controller
+
+import com.sfxcode.sapphire.core.controller.ViewController
+import com.typesafe.scalalogging.LazyLogging
+import wow.doge.chatto.ApplicationController
+
+abstract class AbstractViewController extends ViewController with LazyLogging {
+
+ override def didGainVisibility(): Unit = {
+ statusBarController.statusLabel.setText(
+ "%s loaded".format(getClass.getSimpleName)
+ )
+ }
+
+ def applicationController: ApplicationController = {
+ getBean[ApplicationController]()
+
+ }
+
+ def mainViewController: MainViewController =
+ applicationController.mainViewController
+
+ /**
+ *
+ * @return
+ */
+ def statusBarController = getBean[StatusBarController]()
+
+ /**
+ *
+ * @return workspace manager resolved by parent
+ */
+ def workspaceManager = mainViewController.workspaceManager
+
+ // def loginManager = mainViewController.loginManager
+
+}
diff --git a/src/main/scala/wow/doge/chatto/controller/ChatController.scala b/src/main/scala/wow/doge/chatto/controller/ChatController.scala
new file mode 100644
index 0000000..7466b06
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/controller/ChatController.scala
@@ -0,0 +1,80 @@
+package wow.doge.chatto.controller
+
+import javafx.fxml.FXML
+import javafx.scene.control.Label
+import javafx.scene.control.Button
+import javafx.scene.layout.FlowPane
+import javafx.scene.control.TextArea
+import javafx.scene.control.ListView
+import javafx.scene.layout.HBox
+import javafx.scene.layout.VBox
+import scalafx.Includes._
+import wow.doge.chatto.control.UserBox
+import javafx.application.Platform
+import javax.inject.Inject
+import org.scalafx.extras._
+import wow.doge.chatto.messagebuble.BubbledMDFXNode
+import wow.doge.chatto.service.UserService
+import scala.concurrent.ExecutionContext
+import scala.concurrent.ExecutionContext.Implicits.global
+import com.typesafe.scalalogging.LazyLogging
+// import wow.doge.chatto.controller.LoginController.Person
+import com.sfxcode.sapphire.core.value.FXBean
+
+class ChatController @Inject() (userService: UserService)
+ extends AbstractViewController
+ with LazyLogging {
+
+ @FXML private var label: Label = _
+ @FXML private var flowPane: FlowPane = _
+ @FXML private var submitButton: Button = _
+ @FXML private var loginButton: Button = _
+ @FXML private var chatTextArea: TextArea = _
+ @FXML private var chatInput: TextArea = _
+ @FXML private var usersVBox: VBox = _
+ @FXML private var chatListView: ListView[HBox] = _
+ // applicationController.show
+
+ override def didGainVisibilityFirstTime(): Unit = {
+ super.didGainVisibilityFirstTime()
+ val ub = new UserBox()
+ this.stage.resizable = true
+ ub.messageLabel.text = "Hi there"
+ // ub.messageLabel.id =
+ ub.userRadioButton.text = "User 1"
+ usersVBox.children.clear()
+ usersVBox.children += ub
+ println("test")
+ println(s"Result = ${func()}")
+ offFX(println("hello from new thread"))
+ chatTextArea.visible <== !chatInput.text.isEmpty
+ chatTextArea.text <== chatInput.text
+
+ for (r <- userService.func2()) yield (logger.info(s"${r.body}"))
+
+ val person = Person(0, 10, "Billy")
+ val bean = FXBean[Person](person)
+ ub.messageLabel.text <== bean.getStringProperty("name")
+ // bean.getStringProperty("name") <== chatInput.text
+
+ // bean.getStringProperty("name")() = "Lester"
+ println(bean.getValue("name"))
+ println(bean.getStringProperty("name")())
+ // bean.
+ bean.updateValue("name", "Lester")
+ println(bean.bean)
+
+ }
+
+ override def didGainVisibility(): Unit = {
+ super.didGainVisibility()
+ }
+ def func() = {
+ val x = offFXAndWait {
+ 2 + 3
+ }
+ x
+ }
+}
+
+final case class Person(id: Int, age: Int, name: String)
diff --git a/src/main/scala/wow/doge/chatto/controller/LoginController.scala b/src/main/scala/wow/doge/chatto/controller/LoginController.scala
new file mode 100644
index 0000000..1d20ea7
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/controller/LoginController.scala
@@ -0,0 +1,160 @@
+package wow.doge.chatto.controller
+
+import com.typesafe.scalalogging.LazyLogging
+import com.sfxcode.sapphire.core.controller.ViewController
+import javafx.fxml.FXML
+import com.jfoenix.controls.JFXButton
+import com.jfoenix.controls.JFXTextField
+import com.jfoenix.controls.JFXPasswordField
+import scalafx.Includes._
+// import scalafx.application.Platform
+import scalafx.event.ActionEvent
+import com.sfxcode.sapphire.core.value.KeyBindings
+import scalafx.scene.layout.VBox
+import com.sfxcode.sapphire.core.value.FXBean
+import javax.inject.Inject
+import com.sfxcode.sapphire.core.value.FXBeanAdapter
+import wow.doge.chatto.service.UserService
+import scala.concurrent.ExecutionContext.Implicits.global
+import scala.util.Success
+import scala.util.Failure
+import javafx.scene.control.Label
+import javafx.scene.input.KeyCode
+import scala.async.Async.{async, await}
+import wow.doge.chatto.AppData
+import wow.doge.chatto.User
+import sttp.client._
+import scala.concurrent.Future
+import sttp.client.asynchttpclient.WebSocketHandler
+import wow.doge.chatto.types.AppTypes.HttpBackend
+import wow.doge.chatto.types.AppTypes
+
+class LoginController @Inject() (userService: UserService, var appData: AppData)(
+ implicit backend: HttpBackend
+) extends AbstractViewController
+ with LazyLogging
+ with AppTypes {
+ @FXML private var submitButton: JFXButton = _
+
+ @FXML private var usernameTextField: JFXTextField = _
+
+ @FXML private var passwordTextField: JFXPasswordField = _
+
+ @FXML private var errorLabel: Label = _
+
+ override def didGainVisibilityFirstTime(): Unit = {
+ super.didGainVisibilityFirstTime()
+ this.stage.resizable = false
+ usernameTextField.requestFocus()
+ submitButton.setOnAction(actionLogin)
+
+ // println(something)
+
+ val bindings = KeyBindings("usernameTextField", "passwordTextField")
+ // Expression Binding Example
+ // bindings.add(
+ // "usernameTextField",
+ // "${sf:i18n('personText', _self.usernameTextField(), _self.passwordTextField())})"
+ // )
+
+ val box = new VBox()
+ val adapter = FXBeanAdapter[Person](this)
+ // adapter.
+ val bean = FXBean[Person](Person("twar", "username", "password"))
+ // bean.
+ // bean.get
+ adapter.addBindings(bindings)
+ adapter.set(bean)
+ // adapter.addIntConverter("age")
+ // adapter.hasBeanProperty
+ // adapter.revert()
+
+ // usernameTextField.onKeyPressed = (keyEvent) => {
+ // if (keyEvent.getCode() == KeyCode.ENTER) submitButton.fire()
+ // }
+ // submitButton.onKeyPressed = (keyEvent) => {
+ // if (keyEvent.getCode() == KeyCode.ENTER) submitButton.fire()
+ // }
+ // passwordTextField.onKeyPressed = (keyEvent) => {
+ // if (keyEvent.getCode() == KeyCode.ENTER) submitButton.fire()
+ // }
+
+ Array(usernameTextField, passwordTextField, submitButton)
+ .foreach(_.onKeyPressed = (keyEvent) => {
+ if (keyEvent.getCode() == KeyCode.ENTER) submitButton.fire()
+ })
+
+ }
+
+ override def didGainVisibility(): Unit = {
+ usernameTextField.requestFocus()
+ }
+
+ def actionLogin(e: ActionEvent) = {
+ import org.scalafx.extras._
+ val inputUserName = usernameTextField.text()
+ val inputPassword = passwordTextField.text()
+
+ // val authenticated =
+ // inputPassword.equals("password") && inputUserName.equals("hmm")
+ login(inputUserName, inputPassword) onComplete {
+ case Success(value) => {
+ value.foreach(println)
+ value match {
+ case Some(token) => {
+ appData =
+ appData.copy(user = User(inputUserName, inputPassword, token))
+ }
+ case None => {
+ onFX(errorLabel.text =
+ "Error logging in - please check your password"
+ )
+ logger.warn("Login unsuccessful wrong password")
+ }
+ }
+ // Platform.runLater(() => applicationController.showChatPane())
+ onFX(applicationController.showChatPane())
+ }
+ case Failure(exception) => {
+ logger.error(s"${exception.getMessage()}")
+ logger.warn("Login unsuccessful network problem")
+ onFX {
+ errorLabel.text = "Error logging in - Please check your network"
+ applicationController.showChatPane()
+ }
+ // onFX(applicationController.showChatPane())
+ }
+ }
+ // if (authenticated) {
+ // passwordTextField.clear()
+ // val res = Result(username = inputUserName, password = inputPassword)
+ // println(res)
+ // // loginManager.
+
+ // applicationController.showChatPane()
+ // } else {
+ // logger.error("Login Error")
+ // }
+ }
+
+ def login(username: String, password: String) = async {
+ val resp = await(initLogin(username, password))
+ resp.header("X-AUTH-TOKEN")
+ }
+
+ def initLogin(username: String, password: String) = {
+ basicRequest.auth
+ .basic(username, password)
+ .get(uri"http://localhost:8080/api/chat/get/token")
+ .send()
+ }
+
+ final case class Result(username: String, password: String)
+
+ final case class Person(
+ id: String,
+ usernameTextField: String,
+ passwordTextField: String
+ )
+
+}
diff --git a/src/main/scala/wow/doge/chatto/controller/MainViewController.scala b/src/main/scala/wow/doge/chatto/controller/MainViewController.scala
new file mode 100644
index 0000000..47671c3
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/controller/MainViewController.scala
@@ -0,0 +1,54 @@
+package wow.doge.chatto.controller
+
+import javafx.fxml.FXML
+import javafx.scene.control.MenuBar
+import javafx.scene.layout.Pane
+import javax.enterprise.event.Observes
+
+import com.sfxcode.sapphire.core.controller.ViewController
+import com.sfxcode.sapphire.core.scene.{ContentDidChangeEvent, ContentManager}
+import com.typesafe.scalalogging.LazyLogging
+import wow.doge.chatto.messagebuble.BubbledMDFXNode
+import scalafx.scene.layout.GridPane
+import scalafx.Includes._
+// import wow.doge.chatto.
+
+class MainViewController extends ViewController with LazyLogging {
+
+ @FXML var menuBar: MenuBar = _
+ // @FXML
+ // var workspacePane: Pane = _
+ // @FXML
+ // var statusPane: Pane = _
+ // @FXML
+ // var navigationPane: Pane = _
+
+ @FXML var loginPane: Pane = _
+
+ @FXML var chatPane: Pane = _
+
+ lazy val workspaceController = getController[WorkspaceController]()
+ lazy val navigationController = getController[NavigationController]()
+ lazy val statusBarController = getBean[StatusBarController]()
+ lazy val loginController = getController[LoginController]()
+ lazy val chatController = getController[ChatController]()
+
+ // val bubbleNode = new BubbledMDFXNode("Wow")
+
+ var workspaceManager: ContentManager = _
+ var navigationManager: ContentManager = _
+ var statusBarManager: ContentManager = _
+ var mainManager: ContentManager = _
+
+ override def didGainVisibilityFirstTime() {
+ // menuBar.setUseSystemMenuBar(true)
+ menuBar.setVisible(false)
+
+ // navigationManager =
+ // ContentManager(navigationPane, this, navigationController)
+ // statusBarManager = ContentManager(statusPane, this, statusBarController)
+ // workspaceManager = ContentManager(workspacePane, this, workspaceController)
+ mainManager = ContentManager(loginPane, this, loginController)
+ }
+
+}
diff --git a/src/main/scala/wow/doge/chatto/controller/NavigationController.scala b/src/main/scala/wow/doge/chatto/controller/NavigationController.scala
new file mode 100644
index 0000000..208d2ae
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/controller/NavigationController.scala
@@ -0,0 +1,18 @@
+package wow.doge.chatto.controller
+
+import javafx.event.ActionEvent
+import javafx.scene.control.Button
+
+class NavigationController extends AbstractViewController {
+
+ def actionClickButton(event: ActionEvent) {
+ logger.debug(event.toString)
+ statusBarController.updateLabel(event.getSource.asInstanceOf[Button])
+ }
+
+ def actionHotReload(event: ActionEvent) {
+ applicationController.replacePrimarySceneContent()
+ logger.debug("Hot Reload Succeeded")
+ statusBarController.updateLabel(event.getSource.asInstanceOf[Button])
+ }
+}
diff --git a/src/main/scala/wow/doge/chatto/controller/StatusBarController.scala b/src/main/scala/wow/doge/chatto/controller/StatusBarController.scala
new file mode 100644
index 0000000..077c3db
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/controller/StatusBarController.scala
@@ -0,0 +1,46 @@
+package wow.doge.chatto.controller
+
+import com.typesafe.scalalogging.LazyLogging
+import javafx.geometry.Insets
+import javafx.scene.control.{Button, Label}
+import javafx.scene.layout.HBox
+import javax.enterprise.context.ApplicationScoped
+import javax.inject.Named
+
+@Named
+@ApplicationScoped
+class StatusBarController extends AbstractViewController with LazyLogging {
+
+ rootPane = new HBox()
+
+ val actionLabel: Label = new Label("Status Bar Action Label ...")
+ actionLabel.setPadding(new Insets(5))
+
+ val statusLabel: Label = new Label("Status Bar Status Label ...")
+ statusLabel.setPadding(new Insets(5))
+
+ val statusButton = new Button("Status Button 1")
+ statusButton.setOnAction(_ => {
+ logger.debug("%s".format(statusButton.getText))
+ updateLabel(statusButton)
+ })
+
+ val statusButton2 = new Button("Status Button 2")
+ statusButton2.setOnAction(_ => {
+ logger.debug("%s".format(statusButton2.getText))
+ updateLabel(statusButton2)
+ })
+
+ val box = new HBox()
+ box.setId("statusBar")
+ box.setPadding(new Insets(10))
+ box.setSpacing(10.0)
+
+ box.getChildren.addAll(statusButton, statusButton2, statusLabel, actionLabel)
+
+ rootPane = box
+
+ def updateLabel(button: Button): Unit = {
+ actionLabel.setText("%s clicked".format(button.getText))
+ }
+}
diff --git a/src/main/scala/wow/doge/chatto/controller/WorkspaceController.scala b/src/main/scala/wow/doge/chatto/controller/WorkspaceController.scala
new file mode 100644
index 0000000..7438b0e
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/controller/WorkspaceController.scala
@@ -0,0 +1,21 @@
+package wow.doge.chatto.controller
+
+import javafx.fxml.FXML
+import javafx.scene.control.Label
+import javax.inject.Inject
+
+import wow.doge.chatto.ApplicationName
+
+class WorkspaceController @Inject() (applicationName: ApplicationName)
+ extends AbstractViewController {
+
+ // @Inject
+ // var applicationName: ApplicationName = _
+
+ @FXML
+ var infoLabel: Label = _
+
+ override def didGainVisibilityFirstTime() {
+ infoLabel.setText(applicationName.name)
+ }
+}
diff --git a/src/main/scala/wow/doge/chatto/messagebubble/Bubble.java b/src/main/scala/wow/doge/chatto/messagebubble/Bubble.java
new file mode 100644
index 0000000..451c553
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/messagebubble/Bubble.java
@@ -0,0 +1,81 @@
+package wow.doge.chatto.messagebuble;
+
+import javafx.scene.shape.HLineTo;
+import javafx.scene.shape.LineTo;
+import javafx.scene.shape.MoveTo;
+import javafx.scene.shape.Path;
+import javafx.scene.shape.VLineTo;
+
+public class Bubble extends Path {
+
+ /*
+ * Copyright {2015} {Terah Laweh}
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+ public Bubble(BubbleSpec bubbleSpec) {
+ super();
+ switch (bubbleSpec) {
+ case FACE_BOTTOM:
+ break;
+ case FACE_LEFT_BOTTOM:
+ drawRectBubbleLeftBaselineIndicator();
+ break;
+ case FACE_LEFT_CENTER:
+ drawRectBubbleLeftCenterIndicator();
+ break;
+ case FACE_RIGHT_BOTTOM:
+ drawRectBubbleRightBaselineIndicator();
+ break;
+ case FACE_RIGHT_CENTER:
+ drawRectBubbleRightCenterIndicator();
+ break;
+ case FACE_TOP:
+ drawRectBubbleToplineIndicator();
+ break;
+
+ default:
+ break;
+ }
+
+ }
+
+ private void drawRectBubbleToplineIndicator() {
+ getElements().addAll(new MoveTo(1.0f, 1.2f), new HLineTo(2.5f), new LineTo(2.7f, 1.0f), new LineTo(2.9f, 1.2f),
+ new HLineTo(4.4f), new VLineTo(4f), new HLineTo(1.0f), new VLineTo(1.2f));
+ }
+
+ private void drawRectBubbleRightBaselineIndicator() {
+ getElements().addAll(new MoveTo(3.0f, 1.0f), new HLineTo(0f), new VLineTo(4f), new HLineTo(3.0f),
+ new LineTo(2.8f, 3.8f), new VLineTo(1f));
+ }
+
+ private void drawRectBubbleLeftBaselineIndicator() {
+ getElements().addAll(new MoveTo(1.2f, 1.0f), new HLineTo(3f), new VLineTo(4f), new HLineTo(1.0f),
+ new LineTo(1.2f, 3.8f), new VLineTo(1f));
+ }
+
+ private void drawRectBubbleRightCenterIndicator() {
+ getElements().addAll(new MoveTo(3.0f, 2.5f), new LineTo(2.8f, 2.4f), new VLineTo(1f), new HLineTo(0f),
+ new VLineTo(4f), new HLineTo(2.8f), new VLineTo(2.7f), new LineTo(3.0f, 2.5f));
+ }
+
+ protected double drawRectBubbleIndicatorRule = 0.2;
+
+ private void drawRectBubbleLeftCenterIndicator() {
+ getElements().addAll(new MoveTo(1.0f, 2.5f), new LineTo(1.2f, 2.4f), new VLineTo(1f), new HLineTo(2.9f),
+ new VLineTo(4f), new HLineTo(1.2f), new VLineTo(2.7f), new LineTo(1.0f, 2.5f));
+ }
+
+}
diff --git a/src/main/scala/wow/doge/chatto/messagebubble/BubbleSpec.java b/src/main/scala/wow/doge/chatto/messagebubble/BubbleSpec.java
new file mode 100644
index 0000000..9fcd898
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/messagebubble/BubbleSpec.java
@@ -0,0 +1,23 @@
+package wow.doge.chatto.messagebuble;
+
+public enum BubbleSpec {
+
+ /*
+ * Copyright {2015} {Terah Laweh}
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+ FACE_TOP, FACE_BOTTOM, FACE_LEFT_BOTTOM, FACE_LEFT_CENTER, FACE_RIGHT_BOTTOM, FACE_RIGHT_CENTER;
+
+}
diff --git a/src/main/scala/wow/doge/chatto/messagebubble/BubbledLabel.java b/src/main/scala/wow/doge/chatto/messagebubble/BubbledLabel.java
new file mode 100644
index 0000000..be06f9b
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/messagebubble/BubbledLabel.java
@@ -0,0 +1,178 @@
+package wow.doge.chatto.messagebuble;
+
+import javafx.beans.InvalidationListener;
+import javafx.beans.Observable;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
+import javafx.scene.control.Label;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Shape;
+
+public class BubbledLabel extends Label {
+
+ /*
+ * Copyright {2015} {Terah Laweh}
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+ private BubbleSpec bs = BubbleSpec.FACE_LEFT_CENTER;
+ private double pading = 5.0;
+ private boolean systemCall = false;
+
+ public BubbledLabel() {
+ super();
+ init();
+ }
+
+ public BubbledLabel(String arg0, Node arg1) {
+ super(arg0, arg1);
+ init();
+ }
+
+ public BubbledLabel(String arg0) {
+ super(arg0);
+ init();
+ }
+
+ public BubbledLabel(BubbleSpec bubbleSpec) {
+ super();
+ this.bs = bubbleSpec;
+ init();
+ }
+
+ public BubbledLabel(String arg0, Node arg1, BubbleSpec bubbleSpec) {
+ super(arg0, arg1);
+ this.bs = bubbleSpec;
+ init();
+ }
+
+ public BubbledLabel(String arg0, BubbleSpec bubbleSpec) {
+ super(arg0);
+ this.bs = bubbleSpec;
+ init();
+ }
+
+ private void init() {
+ DropShadow ds = new DropShadow();
+ ds.setOffsetX(1.3);
+ ds.setOffsetY(1.3);
+ ds.setColor(Color.DARKGRAY);
+ setPrefSize(Label.USE_COMPUTED_SIZE, Label.USE_COMPUTED_SIZE);
+ shapeProperty().addListener(new ChangeListener() {
+ @Override
+ public void changed(ObservableValue extends Shape> arg0, Shape arg1, Shape arg2) {
+ if (systemCall) {
+ systemCall = false;
+ } else {
+ shapeIt();
+ }
+ /*
+ * if(arg2.getClass().isAssignableFrom(Bubble.class)){ // i do no need to check
+ * for this actuall is waste of time systemCall = false; return; }else{ // not
+ * the required shape systemCall = true; setShape(new Bubble(bs)); System.gc();
+ * }
+ */
+
+ }
+ });
+
+ heightProperty().addListener(new InvalidationListener() {
+
+ @Override
+ public void invalidated(Observable arg0) {
+ if (!systemCall)
+ setPrefHeight(Label.USE_COMPUTED_SIZE);
+ }
+ });
+
+ widthProperty().addListener(new InvalidationListener() {
+
+ @Override
+ public void invalidated(Observable observable) {
+ if (!systemCall)
+ setPrefHeight(Label.USE_COMPUTED_SIZE);
+ }
+ });
+
+ shapeIt();
+ }
+
+ @Override
+ protected void updateBounds() {
+ super.updateBounds();
+ // top right bottom left
+ switch (bs) {
+ case FACE_LEFT_BOTTOM:
+ setPadding(new Insets(pading, pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading));
+ break;
+ case FACE_LEFT_CENTER:
+ setPadding(new Insets(pading, pading, pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading));
+ break;
+ case FACE_RIGHT_BOTTOM:
+ setPadding(new Insets(pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading, pading));
+ break;
+ case FACE_RIGHT_CENTER:
+ setPadding(new Insets(pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading, pading));
+ break;
+ case FACE_TOP:
+ setPadding(new Insets(
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading, pading, pading));
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ public final double getPading() {
+ return pading;
+ }
+
+ public void setPading(double pading) {
+ if (pading > 25.0)
+ return;
+ this.pading = pading;
+ }
+
+ public BubbleSpec getBubbleSpec() {
+ return bs;
+ }
+
+ public void setBubbleSpec(BubbleSpec bubbleSpec) {
+ this.bs = bubbleSpec;
+ shapeIt();
+ }
+
+ private final void shapeIt() {
+ systemCall = true;
+ setShape(new Bubble(bs));
+ System.gc();
+ }
+}
diff --git a/src/main/scala/wow/doge/chatto/messagebubble/BubbledMDFXNode.java b/src/main/scala/wow/doge/chatto/messagebubble/BubbledMDFXNode.java
new file mode 100644
index 0000000..b10c96e
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/messagebubble/BubbledMDFXNode.java
@@ -0,0 +1,135 @@
+package wow.doge.chatto.messagebuble;
+
+import com.sandec.mdfx.MDFXNode;
+
+import javafx.beans.InvalidationListener;
+import javafx.beans.Observable;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
+import javafx.scene.control.Label;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Shape;
+
+public class BubbledMDFXNode extends MDFXNode {
+ public BubbledMDFXNode(String s) {
+ super(s);
+ init();
+ }
+
+ private BubbleSpec bs = BubbleSpec.FACE_LEFT_CENTER;
+ private double pading = 5.0;
+ private boolean systemCall = false;
+
+ private void init() {
+ DropShadow ds = new DropShadow();
+ ds.setOffsetX(1.3);
+ ds.setOffsetY(1.3);
+ ds.setColor(Color.DARKGRAY);
+ setPrefSize(Label.USE_COMPUTED_SIZE, Label.USE_COMPUTED_SIZE);
+ shapeProperty().addListener(new ChangeListener() {
+ @Override
+ public void changed(ObservableValue extends Shape> arg0, Shape arg1, Shape arg2) {
+ if (systemCall) {
+ systemCall = false;
+ } else {
+ shapeIt();
+ }
+ /*
+ * if(arg2.getClass().isAssignableFrom(Bubble.class)){ // i do no need to check
+ * for this actuall is waste of time systemCall = false; return; }else{ // not
+ * the required shape systemCall = true; setShape(new Bubble(bs)); System.gc();
+ * }
+ */
+
+ }
+ });
+
+ heightProperty().addListener(new InvalidationListener() {
+
+ @Override
+ public void invalidated(Observable arg0) {
+ if (!systemCall)
+ setPrefHeight(Label.USE_COMPUTED_SIZE);
+ }
+ });
+
+ widthProperty().addListener(new InvalidationListener() {
+
+ @Override
+ public void invalidated(Observable observable) {
+ if (!systemCall)
+ setPrefHeight(Label.USE_COMPUTED_SIZE);
+ }
+ });
+
+ shapeIt();
+ }
+
+ @Override
+ protected void updateBounds() {
+ super.updateBounds();
+ // top right bottom left
+ switch (bs) {
+ case FACE_LEFT_BOTTOM:
+ setPadding(new Insets(pading, pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading));
+ break;
+ case FACE_LEFT_CENTER:
+ setPadding(new Insets(pading, pading, pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading));
+ break;
+ case FACE_RIGHT_BOTTOM:
+ setPadding(new Insets(pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading, pading));
+ break;
+ case FACE_RIGHT_CENTER:
+ setPadding(new Insets(pading,
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading, pading));
+ break;
+ case FACE_TOP:
+ setPadding(new Insets(
+ (this.getBoundsInLocal().getWidth() * ((Bubble) getShape()).drawRectBubbleIndicatorRule) / 2
+ + pading,
+ pading, pading, pading));
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ public final double getPading() {
+ return pading;
+ }
+
+ public void setPading(double pading) {
+ if (pading > 25.0)
+ return;
+ this.pading = pading;
+ }
+
+ public BubbleSpec getBubbleSpec() {
+ return bs;
+ }
+
+ public void setBubbleSpec(BubbleSpec bubbleSpec) {
+ this.bs = bubbleSpec;
+ shapeIt();
+ }
+
+ private final void shapeIt() {
+ systemCall = true;
+ setShape(new Bubble(bs));
+ System.gc();
+ }
+}
\ No newline at end of file
diff --git a/src/main/scala/wow/doge/chatto/model/ChatUser.scala b/src/main/scala/wow/doge/chatto/model/ChatUser.scala
new file mode 100644
index 0000000..15b3448
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/model/ChatUser.scala
@@ -0,0 +1,10 @@
+package wow.doge.chatto.model
+
+import java.time.Instant
+
+case class ChatUser(
+ userId: Long,
+ userName: String,
+ password: String,
+ joinDate: Instant
+)
diff --git a/src/main/scala/wow/doge/chatto/service/UserService.scala b/src/main/scala/wow/doge/chatto/service/UserService.scala
new file mode 100644
index 0000000..15562db
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/service/UserService.scala
@@ -0,0 +1,46 @@
+package wow.doge.chatto.service
+
+import scala.concurrent.ExecutionContext
+import scala.concurrent.ExecutionContext.Implicits.global
+import scala.async.Async.{async, await}
+import sttp.client.json4s._
+import org.json4s._
+import sttp.client._
+import scala.concurrent.Future
+import sttp.client.asynchttpclient.WebSocketHandler
+import javax.inject.Inject
+import scala.async.Async.{async, await}
+import scala.util.Success
+import scala.util.Failure
+import wow.doge.chatto.AppData
+import wow.doge.chatto.types.AppTypes.HttpBackend
+
+class UserService @Inject() (appData: AppData)(
+ implicit backend: HttpBackend
+) {
+ private implicit lazy val serialization = org.json4s.native.Serialization
+
+ def func1() = {
+ val willBeResponse = basicRequest
+ .get(uri"https://httpbin.org/get")
+ .response(asJson[HttpBinResponse])
+ .send()
+ async {
+ val r = await { willBeResponse }
+ r.body.map(println)
+ }
+ }
+
+ def func2() =
+ basicRequest
+ .get(uri"https://httpbin.org/get")
+ .response(asJson[HttpBinResponse])
+ .send()
+
+}
+
+case class HttpBinResponse(
+ url: String,
+ origin: String,
+ headers: Map[String, String]
+)
diff --git a/src/main/scala/wow/doge/chatto/types/Types.scala b/src/main/scala/wow/doge/chatto/types/Types.scala
new file mode 100644
index 0000000..fba71c6
--- /dev/null
+++ b/src/main/scala/wow/doge/chatto/types/Types.scala
@@ -0,0 +1,14 @@
+package wow.doge.chatto.types
+
+import sttp.client.SttpBackend
+import scala.concurrent.Future
+import sttp.client.asynchttpclient.WebSocketHandler
+
+trait AppTypes {
+// import AppTypes._
+ type HttpBackend = SttpBackend[Future, Nothing, WebSocketHandler]
+}
+
+object AppTypes extends AppTypes {
+// type HttpBackend = SttpBackend[Future, Nothing, WebSocketHandler]
+}
diff --git a/version.sbt b/version.sbt
new file mode 100644
index 0000000..5321c0b
--- /dev/null
+++ b/version.sbt
@@ -0,0 +1,2 @@
+version in ThisBuild := "0.1.0-SNAPSHOT"
+