frontend: use sass for cascading styles
diff --git a/frontend-assets/icons/tree_last_branch.svg b/frontend-assets/icons/tree_last_branch.svg
index efb8e20..0b3f751 100644
--- a/frontend-assets/icons/tree_last_branch.svg
+++ b/frontend-assets/icons/tree_last_branch.svg
@@ -12,9 +12,8 @@
    version="1.1"
    id="svg2"
    inkscape:version="0.91+devel r14491"
-   width="32"
-   height="32"
    viewBox="0 0 32 32"
+   preserveAspectRatio="none"
    sodipodi:docname="tree_last_branch.svg">
   <metadata
      id="metadata8">
diff --git a/frontend/_netopeer-common.scss b/frontend/_netopeer-common.scss
new file mode 100644
index 0000000..9154f15
--- /dev/null
+++ b/frontend/_netopeer-common.scss
@@ -0,0 +1,51 @@
+$colorSuccess: #def2de;
+$colorSuccessBorder: green;
+$colorFailure: #f2dede;
+$colorFailureBorder: red;
+
+a:not([href]) {
+    cursor: pointer;
+    text-decoration: underline;
+    font-weight: bold;
+}
+
+.netopeer-content {
+	display: block;
+	padding: 0.7em 1em 1em 2em;
+	background-color: #FAFAFA;
+	color: #000;
+}
+
+.msg-rounded {
+    border-radius: 5px;
+}
+
+.msg-close {
+    padding-right: 10px;
+    padding-left: 10px;
+    font-weight: bold;
+    font-family: monospace;
+    font-size: large;
+	cursor: pointer;
+    height: 1em;
+}
+
+.msg-success {
+    background-color: $colorSuccess;
+	color: green;
+	padding: 5px 1em 5px 0em;
+	
+	.msg-close {
+    	color: $colorSuccessBorder;
+	}
+}
+
+.msg-failure {
+    background-color: $colorFailure;
+    color: red;
+	padding: 5px 1em 5px 0em;
+
+	.msg-close {
+    	color: $colorFailureBorder;
+	}
+}
\ No newline at end of file
diff --git a/frontend/config/config.component.css b/frontend/config/config.component.css
deleted file mode 100644
index 6a10dab..0000000
--- a/frontend/config/config.component.css
+++ /dev/null
@@ -1,107 +0,0 @@
-.tab-add,
-.tab-reload,
-.tab-close {
-    cursor: pointer;
-    font-weight: bold;
-    font-family: monospace;
-    font-size: large;
-}
-.tab-action-first {
-    padding-left: 0.3em;
-}
-.tab-action-last {
-    padding-right: 0.5em;
-}
-
-.tab-icon {
-    vertical-align: middle;
-    height: 1em;
-}
-
-.tab-add {
-    filter: invert(100%);
-}
-
-.tab-add:hover {
-    color: green;
-}
-.tab-close:hover {
-    color: red;
-}
-.tab-reload:hover {
-    color: blue;
-}
-
-#confignav {
-    position: fixed;
-    width: 100%;
-	background-color: #3B4257;
-	padding-left: 1em;
-}
-
-#confignav a {
-    cursor: pointer;
-	text-decoration: none;
-	display: inline-block;
-	padding: 0.2em 0em 0.1em 1em;
-	color: #FAFAFA;
-}
-
-#confignav a:visited,
-#confignav a:link {
-	color: inherited;
-}
-
-#confignav a:hover,
-#confignav a.active {
-	background-color: #FAFAFA;
-	color: #000;
-}
-
-#confignav a.active:hover {
-	cursor: default;	
-}
-
-#config-toc {
-    position: fixed;
-    width: 10em;
-    border-right: 1px solid #313747;
-}
-
-.config-toc-item {
-    cursor: pointer;
-    padding: 0em 0em 0.2em 0.5em;
-}
-.config-toc-item:hover {
-	background-color: #3B4257;
-    color: #FFF;
-}
-
-#config-data {
-    width: 100%;
-}
-
-.item_action_expand,
-.item_action_collapse {
-    height: 1em;
-}
-
-.item_action_collapse:hover {
-    color:red;
-}
-
-.item_action_expand:hover {
-    color:green;
-}
-
-.modifications-status {
-	position: fixed;
-	bottom: 2em;
-	right: 2em;
-	background-color: #fafad2;
-	border: 2px solid #e4e4a4;
-}
-.modifications-status-place {
-	margin-bottom: 2em;
-	margin-right: 2em;
-}
diff --git a/frontend/config/config.component.html b/frontend/config/config.component.html
index 7a1ef15..d201fe8 100644
--- a/frontend/config/config.component.html
+++ b/frontend/config/config.component.html
@@ -70,8 +70,8 @@
         <tree-view [treeData]="activeSession.data"></tree-view>
         <!--<pre>{{activeSession.data | json}}</pre>-->
     </div>
-	<div #modificationsStatus *ngIf="activeSession.modifications" class="modifications-status-place">&nbsp;
-		<div *ngIf="activeSession.modifications" class="modifications-status msg-rounded" [style.width.px]="modificationsStatus.offsetWidth">
+	<div #modificationsStatus *ngIf="activeSession.modifications" class="modifications-status">&nbsp;
+		<div *ngIf="activeSession.modifications" class="msg-rounded" [style.width.px]="modificationsStatus.offsetWidth">
 		Configuration data were changed. Do you wish to
 		<button (click)="applyChanges()">apply</button> /
 		<button (click)="cancelChanges()">cancel</button>
diff --git a/frontend/config/config.component.scss b/frontend/config/config.component.scss
new file mode 100644
index 0000000..0caa675
--- /dev/null
+++ b/frontend/config/config.component.scss
@@ -0,0 +1,98 @@
+@import '../netopeer-common';
+@import '../inventory/inventory.component';
+@import './tree.component';
+
+.tab-add,
+.tab-reload,
+.tab-close {
+    cursor: pointer;
+    font-weight: bold;
+    font-family: monospace;
+    font-size: large;
+}
+.tab-action-first {
+    padding-left: 0.3em;
+}
+.tab-action-last {
+    padding-right: 0.5em;
+}
+
+.tab-icon {
+    vertical-align: middle;
+    height: 1em;
+}
+
+.tab-add {
+    filter: invert(100%);
+    
+    &:hover {
+    	color: green;
+    }
+}
+
+.tab-close:hover {
+    color: red;
+}
+.tab-reload:hover {
+    color: blue;
+}
+
+#confignav {
+    position: fixed;
+    width: 100%;
+	background-color: #3B4257;
+	padding-left: 1em;
+	
+	a {
+    	cursor: pointer;
+		text-decoration: none;
+		display: inline-block;
+		padding: 0.2em 0em 0.1em 1em;
+		color: #FAFAFA;
+		
+		&:visited,
+		&:link {
+			color: inherited;
+		}
+		&:hover,
+		&.active {
+			background-color: #FAFAFA;
+			color: #000;
+		}
+		&active:hover {
+			cursor: default;
+		}
+	}
+}
+
+#config-data {
+    width: 100%;
+}
+
+.item_action_expand,
+.item_action_collapse {
+    height: 1em;
+}
+
+.item_action_collapse:hover {
+    color:red;
+}
+
+.item_action_expand:hover {
+    color:green;
+}
+
+.modifications-status {
+	margin-bottom: 2em;
+	margin-right: 2em;
+	padding: 0.5em 1em;
+	
+	div {
+		position: fixed;
+		bottom: 2em;
+		right: 2em;
+		background-color: #fafad2;
+		border: 2px solid #e4e4a4;
+		padding: 0.5em 1em;
+	}
+}
diff --git a/frontend/config/config.component.ts b/frontend/config/config.component.ts
index d13931f..303e792 100644
--- a/frontend/config/config.component.ts
+++ b/frontend/config/config.component.ts
@@ -7,7 +7,7 @@
 @Component({
     selector: 'netopeer-config',
     templateUrl: './config.component.html',
-    styleUrls: ['../netopeer.css', './config.component.css', './tree.component.css', '../inventory/inventory.component.css']
+    styleUrls: ['./config.component.scss']
 })
 
 export class ConfigComponent implements OnInit {
diff --git a/frontend/config/tree.component.css b/frontend/config/tree.component.css
deleted file mode 100644
index d511188..0000000
--- a/frontend/config/tree.component.css
+++ /dev/null
@@ -1,88 +0,0 @@
-.subtree {
-    cursor: default;
-    display: block;
-    width: 100%;
-}
-
-.node {
-    width: 100%;
-    overflow: hidden;
-}
-.node:hover,
-.node_edit:hover {
-    background-color: #e1e1e1
-}
-
-.node_edit {
-	display: table;
-	width: 100%;
-    overflow: hidden;
-}
-.node_edit img,
-.node_edit input {
-	display: inline-table;
-	margin-right: 0.25em;
-}
-.node_edit input {
-	height: 2em;
-    padding-left: 0.3em;
-    background-color: #def2de;
-}
-.node_edit input.invalid {
-    background-color: #f2dede;
-}
-.node_edit .indentation {
-	height:2.1em;
-}
-
-.node > div {
-    display: inline-block;
-}
-
-.dirty {
-	background-color: #fafad2;
-}
-
-.status,
-.node_info {
-    color: grey;
-}
-
-.icon,
-.icon_action {
-    font-size: xx-small;
-    height: 2em;
-}
-
-.icon_action {
-    cursor: pointer;
-}
-
-.icon_hidden {
-	visibility: hidden;
-}
-
-.module_name {
-    float: right;
-    text-align: right;
-    max-width: 10em;
-    word-wrap: break-word;
-}
-
-.children {
-    padding-left: 0em;
-}
-
-.value {
-    display: inline-block;
-    margin-left: 1.5em;
-}
-
-.value {
-    word-wrap: break-word;
-}
-
-.indentation {
-    width: 1.7em;
-}
-
diff --git a/frontend/config/tree.component.scss b/frontend/config/tree.component.scss
new file mode 100644
index 0000000..6f837c0
--- /dev/null
+++ b/frontend/config/tree.component.scss
@@ -0,0 +1,94 @@
+@import '../netopeer-common';
+
+.subtree {
+    cursor: default;
+    display: block;
+    width: 100%;
+}
+
+.node {
+    width: 100%;
+    overflow: hidden;
+    
+    &:hover {
+    	background-color: #e1e1e1
+    }
+    
+    > div {
+    	display: inline-block;
+    }
+}
+
+.node_edit {
+	display: table;
+	width: 100%;
+    overflow: hidden;
+    
+    &:hover {
+    	background-color: #e1e1e1
+    }
+    
+    img,
+    input {
+		display: inline-table;
+		margin-right: 0.25em;
+    }
+    input {
+		height: 2em;
+    	padding-left: 0.3em;
+    	background-color: #def2de;
+    	
+    	&.invalid {
+    		background-color: #f2dede;
+    	}
+    }
+    
+    &.indentation {
+		height:2.1em;
+    }
+}
+
+.status,
+.node_info {
+    color: grey;
+}
+
+.dirty {
+	background-color: #fafad2;
+}
+
+.icon,
+.icon_action {
+    font-size: xx-small;
+    height: 2em;
+}
+
+.icon_action {
+    cursor: pointer;
+}
+
+.icon_hidden {
+	visibility: hidden;
+}
+
+.module_name {
+    float: right;
+    text-align: right;
+    max-width: 10em;
+    word-wrap: break-word;
+}
+
+.children {
+    padding-left: 0em;
+}
+
+.value {
+    display: inline-block;
+    margin-left: 1.5em;
+    word-wrap: break-word;
+}
+
+.indentation {
+    width: 1.7em;
+}
+
diff --git a/frontend/config/tree.component.ts b/frontend/config/tree.component.ts
index c61ae1a..3f6f7e0 100644
--- a/frontend/config/tree.component.ts
+++ b/frontend/config/tree.component.ts
@@ -6,7 +6,7 @@
 @Component({
     selector: 'tree-view',
     templateUrl: './tree.component.html',
-    styleUrls: ['../netopeer.css', './tree.component.css']
+    styleUrls: ['./tree.component.scss']
 })
 
 export class TreeView implements OnInit {
diff --git a/frontend/dashboard.component.ts b/frontend/dashboard.component.ts
index 5bf0ba3..636f735 100644
--- a/frontend/dashboard.component.ts
+++ b/frontend/dashboard.component.ts
@@ -3,7 +3,7 @@
 @Component({
   selector : 'netopeer-dashboard',
   templateUrl : './dashboard.component.html',
-  styleUrls : ['./netopeer.css']
+  styleUrls : ['./netopeer.scss']
 })
 
 export class DashboardComponent { }
diff --git a/frontend/inventory/devices.component.html b/frontend/inventory/devices.component.html
index 01ae07a..0a978fc 100644
--- a/frontend/inventory/devices.component.html
+++ b/frontend/inventory/devices.component.html
@@ -73,4 +73,4 @@
   </tr>
 </table>
 
-</div>
\ No newline at end of file
+</div>
diff --git a/frontend/inventory/devices.component.ts b/frontend/inventory/devices.component.ts
index 1aa3dd5..0a91e2f 100644
--- a/frontend/inventory/devices.component.ts
+++ b/frontend/inventory/devices.component.ts
@@ -11,7 +11,7 @@
 @Component({
     selector: 'inventoryDevices',
     templateUrl: './devices.component.html',
-    styleUrls: ['../netopeer.css', './inventory.component.css'],
+    styleUrls: ['./inventory.component.scss'],
     providers: [DevicesService]
 })
 
diff --git a/frontend/inventory/inventory.component.html b/frontend/inventory/inventory.component.html
index 65ffe8f..d75963a 100644
--- a/frontend/inventory/inventory.component.html
+++ b/frontend/inventory/inventory.component.html
@@ -3,4 +3,4 @@
     routerLink="{{component}}" routerLinkActive="active">{{ component | titlecase }}</a>
 </nav>
 
-<router-outlet class="netopeer-content"></router-outlet>
+<router-outlet></router-outlet>
diff --git a/frontend/inventory/inventory.component.css b/frontend/inventory/inventory.component.scss
similarity index 61%
rename from frontend/inventory/inventory.component.css
rename to frontend/inventory/inventory.component.scss
index 96c5919..a5cc004 100644
--- a/frontend/inventory/inventory.component.css
+++ b/frontend/inventory/inventory.component.scss
@@ -1,28 +1,29 @@
+@import '../netopeer-common';
+
 nav {
 	background-color: #3B4257;
 	padding-left: 1em;
-}
-
-nav a {
-	text-decoration: none;
-	display: inline-block;
-	padding: 0.2em 1em 0.1em 1em;
-	color: #FAFAFA;
-}
-
-nav a:visited,
-nav a:link {
-	color: #FAFAFA;
-}
-
-nav a:hover,
-nav a.active {
-	background-color: #FAFAFA;
-	color: #000
-}
-
-nav a.active:hover {
-	cursor: default;	
+	
+	a {
+		text-decoration: none;
+		display: inline-block;
+		padding: 0.2em 1em 0.1em 1em;
+		color: #FAFAFA;
+		
+		&:visited,
+		&:link {
+			color: #FAFAFA;
+		}
+		
+		&:hover,
+		&.active {
+			background-color: #FAFAFA;
+			color: #000;
+		}
+		&.active:hover {
+			cursor: default;
+		}	
+	}
 }
 
 .items {
@@ -38,9 +39,17 @@
 	left: 0.5em;
 	top: 0.5em;
 	color: black;
+	
+	&:hover,
+	&.selected {
+		background-color: #454D67;
+		color: #FAFAFA;
+	}
+	&.selected:hover {
+		cursor: default;
+	}
 }
 
-.item.selected,
 .item_header {
 	background-color: #454D67;
 	color: #FAFAFA;
@@ -56,15 +65,6 @@
     border-bottom-right-radius: 5px;
 }
 
-.item.selected:hover {
-	cursor: default;
-}
-
-.item:hover {
-	background-color: #454D67;
-	color: #FAFAFA;
-}
-
 .item_actions {
 	cursor: pointer;
     width: 2em;
@@ -76,13 +76,13 @@
     color: grey;
 }
 
-.item_action_delete{
+.item_action_delete {
     height: 1.3em;
     vertical-align: middle;
-}
-
-.item_action_delete:hover {
-    color: red;
+    
+    &:hover {
+    	color: red;
+    }
 }
 
 .schema-revision {
@@ -100,11 +100,11 @@
 .input_line {
     display: block;
     margin-right: 2em;
-}
-
-.input_line input {
-    display: inline-block;
-    padding-left: 1em;
+    
+    input {
+    	display: inline-block;
+    	padding-left: 1em;
+	}
 }
 
 .input_line_alert {
@@ -113,14 +113,14 @@
     color: red;
 }
 
-form input,
-form select {
-    border-left: 5px solid green;
-}
-
-form input.invalid,
-form select.invalid {
-    border-left: 5px solid red;
+form {
+	input,
+    select {
+    	border-left: 5px solid green;
+    	&.invalid {
+    		border-left: 5px solid red;
+    	}
+	}
 }
 
 .input_switch {
diff --git a/frontend/inventory/inventory.component.ts b/frontend/inventory/inventory.component.ts
index da0fbcf..52e8ce0 100644
--- a/frontend/inventory/inventory.component.ts
+++ b/frontend/inventory/inventory.component.ts
@@ -4,7 +4,7 @@
 @Component({
   selector : 'netopeer-inventory',
   templateUrl : './inventory.component.html',
-  styleUrls : ['./inventory.component.css']
+  styleUrls : ['./inventory.component.scss']
 })
 
 export class InventoryComponent implements OnInit {
diff --git a/frontend/inventory/schemas.component.ts b/frontend/inventory/schemas.component.ts
index df2af13..b7b5f2b 100644
--- a/frontend/inventory/schemas.component.ts
+++ b/frontend/inventory/schemas.component.ts
@@ -8,7 +8,7 @@
 @Component({
   selector : 'inventorySchemas',
   templateUrl : './schemas.component.html',
-  styleUrls : ['../netopeer.css', './inventory.component.css'],
+  styleUrls : ['./inventory.component.scss'],
   providers: [SchemasService]
 })
 
diff --git a/frontend/monitoring/monitoring.component.scss b/frontend/monitoring/monitoring.component.scss
new file mode 100644
index 0000000..12dd39c
--- /dev/null
+++ b/frontend/monitoring/monitoring.component.scss
@@ -0,0 +1 @@
+@import '../netopeer-common';
\ No newline at end of file
diff --git a/frontend/monitoring/monitoring.component.ts b/frontend/monitoring/monitoring.component.ts
index e1818ee..719930b 100644
--- a/frontend/monitoring/monitoring.component.ts
+++ b/frontend/monitoring/monitoring.component.ts
@@ -3,7 +3,7 @@
 @Component({
   selector : 'netopeer-config',
   templateUrl : './monitoring.component.html',
-  styleUrls : ['../netopeer.css']
+  styleUrls : ['./monitoring.component.scss']
 })
 
 export class MonitoringComponent {
diff --git a/frontend/netopeer.component.ts b/frontend/netopeer.component.ts
index 4922062..5fd613a 100644
--- a/frontend/netopeer.component.ts
+++ b/frontend/netopeer.component.ts
@@ -16,7 +16,7 @@
 @Component({
   selector : 'netopeer',
   templateUrl : './netopeer.component.html',
-  styleUrls : ['./netopeer.css'],
+  styleUrls : ['./netopeer.scss'],
 })
 
 export class NetopeerComponent {
diff --git a/frontend/netopeer.css b/frontend/netopeer.css
deleted file mode 100644
index c3a723c..0000000
--- a/frontend/netopeer.css
+++ /dev/null
@@ -1,95 +0,0 @@
-a:not([href]) {
-    cursor: pointer;
-    text-decoration: underline;
-    font-weight: bold;
-}
-
-#netopeer-header {
-    position: fixed;
-    width: 100%;
-	margin: -0.5em -1em 0em -1em;
-	padding-top: 1em;
-    background-color: #313747;
-    color: #FAFAFA;
-    display: block;
-}
-
-#netopeer-header h1 {
-	margin-left: 1em;
-}
-
-#netopeer-component {
-	margin: 0em -1em 0em -1em;
-}
-
-.netopeer-content {
-	display: block;
-	padding: 0.7em 1em 1em 2em;
-	background-color: #FAFAFA;
-	color: #000;
-}
-
-#mainnav {
-	with: 100%;
-	padding-left: 1em;
-}
-
-#mainnav a:visited,
-#mainnav a:link {
-	color: inherit;
-}
-
-#mainnav a:hover {
-    border-top-color: #3B4257;
-	background-color: #3B4257;
-}
-
-#mainnav a.active {
-    border-top-color: #BAE4F0;
-	background-color: #3B4257;
-}
-#mainnav a.active:hover {
-	cursor: default;
-}
-
-#mainnav a {
-	text-decoration: none;
-	display: inline-block;
-	padding: 0.5em 1em 0.5em 0.5em;
-	color: #FAFAFA;
-    border-top: 0.2em solid #313747;
-}
-
-.msg-rounded {
-    border-radius: 5px;
-}
-
-.msg-close {
-    padding-right: 10px;
-    padding-left: 10px;
-    font-weight: bold;
-    font-family: monospace;
-    font-size: large;
-	cursor: pointer;
-    height: 1em;
-}
-
-.msg-success {
-    background-color: #def2de;
-	color: green;
-	padding: 5px 1em 5px 0em;
-}
-
-.msg-success.msg-close {
-    color: green;
-}
-
-.msg-failure {
-    background-color: #f2dede;
-    color: red;
-	padding: 5px 1em 5px 0em;
-}
-
-.msg-failure .msg-close {
-    color: red;
-}
\ No newline at end of file
diff --git a/frontend/netopeer.scss b/frontend/netopeer.scss
new file mode 100644
index 0000000..3ede088
--- /dev/null
+++ b/frontend/netopeer.scss
@@ -0,0 +1,50 @@
+@import 'netopeer-common';
+
+#netopeer-header {
+    position: fixed;
+    width: 100%;
+	margin: -0.5em -1em 0em -1em;
+	padding-top: 1em;
+    background-color: #313747;
+    color: #FAFAFA;
+    display: block;
+}
+
+#netopeer-header h1 {
+	margin-left: 1em;
+}
+
+#netopeer-component {
+	margin: 0em -1em 0em -1em;
+}
+
+#mainnav {
+	with: 100%;
+	padding-left: 1em;
+}
+
+#mainnav a:visited,
+#mainnav a:link {
+	color: inherit;
+}
+
+#mainnav a:hover {
+    border-top-color: #3B4257;
+	background-color: #3B4257;
+}
+
+#mainnav a.active {
+    border-top-color: #BAE4F0;
+	background-color: #3B4257;
+}
+#mainnav a.active:hover {
+	cursor: default;
+}
+
+#mainnav a {
+	text-decoration: none;
+	display: inline-block;
+	padding: 0.5em 1em 0.5em 0.5em;
+	color: #FAFAFA;
+    border-top: 0.2em solid #313747;
+}
diff --git a/frontend/plugins/plugins.component.scss b/frontend/plugins/plugins.component.scss
new file mode 100644
index 0000000..12dd39c
--- /dev/null
+++ b/frontend/plugins/plugins.component.scss
@@ -0,0 +1 @@
+@import '../netopeer-common';
\ No newline at end of file
diff --git a/frontend/plugins/plugins.component.ts b/frontend/plugins/plugins.component.ts
index 43abb2d..41836c2 100644
--- a/frontend/plugins/plugins.component.ts
+++ b/frontend/plugins/plugins.component.ts
@@ -3,7 +3,7 @@
 @Component({
   selector : 'netopeer-plugins',
   templateUrl : './plugins.component.html',
-  styleUrls : ['../netopeer.css']
+  styleUrls : ['./plugins.component.scss']
 })
 
 export class PluginsComponent {
diff --git a/frontend/yang/yang.component.scss b/frontend/yang/yang.component.scss
new file mode 100644
index 0000000..12dd39c
--- /dev/null
+++ b/frontend/yang/yang.component.scss
@@ -0,0 +1 @@
+@import '../netopeer-common';
\ No newline at end of file
diff --git a/frontend/yang/yang.component.ts b/frontend/yang/yang.component.ts
index 4734d4c..de0fac9 100644
--- a/frontend/yang/yang.component.ts
+++ b/frontend/yang/yang.component.ts
@@ -3,7 +3,7 @@
 @Component({
   selector : 'netopeer-yang',
   templateUrl : './yang.component.html',
-  styleUrls : ['../netopeer.css']
+  styleUrls : ['./yang.component.scss']
 })
 
 export class YANGComponent {