├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── angular.json ├── e2e ├── app.e2e-spec.ts ├── app.po.ts └── tsconfig.e2e.json ├── karma.conf.js ├── package-lock.json ├── package.json ├── protractor.conf.js ├── screenshot ├── dashboard.png ├── lock.png ├── login.png ├── notification.gif ├── panel.png ├── price.png ├── profile.png ├── register.png ├── settings.gif ├── sweetalert.gif └── table.png ├── src ├── app │ ├── app.component.css │ ├── app.component.html │ ├── app.component.ts │ ├── app.module.ts │ ├── app.routes.ts │ ├── dashboard │ │ ├── component │ │ │ ├── panels │ │ │ │ ├── panels.component.css │ │ │ │ ├── panels.component.html │ │ │ │ └── panels.component.ts │ │ │ ├── pricetable │ │ │ │ ├── pricetable.component.css │ │ │ │ ├── pricetable.component.html │ │ │ │ └── pricetable.component.ts │ │ │ └── wizard │ │ │ │ ├── wizard.component.css │ │ │ │ ├── wizard.component.html │ │ │ │ └── wizard.component.ts │ │ ├── home │ │ │ ├── home.component.css │ │ │ ├── home.component.html │ │ │ └── home.component.ts │ │ ├── notification │ │ │ ├── notification.component.css │ │ │ ├── notification.component.html │ │ │ └── notification.component.ts │ │ ├── profile │ │ │ ├── profile.component.css │ │ │ ├── profile.component.html │ │ │ └── profile.component.ts │ │ ├── root │ │ │ ├── root.component.css │ │ │ ├── root.component.html │ │ │ └── root.component.ts │ │ ├── settings │ │ │ ├── settings.component.css │ │ │ ├── settings.component.html │ │ │ └── settings.component.ts │ │ ├── sweetalert │ │ │ ├── sweetalert.component.css │ │ │ ├── sweetalert.component.html │ │ │ └── sweetalert.component.ts │ │ └── table │ │ │ ├── table.component.css │ │ │ ├── table.component.html │ │ │ └── table.component.ts │ ├── page │ │ ├── lock │ │ │ ├── lock.component.css │ │ │ ├── lock.component.html │ │ │ └── lock.component.ts │ │ ├── login │ │ │ ├── login.component.css │ │ │ ├── login.component.html │ │ │ └── login.component.ts │ │ └── register │ │ │ ├── register.component.css │ │ │ ├── register.component.html │ │ │ └── register.component.ts │ ├── services │ │ └── settings.service.ts │ ├── shared │ │ ├── figurecard │ │ │ ├── figurecard.component.css │ │ │ ├── figurecard.component.html │ │ │ └── figurecard.component.ts │ │ ├── footer │ │ │ ├── footer.component.css │ │ │ ├── footer.component.html │ │ │ └── footer.component.ts │ │ ├── header │ │ │ ├── header.component.css │ │ │ ├── header.component.html │ │ │ └── header.component.ts │ │ ├── imagecard │ │ │ ├── imagecard.component.css │ │ │ ├── imagecard.component.html │ │ │ └── imagecard.component.ts │ │ ├── msgiconbtn │ │ │ ├── msgiconbtn.component.css │ │ │ ├── msgiconbtn.component.html │ │ │ └── msgiconbtn.component.ts │ │ └── navbar │ │ │ ├── navbar.component.css │ │ │ ├── navbar.component.html │ │ │ └── navbar.component.ts │ └── sidebar │ │ ├── sidebar-routes.config.ts │ │ ├── sidebar.component.css │ │ ├── sidebar.component.html │ │ └── sidebar.component.ts ├── assets │ ├── img │ │ ├── angular2-logo.png │ │ ├── avatar.jpg │ │ ├── card-1.jpeg │ │ ├── card-2.jpeg │ │ ├── card-3.jpeg │ │ ├── lock_bg.jpg │ │ ├── login_bg.jpg │ │ ├── marc.jpg │ │ ├── register_bg.jpg │ │ ├── sidebar-1.jpg │ │ ├── sidebar-2.jpg │ │ ├── sidebar-3.jpg │ │ └── sidebar-4.jpg │ └── js │ │ └── bootstrap-notify.min.js ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── index.html ├── main.ts ├── polyfills.ts ├── styles.css ├── test.ts ├── tsconfig.app.json ├── tsconfig.spec.json └── typings.d.ts ├── tsconfig.json └── tslint.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /html 5 | /dist 6 | /tmp 7 | /out-tsc 8 | 9 | # dependencies 10 | /node_modules 11 | 12 | # IDEs and editors 13 | /.idea 14 | .project 15 | .classpath 16 | .c9/ 17 | *.launch 18 | .settings/ 19 | *.sublime-workspace 20 | 21 | # IDE - VSCode 22 | .vscode/* 23 | !.vscode/settings.json 24 | !.vscode/tasks.json 25 | !.vscode/launch.json 26 | !.vscode/extensions.json 27 | 28 | # misc 29 | /.sass-cache 30 | /connect.lock 31 | /coverage 32 | /libpeerconnection.log 33 | npm-debug.log 34 | testem.log 35 | /typings 36 | 37 | # e2e 38 | /e2e/*.js 39 | /e2e/*.map 40 | 41 | # System Files 42 | .DS_Store 43 | Thumbs.db 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Di Wang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Angular2 Material Dashboard Pro 2 | 3 | Material-design Dashboard 4 | 5 | ## How to run it 6 | 7 | **- please ensure you have installed angular cli, otherwise `npm install -g @angular/cli`** 8 | 9 | 1. git clone https://github.com/wangdicoder/angular-material-dashboard 10 | 2. cd angular-material-dashboard 11 | 3. npm install 12 | 4. ng serve -o (it will automatically open localhost:4200) 13 | 14 | ## Further Plan 15 | - [x] Add Wizard Component 16 | - [ ] Responsive Sidebar 17 | - [ ] Consolidate form elements, like switch 18 | 19 | ## Screenshot 20 | 21 | ### Dashboard 22 | 23 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/dashboard.png) 24 | 25 | ### Login 26 | 27 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/login.png) 28 | 29 | ### Register 30 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/register.png) 31 | 32 | ### Lock 33 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/lock.png) 34 | 35 | ### User Profile 36 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/profile.png) 37 | 38 | ### Sweet Alert 39 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/sweetalert.gif) 40 | 41 | ### Notification 42 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/notification.gif) 43 | 44 | ### Settings 45 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/settings.gif) 46 | 47 | ### Table 48 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/table.png) 49 | 50 | ### Price 51 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/price.png) 52 | 53 | ### Panels 54 | ![](https://github.com/wangdicoder/angular2-material-dashboard-pro/raw/master/screenshot/panel.png) 55 | 56 | ## Acknowledge 57 | 58 | - [Creative Tim](https://github.com/creativetimofficial) 59 | - [Sweet Alert 2](https://github.com/limonte/sweetalert2) 60 | - [Bootstrap Notify](http://bootstrap-notify.remabledesigns.com) 61 | 62 | ## License 63 | 64 | MIT 65 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "angular2-material-dashboard-pro": { 7 | "root": "", 8 | "sourceRoot": "src", 9 | "projectType": "application", 10 | "architect": { 11 | "build": { 12 | "builder": "@angular-devkit/build-angular:browser", 13 | "options": { 14 | "outputPath": "dist", 15 | "index": "src/index.html", 16 | "main": "src/main.ts", 17 | "tsConfig": "src/tsconfig.app.json", 18 | "polyfills": "src/polyfills.ts", 19 | "assets": [ 20 | "src/assets", 21 | "src/favicon.ico" 22 | ], 23 | "styles": [ 24 | "src/styles.css" 25 | ], 26 | "scripts": [] 27 | }, 28 | "configurations": { 29 | "production": { 30 | "optimization": true, 31 | "outputHashing": "all", 32 | "sourceMap": false, 33 | "extractCss": true, 34 | "namedChunks": false, 35 | "aot": true, 36 | "extractLicenses": true, 37 | "vendorChunk": false, 38 | "buildOptimizer": true, 39 | "fileReplacements": [ 40 | { 41 | "replace": "src/environments/environment.ts", 42 | "with": "src/environments/environment.prod.ts" 43 | } 44 | ] 45 | } 46 | } 47 | }, 48 | "serve": { 49 | "builder": "@angular-devkit/build-angular:dev-server", 50 | "options": { 51 | "browserTarget": "angular2-material-dashboard-pro:build" 52 | }, 53 | "configurations": { 54 | "production": { 55 | "browserTarget": "angular2-material-dashboard-pro:build:production" 56 | } 57 | } 58 | }, 59 | "extract-i18n": { 60 | "builder": "@angular-devkit/build-angular:extract-i18n", 61 | "options": { 62 | "browserTarget": "angular2-material-dashboard-pro:build" 63 | } 64 | }, 65 | "test": { 66 | "builder": "@angular-devkit/build-angular:karma", 67 | "options": { 68 | "main": "src/test.ts", 69 | "karmaConfig": "./karma.conf.js", 70 | "polyfills": "src/polyfills.ts", 71 | "tsConfig": "src/tsconfig.spec.json", 72 | "scripts": [], 73 | "styles": [ 74 | "src/styles.css" 75 | ], 76 | "assets": [ 77 | "src/assets", 78 | "src/favicon.ico" 79 | ] 80 | } 81 | }, 82 | "lint": { 83 | "builder": "@angular-devkit/build-angular:tslint", 84 | "options": { 85 | "tsConfig": [ 86 | "src/tsconfig.app.json", 87 | "src/tsconfig.spec.json" 88 | ], 89 | "exclude": [] 90 | } 91 | } 92 | } 93 | }, 94 | "angular2-material-dashboard-pro-e2e": { 95 | "root": "e2e", 96 | "sourceRoot": "e2e", 97 | "projectType": "application", 98 | "architect": { 99 | "e2e": { 100 | "builder": "@angular-devkit/build-angular:protractor", 101 | "options": { 102 | "protractorConfig": "./protractor.conf.js", 103 | "devServerTarget": "angular2-material-dashboard-pro:serve" 104 | } 105 | }, 106 | "lint": { 107 | "builder": "@angular-devkit/build-angular:tslint", 108 | "options": { 109 | "tsConfig": [ 110 | "e2e/tsconfig.e2e.json" 111 | ], 112 | "exclude": [] 113 | } 114 | } 115 | } 116 | } 117 | }, 118 | "defaultProject": "angular2-material-dashboard-pro", 119 | "schematics": { 120 | "@schematics/angular:component": { 121 | "prefix": "app", 122 | "styleext": "css" 123 | }, 124 | "@schematics/angular:directive": { 125 | "prefix": "app" 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /e2e/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Angular2MaterialDashboardProPage } from './app.po'; 2 | 3 | describe('angular2-material-dashboard-pro App', () => { 4 | let page: Angular2MaterialDashboardProPage; 5 | 6 | beforeEach(() => { 7 | page = new Angular2MaterialDashboardProPage(); 8 | }); 9 | 10 | it('should display message saying app works', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('app works!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /e2e/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class Angular2MaterialDashboardProPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "node" 10 | ] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/0.13/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client:{ 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | files: [ 19 | 20 | ], 21 | preprocessors: { 22 | 23 | }, 24 | mime: { 25 | 'text/x-typescript': ['ts','tsx'] 26 | }, 27 | coverageIstanbulReporter: { 28 | dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], 29 | fixWebpackSourcePaths: true 30 | }, 31 | 32 | reporters: config.angularCli && config.angularCli.codeCoverage 33 | ? ['progress', 'coverage-istanbul'] 34 | : ['progress', 'kjhtml'], 35 | port: 9876, 36 | colors: true, 37 | logLevel: config.LOG_INFO, 38 | autoWatch: true, 39 | browsers: ['Chrome'], 40 | singleRun: false 41 | }); 42 | }; 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular2-material-dashboard-pro", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "ng": "ng", 7 | "start": "ng serve", 8 | "build": "ng build", 9 | "test": "ng test", 10 | "lint": "ng lint", 11 | "e2e": "ng e2e" 12 | }, 13 | "private": true, 14 | "dependencies": { 15 | "@angular/animations": "~7.0.0", 16 | "@angular/cdk": "^7.0.2", 17 | "@angular/common": "~7.0.0", 18 | "@angular/compiler": "~7.0.0", 19 | "@angular/core": "~7.0.0", 20 | "@angular/forms": "~7.0.0", 21 | "@angular/http": "~7.0.0", 22 | "@angular/material": "^7.0.2", 23 | "@angular/platform-browser": "~7.0.0", 24 | "@angular/platform-browser-dynamic": "~7.0.0", 25 | "@angular/router": "~7.0.0", 26 | "core-js": "^2.5.4", 27 | "hammerjs": "^2.0.8", 28 | "rxjs": "~6.3.3", 29 | "zone.js": "~0.8.26" 30 | }, 31 | "devDependencies": { 32 | "@angular-devkit/build-angular": "~0.10.0", 33 | "@angular/cli": "~7.0.3", 34 | "@angular/compiler-cli": "~7.0.0", 35 | "@angular/language-service": "~7.0.0", 36 | "@types/node": "~8.9.4", 37 | "@types/jasmine": "~2.8.8", 38 | "@types/jasminewd2": "~2.0.3", 39 | "codelyzer": "~4.5.0", 40 | "jasmine-core": "~2.99.1", 41 | "jasmine-spec-reporter": "~4.2.1", 42 | "karma": "~3.0.0", 43 | "karma-chrome-launcher": "~2.2.0", 44 | "karma-coverage-istanbul-reporter": "~2.0.1", 45 | "karma-jasmine": "~1.1.2", 46 | "karma-jasmine-html-reporter": "^0.2.2", 47 | "protractor": "~5.4.0", 48 | "ts-node": "~7.0.0", 49 | "tslint": "~5.11.0", 50 | "typescript": "~3.1.1" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './e2e/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | onPrepare() { 23 | require('ts-node').register({ 24 | project: 'e2e/tsconfig.e2e.json' 25 | }); 26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /screenshot/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/dashboard.png -------------------------------------------------------------------------------- /screenshot/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/lock.png -------------------------------------------------------------------------------- /screenshot/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/login.png -------------------------------------------------------------------------------- /screenshot/notification.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/notification.gif -------------------------------------------------------------------------------- /screenshot/panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/panel.png -------------------------------------------------------------------------------- /screenshot/price.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/price.png -------------------------------------------------------------------------------- /screenshot/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/profile.png -------------------------------------------------------------------------------- /screenshot/register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/register.png -------------------------------------------------------------------------------- /screenshot/settings.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/settings.gif -------------------------------------------------------------------------------- /screenshot/sweetalert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/sweetalert.gif -------------------------------------------------------------------------------- /screenshot/table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/table.png -------------------------------------------------------------------------------- /src/app/app.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/app/app.component.css -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.css'] 7 | }) 8 | export class AppComponent { 9 | title = 'app works!'; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { HttpModule } from '@angular/http'; 5 | import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 6 | import { routing } from './app.routes'; 7 | import { MatButtonModule, MatRadioModule, MatInputModule, MatMenuModule, MatCheckboxModule } from '@angular/material'; 8 | 9 | import { AppComponent } from './app.component'; 10 | import { SidebarComponent } from './sidebar/sidebar.component'; 11 | import { HomeComponent } from './dashboard/home/home.component'; 12 | import { ProfileComponent } from './dashboard/profile/profile.component'; 13 | import 'hammerjs'; 14 | import { NavbarComponent } from './shared/navbar/navbar.component'; 15 | import { FigurecardComponent } from './shared/figurecard/figurecard.component'; 16 | import { ImagecardComponent } from './shared/imagecard/imagecard.component'; 17 | import { TableComponent } from './dashboard/table/table.component'; 18 | import { NotificationComponent } from './dashboard/notification/notification.component'; 19 | import { MsgIconBtnComponent } from './shared/msgiconbtn/msgiconbtn.component'; 20 | import { SweetAlertComponent } from './dashboard/sweetalert/sweetalert.component'; 21 | import { LoginComponent } from './page/login/login.component'; 22 | import { RootComponent } from './dashboard/root/root.component'; 23 | import { RegisterComponent } from './page/register/register.component'; 24 | import { LockComponent } from './page/lock/lock.component'; 25 | import { HeaderComponent } from './shared/header/header.component'; 26 | import { FooterComponent } from './shared/footer/footer.component'; 27 | import { SettingsComponent } from './dashboard/settings/settings.component'; 28 | import { PriceTableComponent } from './dashboard/component/pricetable/pricetable.component'; 29 | import { PanelsComponent } from './dashboard/component/panels/panels.component'; 30 | 31 | import { SettingsService } from './services/settings.service'; 32 | import { WizardComponent } from './dashboard/component/wizard/wizard.component'; 33 | 34 | @NgModule({ 35 | declarations: [ 36 | AppComponent, 37 | SidebarComponent, 38 | HomeComponent, 39 | ProfileComponent, 40 | NavbarComponent, 41 | FigurecardComponent, 42 | ImagecardComponent, 43 | TableComponent, 44 | NotificationComponent, 45 | MsgIconBtnComponent, 46 | SweetAlertComponent, 47 | LoginComponent, 48 | RootComponent, 49 | RegisterComponent, 50 | LockComponent, 51 | HeaderComponent, 52 | FooterComponent, 53 | SettingsComponent, 54 | PriceTableComponent, 55 | PanelsComponent, 56 | WizardComponent 57 | ], 58 | imports: [ 59 | BrowserModule, 60 | FormsModule, 61 | HttpModule, 62 | routing, 63 | BrowserAnimationsModule, 64 | MatButtonModule, 65 | MatRadioModule, 66 | MatInputModule, 67 | MatMenuModule, 68 | MatCheckboxModule 69 | ], 70 | providers: [SettingsService], 71 | bootstrap: [AppComponent] 72 | }) 73 | export class AppModule { } 74 | -------------------------------------------------------------------------------- /src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by wangdi on 26/5/17. 3 | */ 4 | import { RouterModule, Routes } from '@angular/router'; 5 | import { HomeComponent } from './dashboard/home/home.component'; 6 | import { ProfileComponent } from './dashboard/profile/profile.component'; 7 | import { TableComponent } from './dashboard/table/table.component'; 8 | import { NotificationComponent } from './dashboard/notification/notification.component'; 9 | import { SweetAlertComponent } from './dashboard/sweetalert/sweetalert.component'; 10 | import { SettingsComponent } from './dashboard/settings/settings.component'; 11 | import { PriceTableComponent } from './dashboard/component/pricetable/pricetable.component'; 12 | import { PanelsComponent} from './dashboard/component/panels/panels.component'; 13 | import { WizardComponent } from './dashboard/component/wizard/wizard.component'; 14 | 15 | import { RootComponent } from './dashboard/root/root.component'; 16 | import { LoginComponent } from './page/login/login.component'; 17 | import { LockComponent } from './page/lock/lock.component'; 18 | import { RegisterComponent } from './page/register/register.component'; 19 | 20 | const routes: Routes = [ 21 | {path: '', component: LoginComponent}, 22 | {path: 'lock', component: LockComponent}, 23 | {path: 'register', component: RegisterComponent}, 24 | {path: 'dashboard', component: RootComponent, children: [ 25 | {path: '', component: HomeComponent}, 26 | {path: 'profile', component: ProfileComponent}, 27 | {path: 'table', component: TableComponent}, 28 | {path: 'notification', component: NotificationComponent}, 29 | {path: 'alert', component: SweetAlertComponent}, 30 | {path: 'settings', component: SettingsComponent}, 31 | {path: 'components/price-table', component: PriceTableComponent}, 32 | {path: 'components/panels', component: PanelsComponent}, 33 | {path: 'components/wizard', component: WizardComponent} 34 | ]} 35 | ]; 36 | 37 | export const routing = RouterModule.forRoot(routes); 38 | 39 | -------------------------------------------------------------------------------- /src/app/dashboard/component/panels/panels.component.css: -------------------------------------------------------------------------------- 1 | .card{ 2 | padding: 20px 20px 15px 20px; 3 | } 4 | 5 | .card small{ 6 | font-weight: 300; 7 | } 8 | 9 | .h-tab{ 10 | margin-top: 35px; 11 | } 12 | 13 | .tab-content{ 14 | display: none; 15 | } 16 | 17 | .h-tab .tab-link.active{ 18 | background-color: #ff9800 !important; 19 | color: #FFF !important; 20 | box-shadow: 0 14px 26px -12px rgba(255, 152, 0, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(255, 152, 0, 0.2) !important; 21 | } 22 | 23 | .v-tab .tab-link.active{ 24 | background-color: #00bcd4 !important; 25 | color: #FFF !important; 26 | box-shadow: 0 14px 26px -12px rgba(0, 188, 212, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 188, 212, 0.2) !important; 27 | } 28 | 29 | .v-tab .tab-link{ 30 | margin-bottom: 10px; 31 | } 32 | 33 | .h-tab .tab-link, .v-tab .tab-link{ 34 | box-shadow: none !important; 35 | background-color: transparent !important; 36 | color: #555 !important; 37 | } 38 | 39 | .h-tab .tab-link:hover, .v-tab .tab-link:hover{ 40 | background-color: rgba(200, 200, 200, 0.2) !important; 41 | } 42 | 43 | .h-tab .tab-link.active:hover{ 44 | background-color: #ff9800 !important; 45 | } 46 | 47 | .v-tab .tab-link.active:hover{ 48 | background-color: #00bcd4 !important; 49 | } 50 | 51 | .h-tab .tab-content{ 52 | padding-top: 20px; 53 | } 54 | -------------------------------------------------------------------------------- /src/app/dashboard/component/panels/panels.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |

Navigation Pills - Horizontal Tabs

7 |
8 |
9 | 10 | 11 | 12 |
13 |
14 | Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.

15 | Dramatically visualize customer directed convergence without revolutionary ROI. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.

16 | This is very nice. 17 |
18 |
19 | Efficiently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas.

20 | Dramatically maintain clicks-and-mortar solutions without functional solutions. 21 |
22 |
23 | Completely synergize resource taxing relationships via premier niche markets. Professionally cultivate one-to-one customer service with robust ideas.

24 | Dynamically innovate resource-leveling customer service for state of the art customer service. 25 |
26 |
27 |
28 |
29 |
30 |
31 |

Navigation Pills - Vertical Tabs

32 |
33 |
34 | 35 | 36 | 37 |
38 |
39 |
40 | Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.

41 | Dramatically visualize customer directed convergence without revolutionary ROI. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.

42 | This is very nice. 43 |
44 |
45 | Efficiently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas.

46 | Dramatically maintain clicks-and-mortar solutions without functional solutions. 47 |
48 |
49 | Completely synergize resource taxing relationships via premier niche markets. Professionally cultivate one-to-one customer service with robust ideas.

50 | Dynamically innovate resource-leveling customer service for state of the art customer service. 51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | -------------------------------------------------------------------------------- /src/app/dashboard/component/panels/panels.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, AfterViewInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-panels', 5 | templateUrl: './panels.component.html', 6 | styleUrls: ['./panels.component.css'] 7 | }) 8 | export class PanelsComponent implements OnInit, AfterViewInit { 9 | constructor() { 10 | } 11 | 12 | ngOnInit() { 13 | } 14 | ngAfterViewInit() { 15 | const activeTabs = document.getElementsByClassName('default-active'); 16 | for (let i = 0; i < activeTabs.length; i++) { 17 | (activeTabs[i]).click(); 18 | } 19 | } 20 | 21 | tabClick(evt, id) { 22 | const tabcontents = document.querySelectorAll('.h-tab .tab-content'); 23 | for (let i = 0; i < tabcontents.length; i++) { 24 | (tabcontents[i]).style.display = 'none'; 25 | } 26 | const tablinks = document.querySelectorAll('.h-tab .tab-link'); 27 | for (let i = 0; i < tablinks.length; i++) { 28 | const tablink = tablinks[i]; 29 | tablink.className = tablink.className.replace(' active', ''); 30 | } 31 | document.getElementById(id).style.display = 'block'; 32 | evt.currentTarget.className += ' active'; 33 | } 34 | vTabClick(evt, id) { 35 | const tabcontents = document.querySelectorAll('.v-tab .tab-content'); 36 | for (let i = 0; i < tabcontents.length; i++) { 37 | (tabcontents[i]).style.display = 'none'; 38 | } 39 | const tablinks = document.querySelectorAll('.v-tab .tab-link'); 40 | for (let i = 0; i < tablinks.length; i++) { 41 | const tablink = tablinks[i]; 42 | tablink.className = tablink.className.replace(' active', ''); 43 | } 44 | document.getElementById(id).style.display = 'block'; 45 | evt.currentTarget.className += ' active'; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/app/dashboard/component/pricetable/pricetable.component.css: -------------------------------------------------------------------------------- 1 | .card{ 2 | padding: 25px 20px 20px 20px; 3 | display: flex; 4 | flex-direction: column; 5 | align-items: center; 6 | } 7 | 8 | .card h6, p { 9 | color: #999; 10 | } 11 | 12 | .icon{ 13 | margin-top: 20px; 14 | width: 130px; 15 | height: 130px; 16 | border: 1px solid #e5e5e5; 17 | border-radius: 50%; 18 | display: flex; 19 | justify-content: center; 20 | align-items: center; 21 | } 22 | 23 | .icon i{ 24 | font-size: 55px; 25 | color: #e91e63; 26 | } 27 | 28 | .card-title{ 29 | margin-top: 30px; 30 | margin-bottom: 3px; 31 | } 32 | 33 | .card-description{ 34 | margin-bottom: 20px; 35 | } 36 | -------------------------------------------------------------------------------- /src/app/dashboard/component/pricetable/pricetable.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 |
8 |
Individual
9 |
10 | person 11 |
12 |

Free

13 |

14 | This is good if your company size is between 2 and 10 Persons. 15 |

16 | 17 |
18 |
19 |
20 |
21 |
Small Company
22 |
23 | weekend 24 |
25 |

$29 / m

26 |

27 | This is good if your company size is between 2 and 10 Persons. 28 |

29 | 30 |
31 |
32 |
33 |
34 |
Enterprise
35 |
36 | home 37 |
38 |

$79 / m

39 |

40 | This is good if your company size is between 2 and 10 Persons. 41 |

42 | 43 |
44 |
45 |
46 |
47 |
48 |
49 | -------------------------------------------------------------------------------- /src/app/dashboard/component/pricetable/pricetable.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-pricetable', 5 | templateUrl: './pricetable.component.html', 6 | styleUrls: ['./pricetable.component.css'] 7 | }) 8 | export class PriceTableComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/dashboard/component/wizard/wizard.component.css: -------------------------------------------------------------------------------- 1 | .wizard-panel{ 2 | 3 | } 4 | 5 | .wizard-header{ 6 | padding: 25px 0 35px; 7 | } 8 | 9 | .wizard-navigation{ 10 | position: relative; 11 | } 12 | 13 | .nav-pills{ 14 | background-color: rgba(200, 200, 200, 0.2); 15 | width: 100%; 16 | } 17 | 18 | .nav-pills li{ 19 | width: 33.3333%; 20 | float: left; 21 | margin-left: 0; 22 | font-size: 12px; 23 | font-weight: 500; 24 | min-width: 100px; 25 | color: #555; 26 | padding: 10px 0; 27 | } 28 | 29 | .move-tab{ 30 | position: absolute; 31 | background-color: #f44336; 32 | box-shadow: 0 16px 26px -10px rgba(244, 67, 54, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2); 33 | font-weight: 500; 34 | border-radius: 4px; 35 | color: #fff; 36 | top: -2px; 37 | left: -1vw; 38 | width: calc((100% - 260px) / 2); 39 | height: 114%; 40 | display: flex; 41 | justify-content: center; 42 | align-items: center; 43 | transition: all 500ms cubic-bezier(0.29, 1.42, 0.79, 1); 44 | } 45 | 46 | .wizard-body{ 47 | min-height: 350px; 48 | padding: 15px; 49 | } 50 | 51 | .wizard-footer{ 52 | display: flex; 53 | padding: 10px; 54 | justify-content: space-between; 55 | } 56 | -------------------------------------------------------------------------------- /src/app/dashboard/component/wizard/wizard.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 |

Build Your Profile

8 |
This information will let us know more about you.
9 |
10 |
11 | 16 |
About
17 |
18 |
19 |
20 | tab 1 21 |
22 |
23 | tab 2 24 |
25 |
26 | tab 3 27 |
28 |
29 | 33 |
34 |
35 |
36 |
37 | -------------------------------------------------------------------------------- /src/app/dashboard/component/wizard/wizard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, AfterViewInit } from '@angular/core'; 2 | declare const $: any; 3 | 4 | @Component({ 5 | selector: 'app-wizard', 6 | templateUrl: './wizard.component.html', 7 | styleUrls: ['./wizard.component.css'] 8 | }) 9 | export class WizardComponent implements OnInit, AfterViewInit { 10 | tabIndex = 0; 11 | constructor() { } 12 | 13 | ngOnInit() { 14 | } 15 | ngAfterViewInit() { 16 | const preBtn = document.getElementById('preBtn'); 17 | const moveTab = document.querySelector('.move-tab'); 18 | preBtn.style.visibility = 'hidden'; 19 | // to ensure moveTab can stay correct position 20 | $(window).resize(() => { 21 | const screenWidth = document.body.clientWidth; 22 | if (screenWidth > 990) { 23 | moveTab.style.width = 'calc((100% - 260px) / 2)'; 24 | if (this.tabIndex === 1) { 25 | moveTab.style.left = '20vw'; 26 | } else if (this.tabIndex === 2) { 27 | moveTab.style.left = '42vw'; 28 | } 29 | } else { 30 | moveTab.style.width = '34%'; 31 | if (this.tabIndex === 1) { 32 | moveTab.style.left = '30vw'; 33 | } else if (this.tabIndex === 2) { 34 | moveTab.style.left = '61.5vw'; 35 | } 36 | } 37 | }); 38 | const tabs = document.getElementsByClassName('wizard-tab'); 39 | for (let i = 1; i < tabs.length; i++) { 40 | (tabs[i]).style.display = 'none'; 41 | } 42 | } 43 | 44 | preOnClick() { 45 | const moveTab = document.querySelector('.move-tab'); 46 | const nextBtn = document.getElementById('nextBtn'); 47 | const preBtn = document.getElementById('preBtn'); 48 | const tabs = document.getElementsByClassName('wizard-tab'); 49 | const screenWidth = document.body.clientWidth; 50 | for (let i = 0; i < tabs.length; i++) { 51 | (tabs[i]).style.display = 'none'; 52 | } 53 | if (this.tabIndex === 2) { 54 | this.tabIndex--; 55 | moveTab.style.left = screenWidth > 990 ? '20vw' : '30vw'; 56 | nextBtn.style.visibility = 'visible'; 57 | moveTab.innerHTML = 'Account'; 58 | }else if (this.tabIndex === 1) { 59 | this.tabIndex--; 60 | moveTab.style.left = '-1vw'; 61 | preBtn.style.visibility = 'hidden'; 62 | moveTab.innerHTML = 'About'; 63 | } 64 | (tabs[this.tabIndex]).style.display = 'inherit'; 65 | } 66 | 67 | nextOnClick() { 68 | const moveTab = document.querySelector('.move-tab'); 69 | const nextBtn = document.getElementById('nextBtn'); 70 | const preBtn = document.getElementById('preBtn'); 71 | const tabs = document.getElementsByClassName('wizard-tab'); 72 | const screenWidth = document.body.clientWidth; 73 | for (let i = 0; i < tabs.length; i++) { 74 | (tabs[i]).style.display = 'none'; 75 | } 76 | if (this.tabIndex === 0) { 77 | this.tabIndex++; 78 | moveTab.style.left = screenWidth > 990 ? '20vw' : '30vw'; 79 | preBtn.style.visibility = 'visible'; 80 | moveTab.innerHTML = 'Account'; 81 | }else if (this.tabIndex === 1) { 82 | this.tabIndex++; 83 | moveTab.style.left = screenWidth > 990 ? '42vw' : '61.5vw'; 84 | nextBtn.style.visibility = 'hidden'; 85 | moveTab.innerHTML = 'Address'; 86 | } 87 | (tabs[this.tabIndex]).style.display = 'inherit'; 88 | } 89 | 90 | } 91 | -------------------------------------------------------------------------------- /src/app/dashboard/home/home.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/app/dashboard/home/home.component.css -------------------------------------------------------------------------------- /src/app/dashboard/home/home.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 13 | 14 |
15 |
16 | 24 | 25 |
26 |
27 | 35 | 36 |
37 |
38 | 46 | 47 |
48 |
49 |
50 |
51 | 57 | 58 |
59 |
60 | 66 | 67 |
68 |
69 | 75 | 76 |
77 |
78 | 79 | 80 |
81 | -------------------------------------------------------------------------------- /src/app/dashboard/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: './home.component.html', 6 | styleUrls: ['./home.component.css'] 7 | }) 8 | export class HomeComponent implements OnInit { 9 | constructor() { 10 | } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/dashboard/notification/notification.component.css: -------------------------------------------------------------------------------- 1 | .notification-card{ 2 | padding: 23px 20px 18px 20px; 3 | } 4 | 5 | .notification-card h4{ 6 | margin-bottom: 15px; 7 | } 8 | 9 | .place{ 10 | padding: 20px; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/dashboard/notification/notification.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |

Notifications

5 |
6 |
7 |

Handcrafted by our friend Robert McIntosh. Please checkout the full documentation.

8 |
9 |
10 |
11 |
12 |

Notifications Style

13 |
14 | This is a plain notification 15 |
16 |
17 | 18 | This is a plain notification 19 |
20 |
21 | notifications 22 | 23 | This is a notification with close button and icon and have many lines. You can see that the icon and the close button are always vertically aligned. This is a beautiful notification. So you don't have to worry about the style. 24 |
25 |
26 | notifications 27 | 28 | This is a notification with close button and icon and have many lines. You can see that the icon and the close button are always vertically aligned. This is a beautiful notification. So you don't have to worry about the style. 29 |
30 |
31 |
32 |
33 |
34 |

Notification States

35 |
36 | 37 | INFO - This is a regular notification made with ".alert-info" 38 |
39 |
40 | 41 | SUCCESS - This is a regular notification made with ".alert-success" 42 |
43 |
44 | 45 | WARNING - This is a regular notification made with ".alert-warning" 46 |
47 |
48 | 49 | DANGER - This is a regular notification made with ".alert-danger" 50 |
51 |
52 | 53 | PRIMARY - This is a regular notification made with ".alert-primary" 54 |
55 |
56 | 57 | ROSE - This is a regular notification made with ".alert-rose" 58 |
59 |
60 |
61 |
62 |
63 |
64 |

Notifications Places

65 |

Click to view notifications

66 |
67 |
68 |
69 | 70 |
71 |
72 | 73 |
74 |
75 | 76 |
77 |
78 |
79 |
80 |
81 |
82 | 83 |
84 |
85 | 86 |
87 |
88 | 89 |
90 |
91 |
92 |
93 |
94 |
95 | -------------------------------------------------------------------------------- /src/app/dashboard/notification/notification.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit} from '@angular/core'; 2 | declare const $: any; 3 | 4 | @Component({ 5 | selector: 'app-notification', 6 | templateUrl: './notification.component.html', 7 | styleUrls: ['./notification.component.css'] 8 | }) 9 | export class NotificationComponent implements OnInit { 10 | 11 | constructor() { 12 | } 13 | 14 | ngOnInit() { 15 | } 16 | 17 | btnClick(position) { 18 | let from = 'top'; 19 | let align = 'right'; 20 | let type = 'info'; 21 | switch (position) { 22 | case 'top-left': 23 | align = 'left'; 24 | type = 'rose'; 25 | break; 26 | case 'top-center': 27 | align = 'center'; 28 | type = 'success'; 29 | break; 30 | case 'bottom-left': 31 | align = 'left'; 32 | from = 'bottom'; 33 | type = 'primary'; 34 | break; 35 | case 'bottom-center': 36 | align = 'center'; 37 | from = 'bottom'; 38 | type = 'warning'; 39 | break; 40 | case 'bottom-right': 41 | from = 'bottom'; 42 | type = 'danger'; 43 | break; 44 | } 45 | $.notify({ 46 | message: 'Welcome to MATERIAL DASHBOARD - a beautiful dashboard for every web developer.', 47 | }, { 48 | placement: {from, align}, 49 | offset: {x: 20, y: 35}, 50 | type, 51 | template: `
52 | notifications 53 | 54 | {2} 55 |
` 56 | }); 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/app/dashboard/profile/profile.component.css: -------------------------------------------------------------------------------- 1 | .right-profile{ 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | padding: 25px; 6 | position: relative; 7 | /*margin-top: 60px;*/ 8 | } 9 | 10 | .profile{ 11 | position: absolute; 12 | top: -40px; 13 | } 14 | 15 | .profile img{ 16 | border-radius: 50%; 17 | width: 130px; 18 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); 19 | } 20 | 21 | .right-profile h6{ 22 | margin-top: 100px; 23 | margin-bottom: 8px; 24 | color: #999; 25 | } 26 | 27 | .right-profile h4{ 28 | margin-bottom: 5px; 29 | } 30 | 31 | .right-profile p{ 32 | color: #999; 33 | } 34 | 35 | .right-profile button { 36 | margin-top: 15px; 37 | } 38 | 39 | .card{ 40 | display: flex; 41 | flex-direction: column; 42 | padding: 20px; 43 | position: relative; 44 | margin-top: 40px; 45 | } 46 | 47 | .card-header { 48 | position: absolute; 49 | text-align: center; 50 | background: linear-gradient(60deg, #ec407a, #d81b60); 51 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4); 52 | /*margin: -20px 15px 0;*/ 53 | border-radius: 3px; 54 | padding: 15px; 55 | top: -23px; 56 | } 57 | 58 | .card-header i { 59 | font-size: 24px; 60 | width: 33px; 61 | height: 33px; 62 | line-height: 33px; 63 | color: #fff; 64 | } 65 | 66 | .card-content{ 67 | position: relative; 68 | } 69 | 70 | .card-title{ 71 | padding-left: 80px; 72 | } 73 | 74 | .mat-input-container{ 75 | width: 100%; 76 | } 77 | 78 | .category{ 79 | font-weight: 300; 80 | } 81 | 82 | form{ 83 | margin-top: 30px; 84 | } 85 | 86 | .row{ 87 | margin-top: 15px; 88 | } 89 | 90 | .mat-input-container textarea{ 91 | height: 90px; 92 | } 93 | 94 | .textarea-label{ 95 | color: #aaa; 96 | margin-bottom: 10px; 97 | } 98 | 99 | .action-btn{ 100 | display: flex; 101 | justify-content: flex-end; 102 | padding-right: 15px; 103 | } 104 | -------------------------------------------------------------------------------- /src/app/dashboard/profile/profile.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 | perm_identity 8 |
9 |
10 |

Edit Profile - 11 | Complete your profile 12 |

13 |
14 |
15 |
16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 | 29 | 30 | 31 |
32 |
33 |
34 |
35 | 36 | 37 | 38 |
39 |
40 | 41 | 42 | 43 |
44 |
45 | 46 | 47 | 48 |
49 |
50 |
51 |
52 | 53 | 54 | 55 | 56 |
57 |
58 |
59 | 60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | profile 69 |
70 |
CEO / CO-FOUNDER
71 |

{{ firstName }} {{ lastName }}

72 |

Don't be scared of the truth because we need to restart the human foundation in truth And I love you like 73 | Kanye loves Kanye I love Rick Owens’ bed design but the back is...

74 | 75 |
76 |
77 |
78 |
79 | -------------------------------------------------------------------------------- /src/app/dashboard/profile/profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-profile', 5 | templateUrl: './profile.component.html', 6 | styleUrls: ['./profile.component.css'] 7 | }) 8 | export class ProfileComponent implements OnInit { 9 | firstName: string; 10 | lastName: string; 11 | constructor() { } 12 | 13 | ngOnInit() { 14 | this.firstName = 'Alec'; 15 | this.lastName = 'Thompson'; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/app/dashboard/root/root.component.css: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | position: relative; 3 | top: 0; 4 | height: 100vh; 5 | display: flex; 6 | width: 100%; 7 | flex: 1; 8 | } 9 | 10 | .sidebar-panel{ 11 | width: 260px; 12 | position: fixed; 13 | height: 100%; 14 | /*background-color: #D80B0B;*/ 15 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); 16 | -webkit-transition: all 500ms; 17 | -moz-transition: all 500ms; 18 | -ms-transition: all 500ms; 19 | -o-transition: all 500ms; 20 | transition: all 500ms; 21 | } 22 | 23 | .main-panel{ 24 | width: 100%; 25 | flex: 1; 26 | padding-left: 260px; 27 | } 28 | 29 | .sidebar-background{ 30 | position: absolute; 31 | z-index: 0; 32 | height: 100%; 33 | width: 100%; 34 | display: block; 35 | top: 0; 36 | left: 0; 37 | background-size: cover; 38 | background-position: center center; 39 | opacity: 0.2; 40 | filter: alpha(opacity=10); 41 | -webkit-transition: all 500ms; 42 | -moz-transition: all 500ms; 43 | -ms-transition: all 500ms; 44 | -o-transition: all 500ms; 45 | transition: all 500ms; 46 | } 47 | 48 | -------------------------------------------------------------------------------- /src/app/dashboard/root/root.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 |
8 | 9 |
10 |
11 | -------------------------------------------------------------------------------- /src/app/dashboard/root/root.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, OnDestroy } from '@angular/core'; 2 | import { SettingsService } from '../../services/settings.service'; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | templateUrl: './root.component.html', 7 | styleUrls: ['./root.component.css'] 8 | }) 9 | export class RootComponent implements OnInit, OnDestroy { 10 | public id: number; 11 | public backgroundColor: string; 12 | constructor(public settingService: SettingsService) { 13 | this.id = settingService.getSidebarImageIndex() + 1; 14 | this.backgroundColor = settingService.getSidebarColor(); 15 | } 16 | 17 | ngOnInit() { 18 | this.settingService.sidebarImageIndexUpdate.subscribe((id: number) => { 19 | this.id = id + 1; 20 | }); 21 | this.settingService.sidebarColorUpdate.subscribe((color: string) => { 22 | this.backgroundColor = color; 23 | }); 24 | } 25 | 26 | ngOnDestroy() { 27 | this.settingService.sidebarImageIndexUpdate.unsubscribe(); 28 | this.settingService.sidebarColorUpdate.unsubscribe(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/app/dashboard/settings/settings.component.css: -------------------------------------------------------------------------------- 1 | .sidebar-btn{ 2 | background-color: transparent; 3 | border: none; 4 | outline: none; 5 | } 6 | 7 | .sidebar-img{ 8 | max-width: 100%; 9 | border-radius: 10px; 10 | margin-top: 10px; 11 | cursor: pointer; 12 | -webkit-transition: all 400ms; 13 | -moz-transition: all 400ms; 14 | -ms-transition: all 400ms; 15 | -o-transition: all 400ms; 16 | transition: all 400ms; 17 | border: 4px solid transparent; 18 | } 19 | 20 | .btn-hover:hover{ 21 | border-color: rgba(0, 187, 255, 0.5); 22 | -webkit-transition: all 400ms; 23 | -moz-transition: all 400ms; 24 | -ms-transition: all 400ms; 25 | -o-transition: all 400ms; 26 | transition: all 400ms; 27 | } 28 | 29 | .active{ 30 | border-color: #00bbff; 31 | } 32 | 33 | .dot-row{ 34 | display: flex; 35 | justify-content: center; 36 | margin: 20px 0 40px 0; 37 | } 38 | 39 | .dot{ 40 | border: 3px solid transparent; 41 | border-radius: 50%; 42 | width: 23px; 43 | height: 23px; 44 | margin: 0 10px; 45 | cursor: pointer; 46 | } 47 | 48 | .purple{ 49 | background-color: #9c27b0; 50 | } 51 | 52 | .blue{ 53 | background-color: #00bcd4; 54 | } 55 | 56 | .dodgerblue{ 57 | background-color: dodgerblue; 58 | } 59 | 60 | .green{ 61 | background-color: #4caf50; 62 | } 63 | 64 | .orange{ 65 | background-color: #ff9800; 66 | } 67 | 68 | .red{ 69 | background-color: #f44336; 70 | } 71 | 72 | .white{ 73 | background-color: rgba(200, 200, 200, 0.2); 74 | } 75 | 76 | .rose{ 77 | background-color: #e91e63; 78 | } 79 | 80 | .black{ 81 | background-color: #000; 82 | } 83 | -------------------------------------------------------------------------------- /src/app/dashboard/settings/settings.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |

Sidebar Filters

6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | 17 |
18 |

Sidebar Background

19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | 27 |
28 |

SideBar Background Image

29 |
30 | sidebar-bg 31 |
32 |
33 | sidebar-bg 34 |
35 |
36 | sidebar-bg 37 |
38 |
39 | sidebar-bg 40 |
41 |
42 |
43 |
44 | -------------------------------------------------------------------------------- /src/app/dashboard/settings/settings.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { SettingsService } from '../../services/settings.service'; 3 | 4 | @Component({ 5 | selector: 'app-settings', 6 | templateUrl: './settings.component.html', 7 | styleUrls: ['./settings.component.css'] 8 | }) 9 | export class SettingsComponent implements OnInit { 10 | 11 | constructor(public settingService: SettingsService) { } 12 | 13 | ngOnInit() { 14 | const defaultId = this.settingService.getSidebarImageIndex(); 15 | const sidebarImgs: HTMLCollection = document.getElementsByClassName('sidebar-img'); 16 | sidebarImgs[defaultId].className = sidebarImgs[defaultId].className + ' active'; 17 | } 18 | 19 | bgChooseClick(id) { 20 | this.settingService.setSidebarImageIndex(id); 21 | const sidebarImgs: HTMLCollection = document.getElementsByClassName('sidebar-img'); 22 | for (let i = 0; i < sidebarImgs.length; i++) { 23 | sidebarImgs[i].className = sidebarImgs[i].className.replace(' active', ''); 24 | } 25 | sidebarImgs[id].className = sidebarImgs[id].className + ' active'; 26 | } 27 | 28 | filterChooseClick(color) { 29 | this.settingService.setSidebarFilter(color); 30 | } 31 | 32 | bgColorChooseClick(color) { 33 | this.settingService.setSidebarColor(color); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/dashboard/sweetalert/sweetalert.component.css: -------------------------------------------------------------------------------- 1 | .card{ 2 | display: flex; 3 | flex-direction: column; 4 | padding: 25px 20px 22px 20px; 5 | align-items: center; 6 | margin-top: 30px; 7 | } 8 | 9 | .card h5{ 10 | margin-bottom: 20px; 11 | text-align: center; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/dashboard/sweetalert/sweetalert.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |

Sweet Alert 2

5 |
6 |
7 |

A beautiful plugin, that replace the classic alert, Handcrafted by our friend Tristan Edwards. Please checkout the full documentation.

8 |
9 |
10 |
11 |
12 |
Basic example
13 | 14 |
15 |
16 |
17 |
18 |
A title with a text under
19 | 20 |
21 |
22 |
23 |
24 |
A success message
25 | 26 |
27 |
28 |
29 |
30 |
Custom HTML description
31 | 32 |
33 |
34 |
35 |
36 |
37 |
38 |
A warning message, with a function attached to the "Confirm" Button...
39 | 40 |
41 |
42 |
43 |
44 |
...and by passing a parameter, you can execute something else for "Cancel"
45 | 46 |
47 |
48 |
49 |
50 |
A message with auto close timer set to 2 seconds
51 | 52 |
53 |
54 |
55 |
56 |
Modal window with input field
57 | 58 |
59 |
60 |
61 |
62 | -------------------------------------------------------------------------------- /src/app/dashboard/sweetalert/sweetalert.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | declare const swal: any; 3 | 4 | @Component({ 5 | selector: 'app-sweetalert', 6 | templateUrl: './sweetalert.component.html', 7 | styleUrls: ['./sweetalert.component.css'] 8 | }) 9 | export class SweetAlertComponent implements OnInit { 10 | 11 | constructor() { } 12 | 13 | ngOnInit() { 14 | } 15 | 16 | openAlert(type) { 17 | switch (type) { 18 | case 'basic': 19 | swal({ 20 | title: 'Here\'s a message!', 21 | confirmButtonClass: 'btn btn-success' 22 | }); 23 | break; 24 | case 'text': 25 | swal({ 26 | title: 'Good job!', 27 | text: 'It\'s pretty, isn\'t it?', 28 | confirmButtonClass: 'btn btn-info' 29 | }); 30 | break; 31 | case 'success': 32 | swal({ 33 | title: 'Good job!', 34 | text: 'You clicked the button!', 35 | type: 'success', 36 | confirmButtonClass: 'btn btn-success' 37 | }); 38 | break; 39 | case 'html': 40 | swal({ 41 | title: 'HTML example', 42 | type: 'info', 43 | html: 44 | `You can use bold textlinksand other HTML tags`, 45 | showCloseButton: true, 46 | showCancelButton: true, 47 | confirmButtonText: ' Great!', 48 | cancelButtonText: '', 49 | confirmButtonClass: 'btn btn-primary', 50 | cancelButtonClass: 'btn btn-warning' 51 | }); 52 | break; 53 | case 'confirm': 54 | swal({ 55 | title: 'Are you sure?', 56 | text: 'You won\'t be able to revert this!', 57 | type: 'warning', 58 | showCancelButton: true, 59 | confirmButtonClass: 'btn btn-success', 60 | cancelButtonClass: 'btn btn-danger', 61 | confirmButtonText: 'YES, DELETE IT!' 62 | }).then(function () { 63 | swal({ 64 | title: 'Deleted!', 65 | text: 'Your file has been deleted.', 66 | type: 'success', 67 | confirmButtonClass: 'btn btn-info' 68 | }); 69 | }); 70 | break; 71 | case 'cancel': 72 | swal({ 73 | title: 'Are you sure?', 74 | text: 'You won\'t be able to revert this!', 75 | type: 'warning', 76 | showCancelButton: true, 77 | confirmButtonText: 'YES, DELETE IT!', 78 | cancelButtonText: 'NO, CANCEL!', 79 | confirmButtonClass: 'btn btn-success', 80 | cancelButtonClass: 'btn btn-danger', 81 | buttonsStyling: false 82 | }).then(function () { 83 | swal({ 84 | title: 'Deleted!', 85 | text: 'Your file has been deleted.', 86 | type: 'success', 87 | confirmButtonClass: 'btn btn-info' 88 | }); 89 | }, function (dismiss) { 90 | // dismiss can be 'cancel', 'overlay', 91 | // 'close', and 'timer' 92 | if (dismiss === 'cancel') { 93 | swal({ 94 | title: 'Cancelled', 95 | text: 'Your imaginary file is safe :)', 96 | type: 'error', 97 | confirmButtonClass: 'btn btn-info' 98 | }); 99 | } 100 | }); 101 | break; 102 | case 'close': 103 | swal({ 104 | title: 'Auto close alert!', 105 | text: 'I will close in 2 seconds.', 106 | timer: 2000, 107 | showConfirmButton: false 108 | }).then( 109 | function () {}, 110 | // handling the promise rejection 111 | function (dismiss) { 112 | if (dismiss === 'timer') { 113 | console.log('I was closed by the timer'); 114 | } 115 | } 116 | ); 117 | break; 118 | case 'input': 119 | swal({ 120 | title: 'Input something', 121 | input: 'text', 122 | inputClass: 'mat-input-container', 123 | showCancelButton: true, 124 | confirmButtonText: 'OK', 125 | confirmButtonClass: 'btn btn-success', 126 | cancelButtonClass: 'btn btn-danger', 127 | showLoaderOnConfirm: true, 128 | preConfirm: function (text) { 129 | swal({ 130 | text: 'Your entered: ' + text, 131 | type: 'success', 132 | confirmButtonClass: 'btn btn-info' 133 | }); 134 | }, 135 | allowOutsideClick: false 136 | }); 137 | break; 138 | } 139 | } 140 | 141 | } 142 | -------------------------------------------------------------------------------- /src/app/dashboard/table/table.component.css: -------------------------------------------------------------------------------- 1 | .row{ 2 | margin-top: 10px; 3 | } 4 | 5 | .card{ 6 | display: flex; 7 | flex-direction: column; 8 | padding: 20px; 9 | position: relative; 10 | margin-top: 40px; 11 | } 12 | 13 | .card-header { 14 | position: absolute; 15 | text-align: center; 16 | background: linear-gradient(60deg, #ec407a, #d81b60); 17 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4); 18 | /*margin: -20px 15px 0;*/ 19 | border-radius: 3px; 20 | padding: 15px; 21 | top: -23px; 22 | } 23 | 24 | .card-header i { 25 | font-size: 24px; 26 | width: 33px; 27 | height: 33px; 28 | line-height: 33px; 29 | color: #fff; 30 | } 31 | 32 | .card-content{ 33 | position: relative; 34 | } 35 | 36 | .card-title{ 37 | padding-left: 80px; 38 | } 39 | -------------------------------------------------------------------------------- /src/app/dashboard/table/table.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 | assignment 8 |
9 |
10 |

Simple Table

11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
First NameCountryCitySalary
Dakota RiceNigerOud-Turnhout$36,738
Minerva HooperCuraçaoSinaai-Waas$23,789
Sage RodriguezNetherlandsBaileux$56,142
Philip ChaneyKorea, SouthOverland Park$38,735
Doris GreeneMalawiFeldkirchen in Kärnten$63,542
Mason PorterChileGloucester$78,615
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | assignment 70 |
71 |
72 |

Striped Table

73 |
74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 |
#Product NameTypeQuantityPriceAmount
1Moleskine AgendaOud-Office25€ 49€ 1,225
2Stabilo PenOffice35€ 10€ 300
3A4 Paper PackOffice50€ 599.00€ 109
4Apple iPadMeeting20€ 10.99€ 4,999
5Apple iPhoneCommunication10€ 499.00€ 5,999
Total€12,999
139 |
140 |
141 |
142 |
143 |
144 |
145 | -------------------------------------------------------------------------------- /src/app/dashboard/table/table.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-table', 5 | templateUrl: './table.component.html', 6 | styleUrls: ['./table.component.css'] 7 | }) 8 | export class TableComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/page/lock/lock.component.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | height: 100%; 3 | position: relative; 4 | z-index: 1; 5 | } 6 | 7 | .background{ 8 | background: url("../../../assets/img/lock_bg.jpg") no-repeat center center; 9 | background-size: cover; 10 | } 11 | 12 | .card{ 13 | position: relative; 14 | display: flex; 15 | flex-direction: column; 16 | align-items: center; 17 | width: 100%; 18 | padding: 20px; 19 | margin-top: 70px; 20 | top: -60px; 21 | -webkit-animation-name: card; 22 | -moz-animation-name: card; 23 | -o-animation-name: card; 24 | animation-name: card; 25 | -webkit-animation-duration: 600ms; 26 | -moz-animation-duration: 600ms; 27 | -o-animation-duration: 600ms; 28 | animation-duration: 600ms; 29 | -webkit-animation-fill-mode: forwards; 30 | -moz-animation-fill-mode: forwards; 31 | -o-animation-fill-mode: forwards; 32 | animation-fill-mode: forwards; 33 | } 34 | 35 | @-webkit-keyframes card { 36 | from {top: -40px;} 37 | to {top: 0;} 38 | } 39 | 40 | @keyframes card { 41 | from {top: -40px;} 42 | to {top: 0;} 43 | } 44 | 45 | .card-header img{ 46 | position: relative; 47 | top: -60px; 48 | border-radius: 50%; 49 | width: 90px; 50 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0 rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); 51 | } 52 | 53 | .card h4{ 54 | margin-top: -30px; 55 | margin-bottom: 20px; 56 | } 57 | 58 | .card-body, .card-body .mat-form-field{ 59 | width: 100%; 60 | } 61 | 62 | .card-footer{ 63 | margin: 15px 0 5px 0; 64 | } 65 | -------------------------------------------------------------------------------- /src/app/page/lock/lock.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 |
13 |

Tania Andrew

14 |
15 | 16 | 17 | 18 |
19 | 22 |
23 |
24 |
25 |
26 |
27 | -------------------------------------------------------------------------------- /src/app/page/lock/lock.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-lock', 5 | templateUrl: './lock.component.html', 6 | styleUrls: ['./lock.component.css'] 7 | }) 8 | export class LockComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/page/login/login.component.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | height: 100%; 3 | position: relative; 4 | z-index: 1; 5 | } 6 | .background{ 7 | background: url("../../../assets/img/lock_bg.jpg") no-repeat center center; 8 | -webkit-background-size: cover; 9 | -moz-background-size: cover; 10 | -o-background-size: cover; 11 | background-size: cover; 12 | width: 100%; 13 | height: 100%; 14 | } 15 | 16 | .card{ 17 | position: relative; 18 | padding: 20px; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | -webkit-animation-name: card; 23 | -moz-animation-name: card; 24 | -o-animation-name: card; 25 | animation-name: card; 26 | -webkit-animation-duration: 600ms; 27 | -moz-animation-duration: 600ms; 28 | -o-animation-duration: 600ms; 29 | animation-duration: 600ms; 30 | -webkit-animation-fill-mode: forwards; 31 | -moz-animation-fill-mode: forwards; 32 | -o-animation-fill-mode: forwards; 33 | animation-fill-mode: forwards; 34 | } 35 | 36 | @-webkit-keyframes card { 37 | from {top: -40px;} 38 | to {top: 0;} 39 | } 40 | 41 | @keyframes card { 42 | from {top: -40px;} 43 | to {top: 0;} 44 | } 45 | 46 | .card-header{ 47 | position: relative; 48 | overflow: hidden; 49 | top: -40px; 50 | width: 100%; 51 | padding: 25px; 52 | border-radius: 3px; 53 | background: linear-gradient(60deg, #ec407a, #d81b60); 54 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4); 55 | display: flex; 56 | flex-direction: column; 57 | align-items: center; 58 | } 59 | 60 | .card-header h4{ 61 | font-weight: 400; 62 | color: #fff; 63 | margin-bottom: 25px; 64 | margin-top: 5px; 65 | } 66 | 67 | .social-btns i{ 68 | font-size: 21px; 69 | color: #fff; 70 | } 71 | 72 | .social-btns button{ 73 | margin: 0 8px; 74 | } 75 | 76 | .tip{ 77 | margin-top: -20px; 78 | } 79 | 80 | .form-row, .card-form, .mat-form-field{ 81 | width: 100%; 82 | } 83 | 84 | .card-form{ 85 | padding: 5px; 86 | } 87 | 88 | .form-row{ 89 | position: relative; 90 | display: flex; 91 | align-items: center; 92 | margin-top: 13px; 93 | } 94 | 95 | .form-row i{ 96 | position: relative; 97 | top: -5px; 98 | margin-right: 15px; 99 | color: #555; 100 | } 101 | 102 | .card-footer{ 103 | margin: 10px; 104 | } 105 | 106 | .card-footer button{ 107 | color: #e91e63; 108 | } 109 | -------------------------------------------------------------------------------- /src/app/page/login/login.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 |

Login

12 | 17 |
18 |

Or Be Classical

19 |
20 |
21 | face 22 | 23 | 24 | 25 |
26 |
27 | email 28 | 29 | 30 | 31 |
32 |
33 | lock_outline 34 | 35 | 36 | 37 |
38 |
39 | 42 |
43 |
44 |
45 |
46 |
47 | -------------------------------------------------------------------------------- /src/app/page/login/login.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-login', 5 | templateUrl: './login.component.html', 6 | styleUrls: ['./login.component.css'] 7 | }) 8 | export class LoginComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | loginBtn() { 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/page/register/register.component.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | height: 100%; 3 | position: relative; 4 | z-index: 1; 5 | } 6 | 7 | .background { 8 | background: url("../../../assets/img/register_bg.jpg") center center; 9 | background-size: cover; 10 | } 11 | 12 | .register-panel{ 13 | margin-top: 25px; 14 | } 15 | 16 | .card{ 17 | padding: 40px 0 30px; 18 | } 19 | 20 | .card h2{ 21 | text-align: center; 22 | } 23 | 24 | .feature{ 25 | display: flex; 26 | /*width: 100%;*/ 27 | flex: 1; 28 | margin-top: 50px; 29 | } 30 | 31 | .feature .icon{ 32 | width: 40px; 33 | } 34 | 35 | .feature .icon i{ 36 | font-size: 2.6em; 37 | } 38 | 39 | .feature .desc{ 40 | flex: 1; 41 | margin-left: 10px; 42 | } 43 | 44 | .feature .desc p{ 45 | margin-top: 17px; 46 | } 47 | 48 | .feature .desc h4{ 49 | margin-top: 8px; 50 | } 51 | 52 | .form-part{ 53 | display: flex; 54 | flex-direction: column; 55 | align-items: center; 56 | width: 100%; 57 | padding-left: 25px; 58 | } 59 | 60 | .form-part .row{ 61 | width: 100%; 62 | display: flex; 63 | position: relative; 64 | margin-top: 17px; 65 | } 66 | 67 | .form-part .row .mat-input-container{ 68 | width: 100%; 69 | } 70 | 71 | .form-part .row i{ 72 | margin-right: 13px; 73 | position: relative; 74 | top: 8px; 75 | color: #555; 76 | } 77 | 78 | .form-part .socials{ 79 | margin-top: 40px; 80 | margin-bottom: 25px; 81 | } 82 | 83 | .form-part .row button{ 84 | margin-top: 15px; 85 | } 86 | -------------------------------------------------------------------------------- /src/app/page/register/register.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |

Register

11 |
12 |
13 |
14 |
15 | timeline 16 |
17 |
18 |

Marking

19 |

We've created the marketing campaign of the website. It was a very interesting collaboration.

20 |
21 |
22 |
23 |
24 | code 25 |
26 |
27 |

Fully Coded in HTML5

28 |

We've developed the website with HTML5 and CSS3. The client has access to the code using GitHub.

29 |
30 |
31 |
32 |
33 | group 34 |
35 |
36 |

Built Audience

37 |

There is also a Fully Customizable CMS Admin Dashboard for this product.

38 |
39 |
40 |
41 |
42 |
43 |
44 | 45 | 46 | 47 |
48 |
or be classical
49 |
50 | face 51 | 52 | 53 | 54 |
55 |
56 | email 57 | 58 | 59 | 60 |
61 |
62 | lock_outline 63 | 64 | 65 | 66 |
67 |
68 |

I agree to the terms and conditions.

69 |
70 |
71 | 72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | -------------------------------------------------------------------------------- /src/app/page/register/register.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-register', 5 | templateUrl: './register.component.html', 6 | styleUrls: ['./register.component.css'] 7 | }) 8 | export class RegisterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/services/settings.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, EventEmitter } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class SettingsService { 5 | public sidebarImageIndex = 0; 6 | public sidebarImageIndexUpdate: EventEmitter = new EventEmitter(); 7 | public sidebarFilter = '#fff'; 8 | public sidebarFilterUpdate: EventEmitter = new EventEmitter(); 9 | public sidebarColor = '#D80B0B'; 10 | public sidebarColorUpdate: EventEmitter = new EventEmitter(); 11 | 12 | constructor() { } 13 | 14 | getSidebarImageIndex(): number { 15 | return this.sidebarImageIndex; 16 | } 17 | setSidebarImageIndex(id) { 18 | this.sidebarImageIndex = id; 19 | this.sidebarImageIndexUpdate.emit(this.sidebarImageIndex); 20 | } 21 | getSidebarFilter(): string { 22 | return this.sidebarFilter; 23 | } 24 | setSidebarFilter(color: string) { 25 | this.sidebarFilter = color; 26 | this.sidebarFilterUpdate.emit(this.sidebarFilter); 27 | } 28 | getSidebarColor(): string { 29 | return this.sidebarColor; 30 | } 31 | setSidebarColor(color: string) { 32 | this.sidebarColor = color; 33 | this.sidebarColorUpdate.emit(this.sidebarColor); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/shared/figurecard/figurecard.component.css: -------------------------------------------------------------------------------- 1 | .figure-card{ 2 | display: inline-block; 3 | position: relative; 4 | width: 100%; 5 | margin: 25px 0; 6 | } 7 | 8 | .card-content{ 9 | text-align: right; 10 | padding: 15px 20px 13px 20px; 11 | } 12 | 13 | .card-header { 14 | float: left; 15 | text-align: center; 16 | /*background: linear-gradient(60deg, #ffa726, #fb8c00);*/ 17 | /*box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(255, 152, 0, 0.4);*/ 18 | margin: -20px 15px 0; 19 | border-radius: 3px; 20 | padding: 15px; 21 | position: relative; 22 | } 23 | 24 | .card-header i { 25 | font-size: 36px; 26 | line-height: 56px; 27 | width: 56px; 28 | height: 56px; 29 | color: #fff; 30 | } 31 | 32 | .category{ 33 | color: #999; 34 | } 35 | 36 | .card-footer{ 37 | margin: 0 20px 10px; 38 | padding-top: 10px; 39 | border-top: 1px solid #eee; 40 | color: #999; 41 | font-size: 12px; 42 | position: relative; 43 | } 44 | 45 | .card-footer i { 46 | font-size: 16px; 47 | position: relative; 48 | top: 4px; 49 | color: #999; 50 | } 51 | -------------------------------------------------------------------------------- /src/app/shared/figurecard/figurecard.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ headerIcon }} 4 |
5 |
6 |

{{ category }}

7 |

{{ title }}

8 |
9 | 12 |
13 | -------------------------------------------------------------------------------- /src/app/shared/figurecard/figurecard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-figurecard', 5 | templateUrl: './figurecard.component.html', 6 | styleUrls: ['./figurecard.component.css'] 7 | }) 8 | export class FigurecardComponent implements OnInit { 9 | @Input() headerIcon: string; 10 | @Input() category: string; 11 | @Input() title: string; 12 | @Input() footerIcon: string; 13 | @Input() footContent: string; 14 | @Input() linearColor: string; 15 | @Input() boxShadow: string; 16 | constructor() { } 17 | 18 | ngOnInit() { 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/app/shared/footer/footer.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/app/shared/footer/footer.component.css -------------------------------------------------------------------------------- /src/app/shared/footer/footer.component.html: -------------------------------------------------------------------------------- 1 |

2 | footer works! 3 |

4 | -------------------------------------------------------------------------------- /src/app/shared/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-footer', 5 | templateUrl: './footer.component.html', 6 | styleUrls: ['./footer.component.css'] 7 | }) 8 | export class FooterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/shared/header/header.component.css: -------------------------------------------------------------------------------- 1 | header{ 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | } 6 | 7 | .left *{ 8 | color: #fff; 9 | } 10 | 11 | .right{ 12 | display: flex; 13 | } 14 | 15 | .right a{ 16 | display: flex; 17 | align-items: center; 18 | text-decoration: none; 19 | color: #fff; 20 | cursor: pointer; 21 | margin-right: 25px; 22 | } 23 | 24 | .right p{ 25 | margin-left: 5px; 26 | font-size: 12px; 27 | line-height: normal; 28 | color: #fff; 29 | } 30 | 31 | .right i{ 32 | font-size: 20px; 33 | } 34 | 35 | .router-active{ 36 | background-color: rgba(255,255,255,.1); 37 | padding: 15px 18px 15px 15px; 38 | border-radius: 3px; 39 | } 40 | -------------------------------------------------------------------------------- /src/app/shared/header/header.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
MD Pro Angular
4 |
5 | 11 |
12 | -------------------------------------------------------------------------------- /src/app/shared/header/header.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-header', 5 | templateUrl: './header.component.html', 6 | styleUrls: ['./header.component.css'] 7 | }) 8 | export class HeaderComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/shared/imagecard/imagecard.component.css: -------------------------------------------------------------------------------- 1 | .image-card{ 2 | position: relative; 3 | width: 100%; 4 | margin: 25px 0; 5 | padding: 15px; 6 | } 7 | 8 | .header{ 9 | position: relative; 10 | overflow: hidden; 11 | margin-top: -40px; 12 | border-radius: 6px; 13 | z-index: 3; 14 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0 rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); 15 | } 16 | 17 | .header img{ 18 | position: relative; 19 | max-width: 100%; 20 | border-radius: 6px; 21 | } 22 | 23 | .body{ 24 | text-align: center; 25 | padding: 10px 10px 13px 10px; 26 | margin-top: 7px; 27 | } 28 | 29 | .body p{ 30 | margin-top: 5px; 31 | color: #999; 32 | font-weight: 100; 33 | padding-bottom: 15px; 34 | border-bottom: 1px solid #eee; 35 | } 36 | 37 | .footer{ 38 | display: flex; 39 | justify-content: space-between; 40 | align-items: center; 41 | padding: 0 8px 2px 8px; 42 | } 43 | 44 | .footer .position{ 45 | display: flex; 46 | align-items: center; 47 | color: #999; 48 | font-weight: 100; 49 | } 50 | 51 | .footer i{ 52 | font-size: 17px; 53 | margin-right: 3px; 54 | } 55 | 56 | .footer h4{ 57 | color: rgba(0,0,0, 0.87); 58 | } 59 | -------------------------------------------------------------------------------- /src/app/shared/imagecard/imagecard.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |

{{ title }}

7 |

{{ desc }}

8 |
9 | 13 |
14 | -------------------------------------------------------------------------------- /src/app/shared/imagecard/imagecard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-imagecard', 5 | templateUrl: './imagecard.component.html', 6 | styleUrls: ['./imagecard.component.css'] 7 | }) 8 | export class ImagecardComponent implements OnInit { 9 | @Input() title: string; 10 | @Input() desc: string; 11 | @Input() footerTitle: string; 12 | @Input() position: string; 13 | @Input() image: string; 14 | constructor() { } 15 | 16 | ngOnInit() { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/app/shared/msgiconbtn/msgiconbtn.component.css: -------------------------------------------------------------------------------- 1 | .msg-btn{ 2 | position: relative; 3 | } 4 | 5 | .msg-btn i{ 6 | font-size: 19px; 7 | color: #555; 8 | } 9 | 10 | .msg-btn span{ 11 | position: absolute; 12 | top: 2px; 13 | border: 1px solid #FFF; 14 | right: 2px; 15 | font-size: 9px; 16 | background: #f44336; 17 | color: #FFF; 18 | min-width: 20px; 19 | padding: 0px 5px; 20 | height: 20px; 21 | border-radius: 10px; 22 | text-align: center; 23 | line-height: 19px; 24 | vertical-align: middle; 25 | } 26 | -------------------------------------------------------------------------------- /src/app/shared/msgiconbtn/msgiconbtn.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/shared/msgiconbtn/msgiconbtn.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-msgiconbtn', 5 | templateUrl: './msgiconbtn.component.html', 6 | styleUrls: ['./msgiconbtn.component.css'] 7 | }) 8 | export class MsgIconBtnComponent implements OnInit { 9 | @Input() number: string; 10 | @Input() icon: string; 11 | constructor() { } 12 | 13 | ngOnInit() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/app/shared/navbar/navbar.component.css: -------------------------------------------------------------------------------- 1 | .nav-bar{ 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | } 6 | 7 | .left-part, .right-part{ 8 | display: flex; 9 | align-items: center; 10 | } 11 | 12 | .nav-bar h4{ 13 | color: #555; 14 | } 15 | 16 | .mat-mini-fab{ 17 | box-shadow: 0 2px 2px 0 rgba(153, 153, 153, 0.14), 0 3px 1px -2px rgba(153, 153, 153, 0.2), 0 1px 5px 0 rgba(153, 153, 153, 0.12); 18 | background-color: #fefefe; 19 | color: #999; 20 | margin-right: 15px; 21 | } 22 | 23 | .mat-mini-fab:hover{ 24 | color: #999 !important; 25 | box-shadow: 0 14px 26px -12px rgba(153, 153, 153, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(153, 153, 153, 0.2) !important; 26 | } 27 | 28 | .mat-mini-fab:focus{ 29 | color: #999 !important; 30 | } 31 | 32 | .search-btn{ 33 | margin: 0 5px 0 7px; 34 | } 35 | 36 | .icon-btn{ 37 | font-size: 19px; 38 | color: #555; 39 | } 40 | 41 | .mat-icon-button{ 42 | margin-left: 7px; 43 | } 44 | -------------------------------------------------------------------------------- /src/app/shared/navbar/navbar.component.html: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /src/app/shared/navbar/navbar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-navbar', 5 | templateUrl: './navbar.component.html', 6 | styleUrls: ['./navbar.component.css'] 7 | }) 8 | export class NavbarComponent implements OnInit { 9 | @Input() title: string; 10 | constructor() {} 11 | 12 | ngOnInit() { 13 | } 14 | 15 | menuClick() { 16 | // document.getElementById('main-panel').style.marginRight = '260px'; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/sidebar/sidebar-routes.config.ts: -------------------------------------------------------------------------------- 1 | export const ROUTES = [ 2 | { path: '/dashboard', title: 'Dashboard', icon: 'dashboard', children: null }, 3 | { path: 'profile', title: 'User Profile', icon: 'person', children: null }, 4 | { path: 'table', title: 'Table List', icon: 'content_paste', children: null }, 5 | { path: '#component', id: 'component', title: 'Component', icon: 'apps', children: [ 6 | {path: 'components/price-table', title: 'Price Table', icon: 'PT'}, 7 | {path: 'components/panels', title: 'Panels', icon: 'P'}, 8 | {path: 'components/wizard', title: 'Wizard', icon: 'W'}, 9 | ]}, 10 | { path: 'notification', title: 'Notification', icon: 'notifications', children: null }, 11 | { path: 'alert', title: 'Sweet Alert', icon: 'warning', children: null }, 12 | { path: 'settings', title: 'Settings', icon: 'settings', children: null }, 13 | ]; 14 | -------------------------------------------------------------------------------- /src/app/sidebar/sidebar.component.css: -------------------------------------------------------------------------------- 1 | .logo{ 2 | padding: 25px 0 20px 0; 3 | color: #fff; 4 | font-size: 18px; 5 | text-align: center; 6 | position: relative; 7 | } 8 | 9 | .logo img{ 10 | width: 42px; 11 | position: absolute; 12 | top: 16px; 13 | left: 13px; 14 | } 15 | 16 | .divider{ 17 | content: ''; 18 | position: relative; 19 | height: 1px; 20 | left: 15px; 21 | width: calc(100% - 30px); 22 | background-color: rgba(255, 255, 255, 0.5); 23 | } 24 | 25 | .sidebar-wrapper{ 26 | overflow-y: auto; 27 | padding-bottom: 30px; 28 | width: 260px; 29 | position: relative; 30 | height: 100%; 31 | } 32 | 33 | .nav-container{ 34 | position: relative; 35 | } 36 | 37 | .nav{ 38 | padding-top: 15px; 39 | } 40 | 41 | .nav li{ 42 | margin-bottom: 9px; 43 | } 44 | 45 | .nav li a{ 46 | display: flex; 47 | align-items: center; 48 | color: rgba(255,255,255,.8); 49 | margin: 0 15px; 50 | border-radius: 3px; 51 | -webkit-transition: all 400ms; 52 | -moz-transition: all 400ms; 53 | -ms-transition: all 400ms; 54 | -o-transition: all 400ms; 55 | transition: all 400ms; 56 | height: 50px; 57 | text-decoration: none; 58 | } 59 | 60 | .nav li a:hover, .parent-active{ 61 | background-color: rgba(255,255,255,.1); 62 | } 63 | 64 | .nav li a span{ 65 | margin-left: 20px; 66 | } 67 | 68 | .active a, .active a:hover{ 69 | /*color: rgba(0,0,0,.6) !important;*/ 70 | /*background-color: #fff !important;*/ 71 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(60, 72, 88, 0.4); 72 | -webkit-transition: all 400ms; 73 | -moz-transition: all 400ms; 74 | -ms-transition: all 400ms; 75 | -o-transition: all 400ms; 76 | transition: all 400ms; 77 | } 78 | 79 | .collapse-a{ 80 | position: relative; 81 | } 82 | 83 | .collapse-a .caret{ 84 | position: absolute; 85 | right: 21px; 86 | top: 23px; 87 | color: #fff; 88 | -webkit-transform: rotate(180deg); 89 | -moz-transform: rotate(180deg); 90 | -ms-transform: rotate(180deg); 91 | -o-transform: rotate(180deg); 92 | transform: rotate(180deg); 93 | -webkit-transition: all 200ms; 94 | -moz-transition: all 200ms; 95 | -ms-transition: all 200ms; 96 | -o-transition: all 200ms; 97 | transition: all 200ms; 98 | } 99 | 100 | .collapsed .caret{ 101 | position: absolute; 102 | right: 21px; 103 | top: 23px; 104 | -webkit-transform: rotate(0deg); 105 | -moz-transform: rotate(0deg); 106 | -ms-transform: rotate(0deg); 107 | -o-transform: rotate(0deg); 108 | transform: rotate(0deg); 109 | } 110 | 111 | 112 | -------------------------------------------------------------------------------- /src/app/sidebar/sidebar.component.html: -------------------------------------------------------------------------------- 1 | 5 |
6 | 35 | -------------------------------------------------------------------------------- /src/app/sidebar/sidebar.component.ts: -------------------------------------------------------------------------------- 1 | import {AfterViewInit, Component, OnInit, OnDestroy} from '@angular/core'; 2 | import { SettingsService } from '../services/settings.service'; 3 | import { ROUTES } from './sidebar-routes.config'; 4 | 5 | @Component({ 6 | selector: 'app-sidebar', 7 | templateUrl: './sidebar.component.html', 8 | styleUrls: ['./sidebar.component.css'] 9 | }) 10 | export class SidebarComponent implements OnInit, AfterViewInit, OnDestroy { 11 | public color: string; 12 | public menuItems: object; 13 | public activeFontColor: string; 14 | public normalFontColor: string; 15 | public dividerBgColor: string; 16 | constructor(public settingsService: SettingsService) { 17 | this.menuItems = ROUTES; 18 | this.activeFontColor = 'rgba(0,0,0,.6)'; 19 | this.normalFontColor = 'rgba(255,255,255,.8)'; 20 | this.dividerBgColor = 'rgba(255, 255, 255, 0.5)'; 21 | } 22 | 23 | ngOnInit() { 24 | this.color = this.settingsService.getSidebarFilter(); 25 | this.settingsService.sidebarFilterUpdate.subscribe((filter: string) => { 26 | this.color = filter; 27 | if (filter === '#fff') { 28 | this.activeFontColor = 'rgba(0,0,0,.6)'; 29 | }else { 30 | this.activeFontColor = 'rgba(255,255,255,.8)'; 31 | } 32 | }); 33 | this.settingsService.sidebarColorUpdate.subscribe((color: string) => { 34 | if (color === '#fff') { 35 | this.normalFontColor = 'rgba(0,0,0,.6)'; 36 | this.dividerBgColor = 'rgba(0,0,0,.1)'; 37 | }else { 38 | this.normalFontColor = 'rgba(255,255,255,.8)'; 39 | this.dividerBgColor = 'rgba(255, 255, 255, 0.5)'; 40 | } 41 | }); 42 | } 43 | ngOnDestroy() { 44 | this.settingsService.sidebarFilterUpdate.unsubscribe(); 45 | this.settingsService.sidebarColorUpdate.unsubscribe(); 46 | } 47 | 48 | ngAfterViewInit() { 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/assets/img/angular2-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/angular2-logo.png -------------------------------------------------------------------------------- /src/assets/img/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/avatar.jpg -------------------------------------------------------------------------------- /src/assets/img/card-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/card-1.jpeg -------------------------------------------------------------------------------- /src/assets/img/card-2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/card-2.jpeg -------------------------------------------------------------------------------- /src/assets/img/card-3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/card-3.jpeg -------------------------------------------------------------------------------- /src/assets/img/lock_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/lock_bg.jpg -------------------------------------------------------------------------------- /src/assets/img/login_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/login_bg.jpg -------------------------------------------------------------------------------- /src/assets/img/marc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/marc.jpg -------------------------------------------------------------------------------- /src/assets/img/register_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/register_bg.jpg -------------------------------------------------------------------------------- /src/assets/img/sidebar-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-1.jpg -------------------------------------------------------------------------------- /src/assets/img/sidebar-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-2.jpg -------------------------------------------------------------------------------- /src/assets/img/sidebar-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-3.jpg -------------------------------------------------------------------------------- /src/assets/img/sidebar-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-4.jpg -------------------------------------------------------------------------------- /src/assets/js/bootstrap-notify.min.js: -------------------------------------------------------------------------------- 1 | /* Project: Bootstrap Growl = v3.1.3 | Description: Turns standard Bootstrap alerts into "Growl-like" notifications. | Author: Mouse0270 aka Robert McIntosh | License: MIT License | Website: https://github.com/mouse0270/bootstrap-growl */ 2 | !function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(e,i,n){var i={content:{message:"object"==typeof i?i.message:i,title:i.title?i.title:"",icon:i.icon?i.icon:"",url:i.url?i.url:"#",target:i.target?i.target:"-"}};n=t.extend(!0,{},i,n),this.settings=t.extend(!0,{},s,n),this._defaults=s,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var s={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var t=arguments[0],e=1;e .progress-bar').removeClass("progress-bar-"+t.settings.type),t.settings.type=i[e],this.$ele.addClass("alert-"+i[e]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[e]);break;case"icon":var n=this.$ele.find('[data-notify="icon"]');"class"==t.settings.icon_type.toLowerCase()?n.removeClass(t.settings.content.icon).addClass(i[e]):(n.is("img")||n.find("img"),n.attr("src",i[e]));break;case"progress":var a=t.settings.delay-t.settings.delay*(i[e]/100);this.$ele.data("notify-delay",a),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[e]).css("width",i[e]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[e]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[e]);break;default:this.$ele.find('[data-notify="'+e+'"]').html(i[e])}var o=this.$ele.outerHeight()+parseInt(t.settings.spacing)+parseInt(t.settings.offset.y);t.reposition(o)},close:function(){t.close()}}},buildNotify:function(){var e=this.settings.content;this.$ele=t(String.format(this.settings.template,this.settings.type,e.title,e.message,e.url,e.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1}),this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},placement:function(){var e=this,s=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},n=!1,a=this.settings;switch(t('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return s=Math.max(s,parseInt(t(this).css(a.placement.from))+parseInt(t(this).outerHeight())+parseInt(a.spacing))}),1==this.settings.newest_on_top&&(s=this.settings.offset.y),i[this.settings.placement.from]=s+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),t.each(Array("webkit","moz","o","ms",""),function(t,s){e.$ele[0].style[s+"AnimationIterationCount"]=1}),t(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(s=parseInt(s)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(s)),t.isFunction(e.settings.onShow)&&e.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(){n=!0}).one(this.animations.end,function(){t.isFunction(e.settings.onShown)&&e.settings.onShown.call(this)}),setTimeout(function(){n||t.isFunction(e.settings.onShown)&&e.settings.onShown.call(this)},600)},bind:function(){var e=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){e.close()}),this.$ele.mouseover(function(){t(this).data("data-hover","true")}).mouseout(function(){t(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){e.$ele.data("notify-delay",e.settings.delay);var s=setInterval(function(){var t=parseInt(e.$ele.data("notify-delay"))-e.settings.timer;if("false"===e.$ele.data("data-hover")&&"pause"==e.settings.mouse_over||"pause"!=e.settings.mouse_over){var i=(e.settings.delay-t)/e.settings.delay*100;e.$ele.data("notify-delay",t),e.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}t<=-e.settings.timer&&(clearInterval(s),e.close())},e.settings.timer)}},close:function(){var e=this,s=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),e.reposition(s),t.isFunction(e.settings.onClose)&&e.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(){i=!0}).one(this.animations.end,function(){t(this).remove(),t.isFunction(e.settings.onClosed)&&e.settings.onClosed.call(this)}),setTimeout(function(){i||(e.$ele.remove(),e.settings.onClosed&&e.settings.onClosed(e.$ele))},600)},reposition:function(e){var s=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',n=this.$ele.nextAll(i);1==this.settings.newest_on_top&&(n=this.$ele.prevAll(i)),n.each(function(){t(this).css(s.settings.placement.from,e),e=parseInt(e)+parseInt(s.settings.spacing)+t(this).outerHeight()})}}),t.notify=function(t,s){var i=new e(this,t,s);return i.notify},t.notifyDefaults=function(e){return s=t.extend(!0,{},s,e)},t.notifyClose=function(e){"undefined"==typeof e||"all"==e?t("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):t('[data-notify-position="'+e+'"]').find('[data-notify="dismiss"]').trigger("click")}}); -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/favicon.ico -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Angular2 Material Dashboard Pro 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 |

Loading...

27 | 28 | 29 | 30 |

31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule); 12 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/set'; 35 | 36 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 37 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 38 | 39 | /** IE10 and IE11 requires the following to support `@angular/animation`. */ 40 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 41 | 42 | 43 | /** Evergreen browsers require these. **/ 44 | import 'core-js/es6/reflect'; 45 | 46 | 47 | 48 | /** ALL Firefox browsers require the following to support `@angular/animation`. **/ 49 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 50 | 51 | 52 | 53 | /*************************************************************************************************** 54 | * Zone JS is required by Angular itself. 55 | */ 56 | import 'zone.js/dist/zone'; // Included with Angular CLI. 57 | 58 | 59 | 60 | /*************************************************************************************************** 61 | * APPLICATION IMPORTS 62 | */ 63 | 64 | /** 65 | * Date, currency, decimal and percent pipes. 66 | * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 67 | */ 68 | // import 'intl'; // Run `npm install --save intl`. 69 | /** 70 | * Need to import at least one locale-data with intl. 71 | */ 72 | // import 'intl/locale-data/jsonp/en'; 73 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | @import '~@angular/material/prebuilt-themes/indigo-pink.css'; 3 | 4 | html, body { 5 | padding: 0; 6 | margin: 0; 7 | height: 100%; 8 | } 9 | 10 | body { 11 | background-color: #eee; 12 | } 13 | 14 | * { 15 | margin: 0; 16 | box-sizing: border-box; 17 | } 18 | 19 | h1, h2, h3, h4, h5, h6, p, a, button, div, label, small { 20 | font-family: "Roboto", "Helvetica", "Arial", sans-serif; 21 | font-weight: 300; 22 | /*line-height: 1.5em;*/ 23 | margin: 0; 24 | } 25 | 26 | h1, .h1 { 27 | font-size: 3.8em; 28 | } 29 | 30 | h2, .h2 { 31 | font-size: 2.6em; 32 | } 33 | 34 | h3, .h3 { 35 | font-size: 1.825em; 36 | } 37 | 38 | h4, .h4 { 39 | font-size: 1.3em; 40 | } 41 | 42 | h5, .h5 { 43 | font-size: 1.25em; 44 | line-height: 1.5em; 45 | } 46 | 47 | h6, .h6 { 48 | font-size: 1em; 49 | text-transform: uppercase; 50 | } 51 | 52 | p { 53 | margin: 0; 54 | color: #999; 55 | } 56 | 57 | a { 58 | color: #9c27b0; 59 | text-decoration: none; 60 | } 61 | 62 | a:hover{ 63 | color: #89229b; 64 | text-decoration: none; 65 | } 66 | 67 | b{ 68 | font-weight: 300; 69 | } 70 | 71 | .subtitle{ 72 | margin-top: 15px; 73 | color: #3C4858; 74 | } 75 | 76 | .container{ 77 | padding: 15px 30px; 78 | } 79 | 80 | .card{ 81 | box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14); 82 | border-radius: 6px; 83 | color: rgba(0,0,0, 0.87); 84 | background: #fff; 85 | } 86 | 87 | .card-raised{ 88 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); 89 | } 90 | 91 | .page-title{ 92 | margin-top: 40px; 93 | } 94 | 95 | @media (min-width: 1200px) { 96 | .container { 97 | width: 100%; 98 | } 99 | } 100 | 101 | @media (min-width: 992px) { 102 | .container { 103 | width: 100%; 104 | } 105 | } 106 | 107 | @media (min-width: 768px) { 108 | .container { 109 | width: 100%; 110 | } 111 | } 112 | 113 | .background{ 114 | background: url("./assets/img/login_bg.jpg") no-repeat center center; 115 | height: 100%; 116 | background-size: cover; 117 | filter: brightness(40%); 118 | position: absolute; 119 | top: 0; 120 | left: 0; 121 | width: 100%; 122 | z-index: 0; 123 | } 124 | 125 | .swal2-modal{ 126 | outline: none; 127 | } 128 | 129 | /* loading style*/ 130 | .loader { 131 | margin: 0 auto; 132 | width: 60px; 133 | position: absolute; 134 | display: block; 135 | left: 0; 136 | right: 0; 137 | z-index: 1; 138 | -webkit-transform: translate3d(0, -50%, 0); 139 | -moz-transform: translate3d(0, -50%, 0); 140 | -o-transform: translate3d(0, -50%, 0); 141 | -ms-transform: translate3d(0, -50%, 0); 142 | transform: translate3d(0, -50%, 0); 143 | text-align: center; 144 | top: 50%; 145 | } 146 | 147 | .loader:before { 148 | content: ''; 149 | display: block; 150 | padding-top: 100%; 151 | } 152 | 153 | .circular { 154 | animation: rotate 2s linear infinite; 155 | height: 100%; 156 | transform-origin: center center; 157 | width: 100%; 158 | position: absolute; 159 | top: 0; 160 | bottom: 0; 161 | left: 0; 162 | right: 0; 163 | margin: auto; 164 | } 165 | 166 | .path { 167 | stroke-dasharray: 1, 200; 168 | stroke-dashoffset: 0; 169 | animation: dash 1.5s ease-in-out infinite, color 2s ease-in-out infinite; 170 | stroke-linecap: round; 171 | } 172 | 173 | @keyframes rotate { 174 | 100% { 175 | transform: rotate(360deg); 176 | } 177 | } 178 | @keyframes dash { 179 | 0% { 180 | stroke-dasharray: 1, 200; 181 | stroke-dashoffset: 0; 182 | } 183 | 50% { 184 | stroke-dasharray: 89, 200; 185 | stroke-dashoffset: -35px; 186 | } 187 | 100% { 188 | stroke-dasharray: 89, 200; 189 | stroke-dashoffset: -124px; 190 | } 191 | } 192 | @keyframes color { 193 | 100%, 194 | 0% { 195 | stroke: #9c27b0; 196 | } 197 | 50% { 198 | stroke: #ff9800; 199 | } 200 | 100% { 201 | stroke: #9c27b0; 202 | } 203 | } 204 | 205 | @media screen and (min-width: 991px){ 206 | #menu{ 207 | display: none; 208 | } 209 | } 210 | 211 | @media screen and (max-width: 990px){ 212 | #sidebar, #nav-right, #nav-left-button{ 213 | display: none; 214 | } 215 | #menu{ 216 | display: inline; 217 | } 218 | #main-panel{ 219 | padding-left: 0; 220 | -webkit-transition: all 400ms; 221 | -moz-transition: all 400ms; 222 | -ms-transition: all 400ms; 223 | -o-transition: all 400ms; 224 | transition: all 400ms; 225 | } 226 | } 227 | 228 | /* input text style */ 229 | .mat-input-underline .mat-input-ripple { 230 | background-color: #9c27b0 !important; 231 | } 232 | 233 | .mat-focused .mat-input-placeholder{ 234 | color: #aaa !important; 235 | } 236 | 237 | /* drop down menu */ 238 | .mat-menu-panel{ 239 | border-radius: 3px; 240 | } 241 | 242 | .mat-menu-content{ 243 | padding: 5px !important; 244 | } 245 | 246 | .mat-menu-content .mat-menu-item{ 247 | font-size: 13px; 248 | border-radius: 2px; 249 | line-height: 38px; 250 | height: 38px; 251 | -webkit-transition: all 400ms; 252 | -moz-transition: all 400ms; 253 | -ms-transition: all 400ms; 254 | -o-transition: all 400ms; 255 | transition: all 400ms; 256 | } 257 | 258 | .mat-menu-content .mat-menu-item:hover{ 259 | background-color: #9c27b0 !important; 260 | color: #FFFFFF !important; 261 | box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(156, 39, 176, 0.4) !important; 262 | -webkit-transition: all 400ms; 263 | -moz-transition: all 400ms; 264 | -ms-transition: all 400ms; 265 | -o-transition: all 400ms; 266 | transition: all 400ms; 267 | } 268 | 269 | /* circle button style */ 270 | .mat-mini-fab{ 271 | font-size: 20px !important; 272 | outline: none !important; 273 | box-shadow: 0 2px 2px 0 rgba(153, 153, 153, 0.14), 0 3px 1px -2px rgba(153, 153, 153, 0.2), 0 1px 5px 0 rgba(153, 153, 153, 0.12) !important; 274 | } 275 | 276 | .mat-mini-fab:hover{ 277 | color: #fff !important; 278 | box-shadow: 0 14px 26px -12px rgba(153, 153, 153, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(153, 153, 153, 0.2) !important; 279 | } 280 | 281 | .mat-mini-fab:focus{ 282 | color: #fff !important; 283 | } 284 | 285 | /* btn style */ 286 | .btn{ 287 | font-size: 12px !important; 288 | padding: 12px 30px !important; 289 | line-height: inherit !important; 290 | outline: none !important; 291 | font-weight: 300 !important; 292 | border-radius: 3px !important; 293 | margin: 0 1px; 294 | border: none !important; 295 | } 296 | 297 | .btn .mat-ripple{ 298 | -webkit-border-radius: 3px; 299 | -moz-border-radius: 3px; 300 | border-radius: 3px; 301 | } 302 | 303 | .btn-round{ 304 | border-radius: 30px !important; 305 | } 306 | 307 | .btn-round .mat-ripple{ 308 | -webkit-border-radius: 30px; 309 | -moz-border-radius: 30px; 310 | border-radius: 30px; 311 | } 312 | 313 | .btn-primary{ 314 | background-color: #9c27b0 !important; 315 | color: #FFF !important; 316 | box-shadow: 0 2px 2px 0 rgba(156, 39, 176, 0.14), 0 3px 1px -2px rgba(156, 39, 176, 0.2), 0 1px 5px 0 rgba(156, 39, 176, 0.12) !important; 317 | } 318 | 319 | .btn-primary:hover{ 320 | box-shadow: 0 14px 26px -12px rgba(156, 39, 176, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(156, 39, 176, 0.2) !important; 321 | } 322 | 323 | .btn-rose{ 324 | background-color: #e91e63 !important; 325 | color: #FFF !important; 326 | box-shadow: 0 2px 2px 0 rgba(233, 30, 99, 0.14), 0 3px 1px -2px rgba(233, 30, 99, 0.2), 0 1px 5px 0 rgba(233, 30, 99, 0.12) !important; 327 | } 328 | 329 | .btn-rose:hover{ 330 | box-shadow: 0 14px 26px -12px rgba(233, 30, 99, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(233, 30, 99, 0.2) !important; 331 | } 332 | 333 | .btn-success{ 334 | background-color: #4caf50 !important; 335 | color: #FFF !important; 336 | box-shadow: 0 2px 2px 0 rgba(76, 175, 80, 0.14), 0 3px 1px -2px rgba(76, 175, 80, 0.2), 0 1px 5px 0 rgba(76, 175, 80, 0.12) !important; 337 | } 338 | 339 | .btn-success:hover{ 340 | box-shadow: 0 14px 26px -12px rgba(76, 175, 80, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(76, 175, 80, 0.2) !important; 341 | } 342 | 343 | .btn-warning{ 344 | background-color: #ff9800 !important; 345 | color: #FFF !important; 346 | box-shadow: 0 2px 2px 0 rgba(255, 152, 0, 0.14), 0 3px 1px -2px rgba(255, 152, 0, 0.2), 0 1px 5px 0 rgba(255, 152, 0, 0.12) !important; 347 | } 348 | 349 | .btn-warning:hover{ 350 | box-shadow: 0 14px 26px -12px rgba(255, 152, 0, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(255, 152, 0, 0.2) !important; 351 | } 352 | 353 | .btn-danger{ 354 | background-color: #f44336 !important; 355 | color: #FFF !important; 356 | box-shadow: 0 2px 2px 0 rgba(244, 67, 54, 0.14), 0 3px 1px -2px rgba(244, 67, 54, 0.2), 0 1px 5px 0 rgba(244, 67, 54, 0.12) !important; 357 | } 358 | 359 | .btn-danger:hover{ 360 | box-shadow: 0 14px 26px -12px rgba(244, 67, 54, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2) !important; 361 | } 362 | 363 | .btn-info{ 364 | background-color: #00bcd4 !important; 365 | color: #FFF !important; 366 | box-shadow: 0 2px 2px 0 rgba(0, 188, 212, 0.14), 0 3px 1px -2px rgba(0, 188, 212, 0.2), 0 1px 5px 0 rgba(0, 188, 212, 0.12) !important; 367 | } 368 | 369 | .btn-info:hover{ 370 | box-shadow: 0 14px 26px -12px rgba(0, 188, 212, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 188, 212, 0.2) !important; 371 | } 372 | 373 | /* checkbox */ 374 | .mat-checkbox-checkmark-path { /* stick */ 375 | stroke: #9c27b0 !important; 376 | } 377 | 378 | .mat-checkbox-checked.mat-accent .mat-checkbox-background, .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background { 379 | background-color: transparent; 380 | } 381 | 382 | .mat-checkbox-frame { 383 | border-width: 1px !important; 384 | } 385 | 386 | .mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path { 387 | animation: 300ms linear 0s mat-checkbox-unchecked-checked-checkmark-path !important; 388 | } 389 | 390 | /* table */ 391 | .table-responsive{ 392 | border: none; 393 | margin: 0; 394 | } 395 | 396 | .table{ 397 | width: 100%; 398 | max-width: 100%; 399 | margin: 20px 0 0 0; 400 | } 401 | 402 | .table > thead > tr > th, .table > tbody > tr > th, .table > thead > tr > td, .table > tbody > tr > td{ 403 | padding: 12px 8px; 404 | vertical-align: middle; 405 | } 406 | 407 | .table > thead > tr > th { 408 | font-size: 1.25em; 409 | font-weight: 300; 410 | border-bottom-width: 1px; 411 | } 412 | 413 | /* text color */ 414 | .text-primary, .alert-primary .alert-icon{ 415 | color: #9c27b0; 416 | } 417 | 418 | .text-danger, .alert-danger .alert-icon{ 419 | color: #f44336; 420 | } 421 | 422 | .text-info, .alert-info .alert-icon{ 423 | color: #00bcd4; 424 | } 425 | 426 | .text-warning, .alert-warning .alert-icon{ 427 | color: #ff9800; 428 | } 429 | 430 | .text-rose, .alert-rose .alert-icon{ 431 | color: #e91e63; 432 | } 433 | 434 | .text-success, .alert-success .alert-icon{ 435 | color: #4caf50; 436 | } 437 | 438 | /** alert **/ 439 | .alert{ 440 | border: none; 441 | position: relative; 442 | padding: 20px 15px; 443 | color: #ffffff; 444 | border-radius: 3px; 445 | } 446 | 447 | .alert span{ 448 | font-weight: 100; 449 | width: 93%; 450 | display: block; 451 | } 452 | 453 | .alert .close{ 454 | text-shadow: none; 455 | opacity: 1; 456 | color: #fff; 457 | position: relative; 458 | top: -6px; 459 | outline: none; 460 | } 461 | 462 | .alert .close i{ 463 | font-size: 11px; 464 | } 465 | 466 | .alert-primary{ 467 | background-color: #af2cc5; 468 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(156, 39, 176, 0.4); 469 | } 470 | 471 | .alert-info{ 472 | background-color: #00bcd4; 473 | box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(0, 188, 212, 0.4); 474 | } 475 | 476 | .alert-rose{ 477 | background-color: #eb3573; 478 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4); 479 | } 480 | 481 | .alert-success{ 482 | background-color: #5cb860; 483 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(76, 175, 80, 0.4); 484 | } 485 | 486 | .alert-warning{ 487 | background-color: #ffa21a; 488 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(255, 152, 0, 0.4); 489 | } 490 | 491 | .alert-danger{ 492 | background-color: #f55a4e; 493 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(244, 67, 54, 0.4); 494 | } 495 | 496 | .alert-with-icon{ 497 | margin-top: 43px; 498 | } 499 | 500 | .alert-with-icon span{ 501 | padding-left: 55px; 502 | } 503 | 504 | .alert-with-icon .alert-icon{ 505 | position: absolute; 506 | top: -17px; 507 | left: 17px; 508 | background-color: #fff; 509 | border-radius: 50%; 510 | font-size: 20px; 511 | padding: 9px; 512 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); 513 | } 514 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/long-stack-trace-zone'; 4 | import 'zone.js/dist/proxy.js'; 5 | import 'zone.js/dist/sync-test'; 6 | import 'zone.js/dist/jasmine-patch'; 7 | import 'zone.js/dist/async-test'; 8 | import 'zone.js/dist/fake-async-test'; 9 | import { getTestBed } from '@angular/core/testing'; 10 | import { 11 | BrowserDynamicTestingModule, 12 | platformBrowserDynamicTesting 13 | } from '@angular/platform-browser-dynamic/testing'; 14 | 15 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. 16 | declare var __karma__: any; 17 | declare var require: any; 18 | 19 | // Prevent Karma from running prematurely. 20 | __karma__.loaded = function () {}; 21 | 22 | // First, initialize the Angular testing environment. 23 | getTestBed().initTestEnvironment( 24 | BrowserDynamicTestingModule, 25 | platformBrowserDynamicTesting() 26 | ); 27 | // Then we find all the tests. 28 | const context = require.context('./', true, /\.spec\.ts$/); 29 | // And load the modules. 30 | context.keys().map(context); 31 | // Finally, start Karma to run the tests. 32 | __karma__.start(); 33 | -------------------------------------------------------------------------------- /src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "es2015", 6 | "baseUrl": "", 7 | "types": [] 8 | }, 9 | "exclude": [ 10 | "test.ts", 11 | "**/*.spec.ts" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "baseUrl": "", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | }, 13 | "files": [ 14 | "test.ts", 15 | "polyfills.ts" 16 | ], 17 | "include": [ 18 | "**/*.spec.ts", 19 | "**/*.d.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "baseUrl": "src", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "moduleResolution": "node", 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es5", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "lib": [ 16 | "es2016", 17 | "dom" 18 | ], 19 | "module": "es2015" 20 | } 21 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "callable-types": true, 7 | "class-name": true, 8 | "comment-format": [ 9 | true, 10 | "check-space" 11 | ], 12 | "curly": true, 13 | "eofline": true, 14 | "forin": true, 15 | "import-blacklist": [ 16 | true 17 | ], 18 | "import-spacing": true, 19 | "indent": [ 20 | true, 21 | "spaces" 22 | ], 23 | "interface-over-type-literal": true, 24 | "label-position": true, 25 | "max-line-length": [ 26 | true, 27 | 140 28 | ], 29 | "member-access": false, 30 | "member-ordering": [ 31 | true, 32 | "static-before-instance", 33 | "variables-before-functions" 34 | ], 35 | "no-arg": true, 36 | "no-bitwise": true, 37 | "no-console": [ 38 | true, 39 | "debug", 40 | "info", 41 | "time", 42 | "timeEnd", 43 | "trace" 44 | ], 45 | "no-construct": true, 46 | "no-debugger": true, 47 | "no-empty": false, 48 | "no-empty-interface": true, 49 | "no-eval": true, 50 | "no-inferrable-types": [ 51 | true, 52 | "ignore-params" 53 | ], 54 | "no-shadowed-variable": true, 55 | "no-string-literal": false, 56 | "no-string-throw": true, 57 | "no-switch-case-fall-through": true, 58 | "no-trailing-whitespace": true, 59 | "no-unused-expression": true, 60 | "no-use-before-declare": true, 61 | "no-var-keyword": true, 62 | "object-literal-sort-keys": false, 63 | "one-line": [ 64 | true, 65 | "check-open-brace", 66 | "check-catch", 67 | "check-else", 68 | "check-whitespace" 69 | ], 70 | "prefer-const": true, 71 | "quotemark": [ 72 | true, 73 | "single" 74 | ], 75 | "radix": true, 76 | "semicolon": [ 77 | "always" 78 | ], 79 | "triple-equals": [ 80 | true, 81 | "allow-null-check" 82 | ], 83 | "typedef-whitespace": [ 84 | true, 85 | { 86 | "call-signature": "nospace", 87 | "index-signature": "nospace", 88 | "parameter": "nospace", 89 | "property-declaration": "nospace", 90 | "variable-declaration": "nospace" 91 | } 92 | ], 93 | "typeof-compare": true, 94 | "unified-signatures": true, 95 | "variable-name": false, 96 | "whitespace": [ 97 | true, 98 | "check-branch", 99 | "check-decl", 100 | "check-operator", 101 | "check-separator", 102 | "check-type" 103 | ], 104 | "directive-selector": [ 105 | true, 106 | "attribute", 107 | "app", 108 | "camelCase" 109 | ], 110 | "component-selector": [ 111 | true, 112 | "element", 113 | "app", 114 | "kebab-case" 115 | ], 116 | "use-input-property-decorator": true, 117 | "use-output-property-decorator": true, 118 | "use-host-property-decorator": true, 119 | "no-input-rename": true, 120 | "no-output-rename": true, 121 | "use-life-cycle-interface": true, 122 | "use-pipe-transform-interface": true, 123 | "component-class-suffix": true, 124 | "directive-class-suffix": true, 125 | "no-access-missing-member": true, 126 | "templates-use-public": true, 127 | "invoke-injectable": true 128 | } 129 | } 130 | --------------------------------------------------------------------------------