From 527735a221a3e86857e1a63040734aadfa2dd1b5 Mon Sep 17 00:00:00 2001
From: liuzheng712 <liuzheng712@gmail.com>
Date: Fri, 29 Dec 2017 08:52:42 +0800
Subject: [PATCH] feat: interactive

---
 .angular-cli.json                             |   2 +-
 package-lock.json                             |  10 ++
 package.json                                  |   2 +
 .../control/control.component.html            |   2 +-
 src/app/app.component.css                     |   7 +
 src/app/app.component.html                    |   1 +
 src/app/app.module.ts                         |   6 +-
 .../interactive/interactive.component.html    |  15 ++
 .../interactive/interactive.component.scss    | 138 ++++++++++++++++++
 .../interactive/interactive.component.spec.ts |  25 ++++
 .../interactive/interactive.component.ts      |  15 ++
 src/styles.css                                |   1 +
 12 files changed, 220 insertions(+), 4 deletions(-)
 create mode 100644 src/app/elements/interactive/interactive.component.html
 create mode 100644 src/app/elements/interactive/interactive.component.scss
 create mode 100644 src/app/elements/interactive/interactive.component.spec.ts
 create mode 100644 src/app/elements/interactive/interactive.component.ts

diff --git a/.angular-cli.json b/.angular-cli.json
index e40ce29..7d00ced 100644
--- a/.angular-cli.json
+++ b/.angular-cli.json
@@ -75,7 +75,7 @@
     }
   },
   "defaults": {
-    "styleExt": "css",
+    "styleExt": "scss",
     "component": {}
   }
 }
diff --git a/package-lock.json b/package-lock.json
index b2f1031..2fdb413 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1662,6 +1662,11 @@
       "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
       "dev": true
     },
+    "compass-mixins": {
+      "version": "0.12.10",
+      "resolved": "https://registry.npmjs.org/compass-mixins/-/compass-mixins-0.12.10.tgz",
+      "integrity": "sha1-zZ8V+CnE6WDMQ7sibwSbKL65nUE="
+    },
     "component-bind": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
@@ -12619,6 +12624,11 @@
         }
       }
     },
+    "sass-math": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/sass-math/-/sass-math-1.0.0.tgz",
+      "integrity": "sha1-swsquBY52q5m9cNnvC2Fq0EecWk="
+    },
     "saucelabs": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz",
diff --git a/package.json b/package.json
index 0fc8a1c..2812e31 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
     "body-parser": "^1.18.2",
     "bootstrap": "^4.0.0-alpha.6",
     "clipboard": "^1.7.1",
+    "compass-mixins": "^0.12.10",
     "core-js": "^2.4.1",
     "directory-encoder": "^0.9.2",
     "filetree-css": "^1.0.0",
@@ -45,6 +46,7 @@
     "peity": "^3.2.1",
     "roboto-fontface": "^0.8.0",
     "rxjs": "^5.4.2",
+    "sass-math": "^1.0.0",
     "socket.io": "^2.0.3",
     "socket.io-client": "^2.0.4",
     "ssh-keygen": "^0.4.1",
diff --git a/src/app/ControlPage/control/control.component.html b/src/app/ControlPage/control/control.component.html
index c8dfedf..5c7096b 100644
--- a/src/app/ControlPage/control/control.component.html
+++ b/src/app/ControlPage/control/control.component.html
@@ -1,3 +1,3 @@
 <app-controlnav></app-controlnav>
 <app-ssh></app-ssh>
-<app-rdp></app-rdp>
+<!--<app-rdp></app-rdp>-->
diff --git a/src/app/app.component.css b/src/app/app.component.css
index 94d0659..aa2a3ea 100644
--- a/src/app/app.component.css
+++ b/src/app/app.component.css
@@ -20,3 +20,10 @@ nav {
   height: 30px;
   width: 100%;
 }
+
+app-element-interactive {
+  position: absolute;
+  display: inline-block;
+  bottom: 120px;
+  left: 100px;
+}
diff --git a/src/app/app.component.html b/src/app/app.component.html
index fae927b..1549caa 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -1,3 +1,4 @@
 <app-element-nav *ngIf="DataStore.NavShow"></app-element-nav>
 <nav *ngIf="DataStore.NavShow"></nav>
 <router-outlet></router-outlet>
+<app-element-interactive></app-element-interactive>
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index c9be16e..f90458c 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -18,13 +18,14 @@ import {HttpModule} from '@angular/http';
 import {AppRoutingModule} from './app-routing.module';
 
 import {AppComponent} from './app.component';
+// Elements
 import {ElementFooterComponent} from './elements/footer/footer.component';
 import {ElementTermComponent} from './elements/term/term.component';
-
-
+import {ElementInteractiveComponent} from './elements/interactive/interactive.component';
 import {ElementNavComponent} from './elements/nav/nav.component';
 import {LoginComponent} from './BasicPage/login/login.component';
 import {ElementPopupComponent} from './elements/popup/popup.component';
+// pages
 import {IleftbarComponent} from './IndexPage/ileftbar/ileftbar.component';
 import {SearchComponent, SearchFilter} from './ControlPage/search/search.component';
 import {CleftbarComponent} from './ControlPage/cleftbar/cleftbar.component';
@@ -59,6 +60,7 @@ import {WindowsComponent} from './monitor-page/windows/windows.component';
     ElementFooterComponent,
     ElementPopupComponent,
     ElementTermComponent,
+    ElementInteractiveComponent,
     LoginComponent,
     RdpComponent,
     SshComponent,
diff --git a/src/app/elements/interactive/interactive.component.html b/src/app/elements/interactive/interactive.component.html
new file mode 100644
index 0000000..ce115f9
--- /dev/null
+++ b/src/app/elements/interactive/interactive.component.html
@@ -0,0 +1,15 @@
+
+<div class="menu">
+  <input type="checkbox" href="#" class="menu-open" name="menu-open" id="menu-open"/>
+  <label class="menu-open-button" for="menu-open">
+    <span class="hamburger hamburger-1"></span>
+    <span class="hamburger hamburger-2"></span>
+    <span class="hamburger hamburger-3"></span>
+  </label>
+
+  <a href="#" class="menu-item"> <i class="fa fa-bar-chart"></i> </a>
+  <a href="#" class="menu-item"> <i class="fa fa-plus"></i> </a>
+  <a href="#" class="menu-item"> <i class="fa fa-heart"></i> </a>
+  <a href="#" class="menu-item"> <i class="fa fa-envelope"></i> </a>
+
+</div>
diff --git a/src/app/elements/interactive/interactive.component.scss b/src/app/elements/interactive/interactive.component.scss
new file mode 100644
index 0000000..257ff68
--- /dev/null
+++ b/src/app/elements/interactive/interactive.component.scss
@@ -0,0 +1,138 @@
+@import "~sass-math/math";
+//vars
+$fg: #ff4081;
+$bg: #3f51b5;
+$pi: pi();
+
+//config
+$menu-items: 5;
+$open-distance: 115px;
+$opening-angle: $pi - .2;
+
+%goo {
+  filter: url('#shadowed-goo');
+  // debug
+  //background:rgba(255,0,0,0.2);
+}
+
+%ball {
+  background: $fg;
+  border-radius: 100%;
+  width: 80px;
+  height: 80px;
+  margin-left: -40px;
+  position: absolute;
+  top: 20px;
+  color: white;
+  text-align: center;
+  line-height: 80px;
+  transform: translate3d(0, 0, 0);
+  transition: transform ease-out 200ms;
+}
+
+.menu-open {
+  display: none;
+}
+
+.menu-item {
+  @extend %ball;
+}
+
+.hamburger {
+  $width: 25px;
+  $height: 3px;
+  width: $width;
+  height: $height;
+  background: white;
+  display: block;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  margin-left: -$width/2;
+  margin-top: -$height/2;
+  transition: transform 200ms;
+}
+
+$hamburger-spacing: 8px;
+.hamburger-1 {
+  transform: translate3d(0, -$hamburger-spacing, 0);
+}
+
+.hamburger-2 {
+  transform: translate3d(0, 0, 0);
+}
+
+.hamburger-3 {
+  transform: translate3d(0, $hamburger-spacing, 0);
+}
+
+.menu-open:checked + .menu-open-button {
+  .hamburger-1 {
+    transform: translate3d(0, 0, 0) rotate(45deg);
+  }
+  .hamburger-2 {
+    transform: translate3d(0, 0, 0) scale(0.1, 1);
+  }
+  .hamburger-3 {
+    transform: translate3d(0, 0, 0) rotate(-45deg);
+  }
+}
+
+.menu {
+  @extend %goo;
+  $width: 380px;
+  $height: 250px;
+  position: absolute;
+  left: 50%;
+  margin-left: -$width/2;
+  padding-top: 20px;
+  padding-left: $width/2;
+  width: $width;
+  height: $height;
+  box-sizing: border-box;
+  font-size: 20px;
+  text-align: left;
+}
+
+.menu-item {
+  &:hover {
+    background: white;
+    color: $fg;
+  }
+  @for $i from 1 through $menu-items {
+    &:nth-child(#{$i+2}) {
+      transition-duration: 10ms+(60ms*($i));
+    }
+  }
+}
+
+.menu-open-button {
+  @extend %ball;
+  z-index: 2;
+  transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.275);
+  transition-duration: 400ms;
+  transform: scale(1.1, 1.1) translate3d(0, 0, 0);
+  cursor: pointer;
+}
+
+.menu-open-button:hover {
+  transform: scale(1.2, 1.2) translate3d(0, 0, 0);
+}
+
+.menu-open:checked + .menu-open-button {
+  transition-timing-function: linear;
+  transition-duration: 200ms;
+  transform: scale(0.8, 0.8) translate3d(0, 0, 0);
+}
+
+.menu-open:checked ~ .menu-item {
+  transition-timing-function: cubic-bezier(0.935, 0.000, 0.340, 1.330);
+  @for $i from 1 through $menu-items {
+    $angle: (($pi - $opening-angle)/2)+(($opening-angle/($menu-items - 1))*($i - 1)+($pi*0.43));
+
+    &:nth-child(#{$i+2}) {
+      transition-duration: 80ms+(80ms*$i);
+      transform: translate3d(sin($angle)*$open-distance, cos($angle)*$open-distance, 0);
+    }
+  }
+}
diff --git a/src/app/elements/interactive/interactive.component.spec.ts b/src/app/elements/interactive/interactive.component.spec.ts
new file mode 100644
index 0000000..dd9630f
--- /dev/null
+++ b/src/app/elements/interactive/interactive.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ElementInteractiveComponent } from './interactive.component';
+
+describe('ElementInteractiveComponent', () => {
+  let component: ElementInteractiveComponent;
+  let fixture: ComponentFixture<ElementInteractiveComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ ElementInteractiveComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ElementInteractiveComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/elements/interactive/interactive.component.ts b/src/app/elements/interactive/interactive.component.ts
new file mode 100644
index 0000000..5824fa7
--- /dev/null
+++ b/src/app/elements/interactive/interactive.component.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-element-interactive',
+  templateUrl: './interactive.component.html',
+  styleUrls: ['./interactive.component.scss']
+})
+export class ElementInteractiveComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+}
diff --git a/src/styles.css b/src/styles.css
index 47574f3..1b14333 100644
--- a/src/styles.css
+++ b/src/styles.css
@@ -15,6 +15,7 @@ body {
   height: 100%;
   width: 100%;
   background-color: rgb(243, 243, 244);
+  overflow-y: hidden;
 }
 
 app-root {
-- 
2.18.0